[
  {
    "path": ".flake8",
    "content": "[flake8]\n; Minimal configuration for Flake8 to work with Black.\nmax-line-length = 100\nignore = E101,E111,E112,E221,E222,E501,E711,E712,W503,W504,F401,BLK100\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: StanGirard\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: StanGirard\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/EXTERNAL_ISSUE_TEMPLATE.yml",
    "content": "name: Bug Report 🐛\ndescription: File a bug report\ntitle: \"[Bug]: \"\nlabels: [\"bug\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: What happened?\n      description: Also tell us, what did you expect to happen?\n      placeholder: Tell us what you see!\n      value: \"A bug happened!\"\n    validations:\n      required: true\n  - type: textarea\n    id: logs\n    attributes:\n      label: Relevant log output\n      description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.\n      render: bash\n  - type: input\n    id: contact\n    attributes:\n      label: Twitter / LinkedIn details\n      description: We announce new features on Twitter + LinkedIn. If this issue leads to an announcement, and you'd like a mention, we'll gladly shout you out!\n      placeholder: ex. @_StanGirard / <<https://www.linkedin.com/in/stanislas-girard/>>\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/EXTERNAL_USER_FEATURE_REQUEST.yml",
    "content": "name: Feature Request 🚀\ndescription: Submit a proposal/request for a new Quivr feature.\ntitle: \"[Feature]: \"\nlabels: [\"enhancement\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for making Quivr better!\n  - type: textarea\n    id: the-feature\n    attributes:\n      label: The Feature\n      description: A clear and concise description of the feature proposal\n      placeholder: Tell us what you want!\n    validations:\n      required: true\n  - type: textarea\n    id: motivation\n    attributes:\n      label: Motivation, pitch\n      description: Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., \"I'm working on X and would like Y to be possible\". If this is related to another GitHub issue, please link here too.\n    validations:\n      required: true\n  - type: input\n    id: contact\n    attributes:\n      label: Twitter / LinkedIn details\n      description: We announce new features on Twitter + LinkedIn. When this is announced, and you'd like a mention, we'll gladly shout you out!\n      placeholder: ex. @StanGirard_ / https://www.linkedin.com/in/stanislas-girard/\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/INTERNAL_EPIC_TEMPLATE.yml",
    "content": "name: QUIVR INTERNAL ONLY - Epic \ndescription: Use this form for epics.\ntitle: \"[Epic]: \"\nlabels: [\"epic\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        **The Why**\n\n        Explain the reasons for this epic.\n\n  - type: textarea\n    id: why-value\n    attributes:\n      label: Why do we need this functionality?\n      description: What's the value? For whom?\n      placeholder: Detail the reasons here...\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        **The What**\n\n  - type: textarea\n    id: developing\n    attributes:\n      label: What are we developing?\n      description: What’s the expected behaviour? How should it look like?\n      placeholder: Describe the functionality or feature here...\n    validations:\n      required: true\n\n  - type: textarea\n    id: validation-criteria\n    attributes:\n      label: What are the validation criteria to validate this feature?\n      description: Testing criteria, edge cases, error behavior, etc.\n      placeholder: Detail the validation criteria here...\n    validations:\n      required: true\n\n  - type: textarea\n    id: out-of-scope\n    attributes:\n      label: What's out of scope for this feature?\n      placeholder: Detail what's not covered by this epic...\n    validations:\n      required: true\n\n  - type: checkboxes\n    id: feature-flagged\n    attributes:\n      label: Should this feature be feature flagged?\n      options:\n        - label: Feature Flagged\n          required: false\n\n  - type: markdown\n    attributes:\n      value: |\n        **The How**\n\n  - type: textarea\n    id: code-strategy\n    attributes:\n      label: How are we going to code this feature?\n      description: Technical strategy, impacts, consequences, etc.\n      placeholder: Describe the technical approach here...\n    validations:\n      required: true\n\n  - type: textarea\n    id: technical-decisions\n    attributes:\n      label: Are there any technical decisions made that should be shared?\n      placeholder: Detail the decisions here...\n    validations:\n      required: true\n\n  - type: textarea\n    id: blockers\n    attributes:\n      label: What is preventing us from delivering this feature?\n      placeholder: Detail any dependencies, issues, or blockers here...\n    validations:\n      required: true\n\n  - type: textarea\n    id: potential-breaks\n    attributes:\n      label: What can the feature potentially break?\n      placeholder: Detail any potential side effects or issues here...\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/INTERNAL_USER_STORY_TEMPLATE.yml",
    "content": "name: QUIVR INTERNAL ONLY - User story\ndescription: Use this form for user stories.\ntitle: \"User story:\"\nlabels: [\"user story\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        **Epic**\n\n        Include the issue that represents the epic.\n\n  - type: input\n    id: epic-link\n    attributes:\n      label: Link to the Epic\n      placeholder: Paste the link to the related epic here...\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        **Functional**\n\n        Detail the functionality and provide context and motivation.\n\n  - type: textarea\n    id: functionality-detail\n    attributes:\n      label: Explain the Functionality\n      placeholder: Detail the user story functionality here...\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        **Schema**\n\n  - type: markdown\n    attributes:\n      value: |\n        ### Tech\n\n  - type: markdown\n    attributes:\n      value: |\n        ### Tech To-dos\n\n  - type: textarea\n    id: tech-todos\n    attributes:\n      label: Tech To-dos\n      placeholder: Detail the tech to-dos here...\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        ### Tests\n\n  - type: textarea\n    id: tests\n    attributes:\n      label: Tests\n      placeholder: Detail the tests here...\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        ### Validation Checks\n\n  - type: textarea\n    id: validation-checks\n    attributes:\n      label: Validation Checks\n      placeholder: Detail the validation checks here...\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Quivr Community Discord\n    url: https://discord.gg/HUpRgp2HG8\n    about: Please ask and answer questions here.\n  - name: Twitter\n    url: https://twitter.com/Quivr_brain\n    about: Follow us on Twitter for updates.\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "# Description\n\nPlease include a summary of the changes and the related issue. Please also include relevant motivation and context.\n\n## Checklist before requesting a review\n\nPlease delete options that are not relevant.\n\n- [ ] My code follows the style guidelines of this project\n- [ ] I have performed a self-review of my code\n- [ ] I have commented hard-to-understand areas\n- [ ] I have ideally added tests that prove my fix is effective or that my feature works\n- [ ] New and existing unit tests pass locally with my changes\n- [ ] Any dependent changes have been merged\n\n## Screenshots (if appropriate):\n"
  },
  {
    "path": ".github/workflows/backend-core-tests.yml",
    "content": "name: Run Tests with Tika Server\n\non:\n  push:\n    paths:\n      - \"core/**\"\n  pull_request:\n    paths:\n      - \"core/**\"\n  workflow_dispatch:\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    services:\n      tika:\n        image: apache/tika\n        ports:\n          - 9998:9998\n\n    steps:\n      - name: 👀 Checkout code\n        uses: actions/checkout@v2\n\n      - name: 🔨 Install the latest version of rye\n        uses: eifinger/setup-rye@v4\n        with:\n          enable-cache: true\n          working-directory: backend\n      - name: 🔄 Sync dependencies\n        run: |\n          cd core\n          UV_INDEX_STRATEGY=unsafe-first-match rye sync --no-lock\n\n      - name: Run tests\n        env:\n          TIKA_URL: http://localhost:9998/tika\n          OPENAI_API_KEY: this-is-a-test-key\n        run: |\n          sudo apt-get update\n          sudo apt-get install -y libmagic-dev poppler-utils libreoffice tesseract-ocr  pandoc\n          cd core\n          rye test -p quivr-core\n"
  },
  {
    "path": ".github/workflows/conventional-pr-title.yml",
    "content": "name: \"Lint PR\"\n\non:\n  pull_request_target:\n    types:\n      - opened\n      - edited\n      - synchronize\n\npermissions:\n  pull-requests: read\n\njobs:\n  main:\n    name: Validate PR title\n    runs-on: ubuntu-latest\n    steps:\n      - uses: amannn/action-semantic-pull-request@v5\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}"
  },
  {
    "path": ".github/workflows/release-please-core.yml",
    "content": "name: release-please-core\n\non:\n  push:\n    branches:\n      - main\n  workflow_dispatch:\n\npermissions:\n  contents: write\n  pull-requests: write\n\njobs:\n  release-please:\n    runs-on: ubuntu-latest\n    outputs:\n      release_created: ${{ steps.release.outputs['core--release_created'] }}\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0 # Fetch all history for tags and releases\n\n      - name: Setup Python\n        uses: actions/setup-python@v4\n        with:\n          python-version: '3.11'\n\n      - name: Run release-please\n        id: release\n        uses: google-github-actions/release-please-action@v4\n        with:\n          path: core\n          token: ${{ secrets.RELEASE_PLEASE_TOKEN }}\n       \n\n  deploy:\n    if: needs.release-please.outputs.release_created == 'true'\n    needs: release-please\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory: core\n    steps:\n      - uses: actions/checkout@v4\n      - name: Install Rye\n        uses: eifinger/setup-rye@v2\n        with:\n          enable-cache: true\n      - name: Rye Sync\n        run: UV_INDEX_STRATEGY=unsafe-first-match rye sync --no-lock\n      - name: Rye Build\n        run: rye build\n      - name: Rye Publish\n        run: rye publish --token ${{ secrets.PYPI_API_TOKEN }} --yes --skip-existing"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "name: \"Close stale issues and PRs\"\non:\n  schedule:\n    - cron: \"0 */4 * * *\"\n\npermissions:\n  contents: write # only for delete-branch option\n  issues: write\n  pull-requests: write\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/stale@main\n        with:\n          exempt-assignees: true\n          exempt-draft-pr: true\n          days-before-stale: 90\n          days-before-close: 5\n          operations-per-run: 400\n          exempt-milestones: true\n          stale-issue-message: \"Thanks for your contributions, we'll be closing this issue as it has gone stale. Feel free to reopen if you'd like to continue the discussion.\"\n          stale-pr-message: \"Thanks for your contributions, we'll be closing this PR as it has gone stale. Feel free to reopen if you'd like to continue the discussion.\"\n"
  },
  {
    "path": ".gitignore",
    "content": "docker-compose.override.yml\nsecondbrain/\n.env\nenv.sh\n.streamlit/secrets.toml\n**/*.pyc\ntoto.txt\nlog.txt\n\nbackend/venv\nbackend/.env\nbackend/*.deb\nbackend/.python-version\n\n# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n**/node_modules\n**/.pnp\n.pnp.js\n\nPipfile\n\n# testing\n**/coverage\n\n# next.js\n**/.next/\n**/out/\n\n# production\n**/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env*.local\n\n# vercel\n.vercel\n\n# typescript\n*.tsbuildinfo\nnext-env.d.ts\nquivr/*\nstreamlit-demo/.streamlit/secrets.toml\n.backend_env\n.frontend_env\nbackend/core/pandoc-*\n**/.pandoc-*\nbackend/core/application_default_credentials.json\n\n#local models\nbackend/core/local_models/*\n\n## scripts\npackage-lock.json\ncelerybeat-schedule\nfrontend/public/robots.txt\nfrontend/public/sitemap*\n\npyfiles/*\nbackend/bin/*\nbackend/lib/*\nbackend/pyvenv.cfg\nbackend/share/*\nbackend/slim.report.json\nvolumes/db/data/\nvolumes/storage/stub/stub/quivr/*\nsupabase/migrations/20240103191539_private.sql\nsupabase/20240103191539_private.sql\npaulgraham.py\n.env_test\nsupabase/seed-airwallex.sql\nairwallexpayouts.py\n**/application.log*\nbackend/celerybeat-schedule.db\n\nbackend/application.log.*\nbackend/score.json\nbackend/modules/assistant/ito/utils/simple.pdf\nbackend/modules/sync/controller/credentials.json\nbackend/.env.test\n\n**/*.egg-info\n\n.coverage\nbackend/core/examples/chatbot/.files/*\nbackend/core/examples/chatbot/.python-version\nbackend/core/examples/chatbot/.chainlit/config.toml\nbackend/core/examples/chatbot/.chainlit/translations/en-US.json\n\n*.log\n\n# Tox\n.tox\nPipfile\n*.pkl\nbackend/docs/site/*\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v4.6.0\n    hooks:\n      - id: check-added-large-files\n        args: [\"--maxkb=5000\"]\n      - id: check-toml\n      - id: check-yaml\n      - id: end-of-file-fixer\n      - id: trailing-whitespace\n      - id: check-merge-conflict\n      - id: detect-private-key\n      - id: check-case-conflict\n  - repo: https://github.com/pre-commit/pre-commit\n    rev: v3.6.2\n    hooks:\n      - id: validate_manifest\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    # Ruff version.\n    rev: v0.5.1\n    hooks:\n      # Run the linter.\n      - id: ruff\n        args: [--fix, --isolated]\n        additional_dependencies: []\n      # Run the formatter.\n      - id: ruff-format\n        args: [--isolated]\n        additional_dependencies: []\n  - repo: https://github.com/pre-commit/mirrors-mypy\n    rev: v1.10.1\n    hooks:\n      - id: mypy\n        name: mypy\n        args: [\"--ignore-missing-imports\", \"--no-incremental\", \"--follow-imports=skip\"]\n        additional_dependencies: [\"types-aiofiles\", \"types-pyyaml\", \"pydantic\", \"sqlmodel\"]\nci:\n  autofix_commit_msg: |\n    [pre-commit.ci] auto fixes from pre-commit.com hooks\n\n    for more information, see https://pre-commit.ci\n  autofix_prs: true\n  autoupdate_branch: \"\"\n  autoupdate_commit_msg: \"[pre-commit.ci] pre-commit autoupdate\"\n  autoupdate_schedule: weekly\n  skip: []\n  submodules: false\n"
  },
  {
    "path": ".python-version",
    "content": "3.11.9\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# Read the Docs configuration file for MkDocs projects\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Set the version of Python and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n  commands:\n    - asdf plugin add uv\n    - asdf install uv latest\n    - asdf global uv latest\n    - uv venv\n    - cd docs && UV_INDEX_STRATEGY=unsafe-first-match uv pip install -r requirements.lock\n    - cd docs/ && ls -la && NO_COLOR=1 ../.venv/bin/mkdocs build --strict --site-dir $READTHEDOCS_OUTPUT/html --config-file mkdocs.yml\n\n  \n\n\nmkdocs:\n  configuration: backend/docs/mkdocs.yml\n\n"
  },
  {
    "path": ".release-please-manifest.json",
    "content": "{\n    \"core\": \"0.0.33\"\n}"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  \"recommendations\": [\n    \"ms-pyright.pyright\",\n    \"dbaeumer.vscode-eslint\",\n    \"ms-python.vscode-pylance\",\n    \"ms-pyright.pyright\",\n    \"inlang.vs-code-extension\",\n    \"denoland.vscode-deno\"\n  ]\n}"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Python: Remote Attach\",\n            \"type\": \"python\",\n            \"request\": \"attach\",\n            \"connect\": {\n                \"host\": \"localhost\",\n                \"port\": 5678\n            },\n            \"pathMappings\": [\n                {\n                    \"localRoot\": \"${workspaceFolder}/backend\",\n                    \"remoteRoot\": \".\"\n                }\n            ],\n            \"justMyCode\": true\n        },\n        {\n            \"name\": \"Python: Debug Test Script\",\n            \"type\": \"python\",\n            \"request\": \"launch\",\n            \"program\": \"${workspaceFolder}/backend/test_process_file_and_notify.py\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": false\n        },\n        {\n            \"name\": \"Python: Debug\",\n            \"type\": \"debugpy\",\n            \"request\": \"launch\",\n            \"program\": \"${file}\",\n            \"console\": \"integratedTerminal\",\n            \"justMyCode\": false,\n            \"env\": {\n                \"PYTHONPATH\": \"${workspaceFolder}/backend:${env:PYTHONPATH}\"\n            },\n            \"envFile\": \"${workspaceFolder}/.env\"\n        }\n    ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"editor.codeActionsOnSave\": {\n    \"source.organizeImports\": \"explicit\",\n    \"source.fixAll\": \"explicit\",\n    \"source.unusedImports\": \"explicit\",\n  },\n  \"editor.formatOnSave\": true,\n  \"editor.formatOnSaveMode\": \"file\",\n  \"files.exclude\": {\n    \"**/__pycache__\": true,\n    \"**/.benchmarks/\": true,\n    \"**/.cache/\": true,\n    \"**/.pytest_cache/\": true,\n    \"**/.next/\": true,\n    \"**/build/\": true,\n    \"**/.docusaurus/\": true,\n    \"**/node_modules/\": true\n  },\n  \"[python]\": {\n    \"editor.defaultFormatter\": \"charliermarsh.ruff\",\n    \"editor.formatOnSave\": true,\n    \"editor.codeActionsOnSave\": {\n      \"source.organizeImports\": \"explicit\",\n      \"source.fixAll\": \"explicit\"\n    }\n  },\n  \"python.analysis.extraPaths\": [\n    \"./backend\"\n  ],\n  \"python.defaultInterpreterPath\": \"python3\",\n  \"python.testing.pytestArgs\": [\n    \"-v\",\n    \"--color=yes\",\n    \"--envfile=backend/tests/.env_test\",\n    \"backend/\"\n  ],\n  \"python.testing.unittestEnabled\": false,\n  \"python.testing.pytestEnabled\": true,\n  \"python.testing.autoTestDiscoverOnSaveEnabled\": true,\n  \"python.analysis.autoImportCompletions\": true,\n  \"python.analysis.typeCheckingMode\": \"basic\",\n  \"python.analysis.diagnosticSeverityOverrides\": {\n    \"reportMissingImports\": \"error\",\n    \"reportUnusedImport\": \"warning\",\n    \"reportGeneralTypeIssues\": \"warning\"\n  },\n  \"makefile.configureOnOpen\": false,\n  \"djlint.showInstallError\": false\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## 0.0.322 (2024-10-15)\n\n## What's Changed\n* feat: Add new documentation files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3351\n* fix: separate english and french ingredients by @chloedia in https://github.com/QuivrHQ/quivr/pull/3358\n* docs(core): init by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3365\n* docs: quivr core storage by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3366\n* fix: fixing pdf parsing by @jacopo-chevallard in https://github.com/QuivrHQ/quivr/pull/3349\n* feat: Improve user credit calculation in get_user_credits by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3367\n* fix unwanted parsing effect by @chloedia in https://github.com/QuivrHQ/quivr/pull/3371\n* add fallback on llamaparse by @chloedia in https://github.com/QuivrHQ/quivr/pull/3374\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.321...v0.0.322\n\n## 0.0.321 (2024-10-08)\n\n## What's Changed\n* feat: Add file name to knowledge properties in crawl_endpoint by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3346\n* feat(frontend): add xlsx by @Zewed in https://github.com/QuivrHQ/quivr/pull/3340\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.320...v0.0.321\n\n## 0.0.320 (2024-10-07)\n\n## What's Changed\n* Enable Porter Application cdp by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/3306\n* Enable Porter Application cdp-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/3307\n* feat(assistant): cdp by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3305\n* feat: Add debug logging for OCR results by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3309\n* feat: Update OCR image scale for better accuracy by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3310\n* feat: Update PDFGenerator to include logo in header by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3311\n* feat: structlog parseable by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3312\n* Revert \"feat: structlog parseable\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3313\n* feat: structlog parseable by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3314\n* Revert \"feat: structlog parseable\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3315\n* feat: Update PDFGenerator to include logo in header by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3318\n* feat: structlog parseable by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3319\n* feat: Update knowledge status and send notification on task success by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3320\n* feat: Update text retranscription instructions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3321\n* feat: update sentry by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3326\n* chore: Remove unnecessary assertion in create_modification_report function by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3329\n* chore: Add NEXT_PUBLIC_INTERCOM_APP_ID to Dockerfile by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3330\n* feat: Update Content Security Policy for PostHog by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3331\n* fix(cdp): order naming cdc_etiquette by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3333\n* fix(notifications): added a debouncing mechanism by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3327\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.319...v0.0.320\n\n## 0.0.319 (2024-10-01)\n\n## What's Changed\n* feat: Add error handling for rate-limited search in fetch_notion_pages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3298\n* feat: Remove syncNotion from ConnectionCards by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3300\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.318...v0.0.319\n\n## 0.0.318 (2024-09-30)\n\n## What's Changed\n* feat: add syncNotion from ConnectionCards by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3292\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.317...v0.0.318\n\n## 0.0.317 (2024-09-30)\n\n## What's Changed\n* feat: update SyncsUser status field to be optional by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3284\n* fix(frontend): onboarding modal by @Zewed in https://github.com/QuivrHQ/quivr/pull/3286\n* feat: Remove syncNotion from ConnectionCards by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3289\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.316...v0.0.317\n\n## 0.0.316 (2024-09-30)\n\n## What's Changed\n* fix(core): enforce langchain <0.3 for pydantic v1 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3217\n* chore(main): release core 0.0.16 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3218\n* feat(assistants): mock api by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3195\n* chore(examples): fix chainlit example  by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3223\n* feat(integration): Notion by @chloedia in https://github.com/QuivrHQ/quivr/pull/3173\n* fix(migration): order migrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3231\n* feat: remove n+1 query knowledge by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3238\n* feat: introducing configurable retrieval workflows by @jacopo-chevallard in https://github.com/QuivrHQ/quivr/pull/3227\n* fix: wrong default path for CHAT_LLM_CONFIG_PATH env variable by @jacopo-chevallard in https://github.com/QuivrHQ/quivr/pull/3247\n* fix(frontend): sync folder for premium users by @Zewed in https://github.com/QuivrHQ/quivr/pull/3251\n* fix: correctly passing the prompt provided by the user by @jacopo-chevallard in https://github.com/QuivrHQ/quivr/pull/3252\n* fix: add sync user id aget_files by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3261\n* feat: update sync_user.py to include sync user id in aget_files call by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3276\n* chore: update Dockerfile dependencies and copy files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3277\n* chore: add wget to Dockerfile dependencies by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3279\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.315...v0.0.316\n\n## 0.0.315 (2024-09-17)\n\n## What's Changed\n* chore(main): release core 0.0.15 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3203\n* fix: knowledge user_id fix by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3216\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.314...v0.0.315\n\n## 0.0.314 (2024-09-16)\n\n## What's Changed\n* feat:  CRUD KMS (no syncs)  by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3162\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.313...v0.0.314\n\n## 0.0.313 (2024-09-13)\n\n## What's Changed\n* feat: save and load brain by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3202\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.312...v0.0.313\n\n## 0.0.312 (2024-09-13)\n\n## What's Changed\n* fix: Update LLMEndpoint to include max_tokens parameter by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3201\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.311...v0.0.312\n\n## 0.0.311 (2024-09-12)\n\n## What's Changed\n* chore(embeddings): added tests for embeddings by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3183\n* feat(uptime): check if connection to db works by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3199\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.310...v0.0.311\n\n## 0.0.310 (2024-09-10)\n\n## What's Changed\n* feat: Add Azure OpenAI embeddings support by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3182\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.309...v0.0.310\n\n## 0.0.309 (2024-09-10)\n\n## What's Changed\n* chore: Add initial documentation files and configuration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3126\n* chore: Add .readthedocs.yaml configuration file by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3172\n* fix(frontend): notion integration in front end by @Zewed in https://github.com/QuivrHQ/quivr/pull/3175\n* chore(main): release core 0.0.14 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2945\n* ci(rye): now core is built with rye by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3177\n* feat: Add external Supabase URL support for generating file signed URL by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3179\n* fix(onboarding): keeps setting it at false by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3180\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.308...v0.0.309\n\n## 0.0.308 (2024-09-06)\n\n## What's Changed\n* fix: remove knowledge and idle conn by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3165\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.307...v0.0.308\n\n## 0.0.307 (2024-09-06)\n\n## What's Changed\n* fix: tests pytest-asyncio by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3157\n* fix: remove unused 'models' field in check_premium.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3164\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.306...v0.0.307\n\n## 0.0.306 (2024-09-05)\n\n## What's Changed\n* feat(readme): trigger deploy by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3159\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.305...v0.0.306\n\n## 0.0.305 (2024-09-05)\n\n## What's Changed\n* chore: update next.config.js with PostHog domains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3155\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.304...v0.0.305\n\n## 0.0.304 (2024-09-05)\n\n## What's Changed\n* feat: update Azure login button text by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3152\n* fix: url knowledge multiple brain by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3145\n* chore: update Dockerfile with PostHog environment variables by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3154\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.303...v0.0.304\n\n## 0.0.303 (2024-09-04)\n\n## What's Changed\n* fix(chat): order of chat history was reversed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3148\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.302...v0.0.303\n\n## 0.0.302 (2024-09-04)\n\n## What's Changed\n* feat(anthropic): add llm by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3146\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.301...v0.0.302\n\n## 0.0.301 (2024-09-03)\n\n## What's Changed\n* feat(smtp): not enforcing tls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3067\n* feat: Update send_email.py to conditionally login with SMTP credentials by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3069\n* feat: Add NEXT_PUBLIC_PROJECT_NAME environment variable by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3070\n* feat: Add Azure login support by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3071\n* fix(frontend): only owner can access knowledge and edit brain snippet by @Zewed in https://github.com/QuivrHQ/quivr/pull/3073\n* fix(frontend): brain knowledge visibility by @Zewed in https://github.com/QuivrHQ/quivr/pull/3074\n* fix(frontend): revamp of settings  by @Zewed in https://github.com/QuivrHQ/quivr/pull/3081\n* fix: Update README.md by @Zewed in https://github.com/QuivrHQ/quivr/pull/3084\n* fix(frontend): send invitation clearer by @Zewed in https://github.com/QuivrHQ/quivr/pull/3090\n* fix(frontend): spacing chats by @Zewed in https://github.com/QuivrHQ/quivr/pull/3091\n* fix(frontend): use click delay by @Zewed in https://github.com/QuivrHQ/quivr/pull/3092\n* fix(frontend): back buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/3094\n* fix(frontend): change hover delay for tooltips by @Zewed in https://github.com/QuivrHQ/quivr/pull/3095\n* fix(frontend): rename search by thread by @Zewed in https://github.com/QuivrHQ/quivr/pull/3099\n* feat(frontend): revamp of some basics components by @Zewed in https://github.com/QuivrHQ/quivr/pull/3105\n* feat(frontend): interaction with brain items by @Zewed in https://github.com/QuivrHQ/quivr/pull/3106\n* fix(frontend): remove intercom on thread page of mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/3108\n* feat:  quivr core 0.1 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2970\n* fix: Blank scrollbar on certain browsers by @adityanandanx in https://github.com/QuivrHQ/quivr/pull/3118\n* chore(docs): moved repository by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3123\n* fix: knowledge user by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3124\n* chore(readme): increase size icon by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3125\n* chore: remove unused syncNotion function in ConnectionCards.tsx by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3129\n* chore: update compatibility by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3136\n* ci(raise): only on tags by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3140\n* feat: using langgraph in our RAG pipeline by @jacopo-chevallard in https://github.com/QuivrHQ/quivr/pull/3130\n* fix: knowledge multiple brains by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3142\n* fix: knowledge multiple brains - update knowledge rollback by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3143\n\n## New Contributors\n* @jacopo-chevallard made their first contribution in https://github.com/QuivrHQ/quivr/pull/3130\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.300...v0.0.301\n\n## 0.0.300 (2024-08-22)\n\n## What's Changed\n* feat(smtp&share): implemented smtp support and fixed share brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3049\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.299...v0.0.300\n\n## 0.0.299 (2024-08-22)\n\n## What's Changed\n* fix: Update Supabase configuration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3014\n* Delete Porter Application theodo-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/3022\n* Delete Porter Application theodo-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/3023\n* feat(frontend): emoji selector component by @Zewed in https://github.com/QuivrHQ/quivr/pull/3024\n* feat(frontend): show or hide tokens relative stuff by @Zewed in https://github.com/QuivrHQ/quivr/pull/3017\n* feat(frontend): color picker by @Zewed in https://github.com/QuivrHQ/quivr/pull/3027\n* fix(frontend): small stuff on mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/3039\n* feat(frontend): handle LaTeX in message thread by @Zewed in https://github.com/QuivrHQ/quivr/pull/3040\n* fix(frontend): fix docker build frontend new env by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3041\n* feat(frontend): brain snippet selector by @Zewed in https://github.com/QuivrHQ/quivr/pull/3038\n* feat: Add environment variable for showing tokens in frontend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3048\n* fix(frontend): color icon for blocks by @Zewed in https://github.com/QuivrHQ/quivr/pull/3042\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.298...v0.0.299\n\n## 0.0.298 (2024-08-16)\n\n## What's Changed\n* feat(azure): quivr compatible with it by @StanGirard in https://github.com/QuivrHQ/quivr/pull/3005\n* feat(frontend): helpbox by @Zewed in https://github.com/QuivrHQ/quivr/pull/3007\n* feat(frontend): order models and brain by name by @Zewed in https://github.com/QuivrHQ/quivr/pull/3009\n* fix(frontend): help window by @Zewed in https://github.com/QuivrHQ/quivr/pull/3013\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.297...v0.0.298\n\n## 0.0.297 (2024-08-14)\n\n## What's Changed\n* fix(frontend): remove onboarding modal by @Zewed in https://github.com/QuivrHQ/quivr/pull/3001\n* fix(frontend): max height for user message by @Zewed in https://github.com/QuivrHQ/quivr/pull/3000\n* fix: commit on try sqlalchemy by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/3004\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.296...v0.0.297\n\n## 0.0.296 (2024-08-13)\n\n## What's Changed\n* fix(frontend): color of copy icon for code blocks by @Zewed in https://github.com/QuivrHQ/quivr/pull/2993\n* fix(frontend): search bar height by @Zewed in https://github.com/QuivrHQ/quivr/pull/2998\n* fix: autocommit isolation level by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2999\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.295...v0.0.296\n\n## 0.0.295 (2024-08-12)\n\n## What's Changed\n* chore: Update frontend README.md with yarn dev command (#2931) by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2958\n* feat: Add brain_id and brain_name to ChatLLMMetadata model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2968\n* feat(frontend): talk with models and handle code markdown by @Zewed in https://github.com/QuivrHQ/quivr/pull/2980\n* fix(frontend): talk with models by @Zewed in https://github.com/QuivrHQ/quivr/pull/2981\n* feat(models): all models by default by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2983\n* chore(env): add deactivate stripe env variable by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2986\n* fix(frontend): handling unimported languages in Prism js by @Zewed in https://github.com/QuivrHQ/quivr/pull/2990\n* fix(frontend): logo design of models by @Zewed in https://github.com/QuivrHQ/quivr/pull/2992\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.294...v0.0.295\n\n## 0.0.294 (2024-08-07)\n\n## What's Changed\n* Delete Porter Application quivr-com by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2927\n* Delete Porter Application quivr-com-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2928\n* feat: quivr core tox test + parsers by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2929\n* feat(frontend): handle no brain selection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2932\n* fix: processor quivr version by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2934\n* fix: quivr core fix tests by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2935\n* chore(main): release core 0.0.13 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2930\n* feat: Add GitHub sync functionality to sync router by @chloedia in https://github.com/QuivrHQ/quivr/pull/2871\n* refactor: Remove syncGitHub function from useSync.ts by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2942\n* feat: add chat with models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2933\n* ci: precommit in CI by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2946\n* feat: Add get_model method to ModelRepository by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2949\n* feat: Add user email to StripePricingOrManageButton and UpgradeToPlusButton components by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2951\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.293...v0.0.294\n\n## 0.0.293 (2024-07-30)\n\n## What's Changed\n* feat(frontend): brain carousel by @Zewed in https://github.com/QuivrHQ/quivr/pull/2924\n* fix(frontend): feedback for brain carousel by @Zewed in https://github.com/QuivrHQ/quivr/pull/2926\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.292...v0.0.293\n\n## 0.0.292 (2024-07-29)\n\n## What's Changed\n* Feat/handle_azure_sites by @chloedia in https://github.com/QuivrHQ/quivr/pull/2921\n* feat: update dev command in frontend README.md by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2922\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.291...v0.0.292\n\n## 0.0.291 (2024-07-29)\n\n## What's Changed\n* feat(integrations): Add Azure Drive Sites support by @chloedia in https://github.com/QuivrHQ/quivr/pull/2919\n* chore: update sync notification status to INFO by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2918\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.290...v0.0.291\n\n## 0.0.290 (2024-07-26)\n\n## What's Changed\n* fix(frontend): remove possibility to sync folder by @Zewed in https://github.com/QuivrHQ/quivr/pull/2913\n* fix(frontend): remove latence for delete notifications by @Zewed in https://github.com/QuivrHQ/quivr/pull/2916\n* fix(backend): fix error messages by @Zewed in https://github.com/QuivrHQ/quivr/pull/2917\n* feat(notifications): improved requirements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2915\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.289...v0.0.290\n\n## 0.0.289 (2024-07-25)\n\n## What's Changed\n* chore(main): release core 0.0.12 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2889\n* fix: error dict google drive by @chloedia in https://github.com/QuivrHQ/quivr/pull/2912\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.288...v0.0.289\n\n## 0.0.288 (2024-07-23)\n\n## What's Changed\n* fix(sync): folder upload to Google Drive by @chloedia in https://github.com/QuivrHQ/quivr/pull/2909\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.287...v0.0.288\n\n## 0.0.287 (2024-07-23)\n\n## What's Changed\n* feat: Update AzureDriveSync name to \"Share Point\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2907\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.286...v0.0.287\n\n## 0.0.286 (2024-07-23)\n\n## What's Changed\n* fix(frontend): remove warning in frontend by @Zewed in https://github.com/QuivrHQ/quivr/pull/2896\n* feat(frontend): add logo to source when integration by @Zewed in https://github.com/QuivrHQ/quivr/pull/2899\n* feat(premium): add trialing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2900\n* feat: Remove unused onboarding code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2901\n* feat(dead-code): removed composite & api by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2902\n* feat(frontend): add a loader when processing files by @Zewed in https://github.com/QuivrHQ/quivr/pull/2903\n* feat(frontend): icon chevron for folders by @Zewed in https://github.com/QuivrHQ/quivr/pull/2904\n* feat(frontend): loader icon for integrations by @Zewed in https://github.com/QuivrHQ/quivr/pull/2905\n* fix(frontend): remove current brain id when click on create brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2906\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.285...v0.0.286\n\n## 0.0.285 (2024-07-22)\n\n## What's Changed\n* fix(frontend): select line when click on knowledge option by @Zewed in https://github.com/QuivrHQ/quivr/pull/2879\n* fix(frontend): selected item on mention list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2881\n* fix(frontend): logo color on dark mode by @Zewed in https://github.com/QuivrHQ/quivr/pull/2882\n* fix: Refacto & update dropbox refresh by @chloedia in https://github.com/QuivrHQ/quivr/pull/2875\n* feat: quivr core brain info + processors registry +  by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2877\n* chore(main): release core 0.0.10 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2872\n* feat: move parsers quivr core by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2884\n* fix(frontend): default icon for knowledge without extension by @Zewed in https://github.com/QuivrHQ/quivr/pull/2887\n* chore(main): release core 0.0.11 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2886\n* feat(frontend): add knowledge icon when integration by @Zewed in https://github.com/QuivrHQ/quivr/pull/2888\n* fix: google conversion by @chloedia in https://github.com/QuivrHQ/quivr/pull/2891\n* fix(frontend): remove thoughts button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2892\n* feat: add integration and integration link to Sources class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2893\n* feat(azure): changed auth method by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2890\n* feat(frontend): new inputs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2894\n* fix(frontend): menu on mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/2895\n* feat(api): add logging for inactive subscriptions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2897\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.284...v0.0.285\n\n## 0.0.284 (2024-07-17)\n\n## What's Changed\n* chore(cleanup): cleaned up some unused files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2858\n* feat: Improve file loading logic in File model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2861\n* feat(celery): add retry logic for dcos by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2862\n* feat: quivr api send notification by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2865\n* feat: Update category for sync notification by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2866\n* feat: Update crawl_endpoint to include knowledge_id in task kwargs by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2867\n* feat(integrations): Add integration fields to Knowledge and SyncsUser models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2853\n* feat: quivr api use quivr core by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2868\n* feat: Update sync generic bulk by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2869\n* chore(main): release core 0.0.9 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2855\n* feat(frontend): new notifications design by @Zewed in https://github.com/QuivrHQ/quivr/pull/2870\n* feat: Update sync active notification category by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2873\n* feat(integrations): dropbox by @chloedia in https://github.com/QuivrHQ/quivr/pull/2864\n* fix(frontend): delete notifications by @Zewed in https://github.com/QuivrHQ/quivr/pull/2874\n* feat(frontend): back button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2876\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.283...v0.0.284\n\n## 0.0.283 (2024-07-12)\n\n## What's Changed\n* feat: Add bulk_id field to CreateNotification and Notification models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2850\n* feat: Add bulk_id field to CreateNotification and Notification models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2854\n* fix: quiv core stream duplicate  and quivr-core rag tests by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2852\n* feat: Add category and brain_id fields to CreateNotification and Notification models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2856\n* feat: Update file loading logic in File model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2857\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.282...v0.0.283\n\n## 0.0.282 (2024-07-11)\n\n## What's Changed\n* chore: Update quivr-core and chainlit versions in requirements.txt by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2839\n* chore(config): migrate renovate config by @renovate in https://github.com/QuivrHQ/quivr/pull/2838\n* fix: fixes duplicate response bug by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2843\n* fix(frontend): remove possibilities to create brain if max amount by @Zewed in https://github.com/QuivrHQ/quivr/pull/2847\n* fix(frontend): general before connections by @Zewed in https://github.com/QuivrHQ/quivr/pull/2848\n* fix(backend): thumbs button were broken by @Zewed in https://github.com/QuivrHQ/quivr/pull/2849\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.281...v0.0.282\n\n## 0.0.281 (2024-07-11)\n\n## What's Changed\n* feat: quivr core minimal chat by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2803\n* chore: Add release-please-core workflow and configuration files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2809\n* chore(main): release core 0.0.2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2812\n* chore(main): release core 0.0.2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2813\n* chore(main): release core 0.0.2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2814\n* chore(main): release core 0.0.2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2815\n* fix(pyproject): fixed to quivr github by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2816\n* chore(main): release core 0.0.3 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2817\n* feat: quivr core minimal chat by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2818\n* chore(main): release core 0.0.4 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2819\n* feat: Add GitHub Actions workflow for running tests on backend/core by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2820\n* feat: Add GitHub Actions workflow for running tests on backend/core by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2822\n* feat(precommit): Update pre-commit hooks to latest versions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2823\n* feat: quivr core chat history by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2824\n* chore(main): release core 0.0.5 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2821\n* feat(frontend): UI / UX Notifications by @Zewed in https://github.com/QuivrHQ/quivr/pull/2826\n* feat: quivr-core ask streaming by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2828\n* chore(main): release core 0.0.6 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2829\n* fix: llm model name by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2830\n* chore(main): release core 0.0.7 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2831\n* feat: Add Quivr chatbot example by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2827\n* feat(renovate): updated configuration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2835\n* feat: Update aiofiles dependency to loosen version control by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2834\n* chore(main): release core 0.0.8 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2832\n* chore: Update quivr-core and chainlit versions in requirements.txt by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2836\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.280...v0.0.281\n\n## 0.0.280 (2024-07-09)\n\n## What's Changed\n* feat(frontend): add small property to textInput by @Zewed in https://github.com/QuivrHQ/quivr/pull/2798\n* fix(frontend): brain studio ui audit implem by @Zewed in https://github.com/QuivrHQ/quivr/pull/2800\n* fix(frontend): remove quivr assistant for now by @Zewed in https://github.com/QuivrHQ/quivr/pull/2801\n* feat(frontend): Uniformize brain icon by @Zewed in https://github.com/QuivrHQ/quivr/pull/2802\n* fix(frontend): out of credits when credits null by @Zewed in https://github.com/QuivrHQ/quivr/pull/2804\n* feat(frontend): better UI for big modals by @Zewed in https://github.com/QuivrHQ/quivr/pull/2805\n* fix(frontend): align brain recap step by @Zewed in https://github.com/QuivrHQ/quivr/pull/2806\n* feat: Improve error handling in acquiring token by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2807\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.279...v0.0.280\n\n## 0.0.279 (2024-07-04)\n\n## What's Changed\n* feat(frontend): remove create brain step in onboarding when share brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2791\n* feat: add megaparse by @chloedia in https://github.com/QuivrHQ/quivr/pull/2785\n* fix: asyncpg pooling config fix by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2795\n* fix: RAG service bug assertion error by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2796\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.278...v0.0.279\n\n## 0.0.278 (2024-07-01)\n\n## What's Changed\n* chore: Add GitHub Actions workflow for testing and building Docker image by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2778\n* chore: Update flashrank npm dependency to version 0.2.5 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2781\n* feat(frontend): disabled searchBar if no remaining credits or no brain selected by @Zewed in https://github.com/QuivrHQ/quivr/pull/2788\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.277...v0.0.278\n\n## 0.0.277 (2024-06-27)\n\n## What's Changed\n* fix(frontend): UI Notification Ring and Fix Page Header Display on Mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/2771\n* feat(frontend): better UI for General Settings by @Zewed in https://github.com/QuivrHQ/quivr/pull/2773\n* fix(frontend): new api key creation bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2774\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.276...v0.0.277\n\n## 0.0.276 (2024-06-27)\n\n## What's Changed\n* chore: Add supabase directory to Dockerfile by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2768\n* chore: Update docker-compose files to specify platform for backend services by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2763\n* Revert \"chore: Update docker-compose files to specify platform for backend services\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2770\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.275...v0.0.276\n\n## 0.0.275 (2024-06-27)\n\n## What's Changed\n* fix(frontend): fix table in frontend by @Zewed in https://github.com/QuivrHQ/quivr/pull/2758\n* chore: Update docker-compose files to specify platform for backend services by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2762\n* fix(frontend): settings button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2764\n* feat(backend):   quivr-monorepo and quivr-core package by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2765\n* chore: Add ci-migration.sh to Dockerfile by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2767\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.274...v0.0.275\n\n## 0.0.274 (2024-06-26)\n\n## What's Changed\n* refacto(backend): poetry package manager and chat route refactoring  by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2684\n* closes #2756 by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2757\n* fix: Update email sender parameters in backend code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2755\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.273...v0.0.274\n\n## 0.0.273 (2024-06-25)\n\n## What's Changed\n* feat(frontend): new ui ux for knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2732\n* fix(frontend): small issues with scss by @Zewed in https://github.com/QuivrHQ/quivr/pull/2734\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.272...v0.0.273\n\n## 0.0.272 (2024-06-24)\n\n## What's Changed\n* fix(frontend): send empty sync is not allowed by @Zewed in https://github.com/QuivrHQ/quivr/pull/2716\n* feat: Improve efficiency of syncing stripe by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2719\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.271...v0.0.272\n\n## 0.0.271 (2024-06-24)\n\n## What's Changed\n* fix: check user premium upsert by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2714\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.270...v0.0.271\n\n## 0.0.270 (2024-06-24)\n\n## What's Changed\n* fix(frontend): small rephrase by @Zewed in https://github.com/QuivrHQ/quivr/pull/2699\n* feat(frontend): table markdown by @Zewed in https://github.com/QuivrHQ/quivr/pull/2702\n* Enable Porter Application raise by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2705\n* Enable Porter Application raise-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2706\n* chore: Remove Porter stack deployment workflows for cherry-pick-backend and cherry-pick-frontend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2707\n* fix(frontend): 25 instead of 100 by @Zewed in https://github.com/QuivrHQ/quivr/pull/2708\n* fix(frontend): remove double scss class by @elazarnaaman in https://github.com/QuivrHQ/quivr/pull/2704\n* fix(frontend): documents before connections by @Zewed in https://github.com/QuivrHQ/quivr/pull/2711\n* feat(frontend): brain studio interface by @Zewed in https://github.com/QuivrHQ/quivr/pull/2712\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.269...v0.0.270\n\n## 0.0.269 (2024-06-20)\n\n## What's Changed\n* feat: Add Microsoft Identity Association JSON file by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2697\n\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.268...v0.0.269\n\n## 0.0.268 (2024-06-18)\n\n## What's Changed\n\n- fix(frontend): rephrase unpaid to free by @Zewed in https://github.com/QuivrHQ/quivr/pull/2679\n- feat(frontend): set from connections by default in knowledge to feed by @Zewed in https://github.com/QuivrHQ/quivr/pull/2680\n- feat(frontend): rephrase from Url to from Website's page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2684\n- feat(frontend): new chat interface by @Zewed in https://github.com/QuivrHQ/quivr/pull/2687\n- fix(frontend): next step impossible if no knowledge when creating brain if no onboarded by @Zewed in https://github.com/QuivrHQ/quivr/pull/2688\n- feat(turbopack): Implement turbo pack compiler by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2685\n- fix(frontend): rephrase thoughts button title by @Zewed in https://github.com/QuivrHQ/quivr/pull/2689\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.267...v0.0.268\n\n## 0.0.267 (2024-06-14)\n\n## What's Changed\n\n- fix(frontend): scroll modal payment by @Zewed in https://github.com/QuivrHQ/quivr/pull/2675\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.266...v0.0.267\n\n## 0.0.266 (2024-06-13)\n\n## What's Changed\n\n- fix: Add logic to filter active subscriptions in check_if_is_premium_user function by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2673\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.265...v0.0.266\n\n## 0.0.265 (2024-06-13)\n\n## What's Changed\n\n- feat: Add timezone conversion for premium user check by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2670\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.264...v0.0.265\n\n## 0.0.264 (2024-06-13)\n\n## What's Changed\n\n- fix: name passed in sync authorize by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2665\n- feat: Add premium user check in celery task by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2668\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.263...v0.0.264\n\n## 0.0.263 (2024-06-12)\n\n## What's Changed\n\n- fix: Add error handling for syncing in tasks.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2663\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.262...v0.0.263\n\n## 0.0.262 (2024-06-12)\n\n## What's Changed\n\n- Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2660\n- feat: Normalize file names in sync module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2661\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.261...v0.0.262\n\n## 0.0.261 (2024-06-11)\n\n## What's Changed\n\n- feat: Update Google authorization URL with prompt for consent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2658\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.260...v0.0.261\n\n## 0.0.260 (2024-06-11)\n\n## What's Changed\n\n- feat: Add extra_hosts configuration to docker-compose.dev.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2635\n- fix: sync creation fixed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2637\n- chore: Set default value for \"last_synced\" column in \"syncs_active\" table to '2024-06-01 15:30:25+00' by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2638\n- fix: integrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2642\n- feat(frontend): sharepoint and gdrive integration by @Zewed in https://github.com/QuivrHQ/quivr/pull/2643\n- fix(frontend): display bug on add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2644\n- fix: files_metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2645\n- fix(google): auth is now in state by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2647\n- fix(frontend): add brain modal integration doestn t work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2649\n- fix(frontend): tooltip on folder line by @Zewed in https://github.com/QuivrHQ/quivr/pull/2650\n- feat: telemetry improved by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2651\n- feat: Add force_sync option to SyncsActiveUpdateInput by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2652\n- Update license to include enterprise features by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2653\n- fix(frontend): onboarding bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2655\n- Update README.md by @ferozemohideen in https://github.com/QuivrHQ/quivr/pull/2656\n\n## New Contributors\n\n- @ferozemohideen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2656\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.259...v0.0.260\n\n## 0.0.259 (2024-06-04)\n\n## What's Changed\n\n- feat(upload): async improved by @AmineDiro in https://github.com/QuivrHQ/quivr/pull/2544\n\n## New Contributors\n\n- @AmineDiro made their first contribution in https://github.com/QuivrHQ/quivr/pull/2544\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.258...v0.0.259\n\n## 0.0.258 (2024-05-29)\n\n## What's Changed\n\n- feat: Update QuivrRAG and run_evaluation.py files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2615\n- fix: modify thought prompt by @chloedia in https://github.com/QuivrHQ/quivr/pull/2626\n- feat(llamaparse): Update parsing instructions in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2627\n- feat(sync): retrieve user email used for the connection by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2628\n- fix: Refactor conversational_qa_chain initialization in KnowledgeBrainQA by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2629\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.257...v0.0.258\n\n## 0.0.257 (2024-05-28)\n\n## What's Changed\n\n- Add Privacy & Compliance Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2620\n- docs(security): added compliance by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2621\n- fix(frontend): upgrade button on user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2623\n- feat(frontend): Add ThoughtsButton component for displaying thoughts by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2624\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.256...v0.0.257\n\n## 0.0.256 (2024-05-26)\n\n## What's Changed\n\n- feat(rag): follow-up questions and thoughts with spanish fix by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2618\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.255...v0.0.256\n\n## 0.0.255 (2024-05-24)\n\n## What's Changed\n\n- feat: Add Google Drive & Sharepoint sync in backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2592\n- Revert \"feat: Add Google Drive & Sharepoint sync in backend\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2603\n- Feat/auth-playground by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2605\n- feat: add init to create packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2606\n- Add additional modules to celery.autodiscover_tasks() by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2607\n- Feat/celery import by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2608\n- feat: self-reflect brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2610\n- feat: ragas improved testing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2611\n- fix(frontend): less agressive colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2612\n- fix(frontend): important buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2613\n- fix(frontend): fix white colors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2614\n- fix(frontend): using dark mode in tiptap by @ramonzaca in https://github.com/QuivrHQ/quivr/pull/2616\n\n## New Contributors\n\n- @ramonzaca made their first contribution in https://github.com/QuivrHQ/quivr/pull/2616\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.254...v0.0.255\n\n## 0.0.254 (2024-05-21)\n\n## What's Changed\n\n- fix: sender email address in resend_invitation_email.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2600\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.253...v0.0.254\n\n## 0.0.253 (2024-05-14)\n\n## What's Changed\n\n- fix(frontend): Implement persistent dark mode setting and & Implement persistent dark mode setting by @elazarnaaman in https://github.com/QuivrHQ/quivr/pull/2423\n- fix(frontend): hover effect on profile Button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2587\n- fix(frontend): user invite UI on Mobile by @Zewed in https://github.com/QuivrHQ/quivr/pull/2586\n- feat: Update ChatLiteLLM model and add RLS optimization for notifications by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2591\n\n## New Contributors\n\n- @elazarnaaman made their first contribution in https://github.com/QuivrHQ/quivr/pull/2423\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.252...v0.0.253\n\n## 0.0.252 (2024-05-13)\n\n## What's Changed\n\n- docs: Update GPT4 documentation with available tools and use cases by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2580\n- docs: Add docstrings to integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2582\n- fix: Update import statements for OllamaEmbeddings by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2584\n- feat: Add support for gpt-4o model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2589\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.251...v0.0.252\n\n## 0.0.251 (2024-05-10)\n\n## What's Changed\n\n- feat(tool): Add URLReaderTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2577\n- feat(email): Add email sender tool and update image generator tool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2579\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.250...v0.0.251\n\n## 0.0.250 (2024-05-10)\n\n## What's Changed\n\n- feat(gpt4): Add search functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2566\n- [ImgBot] Optimize images by @imgbot in https://github.com/QuivrHQ/quivr/pull/2568\n- feat(gpt4): image generation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2569\n- fix(front): Add NEXT_PUBLIC_AUTH_MODES to .env.example by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2570\n- fix: NEXT_PUBLIC_AUTH_MODES in docker-compose.yml by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2572\n- docs: Add Supabase configuration documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2574\n- docs(gpt4): Update GPT-4 Documentation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2573\n- chore: tools by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2575\n- feat(brave-search): Update GPT4Brain tools and add WebSearchTool by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2576\n\n## New Contributors\n\n- @imgbot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2568\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.249...v0.0.250\n\n## 0.0.249 (2024-05-08)\n\n## What's Changed\n\n- feat(crawler): Add Playwright for web crawling by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2562\n- ci(ecr): added build to public ecr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2564\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.248...v0.0.249\n\n## 0.0.248 (2024-05-07)\n\n## What's Changed\n\n- fix: utf8 encoding by @chloedia in https://github.com/QuivrHQ/quivr/pull/2555\n- feat(celery): moved assistant summary to celery by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2557\n- Revert \"feat(celery): moved assistant summary to celery\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2558\n\n## New Contributors\n\n- @chloedia made their first contribution in https://github.com/QuivrHQ/quivr/pull/2555\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.247...v0.0.248\n\n## 0.0.247 (2024-05-07)\n\n## What's Changed\n\n- feat(frontend): add notifications for document uploads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2549\n- Update install.mdx by @dazeb in https://github.com/QuivrHQ/quivr/pull/2552\n- fix(frontend): fix notifications issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2551\n- chore(ci): Update PR title linting workflow by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2553\n\n## New Contributors\n\n- @dazeb made their first contribution in https://github.com/QuivrHQ/quivr/pull/2552\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.246...v0.0.247\n\n## 0.0.246 (2024-05-04)\n\n## What's Changed\n\n- Enable Porter Application theodo-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2537\n- Enable Porter Application theodo-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2538\n- Add config parameter to conversational_qa_chain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2540\n- feat(notion): update doc by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2542\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.245...v0.0.246\n\n## 0.0.245 (2024-05-03)\n\n## What's Changed\n\n- feat(user): Delete User Data from frontend by @Zewed in https://github.com/QuivrHQ/quivr/pull/2476\n- feat(backend): Add a pre_pring on Connection polling to handle disconnection by @dmourot in https://github.com/QuivrHQ/quivr/pull/2534\n- feat(llama-parse): improve prompt by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2535\n- feat(brain): Add ProxyBrain integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2536\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.244...v0.0.245\n\n## 0.0.244 (2024-05-02)\n\n## What's Changed\n\n- fix: Update parsing instruction in common.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2531\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.243...v0.0.244\n\n## 0.0.243 (2024-05-01)\n\n## What's Changed\n\n- fix: Refactor chat_service.py and remove unused code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2530\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.242...v0.0.243\n\n## 0.0.242 (2024-05-01)\n\n## What's Changed\n\n- feat(notifications): implemented notifications with RLS and realtime by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2525\n- chore: packages by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2527\n- Enable Porter Application production by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2528\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.241...v0.0.242\n\n## 0.0.241 (2024-05-01)\n\n## What's Changed\n\n- feat(llamaparse): Add Llama Parse integration for complex document parsing by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2517\n- Delete Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2519\n- Delete Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2520\n- Enable Porter Application preview by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2521\n- Enable Porter Application preview-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2522\n- feat(frontend): citations & sources by @Zewed in https://github.com/QuivrHQ/quivr/pull/2523\n- Fix: citation handling in ChatItem component by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2524\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.240...v0.0.241\n\n## 0.0.240 (2024-04-29)\n\n## What's Changed\n\n- feat(supabase): Add logging statements and refactor Supabase client creation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2514\n- feat(backend): use SQLAlchemy instead od supabase API by @dmourot in https://github.com/QuivrHQ/quivr/pull/2516\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.239...v0.0.240\n\n## 0.0.239 (2024-04-28)\n\n## What's Changed\n\n- feat(citations): system added by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2498\n- feat(frontend): add nb of knowledges per brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2502\n- docs: Update links in mint.json to add api by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2504\n- feat(docker): Update Dockerfile to install Supabase CLI by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2505\n- fix(frontend): fix some next errors by @Zewed in https://github.com/QuivrHQ/quivr/pull/2503\n- feat(frontend): show remaining credits by @Zewed in https://github.com/QuivrHQ/quivr/pull/2495\n- feat(embedding): keeping citations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2506\n- fix(metadata): Removed citation from metadata by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2507\n- Add ci-migration script by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2508\n- Feat/migration ci 2 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2509\n- Enable Porter Application quivr-com-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2510\n- Enable Porter Application quivr-com by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2511\n- feat(profiler): Add pyinstrument package and update Makefile and backend code by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2512\n- feat(db): Add Supabase client and database instances caching by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2513\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.238...v0.0.239\n\n## 0.0.238 (2024-04-25)\n\n## What's Changed\n\n- Enable Porter Application cherry-pick-backend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2492\n- Enable Porter Application cherry-pick-frontend by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2493\n- feat: Add telemetry ping task to celery worker and main.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2494\n- fix(backend): compute history only if needed and put some cache to remove some call… by @dmourot in https://github.com/QuivrHQ/quivr/pull/2497\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.237...v0.0.238\n\n## 0.0.237 (2024-04-24)\n\n## What's Changed\n\n- docs: Add environment variables, increase user usage, and add new models by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2481\n- fix(frontend): Warning for Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2479\n- fix(frontend): better UI for Onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2477\n- docs: add new configuration items by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2483\n- Revert \"fix(frontend): better UI for Onboarding\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2485\n- feat(reranker): Add flashrank and contextual compression retriever by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2480\n- feat(history): max tokens in the history provided by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2487\n- feat: Update chunk overlap to 200 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2488\n- docs: Add reranking configuration guide by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2489\n- docs: Update telemetry configuration in Quivr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2490\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.236...v0.0.237\n\n## 0.0.236 (2024-04-23)\n\n## What's Changed\n\n- feat(docs): update to new by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2465\n- feat(docs): Add new brain files and update navigation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2467\n- Feat/docs category brains agents by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2469\n- fix(docs): update doc by @Zewed in https://github.com/QuivrHQ/quivr/pull/2470\n- feat(digital-ocean): Update deployment instructions for Digital Ocean by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2472\n- docs(digital-ocean): added missing photo by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2473\n- docs: Update brain documentation and images by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2475\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.235...v0.0.236\n\n## 0.0.235 (2024-04-21)\n\n## What's Changed\n\n- fix(sources): Remove duplicate sources and add metadata to model response by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2462\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.234...v0.0.235\n\n## 0.0.234 (2024-04-21)\n\n## What's Changed\n\n- fix(gpt4): Refactor GPT4Brain and KnowledgeBrainQA classes to add non-streaming-saving-answer by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2460\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.233...v0.0.234\n\n## 0.0.233 (2024-04-21)\n\n## What's Changed\n\n- refactor: reorg files in backend by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2449\n- Revert \"refactor: reorg files in backend\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2456\n- refactor: Refacto code #1 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2458\n- refactor: reorg the files #2 by @MaximeThoonsen in https://github.com/QuivrHQ/quivr/pull/2457\n- feat(gpt4): Add chat service and generate answer method to GPT4Brain class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2459\n\n## New Contributors\n\n- @MaximeThoonsen made their first contribution in https://github.com/QuivrHQ/quivr/pull/2449\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.232...v0.0.233\n\n## 0.0.232 (2024-04-19)\n\n## What's Changed\n\n- Update CPU and memory settings in task definition files by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2450\n- fix: Fix error message in SummaryAssistant class by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2453\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.231...v0.0.232\n\n## 0.0.231 (2024-04-19)\n\n## What's Changed\n\n- feat(assistants): Add user usage update and pricing calculation to ITO assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2433\n- feat(assistant): improve prompt summary by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2435\n- feat(assistants): Add PDF generation functionality and nice emails by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2436\n- feat(analytics): rely on sql rather that python loop for brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2437\n- fix(assistant): summary now can output 2000 tokens by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2440\n- feat(assistant): check if key of file is same as filename uploaded by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2439\n- feat: Update Docker build commands and dependencies by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2441\n- feat(rag): Refactor DEFAULT_DOCUMENT_PROMPT in quivr_rag.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2442\n- Enable Porter Application quivr-back by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2443\n- Enable Porter Application quivr-demo-front by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2444\n- fix(assistants): brain id is null by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2445\n- feat(summary): improve prompt to get more insights by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2446\n- feat(aws): Update CPU and memory configurations for task definitions by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2447\n- feat(frontend): Quivr Assistants by @Zewed in https://github.com/QuivrHQ/quivr/pull/2448\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.230...v0.0.231\n\n## 0.0.230 (2024-04-16)\n\n## What's Changed\n\n- feat(backend): add RAG evaluation using Ragas by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2429\n- feat(assistants): Add new input models for boolean, number, select text, and select number by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2432\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.229...v0.0.230\n\n## 0.0.229 (2024-04-12)\n\n## What's Changed\n\n- feat: optimization calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2417\n- feat: Add assistant module and remove ingestion module by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2420\n- feat: assistants by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2421\n- feat: Add tags to AssistantOutput classes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2425\n- feat: Add icon and description to assistant by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2426\n- feat: llamaparse & diff agent by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2427\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.228...v0.0.229\n\n## 0.0.228 (2024-04-10)\n\n## What's Changed\n\n- fix(frontend): phone display issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2386\n- Patch 1 by @llwp in https://github.com/QuivrHQ/quivr/pull/2388\n- fix: typo in README.md by @bolens in https://github.com/QuivrHQ/quivr/pull/2391\n- feat(ingestion): Add ingestion module and routes by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2393\n- feat: Add seed ingestions to supabase migrations by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2399\n- feat: Add url_required field to IngestionEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2400\n- Feat: Bibtex file uploads by @colesnic in https://github.com/QuivrHQ/quivr/pull/2398\n- fix: logger level and telemetry function calls by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2409\n- fix: Add integration brain to subscription route by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2410\n- feat(frontend): onboarding V2 by @Zewed in https://github.com/QuivrHQ/quivr/pull/2394\n- fix(frontend): onboardind bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2414\n- fix(frontend): cleaner fix for onboarding by @Zewed in https://github.com/QuivrHQ/quivr/pull/2415\n- feat(analytics): added analytics page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2416\n\n## New Contributors\n\n- @llwp made their first contribution in https://github.com/QuivrHQ/quivr/pull/2388\n- @bolens made their first contribution in https://github.com/QuivrHQ/quivr/pull/2391\n- @colesnic made their first contribution in https://github.com/QuivrHQ/quivr/pull/2398\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.227...v0.0.228\n\n## 0.0.227 (2024-03-28)\n\n## What's Changed\n\n- fix(backend): invitation with new brains did not work by @Zewed in https://github.com/QuivrHQ/quivr/pull/2378\n- fix(backend): invitation brain bugs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2380\n- fix(frontend): disable knowledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2381\n- fix(frontend): dark mode issues by @Zewed in https://github.com/QuivrHQ/quivr/pull/2382\n- feat(frontend): show icons only on hover except for last message by @Zewed in https://github.com/QuivrHQ/quivr/pull/2377\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.226...v0.0.227\n\n## 0.0.226 (2024-03-21)\n\n## What's Changed\n\n- feat: Add Mistral models to defineMaxTokens and BrainConfig by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2363\n- feat: mistral by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2365\n- fix(retriever): Update match_vectors sql function to rank chunks in correct order by @dmourot in https://github.com/QuivrHQ/quivr/pull/2367\n- feat(docker image): Docker image Optimized for CPU-only env by @dmourot in https://github.com/QuivrHQ/quivr/pull/2368\n- feat(frontend): dark mode by @Zewed in https://github.com/QuivrHQ/quivr/pull/2369\n- feat(frontend & backend): thumbs for message feedback by @Zewed in https://github.com/QuivrHQ/quivr/pull/2360\n- fix(backend): migration legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2370\n- fix(frontend): type stripe casing by @Zewed in https://github.com/QuivrHQ/quivr/pull/2371\n- fix(backend): unsubscribe from brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2373\n- feat(frontend): onboarding form by @Zewed in https://github.com/QuivrHQ/quivr/pull/2342\n- fix(frontend): onBoarding issue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2374\n\n## New Contributors\n\n- @dmourot made their first contribution in https://github.com/QuivrHQ/quivr/pull/2367\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.225...v0.0.226\n\n## 0.0.225 (2024-03-15)\n\n## What's Changed\n\n- fix(frontend): bigger icon on message row by @Zewed in https://github.com/QuivrHQ/quivr/pull/2345\n- fix(frontend): remove brains usage in user page by @Zewed in https://github.com/QuivrHQ/quivr/pull/2349\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.224...v0.0.225\n\n## 0.0.224 (2024-03-15)\n\n## What's Changed\n\n- feat(frontend): add discord link by @Zewed in https://github.com/QuivrHQ/quivr/pull/2343\n- fix(frontend): upgrade to plus by @Zewed in https://github.com/QuivrHQ/quivr/pull/2346\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.223...v0.0.224\n\n## 0.0.223 (2024-03-13)\n\n## What's Changed\n\n- chore: update packages backend by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2339\n- feat: Add optional fields to UserIdentity and UserUpdatableProperties by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2341\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.222...v0.0.223\n\n## 0.0.222 (2024-03-09)\n\n## What's Changed\n\n- feat: Update langchain.prompts and langchain_core.messages modules by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2326\n- feat(frontend): social buttons by @Zewed in https://github.com/QuivrHQ/quivr/pull/2325\n- fix(frontend): upgrade to plus button by @Zewed in https://github.com/QuivrHQ/quivr/pull/2324\n- fix(frontend): maximum amount of brains reached by @Zewed in https://github.com/QuivrHQ/quivr/pull/2323\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.221...v0.0.222\n\n## 0.0.221 (2024-03-07)\n\n## What's Changed\n\n- feat: seed updated by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2313\n- fix(frontend): allow model change by @Zewed in https://github.com/QuivrHQ/quivr/pull/2317\n- fix(frontend): mention list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2315\n- fix(frontend): studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2316\n- feat(frontend): add help tooltip for model selection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2318\n- fix(frontend): page header studio to brain studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2319\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.220...v0.0.221\n\n## 0.0.220 (2024-03-06)\n\n## What's Changed\n\n- fix(frontend): brain name by @Zewed in https://github.com/QuivrHQ/quivr/pull/2311\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.219...v0.0.220\n\n## 0.0.219 (2024-03-06)\n\n## What's Changed\n\n- feat: Update to newest version of litellm by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2307\n- fix(frontend): small renaiming chat to thread by @Zewed in https://github.com/QuivrHQ/quivr/pull/2306\n- feat(frontend): brain Catalogue by @Zewed in https://github.com/QuivrHQ/quivr/pull/2303\n- feat(frontend): 404 redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2309\n- fix(frontend): old brain legacy by @Zewed in https://github.com/QuivrHQ/quivr/pull/2310\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.218...v0.0.219\n\n## 0.0.218 (2024-03-05)\n\n## What's Changed\n\n- feat: doc as integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2297\n- fix(rag): add api_base by @niels-garve in https://github.com/QuivrHQ/quivr/pull/2289\n- fix(frontend): login bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2300\n\n## New Contributors\n\n- @niels-garve made their first contribution in https://github.com/QuivrHQ/quivr/pull/2289\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.217...v0.0.218\n\n## 0.0.217 (2024-03-04)\n\n## What's Changed\n\n- fix(frontend): fix home page redirection by @Zewed in https://github.com/QuivrHQ/quivr/pull/2295\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.216...v0.0.217\n\n## 0.0.216 (2024-03-04)\n\n## What's Changed\n\n- feat: Update chunk_size in File model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2281\n- fix(frontend): double file upload on drag and drop by @Zewed in https://github.com/QuivrHQ/quivr/pull/2284\n- fix(frontend): click anywhere on drop zone to upload file by @Zewed in https://github.com/QuivrHQ/quivr/pull/2285\n- fix(frontend): smalls on thread section by @Zewed in https://github.com/QuivrHQ/quivr/pull/2286\n- fix(frontend): remove tests by @Zewed in https://github.com/QuivrHQ/quivr/pull/2287\n- feat(frontend): better UI/UX on select brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2288\n- feat(frontend): add brain icon on brain list by @Zewed in https://github.com/QuivrHQ/quivr/pull/2292\n- fix(frontend): whitespace on firefox by @Zewed in https://github.com/QuivrHQ/quivr/pull/2293\n- fix(frontend): remove unused stuff by @Zewed in https://github.com/QuivrHQ/quivr/pull/2282\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.215...v0.0.216\n\n## 0.0.215 (2024-03-01)\n\n## What's Changed\n\n- fix(frontend): message info box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2277\n- fix(frontend): see knowledge in custom brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2278\n- fix(frontend): fix disabled knwoledge tab by @Zewed in https://github.com/QuivrHQ/quivr/pull/2280\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.214...v0.0.215\n\n## 0.0.214 (2024-02-29)\n\n## What's Changed\n\n- fix(frontend): revamp quivr studio by @Zewed in https://github.com/QuivrHQ/quivr/pull/2274\n- fix(frontend): zindex and radius on single selector component by @Zewed in https://github.com/QuivrHQ/quivr/pull/2276\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.213...v0.0.214\n\n## 0.0.213 (2024-02-28)\n\n## What's Changed\n\n- feat(notion): added custom integration by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2268\n- feat: Remove constraints and add foreign key references to brain tables by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2273\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.212...v0.0.213\n\n## 0.0.212 (2024-02-26)\n\n## What's Changed\n\n- feat: new landing page by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2264\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.211...v0.0.212\n\n## 0.0.211 (2024-02-24)\n\n## What's Changed\n\n- fix: ollama migration documentation by @bidoubiwa in https://github.com/QuivrHQ/quivr/pull/2248\n- Update Sentry configuration and ignore file by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2250\n- Fix Sentry DSN environment variable by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2251\n- fix(sentry): Refactor GlobalError component to use arrow function syntax by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2252\n- fix: Update Sentry configuration to use NEXT_PUBLIC_SENTRY_DSN by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2254\n- feat(frontend): integrate octolane by @Zewed in https://github.com/QuivrHQ/quivr/pull/2256\n- fix(frontend): better search bar and chat box by @Zewed in https://github.com/QuivrHQ/quivr/pull/2255\n- feat(frontend): sources per messages by @Zewed in https://github.com/QuivrHQ/quivr/pull/2253\n- feat(sentry): remove health endpoint by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2257\n- Add octolane.com to Content Security Policy by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2258\n- fix(frontend): ui chat box & sources small bug by @Zewed in https://github.com/QuivrHQ/quivr/pull/2260\n- Refactor GitHub workflows by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2261\n\n## New Contributors\n\n- @bidoubiwa made their first contribution in https://github.com/QuivrHQ/quivr/pull/2248\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.210...v0.0.211\n\n## 0.0.210 (2024-02-22)\n\n## What's Changed\n\n- feat: Update memory allocation in task definition by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2243\n- fix: get_brain_details API to include user_id parameter by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2242\n- feat(chat): Add follow up questions functionality by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2241\n- Reduce sampling rate for Sentry traces by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2245\n- Revert \"feat(chat): Add follow up questions functionality\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2246\n- Add max_input and max_tokens parameters to KnowledgeBrainQA constructor by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2247\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.209...v0.0.210\n\n## 0.0.209 (2024-02-22)\n\n## What's Changed\n\n- fix(frontend): fix share brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2238\n- fix(frontend): don't preselect core brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2239\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.208...v0.0.209\n\n## 0.0.208 (2024-02-21)\n\n## What's Changed\n\n- feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2216\n- Enable Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2220\n- Delete Porter Application quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2221\n- Enable Porter Application preview-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2222\n- Enable Porter Application prod-quivr by @porter-deployment-app in https://github.com/QuivrHQ/quivr/pull/2223\n- feat(brains): added description by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2224\n- feat: Add integration_logo_url to MinimalUserBrainEntity by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2225\n- Add Redis configuration to celery_config.py by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2227\n- Remove unused 'model' variable and logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2228\n- feat: Add max_files attribute to MinimalUserBrainEntity and BrainsUsers repository by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2229\n- Feature: Add animations to foldable section by @johnfewell in https://github.com/QuivrHQ/quivr/pull/2202\n- feat(frontend): first custom brain live by @Zewed in https://github.com/QuivrHQ/quivr/pull/2226\n- fix(frontend): legacy on foldable section animation pr by @Zewed in https://github.com/QuivrHQ/quivr/pull/2230\n- Fix: API endpoint for getting integration brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2231\n- feat: Update dependencies and remove unnecessary logging statements by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2232\n- feat: implement elasticache by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2234\n- fix(frontend): ellipsis overflow on large brain or prompt names by @Zewed in https://github.com/QuivrHQ/quivr/pull/2233\n\n## New Contributors\n\n- @porter-deployment-app made their first contribution in https://github.com/QuivrHQ/quivr/pull/2220\n- @johnfewell made their first contribution in https://github.com/QuivrHQ/quivr/pull/2202\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.207...v0.0.208\n\n## 0.0.206 (2024-02-19)\n\n## What's Changed\n\n- feat: Add pricing calculation method to GPT4Brain class and update user usage in chat controller by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2210\n- fix(frontend): click on inputs by @Zewed in https://github.com/QuivrHQ/quivr/pull/2212\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.205...v0.0.206\n\n## 0.0.205 (2024-02-19)\n\n## What's Changed\n\n- Update ollama.mdx by @zangjiucheng in https://github.com/QuivrHQ/quivr/pull/2196\n- feat(integration): improve by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2199\n- fix(frontend): history to threads by @Zewed in https://github.com/QuivrHQ/quivr/pull/2201\n- feat(custom): big brain by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2198\n- feat: Update system templates with custom personality support by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2209\n\n## New Contributors\n\n- @zangjiucheng made their first contribution in https://github.com/QuivrHQ/quivr/pull/2196\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.204...v0.0.205\n\n## 0.0.203 (2024-02-15)\n\n## What's Changed\n\n- feat: 🎸 ocr by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2187\n- feat(lcel): migrated to lcel and pydantic by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2185\n- feat(frontend): new brain creation modal by @Zewed in https://github.com/QuivrHQ/quivr/pull/2192\n- feat(integration): implementation by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2191\n- feat(frontend): new design for brain table by @Zewed in https://github.com/QuivrHQ/quivr/pull/2193\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.202...v0.0.203\n\n## 0.0.202 (2024-02-11)\n\n## What's Changed\n\n- fix(frontend): change placeholder in chat bar by @Zewed in https://github.com/QuivrHQ/quivr/pull/2177\n- fix(frontend): remove notification banner by @Zewed in https://github.com/QuivrHQ/quivr/pull/2178\n- fix(frontend): remove onboarding questions by @Zewed in https://github.com/QuivrHQ/quivr/pull/2176\n- feat(frontend): new modal for add knowledge by @Zewed in https://github.com/QuivrHQ/quivr/pull/2173\n- Revert \"fix(frontend): remove onboarding questions\" by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2181\n- fix(frontend): remove onboarding question by @Zewed in https://github.com/QuivrHQ/quivr/pull/2183\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.201...v0.0.202\n\n## 0.0.201 (2024-02-10)\n\n## What's Changed\n\n- fix: 🐛 session by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2174\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.200...v0.0.201\n\n## 0.0.200 (2024-02-09)\n\n## What's Changed\n\n- fix(daily-usage): Update daily requests count in UserUsage model by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2171\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.199...v0.0.200\n\n## 0.0.199 (2024-02-08)\n\n## What's Changed\n\n- feat: 🎸 telemetry by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2169\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.198...v0.0.199\n\n## 0.0.197 (2024-02-07)\n\n## What's Changed\n\n- fix(prompts): can now be removed by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2154\n- tests: Add tests for deleting prompts by ID by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2156\n- fix(related): removed public brains by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2157\n- perf: ⚡️ signed_url by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2159\n- fix(backend): typo in word response by @untilhamza in https://github.com/QuivrHQ/quivr/pull/2158\n- fix(frontend): better UI for phone device by @Zewed in https://github.com/QuivrHQ/quivr/pull/2160\n- fix(frontend): add knwoledge from create brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2161\n- feat(chunks): now chunk size is saved in database dynamically and not just 500 by @StanGirard in https://github.com/QuivrHQ/quivr/pull/2164\n- fix(frontend): remove related brains for now by @Zewed in https://github.com/QuivrHQ/quivr/pull/2162\n- fix(frontend): can\"t choose private or public brains by @Zewed in https://github.com/QuivrHQ/quivr/pull/2163\n- feat(frontend): manage current brain by @Zewed in https://github.com/QuivrHQ/quivr/pull/2165\n- fix(frontend): upgrade my plan by @Zewed in https://github.com/QuivrHQ/quivr/pull/2167\n\n## New Contributors\n\n- @untilhamza made their first contribution in https://github.com/QuivrHQ/quivr/pull/2158\n\n**Full Changelog**: https://github.com/QuivrHQ/quivr/compare/v0.0.196...v0.0.197\n\n## 0.0.196 (2024-02-07)\n\n## What's Changed\n\n- feat(frontend): Page Header + Begin of Studio by @Zewed in https://github.com/StanGirard/quivr/pull/2151\n- fix(frontend): overflow brain item by @Zewed in https://github.com/StanGirard/quivr/pull/2153\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.195...v0.0.196\n\n## 0.0.195 (2024-02-06)\n\n## What's Changed\n\n- feat(integrations): integration with Notion in the backend by @StanGirard in https://github.com/StanGirard/quivr/pull/2123\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.194...v0.0.195\n\n## 0.0.194 (2024-02-05)\n\n## What's Changed\n\n- feat(frontend): add a chatbot for users by @Zewed in https://github.com/StanGirard/quivr/pull/2144\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.193...v0.0.194\n\n## 0.0.193 (2024-02-04)\n\n## What's Changed\n\n- feat(frontend): design changes on user profile by @Zewed in https://github.com/StanGirard/quivr/pull/2140\n- fix(frontend): rename upgrade to plus to upgrade by @Zewed in https://github.com/StanGirard/quivr/pull/2141\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.192...v0.0.193\n\n## 0.0.192 (2024-02-02)\n\n## What's Changed\n\n- feat(frontend): display which brain you are talking to by @Zewed in https://github.com/StanGirard/quivr/pull/2137\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.191...v0.0.192\n\n## 0.0.191 (2024-02-01)\n\n## What's Changed\n\n- fix(frontend): no sources repetition in data panel by @Zewed in https://github.com/StanGirard/quivr/pull/2132\n- fix(frontend): don't show copy icon when thinking by @Zewed in https://github.com/StanGirard/quivr/pull/2133\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.190...v0.0.191\n\n## 0.0.190 (2024-01-31)\n\n## What's Changed\n\n- fix(frontend): Better contrast in Menu by @Zewed in https://github.com/StanGirard/quivr/pull/2119\n- fix(frontend): better chat color and copy icon position by @Zewed in https://github.com/StanGirard/quivr/pull/2121\n- fix(frontend): better visualisation of current path on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2122\n- feat(frontend): uniformize behaviour for metadata panel by @Zewed in https://github.com/StanGirard/quivr/pull/2124\n- fix(frontend): fetch chat only if session exist by @Zewed in https://github.com/StanGirard/quivr/pull/2130\n- fix(frontend): prompt display by @Zewed in https://github.com/StanGirard/quivr/pull/2129\n- fix(frontend): upload knwoledge in brains manegement by @Zewed in https://github.com/StanGirard/quivr/pull/2131\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.189...v0.0.190\n\n## 0.0.189 (2024-01-30)\n\n## What's Changed\n\n- feat(frontend): design menu by @Zewed in https://github.com/StanGirard/quivr/pull/2116\n- fix(frontend): fix z index popover on add knwoledge modal by @Zewed in https://github.com/StanGirard/quivr/pull/2118\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.188...v0.0.189\n\n## 0.0.188 (2024-01-29)\n\n## What's Changed\n\n- fix: 🐛 upload by @StanGirard in https://github.com/StanGirard/quivr/pull/2112\n- feat(frontend): add sources to metadata by @Zewed in https://github.com/StanGirard/quivr/pull/2113\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.187...v0.0.188\n\n## 0.0.187 (2024-01-28)\n\n## What's Changed\n\n- feat: 🎸 user-limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2104\n- fix: 🐛 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2107\n- feat(frontend): chat page ui/ux design by @Zewed in https://github.com/StanGirard/quivr/pull/2106\n- Fix typo of UI: Ressources ==> Resources by @iharel in https://github.com/StanGirard/quivr/pull/2109\n- fix(frontend): fix li markdown on chat by @Zewed in https://github.com/StanGirard/quivr/pull/2110\n\n## New Contributors\n\n- @iharel made their first contribution in https://github.com/StanGirard/quivr/pull/2109\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.186...v0.0.187\n\n## 0.0.186 (2024-01-27)\n\n## What's Changed\n\n- fix(frontend): click on mention list on search bar in modal bug by @Zewed in https://github.com/StanGirard/quivr/pull/2098\n- fix(frontend): remove dark theme by @Zewed in https://github.com/StanGirard/quivr/pull/2100\n- fix(frontend): delete brain by @Zewed in https://github.com/StanGirard/quivr/pull/2101\n- feat(14k): done by @StanGirard in https://github.com/StanGirard/quivr/pull/2102\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.185...v0.0.186\n\n## 0.0.185 (2024-01-27)\n\n## What's Changed\n\n- fix: 🐛 brain by @StanGirard in https://github.com/StanGirard/quivr/pull/2096\n- feat(frontend): search modal - remove parameters and explore buttons by @Zewed in https://github.com/StanGirard/quivr/pull/2094\n- fix: 🐛 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/2095\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.184...v0.0.185\n\n## 0.0.184 (2024-01-26)\n\n## What's Changed\n\n- feat(panel): added by @Zewed in https://github.com/StanGirard/quivr/pull/2088\n- feat: 🎸 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2078\n- fix(frontend): clear message input on submit by @Zewed in https://github.com/StanGirard/quivr/pull/2087\n- fix: 🐛 related by @StanGirard in https://github.com/StanGirard/quivr/pull/2090\n- feat: Added translation status badge from inlang by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/2080\n- fix(streaming): Data Truncation Issue in useHandleStream Function by @openperf in https://github.com/StanGirard/quivr/pull/2079\n- feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/2092\n- fix(frontend): clean related Brains useEffect by @Zewed in https://github.com/StanGirard/quivr/pull/2091\n\n## New Contributors\n\n- @openperf made their first contribution in https://github.com/StanGirard/quivr/pull/2079\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.183...v0.0.184\n\n## 0.0.183 (2024-01-24)\n\n## What's Changed\n\n- fix: 🐛 subscription by @StanGirard in https://github.com/StanGirard/quivr/pull/2081\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.182...v0.0.183\n\n## 0.0.182 (2024-01-24)\n\n## What's Changed\n\n- fix: 🐛 crawl by @StanGirard in https://github.com/StanGirard/quivr/pull/2076\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.181...v0.0.182\n\n## 0.0.181 (2024-01-23)\n\n## What's Changed\n\n- fix(frontend): unable multiple enter on search page by @Zewed in https://github.com/StanGirard/quivr/pull/2074\n- fix(frontend): force brain on search was broken by @Zewed in https://github.com/StanGirard/quivr/pull/2075\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.180...v0.0.181\n\n## 0.0.180 (2024-01-23)\n\n## What's Changed\n\n- fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/2068\n- feat(frontend): Add Brain On Search Page by @Zewed in https://github.com/StanGirard/quivr/pull/2067\n- fix(frontend): uniformize case for types by @Zewed in https://github.com/StanGirard/quivr/pull/2071\n- fix: 🐛 gitconfig by @StanGirard in https://github.com/StanGirard/quivr/pull/2072\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.179...v0.0.180\n\n## 0.0.179 (2024-01-22)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.178...v0.0.179\n\n## 0.0.178 (2024-01-22)\n\n## What's Changed\n\n- fix(frontend): use mention brain on search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2060\n- feat: 🎸 cpu by @StanGirard in https://github.com/StanGirard/quivr/pull/2065\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.177...v0.0.178\n\n## 0.0.177 (2024-01-22)\n\n## What's Changed\n\n- fix: 🐛 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2062\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.176...v0.0.177\n\n## 0.0.176 (2024-01-22)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.175...v0.0.176\n\n## 0.0.175 (2024-01-22)\n\n## What's Changed\n\n- fix: 🐛 limits by @StanGirard in https://github.com/StanGirard/quivr/pull/2058\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.174...v0.0.175\n\n## 0.0.174 (2024-01-22)\n\n## What's Changed\n\n- fix(frontend): remove actions modal by @Zewed in https://github.com/StanGirard/quivr/pull/2054\n- feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/2057\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.173...v0.0.174\n\n## 0.0.173 (2024-01-22)\n\n## What's Changed\n\n- fix(api-brains): fixed with new types of brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2052\n- fix(frontend): font size on chat feed by @Zewed in https://github.com/StanGirard/quivr/pull/2051\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.172...v0.0.173\n\n## 0.0.172 (2024-01-22)\n\n## What's Changed\n\n- feat(frontend): handle mentions in search bar by @Zewed in https://github.com/StanGirard/quivr/pull/2049\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.171...v0.0.172\n\n## 0.0.171 (2024-01-22)\n\n## What's Changed\n\n- fix(frontend): don't set default brain as current brain and remove change brain button by @Zewed in https://github.com/StanGirard/quivr/pull/2047\n- feat: 🎸 brains by @StanGirard in https://github.com/StanGirard/quivr/pull/2048\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.170...v0.0.171\n\n## 0.0.170 (2024-01-21)\n\n## What's Changed\n\n- fix(frontend): translate configure for brains and successfully deleted for chat by @Zewed in https://github.com/StanGirard/quivr/pull/2042\n- fix(frontend): change search icon on menu by @Zewed in https://github.com/StanGirard/quivr/pull/2043\n- fix: 🐛 search by @StanGirard in https://github.com/StanGirard/quivr/pull/2045\n- fix(frontend): remove brain choice when search page displays by @Zewed in https://github.com/StanGirard/quivr/pull/2044\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.169...v0.0.170\n\n## 0.0.169 (2024-01-21)\n\n## What's Changed\n\n- feat(brains): added now multiple brains close by by @StanGirard in https://github.com/StanGirard/quivr/pull/2039\n- fix(frontend): set chat messages only if needed by @Zewed in https://github.com/StanGirard/quivr/pull/2040\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.168...v0.0.169\n\n## 0.0.168 (2024-01-20)\n\n## What's Changed\n\n- fix(frontend): don t load chat items on search by @Zewed in https://github.com/StanGirard/quivr/pull/2036\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.167...v0.0.168\n\n## 0.0.167 (2024-01-20)\n\n## What's Changed\n\n- fix(frontend): chat still refreshs on first request by @Zewed in https://github.com/StanGirard/quivr/pull/2034\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.166...v0.0.167\n\n## 0.0.166 (2024-01-20)\n\n## What's Changed\n\n- feat(search): new way to interact with Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/2026\n- feat: adding search by @StanGirard in https://github.com/StanGirard/quivr/pull/2031\n- fix(frontend): remove close menu icon on mobile by @Zewed in https://github.com/StanGirard/quivr/pull/2030\n- fix(frontend): chat refreshed on first search request by @Zewed in https://github.com/StanGirard/quivr/pull/2033\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.165...v0.0.166\n\n## 0.0.165 (2024-01-17)\n\n## What's Changed\n\n- fix(frontend): wrong placeholder message date by @Zewed in https://github.com/StanGirard/quivr/pull/2023\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.164...v0.0.165\n\n## 0.0.164 (2024-01-14)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.163...v0.0.164\n\n## 0.0.163 (2024-01-14)\n\n## What's Changed\n\n- fix(frontend): left panel is not closing by @Zewed in https://github.com/StanGirard/quivr/pull/2014\n- fix: csp by @StanGirard in https://github.com/StanGirard/quivr/pull/2016\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.162...v0.0.163\n\n## 0.0.162 (2024-01-13)\n\n## What's Changed\n\n- fix(frontend): remove right panel and reduce chat section width by @Zewed in https://github.com/StanGirard/quivr/pull/2012\n\n## New Contributors\n\n- @Zewed made their first contribution in https://github.com/StanGirard/quivr/pull/2012\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.161...v0.0.162\n\n## 0.0.161 (2024-01-07)\n\n## What's Changed\n\n- feat: 🎸 policies by @StanGirard in https://github.com/StanGirard/quivr/pull/1997\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.160...v0.0.161\n\n## 0.0.160 (2024-01-04)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.159...v0.0.160\n\n## 0.0.159 (2024-01-04)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.158...v0.0.159\n\n## 0.0.158 (2024-01-04)\n\n## What's Changed\n\n- chore(deps): pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1975\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.157...v0.0.158\n\n## 0.0.157 (2024-01-04)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1978\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.156...v0.0.157\n\n## 0.0.156 (2024-01-04)\n\n## What's Changed\n\n- fix: 🐛 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1973\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.155...v0.0.156\n\n## 0.0.155 (2024-01-04)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.154...v0.0.155\n\n## 0.0.154 (2024-01-04)\n\n## What's Changed\n\n- feat: 🎸 models by @StanGirard in https://github.com/StanGirard/quivr/pull/1967\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.153...v0.0.154\n\n## 0.0.153 (2024-01-03)\n\n## What's Changed\n\n- chore(deps): Pin Node.js by @renovate in https://github.com/StanGirard/quivr/pull/1952\n- chore(deps): Pin dependencies by @renovate in https://github.com/StanGirard/quivr/pull/1953\n- chore(deps): Update actions/checkout action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1957\n- chore(deps): Update actions/setup-node action to v4 by @renovate in https://github.com/StanGirard/quivr/pull/1958\n- feat: 🎸 usage by @StanGirard in https://github.com/StanGirard/quivr/pull/1966\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.152...v0.0.153\n\n## 0.0.152 (2024-01-02)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1945\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.151...v0.0.152\n\n## 0.0.151 (2023-12-29)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1938\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.150...v0.0.151\n\n## 0.0.150 (2023-12-29)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1936\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.149...v0.0.150\n\n## 0.0.149 (2023-12-29)\n\n## What's Changed\n\n- feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1935\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.148...v0.0.149\n\n## 0.0.148 (2023-12-28)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.147...v0.0.148\n\n## 0.0.147 (2023-12-28)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1931\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.146...v0.0.147\n\n## 0.0.146 (2023-12-28)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1929\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.145...v0.0.146\n\n## 0.0.145 (2023-12-28)\n\n## What's Changed\n\n- feat: 🎸 posthog by @StanGirard in https://github.com/StanGirard/quivr/pull/1927\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.144...v0.0.145\n\n## 0.0.144 (2023-12-27)\n\n## What's Changed\n\n- feat: 🎸 pricing by @StanGirard in https://github.com/StanGirard/quivr/pull/1923\n- feat(pricing): added testimonials and else by @StanGirard in https://github.com/StanGirard/quivr/pull/1925\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.143...v0.0.144\n\n## 0.0.143 (2023-12-27)\n\n## What's Changed\n\n- docs: ✏️ mintlify by @StanGirard in https://github.com/StanGirard/quivr/pull/1917\n- feat(docs): added homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1919\n- docs: ✏️ homepage by @StanGirard in https://github.com/StanGirard/quivr/pull/1922\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.142...v0.0.143\n\n## 0.0.142 (2023-12-18)\n\n## What's Changed\n\n- feat: add new brain management page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1906\n- feat: update brain details page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1910\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.141...v0.0.142\n\n## 0.0.141 (2023-12-15)\n\n## What's Changed\n\n- feat[i18n]: Added i18n documenation to the contribution guidelines by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1899\n- feat: Update Explore button label by @StanGirard in https://github.com/StanGirard/quivr/pull/1901\n- feat: chat with compositeBrain ( with/out streaming) by @gozineb in https://github.com/StanGirard/quivr/pull/1883\n- feat: update brains library by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1903\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.140...v0.0.141\n\n## 0.0.140 (2023-12-14)\n\n## What's Changed\n\n- feat: Update pytest command in Makefile and add new test by @StanGirard in https://github.com/StanGirard/quivr/pull/1893\n- chore: add IDE extension for i18n handling by @NilsJacobsen in https://github.com/StanGirard/quivr/pull/1896\n- feat: add chat view new design by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1897\n\n## New Contributors\n\n- @NilsJacobsen made their first contribution in https://github.com/StanGirard/quivr/pull/1896\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.139...v0.0.140\n\n## 0.0.139 (2023-12-14)\n\n## What's Changed\n\n- feat: allow user to feed brain from Actions bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1882\n- feat: add Menu bar by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1885\n- feat: Remove unused method and update file processing by @StanGirard in https://github.com/StanGirard/quivr/pull/1890\n- fix: update chat history fetching logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1891\n- feat: add default feed button label by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1892\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.138...v0.0.139\n\n## 0.0.138 (2023-12-13)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.137...v0.0.138\n\n## 0.0.137 (2023-12-13)\n\n## What's Changed\n\n- feat: add chat history to Actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1877\n- feat: allow user to control left panel from Chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1880\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.136...v0.0.137\n\n## 0.0.136 (2023-12-13)\n\n## What's Changed\n\n- feat: Add @tailwindcss/forms plugin and update by @StanGirard in https://github.com/StanGirard/quivr/pull/1869\n- feat: Refactor get_question_context_for_brain endpoint by @StanGirard in https://github.com/StanGirard/quivr/pull/1872\n- feat: Add file URL to DocumentAnswer objects by @StanGirard in https://github.com/StanGirard/quivr/pull/1874\n- Update .gitignore and add .gitmodules by @StanGirard in https://github.com/StanGirard/quivr/pull/1875\n- feat: add new actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1870\n- feat: add selected brain tag and new discussion button to actions modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1873\n- feat: add action modal change brain button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1876\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.135...v0.0.136\n\n## 0.0.135 (2023-12-11)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.134...v0.0.135\n\n## 0.0.134 (2023-12-11)\n\n## What's Changed\n\n- feat: add custom rag first abstraction layer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1858\n- feat(payment): added modal of right size by @StanGirard in https://github.com/StanGirard/quivr/pull/1860\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.133...v0.0.134\n\n## 0.0.133 (2023-12-11)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.132...v0.0.133\n\n## 0.0.132 (2023-12-10)\n\n## What's Changed\n\n- feat: add generate_answer function to support non streamed response for api brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1847\n- fix(ollama): - update supabase-db postgres docker image version by @KonstantinosAng in https://github.com/StanGirard/quivr/pull/1853\n\n## New Contributors\n\n- @KonstantinosAng made their first contribution in https://github.com/StanGirard/quivr/pull/1853\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.131...v0.0.132\n\n## 0.0.131 (2023-12-06)\n\n## What's Changed\n\n- feat: update onboarding questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1834\n- feat: composite brains get by @gozineb in https://github.com/StanGirard/quivr/pull/1837\n- feat: add Agent creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1836\n- feat: keep sidebar opened on non mobile devices by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1840\n- feat: add brains list overflow indicator by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1842\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.130...v0.0.131\n\n## 0.0.130 (2023-12-06)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.129...v0.0.130\n\n## 0.0.129 (2023-12-06)\n\n## What's Changed\n\n- feat(requirements): update aws version by @StanGirard in https://github.com/StanGirard/quivr/pull/1819\n- feat: add brain creation step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1823\n- feat: composite brains db by @gozineb in https://github.com/StanGirard/quivr/pull/1826\n- feat: finalise steps based brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1825\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.128...v0.0.129\n\n## 0.0.128 (2023-12-05)\n\n## What's Changed\n\n- feat: track response source usage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1810\n- doc: add VirtioFS instruction for MacOS users by @tarek-ayed in https://github.com/StanGirard/quivr/pull/1813\n- refactor: chat for multibrains by @gozineb in https://github.com/StanGirard/quivr/pull/1812\n- feat(prebuilt): prebuild backend image for faster compilation by @StanGirard in https://github.com/StanGirard/quivr/pull/1815\n- fix: text not clear in dark mode by @Jezla in https://github.com/StanGirard/quivr/pull/1804\n- fix: celery config typo by @yonmey in https://github.com/StanGirard/quivr/pull/1776\n- feat: add brain creation steps system by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1814\n\n## New Contributors\n\n- @tarek-ayed made their first contribution in https://github.com/StanGirard/quivr/pull/1813\n- @Jezla made their first contribution in https://github.com/StanGirard/quivr/pull/1804\n- @yonmey made their first contribution in https://github.com/StanGirard/quivr/pull/1776\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.127...v0.0.128\n\n## 0.0.127 (2023-12-04)\n\n## What's Changed\n\n- feat(api-keys): added customization by @StanGirard in https://github.com/StanGirard/quivr/pull/1802\n- feat(embedding): now 100 times faster ⚡️🔥 by @StanGirard in https://github.com/StanGirard/quivr/pull/1807\n- fix: update editor state update logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1809\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.126...v0.0.127\n\n## 0.0.126 (2023-12-03)\n\n## What's Changed\n\n- feat: add optimistic update on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1764\n- feat: update models logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1767\n- refactor: to modules by @gozineb in https://github.com/StanGirard/quivr/pull/1754\n- feat(supabase): local installation made easy by @StanGirard in https://github.com/StanGirard/quivr/pull/1777\n- feat(install): it now takes 30 seconds to install Quivr by @StanGirard in https://github.com/StanGirard/quivr/pull/1780\n- feat: 🎸 install by @StanGirard in https://github.com/StanGirard/quivr/pull/1784\n- fix(url): crawling fixed by @StanGirard in https://github.com/StanGirard/quivr/pull/1785\n- docs: fix typo in name of docker compose dev file by @iMADi-ARCH in https://github.com/StanGirard/quivr/pull/1800\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.125...v0.0.126\n\n## 0.0.125 (2023-11-30)\n\n## What's Changed\n\n- fix(api): fixed issue with name function and ilmproved promtp by @StanGirard in https://github.com/StanGirard/quivr/pull/1759\n- fix: update mention suggestion filtering logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1763\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.124...v0.0.125\n\n## 0.0.124 (2023-11-29)\n\n## What's Changed\n\n- feat(chatInput): use tiptap editor by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1752\n- docs: update guidelines.md by @eltociear in https://github.com/StanGirard/quivr/pull/1755\n- Feat/local llm bug fix by @StanGirard in https://github.com/StanGirard/quivr/pull/1758\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.123...v0.0.124\n\n## 0.0.123 (2023-11-29)\n\n## What's Changed\n\n- chore: downgrade versions by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1748\n- fix: revert implement local llms by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1749\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.122...v0.0.123\n\n## 0.0.122 (2023-11-29)\n\n## What's Changed\n\n- refactor: Notification module by @gozineb in https://github.com/StanGirard/quivr/pull/1740\n- refactor: remove explore route from back & front by @gozineb in https://github.com/StanGirard/quivr/pull/1741\n- feat: implement local llms by @StanGirard in https://github.com/StanGirard/quivr/pull/1745\n- refactor: knowledge module by @gozineb in https://github.com/StanGirard/quivr/pull/1743\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.121...v0.0.122\n\n## 0.0.121 (2023-11-28)\n\n## What's Changed\n\n- fix: update max token logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1725\n- fix: update public brain subscription logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1727\n- fix: sanitize file name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1728\n- feat(publicBrains): use join queries for better performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1730\n- feat: improve delete knowledge performance by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1733\n- fix: 🐛 crawler by @StanGirard in https://github.com/StanGirard/quivr/pull/1735\n- feat: 🎸 local user by @StanGirard in https://github.com/StanGirard/quivr/pull/1736\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.120...v0.0.121\n\n## 0.0.120 (2023-11-27)\n\n## What's Changed\n\n- fix: 🐛 sentry by @StanGirard in https://github.com/StanGirard/quivr/pull/1716\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.119...v0.0.120\n\n## 0.0.119 (2023-11-24)\n\n## What's Changed\n\n- refactor: Prompt module by @gozineb in https://github.com/StanGirard/quivr/pull/1688\n- Fixes string formatting when logging knowledge table by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1691\n- fix: update max token overwrite logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1694\n- fix: remove diacritics from filenames by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1695\n- refactor: onboarding module by @gozineb in https://github.com/StanGirard/quivr/pull/1702\n- feat: display notification when file size is too big by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1704\n- feat: add api brain steps log (backend) by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1705\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.118...v0.0.119\n\n## 0.0.118 (2023-11-22)\n\n## What's Changed\n\n- docs: add api based brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1685\n- Adds pytesseract, tesseract and poopler-utils by @MeTaNoV in https://github.com/StanGirard/quivr/pull/1648\n\n## New Contributors\n\n- @MeTaNoV made their first contribution in https://github.com/StanGirard/quivr/pull/1648\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.117...v0.0.118\n\n## 0.0.117 (2023-11-22)\n\n## What's Changed\n\n- fix: 🐛 api by @StanGirard in https://github.com/StanGirard/quivr/pull/1676\n- fix: persist api brain creation data on tab change by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1680\n- feat: 🎸 tokens by @StanGirard in https://github.com/StanGirard/quivr/pull/1678\n- feat: allow updating api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1682\n- feat: make brain description required by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1684\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.116...v0.0.117\n\n## 0.0.116 (2023-11-21)\n\n## What's Changed\n\n- feat: update brain modal in chat input by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1668\n- feat(apiBrain): add api brain secrets field in knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1669\n- feat(apiBrain): improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1672\n- feat(feedBrain): add manage button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1674\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.115...v0.0.116\n\n## 0.0.115 (2023-11-20)\n\n## What's Changed\n\n- fix(apiBrain): fix default type selection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1642\n- fix: allow user to set a brain as public after creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1646\n- fix(brainManagement): fix shared brain access issue by @gozineb in https://github.com/StanGirard/quivr/pull/1641\n- feat: 🎸 docker reduced size by 2 by @StanGirard in https://github.com/StanGirard/quivr/pull/1653\n- feat: 🎸 docker by @StanGirard in https://github.com/StanGirard/quivr/pull/1656\n- feat: 🎸 marketplace by @StanGirard in https://github.com/StanGirard/quivr/pull/1657\n- feat: 🎸 openai by @StanGirard in https://github.com/StanGirard/quivr/pull/1658\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.114...v0.0.115\n\n## 0.0.114 (2023-11-16)\n\n## What's Changed\n\n- feat: add api brain creation frontend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1631\n- refactor: add modules folder by @gozineb in https://github.com/StanGirard/quivr/pull/1633\n- feat: update settings tab add api brain definition by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1635\n- feat: add public api brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1636\n- fix: delete brain on users click in brains management by @gozineb in https://github.com/StanGirard/quivr/pull/1638\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.113...v0.0.114\n\n## 0.0.113 (2023-11-14)\n\n## What's Changed\n\n- refactor: packages folder be 2 by @gozineb in https://github.com/StanGirard/quivr/pull/1628\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.112...v0.0.113\n\n## 0.0.112 (2023-11-14)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.111...v0.0.112\n\n## 0.0.111 (2023-11-14)\n\n## What's Changed\n\n- ci: 🎡 tests by @StanGirard in https://github.com/StanGirard/quivr/pull/1615\n- fix: update delete brain logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1619\n- test(added): misc prompt onboarding by @StanGirard in https://github.com/StanGirard/quivr/pull/1622\n- feat: remove api brain secrets and schemas on delete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1621\n- test(all): added by @StanGirard in https://github.com/StanGirard/quivr/pull/1624\n- refactor: create \"files\" package by @gozineb in https://github.com/StanGirard/quivr/pull/1626\n- feat: api definition in brain creation modal by @gozineb in https://github.com/StanGirard/quivr/pull/1613\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.110...v0.0.111\n\n## 0.0.110 (2023-11-13)\n\n## What's Changed\n\n- fix: add user id while creating default brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1616\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.109...v0.0.110\n\n## 0.0.109 (2023-11-13)\n\n## What's Changed\n\n- feat: add APIBrainQA by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1606\n- feat: allow users to chat with apis by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1612\n- feat(docker): use multi-stage Docker builds for smaller images by @shidenkai0 in https://github.com/StanGirard/quivr/pull/1614\n\n## New Contributors\n\n- @shidenkai0 made their first contribution in https://github.com/StanGirard/quivr/pull/1614\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.108...v0.0.109\n\n## 0.0.108 (2023-11-07)\n\n## What's Changed\n\n- feat: add api_brain_definition table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1601\n- feat: add brain_type column to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1603\n- feat: supabase vault by @gozineb in https://github.com/StanGirard/quivr/pull/1605\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.107...v0.0.108\n\n## 0.0.107 (2023-11-06)\n\n## What's Changed\n\n- fix: allow to change model bro brain settings tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1590\n- fix: fix notification banner display when too much items in chat list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1593\n- docs: add auth modes config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1595\n- fix: allow users to delete brains by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1596\n- feat: 🎸 source documents by @StanGirard in https://github.com/StanGirard/quivr/pull/1598\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.106...v0.0.107\n\n## 0.0.106 (2023-11-06)\n\n## What's Changed\n\n- feat: 🎸 sources by @StanGirard in https://github.com/StanGirard/quivr/pull/1591\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.105...v0.0.106\n\n## 0.0.105 (2023-11-06)\n\n## What's Changed\n\n- feat: make auth mode configurable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1579\n- Fix #1290 issue running migrations by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1585\n- Use 'unless-stopped' instead of 'always' for development by @charlesbrandt in https://github.com/StanGirard/quivr/pull/1586\n- feat: 🎸 vps by @StanGirard in https://github.com/StanGirard/quivr/pull/1587\n- Update vps_install.md for subdomain by @jbeltran73-2 in https://github.com/StanGirard/quivr/pull/1589\n\n## New Contributors\n\n- @charlesbrandt made their first contribution in https://github.com/StanGirard/quivr/pull/1585\n- @jbeltran73-2 made their first contribution in https://github.com/StanGirard/quivr/pull/1589\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.104...v0.0.105\n\n## 0.0.104 (2023-11-03)\n\n## What's Changed\n\n- feat: 🎸 docs by @StanGirard in https://github.com/StanGirard/quivr/pull/1561\n- style(prompts): update public prompts dropdown styling by @St-Bloom in https://github.com/StanGirard/quivr/pull/1563\n- feat: add remote notification config by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1547\n- fix: fix button bad children error by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1564\n- style: fix hidden contents by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1577\n\n## New Contributors\n\n- @St-Bloom made their first contribution in https://github.com/StanGirard/quivr/pull/1563\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.103...v0.0.104\n\n## 0.0.103 (2023-11-02)\n\n## What's Changed\n\n- feat: allow to share a public brain link by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1541\n- fix: prompt update in brains management settings tab by @gozineb in https://github.com/StanGirard/quivr/pull/1543\n- refactor: extract prompt from settings by @gozineb in https://github.com/StanGirard/quivr/pull/1546\n- feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1555\n- feat: 🎸 telegram by @StanGirard in https://github.com/StanGirard/quivr/pull/1559\n- docs: update run_fully_local.md by @eltociear in https://github.com/StanGirard/quivr/pull/1556\n- docs: grammatical errors in README.md by @HimanshuMahto in https://github.com/StanGirard/quivr/pull/1536\n- fix: missing or inaccurate zh-cn translations by @jerryshang in https://github.com/StanGirard/quivr/pull/1558\n\n## New Contributors\n\n- @HimanshuMahto made their first contribution in https://github.com/StanGirard/quivr/pull/1536\n- @jerryshang made their first contribution in https://github.com/StanGirard/quivr/pull/1558\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.102...v0.0.103\n\n## 0.0.102 (2023-11-01)\n\n## What's Changed\n\n- docs: update Quivr doc by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1531\n- docs: ✏️ search by @StanGirard in https://github.com/StanGirard/quivr/pull/1535\n- feat(brainSettings): rework knowledge tab by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1534\n- docs: ✏️ schema by @StanGirard in https://github.com/StanGirard/quivr/pull/1537\n- feat: 🎸 max-token by @StanGirard in https://github.com/StanGirard/quivr/pull/1538\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.101...v0.0.102\n\n## 0.0.101 (2023-10-31)\n\n## What's Changed\n\n- chore: update tanstack query dep by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1528\n- fix: update mutation pending flag by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1530\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.100...v0.0.101\n\n## 0.0.100 (2023-10-30)\n\n## What's Changed\n\n- refactor: fix bad smells by @gozineb in https://github.com/StanGirard/quivr/pull/1399\n- refactor: chat_routes by @gozineb in https://github.com/StanGirard/quivr/pull/1512\n- feat: improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1522\n- feat(docs): reworked the website by @StanGirard in https://github.com/StanGirard/quivr/pull/1523\n- Feat/docs rework by @StanGirard in https://github.com/StanGirard/quivr/pull/1525\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.99...v0.0.100\n\n## 0.0.99 (2023-10-27)\n\n## What's Changed\n\n- fix: minor fixes by @gozineb in https://github.com/StanGirard/quivr/pull/1499\n- feat: remove onboarding's feature flag by @matthieujacq in https://github.com/StanGirard/quivr/pull/1501\n- feat: update form content on magic link auth request by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1502\n- feat: remove legacy header and footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1509\n- fix: black horizontal line sometimes appearing below section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1510\n- Improve readme.md by @ankur0904 in https://github.com/StanGirard/quivr/pull/1511\n- refactor(settings tab): extract components by @gozineb in https://github.com/StanGirard/quivr/pull/1335\n- fix: hidden video playing automatically on iphone by @matthieujacq in https://github.com/StanGirard/quivr/pull/1514\n\n## New Contributors\n\n- @ankur0904 made their first contribution in https://github.com/StanGirard/quivr/pull/1511\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.98...v0.0.99\n\n## 0.0.98 (2023-10-26)\n\n## What's Changed\n\n- feat: upgrade button in user settings by @matthieujacq in https://github.com/StanGirard/quivr/pull/1484\n- fix: failing build (removed avatar alt prop) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1487\n- Fixed license link in intro.md by @Eric013 in https://github.com/StanGirard/quivr/pull/1486\n- feat: manage plan by @matthieujacq in https://github.com/StanGirard/quivr/pull/1488\n- feat: remove feature flags for homepage by @matthieujacq in https://github.com/StanGirard/quivr/pull/1493\n- feat: add new signin/login page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1492\n\n## New Contributors\n\n- @Eric013 made their first contribution in https://github.com/StanGirard/quivr/pull/1486\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.97...v0.0.98\n\n## 0.0.97 (2023-10-24)\n\n## What's Changed\n\n- feat(cms): update content type by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1477\n- feat: upgrade to plus button by @matthieujacq in https://github.com/StanGirard/quivr/pull/1482\n- feat: 🎸 sitemap by @StanGirard in https://github.com/StanGirard/quivr/pull/1483\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.96...v0.0.97\n\n## 0.0.96 (2023-10-24)\n\n## What's Changed\n\n- feat: validate email and required question with react-hook-form by @matthieujacq in https://github.com/StanGirard/quivr/pull/1463\n- feat: fetch security questions from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1464\n- feat: POST on /contact to contact quivr team by email by @matthieujacq in https://github.com/StanGirard/quivr/pull/1466\n- feat: setup premium feature backend by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1467\n- feat: add sponsor and blog links by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1472\n- feat: contact sales submission by @matthieujacq in https://github.com/StanGirard/quivr/pull/1473\n- feat(homepage): add analytics by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1474\n- fix: make use cases clickable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1475\n- fix: update blog link position by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1476\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.95...v0.0.96\n\n## 0.0.95 (2023-10-23)\n\n## What's Changed\n\n- feat: homepage first section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1439\n- fix: show a flat gradient in the UseCase section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1440\n- style: update testimonials display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1441\n- feat: fetch homepage data from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1452\n- feat: contact sales page (front layout) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1451\n- Fix: Improved Text Visibility in Dark Mode in OnboardingQuestion Component by @Dev-Dz27 in https://github.com/StanGirard/quivr/pull/1456\n- feat(cms): added single video demo by @StanGirard in https://github.com/StanGirard/quivr/pull/1459\n- feat: fetch demo video from CMS by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1461\n- feat: Contact form component by @matthieujacq in https://github.com/StanGirard/quivr/pull/1453\n\n## New Contributors\n\n- @Dev-Dz27 made their first contribution in https://github.com/StanGirard/quivr/pull/1456\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.94...v0.0.95\n\n## 0.0.94 (2023-10-19)\n\n## What's Changed\n\n- feat: Homepage demo section by @matthieujacq in https://github.com/StanGirard/quivr/pull/1420\n- feat: add security section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1423\n- feat: HomePage new footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1425\n- feat: add testimonials section by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1427\n- refactor(backend): cleaning dead and unused code by @StanGirard in https://github.com/StanGirard/quivr/pull/1432\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.93...v0.0.94\n\n## 0.0.93 (2023-10-17)\n\n## What's Changed\n\n- feat: add use cases to homepage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1415\n- feat: Homepage screen 1 content by @matthieujacq in https://github.com/StanGirard/quivr/pull/1414\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.92...v0.0.93\n\n## 0.0.92 (2023-10-17)\n\n## What's Changed\n\n- feat: add a cron to remove onboarding more than 7 days by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1397\n- feat: 🖼️ new homepage background by @matthieujacq in https://github.com/StanGirard/quivr/pull/1395\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.91...v0.0.92\n\n## 0.0.91 (2023-10-12)\n\n## What's Changed\n\n- feat: track onboarding events by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1388\n- fix(user identity): User identity dict has no attribute user_id and open_api_key by @HamzaKhalidDhillon in https://github.com/StanGirard/quivr/pull/1351\n- feat: new homepage header by @matthieujacq in https://github.com/StanGirard/quivr/pull/1382\n- feat(onboarding): add suggested questions answer by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1390\n\n## New Contributors\n\n- @HamzaKhalidDhillon made their first contribution in https://github.com/StanGirard/quivr/pull/1351\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.90...v0.0.91\n\n## 0.0.90 (2023-10-11)\n\n## What's Changed\n\n- feat: add Welcome chat by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1365\n- feat: handle suggestion click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1368\n- refactor: Enable linting on login+signup page and hooks by @matthieujacq in https://github.com/StanGirard/quivr/pull/1369\n- feat: finish onboarding step on first upload or crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1373\n- feat: add create_user_onboarding_function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1383\n- feat: remove user onboarding on complete by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1387\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.89...v0.0.90\n\n## 0.0.89 (2023-10-09)\n\n## What's Changed\n\n- feat: enable CSP in all environments (local/preview/prod) by @matthieujacq in https://github.com/StanGirard/quivr/pull/1334\n- feat: enhance user page UI by @nguernse in https://github.com/StanGirard/quivr/pull/1319\n- feat: update onboarding steps by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1337\n- feat: add onboarding_a column to onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1340\n- fix(question): fixed with user_settings by @StanGirard in https://github.com/StanGirard/quivr/pull/1349\n- FIX tables.sql - missing ; breaks SQL queries. by @stanrb in https://github.com/StanGirard/quivr/pull/1348\n- feat: ⚙️🐞 configure debugger for the backend by @matthieujacq in https://github.com/StanGirard/quivr/pull/1345\n- test: add chat e2e tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1344\n- feat: configure CSP for self-hosting and multiple ports in dev mode by @matthieujacq in https://github.com/StanGirard/quivr/pull/1364\n\n## New Contributors\n\n- @stanrb made their first contribution in https://github.com/StanGirard/quivr/pull/1348\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.88...v0.0.89\n\n## 0.0.88 (2023-10-05)\n\n## What's Changed\n\n- fix: wrap parsing with try catch statements by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1321\n- fix: 🐛 ↕️ 📱height now matches mobile height by @matthieujacq in https://github.com/StanGirard/quivr/pull/1323\n- feat: add onboarding step 3 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1324\n- feat: restructure the sidebar of the brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1325\n- feat: add onboarding table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1327\n- feat: update onboarding controller and fix typo by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1333\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.87...v0.0.88\n\n## 0.0.87 (2023-10-03)\n\n## What's Changed\n\n- feat: ↕️ maximize brains management page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1308\n- refactor: ♻️ ContentSecurityPolicy as an object by @matthieujacq in https://github.com/StanGirard/quivr/pull/1312\n- fix: replace next/image's layout deprecated attribute by @matthieujacq in https://github.com/StanGirard/quivr/pull/1313\n- fix: remove undesired outlines around divs by @matthieujacq in https://github.com/StanGirard/quivr/pull/1316\n- feat(onboarding): add step 2 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1314\n- feat(onboarding): add questions suggestions layout by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1318\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.86...v0.0.87\n\n## 0.0.86 (2023-10-03)\n\n## What's Changed\n\n- fix(script): added percent before list of emails by @StanGirard in https://github.com/StanGirard/quivr/pull/1284\n- feat: improve app ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1281\n- test: add e2e for crawling by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1288\n- feat(user_settings): increased by @StanGirard in https://github.com/StanGirard/quivr/pull/1291\n- fix: prevent fetch when user is not logged in by @nguernse in https://github.com/StanGirard/quivr/pull/1293\n- fix(Select): fix JSX typo by @nguernse in https://github.com/StanGirard/quivr/pull/1292\n- feat: ✨ responsive sidebar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1279\n- fix: 🐛 Sidebar content should not hide the sidebar footer by @matthieujacq in https://github.com/StanGirard/quivr/pull/1298\n- feat: allow users to turn private brain to public by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1300\n- feat: add onboarding first step by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1303\n- feat: update chat list on new chat first message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1305\n- feat: ↕️ Maximise chat window by @matthieujacq in https://github.com/StanGirard/quivr/pull/1301\n\n## New Contributors\n\n- @nguernse made their first contribution in https://github.com/StanGirard/quivr/pull/1293\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.85...v0.0.86\n\n## 0.0.84 (2023-09-28)\n\n## What's Changed\n\n- feat: 👤 Implement gravatar by @matthieujacq in https://github.com/StanGirard/quivr/pull/1268\n- feat: improve knowledge feed process ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1274\n- fix: 🔒️ add gravatar.com to the content security policy by @matthieujacq in https://github.com/StanGirard/quivr/pull/1273\n- feat(chatPage): update ui add new feed component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1275\n- feat: knowledge tab add button by @gozineb in https://github.com/StanGirard/quivr/pull/1277\n- fix(brains): get brains on local by @B0rrA in https://github.com/StanGirard/quivr/pull/1272\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.83...v0.0.84\n\n## 0.0.83 (2023-09-27)\n\n## What's Changed\n\n- feat(nav): 🚚 Move Brain and User buttons to the sidebar in the chat by @matthieujacq in https://github.com/StanGirard/quivr/pull/1262\n- feat: save last chat config and make it default one by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1266\n- style: improve upload ux by @Rahil2507 in https://github.com/StanGirard/quivr/pull/1259\n- fix(docs): add prerequisites section in step 2 by @JvSdv in https://github.com/StanGirard/quivr/pull/1149\n- style: improve ui by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1263\n\n## New Contributors\n\n- @Rahil2507 made their first contribution in https://github.com/StanGirard/quivr/pull/1259\n- @JvSdv made their first contribution in https://github.com/StanGirard/quivr/pull/1149\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.82...v0.0.83\n\n## 0.0.82 (2023-09-26)\n\n## What's Changed\n\n- fix(RBAC): skip validation for unplug by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1264\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.81...v0.0.82\n\n## 0.0.81 (2023-09-26)\n\n## What's Changed\n\n- feat: activate public brain subscription by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1241\n- feat(publicBrain): disable subscribe button when already subscribed and refetch brains list by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1246\n- feat: knowledge tab list by @gozineb in https://github.com/StanGirard/quivr/pull/1222\n- fix(preview): fixed a few bugs unchecked by @StanGirard in https://github.com/StanGirard/quivr/pull/1247\n- feat: add last_update field to brain table by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1252\n- fix: urls to avoid 307 by @gozineb in https://github.com/StanGirard/quivr/pull/1253\n- feat: allow user to unsubscribe from a brain by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1254\n- feat(user): 🚚 Move language and theme buttons to the User page by @matthieujacq in https://github.com/StanGirard/quivr/pull/1256\n- Update next.config.js by @riccardolinares in https://github.com/StanGirard/quivr/pull/1251\n- feat: allow setting public brain status to private by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1258\n\n## New Contributors\n\n- @matthieujacq made their first contribution in https://github.com/StanGirard/quivr/pull/1256\n- @riccardolinares made their first contribution in https://github.com/StanGirard/quivr/pull/1251\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.80...v0.0.81\n\n## 0.0.80 (2023-09-21)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.79...v0.0.80\n\n## 0.0.79 (2023-09-21)\n\n## What's Changed\n\n- fix(gpt-3.5-instruct): bug and new version of node by @StanGirard in https://github.com/StanGirard/quivr/pull/1228\n- feat: display brain status on settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1221\n- feat(upload): changed icons by @StanGirard in https://github.com/StanGirard/quivr/pull/1233\n- Feat/paperclip by @StanGirard in https://github.com/StanGirard/quivr/pull/1234\n- fix(brain_size): increased size by @StanGirard in https://github.com/StanGirard/quivr/pull/1235\n- feat(strapi): added first draft by @StanGirard in https://github.com/StanGirard/quivr/pull/1237\n- feat: add public brain page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1230\n- feat: count public brains number of subscribers by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1236\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.78...v0.0.79\n\n## 0.0.78 (2023-09-20)\n\n## What's Changed\n\n- feat: add public brain creation by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1218\n- feat: get files from storage by @gozineb in https://github.com/StanGirard/quivr/pull/1205\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.77...v0.0.78\n\n## 0.0.77 (2023-09-19)\n\n## What's Changed\n\n- feat(memory): optimisation by @StanGirard in https://github.com/StanGirard/quivr/pull/1214\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.76...v0.0.77\n\n## 0.0.76 (2023-09-19)\n\n## What's Changed\n\n- chore(theodo): added trigger function for theodo by @StanGirard in https://github.com/StanGirard/quivr/pull/1195\n- feat: add tooltip on upload card toggle button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1197\n- feat(analytics): add google analytics by @gozineb in https://github.com/StanGirard/quivr/pull/1147\n- Feat/theodo gpt4 by @StanGirard in https://github.com/StanGirard/quivr/pull/1198\n- fix(chats): now in order and with a little bonus ;) by @StanGirard in https://github.com/StanGirard/quivr/pull/1200\n- fix: fix some bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1201\n- feat(question): now not rephrasing question when passed to answering llm by @StanGirard in https://github.com/StanGirard/quivr/pull/1202\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.75...v0.0.76\n\n## 0.0.75 (2023-09-18)\n\n## What's Changed\n\n- feat(frontend): responsiveness by @StanGirard in https://github.com/StanGirard/quivr/pull/1174\n- feat(upload): changed to task by @StanGirard in https://github.com/StanGirard/quivr/pull/1178\n- fix(qa_base): asign max_token to llm by @B0rrA in https://github.com/StanGirard/quivr/pull/1179\n- feat(perf): increased perf embedding and search for files by @StanGirard in https://github.com/StanGirard/quivr/pull/1182\n- fix(usersettings): Fix bugs with user settings in the back always gpt-3.5-turbo by @StanGirard in https://github.com/StanGirard/quivr/pull/1183\n- feat(notificatins): higher refresh rate by @StanGirard in https://github.com/StanGirard/quivr/pull/1184\n- style(notifications): improve the messages for the notifications by @StanGirard in https://github.com/StanGirard/quivr/pull/1185\n- fix(notifications): dead notifications that are still present long after by @StanGirard in https://github.com/StanGirard/quivr/pull/1186\n- fix(notifications): greater than 5 minutes ago not less by @StanGirard in https://github.com/StanGirard/quivr/pull/1187\n- feat(aws): improved size by @StanGirard in https://github.com/StanGirard/quivr/pull/1188\n- feat(concurrency): added concurrency for increased performance by @StanGirard in https://github.com/StanGirard/quivr/pull/1189\n- feat(prompt): improved answer readability with markdown and aerataed by @StanGirard in https://github.com/StanGirard/quivr/pull/1190\n- fix(notification): information now displayed on the right by @StanGirard in https://github.com/StanGirard/quivr/pull/1191\n- feat(chat): added copy feature to message by @StanGirard in https://github.com/StanGirard/quivr/pull/1192\n- feat(e2e): add playright config and createBrain e2e test by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1177\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.74...v0.0.75\n\n## 0.0.74 (2023-09-14)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.73...v0.0.74\n\n## 0.0.73 (2023-09-14)\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.72...v0.0.73\n\n## 0.0.72 (2023-09-14)\n\n## What's Changed\n\n- feat(file-system): added queue and filesystem by @StanGirard in https://github.com/StanGirard/quivr/pull/1159\n- fix(migration): removed by @StanGirard in https://github.com/StanGirard/quivr/pull/1170\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.71...v0.0.72\n\n## 0.0.71 (2023-09-14)\n\n## What's Changed\n\n- feat: the good user management by @StanGirard in https://github.com/StanGirard/quivr/pull/1158\n- feat: add knowledge tab on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1163\n- feat: update header and improve ux by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1164\n- feat: submit upload on Enter by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1160\n- feat: make error messages more clear by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1166\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.70...v0.0.71\n\n## 0.0.70 (2023-09-12)\n\n## What's Changed\n\n- feat: add notifications components by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1148\n- feat: add polling for pending notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1152\n- fix(selectedBrain): prevent picking brainId from local storage by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1154\n- feat: update isValidUrl function by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1155\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.69...v0.0.70\n\n## 0.0.69 (2023-09-08)\n\n## What's Changed\n\n- feat: add multiple upload and crawl in parallel by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1118\n- feat: allow user to chat while feed process is pending by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1120\n- feat: add notifications table, and push notification on upload and crawl by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1125\n- feat: merge chat history with chat notifications by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1127\n- feat(feedBrain): add request pending message #1135 by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1136\n- fix: update crawl and upload endpoints by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1142\n- make docker compose command more flexible by @thehunmonkgroup in https://github.com/StanGirard/quivr/pull/1139\n\n## New Contributors\n\n- @thehunmonkgroup made their first contribution in https://github.com/StanGirard/quivr/pull/1139\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.68...v0.0.69\n\n## 0.0.68 (2023-09-06)\n\n## What's Changed\n\n- feat(liteLLM): Add support for Azure OpenAI, Palm, Claude-2, Llama2, CodeLlama (100+LLMs) by @ishaan-jaff in https://github.com/StanGirard/quivr/pull/1097\n- feat(crawler): add multiple urls support by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1112\n- fix(csp): add growthbook to csp headers by @gozineb in https://github.com/StanGirard/quivr/pull/1117\n\n## New Contributors\n\n- @ishaan-jaff made their first contribution in https://github.com/StanGirard/quivr/pull/1097\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.67...v0.0.68\n\n## 0.0.67 (2023-09-05)\n\n## What's Changed\n\n- feat: add FeedBrainInput component by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1101\n- feat: add <Feed /> component in chat page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1103\n- 🚑 fix feature flags -> add it back to context by @gozineb in https://github.com/StanGirard/quivr/pull/1106\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.66...v0.0.67\n\n## 0.0.66 (2023-09-04)\n\n## What's Changed\n\n- fix(prod): add url api.openai to CSP headers by @gozineb in https://github.com/StanGirard/quivr/pull/1077\n- feat: change share brain button logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1078\n- fix(brainsSettings): handle nullish value from api call by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1080\n- fix: update hash routing logic by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1082\n- fix: fix hash redirection by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1085\n- feat: add tanstack query and optimistic fetch on brains settings page by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1087\n- docs: writeup for running quivr fully locally by @mvda in https://github.com/StanGirard/quivr/pull/1096\n- fix: prevent submit on share button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1098\n\n## New Contributors\n\n- @mvda made their first contribution in https://github.com/StanGirard/quivr/pull/1096\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.65...v0.0.66\n\n## 0.0.65 (2023-08-31)\n\n## What's Changed\n\n- feat: make chatlist scrollable by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1064\n- feat(newBrain): update data validation logic and add \\* on required fields by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1065\n- feat(shareBrain): prevent re inviting users with access by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1063\n- feat(chatMessage): update attributes display by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1067\n- fix: fix minor bugs by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1070\n- feat: remove mic button by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1075\n- feat: truncate long chat name by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1076\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.64...v0.0.65\n\n## 0.0.64 (2023-08-30)\n\n## What's Changed\n\n- feat: add prompt trigger through # by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1023\n- feat: add headless question tracking by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1051\n- feat: update header and remove prompt / brain on backspace by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1052\n- feat: handle new chat button click by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1054\n- feat: add name missing error in new brain modal by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1055\n- feat: validate api key before saving by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1057\n- feat: track prompt and brain changes by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1058\n- feat(chat): update chat input placeholder by @gozineb in https://github.com/StanGirard/quivr/pull/1060\n- fix(invitationPage): avoid multiple re-rendering by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1062\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.63...v0.0.64\n\n## 0.0.63 (2023-08-27)\n\n## What's Changed\n\n- fix(dockerfile): backend Dockerfile exit code 1 by @pat266 in https://github.com/StanGirard/quivr/pull/1032\n- test(backend): skip failing tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1036\n- feat(messagesList): auto scroll on new message by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1040\n- test: unskip `qa_headless.py` linter tests by @mamadoudicko in https://github.com/StanGirard/quivr/pull/1041\n- feat: add 2 save buttons on Brain management tab by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1039\n- feat(brain): add endpoint to return context to question by @ZongZiWang in https://github.com/StanGirard/quivr/pull/1044\n- fix: English grammar translation.json by @elie222 in https://github.com/StanGirard/quivr/pull/1046\n\n## New Contributors\n\n- @pat266 made their first contribution in https://github.com/StanGirard/quivr/pull/1032\n- @elie222 made their first contribution in https://github.com/StanGirard/quivr/pull/1046\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.62...v0.0.63\n\n## 0.0.62 (2023-08-25)\n\n## What's Changed\n\n- feat: Remove chat id from chat list by @ChloeMouret in https://github.com/StanGirard/quivr/pull/1031\n- fix(analytics): june debug for real by @gozineb in https://github.com/StanGirard/quivr/pull/1033\n\n**Full Changelog**: https://github.com/StanGirard/quivr/compare/v0.0.61...v0.0.62\n\n## [0.0.61](https://github.com/StanGirard/quivr/compare/v0.0.60...v0.0.61) (2023-08-23)\n\n### Features\n\n- add brain prompt overwritting from chat ([#1012](https://github.com/StanGirard/quivr/issues/1012)) ([b967c2d](https://github.com/StanGirard/quivr/commit/b967c2d2d60b93f9142fe2afd04fb9422adcc2be))\n- **backend:** adds python code parsing ([#1003](https://github.com/StanGirard/quivr/issues/1003)) ([a626b84](https://github.com/StanGirard/quivr/commit/a626b84b96c7b40904960e039f72ff042148a240))\n- **prompts:** add public prompts to SQL db ([#1014](https://github.com/StanGirard/quivr/issues/1014)) ([4b1f4b1](https://github.com/StanGirard/quivr/commit/4b1f4b141287d109794aa6015f83deb3882ac5cb))\n- **translation:** Added Simplified Chinese translation，Fix pt-br not working ([#1011](https://github.com/StanGirard/quivr/issues/1011)) ([e328ab8](https://github.com/StanGirard/quivr/commit/e328ab81b30f2dd3dae7287e0351fdacd1c18133))\n\n### Bug Fixes\n\n- **Analytics:** no tags tracking for upload & crawl ([#1024](https://github.com/StanGirard/quivr/issues/1024)) ([2b74ebc](https://github.com/StanGirard/quivr/commit/2b74ebc1f099c4d12705d458fefad94120af9208))\n\n## [0.0.60](https://github.com/StanGirard/quivr/compare/v0.0.59...v0.0.60) (2023-08-22)\n\n### Features\n\n- **chat:** add brain selection through mention input ([#969](https://github.com/StanGirard/quivr/issues/969)) ([8e94f22](https://github.com/StanGirard/quivr/commit/8e94f22782dd2255e8125fbb4b3718413ad4701e))\n\n### Bug Fixes\n\n- remove conflicts ([#998](https://github.com/StanGirard/quivr/issues/998)) ([f61b70a](https://github.com/StanGirard/quivr/commit/f61b70a34f6d24e6f343d31cc4aa63265bb1c218))\n- update backend tests ([#992](https://github.com/StanGirard/quivr/issues/992)) ([5a3a6fe](https://github.com/StanGirard/quivr/commit/5a3a6fe370756783a204f2a62007f6cb23c7b202))\n\n## [0.0.59](https://github.com/StanGirard/quivr/compare/v0.0.58...v0.0.59) (2023-08-20)\n\n### Features\n\n- **aws:** all in microservices ([b3a6231](https://github.com/StanGirard/quivr/commit/b3a6231274e5aea28675381ba6f7ba277228f5ac))\n- **chat-service:** added task definition ([d001ec7](https://github.com/StanGirard/quivr/commit/d001ec70df3ccd5f3885b5f174e58f1b3238c433))\n- **docker:** improved size image ([#978](https://github.com/StanGirard/quivr/issues/978)) ([aa623c4](https://github.com/StanGirard/quivr/commit/aa623c4039ba31928dd0934a682259c7762d2efa))\n- **docker:** pushing image to github registry ([ad3dca3](https://github.com/StanGirard/quivr/commit/ad3dca3e2705b87a9c9c0b35f67773bcc182ae88))\n- **gcr:** removed sha and put latest ([2b85a94](https://github.com/StanGirard/quivr/commit/2b85a94e8835861afd9c178b72e59d018d8b956f))\n- **health:** added endpoint for services ([#989](https://github.com/StanGirard/quivr/issues/989)) ([ae7852e](https://github.com/StanGirard/quivr/commit/ae7852ec3f9d6e20b28c3b6fbc0d433d476395ea))\n- **microservices:** split into 4 quivr to better handle long services ([#972](https://github.com/StanGirard/quivr/issues/972)) ([7281fd9](https://github.com/StanGirard/quivr/commit/7281fd905a24b8e4dad7214d7809b8856685fca8))\n- **preview:** added crawl service to ci ([b7f9876](https://github.com/StanGirard/quivr/commit/b7f9876ce20a2c802ccfd7cff35de50ac2fd2226))\n- **preview:** added preview ([#974](https://github.com/StanGirard/quivr/issues/974)) ([9eb25a4](https://github.com/StanGirard/quivr/commit/9eb25a4d1777b9fdbc1c4b93df0b51e8b28d3ae9))\n- **preview:** added service upload ([#979](https://github.com/StanGirard/quivr/issues/979)) ([ce6b45e](https://github.com/StanGirard/quivr/commit/ce6b45e1ac8e9a3d21b7f56ad228351e34179e11))\n- **refacto:** changed a bit of things to make better dx ([#984](https://github.com/StanGirard/quivr/issues/984)) ([d0370ab](https://github.com/StanGirard/quivr/commit/d0370ab499465ee1404d3c1d32878e8da3853441))\n- **Unplug:** chatting without brain streaming ([#970](https://github.com/StanGirard/quivr/issues/970)) ([600ff1e](https://github.com/StanGirard/quivr/commit/600ff1ede02741c66853cc3e4e7f5001aaba3bc2))\n\n### Bug Fixes\n\n- **settings:** select proper brain model ([#943](https://github.com/StanGirard/quivr/issues/943)) ([3a44f54](https://github.com/StanGirard/quivr/commit/3a44f54d6b75581e3cbc8acf0c1c309c3273e63f))\n- update backend tests ([#975](https://github.com/StanGirard/quivr/issues/975)) ([c746eb1](https://github.com/StanGirard/quivr/commit/c746eb18303945a1736c89427026b509f501e715))\n- **windows:** removed unused start script ([#962](https://github.com/StanGirard/quivr/issues/962)) ([ad7ac15](https://github.com/StanGirard/quivr/commit/ad7ac1516d5c45c833c9e9ba6162012096372fa6))\n\n## [0.0.57](https://github.com/StanGirard/quivr/compare/v0.0.56...v0.0.57) (2023-08-16)\n\n### Features\n\n- add brain missing message ([#958](https://github.com/StanGirard/quivr/issues/958)) ([f99f81d](https://github.com/StanGirard/quivr/commit/f99f81d10f9c768af00e38249763a252f8db16e3))\n- change messages position ([#946](https://github.com/StanGirard/quivr/issues/946)) ([9235a84](https://github.com/StanGirard/quivr/commit/9235a848d12b96af346cc2cbb1ac50dc2f67b20c))\n- update chat ui ([#907](https://github.com/StanGirard/quivr/issues/907)) ([80be40a](https://github.com/StanGirard/quivr/commit/80be40ad34d07b646d48d2aa0405a92b3de308d7))\n\n### Bug Fixes\n\n- **chat routes:** use brain model, temp, and token ([#902](https://github.com/StanGirard/quivr/issues/902)) ([59ddfb4](https://github.com/StanGirard/quivr/commit/59ddfb48823b56239fe7fc95133274a3bedf49da))\n- **chatMessages:** Fix error on answering question ([#953](https://github.com/StanGirard/quivr/issues/953)) ([1fef9b0](https://github.com/StanGirard/quivr/commit/1fef9b078379c8991f6029c34ac10d4cbdc5a44d))\n- **crawler:** using newspaper and fixed recursive by merging content ([#955](https://github.com/StanGirard/quivr/issues/955)) ([d7c5c79](https://github.com/StanGirard/quivr/commit/d7c5c79043827b2b0949f6fd6c508c4617dcf498))\n- **translations:** pr portuguese translations ([#933](https://github.com/StanGirard/quivr/issues/933)) ([d80178a](https://github.com/StanGirard/quivr/commit/d80178a84802c35b2c13d3eef4d0438fd067da92))\n\n## [0.0.56](https://github.com/StanGirard/quivr/compare/v0.0.55...v0.0.56) (2023-08-10)\n\n### Bug Fixes\n\n- **chat:** update data keys ([#923](https://github.com/StanGirard/quivr/issues/923)) ([21db719](https://github.com/StanGirard/quivr/commit/21db7197965f1cacd6595ae94d9017fc54d761c3))\n\n## [0.0.55](https://github.com/StanGirard/quivr/compare/v0.0.54...v0.0.55) (2023-08-10)\n\n### Features\n\n- **chatMessages:** add brain_id and prompt_id columns ([#912](https://github.com/StanGirard/quivr/issues/912)) ([6e77732](https://github.com/StanGirard/quivr/commit/6e777327aaee7b9f35b20dcd00814f4acbaf448e))\n- **invitation:** add translations ([#909](https://github.com/StanGirard/quivr/issues/909)) ([1360ce8](https://github.com/StanGirard/quivr/commit/1360ce801d8958defa5dd29a481e2e66ac6ae9ac))\n- Russian language translation ([#903](https://github.com/StanGirard/quivr/issues/903)) ([672eec0](https://github.com/StanGirard/quivr/commit/672eec08bc7113e3f4c32a29ae86b2b879262d30))\n\n## [0.0.54](https://github.com/StanGirard/quivr/compare/v0.0.53...v0.0.54) (2023-08-08)\n\n### Features\n\n- add new chat bar ([#896](https://github.com/StanGirard/quivr/issues/896)) ([69a73f5](https://github.com/StanGirard/quivr/commit/69a73f5d5ae58dca9c23c0d8751f8c7326c84f4c))\n- add new chat page ([#890](https://github.com/StanGirard/quivr/issues/890)) ([c43e0c0](https://github.com/StanGirard/quivr/commit/c43e0c01c4ddcf0d97b9bb89784ff004fb7a0a79))\n- deleting brains on brain manager page ([#893](https://github.com/StanGirard/quivr/issues/893)) ([71e142b](https://github.com/StanGirard/quivr/commit/71e142ba3c164e5f14959cd1fd5de38531779034))\n\n### Bug Fixes\n\n- **es:** spanish translations ([#895](https://github.com/StanGirard/quivr/issues/895)) ([69d0893](https://github.com/StanGirard/quivr/commit/69d08937de1540cf39a6462b4583b2c4c908d0af))\n- **sentry:** some unhandled errors ([#894](https://github.com/StanGirard/quivr/issues/894)) ([9ba7241](https://github.com/StanGirard/quivr/commit/9ba724168eacf4b074ad062f2a58b637597335ba))\n\n## [0.0.53](https://github.com/StanGirard/quivr/compare/v0.0.52...v0.0.53) (2023-08-07)\n\n### Features\n\n- **backend:** add custom prompt ([#885](https://github.com/StanGirard/quivr/issues/885)) ([61cd0a6](https://github.com/StanGirard/quivr/commit/61cd0a6bde989bc9f931f47967c3bbddc3b0446b))\n- **fr:** added language ([#884](https://github.com/StanGirard/quivr/issues/884)) ([1160e16](https://github.com/StanGirard/quivr/commit/1160e160141f350a39ae4f73ff88ad79e1b1d874))\n- gpt4 is not available for brains if there is no given openAiKey ([#850](https://github.com/StanGirard/quivr/issues/850)) ([e9ebeef](https://github.com/StanGirard/quivr/commit/e9ebeef72ae2dee40b6bdff58121f9f9e1814577))\n- **qa:** improve code ([#886](https://github.com/StanGirard/quivr/issues/886)) ([7028505](https://github.com/StanGirard/quivr/commit/7028505571a8e1f8569a12b770b3ce99cd2ec4e0))\n\n### Bug Fixes\n\n- **i18n:** update tests for french and spanish ([#878](https://github.com/StanGirard/quivr/issues/878)) ([b0514d6](https://github.com/StanGirard/quivr/commit/b0514d6149d474747de642d12454f6b511a1f947))\n\n## [0.0.52](https://github.com/StanGirard/quivr/compare/v0.0.51...v0.0.52) (2023-08-07)\n\n### Features\n\n- add custom prompt fields on brain setting pages ([#837](https://github.com/StanGirard/quivr/issues/837)) ([99a3fa9](https://github.com/StanGirard/quivr/commit/99a3fa9b296520a71028194e21bc808a2ec208a0))\n- add public prompts picker ([#841](https://github.com/StanGirard/quivr/issues/841)) ([b3fb8fc](https://github.com/StanGirard/quivr/commit/b3fb8fc3bc2d71a72e73b4f0aa30c84255a77fc0))\n- remove private prompts on related brain delete ([#842](https://github.com/StanGirard/quivr/issues/842)) ([4c15fe2](https://github.com/StanGirard/quivr/commit/4c15fe2bfde7a2fdc59c299ef668f1ba0cd8ffa8))\n\n### Bug Fixes\n\n- **pg-database:** by default variable is not implemented ([#848](https://github.com/StanGirard/quivr/issues/848)) ([69e2c28](https://github.com/StanGirard/quivr/commit/69e2c289e5a6e4cfd6b7187a3c4fda5c538d5d35))\n- remove typo ([#853](https://github.com/StanGirard/quivr/issues/853)) ([5496e9d](https://github.com/StanGirard/quivr/commit/5496e9d738a1f80f11b6c8fa8606960abcbcd06d))\n\n### Performance Improvements\n\n- **deps:** removed ([#873](https://github.com/StanGirard/quivr/issues/873)) ([10d4d65](https://github.com/StanGirard/quivr/commit/10d4d65c1e203aaae1069395ed5066fbfc9c7715))\n\n## [0.0.51](https://github.com/StanGirard/quivr/compare/v0.0.50...v0.0.51) (2023-08-03)\n\n### Features\n\n- **backend:** implement brain-prompt link ([#831](https://github.com/StanGirard/quivr/issues/831)) ([4ca6c66](https://github.com/StanGirard/quivr/commit/4ca6c667da3d5daf0339c65f077c8956c7ef42e8))\n- **prompt:** add prompt table, entity and repository ([#823](https://github.com/StanGirard/quivr/issues/823)) ([e3b6114](https://github.com/StanGirard/quivr/commit/e3b6114248ee04a9dc6b93093256d82324672925))\n\n### Bug Fixes\n\n- **chat routes:** HTTPException import correction ([#833](https://github.com/StanGirard/quivr/issues/833)) ([68f03b2](https://github.com/StanGirard/quivr/commit/68f03b2416f5b49e9f8e72c5b1c91754792a1233))\n- **chats:** delete chats from correct table ([#834](https://github.com/StanGirard/quivr/issues/834)) ([659e585](https://github.com/StanGirard/quivr/commit/659e585145ea0aa8bf88ecc48d31e0b65098a729))\n- **env:** added pg database url default value to none ([23f50ec](https://github.com/StanGirard/quivr/commit/23f50ec3a37af453f1b8b69592d1a640189d50e8))\n\n## [0.0.50](https://github.com/StanGirard/quivr/compare/v0.0.49...v0.0.50) (2023-08-02)\n\n### Features\n\n- Introduce repository pattern to prepare adding other database providers ([#646](https://github.com/StanGirard/quivr/issues/646)) ([303ba72](https://github.com/StanGirard/quivr/commit/303ba72028d349196b78cc07db627115ec0aff90))\n- **prompt:** added instructions in standalone question & a bit more things ([#826](https://github.com/StanGirard/quivr/issues/826)) ([c217979](https://github.com/StanGirard/quivr/commit/c21797905d7d57dab73f9b7047da1a50aae37b9b))\n\n## [0.0.49](https://github.com/StanGirard/quivr/compare/v0.0.48...v0.0.49) (2023-08-01)\n\n### Features\n\n- add chat config modal ([#807](https://github.com/StanGirard/quivr/issues/807)) ([d018ab6](https://github.com/StanGirard/quivr/commit/d018ab6a9334b45b86e0c7fed3a552f5cb202523))\n\n### Bug Fixes\n\n- bugs ([#818](https://github.com/StanGirard/quivr/issues/818)) ([edcbb30](https://github.com/StanGirard/quivr/commit/edcbb30e97535013b61d5a94bb4204d030cba2f2))\n\n## [0.0.48](https://github.com/StanGirard/quivr/compare/v0.0.47...v0.0.48) (2023-08-01)\n\n### Bug Fixes\n\n- **openai:** user key now used for llm model ([c01433c](https://github.com/StanGirard/quivr/commit/c01433c84194e1d155ad3917de58257d24c30c38))\n\n## [0.0.47](https://github.com/StanGirard/quivr/compare/v0.0.46...v0.0.47) (2023-08-01)\n\n### Features\n\n- add user level open ai key management ([#805](https://github.com/StanGirard/quivr/issues/805)) ([7532b55](https://github.com/StanGirard/quivr/commit/7532b558c74962e5916b951235e8578cc8e882a2))\n- **chat:** added streaming ([#808](https://github.com/StanGirard/quivr/issues/808)) ([3166d08](https://github.com/StanGirard/quivr/commit/3166d089ee82730882c26454bd110a3dfae067c9))\n- **llm:** removing all llms to prepare for genoss ([#804](https://github.com/StanGirard/quivr/issues/804)) ([db40f3c](https://github.com/StanGirard/quivr/commit/db40f3cccd596f4337823e0306e66224d5e1c8c9))\n\n## [0.0.46](https://github.com/StanGirard/quivr/compare/v0.0.45...v0.0.46) (2023-07-31)\n\n### Features\n\n- **aws:** increased numer of replicas to 10 ([9809ef4](https://github.com/StanGirard/quivr/commit/9809ef4119a2351b78217c73c545b7e327676135))\n- **aws:** increased size ([56f254a](https://github.com/StanGirard/quivr/commit/56f254a050fcc3b9ee073318bd566e03675658cd))\n\n### Bug Fixes\n\n- **frontend:** correctly display document information in explore view details ([#781](https://github.com/StanGirard/quivr/issues/781)) ([87c5e58](https://github.com/StanGirard/quivr/commit/87c5e582a2579ebb68f272cb62175dfa6f2e6dc8))\n- Toast message hidden under the footer ([#761](https://github.com/StanGirard/quivr/issues/761)) ([3e8ed46](https://github.com/StanGirard/quivr/commit/3e8ed463173659ebe599602e97c2d11191144ecb))\n- udpate migration script doc ([#793](https://github.com/StanGirard/quivr/issues/793)) ([a609c01](https://github.com/StanGirard/quivr/commit/a609c01aa8fab10e74eed64edd795c56bece1fdb))\n\n## [0.0.45](https://github.com/StanGirard/quivr/compare/v0.0.44...v0.0.45) (2023-07-27)\n\n### Bug Fixes\n\n- **release-please:** use personal token to be able to trigger release ([#789](https://github.com/StanGirard/quivr/issues/789)) ([2fcff0b](https://github.com/StanGirard/quivr/commit/2fcff0bedab3a53cb3dc395c0e362edb2962aaa7))\n\n## [0.0.44](https://github.com/StanGirard/quivr/compare/v0.0.43...v0.0.44) (2023-07-27)\n\n### Features\n\n- **pr-title:** added pr-title checlk ([b11b2d8](https://github.com/StanGirard/quivr/commit/b11b2d8658fec3940bb0c0280124cbdd77d8d74b))\n\n### Bug Fixes\n\n- **release-please:** fixed actions ([16114b2](https://github.com/StanGirard/quivr/commit/16114b2c5271ab299b7e84f5a9e552dab58cd211))\n\n## [0.0.43](https://github.com/StanGirard/quivr/compare/v0.0.42...v0.0.43) (2023-07-26)\n\n### Features\n\n- **workflow:** added release please ([e6ba9e8](https://github.com/StanGirard/quivr/commit/e6ba9e80f48a1d8822c99e5b77e064dc2b18e718))\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n      (e) Some folders or files within the distribution may be subject to\n          different license terms and conditions. In such cases, the\n          applicable license will be specified in a separate LICENSE file\n          or within the file itself. You must comply with the terms of\n          these additional licenses when using, reproducing, or distributing\n          those specific folders or files.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2023-2024] [Quivr]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "README.md",
    "content": "# Quivr - Your Second Brain, Empowered by Generative AI\n\n<div align=\"center\">\n    <img src=\"./logo.png\" alt=\"Quivr-logo\" width=\"31%\"  style=\"border-radius: 50%; padding-bottom: 20px\"/>\n</div>\n\n[![Discord Follow](https://dcbadge.vercel.app/api/server/HUpRgp2HG8?style=flat)](https://discord.gg/HUpRgp2HG8)\n[![GitHub Repo stars](https://img.shields.io/github/stars/quivrhq/quivr?style=social)](https://github.com/quivrhq/quivr)\n[![Twitter Follow](https://img.shields.io/twitter/follow/StanGirard?style=social)](https://twitter.com/_StanGirard)\n\nQuivr, helps you build your second brain, utilizes the power of GenerativeAI to be your personal assistant !\n\n## Key Features 🎯\n\n- **Opiniated RAG**: We created a RAG that is opinionated, fast and efficient so you can focus on your product\n- **LLMs**: Quivr works with any LLM, you can use it with OpenAI, Anthropic, Mistral, Gemma, etc.\n- **Any File**: Quivr works with any file, you can use it with PDF, TXT, Markdown, etc and even add your own parsers.\n- **Customize your RAG**: Quivr allows you to customize your RAG, add internet search, add tools, etc.\n- **Integrations with Megaparse**: Quivr works with [Megaparse](https://github.com/quivrhq/megaparse), so you can ingest your files with Megaparse and use the RAG with Quivr.\n\n>We take care of the RAG so you can focus on your product. Simply install quivr-core and add it to your project. You can now ingest your files and ask questions.*\n\n**We will be improving the RAG and adding more features, stay tuned!**\n\n\nThis is the core of Quivr, the brain of Quivr.com.\n\n<!-- ## Demo Highlight 🎥\n\nhttps://github.com/quivrhq/quivr/assets/19614572/a6463b73-76c7-4bc0-978d-70562dca71f5 -->\n\n## Getting Started 🚀\n\nYou can find everything on the [documentation](https://core.quivr.com/).\n\n### Prerequisites 📋\n\nEnsure you have the following installed:\n\n- Python 3.10 or newer\n\n### 30 seconds Installation 💽\n\n\n- **Step 1**: Install the package\n\n  \n\n  ```bash\n  pip install quivr-core # Check that the installation worked\n  ```\n\n\n- **Step 2**: Create a RAG with 5 lines of code\n\n  ```python\n  import tempfile\n\n  from quivr_core import Brain\n\n  if __name__ == \"__main__\":\n      with tempfile.NamedTemporaryFile(mode=\"w\", suffix=\".txt\") as temp_file:\n          temp_file.write(\"Gold is a liquid of blue-like colour.\")\n          temp_file.flush()\n\n          brain = Brain.from_files(\n              name=\"test_brain\",\n              file_paths=[temp_file.name],\n          )\n\n          answer = brain.ask(\n              \"what is gold? asnwer in french\"\n          )\n          print(\"answer:\", answer)\n  ```\n## Configuration\n\n### Workflows\n\n#### Basic RAG\n\n![](docs/docs/workflows/examples/basic_rag.excalidraw.png)\n\n\nCreating a basic RAG workflow like the one above is simple, here are the steps:\n\n\n1. Add your API Keys to your environment variables\n```python\nimport os\nos.environ[\"OPENAI_API_KEY\"] = \"myopenai_apikey\"\n\n```\nQuivr supports APIs from Anthropic, OpenAI, and Mistral. It also supports local models using Ollama.\n\n1. Create the YAML file ``basic_rag_workflow.yaml`` and copy the following content in it\n```yaml\nworkflow_config:\n  name: \"standard RAG\"\n  nodes:\n    - name: \"START\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"rewrite\"]\n\n    - name: \"rewrite\"\n      edges: [\"retrieve\"]\n\n    - name: \"retrieve\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user\n      edges: [\"END\"]\n\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\n# Reranker configuration\nreranker_config:\n  # The reranker supplier to use\n  supplier: \"cohere\"\n\n  # The model to use for the reranker for the given supplier\n  model: \"rerank-multilingual-v3.0\"\n\n  # Number of chunks returned by the reranker\n  top_n: 5\n\n# Configuration for the LLM\nllm_config:\n\n  # maximum number of tokens passed to the LLM to generate the answer\n  max_input_tokens: 4000\n\n  # temperature for the LLM\n  temperature: 0.7\n```\n\n3. Create a Brain with the default configuration\n```python\nfrom quivr_core import Brain\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"./my_first_doc.pdf\", \"./my_second_doc.txt\"],\n                        )\n\n```\n\n4. Launch a Chat\n```python\nbrain.print_info()\n\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\nfrom quivr_core.config import RetrievalConfig\n\nconfig_file_name = \"./basic_rag_workflow.yaml\"\n\nretrieval_config = RetrievalConfig.from_yaml(config_file_name)\n\nconsole = Console()\nconsole.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\nwhile True:\n    # Get user input\n    question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n    # Check if user wants to exit\n    if question.lower() == \"exit\":\n        console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n        break\n\n    answer = brain.ask(question, retrieval_config=retrieval_config)\n    # Print the answer with typing effect\n    console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n    console.print(\"-\" * console.width)\n\nbrain.print_info()\n```\n\n5. You are now all set up to talk with your brain and test different retrieval strategies by simply changing the configuration file!\n\n## Go further\n\nYou can go further with Quivr by adding internet search, adding tools, etc. Check the [documentation](https://core.quivr.com/) for more information.\n\n\n## Contributors ✨\n\nThanks go to these wonderful people:\n<a href=\"https://github.com/quivrhq/quivr/graphs/contributors\">\n<img src=\"https://contrib.rocks/image?repo=quivrhq/quivr\" />\n</a>\n\n## Contribute 🤝\n\nDid you get a pull request? Open it, and we'll review it as soon as possible. Check out our project board [here](https://github.com/users/StanGirard/projects/5) to see what we're currently focused on, and feel free to bring your fresh ideas to the table!\n\n- [Open Issues](https://github.com/quivrhq/quivr/issues)\n- [Open Pull Requests](https://github.com/quivrhq/quivr/pulls)\n- [Good First Issues](https://github.com/quivrhq/quivr/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n\n## Partners ❤️\n\nThis project would not be possible without the support of our partners. Thank you for your support!\n\n\n<a href=\"https://ycombinator.com/\">\n    <img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Y_Combinator_logo.svg/1200px-Y_Combinator_logo.svg.png\" alt=\"YCombinator\" style=\"padding: 10px\" width=\"70px\">\n</a>\n<a href=\"https://www.theodo.fr/\">\n  <img src=\"https://avatars.githubusercontent.com/u/332041?s=200&v=4\" alt=\"Theodo\" style=\"padding: 10px\" width=\"70px\">\n</a>\n\n## License 📄\n\nThis project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details\n"
  },
  {
    "path": "core/.flake8",
    "content": "[flake8]\n; Minimal configuration for Flake8 to work with Black.\nmax-line-length = 100\nignore = E101,E111,E112,E221,E222,E501,E711,E712,W503,W504,F401,E203\n"
  },
  {
    "path": "core/.gitignore",
    "content": "# python generated files\n__pycache__/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# venv\n.venv\n"
  },
  {
    "path": "core/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "core/CHANGELOG.md",
    "content": "# Changelog\n\n## [0.0.33](https://github.com/QuivrHQ/quivr/compare/core-0.0.32...core-0.0.33) (2025-02-03)\n\n\n### Features\n\n* **zendesk:** add zendesk workflow ([#3586](https://github.com/QuivrHQ/quivr/issues/3586)) ([ee9b7a5](https://github.com/QuivrHQ/quivr/commit/ee9b7a5740825bd3fc9186e0a9179959c6525e5e))\n\n\n### Bug Fixes\n\n* CLI-24 ([ee9b7a5](https://github.com/QuivrHQ/quivr/commit/ee9b7a5740825bd3fc9186e0a9179959c6525e5e))\n\n## [0.0.32](https://github.com/QuivrHQ/quivr/compare/core-0.0.31...core-0.0.32) (2025-01-31)\n\n\n### Features\n\n* o3-mini ([#3583](https://github.com/QuivrHQ/quivr/issues/3583)) ([a639e0c](https://github.com/QuivrHQ/quivr/commit/a639e0ce50297e0fefa809b7edb57b50863b446d))\n\n## [0.0.31](https://github.com/QuivrHQ/quivr/compare/core-0.0.30...core-0.0.31) (2025-01-30)\n\n\n### Features\n\n* cache tokenizers ([#3558](https://github.com/QuivrHQ/quivr/issues/3558)) ([699dc2e](https://github.com/QuivrHQ/quivr/commit/699dc2e187abc9986845f591111723088f5bcefe))\n* limit tokenizers cache size ([#3577](https://github.com/QuivrHQ/quivr/issues/3577)) ([e2a3bcb](https://github.com/QuivrHQ/quivr/commit/e2a3bcbbdb469348187d986de9ba3901938bed58))\n* remove pympler dependency and add better way to calculate size of tokenizer cache ([#3580](https://github.com/QuivrHQ/quivr/issues/3580)) ([2fbd5d4](https://github.com/QuivrHQ/quivr/commit/2fbd5d48443625dd3fe8a37c04275cd760e7285f))\n* remove tokenizer load ([#3576](https://github.com/QuivrHQ/quivr/issues/3576)) ([05e212a](https://github.com/QuivrHQ/quivr/commit/05e212a30929ba3c00e31e3364363eb4a4376ad9))\n\n## [0.0.30](https://github.com/QuivrHQ/quivr/compare/core-0.0.29...core-0.0.30) (2025-01-27)\n\n\n### Features\n\n* adding cache to LLMEndpoint ([#3555](https://github.com/QuivrHQ/quivr/issues/3555)) ([6072907](https://github.com/QuivrHQ/quivr/commit/6072907ca7370be748d2d6845fd674abbb6c83c3))\n\n## [0.0.29](https://github.com/QuivrHQ/quivr/compare/core-0.0.28...core-0.0.29) (2025-01-20)\n\n\n### Features\n\n* enabling workflows without rewriting step ([#3549](https://github.com/QuivrHQ/quivr/issues/3549)) ([bbe1c18](https://github.com/QuivrHQ/quivr/commit/bbe1c183768bf32945554e679cab737c07bb3dde))\n* improving the prompts to always refer to 'tasks' instead of 'questions' ([#3528](https://github.com/QuivrHQ/quivr/issues/3528)) ([e9c72e1](https://github.com/QuivrHQ/quivr/commit/e9c72e15671407290f1a3a9758bf38a3357d2b15))\n* langfuse integration ([#3530](https://github.com/QuivrHQ/quivr/issues/3530)) ([c4aae1a](https://github.com/QuivrHQ/quivr/commit/c4aae1a6c21fd7bc7019676d32fa5b2e8fbbe171))\n* langfuse user id ([#3533](https://github.com/QuivrHQ/quivr/issues/3533)) ([e0ccd3d](https://github.com/QuivrHQ/quivr/commit/e0ccd3dc04b7527b27520465b2cf179e9789bf3f))\n* language detection after chunking ([#3532](https://github.com/QuivrHQ/quivr/issues/3532)) ([d0adb81](https://github.com/QuivrHQ/quivr/commit/d0adb8112a27fb7f25564d328a6f7e50ba27ba3a))\n* returning a description of each workflow node ([#3539](https://github.com/QuivrHQ/quivr/issues/3539)) ([d835fc6](https://github.com/QuivrHQ/quivr/commit/d835fc6e4c062bd485a715bc707a902493e092c2))\n\n\n### Bug Fixes\n\n* langfuse talk to model ([#3535](https://github.com/QuivrHQ/quivr/issues/3535)) ([9681a9e](https://github.com/QuivrHQ/quivr/commit/9681a9ec8b6b09fe20d04bf41d17a57afc5398f9))\n\n## [0.0.28](https://github.com/QuivrHQ/quivr/compare/core-0.0.27...core-0.0.28) (2024-12-17)\n\n\n### Features\n\n* remove dependencies on Pydantic v1 ([#3526](https://github.com/QuivrHQ/quivr/issues/3526)) ([ebc4eb8](https://github.com/QuivrHQ/quivr/commit/ebc4eb811c258ce0500032bbc52d96f333fabf89))\n\n## [0.0.27](https://github.com/QuivrHQ/quivr/compare/core-0.0.26...core-0.0.27) (2024-12-16)\n\n\n### Features\n\n* ensuring that max_context_tokens is never larger than what supported by models ([#3519](https://github.com/QuivrHQ/quivr/issues/3519)) ([d6e0ed4](https://github.com/QuivrHQ/quivr/commit/d6e0ed44df0ee7edafea85f704a15fd99969bafd))\n* send all to megaparse_sdk ([#3521](https://github.com/QuivrHQ/quivr/issues/3521)) ([e48044d](https://github.com/QuivrHQ/quivr/commit/e48044d36ffda613f65da24641ed8da290195177))\n\n\n### Bug Fixes\n\n* fixing errors arising when the user input contains no tasks ([#3525](https://github.com/QuivrHQ/quivr/issues/3525)) ([e28f7bc](https://github.com/QuivrHQ/quivr/commit/e28f7bcb9ab9534bc011664525ae1f9c2cf6393e))\n\n## [0.0.26](https://github.com/QuivrHQ/quivr/compare/core-0.0.25...core-0.0.26) (2024-12-10)\n\n\n### Features\n\n* first version (V0) of the Workflow Management System ([#3493](https://github.com/QuivrHQ/quivr/issues/3493)) ([6450a49](https://github.com/QuivrHQ/quivr/commit/6450a494e3efa8e8c267ca49aa0a7ec682586b4e))\n\n\n### Bug Fixes\n\n* dealing with empty tool_calls ([#3514](https://github.com/QuivrHQ/quivr/issues/3514)) ([e2f6389](https://github.com/QuivrHQ/quivr/commit/e2f6389189d911a382b2236ab39f28a1270528ac))\n\n## [0.0.25](https://github.com/QuivrHQ/quivr/compare/core-0.0.24...core-0.0.25) (2024-11-28)\n\n\n### Bug Fixes\n\n* megaparse sdk with nats ([#3496](https://github.com/QuivrHQ/quivr/issues/3496)) ([e68b4f4](https://github.com/QuivrHQ/quivr/commit/e68b4f45698898f6b514d4779c8e5fd7332f2e67))\n\n\n### Documentation\n\n* Enhance example/chatbot with added instructions ([#3506](https://github.com/QuivrHQ/quivr/issues/3506)) ([d1d608d](https://github.com/QuivrHQ/quivr/commit/d1d608d19ffb9213910575981eff3527f7d232a0))\n\n## [0.0.24](https://github.com/QuivrHQ/quivr/compare/core-0.0.23...core-0.0.24) (2024-11-14)\n\n\n### Features\n\n* kms-migration ([#3446](https://github.com/QuivrHQ/quivr/issues/3446)) ([1356d87](https://github.com/QuivrHQ/quivr/commit/1356d87098ae84776a5d47b631d07a1c8e92e291))\n* **megaparse:** add sdk ([#3462](https://github.com/QuivrHQ/quivr/issues/3462)) ([190d971](https://github.com/QuivrHQ/quivr/commit/190d971bd71333924b88ba747d3c6a833ca65d92))\n\n\n### Bug Fixes\n\n* added chunk_size in tika processor ([#3466](https://github.com/QuivrHQ/quivr/issues/3466)) ([063bbd3](https://github.com/QuivrHQ/quivr/commit/063bbd323dfca2dfc22fc5416c1617ed61d2e2ab))\n* modify megaparse strategy ([#3474](https://github.com/QuivrHQ/quivr/issues/3474)) ([da97b2c](https://github.com/QuivrHQ/quivr/commit/da97b2cf145c86ed577be698ae837b3dc26f6921))\n* supported extensions for megaparse ([#3477](https://github.com/QuivrHQ/quivr/issues/3477)) ([72b979d](https://github.com/QuivrHQ/quivr/commit/72b979d4e4d6e6efc45d47c7aba942eb909adc3e))\n\n## [0.0.23](https://github.com/QuivrHQ/quivr/compare/core-0.0.22...core-0.0.23) (2024-10-31)\n\n\n### Features\n\n* websearch, tool use, user intent, dynamic retrieval, multiple questions ([#3424](https://github.com/QuivrHQ/quivr/issues/3424)) ([285fe5b](https://github.com/QuivrHQ/quivr/commit/285fe5b96065a19c74f0314557e5840d8722099e))\n\n## [0.0.22](https://github.com/QuivrHQ/quivr/compare/core-0.0.21...core-0.0.22) (2024-10-21)\n\n\n### Features\n\n* **ask:** non-streaming now calls streaming ([#3409](https://github.com/QuivrHQ/quivr/issues/3409)) ([e71e46b](https://github.com/QuivrHQ/quivr/commit/e71e46bcdfbab0d583aef015604278343fd46c6f))\n\n## [0.0.21](https://github.com/QuivrHQ/quivr/compare/core-0.0.20...core-0.0.21) (2024-10-21)\n\n\n### Features\n\n* **ci:** trigger ([b92774a](https://github.com/QuivrHQ/quivr/commit/b92774aa37ad2051b197daa29fe4b94d57a19986))\n\n## [0.0.20](https://github.com/QuivrHQ/quivr/compare/core-0.0.19...core-0.0.20) (2024-10-21)\n\n\n### Features\n\n* **ci:** trigger ([#3403](https://github.com/QuivrHQ/quivr/issues/3403)) ([68c09fc](https://github.com/QuivrHQ/quivr/commit/68c09fce85364432da2641d0a8da867516142553))\n* **docs:** trigger ci ([5644596](https://github.com/QuivrHQ/quivr/commit/56445967252eac20d17bebc4484d7c00c45d9238))\n\n## [0.0.19](https://github.com/QuivrHQ/quivr/compare/core-0.0.18...core-0.0.19) (2024-10-21)\n\n\n### Features\n\n* **quivr-core:** beginning ([#3388](https://github.com/QuivrHQ/quivr/issues/3388)) ([7acb52a](https://github.com/QuivrHQ/quivr/commit/7acb52a9637b74d53f3e4cc9dde4ae1ca3f481ad))\n\n## [0.0.18](https://github.com/QuivrHQ/quivr/compare/core-0.0.17...core-0.0.18) (2024-10-16)\n\n\n### Bug Fixes\n\n* **core:** megaparse config ([#3384](https://github.com/QuivrHQ/quivr/issues/3384)) ([ffe86ca](https://github.com/QuivrHQ/quivr/commit/ffe86ca7bac3d7800913937314170db6f91daf8e))\n\n## [0.0.17](https://github.com/QuivrHQ/quivr/compare/core-0.0.16...core-0.0.17) (2024-10-16)\n\n\n### Features\n\n* **assistant:** cdp ([#3305](https://github.com/QuivrHQ/quivr/issues/3305)) ([b767f19](https://github.com/QuivrHQ/quivr/commit/b767f19f28b5478cef077b5d1587bf5195f2a668))\n* **assistants:** mock api ([#3195](https://github.com/QuivrHQ/quivr/issues/3195)) ([282fa0e](https://github.com/QuivrHQ/quivr/commit/282fa0e3f83f7c6fc8c84ca95f8f4ced4ed34b78))\n* introducing configurable retrieval workflows ([#3227](https://github.com/QuivrHQ/quivr/issues/3227)) ([ef90e8e](https://github.com/QuivrHQ/quivr/commit/ef90e8e672ca23d104c7d5bde7496f0929adf5d2))\n\n\n### Bug Fixes\n\n* fixing pdf parsing ([#3349](https://github.com/QuivrHQ/quivr/issues/3349)) ([367242a](https://github.com/QuivrHQ/quivr/commit/367242a3d5ea2df1928cb2908ad9e1906d1bba6f))\n\n\n### Documentation\n\n* **core:** init ([#3365](https://github.com/QuivrHQ/quivr/issues/3365)) ([bb572a2](https://github.com/QuivrHQ/quivr/commit/bb572a2a8d060f147461506aadd38704eb029a9a))\n* **fix:** fixed warnings from griffe ([#3381](https://github.com/QuivrHQ/quivr/issues/3381)) ([1a38798](https://github.com/QuivrHQ/quivr/commit/1a3879839a2d9e0881e18cb66809564fb76724ef))\n\n## [0.0.16](https://github.com/QuivrHQ/quivr/compare/core-0.0.15...core-0.0.16) (2024-09-17)\n\n\n### Bug Fixes\n\n* **core:** enforce langchain &lt;0.3 for pydantic v1 ([#3217](https://github.com/QuivrHQ/quivr/issues/3217)) ([4bb4800](https://github.com/QuivrHQ/quivr/commit/4bb4800a76942ee31a939d3cacc94f057682177a))\n\n## [0.0.15](https://github.com/QuivrHQ/quivr/compare/core-0.0.14...core-0.0.15) (2024-09-16)\n\n\n### Features\n\n* CRUD KMS (no syncs)  ([#3162](https://github.com/QuivrHQ/quivr/issues/3162)) ([71edca5](https://github.com/QuivrHQ/quivr/commit/71edca572ffd2901ed582005ac4b2803d9d95e57))\n* save and load brain ([#3202](https://github.com/QuivrHQ/quivr/issues/3202)) ([eda619f](https://github.com/QuivrHQ/quivr/commit/eda619f4547921ab4c50458b2d44c6b5c10e40d1))\n\n\n### Bug Fixes\n\n* Update LLMEndpoint to include max_tokens parameter ([#3201](https://github.com/QuivrHQ/quivr/issues/3201)) ([13ed225](https://github.com/QuivrHQ/quivr/commit/13ed225b172407ee9826b9c01b2f7b124a8b5a10))\n\n## [0.0.14](https://github.com/QuivrHQ/quivr/compare/core-0.0.13...core-0.0.14) (2024-09-09)\n\n\n### Features\n\n* Add brain_id and brain_name to ChatLLMMetadata model ([#2968](https://github.com/QuivrHQ/quivr/issues/2968)) ([1112001](https://github.com/QuivrHQ/quivr/commit/111200184b66dc42d75996c6c286474e9c5f8462))\n* add chat with models ([#2933](https://github.com/QuivrHQ/quivr/issues/2933)) ([fccd197](https://github.com/QuivrHQ/quivr/commit/fccd197511d8594db257bfddf757bf0d28f7239d))\n* Add get_model method to ModelRepository ([#2949](https://github.com/QuivrHQ/quivr/issues/2949)) ([13e9fc4](https://github.com/QuivrHQ/quivr/commit/13e9fc490bc62264de93d2efddf2389126c147fa))\n* **anthropic:** add llm ([#3146](https://github.com/QuivrHQ/quivr/issues/3146)) ([8e29218](https://github.com/QuivrHQ/quivr/commit/8e2921886505cea0e72d2e1136a4b8ba862c3ce1))\n* **azure:** quivr compatible with it ([#3005](https://github.com/QuivrHQ/quivr/issues/3005)) ([b5f31a8](https://github.com/QuivrHQ/quivr/commit/b5f31a83d4a1c4432943bbbaa0766c46927ef125))\n* **frontend:** talk with models and handle code markdown ([#2980](https://github.com/QuivrHQ/quivr/issues/2980)) ([ef6037e](https://github.com/QuivrHQ/quivr/commit/ef6037e665f8d5e9c513d889773419a25f914d83))\n* quivr core 0.1 ([#2970](https://github.com/QuivrHQ/quivr/issues/2970)) ([380cf82](https://github.com/QuivrHQ/quivr/commit/380cf8270678453c3dc14ac8665be9b3b5a49dce))\n* using langgraph in our RAG pipeline ([#3130](https://github.com/QuivrHQ/quivr/issues/3130)) ([8cfdf53](https://github.com/QuivrHQ/quivr/commit/8cfdf53fe748b884cf44ade274503de3966b1378))\n\n\n### Bug Fixes\n\n* **chat:** order of chat history was reversed ([#3148](https://github.com/QuivrHQ/quivr/issues/3148)) ([7209500](https://github.com/QuivrHQ/quivr/commit/7209500d0bdaec544fce1e8e9082de3ead4464f4))\n\n## [0.0.13](https://github.com/QuivrHQ/quivr/compare/core-0.0.12...core-0.0.13) (2024-08-01)\n\n\n### Features\n\n* quivr core tox test + parsers ([#2929](https://github.com/QuivrHQ/quivr/issues/2929)) ([6855585](https://github.com/QuivrHQ/quivr/commit/685558560cc431054fb9d1330c0e27ce5fdf1806))\n\n\n### Bug Fixes\n\n* processor quivr version ([#2934](https://github.com/QuivrHQ/quivr/issues/2934)) ([2d64962](https://github.com/QuivrHQ/quivr/commit/2d64962ca407d8f2c9e0faedc457548c3ff9921d))\n* quivr core fix tests ([#2935](https://github.com/QuivrHQ/quivr/issues/2935)) ([d9c1f3a](https://github.com/QuivrHQ/quivr/commit/d9c1f3add48f354d92f3a21c03eca53add30a773))\n\n## [0.0.12](https://github.com/QuivrHQ/quivr/compare/core-0.0.11...core-0.0.12) (2024-07-23)\n\n\n### Features\n\n* **dead-code:** removed composite & api ([#2902](https://github.com/QuivrHQ/quivr/issues/2902)) ([a2721d3](https://github.com/QuivrHQ/quivr/commit/a2721d3926df873e10817f948f8f10894ec6c581))\n* **frontend:** add knowledge icon when integration ([#2888](https://github.com/QuivrHQ/quivr/issues/2888)) ([733d083](https://github.com/QuivrHQ/quivr/commit/733d083e330fc6e41c089bb9c9cf76289040cab9))\n\n## [0.0.11](https://github.com/QuivrHQ/quivr/compare/core-0.0.10...core-0.0.11) (2024-07-22)\n\n\n### Features\n\n* move parsers quivr core ([#2884](https://github.com/QuivrHQ/quivr/issues/2884)) ([d3c53e6](https://github.com/QuivrHQ/quivr/commit/d3c53e63539bade5cbd716edf7e9af68ba15ed08))\n\n## [0.0.10](https://github.com/QuivrHQ/quivr/compare/core-0.0.9...core-0.0.10) (2024-07-19)\n\n\n### Features\n\n* **frontend:** new notifications design ([#2870](https://github.com/QuivrHQ/quivr/issues/2870)) ([ed97004](https://github.com/QuivrHQ/quivr/commit/ed9700426959f3c1502a882263dfb447411d5381))\n* **integrations:** dropbox ([#2864](https://github.com/QuivrHQ/quivr/issues/2864)) ([4806dc5](https://github.com/QuivrHQ/quivr/commit/4806dc5809aec9f7f573cb5adddac0e2d0ba600b))\n* quivr core brain info + processors registry +  ([#2877](https://github.com/QuivrHQ/quivr/issues/2877)) ([3001fa1](https://github.com/QuivrHQ/quivr/commit/3001fa1475cf119a8b41a176f735f5402f708738))\n\n\n### Bug Fixes\n\n* Refacto & update dropbox refresh ([#2875](https://github.com/QuivrHQ/quivr/issues/2875)) ([3b68855](https://github.com/QuivrHQ/quivr/commit/3b68855a83c72f3e31c117af0434330383a8a5d7))\n\n## [0.0.9](https://github.com/QuivrHQ/quivr/compare/core-0.0.8...core-0.0.9) (2024-07-15)\n\n\n### Features\n\n* quivr api use quivr core ([#2868](https://github.com/QuivrHQ/quivr/issues/2868)) ([9d3e9ed](https://github.com/QuivrHQ/quivr/commit/9d3e9edfd2ef24397458cc6556f6080673be96ae))\n\n\n### Bug Fixes\n\n* quiv core stream duplicate  and quivr-core rag tests ([#2852](https://github.com/QuivrHQ/quivr/issues/2852)) ([35eb07f](https://github.com/QuivrHQ/quivr/commit/35eb07f7a2664f65e482a78fabf242e1ccb36f07))\n\n## [0.0.8](https://github.com/QuivrHQ/quivr/compare/core-0.0.7...core-0.0.8) (2024-07-11)\n\n\n### Features\n\n* Add Quivr chatbot example ([#2827](https://github.com/QuivrHQ/quivr/issues/2827)) ([5ff8d4e](https://github.com/QuivrHQ/quivr/commit/5ff8d4ee81cdc5a2cf375a6b7709beb44da2b911))\n* Update aiofiles dependency to loosen version control ([#2834](https://github.com/QuivrHQ/quivr/issues/2834)) ([5e75d15](https://github.com/QuivrHQ/quivr/commit/5e75d155976dd710c65f9431e942cdeec9bd6424))\n\n## [0.0.7](https://github.com/QuivrHQ/quivr/compare/core-0.0.6...core-0.0.7) (2024-07-10)\n\n\n### Bug Fixes\n\n* llm model name ([#2830](https://github.com/QuivrHQ/quivr/issues/2830)) ([71d6cd9](https://github.com/QuivrHQ/quivr/commit/71d6cd9b6b381226a172a09c07a0a084d7efbc22))\n\n## [0.0.6](https://github.com/QuivrHQ/quivr/compare/core-0.0.5...core-0.0.6) (2024-07-10)\n\n\n### Features\n\n* quivr-core ask streaming ([#2828](https://github.com/QuivrHQ/quivr/issues/2828)) ([0658d49](https://github.com/QuivrHQ/quivr/commit/0658d4947c10f512d2ec2bdcfb70f089ab003a5c))\n\n## [0.0.5](https://github.com/QuivrHQ/quivr/compare/core-0.0.4...core-0.0.5) (2024-07-10)\n\n\n### Features\n\n* Add GitHub Actions workflow for running tests on backend/core ([#2820](https://github.com/QuivrHQ/quivr/issues/2820)) ([82292f3](https://github.com/QuivrHQ/quivr/commit/82292f30acf982bbf28c1ef928440086fa342a04))\n* Add GitHub Actions workflow for running tests on backend/core ([#2822](https://github.com/QuivrHQ/quivr/issues/2822)) ([1566040](https://github.com/QuivrHQ/quivr/commit/15660409a37af8df3c58a3f396614817c9f4641b))\n* quivr core chat history ([#2824](https://github.com/QuivrHQ/quivr/issues/2824)) ([847e161](https://github.com/QuivrHQ/quivr/commit/847e161d804421e60eb246f35bf51b7ffd88f3a2))\n\n## [0.0.4](https://github.com/QuivrHQ/quivr/compare/core-0.0.3...core-0.0.4) (2024-07-09)\n\n\n### Features\n\n* quivr core minimal chat ([#2818](https://github.com/QuivrHQ/quivr/issues/2818)) ([481f24f](https://github.com/QuivrHQ/quivr/commit/481f24f5bed855d044c97eb881512fbf936772f8))\n\n## [0.0.3](https://github.com/QuivrHQ/quivr/compare/core-0.0.2...core-0.0.3) (2024-07-09)\n\n\n### Bug Fixes\n\n* **pyproject:** fixed to quivr github ([#2816](https://github.com/QuivrHQ/quivr/issues/2816)) ([5a4ac00](https://github.com/QuivrHQ/quivr/commit/5a4ac001d0ba26af0c48aea7d9807c66b5fdd48d))\n\n## [0.0.2](https://github.com/QuivrHQ/quivr/compare/core-v0.0.1...core-0.0.2) (2024-07-09)\n\n\n### Features\n\n* **backend:** quivr-monorepo and quivr-core package ([#2765](https://github.com/QuivrHQ/quivr/issues/2765)) ([2e75de4](https://github.com/QuivrHQ/quivr/commit/2e75de40390bcc09f25037f19693989841fec70d))\n* quivr core minimal chat ([#2803](https://github.com/QuivrHQ/quivr/issues/2803)) ([1dc6d88](https://github.com/QuivrHQ/quivr/commit/1dc6d88f9b8b1b0c1a5682f990bf8098cbd54d77))\n"
  },
  {
    "path": "core/Dockerfile.test",
    "content": "# Using a slim version for a smaller base image\nFROM python:3.11.6-slim-bullseye\n\n# Install GEOS library, Rust, and other dependencies, then clean up\nRUN apt-get clean && apt-get update && apt-get install -y \\\n    curl \\\n    gcc \\\n    autoconf \\\n    automake \\\n    build-essential \\\n    # Additional dependencies for document handling\n    libmagic-dev \\\n    tesseract-ocr \\\n    poppler-utils \\\n    libreoffice \\\n    pandoc && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Set the working directory\nWORKDIR /code\n\n# Install Poetry\nRUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \\\n    cd /usr/local/bin && \\\n    ln -s /opt/poetry/bin/poetry && \\\n    poetry config virtualenvs.create false\n\n# Add Poetry to PATH\nENV PATH=\"/root/.local/bin:$PATH\"\n\n# Copy the current directory contents into the container at /app\nCOPY ./pyproject.toml ./poetry.lock* /code/\n\nRUN python3 -m pip install nltk && python3 -c \"import nltk; nltk.download('punkt')\" \\\n    && python3 -c \"import nltk; nltk.download('averaged_perceptron_tagger')\"\n\n# Install project dependencies\nRUN poetry install  --with test\n\nENV PYTHONPATH=/code\n"
  },
  {
    "path": "core/README.md",
    "content": "# quivr-core package\n\nThe RAG of Quivr.com\n\n## License 📄\n\nThis project is licensed under the Apache 2.0 License\n\n## Installation\n\n```bash\npip install quivr-core\n```\n\n\n\n\n"
  },
  {
    "path": "core/example_workflows/talk_to_file_rag_config_workflow.yaml",
    "content": "{\n  \"max_files\": 20,\n  \"llm_config\": { \"temperature\": 0.3, \"max_context_tokens\": 20000 },\n  \"max_history\": 10,\n  \"reranker_config\":\n    { \"model\": \"rerank-v3.5\", \"top_n\": 10, \"supplier\": \"cohere\" },\n  \"workflow_config\":\n    {\n      \"name\": \"Standard RAG\",\n      \"nodes\":\n        [\n          {\n            \"name\": \"START\",\n            \"edges\": [\"filter_history\"],\n            \"description\": \"Starting workflow\",\n          },\n          {\n            \"name\": \"filter_history\",\n            \"edges\": [\"retrieve\"],\n            \"description\": \"Filtering history\",\n          },\n          {\n            \"name\": \"retrieve\",\n            \"edges\": [\"retrieve_full_documents_context\"],\n            \"description\": \"Retrieving relevant information\",\n          },\n          {\n            \"name\": \"retrieve_full_documents_context\",\n            \"edges\": [\"generate_zendesk_rag\"],\n            \"description\": \"Retrieving full tickets context\",\n          },\n          {\n            \"name\": \"generate_zendesk_rag\",\n            \"edges\": [\"END\"],\n            \"description\": \"Generating answer\",\n          },\n        ],\n    },\n}\n"
  },
  {
    "path": "core/pyproject.toml",
    "content": "[project]\nname = \"quivr-core\"\nversion = \"0.0.33\"\ndescription = \"Quivr core RAG package\"\nauthors = [{ name = \"Stan Girard\", email = \"stan@quivr.app\" }]\ndependencies = [\n    \"pydantic>=2.8.2\",\n    \"langchain-core>=0.3,<0.4\",\n    \"langchain>=0.3.9,<0.4\",\n    \"langgraph>=0.2.38,<0.3\",\n    \"httpx>=0.27.0\",\n    \"rich>=13.7.1\",\n    \"tiktoken>=0.7.0\",\n    \"aiofiles>=23.1.0\",\n    \"langchain-openai>=0.3.0\",\n    \"langchain-cohere>=0.1.0\",\n    \"langchain-community>=0.3,<0.4\",\n    \"langchain-anthropic>=0.1.23\",\n    \"types-pyyaml>=6.0.12.20240808\",\n    \"transformers[sentencepiece]>=4.44.2\",\n    \"faiss-cpu>=1.8.0.post1\",\n    \"rapidfuzz>=3.10.1\",\n    \"markupsafe>=2.1.5\",\n    \"megaparse-sdk>=0.1.11\",\n    \"langchain-mistralai>=0.2.3\",\n    \"langchain-google-genai>=2.1.3\",\n    \"fasttext-langdetect>=1.0.5\",\n    \"langfuse>=2.57.0\",\n    \"langchain-groq>=0.3.2\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.11\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.rye]\nmanaged = true\ndev-dependencies = [\n    \"mypy>=1.11.1\",\n    \"pre-commit>=3.8.0\",\n    \"ipykernel>=6.29.5\",\n    \"ruff>=0.6.1\",\n    \"flake8>=7.1.1\",\n    \"flake8-black>=0.3.6\",\n    \"pytest-asyncio>=0.23.8\",\n    \"pytest>=8.3.2\",\n    \"pytest-xdist>=3.6.1\",\n    \"pytest-benchmark>=4.0.0\",\n]\n\n[tool.hatch.metadata]\nallow-direct-references = true\n\n[tool.hatch.build.targets.wheel]\npackages = [\"quivr_core\"]\n\n[tool.pytest.ini_options]\naddopts = \"--tb=short -ra -v\"\nfilterwarnings = [\"ignore::DeprecationWarning\"]\nmarkers = [\n    \"slow: marks tests as slow (deselect with '-m \\\"not slow\\\"')\",\n    \"base: these tests require quivr-core with extra `base` to be installed\",\n    \"tika: these tests require a tika server to be running\",\n    \"unstructured: these tests require `unstructured` dependency\",\n]\n\n[[tool.mypy.overrides]]\nmodule = \"yaml\"\nignore_missing_imports = true\n"
  },
  {
    "path": "core/quivr_core/__init__.py",
    "content": "from importlib.metadata import entry_points\n\nfrom .brain import Brain\nfrom .processor.registry import register_processor, registry\n\n__all__ = [\"Brain\", \"registry\", \"register_processor\"]\n\n\ndef register_entries():\n    if entry_points is not None:\n        try:\n            eps = entry_points()\n        except TypeError:\n            pass  # importlib-metadata < 0.8\n        else:\n            if hasattr(eps, \"select\"):  # Python 3.10+ / importlib_metadata >= 3.9.0\n                processors = eps.select(group=\"quivr_core.processor\")\n            else:\n                processors = eps.get(\"quivr_core.processor\", [])\n            registered_names = set()\n            for spec in processors:\n                err_msg = f\"Unable to load processor from {spec}\"\n                name = spec.name\n                if name in registered_names:\n                    continue\n                registered_names.add(name)\n                register_processor(\n                    name,\n                    spec.value.replace(\":\", \".\"),\n                    errtxt=err_msg,\n                    append=True,\n                )\n\n\nregister_entries()\n"
  },
  {
    "path": "core/quivr_core/base_config.py",
    "content": "from pathlib import Path\n\nimport yaml\nfrom pydantic import BaseModel, ConfigDict\nfrom typing import Self\n\n\nclass QuivrBaseConfig(BaseModel):\n    \"\"\"\n    Base configuration class for Quivr.\n\n    This class extends Pydantic's BaseModel and provides a foundation for\n    configuration management in quivr-core.\n\n    Attributes:\n        model_config (ConfigDict): Configuration for the Pydantic model.\n            It's set to forbid extra attributes, ensuring strict adherence\n            to the defined schema.\n\n    Class Methods:\n        from_yaml: Create an instance of the class from a YAML file.\n    \"\"\"\n\n    model_config = ConfigDict(extra=\"forbid\")\n\n    @classmethod\n    def from_yaml(cls, file_path: str | Path) -> Self:\n        \"\"\"\n        Create an instance of the class from a YAML file.\n\n        Args:\n            file_path (str | Path): The path to the YAML file.\n\n        Returns:\n            QuivrBaseConfig: An instance of the class initialized with the data from the YAML file.\n        \"\"\"\n        # Load the YAML file\n        with open(file_path, \"r\") as stream:\n            config_data = yaml.safe_load(stream)\n\n        # Instantiate the class using the YAML data\n        return cls(**config_data)\n"
  },
  {
    "path": "core/quivr_core/brain/__init__.py",
    "content": "from .brain import Brain\n\n__all__ = [\"Brain\"]\n"
  },
  {
    "path": "core/quivr_core/brain/brain.py",
    "content": "import asyncio\nimport logging\nimport os\nfrom pathlib import Path\nfrom pprint import PrettyPrinter\nfrom typing import Any, AsyncGenerator, Callable, Dict, Self, Type, Union\nfrom uuid import UUID, uuid4\n\nfrom langchain_core.documents import Document\nfrom langchain_core.embeddings import Embeddings\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.vectorstores import VectorStore\nfrom langchain_openai import OpenAIEmbeddings\nfrom rich.console import Console\nfrom rich.panel import Panel\n\nfrom quivr_core.brain.info import BrainInfo, ChatHistoryInfo\nfrom quivr_core.brain.serialization import (\n    BrainSerialized,\n    EmbedderConfig,\n    FAISSConfig,\n    LocalStorageConfig,\n    TransparentStorageConfig,\n)\nfrom quivr_core.files.file import load_qfile\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.processor.registry import get_processor_class\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.rag.entities.config import RetrievalConfig\nfrom quivr_core.rag.entities.models import (\n    LangchainMetadata,\n    ParsedRAGChunkResponse,\n    ParsedRAGResponse,\n    QuivrKnowledge,\n    SearchResult,\n)\nfrom quivr_core.rag.quivr_rag import QuivrQARAG\nfrom quivr_core.rag.quivr_rag_langgraph import QuivrQARAGLangGraph\nfrom quivr_core.storage.local_storage import LocalStorage, TransparentStorage\nfrom quivr_core.storage.storage_base import StorageBase\n\nfrom .brain_defaults import build_default_vectordb, default_embedder, default_llm\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nasync def process_files(\n    storage: StorageBase, skip_file_error: bool, **processor_kwargs: dict[str, Any]\n) -> list[Document]:\n    \"\"\"\n    Process files in storage.\n    This function takes a StorageBase and return a list of langchain documents.\n    Args:\n        storage (StorageBase): The storage containing the files to process.\n        skip_file_error (bool): Whether to skip files that cannot be processed.\n        processor_kwargs (dict[str, Any]): Additional arguments for the processor.\n    Returns:\n        list[Document]: List of processed documents in the Langchain Document format.\n    Raises:\n        ValueError: If a file cannot be processed and skip_file_error is False.\n        Exception: If no processor is found for a file of a specific type and skip_file_error is False.\n    \"\"\"\n\n    knowledge = []\n    for file in await storage.get_files():\n        try:\n            if file.file_extension:\n                processor_cls = get_processor_class(file.file_extension)\n                logger.debug(f\"processing {file} using class {processor_cls.__name__}\")\n                processor = processor_cls(**processor_kwargs)\n                docs = await processor.process_file(file)\n                knowledge.extend(docs)\n            else:\n                logger.error(f\"can't find processor for {file}\")\n                if skip_file_error:\n                    continue\n                else:\n                    raise ValueError(f\"can't parse {file}. can't find file extension\")\n        except KeyError as e:\n            if skip_file_error:\n                continue\n            else:\n                raise Exception(f\"Can't parse {file}. No available processor\") from e\n\n    return knowledge\n\n\nclass Brain:\n    \"\"\"\n    A class representing a Brain.\n    This class allows for the creation of a Brain, which is a collection of knowledge one wants to retrieve information from.\n    A Brain is set to:\n    * Store files in the storage of your choice (local, S3, etc.)\n    * Process the files in the storage to extract text and metadata in a wide range of format.\n    * Store the processed files in the vector store of your choice (FAISS, PGVector, etc.) - default to FAISS.\n    * Create an index of the processed files.\n    * Use the *Quivr* workflow for the retrieval augmented generation.\n    A Brain is able to:\n    * Search for information in the vector store.\n    * Answer questions about the knowledges in the Brain.\n    * Stream the answer to the question.\n    Attributes:\n        name (str): The name of the brain.\n        id (UUID): The unique identifier of the brain.\n        storage (StorageBase): The storage used to store the files.\n        llm (LLMEndpoint): The language model used to generate the answer.\n        vector_db (VectorStore): The vector store used to store the processed files.\n        embedder (Embeddings): The embeddings used to create the index of the processed files.\n    \"\"\"\n\n    def __init__(\n        self,\n        *,\n        name: str,\n        llm: LLMEndpoint,\n        id: UUID | None = None,\n        vector_db: VectorStore | None = None,\n        embedder: Embeddings | None = None,\n        storage: StorageBase | None = None,\n        workspace_id: UUID | None = None,\n        chat_id: UUID | None = None,\n    ):\n        self.id = id\n        self.name = name\n        self.storage = storage\n        self.workspace_id = workspace_id\n        self.chat_id = chat_id\n        # Chat history\n        self._chats = self._init_chats()\n        self.default_chat = list(self._chats.values())[0]\n\n        # RAG dependencies:\n        self.llm = llm\n        self.vector_db = vector_db\n        self.embedder = embedder\n\n    def __repr__(self) -> str:\n        pp = PrettyPrinter(width=80, depth=None, compact=False, sort_dicts=False)\n        return pp.pformat(self.info())\n\n    def print_info(self):\n        console = Console()\n        tree = self.info().to_tree()\n        panel = Panel(tree, title=\"Brain Info\", expand=False, border_style=\"bold\")\n        console.print(panel)\n\n    @classmethod\n    def load(cls, folder_path: str | Path) -> Self:\n        \"\"\"\n        Load a brain from a folder path.\n        Args:\n            folder_path (str | Path): The path to the folder containing the brain.\n        Returns:\n            Brain: The brain loaded from the folder path.\n        Example:\n        ```python\n        brain_loaded = Brain.load(\"path/to/brain\")\n        brain_loaded.print_info()\n        ```\n        \"\"\"\n        if isinstance(folder_path, str):\n            folder_path = Path(folder_path)\n        if not folder_path.exists():\n            raise ValueError(f\"path {folder_path} doesn't exist\")\n\n        # Load brainserialized\n        with open(os.path.join(folder_path, \"config.json\"), \"r\") as f:\n            bserialized = BrainSerialized.model_validate_json(f.read())\n\n        storage: StorageBase | None = None\n        # Loading storage\n        if bserialized.storage_config.storage_type == \"transparent_storage\":\n            storage = TransparentStorage.load(bserialized.storage_config)\n        elif bserialized.storage_config.storage_type == \"local_storage\":\n            storage = LocalStorage.load(bserialized.storage_config)\n        else:\n            raise ValueError(\"unknown storage\")\n\n        # Load Embedder\n        if bserialized.embedding_config.embedder_type == \"openai_embedding\":\n            from langchain_openai import OpenAIEmbeddings\n\n            embedder = OpenAIEmbeddings(**bserialized.embedding_config.config)\n        else:\n            raise ValueError(\"unknown embedder\")\n\n        # Load vector db\n        if bserialized.vectordb_config.vectordb_type == \"faiss\":\n            from langchain_community.vectorstores import FAISS\n\n            vector_db = FAISS.load_local(\n                folder_path=bserialized.vectordb_config.vectordb_folder_path,\n                embeddings=embedder,\n                allow_dangerous_deserialization=True,\n            )\n        else:\n            raise ValueError(\"Unsupported vectordb\")\n\n        return cls(\n            id=bserialized.id,\n            name=bserialized.name,\n            embedder=embedder,\n            llm=LLMEndpoint.from_config(bserialized.llm_config),\n            storage=storage,\n            vector_db=vector_db,\n        )\n\n    async def save(self, folder_path: str | Path):\n        \"\"\"\n        Save the brain to a folder path.\n        Args:\n            folder_path (str | Path): The path to the folder where the brain will be saved.\n        Returns:\n            str: The path to the folder where the brain was saved.\n        Example:\n        ```python\n        await brain.save(\"path/to/brain\")\n        ```\n        \"\"\"\n        if isinstance(folder_path, str):\n            folder_path = Path(folder_path)\n\n        brain_path = os.path.join(folder_path, f\"brain_{self.id}\")\n        os.makedirs(brain_path, exist_ok=True)\n\n        from langchain_community.vectorstores import FAISS\n\n        if isinstance(self.vector_db, FAISS):\n            vectordb_path = os.path.join(brain_path, \"vector_store\")\n            os.makedirs(vectordb_path, exist_ok=True)\n            self.vector_db.save_local(folder_path=vectordb_path)\n            vector_store = FAISSConfig(vectordb_folder_path=vectordb_path)\n        else:\n            raise Exception(\"can't serialize other vector stores for now\")\n\n        if isinstance(self.embedder, OpenAIEmbeddings):\n            embedder_config = EmbedderConfig(\n                config=self.embedder.dict(exclude={\"openai_api_key\"})\n            )\n        else:\n            raise Exception(\"can't serialize embedder other than openai for now\")\n\n        storage_config: Union[LocalStorageConfig, TransparentStorageConfig]\n        # TODO : each instance should know how to serialize/deserialize itself\n        if isinstance(self.storage, LocalStorage):\n            serialized_files = {\n                f.id: f.serialize() for f in await self.storage.get_files()\n            }\n            storage_config = LocalStorageConfig(\n                storage_path=self.storage.dir_path, files=serialized_files\n            )\n        elif isinstance(self.storage, TransparentStorage):\n            serialized_files = {\n                f.id: f.serialize() for f in await self.storage.get_files()\n            }\n            storage_config = TransparentStorageConfig(files=serialized_files)\n        else:\n            raise Exception(\"can't serialize storage. not supported for now\")\n\n        bserialized = BrainSerialized(\n            id=self.id,\n            name=self.name,\n            chat_history=self.chat_history.get_chat_history(),\n            llm_config=self.llm.get_config(),\n            vectordb_config=vector_store,\n            embedding_config=embedder_config,\n            storage_config=storage_config,\n        )\n\n        with open(os.path.join(brain_path, \"config.json\"), \"w\") as f:\n            f.write(bserialized.model_dump_json())\n        return brain_path\n\n    def info(self) -> BrainInfo:\n        # TODO: dim of embedding\n        # \"embedder\": {},\n        chats_info = ChatHistoryInfo(\n            nb_chats=len(self._chats),\n            current_default_chat=self.default_chat.id,\n            current_chat_history_length=len(self.default_chat),\n        )\n\n        return BrainInfo(\n            brain_id=self.id,\n            brain_name=self.name,\n            files_info=self.storage.info() if self.storage else None,\n            chats_info=chats_info,\n            llm_info=self.llm.info(),\n        )\n\n    @property\n    def chat_history(self) -> ChatHistory:\n        return self.default_chat\n\n    def _init_chats(self) -> Dict[UUID, ChatHistory]:\n        chat_id = uuid4()\n        default_chat = ChatHistory(chat_id=chat_id, brain_id=self.id)\n        return {chat_id: default_chat}\n\n    @classmethod\n    async def afrom_files(\n        cls,\n        *,\n        name: str,\n        file_paths: list[str | Path],\n        vector_db: VectorStore | None = None,\n        storage: StorageBase = TransparentStorage(),\n        llm: LLMEndpoint | None = None,\n        embedder: Embeddings | None = None,\n        skip_file_error: bool = False,\n        processor_kwargs: dict[str, Any] | None = None,\n    ):\n        \"\"\"\n        Create a brain from a list of file paths.\n        Args:\n            name (str): The name of the brain.\n            file_paths (list[str | Path]): The list of file paths to add to the brain.\n            vector_db (VectorStore | None): The vector store used to store the processed files.\n            storage (StorageBase): The storage used to store the files.\n            llm (LLMEndpoint | None): The language model used to generate the answer.\n            embedder (Embeddings | None): The embeddings used to create the index of the processed files.\n            skip_file_error (bool): Whether to skip files that cannot be processed.\n            processor_kwargs (dict[str, Any] | None): Additional arguments for the processor.\n        Returns:\n            Brain: The brain created from the file paths.\n        Example:\n        ```python\n        brain = await Brain.afrom_files(name=\"My Brain\", file_paths=[\"file1.pdf\", \"file2.pdf\"])\n        brain.print_info()\n        ```\n        \"\"\"\n        if llm is None:\n            llm = default_llm()\n\n        if embedder is None:\n            embedder = default_embedder()\n\n        processor_kwargs = processor_kwargs or {}\n\n        brain_id = uuid4()\n\n        # TODO: run in parallel using tasks\n\n        for path in file_paths:\n            file = await load_qfile(brain_id, path)\n            await storage.upload_file(file)\n\n        logger.debug(f\"uploaded all files to {storage}\")\n\n        # Parse files\n        docs = await process_files(\n            storage=storage,\n            skip_file_error=skip_file_error,\n            **processor_kwargs,\n        )\n\n        # Building brain's vectordb\n        if vector_db is None:\n            vector_db = await build_default_vectordb(docs, embedder)\n        else:\n            await vector_db.aadd_documents(docs)\n\n        logger.debug(f\"added {len(docs)} chunks to vectordb\")\n\n        return cls(\n            id=brain_id,\n            name=name,\n            storage=storage,\n            llm=llm,\n            embedder=embedder,\n            vector_db=vector_db,\n        )\n\n    @classmethod\n    def from_files(\n        cls,\n        *,\n        name: str,\n        file_paths: list[str | Path],\n        vector_db: VectorStore | None = None,\n        storage: StorageBase = TransparentStorage(),\n        llm: LLMEndpoint | None = None,\n        embedder: Embeddings | None = None,\n        skip_file_error: bool = False,\n        processor_kwargs: dict[str, Any] | None = None,\n    ) -> Self:\n        loop = asyncio.get_event_loop()\n        return loop.run_until_complete(\n            cls.afrom_files(\n                name=name,\n                file_paths=file_paths,\n                vector_db=vector_db,\n                storage=storage,\n                llm=llm,\n                embedder=embedder,\n                skip_file_error=skip_file_error,\n                processor_kwargs=processor_kwargs,\n            )\n        )\n\n    @classmethod\n    async def afrom_langchain_documents(\n        cls,\n        *,\n        name: str,\n        langchain_documents: list[Document],\n        vector_db: VectorStore | None = None,\n        storage: StorageBase = TransparentStorage(),\n        llm: LLMEndpoint | None = None,\n        embedder: Embeddings | None = None,\n    ) -> Self:\n        \"\"\"\n        Create a brain from a list of langchain documents.\n        Args:\n            name (str): The name of the brain.\n            langchain_documents (list[Document]): The list of langchain documents to add to the brain.\n            vector_db (VectorStore | None): The vector store used to store the processed files.\n            storage (StorageBase): The storage used to store the files.\n            llm (LLMEndpoint | None): The language model used to generate the answer.\n            embedder (Embeddings | None): The embeddings used to create the index of the processed files.\n        Returns:\n            Brain: The brain created from the langchain documents.\n        Example:\n        ```python\n        from langchain_core.documents import Document\n        documents = [Document(page_content=\"Hello, world!\")]\n        brain = await Brain.afrom_langchain_documents(name=\"My Brain\", langchain_documents=documents)\n        brain.print_info()\n        ```\n        \"\"\"\n\n        if llm is None:\n            llm = default_llm()\n\n        if embedder is None:\n            embedder = default_embedder()\n\n        brain_id = uuid4()\n\n        # Building brain's vectordb\n        if vector_db is None:\n            vector_db = await build_default_vectordb(langchain_documents, embedder)\n        else:\n            await vector_db.aadd_documents(langchain_documents)\n\n        return cls(\n            id=brain_id,\n            name=name,\n            storage=storage,\n            llm=llm,\n            embedder=embedder,\n            vector_db=vector_db,\n        )\n\n    async def asearch(\n        self,\n        query: str | Document,\n        n_results: int = 5,\n        filter: Callable | Dict[str, Any] | None = None,\n        fetch_n_neighbors: int = 20,\n    ) -> list[SearchResult]:\n        \"\"\"\n        Search for relevant documents in the brain based on a query.\n        Args:\n            query (str | Document): The query to search for.\n            n_results (int): The number of results to return.\n            filter (Callable | Dict[str, Any] | None): The filter to apply to the search.\n            fetch_n_neighbors (int): The number of neighbors to fetch.\n        Returns:\n            list[SearchResult]: The list of retrieved chunks.\n        Example:\n        ```python\n        brain = Brain.from_files(name=\"My Brain\", file_paths=[\"file1.pdf\", \"file2.pdf\"])\n        results = await brain.asearch(\"Why everybody loves Quivr?\")\n        for result in results:\n            print(result.chunk.page_content)\n        ```\n        \"\"\"\n        if not self.vector_db:\n            raise ValueError(\"No vector db configured for this brain\")\n\n        result = await self.vector_db.asimilarity_search_with_score(\n            query, k=n_results, filter=filter, fetch_k=fetch_n_neighbors\n        )\n\n        return [SearchResult(chunk=d, distance=s) for d, s in result]\n\n    def get_chat_history(self, chat_id: UUID):\n        return self._chats[chat_id]\n\n    # TODO(@aminediro)\n    def add_file(self) -> None:\n        # add it to storage\n        # add it to vectorstore\n        raise NotImplementedError\n\n    async def ask_streaming(\n        self,\n        question: str,\n        run_id: UUID,\n        system_prompt: str | None = None,\n        retrieval_config: RetrievalConfig | None = None,\n        rag_pipeline: Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None = None,\n        list_files: list[QuivrKnowledge] | None = None,\n        chat_history: ChatHistory | None = None,\n        **input_kwargs,\n    ) -> AsyncGenerator[ParsedRAGChunkResponse, ParsedRAGChunkResponse]:\n        \"\"\"\n        Ask a question to the brain and get a streamed generated answer.\n        Args:\n            question (str): The question to ask.\n            retrieval_config (RetrievalConfig | None): The retrieval configuration (see RetrievalConfig docs).\n            rag_pipeline (Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None): The RAG pipeline to use.\n        list_files (list[QuivrKnowledge] | None): The list of files to include in the RAG pipeline.\n            chat_history (ChatHistory | None): The chat history to use.\n        Returns:\n            AsyncGenerator[ParsedRAGChunkResponse, ParsedRAGChunkResponse]: The streamed generated answer.\n        Example:\n        ```python\n        brain = Brain.from_files(name=\"My Brain\", file_paths=[\"file1.pdf\", \"file2.pdf\"])\n        async for chunk in brain.ask_streaming(\"What is the meaning of life?\"):\n            print(chunk.answer)\n        ```\n        \"\"\"\n        llm = self.llm\n\n        # If you passed a different llm model we'll override the brain  one\n        if retrieval_config:\n            if retrieval_config.llm_config != self.llm.get_config():\n                llm = LLMEndpoint.from_config(config=retrieval_config.llm_config)\n        else:\n            retrieval_config = RetrievalConfig(llm_config=self.llm.get_config())\n\n        rag_instance = QuivrQARAGLangGraph(\n            retrieval_config=retrieval_config, llm=llm, vector_store=self.vector_db\n        )\n\n        chat_history = self.default_chat if chat_history is None else chat_history\n        list_files = [] if list_files is None else list_files\n\n        full_answer = \"\"\n\n        metadata = LangchainMetadata(\n            langfuse_trace_id=str(run_id),\n            langfuse_user_id=str(self.workspace_id),\n            langfuse_session_id=str(self.chat_id),\n        )\n\n        async for response in rag_instance.answer_astream(\n            run_id=run_id,\n            question=question,\n            system_prompt=system_prompt or None,\n            history=chat_history,\n            list_files=list_files,\n            metadata=metadata,\n            **input_kwargs,\n        ):\n            # Format output to be correct servicedf;j\n            if not response.last_chunk:\n                yield response\n            full_answer += response.answer\n\n        # TODO : add sources, metdata etc  ...\n        chat_history.append(HumanMessage(content=question))\n        chat_history.append(AIMessage(content=full_answer))\n        yield response\n\n    async def aask(\n        self,\n        run_id: UUID,\n        question: str,\n        system_prompt: str | None = None,\n        retrieval_config: RetrievalConfig | None = None,\n        rag_pipeline: Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None = None,\n        list_files: list[QuivrKnowledge] | None = None,\n        chat_history: ChatHistory | None = None,\n        **input_kwargs,\n    ) -> ParsedRAGResponse:\n        \"\"\"\n        Synchronous version that asks a question to the brain and gets a generated answer.\n        Args:\n            question (str): The question to ask.\n            retrieval_config (RetrievalConfig | None): The retrieval configuration (see RetrievalConfig docs).\n            rag_pipeline (Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None): The RAG pipeline to use.\n            list_files (list[QuivrKnowledge] | None): The list of files to include in the RAG pipeline.\n            chat_history (ChatHistory | None): The chat history to use.\n        Returns:\n            ParsedRAGResponse: The generated answer.\n        \"\"\"\n        # question_language = detect_language(question) -- Commented until we use it\n        full_answer = \"\"\n        metadata = None\n\n        async for response in self.ask_streaming(\n            run_id=run_id,\n            question=question,\n            system_prompt=system_prompt,\n            retrieval_config=retrieval_config,\n            rag_pipeline=rag_pipeline,\n            list_files=list_files,\n            chat_history=chat_history,\n            **input_kwargs,\n        ):\n            full_answer += response.answer\n            if response.metadata:\n                metadata = response.metadata\n\n        return ParsedRAGResponse(answer=full_answer, metadata=metadata)\n\n    def ask(\n        self,\n        run_id: UUID,\n        question: str,\n        system_prompt: str | None = None,\n        retrieval_config: RetrievalConfig | None = None,\n        rag_pipeline: Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None = None,\n        list_files: list[QuivrKnowledge] | None = None,\n        chat_history: ChatHistory | None = None,\n    ) -> ParsedRAGResponse:\n        \"\"\"\n        Fully synchronous version that asks a question to the brain and gets a generated answer.\n        Args:\n            question (str): The question to ask.\n            system_prompt (str | None): The system prompt to use.\n            retrieval_config (RetrievalConfig | None): The retrieval configuration (see RetrievalConfig docs).\n            rag_pipeline (Type[Union[QuivrQARAG, QuivrQARAGLangGraph]] | None): The RAG pipeline to use.\n            list_files (list[QuivrKnowledge] | None): The list of files to include in the RAG pipeline.\n            chat_history (ChatHistory | None): The chat history to use.\n        Returns:\n            ParsedRAGResponse: The generated answer.\n        \"\"\"\n        loop = asyncio.get_event_loop()\n        return loop.run_until_complete(\n            self.aask(\n                run_id=run_id,\n                question=question,\n                system_prompt=system_prompt,\n                retrieval_config=retrieval_config,\n                rag_pipeline=rag_pipeline,\n                list_files=list_files,\n                chat_history=chat_history,\n            )\n        )\n"
  },
  {
    "path": "core/quivr_core/brain/brain_defaults.py",
    "content": "import logging\n\nfrom langchain_core.documents import Document\nfrom langchain_core.embeddings import Embeddings\nfrom langchain_core.vectorstores import VectorStore\n\nfrom quivr_core.rag.entities.config import DefaultModelSuppliers, LLMEndpointConfig\nfrom quivr_core.llm import LLMEndpoint\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nasync def build_default_vectordb(\n    docs: list[Document], embedder: Embeddings\n) -> VectorStore:\n    try:\n        from langchain_community.vectorstores import FAISS\n\n        logger.debug(\"Using Faiss-CPU as vector store.\")\n        # TODO(@aminediro) : embedding call is usually not concurrent for all documents but waits\n        if len(docs) > 0:\n            vector_db = await FAISS.afrom_documents(documents=docs, embedding=embedder)\n            return vector_db\n        else:\n            raise ValueError(\"can't initialize brain without documents\")\n\n    except ImportError as e:\n        raise ImportError(\n            \"Please provide a valid vector store or install quivr-core['base'] package for using the default one.\"\n        ) from e\n\n\ndef default_embedder() -> Embeddings:\n    try:\n        from langchain_openai import OpenAIEmbeddings\n\n        logger.debug(\"Loaded OpenAIEmbeddings as default LLM for brain\")\n        embedder = OpenAIEmbeddings()\n        return embedder\n    except ImportError as e:\n        raise ImportError(\n            \"Please provide a valid Embedder or install quivr-core['base'] package for using the defaultone.\"\n        ) from e\n\n\ndef default_llm() -> LLMEndpoint:\n    try:\n        logger.debug(\"Loaded ChatOpenAI as default LLM for brain\")\n        llm = LLMEndpoint.from_config(\n            LLMEndpointConfig(supplier=DefaultModelSuppliers.OPENAI, model=\"gpt-4o\")\n        )\n        return llm\n\n    except ImportError as e:\n        raise ImportError(\n            \"Please provide a valid BaseLLM or install quivr-core['base'] package\"\n        ) from e\n"
  },
  {
    "path": "core/quivr_core/brain/info.py",
    "content": "from dataclasses import dataclass\nfrom uuid import UUID\n\nfrom rich.tree import Tree\n\n\n@dataclass\nclass ChatHistoryInfo:\n    nb_chats: int\n    current_default_chat: UUID\n    current_chat_history_length: int\n\n    def add_to_tree(self, chats_tree: Tree):\n        chats_tree.add(f\"Number of Chats: [bold]{self.nb_chats}[/bold]\")\n        chats_tree.add(\n            f\"Current Default Chat: [bold magenta]{self.current_default_chat}[/bold magenta]\"\n        )\n        chats_tree.add(\n            f\"Current Chat History Length: [bold]{self.current_chat_history_length}[/bold]\"\n        )\n\n\n@dataclass\nclass LLMInfo:\n    model: str\n    llm_base_url: str\n    temperature: float\n    max_tokens: int\n    supports_function_calling: int\n\n    def add_to_tree(self, llm_tree: Tree):\n        llm_tree.add(f\"Model: [italic]{self.model}[/italic]\")\n        llm_tree.add(f\"Base URL: [underline]{self.llm_base_url}[/underline]\")\n        llm_tree.add(f\"Temperature: [bold]{self.temperature}[/bold]\")\n        llm_tree.add(f\"Max Tokens: [bold]{self.max_tokens}[/bold]\")\n        func_call_color = \"green\" if self.supports_function_calling else \"red\"\n        llm_tree.add(\n            f\"Supports Function Calling: [bold {func_call_color}]{self.supports_function_calling}[/bold {func_call_color}]\"\n        )\n\n\n@dataclass\nclass StorageInfo:\n    storage_type: str\n    n_files: int\n\n    def add_to_tree(self, files_tree: Tree):\n        files_tree.add(f\"Storage Type: [italic]{self.storage_type}[/italic]\")\n        files_tree.add(f\"Number of Files: [bold]{self.n_files}[/bold]\")\n\n\n@dataclass\nclass BrainInfo:\n    brain_id: UUID\n    brain_name: str\n    chats_info: ChatHistoryInfo\n    llm_info: LLMInfo\n    files_info: StorageInfo | None = None\n\n    def to_tree(self):\n        tree = Tree(\"📊 Brain Information\")\n        tree.add(f\"🆔 ID: [bold cyan]{self.brain_id}[/bold cyan]\")\n        tree.add(f\"🧠 Brain Name: [bold green]{self.brain_name}[/bold green]\")\n\n        if self.files_info:\n            files_tree = tree.add(\"📁 Files\")\n            self.files_info.add_to_tree(files_tree)\n\n        chats_tree = tree.add(\"💬 Chats\")\n        self.chats_info.add_to_tree(chats_tree)\n\n        llm_tree = tree.add(\"🤖 LLM\")\n        self.llm_info.add_to_tree(llm_tree)\n        return tree\n"
  },
  {
    "path": "core/quivr_core/brain/serialization.py",
    "content": "from pathlib import Path\nfrom typing import Any, Dict, Literal, Union\nfrom uuid import UUID\n\nfrom pydantic import BaseModel, Field, SecretStr\n\nfrom quivr_core.rag.entities.config import LLMEndpointConfig\nfrom quivr_core.rag.entities.models import ChatMessage\nfrom quivr_core.files.file import QuivrFileSerialized\n\n\nclass EmbedderConfig(BaseModel):\n    embedder_type: Literal[\"openai_embedding\"] = \"openai_embedding\"\n    # TODO: type this correctly\n    config: Dict[str, Any]\n\n\nclass PGVectorConfig(BaseModel):\n    vectordb_type: Literal[\"pgvector\"] = \"pgvector\"\n    pg_url: str\n    pg_user: str\n    pg_psswd: SecretStr\n    table_name: str\n    vector_dim: int\n\n\nclass FAISSConfig(BaseModel):\n    vectordb_type: Literal[\"faiss\"] = \"faiss\"\n    vectordb_folder_path: str\n\n\nclass LocalStorageConfig(BaseModel):\n    storage_type: Literal[\"local_storage\"] = \"local_storage\"\n    storage_path: Path\n    files: dict[UUID, QuivrFileSerialized]\n\n\nclass TransparentStorageConfig(BaseModel):\n    storage_type: Literal[\"transparent_storage\"] = \"transparent_storage\"\n    files: dict[UUID, QuivrFileSerialized]\n\n\nclass BrainSerialized(BaseModel):\n    id: UUID\n    name: str\n    chat_history: list[ChatMessage]\n    vectordb_config: Union[FAISSConfig, PGVectorConfig] = Field(\n        ..., discriminator=\"vectordb_type\"\n    )\n    storage_config: Union[TransparentStorageConfig, LocalStorageConfig] = Field(\n        ..., discriminator=\"storage_type\"\n    )\n\n    llm_config: LLMEndpointConfig\n    embedding_config: EmbedderConfig\n"
  },
  {
    "path": "core/quivr_core/config.py",
    "content": "from enum import Enum\n\nimport yaml\nfrom pydantic import BaseModel\n\n\nclass ParserType(str, Enum):\n    \"\"\"Parser type enumeration.\"\"\"\n\n    UNSTRUCTURED = \"unstructured\"\n    LLAMA_PARSER = \"llama_parser\"\n    MEGAPARSE_VISION = \"megaparse_vision\"\n\n\nclass StrategyEnum(str, Enum):\n    \"\"\"Method to use for the conversion\"\"\"\n\n    FAST = \"fast\"\n    AUTO = \"auto\"\n    HI_RES = \"hi_res\"\n\n\nclass MegaparseBaseConfig(BaseModel):\n    @classmethod\n    def from_yaml(cls, file_path: str):\n        # Load the YAML file\n        with open(file_path, \"r\") as stream:\n            config_data = yaml.safe_load(stream)\n\n        # Instantiate the class using the YAML data\n        return cls(**config_data)\n\n\nclass MegaparseConfig(MegaparseBaseConfig):\n    method: ParserType = ParserType.UNSTRUCTURED\n    strategy: StrategyEnum = StrategyEnum.FAST\n    check_table: bool = False\n    parsing_instruction: str | None = None\n    model_name: str = \"gpt-4o\"\n"
  },
  {
    "path": "core/quivr_core/files/__init__.py",
    "content": "from .file import QuivrFile\n\n__all__ = [\"QuivrFile\"]\n"
  },
  {
    "path": "core/quivr_core/files/file.py",
    "content": "import hashlib\nimport mimetypes\nimport os\nimport warnings\nfrom contextlib import asynccontextmanager\nfrom enum import Enum\nfrom pathlib import Path\nfrom typing import Any, AsyncGenerator, AsyncIterable, Self\nfrom uuid import UUID, uuid4\n\nimport aiofiles\nfrom openai import BaseModel\n\n\nclass QuivrFileSerialized(BaseModel):\n    id: UUID\n    brain_id: UUID\n    path: Path\n    original_filename: str\n    file_size: int | None\n    file_extension: str\n    file_sha1: str\n    additional_metadata: dict[str, Any]\n\n\nclass FileExtension(str, Enum):\n    txt = \".txt\"\n    pdf = \".pdf\"\n    csv = \".csv\"\n    doc = \".doc\"\n    docx = \".docx\"\n    pptx = \".pptx\"\n    xls = \".xls\"\n    xlsx = \".xlsx\"\n    md = \".md\"\n    mdx = \".mdx\"\n    markdown = \".markdown\"\n    bib = \".bib\"\n    epub = \".epub\"\n    html = \".html\"\n    odt = \".odt\"\n    py = \".py\"\n    ipynb = \".ipynb\"\n    m4a = \".m4a\"\n    mp3 = \".mp3\"\n    webm = \".webm\"\n    mp4 = \".mp4\"\n    mpga = \".mpga\"\n    wav = \".wav\"\n    mpeg = \".mpeg\"\n\n\ndef get_file_extension(file_path: Path) -> FileExtension | str:\n    try:\n        mime_type, _ = mimetypes.guess_type(file_path.name)\n        if mime_type:\n            mime_ext = mimetypes.guess_extension(mime_type)\n            if mime_ext:\n                return FileExtension(mime_ext)\n        return FileExtension(file_path.suffix)\n    except ValueError:\n        warnings.warn(\n            f\"File {file_path.name} extension isn't recognized. Make sure you have registered a parser for {file_path.suffix}\",\n            stacklevel=2,\n        )\n        return file_path.suffix\n\n\nasync def load_qfile(brain_id: UUID, path: str | Path):\n    if not isinstance(path, Path):\n        path = Path(path)\n\n    if not path.exists():\n        raise FileExistsError(f\"file {path} doesn't exist\")\n\n    file_size = os.stat(path).st_size\n\n    async with aiofiles.open(path, mode=\"rb\") as f:\n        file_sha1 = hashlib.sha1(await f.read()).hexdigest()\n\n    try:\n        # NOTE: when loading from existing storage, file name will be uuid\n        id = UUID(path.name)\n    except ValueError:\n        id = uuid4()\n\n    return QuivrFile(\n        id=id,\n        brain_id=brain_id,\n        path=path,\n        original_filename=path.name,\n        file_extension=get_file_extension(path),\n        file_size=file_size,\n        file_sha1=file_sha1,\n    )\n\n\nclass QuivrFile:\n    __slots__ = [\n        \"id\",\n        \"brain_id\",\n        \"path\",\n        \"original_filename\",\n        \"file_size\",\n        \"file_extension\",\n        \"file_sha1\",\n        \"additional_metadata\",\n    ]\n\n    def __init__(\n        self,\n        id: UUID,\n        original_filename: str,\n        path: Path,\n        file_sha1: str,\n        file_extension: FileExtension | str,\n        brain_id: UUID | None = None,\n        file_size: int | None = None,\n        metadata: dict[str, Any] | None = None,\n    ) -> None:\n        self.id = id\n        self.brain_id = brain_id\n        self.path = path\n        self.original_filename = original_filename\n        self.file_size = file_size\n        self.file_extension = file_extension\n        self.file_sha1 = file_sha1\n        self.additional_metadata = metadata if metadata else {}\n\n    def __repr__(self) -> str:\n        return f\"QuivrFile-{self.id} original_filename:{self.original_filename}\"\n\n    @asynccontextmanager\n    async def open(self) -> AsyncGenerator[AsyncIterable[bytes], None]:\n        # TODO(@aminediro) : match on path type\n        f = await aiofiles.open(self.path, mode=\"rb\")\n        try:\n            yield f\n        finally:\n            await f.close()\n\n    @property\n    def metadata(self) -> dict[str, Any]:\n        return {\n            \"qfile_id\": self.id,\n            \"qfile_path\": self.path,\n            \"original_file_name\": self.original_filename,\n            \"file_sha1\": self.file_sha1,\n            \"file_size\": self.file_size,\n            **self.additional_metadata,\n        }\n\n    def serialize(self) -> QuivrFileSerialized:\n        return QuivrFileSerialized(\n            id=self.id,\n            brain_id=self.brain_id,\n            path=self.path.absolute(),\n            original_filename=self.original_filename,\n            file_size=self.file_size,\n            file_extension=self.file_extension,\n            file_sha1=self.file_sha1,\n            additional_metadata=self.additional_metadata,\n        )\n\n    @classmethod\n    def deserialize(cls, serialized: QuivrFileSerialized) -> Self:\n        return cls(\n            id=serialized.id,\n            brain_id=serialized.brain_id,\n            path=serialized.path,\n            original_filename=serialized.original_filename,\n            file_size=serialized.file_size,\n            file_extension=serialized.file_extension,\n            file_sha1=serialized.file_sha1,\n            metadata=serialized.additional_metadata,\n        )\n"
  },
  {
    "path": "core/quivr_core/language/models.py",
    "content": "from enum import Enum\n\n\nclass Language(str, Enum):\n    AF = \"af\"  # Afrikaans\n    ALS = \"als\"  # Alemannic\n    AM = \"am\"  # Amharic\n    AN = \"an\"  # Aragonese\n    AR = \"ar\"  # Arabic\n    ARZ = \"arz\"  # Egyptian Arabic\n    AS = \"as\"  # Assamese\n    AST = \"ast\"  # Asturian\n    AV = \"av\"  # Avaric\n    AZ = \"az\"  # Azerbaijani\n    AZB = \"azb\"  # South Azerbaijani\n    BA = \"ba\"  # Bashkir\n    BAR = \"bar\"  # Bavarian\n    BCL = \"bcl\"  # Central Bikol\n    BE = \"be\"  # Belarusian\n    BG = \"bg\"  # Bulgarian\n    BH = \"bh\"  # Bihari\n    BN = \"bn\"  # Bengali\n    BO = \"bo\"  # Tibetan\n    BPY = \"bpy\"  # Bishnupriya Manipuri\n    BR = \"br\"  # Breton\n    BS = \"bs\"  # Bosnian\n    BXR = \"bxr\"  # Buryat\n    CA = \"ca\"  # Catalan\n    CBK = \"cbk\"  # Chavacano\n    CE = \"ce\"  # Chechen\n    CEB = \"ceb\"  # Cebuano\n    CKB = \"ckb\"  # Central Kurdish\n    CO = \"co\"  # Corsican\n    CS = \"cs\"  # Czech\n    CV = \"cv\"  # Chuvash\n    CY = \"cy\"  # Welsh\n    DA = \"da\"  # Danish\n    DE = \"de\"  # German\n    DIQ = \"diq\"  # Zazaki\n    DSB = \"dsb\"  # Lower Sorbian\n    DTY = \"dty\"  # Doteli\n    DV = \"dv\"  # Dhivehi\n    EL = \"el\"  # Greek\n    EML = \"eml\"  # Emilian-Romagnol\n    EN = \"en\"  # English\n    EO = \"eo\"  # Esperanto\n    ES = \"es\"  # Spanish\n    ET = \"et\"  # Estonian\n    EU = \"eu\"  # Basque\n    FA = \"fa\"  # Persian\n    FI = \"fi\"  # Finnish\n    FR = \"fr\"  # French\n    FRR = \"frr\"  # North Frisian\n    FY = \"fy\"  # Western Frisian\n    GA = \"ga\"  # Irish\n    GD = \"gd\"  # Scottish Gaelic\n    GL = \"gl\"  # Galician\n    GN = \"gn\"  # Guarani\n    GOM = \"gom\"  # Goan Konkani\n    GU = \"gu\"  # Gujarati\n    GV = \"gv\"  # Manx\n    HE = \"he\"  # Hebrew\n    HI = \"hi\"  # Hindi\n    HIF = \"hif\"  # Fiji Hindi\n    HR = \"hr\"  # Croatian\n    HSB = \"hsb\"  # Upper Sorbian\n    HT = \"ht\"  # Haitian Creole\n    HU = \"hu\"  # Hungarian\n    HY = \"hy\"  # Armenian\n    IA = \"ia\"  # Interlingua\n    ID = \"id\"  # Indonesian\n    IE = \"ie\"  # Interlingue\n    ILO = \"ilo\"  # Iloko\n    IO = \"io\"  # Ido\n    IS = \"is\"  # Icelandic\n    IT = \"it\"  # Italian\n    JA = \"ja\"  # Japanese\n    JBO = \"jbo\"  # Lojban\n    JV = \"jv\"  # Javanese\n    KA = \"ka\"  # Georgian\n    KK = \"kk\"  # Kazakh\n    KM = \"km\"  # Khmer\n    KN = \"kn\"  # Kannada\n    KO = \"ko\"  # Korean\n    KRC = \"krc\"  # Karachay-Balkar\n    KU = \"ku\"  # Kurdish\n    KV = \"kv\"  # Komi\n    KW = \"kw\"  # Cornish\n    KY = \"ky\"  # Kyrgyz\n    LA = \"la\"  # Latin\n    LB = \"lb\"  # Luxembourgish\n    LEZ = \"lez\"  # Lezghian\n    LI = \"li\"  # Limburgish\n    LMO = \"lmo\"  # Lombard\n    LO = \"lo\"  # Lao\n    LRC = \"lrc\"  # Northern Luri\n    LT = \"lt\"  # Lithuanian\n    LV = \"lv\"  # Latvian\n    MAI = \"mai\"  # Maithili\n    MG = \"mg\"  # Malagasy\n    MHR = \"mhr\"  # Eastern Mari\n    MIN = \"min\"  # Minangkabau\n    MK = \"mk\"  # Macedonian\n    ML = \"ml\"  # Malayalam\n    MN = \"mn\"  # Mongolian\n    MR = \"mr\"  # Marathi\n    MRJ = \"mrj\"  # Western Mari\n    MS = \"ms\"  # Malay\n    MT = \"mt\"  # Maltese\n    MWL = \"mwl\"  # Mirandese\n    MY = \"my\"  # Burmese\n    MYV = \"myv\"  # Erzya\n    MZN = \"mzn\"  # Mazanderani\n    NAH = \"nah\"  # Nahuatl\n    NAP = \"nap\"  # Neapolitan\n    NDS = \"nds\"  # Low German\n    NE = \"ne\"  # Nepali\n    NEW = \"new\"  # Newari\n    NL = \"nl\"  # Dutch\n    NN = \"nn\"  # Norwegian Nynorsk\n    NO = \"no\"  # Norwegian\n    OC = \"oc\"  # Occitan\n    OR = \"or\"  # Odia\n    OS = \"os\"  # Ossetian\n    PA = \"pa\"  # Punjabi\n    PAM = \"pam\"  # Pampanga\n    PFL = \"pfl\"  # Palatine German\n    PL = \"pl\"  # Polish\n    PMS = \"pms\"  # Piedmontese\n    PNB = \"pnb\"  # Western Punjabi\n    PS = \"ps\"  # Pashto\n    PT = \"pt\"  # Portuguese\n    QU = \"qu\"  # Quechua\n    RM = \"rm\"  # Romansh\n    RO = \"ro\"  # Romanian\n    RU = \"ru\"  # Russian\n    RUE = \"rue\"  # Rusyn\n    SA = \"sa\"  # Sanskrit\n    SAH = \"sah\"  # Yakut\n    SC = \"sc\"  # Sardinian\n    SCN = \"scn\"  # Sicilian\n    SCO = \"sco\"  # Scots\n    SD = \"sd\"  # Sindhi\n    SH = \"sh\"  # Serbo-Croatian\n    SI = \"si\"  # Sinhala\n    SK = \"sk\"  # Slovak\n    SL = \"sl\"  # Slovenian\n    SO = \"so\"  # Somali\n    SQ = \"sq\"  # Albanian\n    SR = \"sr\"  # Serbian\n    SU = \"su\"  # Sundanese\n    SV = \"sv\"  # Swedish\n    SW = \"sw\"  # Swahili\n    TA = \"ta\"  # Tamil\n    TE = \"te\"  # Telugu\n    TG = \"tg\"  # Tajik\n    TH = \"th\"  # Thai\n    TK = \"tk\"  # Turkmen\n    TL = \"tl\"  # Tagalog\n    TR = \"tr\"  # Turkish\n    TT = \"tt\"  # Tatar\n    TYV = \"tyv\"  # Tuvan\n    UG = \"ug\"  # Uyghur\n    UK = \"uk\"  # Ukrainian\n    UR = \"ur\"  # Urdu\n    UZ = \"uz\"  # Uzbek\n    VEC = \"vec\"  # Venetian\n    VEP = \"vep\"  # Veps\n    VI = \"vi\"  # Vietnamese\n    VLS = \"vls\"  # West Flemish\n    VO = \"vo\"  # Volapük\n    WA = \"wa\"  # Walloon\n    WAR = \"war\"  # Waray\n    WUU = \"wuu\"  # Wu Chinese\n    XAL = \"xal\"  # Kalmyk\n    XMF = \"xmf\"  # Mingrelian\n    YI = \"yi\"  # Yiddish\n    YO = \"yo\"  # Yoruba\n    YUE = \"yue\"  # Cantonese\n    ZH = \"zh\"  # Chinese\n    UNKNOWN = \"unknown\"  # Unknown\n"
  },
  {
    "path": "core/quivr_core/language/utils.py",
    "content": "from ftlangdetect import detect\nfrom quivr_core.language.models import Language\n\n\ndef detect_language(text: str, low_memory: bool = True) -> Language:\n    detected_lang = detect(text=text, low_memory=low_memory)\n    try:\n        detected_language = Language(detected_lang[\"lang\"])\n    except ValueError:\n        return Language.UNKNOWN\n\n    return detected_language\n"
  },
  {
    "path": "core/quivr_core/llm/__init__.py",
    "content": "from .llm_endpoint import LLMEndpoint\n\n__all__ = [\"LLMEndpoint\"]\n"
  },
  {
    "path": "core/quivr_core/llm/llm_endpoint.py",
    "content": "import logging\nimport os\nimport time\nfrom typing import Union\nfrom urllib.parse import parse_qs, urlparse\n\nimport tiktoken\nfrom langchain_anthropic import ChatAnthropic\nfrom langchain_core.language_models.chat_models import BaseChatModel\nfrom langchain_google_genai import ChatGoogleGenerativeAI\nfrom langchain_groq import ChatGroq\nfrom langchain_mistralai import ChatMistralAI\nfrom langchain_openai import AzureChatOpenAI, ChatOpenAI\nfrom pydantic import SecretStr\n\nfrom quivr_core.brain.info import LLMInfo\nfrom quivr_core.rag.entities.config import DefaultModelSuppliers, LLMEndpointConfig\nfrom quivr_core.rag.utils import model_supports_function_calling\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nclass LLMTokenizer:\n    _cache: dict[\n        int, tuple[\"LLMTokenizer\", int, float]\n    ] = {}  # {hash: (tokenizer, size_bytes, last_access_time)}\n    _max_cache_size_mb: int = 50\n    _max_cache_count: int = 5  # Default maximum number of cached tokenizers\n    _current_cache_size: int = 0\n    _default_size: int = 5 * 1024 * 1024\n\n    def __init__(self, tokenizer_hub: str | None, fallback_tokenizer: str):\n        self.tokenizer_hub = tokenizer_hub\n        self.fallback_tokenizer = fallback_tokenizer\n\n        if self.tokenizer_hub:\n            # To prevent the warning\n            # huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n            os.environ[\"TOKENIZERS_PARALLELISM\"] = (\n                \"false\"\n                if not os.environ.get(\"TOKENIZERS_PARALLELISM\")\n                else os.environ[\"TOKENIZERS_PARALLELISM\"]\n            )\n            try:\n                if \"text-embedding-ada-002\" in self.tokenizer_hub:\n                    from transformers import GPT2TokenizerFast\n\n                    self.tokenizer = GPT2TokenizerFast.from_pretrained(\n                        self.tokenizer_hub\n                    )\n                else:\n                    from transformers import AutoTokenizer\n\n                    self.tokenizer = AutoTokenizer.from_pretrained(self.tokenizer_hub)\n            except OSError:  # if we don't manage to connect to huggingface and/or no cached models are present\n                logger.warning(\n                    f\"Cannot acces the configured tokenizer from {self.tokenizer_hub}, using the default tokenizer {self.fallback_tokenizer}\"\n                )\n                self.tokenizer = tiktoken.get_encoding(self.fallback_tokenizer)\n        else:\n            self.tokenizer = tiktoken.get_encoding(self.fallback_tokenizer)\n\n        # More accurate size estimation\n        self._size_bytes = self._calculate_tokenizer_size()\n\n    def _calculate_tokenizer_size(self) -> int:\n        \"\"\"Calculate size of tokenizer by summing the sizes of its vocabulary and model files\"\"\"\n        # By default, return a size of 5 MB\n        if not hasattr(self.tokenizer, \"vocab_files_names\") or not hasattr(\n            self.tokenizer, \"init_kwargs\"\n        ):\n            return self._default_size\n\n        total_size = 0\n\n        # Get the file keys from vocab_files_names\n        file_keys = self.tokenizer.vocab_files_names.keys()\n        # Look up these files in init_kwargs\n        for key in file_keys:\n            if file_path := self.tokenizer.init_kwargs.get(key):\n                try:\n                    total_size += os.path.getsize(file_path)\n                except (OSError, FileNotFoundError):\n                    logger.debug(f\"Could not access tokenizer file: {file_path}\")\n\n        return total_size if total_size > 0 else self._default_size\n\n    @classmethod\n    def load(cls, tokenizer_hub: str, fallback_tokenizer: str):\n        cache_key = hash(str(tokenizer_hub))\n\n        # If in cache, update last access time and return\n        if cache_key in cls._cache:\n            tokenizer, size, _ = cls._cache[cache_key]\n            cls._cache[cache_key] = (tokenizer, size, time.time())\n            return tokenizer\n\n        # Create new instance\n        instance = cls(tokenizer_hub, fallback_tokenizer)\n\n        # Check if adding this would exceed either cache limit\n        while (\n            cls._current_cache_size + instance._size_bytes\n            > cls._max_cache_size_mb * 1024 * 1024\n            or len(cls._cache) >= cls._max_cache_count\n        ):\n            # Find least recently used item\n            oldest_key = min(\n                cls._cache.keys(),\n                key=lambda k: cls._cache[k][2],  # last_access_time\n            )\n            # Remove it\n            _, removed_size, _ = cls._cache.pop(oldest_key)\n            cls._current_cache_size -= removed_size\n\n        # Add new instance to cache with current timestamp\n        cls._cache[cache_key] = (instance, instance._size_bytes, time.time())\n        cls._current_cache_size += instance._size_bytes\n        return instance\n\n    @classmethod\n    def set_max_cache_size_mb(cls, size_mb: int):\n        \"\"\"Set the maximum cache size in megabytes.\"\"\"\n        cls._max_cache_size_mb = size_mb\n        cls._cleanup_cache()\n\n    @classmethod\n    def set_max_cache_count(cls, count: int):\n        \"\"\"Set the maximum number of tokenizers to cache.\"\"\"\n        cls._max_cache_count = count\n        cls._cleanup_cache()\n\n    @classmethod\n    def _cleanup_cache(cls):\n        \"\"\"Clean up cache when limits are exceeded.\"\"\"\n        while (\n            cls._current_cache_size > cls._max_cache_size_mb * 1024 * 1024\n            or len(cls._cache) > cls._max_cache_count\n        ):\n            oldest_key = min(cls._cache.keys(), key=lambda k: cls._cache[k][2])\n            _, removed_size, _ = cls._cache.pop(oldest_key)\n            cls._current_cache_size -= removed_size\n\n    @classmethod\n    def preload_tokenizers(cls, models: list[str] | None = None):\n        \"\"\"Preload tokenizers into cache.\n\n        Args:\n            models: Optional list of model names (e.g. 'gpt-4o', 'claude-3-5-sonnet').\n                   If None, preloads all available tokenizers.\n        \"\"\"\n        from quivr_core.rag.entities.config import LLMModelConfig\n\n        unique_tokenizer_hubs = set()\n\n        # Collect tokenizer hubs based on provided models or all available\n        if models:\n            for model_name in models:\n                # Find matching model configurations\n                for supplier_models in LLMModelConfig._model_defaults.values():\n                    for base_model_name, config in supplier_models.items():\n                        # Check if the model name matches or starts with the base model name\n                        if (\n                            model_name.startswith(base_model_name)\n                            and config.tokenizer_hub\n                        ):\n                            unique_tokenizer_hubs.add(config.tokenizer_hub)\n                            break\n        else:\n            # Original behavior - collect all unique tokenizer hubs\n            for supplier_models in LLMModelConfig._model_defaults.values():\n                for config in supplier_models.values():\n                    if config.tokenizer_hub:\n                        unique_tokenizer_hubs.add(config.tokenizer_hub)\n\n        # Load each unique tokenizer\n        for hub in unique_tokenizer_hubs:\n            try:\n                cls.load(hub, LLMEndpointConfig._FALLBACK_TOKENIZER)\n                logger.info(\n                    f\"Successfully preloaded tokenizer: {hub}. \"\n                    f\"Total cache size: {cls._current_cache_size / (1024 * 1024):.2f} MB. \"\n                    f\"Cache count: {len(cls._cache)}\"\n                )\n            except Exception as e:\n                logger.warning(f\"Failed to preload tokenizer {hub}: {str(e)}\")\n\n\nclass LLMEndpoint:\n    _cache = {}\n\n    def __init__(self, llm_config: LLMEndpointConfig, llm: BaseChatModel):\n        self._config = llm_config\n        self._llm = llm\n        self._supports_func_calling = model_supports_function_calling(\n            self._config.model\n        )\n\n        self.llm_tokenizer = LLMTokenizer.load(\n            llm_config.tokenizer_hub, llm_config.fallback_tokenizer\n        )\n\n    def count_tokens(self, text: str) -> int:\n        # Tokenize the input text and return the token count\n        encoding = self.llm_tokenizer.tokenizer.encode(text)\n        return len(encoding)\n\n    def get_config(self):\n        return self._config\n\n    @classmethod\n    def from_config(cls, config: LLMEndpointConfig = LLMEndpointConfig()):\n        hashed_config = hash(config)\n        if hashed_config in cls._cache:\n            return cls._cache[hashed_config]\n\n        _llm: Union[\n            AzureChatOpenAI,\n            ChatOpenAI,\n            ChatAnthropic,\n            ChatMistralAI,\n            ChatGoogleGenerativeAI,\n            ChatGroq,\n        ]\n        try:\n            if config.supplier == DefaultModelSuppliers.AZURE:\n                # Parse the URL\n                parsed_url = urlparse(config.llm_base_url)\n                deployment = parsed_url.path.split(\"/\")[3]  # type: ignore\n                api_version = parse_qs(parsed_url.query).get(\"api-version\", [None])[0]  # type: ignore\n                azure_endpoint = f\"https://{parsed_url.netloc}\"  # type: ignore\n                _llm = AzureChatOpenAI(\n                    azure_deployment=deployment,  # type: ignore\n                    api_version=api_version,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    azure_endpoint=azure_endpoint,\n                    max_tokens=config.max_output_tokens,\n                    temperature=config.temperature,\n                )\n            elif config.supplier == DefaultModelSuppliers.ANTHROPIC:\n                assert config.llm_api_key, \"Can't load model config\"\n                _llm = ChatAnthropic(\n                    model_name=config.model,\n                    api_key=SecretStr(config.llm_api_key),\n                    base_url=config.llm_base_url,\n                    max_tokens_to_sample=config.max_output_tokens,\n                    temperature=config.temperature,\n                    timeout=None,\n                    stop=None,\n                )\n            elif config.supplier == DefaultModelSuppliers.OPENAI:\n                _llm = ChatOpenAI(\n                    model=config.model,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    base_url=config.llm_base_url,\n                    max_completion_tokens=config.max_output_tokens,\n                    temperature=config.temperature\n                    if not config.model.startswith(\"o\")\n                    else None,\n                )\n            elif config.supplier == DefaultModelSuppliers.MISTRAL:\n                _llm = ChatMistralAI(\n                    model_name=config.model,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    base_url=config.llm_base_url,\n                    temperature=config.temperature,\n                )\n            elif config.supplier == DefaultModelSuppliers.GEMINI:\n                _llm = ChatGoogleGenerativeAI(\n                    model=config.model,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    base_url=config.llm_base_url,\n                    max_tokens=config.max_output_tokens,\n                    temperature=config.temperature,\n                )\n            elif config.supplier == DefaultModelSuppliers.GROQ:\n                _llm = ChatGroq(\n                    model=config.model,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    base_url=config.llm_base_url,\n                    max_tokens=config.max_output_tokens,\n                    temperature=config.temperature,\n                )\n\n            else:\n                _llm = ChatOpenAI(\n                    model=config.model,\n                    api_key=SecretStr(config.llm_api_key)\n                    if config.llm_api_key\n                    else None,\n                    base_url=config.llm_base_url,\n                    max_completion_tokens=config.max_output_tokens,\n                    temperature=config.temperature,\n                )\n            instance = cls(llm=_llm, llm_config=config)\n            cls._cache[hashed_config] = instance\n\n            return instance\n\n        except ImportError as e:\n            raise ImportError(\n                \"Please provide a valid BaseLLM or install quivr-core['base'] package\"\n            ) from e\n\n    def supports_func_calling(self) -> bool:\n        return self._supports_func_calling\n\n    def info(self) -> LLMInfo:\n        return LLMInfo(\n            model=self._config.model,\n            llm_base_url=(\n                self._config.llm_base_url if self._config.llm_base_url else \"openai\"\n            ),\n            temperature=self._config.temperature,\n            max_tokens=self._config.max_output_tokens,\n            supports_function_calling=self.supports_func_calling(),\n        )\n\n    def clone_llm(self):\n        \"\"\"Create a new instance of the LLM with the same configuration.\"\"\"\n        return self._llm.__class__(**self._llm.__dict__)\n"
  },
  {
    "path": "core/quivr_core/llm_tools/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/llm_tools/entity.py",
    "content": "from quivr_core.base_config import QuivrBaseConfig\nfrom typing import Callable\nfrom langchain_core.tools import BaseTool\nfrom typing import Dict, Any\n\n\nclass ToolsCategory(QuivrBaseConfig):\n    name: str\n    description: str\n    tools: list\n    default_tool: str | None = None\n    create_tool: Callable\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self.name = self.name.lower()\n\n\nclass ToolWrapper:\n    def __init__(self, tool: BaseTool, format_input: Callable, format_output: Callable):\n        self.tool = tool\n        self.format_input = format_input\n        self.format_output = format_output\n\n\nclass ToolRegistry:\n    def __init__(self):\n        self._registry = {}\n\n    def register_tool(self, tool_name: str, create_func: Callable):\n        self._registry[tool_name] = create_func\n\n    def create_tool(self, tool_name: str, config: Dict[str, Any]) -> ToolWrapper:\n        if tool_name not in self._registry:\n            raise ValueError(f\"Tool {tool_name} is not supported.\")\n        return self._registry[tool_name](config)\n"
  },
  {
    "path": "core/quivr_core/llm_tools/llm_tools.py",
    "content": "from typing import Dict, Any, Type, Union\n\nfrom quivr_core.llm_tools.entity import ToolWrapper\n\nfrom quivr_core.llm_tools.web_search_tools import (\n    WebSearchTools,\n)\n\nfrom quivr_core.llm_tools.other_tools import (\n    OtherTools,\n)\n\nTOOLS_CATEGORIES = {\n    WebSearchTools.name: WebSearchTools,\n    OtherTools.name: OtherTools,\n}\n\n# Register all ToolsList enums\nTOOLS_LISTS = {\n    **{tool.value: tool for tool in WebSearchTools.tools},\n    **{tool.value: tool for tool in OtherTools.tools},\n}\n\n\nclass LLMToolFactory:\n    @staticmethod\n    def create_tool(tool_name: str, config: Dict[str, Any]) -> Union[ToolWrapper, Type]:\n        for category, tools_class in TOOLS_CATEGORIES.items():\n            if tool_name in tools_class.tools:\n                return tools_class.create_tool(tool_name, config)\n            elif tool_name.lower() == category and tools_class.default_tool:\n                return tools_class.create_tool(tools_class.default_tool, config)\n        raise ValueError(f\"Tool {tool_name} is not supported.\")\n"
  },
  {
    "path": "core/quivr_core/llm_tools/other_tools.py",
    "content": "from enum import Enum\nfrom typing import Dict, Any, Type, Union\nfrom langchain_core.tools import BaseTool\nfrom quivr_core.llm_tools.entity import ToolsCategory\nfrom quivr_core.rag.entities.models import cited_answer\n\n\nclass OtherToolsList(str, Enum):\n    CITED_ANSWER = \"cited_answer\"\n\n\ndef create_other_tool(tool_name: str, config: Dict[str, Any]) -> Union[BaseTool, Type]:\n    if tool_name == OtherToolsList.CITED_ANSWER:\n        return cited_answer\n    else:\n        raise ValueError(f\"Tool {tool_name} is not supported.\")\n\n\nOtherTools = ToolsCategory(\n    name=\"Other\",\n    description=\"Other tools\",\n    tools=[OtherToolsList.CITED_ANSWER],\n    create_tool=create_other_tool,\n)\n"
  },
  {
    "path": "core/quivr_core/llm_tools/web_search_tools.py",
    "content": "from enum import Enum\nfrom typing import Dict, List, Any\nfrom langchain_community.tools import TavilySearchResults\nfrom langchain_community.utilities.tavily_search import TavilySearchAPIWrapper\nfrom quivr_core.llm_tools.entity import ToolsCategory\nimport os\nfrom pydantic import SecretStr  # Ensure correct import\nfrom quivr_core.llm_tools.entity import ToolWrapper, ToolRegistry\nfrom langchain_core.documents import Document\n\n\nclass WebSearchToolsList(str, Enum):\n    TAVILY = \"tavily\"\n\n\ndef create_tavily_tool(config: Dict[str, Any]) -> ToolWrapper:\n    api_key = (\n        config.pop(\"api_key\") if \"api_key\" in config else os.getenv(\"TAVILY_API_KEY\")\n    )\n    if not api_key:\n        raise ValueError(\n            \"Missing required config key 'api_key' or environment variable 'TAVILY_API_KEY'\"\n        )\n\n    tavily_api_wrapper = TavilySearchAPIWrapper(\n        tavily_api_key=SecretStr(api_key),\n    )\n    tool = TavilySearchResults(\n        api_wrapper=tavily_api_wrapper,\n        max_results=config.pop(\"max_results\", 5),\n        search_depth=config.pop(\"search_depth\", \"advanced\"),\n        include_answer=config.pop(\"include_answer\", True),\n        **config,\n    )\n\n    tool.name = WebSearchToolsList.TAVILY.value\n\n    def format_input(task: str) -> Dict[str, Any]:\n        return {\"query\": task}\n\n    def format_output(response: Any) -> List[Document]:\n        metadata = {\"integration\": \"\", \"integration_link\": \"\"}\n        return [\n            Document(\n                page_content=d[\"content\"],\n                metadata={\n                    **metadata,\n                    \"file_name\": d[\"url\"] if \"url\" in d else \"\",\n                    \"original_file_name\": d[\"url\"] if \"url\" in d else \"\",\n                },\n            )\n            for d in response\n        ]\n\n    return ToolWrapper(tool, format_input, format_output)\n\n\n# Initialize the registry and register tools\nweb_search_tool_registry = ToolRegistry()\nweb_search_tool_registry.register_tool(WebSearchToolsList.TAVILY, create_tavily_tool)\n\n\ndef create_web_search_tool(tool_name: str, config: Dict[str, Any]) -> ToolWrapper:\n    return web_search_tool_registry.create_tool(tool_name, config)\n\n\nWebSearchTools = ToolsCategory(\n    name=\"Web Search\",\n    description=\"Tools for web searching\",\n    tools=[WebSearchToolsList.TAVILY],\n    default_tool=WebSearchToolsList.TAVILY,\n    create_tool=create_web_search_tool,\n)\n"
  },
  {
    "path": "core/quivr_core/processor/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/processor/implementations/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/processor/implementations/default.py",
    "content": "import logging\nfrom typing import Any, List, Type, TypeVar\n\nimport tiktoken\nfrom langchain_community.document_loaders import (\n    BibtexLoader,\n    CSVLoader,\n    Docx2txtLoader,\n    NotebookLoader,\n    PythonLoader,\n    UnstructuredEPubLoader,\n    UnstructuredExcelLoader,\n    UnstructuredHTMLLoader,\n    UnstructuredMarkdownLoader,\n    UnstructuredODTLoader,\n    UnstructuredPDFLoader,\n    UnstructuredPowerPointLoader,\n)\nfrom langchain_community.document_loaders.base import BaseLoader\nfrom langchain_community.document_loaders.text import TextLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter\n\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.processor_base import ProcessedDocument, ProcessorBase\nfrom quivr_core.processor.splitter import SplitterConfig\n\nlogger = logging.getLogger(\"quivr_core\")\n\nP = TypeVar(\"P\", bound=BaseLoader)\n\n\nclass ProcessorInit(ProcessorBase):\n    def __init__(self, *args, **loader_kwargs) -> None:\n        pass\n\n\n# FIXME(@aminediro):\n# dynamically creates Processor classes. Maybe redo this for finer control over instanciation\n# processor classes are opaque as we don't know what params they would have -> not easy to have lsp completion\ndef _build_processor(\n    cls_name: str, load_cls: Type[P], cls_extensions: List[FileExtension | str]\n) -> Type[ProcessorInit]:\n    enc = tiktoken.get_encoding(\"cl100k_base\")\n\n    class _Processor(ProcessorBase):\n        supported_extensions = cls_extensions\n\n        def __init__(\n            self,\n            splitter: TextSplitter | None = None,\n            splitter_config: SplitterConfig = SplitterConfig(),\n            **loader_kwargs: dict[str, Any],\n        ) -> None:\n            self.loader_cls = load_cls\n            self.loader_kwargs = loader_kwargs\n\n            self.splitter_config = splitter_config\n\n            if splitter:\n                self.text_splitter = splitter\n            else:\n                self.text_splitter = (\n                    RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n                        chunk_size=splitter_config.chunk_size,\n                        chunk_overlap=splitter_config.chunk_overlap,\n                    )\n                )\n\n        @property\n        def processor_metadata(self) -> dict[str, Any]:\n            return {\n                \"processor_cls\": self.loader_cls.__name__,\n                \"splitter\": self.splitter_config.model_dump(),\n            }\n\n        async def process_file_inner(self, file: QuivrFile) -> ProcessedDocument[None]:\n            if hasattr(self.loader_cls, \"__init__\"):\n                # NOTE: mypy can't correctly type this as BaseLoader doesn't have a constructor method\n                loader = self.loader_cls(file_path=str(file.path), **self.loader_kwargs)  # type: ignore\n            else:\n                loader = self.loader_cls()\n\n            documents = await loader.aload()\n            docs = self.text_splitter.split_documents(documents)\n\n            for doc in docs:\n                # TODO: This metadata info should be typed\n                doc.metadata = {\"chunk_size\": len(enc.encode(doc.page_content))}\n\n            return ProcessedDocument(\n                chunks=docs, processor_cls=cls_name, processor_response=None\n            )\n\n    return type(cls_name, (ProcessorInit,), dict(_Processor.__dict__))\n\n\nCSVProcessor = _build_processor(\"CSVProcessor\", CSVLoader, [FileExtension.csv])\nTikTokenTxtProcessor = _build_processor(\n    \"TikTokenTxtProcessor\", TextLoader, [FileExtension.txt]\n)\nDOCXProcessor = _build_processor(\n    \"DOCXProcessor\", Docx2txtLoader, [FileExtension.docx, FileExtension.doc]\n)\nXLSXProcessor = _build_processor(\n    \"XLSXProcessor\", UnstructuredExcelLoader, [FileExtension.xlsx, FileExtension.xls]\n)\nPPTProcessor = _build_processor(\n    \"PPTProcessor\", UnstructuredPowerPointLoader, [FileExtension.pptx]\n)\nMarkdownProcessor = _build_processor(\n    \"MarkdownProcessor\",\n    UnstructuredMarkdownLoader,\n    [FileExtension.md, FileExtension.mdx, FileExtension.markdown],\n)\nEpubProcessor = _build_processor(\n    \"EpubProcessor\", UnstructuredEPubLoader, [FileExtension.epub]\n)\nBibTexProcessor = _build_processor(\"BibTexProcessor\", BibtexLoader, [FileExtension.bib])\nODTProcessor = _build_processor(\n    \"ODTProcessor\", UnstructuredODTLoader, [FileExtension.odt]\n)\nHTMLProcessor = _build_processor(\n    \"HTMLProcessor\", UnstructuredHTMLLoader, [FileExtension.html]\n)\nPythonProcessor = _build_processor(\"PythonProcessor\", PythonLoader, [FileExtension.py])\nNotebookProcessor = _build_processor(\n    \"NotebookProcessor\", NotebookLoader, [FileExtension.ipynb]\n)\nUnstructuredPDFProcessor = _build_processor(\n    \"UnstructuredPDFProcessor\", UnstructuredPDFLoader, [FileExtension.pdf]\n)\n"
  },
  {
    "path": "core/quivr_core/processor/implementations/megaparse_processor.py",
    "content": "import logging\n\nimport tiktoken\nfrom langchain_core.documents import Document\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter\nfrom megaparse_sdk.client import MegaParseNATSClient\nfrom megaparse_sdk.config import ClientNATSConfig\nfrom megaparse_sdk.schema.document import Document as MPDocument\n\nfrom quivr_core.config import MegaparseConfig\nfrom quivr_core.files.file import QuivrFile\nfrom quivr_core.processor.processor_base import ProcessedDocument, ProcessorBase\nfrom quivr_core.processor.registry import FileExtension\nfrom quivr_core.processor.splitter import SplitterConfig\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nclass MegaparseProcessor(ProcessorBase[MPDocument]):\n    \"\"\"\n    Megaparse processor for PDF files.\n\n    It can be used to parse PDF files and split them into chunks.\n\n    It comes from the megaparse library.\n\n    ## Installation\n    ```bash\n    pip install megaparse\n    ```\n\n    \"\"\"\n\n    supported_extensions = [\n        FileExtension.txt,\n        FileExtension.pdf,\n        FileExtension.docx,\n        FileExtension.doc,\n        FileExtension.pptx,\n        FileExtension.xls,\n        FileExtension.xlsx,\n        FileExtension.csv,\n        FileExtension.epub,\n        FileExtension.bib,\n        FileExtension.odt,\n        FileExtension.html,\n        FileExtension.markdown,\n        FileExtension.md,\n        FileExtension.mdx,\n    ]\n\n    def __init__(\n        self,\n        splitter: TextSplitter | None = None,\n        splitter_config: SplitterConfig = SplitterConfig(),\n        megaparse_config: MegaparseConfig = MegaparseConfig(),\n    ) -> None:\n        self.enc = tiktoken.get_encoding(\"cl100k_base\")\n        self.splitter_config = splitter_config\n        self.megaparse_config = megaparse_config\n\n        if splitter:\n            self.text_splitter = splitter\n        else:\n            self.text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n                chunk_size=splitter_config.chunk_size,\n                chunk_overlap=splitter_config.chunk_overlap,\n            )\n\n    @property\n    def processor_metadata(self):\n        return {\n            \"chunk_overlap\": self.splitter_config.chunk_overlap,\n        }\n\n    async def process_file_inner(\n        self, file: QuivrFile\n    ) -> ProcessedDocument[MPDocument | str]:\n        logger.info(f\"Uploading file {file.path} to MegaParse\")\n        async with MegaParseNATSClient(ClientNATSConfig()) as client:\n            response = await client.parse_file(file=file.path)\n\n        document = Document(\n            page_content=str(response),\n        )\n\n        chunks = self.text_splitter.split_documents([document])\n        for chunk in chunks:\n            chunk.metadata = {\"chunk_size\": len(self.enc.encode(chunk.page_content))}\n        return ProcessedDocument(\n            chunks=chunks,\n            processor_cls=\"MegaparseProcessor\",\n            processor_response=response,\n        )\n"
  },
  {
    "path": "core/quivr_core/processor/implementations/simple_txt_processor.py",
    "content": "from typing import Any\n\nimport aiofiles\nfrom langchain_core.documents import Document\n\nfrom quivr_core.files.file import QuivrFile\nfrom quivr_core.processor.processor_base import ProcessedDocument, ProcessorBase\nfrom quivr_core.processor.registry import FileExtension\nfrom quivr_core.processor.splitter import SplitterConfig\n\n\ndef recursive_character_splitter(\n    doc: Document, chunk_size: int, chunk_overlap: int\n) -> list[Document]:\n    assert chunk_overlap < chunk_size, \"chunk_overlap is greater than chunk_size\"\n\n    if len(doc.page_content) <= chunk_size:\n        return [doc]\n\n    chunk = Document(page_content=doc.page_content[:chunk_size], metadata=doc.metadata)\n    remaining = Document(\n        page_content=doc.page_content[chunk_size - chunk_overlap :],\n        metadata=doc.metadata,\n    )\n\n    return [chunk] + recursive_character_splitter(remaining, chunk_size, chunk_overlap)\n\n\nclass SimpleTxtProcessor(ProcessorBase):\n    \"\"\"\n    SimpleTxtProcessor is a class that implements the ProcessorBase interface.\n    It is used to process the files with the Simple Txt parser.\n    \"\"\"\n\n    supported_extensions = [FileExtension.txt]\n\n    def __init__(\n        self, splitter_config: SplitterConfig = SplitterConfig(), **kwargs\n    ) -> None:\n        super().__init__(**kwargs)\n        self.splitter_config = splitter_config\n\n    @property\n    def processor_metadata(self) -> dict[str, Any]:\n        return {\n            \"processor_cls\": \"SimpleTxtProcessor\",\n            \"splitter\": self.splitter_config.model_dump(),\n        }\n\n    async def process_file_inner(self, file: QuivrFile) -> ProcessedDocument[str]:\n        async with aiofiles.open(file.path, mode=\"r\") as f:\n            content = await f.read()\n\n        doc = Document(page_content=content)\n\n        docs = recursive_character_splitter(\n            doc, self.splitter_config.chunk_size, self.splitter_config.chunk_overlap\n        )\n\n        return ProcessedDocument(\n            chunks=docs, processor_cls=\"SimpleTxtProcessor\", processor_response=content\n        )\n"
  },
  {
    "path": "core/quivr_core/processor/implementations/tika_processor.py",
    "content": "import logging\nimport os\nfrom typing import AsyncIterable\n\nimport httpx\nimport tiktoken\nfrom langchain_core.documents import Document\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, TextSplitter\n\nfrom quivr_core.files.file import QuivrFile\nfrom quivr_core.processor.processor_base import ProcessedDocument, ProcessorBase\nfrom quivr_core.processor.registry import FileExtension\nfrom quivr_core.processor.splitter import SplitterConfig\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nclass TikaProcessor(ProcessorBase):\n    \"\"\"\n    TikaProcessor is a class that implements the ProcessorBase interface.\n    It is used to process the files with the Tika server.\n\n    To run it with docker you can do:\n    ```bash\n    docker run -d -p 9998:9998 apache/tika\n    ```\n    \"\"\"\n\n    supported_extensions = [FileExtension.pdf]\n\n    def __init__(\n        self,\n        tika_url: str = os.getenv(\"TIKA_SERVER_URL\", \"http://localhost:9998/tika\"),\n        splitter: TextSplitter | None = None,\n        splitter_config: SplitterConfig = SplitterConfig(),\n        timeout: float = 5.0,\n        max_retries: int = 3,\n    ) -> None:\n        self.tika_url = tika_url\n        self.max_retries = max_retries\n        self._client = httpx.AsyncClient(timeout=timeout)\n\n        self.enc = tiktoken.get_encoding(\"cl100k_base\")\n        self.splitter_config = splitter_config\n\n        if splitter:\n            self.text_splitter = splitter\n        else:\n            self.text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n                chunk_size=splitter_config.chunk_size,\n                chunk_overlap=splitter_config.chunk_overlap,\n            )\n\n    async def _send_parse_tika(self, f: AsyncIterable[bytes]) -> str:\n        retry = 0\n        headers = {\"Accept\": \"text/plain\"}\n        while retry < self.max_retries:\n            try:\n                resp = await self._client.put(self.tika_url, headers=headers, content=f)\n                resp.raise_for_status()\n                return resp.content.decode(\"utf-8\")\n            except Exception as e:\n                retry += 1\n                logger.debug(f\"tika url error :{e}. retrying for the {retry} time...\")\n        raise RuntimeError(\"can't send parse request to tika server\")\n\n    @property\n    def processor_metadata(self):\n        return {\n            \"chunk_overlap\": self.splitter_config.chunk_overlap,\n        }\n\n    async def process_file_inner(self, file: QuivrFile) -> ProcessedDocument[None]:\n        async with file.open() as f:\n            txt = await self._send_parse_tika(f)\n        document = Document(page_content=txt)\n        docs = self.text_splitter.split_documents([document])\n        for doc in docs:\n            doc.metadata = {\"chunk_size\": len(self.enc.encode(doc.page_content))}\n\n        return ProcessedDocument(\n            chunks=docs, processor_cls=\"TikaProcessor\", processor_response=None\n        )\n"
  },
  {
    "path": "core/quivr_core/processor/processor_base.py",
    "content": "import logging\nfrom abc import ABC, abstractmethod\nfrom importlib.metadata import PackageNotFoundError, version\nfrom typing import Any, Generic, List, TypeVar\n\nfrom attr import dataclass\nfrom langchain_core.documents import Document\n\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.language.utils import detect_language\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\nR = TypeVar(\"R\", covariant=True)\n\n\n@dataclass\nclass ProcessedDocument(Generic[R]):\n    chunks: List[Document]\n    processor_cls: str\n    processor_response: R\n\n\n# TODO: processors should be cached somewhere ?\n# The processor should be cached by processor type\n# The cache should use a single\nclass ProcessorBase(ABC, Generic[R]):\n    supported_extensions: list[FileExtension | str]\n\n    def check_supported(self, file: QuivrFile) -> None:\n        if file.file_extension not in self.supported_extensions:\n            raise ValueError(f\"can't process a file of type {file.file_extension}\")\n\n    @property\n    @abstractmethod\n    def processor_metadata(self) -> dict[str, Any]:\n        raise NotImplementedError\n\n    async def process_file(self, file: QuivrFile) -> ProcessedDocument[R]:\n        logger.debug(f\"Processing file {file}\")\n        self.check_supported(file)\n        docs = await self.process_file_inner(file)\n        try:\n            qvr_version = version(\"quivr-core\")\n        except PackageNotFoundError:\n            qvr_version = \"dev\"\n\n        for idx, doc in enumerate(docs.chunks, start=1):\n            if \"original_file_name\" in doc.metadata:\n                doc.page_content = f\"Filename: {doc.metadata['original_file_name']} Content: {doc.page_content}\"\n            doc.page_content = doc.page_content.replace(\"\\u0000\", \"\")\n            doc.page_content = doc.page_content.encode(\"utf-8\", \"replace\").decode(\n                \"utf-8\"\n            )\n            doc.metadata = {\n                \"chunk_index\": idx,\n                \"quivr_core_version\": qvr_version,\n                \"language\": detect_language(\n                    text=doc.page_content.replace(\"\\\\n\", \" \").replace(\"\\n\", \" \"),\n                    low_memory=True,\n                ).value,\n                **file.metadata,\n                **doc.metadata,\n                **self.processor_metadata,\n            }\n        return docs\n\n    @abstractmethod\n    async def process_file_inner(self, file: QuivrFile) -> ProcessedDocument[R]:\n        raise NotImplementedError\n"
  },
  {
    "path": "core/quivr_core/processor/registry.py",
    "content": "import importlib\nimport logging\nimport types\nfrom dataclasses import dataclass, field\nfrom heapq import heappop, heappush\nfrom typing import List, Type, TypeAlias\n\nfrom quivr_core.files.file import FileExtension\n\nfrom .processor_base import ProcessorBase\n\nlogger = logging.getLogger(\"quivr_core\")\n\n_LOWEST_PRIORITY = 100\n\n_registry: dict[str, Type[ProcessorBase]] = {}\n\n# external, read only. Contains the actual processors that we are imported and ready to use\nregistry = types.MappingProxyType(_registry)\n\n\n@dataclass(order=True)\nclass ProcEntry:\n    priority: int\n    cls_mod: str = field(compare=False)\n    err: str | None = field(compare=False)\n\n\nProcMapping: TypeAlias = dict[FileExtension | str, list[ProcEntry]]\n\n# Register based on mimetypes\nbase_processors: ProcMapping = {\n    FileExtension.txt: [\n        ProcEntry(\n            cls_mod=\"quivr_core.processor.implementations.simple_txt_processor.SimpleTxtProcessor\",\n            err=None,\n            priority=_LOWEST_PRIORITY,\n        )\n    ],\n    FileExtension.pdf: [\n        ProcEntry(\n            cls_mod=\"quivr_core.processor.implementations.tika_processor.TikaProcessor\",\n            err=None,\n            priority=_LOWEST_PRIORITY,\n        )\n    ],\n}\n\n\ndef _append_proc_mapping(\n    mapping: ProcMapping,\n    file_exts: List[FileExtension] | List[str],\n    cls_mod: str,\n    errtxt: str,\n    priority: int | None,\n):\n    for file_ext in file_exts:\n        if file_ext in mapping:\n            try:\n                prev_proc = heappop(mapping[file_ext])\n                proc_entry = ProcEntry(\n                    priority=priority\n                    if priority is not None\n                    else prev_proc.priority - 1,\n                    cls_mod=cls_mod,\n                    err=errtxt,\n                )\n                # Push the previous processor back\n                heappush(mapping[file_ext], prev_proc)\n                heappush(mapping[file_ext], proc_entry)\n            except IndexError:\n                proc_entry = ProcEntry(\n                    priority=priority if priority is not None else _LOWEST_PRIORITY,\n                    cls_mod=cls_mod,\n                    err=errtxt,\n                )\n                heappush(mapping[file_ext], proc_entry)\n\n        else:\n            proc_entry = ProcEntry(\n                priority=priority if priority is not None else _LOWEST_PRIORITY,\n                cls_mod=cls_mod,\n                err=errtxt,\n            )\n\n            mapping[file_ext] = [proc_entry]\n\n\ndef defaults_to_proc_entries(\n    base_processors: ProcMapping,\n) -> ProcMapping:\n    # TODO(@aminediro) : how can a user change the order of the processor ?\n    # NOTE: order of this list is important as resolution of `get_processor_class` depends on it\n    # We should have a way to automatically add these at 'import' time\n    for supported_extensions, processor_name in [\n        ([FileExtension.csv], \"CSVProcessor\"),\n        ([FileExtension.txt], \"TikTokenTxtProcessor\"),\n        ([FileExtension.docx, FileExtension.doc], \"DOCXProcessor\"),\n        ([FileExtension.xls, FileExtension.xlsx], \"XLSXProcessor\"),\n        ([FileExtension.pptx], \"PPTProcessor\"),\n        (\n            [FileExtension.markdown, FileExtension.md, FileExtension.mdx],\n            \"MarkdownProcessor\",\n        ),\n        ([FileExtension.epub], \"EpubProcessor\"),\n        ([FileExtension.bib], \"BibTexProcessor\"),\n        ([FileExtension.odt], \"ODTProcessor\"),\n        ([FileExtension.html], \"HTMLProcessor\"),\n        ([FileExtension.py], \"PythonProcessor\"),\n        ([FileExtension.ipynb], \"NotebookProcessor\"),\n    ]:\n        for ext in supported_extensions:\n            ext_str = ext.value if isinstance(ext, FileExtension) else ext\n            _append_proc_mapping(\n                mapping=base_processors,\n                file_exts=[ext],\n                cls_mod=f\"quivr_core.processor.implementations.default.{processor_name}\",\n                errtxt=f\"can't import {processor_name}. Please install quivr-core[{ext_str}] to access {processor_name}\",\n                priority=None,\n            )\n\n    # TODO(@aminediro): Megaparse should register itself\n    # Append Megaparse\n    _append_proc_mapping(\n        mapping=base_processors,\n        file_exts=[\n            FileExtension.txt,\n            FileExtension.pdf,\n            FileExtension.docx,\n            FileExtension.doc,\n            FileExtension.pptx,\n            FileExtension.xls,\n            FileExtension.xlsx,\n            FileExtension.csv,\n            FileExtension.epub,\n            FileExtension.bib,\n            FileExtension.odt,\n            FileExtension.html,\n            FileExtension.markdown,\n            FileExtension.md,\n            FileExtension.mdx,\n        ],\n        cls_mod=\"quivr_core.processor.implementations.megaparse_processor.MegaparseProcessor\",\n        errtxt=f\"can't import MegaparseProcessor. Please install quivr-core[{ext_str}] to access MegaparseProcessor\",\n        priority=None,\n    )\n    return base_processors\n\n\nknown_processors = defaults_to_proc_entries(base_processors)\n\n\ndef get_processor_class(file_extension: FileExtension | str) -> Type[ProcessorBase]:\n    \"\"\"Fetch processor class from registry\n\n    The dict ``known_processors`` maps file extensions to the locations\n    of processors that could process them.\n    Loading of these classes is *Lazy*. Appropriate import will happen\n    the first time we try to process some file type.\n\n    Some processors need additional dependencies. If the import fails\n    we return the \"err\" field of the ProcEntry in  ``known_processors``.\n    \"\"\"\n\n    if file_extension not in registry:\n        # Either you registered it from module or it's in the known processors\n        if file_extension not in known_processors:\n            raise ValueError(f\"Extension not known: {file_extension}\")\n        entries = known_processors[file_extension]\n        while entries:\n            proc_entry = heappop(entries)\n            try:\n                register_processor(file_extension, _import_class(proc_entry.cls_mod))\n                break\n            except ImportError:\n                logger.warn(\n                    f\"{proc_entry.err}. Falling to the next available processor for {file_extension}\"\n                )\n        if len(entries) == 0 and file_extension not in registry:\n            raise ImportError(f\"can't find any processor for {file_extension}\")\n\n    cls = registry[file_extension]\n    return cls\n\n\ndef register_processor(\n    file_ext: FileExtension | str,\n    proc_cls: str | Type[ProcessorBase],\n    append: bool = True,\n    override: bool = False,\n    errtxt: str | None = None,\n    priority: int | None = None,\n):\n    if isinstance(proc_cls, str):\n        if file_ext in known_processors and append is False:\n            if all(proc_cls != proc.cls_mod for proc in known_processors[file_ext]):\n                raise ValueError(\n                    f\"Processor for ({file_ext}) already in the registry and append is False\"\n                )\n        else:\n            if all(proc_cls != proc.cls_mod for proc in known_processors[file_ext]):\n                _append_proc_mapping(\n                    known_processors,\n                    file_exts=[file_ext],\n                    cls_mod=proc_cls,\n                    errtxt=errtxt\n                    or f\"{proc_cls} import failed for processor of {file_ext}\",\n                    priority=priority,\n                )\n            else:\n                logger.info(f\"{proc_cls} already in registry...\")\n\n    else:\n        assert issubclass(\n            proc_cls, ProcessorBase\n        ), f\"{proc_cls} should be a subclass of quivr_core.processor.ProcessorBase\"\n        if file_ext in registry and override is False:\n            if _registry[file_ext] is not proc_cls:\n                raise ValueError(\n                    f\"Processor for ({file_ext}) already in the registry and append is False\"\n                )\n        else:\n            _registry[file_ext] = proc_cls\n\n\ndef _import_class(full_mod_path: str):\n    if \":\" in full_mod_path:\n        mod_name, name = full_mod_path.rsplit(\":\", 1)\n    else:\n        mod_name, name = full_mod_path.rsplit(\".\", 1)\n\n    mod = importlib.import_module(mod_name)\n\n    for cls in name.split(\".\"):\n        mod = getattr(mod, cls)\n\n    if not isinstance(mod, type):\n        raise TypeError(f\"{full_mod_path} is not a class\")\n\n    if not issubclass(mod, ProcessorBase):\n        raise TypeError(f\"{full_mod_path} is not a subclass of ProcessorBase \")\n\n    return mod\n\n\ndef available_processors():\n    \"\"\"Return a list of the known processors.\"\"\"\n    return list(known_processors)\n"
  },
  {
    "path": "core/quivr_core/processor/splitter.py",
    "content": "from pydantic import BaseModel\n\n\nclass SplitterConfig(BaseModel):\n    \"\"\"\n    This class is used to configure the chunking of the documents.\n\n    Chunk size is the number of characters in the chunk.\n    Chunk overlap is the number of characters that the chunk will overlap with the previous chunk.\n    \"\"\"\n\n    chunk_size: int = 400\n    chunk_overlap: int = 100\n"
  },
  {
    "path": "core/quivr_core/rag/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/rag/entities/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/rag/entities/chat.py",
    "content": "from datetime import datetime\nfrom typing import Any, Generator, Tuple, List\nfrom uuid import UUID, uuid4\n\nfrom langchain_core.messages import AIMessage, HumanMessage\n\nfrom quivr_core.rag.entities.models import ChatMessage\n\n\nclass ChatHistory:\n    \"\"\"\n    ChatHistory is a class that maintains a record of chat conversations. Each message\n    in the history is represented by an instance of the `ChatMessage` class, and the\n    chat history is stored internally as a list of these `ChatMessage` objects.\n    The class provides methods to retrieve, append, iterate, and manipulate the chat\n    history, as well as utilities to convert the messages into specific formats\n    and support deep copying.\n    \"\"\"\n\n    def __init__(self, chat_id: UUID, brain_id: UUID | None) -> None:\n        \"\"\"Init a new ChatHistory object.\n\n        Args:\n            chat_id (UUID): A unique identifier for the chat session.\n            brain_id (UUID | None): An optional identifier for the brain associated with the chat.\n        \"\"\"\n        self.id = chat_id\n        self.brain_id = brain_id\n        # TODO(@aminediro): maybe use a deque() instead ?\n        self._msgs: list[ChatMessage] = []\n\n    def get_chat_history(self, newest_first: bool = False) -> List[ChatMessage]:\n        \"\"\"\n        Retrieves the chat history, optionally sorted in reverse chronological order.\n\n        Args:\n            newest_first (bool, optional): If True, returns the messages in reverse order (newest first). Defaults to False.\n\n        Returns:\n            List[ChatMessage]: A sorted list of chat messages.\n        \"\"\"\n        history = sorted(self._msgs, key=lambda msg: msg.message_time)\n        if newest_first:\n            return history[::-1]\n        return history\n\n    def __len__(self):\n        return len(self._msgs)\n\n    def append(\n        self, langchain_msg: AIMessage | HumanMessage, metadata: dict[str, Any] = {}\n    ):\n        \"\"\"\n        Appends a new message to the chat history.\n\n        Args:\n            langchain_msg (AIMessage | HumanMessage): The message content (either an AI or Human message).\n            metadata (dict[str, Any], optional): Additional metadata related to the message. Defaults to an empty dictionary.\n        \"\"\"\n        chat_msg = ChatMessage(\n            chat_id=self.id,\n            message_id=uuid4(),\n            brain_id=self.brain_id,\n            msg=langchain_msg,\n            message_time=datetime.now(),\n            metadata=metadata,\n        )\n        self._msgs.append(chat_msg)\n\n    def iter_pairs(self) -> Generator[Tuple[HumanMessage, AIMessage], None, None]:\n        \"\"\"\n        Iterates over the chat history in pairs, returning a HumanMessage followed by an AIMessage.\n\n        Yields:\n            Tuple[HumanMessage, AIMessage]: Pairs of human and AI messages.\n\n        Raises:\n            AssertionError: If the messages in the pair are not in the expected order (i.e., a HumanMessage followed by an AIMessage).\n        \"\"\"\n        # Reverse the chat_history, newest first\n        it = iter(self.get_chat_history(newest_first=True))\n        for ai_message, human_message in zip(it, it, strict=False):\n            assert isinstance(\n                human_message.msg, HumanMessage\n            ), f\"msg {human_message} is not HumanMessage\"\n            assert isinstance(\n                ai_message.msg, AIMessage\n            ), f\"msg {human_message} is not AIMessage\"\n            yield (human_message.msg, ai_message.msg)\n\n    def to_list(self) -> List[HumanMessage | AIMessage]:\n        \"\"\"\n        Converts the chat history into a list of raw HumanMessage or AIMessage objects.\n\n        Returns:\n            list[HumanMessage | AIMessage]: A list of messages in their raw form, without metadata.\n        \"\"\"\n\n        return [_msg.msg for _msg in self._msgs]\n"
  },
  {
    "path": "core/quivr_core/rag/entities/config.py",
    "content": "import logging\nimport os\nimport re\nfrom enum import Enum\nfrom typing import Any, Dict, Hashable, List, Optional, Type, Union\nfrom uuid import UUID\n\nfrom langchain_core.prompts.base import BasePromptTemplate\nfrom langchain_core.tools import BaseTool\nfrom langgraph.graph import END, START\nfrom pydantic import BaseModel\nfrom rapidfuzz import fuzz, process\n\nfrom quivr_core.base_config import QuivrBaseConfig\nfrom quivr_core.config import MegaparseConfig\nfrom quivr_core.llm_tools.llm_tools import TOOLS_CATEGORIES, TOOLS_LISTS, LLMToolFactory\nfrom quivr_core.processor.splitter import SplitterConfig\n\nlogger = logging.getLogger(\"quivr_core\")\nMIN_CONTEXT_TOKENS = 4096\nMIN_OUTPUT_TOKENS = 4096\n\n\ndef normalize_to_env_variable_name(name: str) -> str:\n    # Replace any character that is not a letter, digit, or underscore with an underscore\n    env_variable_name = re.sub(r\"[^A-Za-z0-9_]\", \"_\", name).upper()\n\n    # Check if the normalized name starts with a digit\n    if env_variable_name[0].isdigit():\n        raise ValueError(\n            f\"Invalid environment variable name '{env_variable_name}': Cannot start with a digit.\"\n        )\n\n    return env_variable_name\n\n\nclass SpecialEdges(str, Enum):\n    start = \"START\"\n    end = \"END\"\n\n\nclass BrainConfig(QuivrBaseConfig):\n    brain_id: UUID | None = None\n    name: str\n\n    @property\n    def id(self) -> UUID | None:\n        return self.brain_id\n\n\nclass DefaultWebSearchTool(str, Enum):\n    TAVILY = \"tavily\"\n\n\nclass DefaultRerankers(str, Enum):\n    COHERE = \"cohere\"\n    JINA = \"jina\"\n    # MIXEDBREAD = \"mixedbread-ai\"\n\n    @property\n    def default_model(self) -> str:\n        # Mapping of suppliers to their default models\n        return {\n            self.COHERE: \"rerank-v3.5\",\n            self.JINA: \"jina-reranker-v2-base-multilingual\",\n            # self.MIXEDBREAD: \"rmxbai-rerank-large-v1\",\n        }[self]\n\n\nclass DefaultModelSuppliers(str, Enum):\n    OPENAI = \"openai\"\n    AZURE = \"azure\"\n    ANTHROPIC = \"anthropic\"\n    META = \"meta\"\n    MISTRAL = \"mistral\"\n    GROQ = \"groq\"\n    GEMINI = \"gemini\"\n\n\nclass LLMConfig(QuivrBaseConfig):\n    max_context_tokens: int | None = None\n    max_output_tokens: int | None = None\n    tokenizer_hub: str | None = None\n\n\nclass LLMModelConfig:\n    _model_defaults: Dict[DefaultModelSuppliers, Dict[str, LLMConfig]] = {\n        DefaultModelSuppliers.OPENAI: {\n            \"gpt-4.1\": LLMConfig(\n                max_context_tokens=1047576,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"gpt-4o\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=16384,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"gpt-4o-mini\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=16384,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"o3-mini\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=100000,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"o4-mini\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=100000,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"o1-mini\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=65536,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"o1-preview\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"o1\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=100000,\n                tokenizer_hub=\"Quivr/gpt-4o\",\n            ),\n            \"gpt-4-turbo\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/gpt-4\",\n            ),\n            \"gpt-4\": LLMConfig(\n                max_context_tokens=8192,\n                max_output_tokens=8192,\n                tokenizer_hub=\"Quivr/gpt-4\",\n            ),\n            \"gpt-3.5-turbo\": LLMConfig(\n                max_context_tokens=16385,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/gpt-3.5-turbo\",\n            ),\n            \"text-embedding-3-large\": LLMConfig(\n                max_context_tokens=8191, tokenizer_hub=\"Quivr/text-embedding-ada-002\"\n            ),\n            \"text-embedding-3-small\": LLMConfig(\n                max_context_tokens=8191, tokenizer_hub=\"Quivr/text-embedding-ada-002\"\n            ),\n            \"text-embedding-ada-002\": LLMConfig(\n                max_context_tokens=8191, tokenizer_hub=\"Quivr/text-embedding-ada-002\"\n            ),\n        },\n        DefaultModelSuppliers.ANTHROPIC: {\n            \"claude-opus-4\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=8192,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-sonnet-4\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=8192,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-3-7-sonnet\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=8192,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-3-5-sonnet\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=8192,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-3-opus\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-3-sonnet\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-3-haiku\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-2-1\": LLMConfig(\n                max_context_tokens=200000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-2-0\": LLMConfig(\n                max_context_tokens=100000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n            \"claude-instant-1-2\": LLMConfig(\n                max_context_tokens=100000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/claude-tokenizer\",\n            ),\n        },\n        # Unclear for LLAMA models...\n        # see https://huggingface.co/meta-llama/Llama-3.1-405B-Instruct/discussions/6\n        DefaultModelSuppliers.META: {\n            \"llama-3.1\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/Meta-Llama-3.1-Tokenizer\",\n            ),\n            \"llama-3\": LLMConfig(\n                max_context_tokens=8192,\n                max_output_tokens=2048,\n                tokenizer_hub=\"Quivr/llama3-tokenizer-new\",\n            ),\n            \"code-llama\": LLMConfig(\n                max_context_tokens=16384, tokenizer_hub=\"Quivr/llama-code-tokenizer\"\n            ),\n        },\n        DefaultModelSuppliers.GROQ: {\n            \"llama-3.3-70b\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/Meta-Llama-3.1-Tokenizer\",\n            ),\n            \"llama-3.1-70b\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/Meta-Llama-3.1-Tokenizer\",\n            ),\n            \"llama-3\": LLMConfig(\n                max_context_tokens=8192, tokenizer_hub=\"Quivr/llama3-tokenizer-new\"\n            ),\n            \"code-llama\": LLMConfig(\n                max_context_tokens=16384, tokenizer_hub=\"Quivr/llama-code-tokenizer\"\n            ),\n            \"deepseek-r1-distill-llama-70b\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/Meta-Llama-3.1-Tokenizer\",\n            ),\n            \"meta-llama/llama-4-maverick-17b-128e-instruct\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=32768,\n                tokenizer_hub=\"Quivr/Meta-Llama-3.1-Tokenizer\",\n            ),\n        },\n        DefaultModelSuppliers.MISTRAL: {\n            \"mistral-large\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/mistral-tokenizer-v3\",\n            ),\n            \"mistral-small\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/mistral-tokenizer-v3\",\n            ),\n            \"mistral-nemo\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/Mistral-Nemo-Instruct-Tokenizer\",\n            ),\n            \"codestral\": LLMConfig(\n                max_context_tokens=32000, tokenizer_hub=\"Quivr/mistral-tokenizer-v3\"\n            ),\n        },\n        DefaultModelSuppliers.GEMINI: {\n            \"gemini-2.5\": LLMConfig(\n                max_context_tokens=128000,\n                max_output_tokens=4096,\n                tokenizer_hub=\"Quivr/gemini-tokenizer\",\n            ),\n        },\n    }\n\n    @classmethod\n    def get_supplier_by_model_name(cls, model: str) -> DefaultModelSuppliers | None:\n        # Iterate over the suppliers and their models\n        for supplier, models in cls._model_defaults.items():\n            # Check if the model name or a base part of the model name is in the supplier's models\n            for base_model_name in models:\n                if model.startswith(base_model_name):\n                    return supplier\n        # Return None if no supplier matches the model name\n        return None\n\n    @classmethod\n    def get_llm_model_config(\n        cls, supplier: DefaultModelSuppliers, model_name: str\n    ) -> Optional[LLMConfig]:\n        \"\"\"Retrieve the LLMConfig (context and tokenizer_hub) for a given supplier and model.\"\"\"\n        supplier_defaults = cls._model_defaults.get(supplier)\n        if not supplier_defaults:\n            return None\n\n        # Use startswith logic for matching model names\n        for key, config in supplier_defaults.items():\n            if model_name.startswith(key):\n                return config\n\n        return None\n\n\nclass LLMEndpointConfig(QuivrBaseConfig):\n    supplier: DefaultModelSuppliers = DefaultModelSuppliers.OPENAI\n    model: str = \"gpt-4o\"\n    tokenizer_hub: str | None = None\n    llm_base_url: str | None = None\n    env_variable_name: str | None = None\n    llm_api_key: str | None = None\n    max_context_tokens: int = 20000\n    max_output_tokens: int = 4096\n    temperature: float = 0.3\n    streaming: bool = True\n    prompt: BasePromptTemplate | None = None\n\n    _FALLBACK_TOKENIZER = \"cl100k_base\"\n\n    def __hash__(self):\n        return hash(\n            (\n                self.supplier,\n                self.model,\n                self.tokenizer_hub,\n                self.llm_base_url,\n                self.env_variable_name,\n                self.llm_api_key,\n                self.max_context_tokens,\n                self.max_output_tokens,\n                self.temperature,\n                self.streaming,\n                repr(self.prompt) if self.prompt is not None else None,\n            )\n        )\n\n    @property\n    def fallback_tokenizer(self) -> str:\n        return self._FALLBACK_TOKENIZER\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self.set_llm_model_config()\n        self.set_api_key()\n\n    def set_api_key(self, force_reset: bool = False):\n        if not self.supplier:\n            return\n\n        # Check if the corresponding API key environment variable is set\n        if force_reset or not self.env_variable_name:\n            self.env_variable_name = (\n                f\"{normalize_to_env_variable_name(self.supplier)}_API_KEY\"\n            )\n\n        if not self.llm_api_key or force_reset:\n            self.llm_api_key = os.getenv(self.env_variable_name)\n\n        if not self.llm_api_key:\n            logger.warning(f\"The API key for supplier '{self.supplier}' is not set. \")\n            logger.warning(\n                f\"Please set the environment variable: '{self.env_variable_name}'. \"\n            )\n\n    def set_llm_model_config(self):\n        # Automatically set context_length and tokenizer_hub based on the supplier and model\n        llm_model_config = LLMModelConfig.get_llm_model_config(\n            self.supplier, self.model\n        )\n        if llm_model_config:\n            if llm_model_config.max_context_tokens:\n                _max_context_tokens = (\n                    llm_model_config.max_context_tokens\n                    - llm_model_config.max_output_tokens\n                    if llm_model_config.max_output_tokens\n                    else llm_model_config.max_context_tokens\n                )\n                if self.max_context_tokens > _max_context_tokens:\n                    logger.warning(\n                        f\"Lowering max_context_tokens from {self.max_context_tokens} to {_max_context_tokens}\"\n                    )\n                    self.max_context_tokens = _max_context_tokens\n\n                if self.max_context_tokens < MIN_CONTEXT_TOKENS:\n                    logger.error(\n                        f\"max_context_tokens is too low: {self.max_context_tokens}. \"\n                    )\n                    raise ValueError(\n                        f\"max_context_tokens is too low: {self.max_context_tokens}. \"\n                    )\n            if llm_model_config.max_output_tokens:\n                if self.max_output_tokens > llm_model_config.max_output_tokens:\n                    logger.warning(\n                        f\"Lowering max_output_tokens from {self.max_output_tokens} to {llm_model_config.max_output_tokens}\"\n                    )\n                    self.max_output_tokens = llm_model_config.max_output_tokens\n\n                if self.max_output_tokens < MIN_OUTPUT_TOKENS:\n                    logger.error(\n                        f\"max_output_tokens is too low: {self.max_output_tokens}. \"\n                    )\n                    raise ValueError(\n                        f\"max_output_tokens is too low: {self.max_output_tokens}. \"\n                    )\n\n            self.tokenizer_hub = llm_model_config.tokenizer_hub\n\n    def set_llm_model(self, model: str):\n        supplier = LLMModelConfig.get_supplier_by_model_name(model)\n        if supplier is None:\n            raise ValueError(\n                f\"Cannot find the corresponding supplier for model {model}\"\n            )\n        self.supplier = supplier\n        self.model = model\n\n        self.set_llm_model_config()\n        self.set_api_key(force_reset=True)\n\n    def set_from_sqlmodel(self, sqlmodel: BaseModel, mapping: Dict[str, str]):\n        \"\"\"\n        Set attributes in LLMEndpointConfig from Model attributes using a field mapping.\n\n        :param model_instance: An instance of the Model class.\n        :param mapping: A dictionary that maps Model fields to LLMEndpointConfig fields.\n                        Example: {\"max_input\": \"max_input_tokens\", \"env_variable_name\": \"env_variable_name\"}\n        \"\"\"\n        for model_field, llm_field in mapping.items():\n            if hasattr(sqlmodel, model_field) and hasattr(self, llm_field):\n                setattr(self, llm_field, getattr(sqlmodel, model_field))\n            else:\n                raise AttributeError(\n                    f\"Invalid mapping: {model_field} or {llm_field} does not exist.\"\n                )\n\n\n# Cannot use Pydantic v2 field_validator because of conflicts with pydantic v1 still in use in LangChain\nclass RerankerConfig(QuivrBaseConfig):\n    supplier: DefaultRerankers | None = None\n    model: str | None = None\n    top_n: int = 5  # Number of chunks returned by the re-ranker\n    api_key: str | None = None\n    relevance_score_threshold: float | None = None\n    relevance_score_key: str = \"relevance_score\"\n\n    def __init__(self, **data):\n        super().__init__(**data)  # Call Pydantic's BaseModel init\n        self.validate_model()  # Automatically call external validation\n\n    def validate_model(self):\n        # If model is not provided, get default model based on supplier\n        if self.model is None and self.supplier is not None:\n            self.model = self.supplier.default_model\n\n        # Check if the corresponding API key environment variable is set\n        if self.supplier:\n            api_key_var = f\"{normalize_to_env_variable_name(self.supplier)}_API_KEY\"\n            self.api_key = os.getenv(api_key_var)\n\n            if self.api_key is None:\n                raise ValueError(\n                    f\"The API key for supplier '{self.supplier}' is not set. \"\n                    f\"Please set the environment variable: {api_key_var}\"\n                )\n\n\nclass ConditionalEdgeConfig(QuivrBaseConfig):\n    routing_function: str\n    conditions: Union[list, Dict[Hashable, str]]\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self.resolve_special_edges()\n\n    def resolve_special_edges(self):\n        \"\"\"Replace SpecialEdges enum values with their corresponding langgraph values.\"\"\"\n\n        if isinstance(self.conditions, dict):\n            # If conditions is a dictionary, iterate through the key-value pairs\n            for key, value in self.conditions.items():\n                if value == SpecialEdges.end:\n                    self.conditions[key] = END\n                elif value == SpecialEdges.start:\n                    self.conditions[key] = START\n        elif isinstance(self.conditions, list):\n            # If conditions is a list, iterate through the values\n            for index, value in enumerate(self.conditions):\n                if value == SpecialEdges.end:\n                    self.conditions[index] = END\n                elif value == SpecialEdges.start:\n                    self.conditions[index] = START\n\n\nclass NodeConfig(QuivrBaseConfig):\n    name: str\n    description: str | None = None\n    edges: List[str] | None = None\n    conditional_edge: ConditionalEdgeConfig | None = None\n    tools: List[Dict[str, Any]] | None = None\n    instantiated_tools: List[BaseTool | Type] | None = None\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self._instantiate_tools()\n        self.resolve_special_edges_in_name_and_edges()\n\n    def resolve_special_edges_in_name_and_edges(self):\n        \"\"\"Replace SpecialEdges enum values in name and edges with corresponding langgraph values.\"\"\"\n        if self.name == SpecialEdges.start:\n            self.name = START\n        elif self.name == SpecialEdges.end:\n            self.name = END\n\n        if self.edges:\n            for i, edge in enumerate(self.edges):\n                if edge == SpecialEdges.start:\n                    self.edges[i] = START\n                elif edge == SpecialEdges.end:\n                    self.edges[i] = END\n\n    def _instantiate_tools(self):\n        \"\"\"Instantiate tools based on the configuration.\"\"\"\n        if self.tools:\n            self.instantiated_tools = [\n                LLMToolFactory.create_tool(tool_config.pop(\"name\"), tool_config)\n                for tool_config in self.tools\n            ]\n\n\nclass DefaultWorkflow(str, Enum):\n    RAG = \"rag\"\n\n    @property\n    def nodes(self) -> List[NodeConfig]:\n        # Mapping of workflow types to their default node configurations\n        workflows = {\n            self.RAG: [\n                NodeConfig(name=START, edges=[\"filter_history\"]),\n                NodeConfig(name=\"filter_history\", edges=[\"rewrite\"]),\n                NodeConfig(name=\"rewrite\", edges=[\"retrieve\"]),\n                NodeConfig(name=\"retrieve\", edges=[\"generate_rag\"]),\n                NodeConfig(name=\"generate_rag\", edges=[END]),\n            ]\n        }\n        return workflows[self]\n\n\nclass WorkflowConfig(QuivrBaseConfig):\n    name: str | None = None\n    nodes: List[NodeConfig] = []\n    available_tools: List[str] | None = None\n    validated_tools: List[BaseTool | Type] = []\n    activated_tools: List[BaseTool | Type] = []\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self.check_first_node_is_start()\n        self.validate_available_tools()\n\n    def check_first_node_is_start(self):\n        if self.nodes and self.nodes[0].name != START:\n            raise ValueError(f\"The first node should be a {SpecialEdges.start} node\")\n\n    def get_node_tools(self, node_name: str) -> List[Any]:\n        \"\"\"Get tools for a specific node.\"\"\"\n        for node in self.nodes:\n            if node.name == node_name and node.instantiated_tools:\n                return node.instantiated_tools\n        return []\n\n    def validate_available_tools(self):\n        if self.available_tools:\n            valid_tools = list(TOOLS_CATEGORIES.keys()) + list(TOOLS_LISTS.keys())\n            for tool in self.available_tools:\n                if tool.lower() in valid_tools:\n                    self.validated_tools.append(\n                        LLMToolFactory.create_tool(tool, {}).tool\n                    )\n                else:\n                    matches = process.extractOne(\n                        tool.lower(), valid_tools, scorer=fuzz.WRatio\n                    )\n                    if matches:\n                        raise ValueError(\n                            f\"Tool {tool} is not a valid ToolsCategory or ToolsList. Did you mean {matches[0]}?\"\n                        )\n                    else:\n                        raise ValueError(\n                            f\"Tool {tool} is not a valid ToolsCategory or ToolsList\"\n                        )\n\n\nclass RetrievalConfig(QuivrBaseConfig):\n    reranker_config: RerankerConfig = RerankerConfig()\n    llm_config: LLMEndpointConfig = LLMEndpointConfig()\n    max_history: int = 10\n    max_files: int = 20\n    k: int = 40  # Number of chunks returned by the retriever\n    prompt: str | None = None\n    workflow_config: WorkflowConfig = WorkflowConfig(nodes=DefaultWorkflow.RAG.nodes)\n\n    def __init__(self, **data):\n        super().__init__(**data)\n        self.llm_config.set_api_key(force_reset=True)\n\n\nclass ParserConfig(QuivrBaseConfig):\n    splitter_config: SplitterConfig = SplitterConfig()\n    megaparse_config: MegaparseConfig = MegaparseConfig()\n\n\nclass IngestionConfig(QuivrBaseConfig):\n    parser_config: ParserConfig = ParserConfig()\n\n\nclass AssistantConfig(QuivrBaseConfig):\n    retrieval_config: RetrievalConfig = RetrievalConfig()\n    ingestion_config: IngestionConfig = IngestionConfig()\n"
  },
  {
    "path": "core/quivr_core/rag/entities/models.py",
    "content": "from datetime import datetime\nfrom enum import Enum\nfrom typing import Any, Dict, Optional\nfrom uuid import UUID\n\nfrom langchain_core.documents import Document\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom pydantic import BaseModel, Field\nfrom typing_extensions import TypedDict\n\n\nclass cited_answer(BaseModel):\n    \"\"\"Answer the user question based only on the given sources, and cite the sources used.\"\"\"\n\n    answer: str = Field(\n        ...,\n        description=\"The answer to the user question, which is based only on the given sources.\",\n    )\n    citations: list[int] = Field(\n        ...,\n        description=\"The integer IDs of the SPECIFIC sources which justify the answer.\",\n    )\n\n    followup_questions: list[str] = Field(\n        ...,\n        description=\"Generate up to 3 follow-up questions that could be asked based on the answer given or context provided.\",\n    )\n\n\nclass ChatMessage(BaseModel):\n    chat_id: UUID\n    message_id: UUID\n    brain_id: UUID | None\n    msg: HumanMessage | AIMessage\n    message_time: datetime\n    metadata: dict[str, Any]\n\n\nclass KnowledgeStatus(str, Enum):\n    ERROR = \"ERROR\"\n    RESERVED = \"RESERVED\"\n    PROCESSING = \"PROCESSING\"\n    PROCESSED = \"PROCESSED\"\n    UPLOADED = \"UPLOADED\"\n\n\nclass Source(BaseModel):\n    name: str\n    source_url: str\n    type: str\n    original_file_name: str\n    citation: str\n\n\nclass RawRAGChunkResponse(TypedDict):\n    answer: dict[str, Any]\n    docs: dict[str, Any]\n\n\nclass RawRAGResponse(TypedDict):\n    answer: dict[str, Any]\n    docs: dict[str, Any]\n\n\nclass LangchainMetadata(BaseModel):\n    langfuse_trace_id: str | None = None\n    langfuse_trace_url: str | None = None\n    langfuse_session_id: str | None = None\n    langfuse_user_id: str | None = None\n\n\nclass ChatLLMMetadata(BaseModel):\n    name: str\n    display_name: str | None = None\n    description: str | None = None\n    image_url: str | None = None\n    brain_id: str | None = None\n    brain_name: str | None = None\n\n\nclass RAGResponseMetadata(BaseModel):\n    citations: list[int] = Field(default_factory=list)\n    followup_questions: list[str] = Field(default_factory=list)\n    sources: list[Any] = Field(default_factory=list)\n    metadata_model: ChatLLMMetadata | None = None\n    workflow_step: str | None = None\n    langchain_metadata: LangchainMetadata | None = None\n\n\nclass ParsedRAGResponse(BaseModel):\n    answer: str\n    metadata: RAGResponseMetadata | None = None\n\n\nclass ParsedRAGChunkResponse(BaseModel):\n    answer: str\n    metadata: RAGResponseMetadata\n    last_chunk: bool = False\n\n\nclass QuivrKnowledge(BaseModel):\n    id: UUID\n    file_name: str\n    brain_ids: list[UUID] | None = None\n    url: Optional[str] = None\n    extension: str = \".txt\"\n    mime_type: str = \"txt\"\n    status: KnowledgeStatus = KnowledgeStatus.PROCESSING\n    source: Optional[str] = None\n    source_link: str | None = None\n    file_size: int | None = None  # FIXME: Should not be optional @chloedia\n    file_sha1: Optional[str] = None  # FIXME: Should not be optional @chloedia\n    updated_at: Optional[datetime] = None\n    created_at: Optional[datetime] = None\n    metadata: Optional[Dict[str, str]] = None\n\n\nclass SearchResult(BaseModel):\n    chunk: Document\n    distance: float\n"
  },
  {
    "path": "core/quivr_core/rag/prompts.py",
    "content": "import datetime\nimport types\nfrom enum import Enum\n\nfrom langchain_core.prompts import (\n    ChatPromptTemplate,\n    HumanMessagePromptTemplate,\n    MessagesPlaceholder,\n    PromptTemplate,\n    SystemMessagePromptTemplate,\n)\nfrom langchain_core.prompts.base import BasePromptTemplate\n\n\nclass TemplatePromptName(str, Enum):\n    ZENDESK_TEMPLATE_PROMPT = \"ZENDESK_TEMPLATE_PROMPT\"\n    TOOL_ROUTING_PROMPT = \"TOOL_ROUTING_PROMPT\"\n    RAG_ANSWER_PROMPT = \"RAG_ANSWER_PROMPT\"\n    CONDENSE_TASK_PROMPT = \"CONDENSE_TASK_PROMPT\"\n    DEFAULT_DOCUMENT_PROMPT = \"DEFAULT_DOCUMENT_PROMPT\"\n    CHAT_LLM_PROMPT = \"CHAT_LLM_PROMPT\"\n    USER_INTENT_PROMPT = \"USER_INTENT_PROMPT\"\n    UPDATE_PROMPT = \"UPDATE_PROMPT\"\n    SPLIT_PROMPT = \"SPLIT_PROMPT\"\n    ZENDESK_LLM_PROMPT = \"ZENDESK_LLM_PROMPT\"\n\n\ndef _define_custom_prompts() -> dict[TemplatePromptName, BasePromptTemplate]:\n    custom_prompts: dict[TemplatePromptName, BasePromptTemplate] = {}\n\n    today_date = datetime.datetime.now().strftime(\"%B %d, %Y\")\n\n    # ---------------------------------------------------------------------------\n    # Prompt for task rephrasing\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        \"Given a chat history and the latest user task \"\n        \"which might reference context in the chat history, \"\n        \"formulate a standalone task which can be understood \"\n        \"without the chat history. Do NOT complete the task, \"\n        \"just reformulate it if needed and otherwise return it as is. \"\n        \"Do not output your reasoning, just the task.\"\n    )\n\n    template_answer = \"User task: {task}\\n Standalone task:\"\n\n    CONDENSE_TASK_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n\n    custom_prompts[TemplatePromptName.CONDENSE_TASK_PROMPT] = CONDENSE_TASK_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt for RAG\n    # ---------------------------------------------------------------------------\n    system_message_template = f\"Your name is Quivr. You're a helpful assistant. Today's date is {today_date}. \"\n\n    system_message_template += (\n        \"- When answering use markdown. Use markdown code blocks for code snippets.\\n\"\n        \"- Answer in a concise and clear manner.\\n\"\n        \"- If no preferred language is provided, answer in the same language as the language used by the user.\\n\"\n        \"- You must use ONLY the provided context to complete the task. \"\n        \"Do not use any prior knowledge or external information, even if you are certain of the answer.\\n\"\n        # \"- If you cannot provide an answer using ONLY the context provided, do not attempt to answer from your own knowledge.\"\n        # \"Instead, inform the user that the answer isn't available in the context and suggest using the available tools {tools}.\\n\"\n        \"- Do not apologize when providing an answer.\\n\"\n        \"- Don't cite the source id in the answer objects, but you can use the source to complete the task.\\n\\n\"\n    )\n\n    context_template = (\n        \"\\n\"\n        # \"- You have access to the following internal reasoning to provide an answer: {reasoning}\\n\"\n        \"- You have access to the following files to complete the task (limited to first 20 files): {files}\\n\"\n        \"- You have access to the following context to complete the task: {context}\\n\"\n        \"- Follow these user instruction when crafting the answer: {custom_instructions}\\n\"\n        \"- These user instructions shall take priority over any other previous instruction.\\n\"\n        # \"- Remember: if you cannot provide an answer using ONLY the provided context and CITING the sources, \"\n        # \"inform the user that you don't have the answer and consider if any of the tools can help answer the question.\\n\"\n        # \"- Explain your reasoning about the potentiel tool usage in the answer.\\n\"\n        # \"- Only use binded tools to answer the question.\\n\"\n        # \"OFFER the user the possibility to ACTIVATE a relevant tool among \"\n        # \"the tools which can be activated.\"\n        # \"Tools which can be activated: {tools}. If any of these tools can help in providing an answer \"\n        # \"to the user question, you should offer the user the possibility to activate it. \"\n        # \"Remember, you shall NOT use the above tools, ONLY offer the user the possibility to activate them.\\n\"\n    )\n\n    template_answer = (\n        \"Original task: {task}\\n\"\n        \"Rephrased and contextualized task: {rephrased_task}\\n\"\n        \"Remember, you shall complete ALL tasks.\\n\"\n        \"Remember: if you cannot provide an answer using ONLY the provided context and CITING the sources, \"\n        \"just answer that you don't have the answer.\\n\"\n        \"If the provided context contains contradictory or conflicting information, state so providing the conflicting information.\\n\"\n    )\n\n    RAG_ANSWER_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            SystemMessagePromptTemplate.from_template(context_template),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.RAG_ANSWER_PROMPT] = RAG_ANSWER_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt for formatting documents\n    # ---------------------------------------------------------------------------\n    DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(\n        template=\"Filename: {original_file_name}\\nSource: {index} \\n {page_content}\"\n    )\n    custom_prompts[TemplatePromptName.DEFAULT_DOCUMENT_PROMPT] = DEFAULT_DOCUMENT_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt for chatting directly with LLMs, without any document retrieval stage\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        f\"Your name is Quivr. You're a helpful assistant. Today's date is {today_date}.\"\n    )\n    system_message_template += \"\"\"\n    If not None, also follow these user instructions when answering: {custom_instructions}\n    \"\"\"\n\n    template_answer = \"\"\"\n    User Task: {task}\n    Answer:\n    \"\"\"\n    CHAT_LLM_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.CHAT_LLM_PROMPT] = CHAT_LLM_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt to understand the user intent\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        \"Given the following user input, determine the user intent, in particular \"\n        \"whether the user is providing instructions to the system or is asking the system to \"\n        \"complete a task:\\n\"\n        \"    - if the user is providing direct instructions to modify the system behaviour (for instance, \"\n        \"'Can you reply in French?' or 'Answer in French' or 'You are an expert legal assistant' \"\n        \"or 'You will behave as...'), the user intent is 'prompt';\\n\"\n        \"    - in all other cases (asking questions, asking for summarising a text, asking for translating a text, ...), \"\n        \"the intent is 'task'.\\n\"\n    )\n\n    template_answer = \"User input: {task}\"\n\n    USER_INTENT_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.USER_INTENT_PROMPT] = USER_INTENT_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt to create a system prompt from user instructions\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        \"- Given the following user instruction, current system prompt, list of available tools \"\n        \"and list of activated tools, update the prompt to include the instruction and decide which tools to activate.\\n\"\n        \"- The prompt shall only contain generic instructions which can be applied to any user task or question.\\n\"\n        \"- The prompt shall be concise and clear.\\n\"\n        \"- If the system prompt already contains the instruction, do not add it again.\\n\"\n        \"- If the system prompt contradicts ther user instruction, remove the contradictory \"\n        \"statement or statements in the system prompt.\\n\"\n        \"- You shall return separately the updated system prompt and the reasoning that led to the update.\\n\"\n        \"- If the system prompt refers to a tool, you shall add the tool to the list of activated tools.\\n\"\n        \"- If no tool activation is needed, return empty lists.\\n\"\n        \"- You shall also return the reasoning that led to the tool activation.\\n\"\n        \"- Current system prompt: {system_prompt}\\n\"\n        \"- List of available tools: {available_tools}\\n\"\n        \"- List of activated tools: {activated_tools}\\n\\n\"\n    )\n\n    template_answer = \"User instructions: {instruction}\\n\"\n\n    UPDATE_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.UPDATE_PROMPT] = UPDATE_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt to split the user input into multiple questions / instructions\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        \"Given a chat history and the user input, split and rephrase the input into instructions and tasks.\\n\"\n        \"- Instructions direct the system to behave in a certain way or to use specific tools: examples of instructions are \"\n        \"'Can you reply in French?', 'Answer in French', 'You are an expert legal assistant', \"\n        \"'You will behave as...', 'Use web search').\\n\"\n        \"- You shall collect and condense all the instructions into a single string.\\n\"\n        \"- The instructions shall be standalone and self-contained, so that they can be understood \"\n        \"without the chat history. If no instructions are found, return an empty string.\\n\"\n        \"- Instructions to be understood may require considering the chat history.\\n\"\n        \"- Tasks are often questions, but they can also be summarisation tasks, translation tasks, content generation tasks, etc.\\n\"\n        \"- Tasks to be understood may require considering the chat history.\\n\"\n        \"- If the user input contains different tasks, you shall split the input into multiple tasks.\\n\"\n        \"- Each splitted task shall be a standalone, self-contained task which can be understood \"\n        \"without the chat history. You shall rephrase the tasks if needed.\\n\"\n        \"- If no explicit task is present, you shall infer the tasks from the user input and the chat history.\\n\"\n        \"- Do NOT try to solve the tasks or answer the questions, \"\n        \"just reformulate them if needed and otherwise return them as is.\\n\"\n        \"- Remember, you shall NOT suggest or generate new tasks.\\n\"\n        \"- As an example, the user input 'What is Apple? Who is its CEO? When was it founded?' \"\n        \"shall be split into a list of tasks ['What is Apple?', 'Who is the CEO of Apple?', 'When was Apple founded?']\\n\"\n        \"- If no tasks are found, return the user input as is in the task list.\\n\"\n    )\n\n    template_answer = \"User input: {user_input}\"\n\n    SPLIT_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.SPLIT_PROMPT] = SPLIT_PROMPT\n\n    # ---------------------------------------------------------------------------\n    # Prompt to grade the relevance of an answer and decide whather to perform a web search\n    # ---------------------------------------------------------------------------\n    system_message_template = (\n        \"Given the following tasks you shall determine whether all tasks can be \"\n        \"completed fully and in the best possible way using the provided context and chat history. \"\n        \"You shall:\\n\"\n        \"- Consider each task separately,\\n\"\n        \"- Determine whether the context and chat history contain \"\n        \"all the information necessary to complete the task.\\n\"\n        \"- If the context and chat history do not contain all the information necessary to complete the task, \"\n        \"consider ONLY the list of tools below and select the tool most appropriate to complete the task.\\n\"\n        \"- If no tools are listed, return the tasks as is and no tool.\\n\"\n        \"- If no relevant tool can be selected, return the tasks as is and no tool.\\n\"\n        \"- Do not propose to use a tool if that tool is not listed among the available tools.\\n\"\n    )\n\n    context_template = \"Context: {context}\\n {activated_tools}\\n\"\n\n    template_answer = \"Tasks: {tasks}\\n\"\n\n    TOOL_ROUTING_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            SystemMessagePromptTemplate.from_template(context_template),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n\n    custom_prompts[TemplatePromptName.TOOL_ROUTING_PROMPT] = TOOL_ROUTING_PROMPT\n\n    system_message_zendesk_template = \"\"\"\n    You are a Customer Service Agent using Zendesk. You are answering a client query.\n    You will be provided with the users metadata, ticket metadata and ticket history which can be used to answer the query.\n    You will also have access to the most relevant similar tickets and additional information sometimes such as API calls.\n    Never add something in brackets that needs to be filled like [your name], [your email], etc. \n    Do NOT invent information that was not present in previous tickets or in user metabadata or ticket metadata or additional information.\n    Always prioritize information from the most recent tickets, especially if they are contradictory.\n    \n    Here is the current time: {current_time} UTC\n    \n    Here are default instructions that can be ignored if they are contradictory to the <instructions from me> section:\n    <default instructions>\n    - Don't be too verbose, use the same amount of details as in similar tickets.\n    - Use the same tone, format, structure and lexical field as in similar tickets agent responses.\n    - The text must be correctly formatted with paragraphs, bold, italic, etc so it is easier to read.\n    - Maintain consistency in terminology used in recent tickets.\n    - Answer in the same language as the user.\n    - Don't add a signature at the end of the answer, it will be added once the answer is sent.\n    </default instructions>\n    \n    \n    Here are instructions that you MUST follow and prioritize over the <default instructions> section:\n    <instructions from me>\n    {guidelines}\n    </instructions from me>\n    \"\"\"\n\n    user_prompt_template = \"\"\"\n    Here is information about the user that can help you to answer:\n    <user_metadata>\n    {user_metadata}\n    </user_metadata>\n\n    Here are metadata on the current ticket that can help you to answer:\n    <ticket_metadata>\n    {ticket_metadata}\n    </ticket_metadata>\n\n\n    Here are the most relevant similar tickets that can help you to answer:\n    <similar_tickets>\n    {similar_tickets}\n    </similar_tickets>\n\n    Here are the current ticket history:\n    <ticket_history>\n    {ticket_history}\n    </ticket_history>\n\n    Here are additional information that can help you to answer:\n    <additional_information>\n    {additional_information}\n    </additional_information>\n\n    Here is the client question to which you must answer:\n    <client_query>\n    {client_query}\n    </client_query>\n \n    Based on the informations provided, answer directly with the message to send to the customer, ready to be sent:\n    Answer:\"\"\"\n\n    ZENDESK_TEMPLATE_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_zendesk_template),\n            HumanMessagePromptTemplate.from_template(user_prompt_template),\n        ]\n    )\n    custom_prompts[TemplatePromptName.ZENDESK_TEMPLATE_PROMPT] = ZENDESK_TEMPLATE_PROMPT\n\n    system_message_template = \"{enforced_system_prompt}\"\n\n    template_answer = \"\"\"\n    <draft answer>\n    {task}\n    <draft answer>\n    Stick closely to this draft answer. Assume that the draft answer informations are correct, and do not try to outsmart him/her.\n    Respond directly with the message to send to the customer, ready to be sent:\n\n    Answer:\n    \"\"\"\n    ZENDESK_LLM_PROMPT = ChatPromptTemplate.from_messages(\n        [\n            SystemMessagePromptTemplate.from_template(system_message_template),\n            MessagesPlaceholder(variable_name=\"chat_history\"),\n            HumanMessagePromptTemplate.from_template(template_answer),\n        ]\n    )\n    custom_prompts[TemplatePromptName.ZENDESK_LLM_PROMPT] = ZENDESK_LLM_PROMPT\n\n    return custom_prompts\n\n\n_templ_registry: dict[TemplatePromptName, BasePromptTemplate] = _define_custom_prompts()\n\ncustom_prompts = types.MappingProxyType(_templ_registry)\n"
  },
  {
    "path": "core/quivr_core/rag/quivr_rag.py",
    "content": "import logging\nfrom operator import itemgetter\nfrom typing import AsyncGenerator, Optional, Sequence\n\n# TODO(@aminediro): this is the only dependency to langchain package, we should remove it\nfrom langchain.retrievers import ContextualCompressionRetriever\nfrom langchain_core.callbacks import Callbacks\nfrom langchain_core.documents import BaseDocumentCompressor, Document\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.runnables import RunnableLambda, RunnablePassthrough\nfrom langchain_core.vectorstores import VectorStore\n\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.rag.entities.config import RetrievalConfig\nfrom quivr_core.rag.entities.models import (\n    ParsedRAGChunkResponse,\n    ParsedRAGResponse,\n    QuivrKnowledge,\n    RAGResponseMetadata,\n    cited_answer,\n)\nfrom quivr_core.rag.prompts import TemplatePromptName, custom_prompts\nfrom quivr_core.rag.utils import (\n    LangfuseService,\n    combine_documents,\n    format_file_list,\n    get_chunk_metadata,\n    parse_chunk_response,\n    parse_response,\n)\n\nlogger = logging.getLogger(\"quivr_core\")\nlangfuse_service = LangfuseService()\nlangfuse_handler = langfuse_service.get_handler()\n\n\nclass IdempotentCompressor(BaseDocumentCompressor):\n    def compress_documents(\n        self,\n        documents: Sequence[Document],\n        query: str,\n        callbacks: Optional[Callbacks] = None,\n    ) -> Sequence[Document]:\n        return documents\n\n\nclass QuivrQARAG:\n    \"\"\"\n    QuivrQA RAG is a class that provides a RAG interface to the QuivrQA system.\n    \"\"\"\n\n    def __init__(\n        self,\n        *,\n        retrieval_config: RetrievalConfig,\n        llm: LLMEndpoint,\n        vector_store: VectorStore,\n        reranker: BaseDocumentCompressor | None = None,\n    ):\n        self.retrieval_config = retrieval_config\n        self.vector_store = vector_store\n        self.llm_endpoint = llm\n        self.reranker = reranker if reranker is not None else IdempotentCompressor()\n\n    @property\n    def retriever(self):\n        \"\"\"\n        Retriever is a function that retrieves the documents from the vector store.\n        \"\"\"\n        return self.vector_store.as_retriever()\n\n    def filter_history(\n        self,\n        chat_history: ChatHistory,\n    ):\n        \"\"\"\n        Filter out the chat history to only include the messages that are relevant to the current question\n\n        Takes in a chat_history= [HumanMessage(content='Qui est Chloé ? '), AIMessage(content=\"Chloé est une salariée travaillant pour l'entreprise Quivr en tant qu'AI Engineer, sous la direction de son supérieur hiérarchique, Stanislas Girard.\"), HumanMessage(content='Dis moi en plus sur elle'), AIMessage(content=''), HumanMessage(content='Dis moi en plus sur elle'), AIMessage(content=\"Désolé, je n'ai pas d'autres informations sur Chloé à partir des fichiers fournis.\")]\n        Returns a filtered chat_history with in priority: first max_tokens, then max_history where a Human message and an AI message count as one pair\n        a token is 4 characters\n        \"\"\"\n        total_tokens = 0\n        total_pairs = 0\n        filtered_chat_history: list[AIMessage | HumanMessage] = []\n        for human_message, ai_message in chat_history.iter_pairs():\n            # TODO: replace with tiktoken\n            message_tokens = (len(human_message.content) + len(ai_message.content)) // 4\n            if (\n                total_tokens + message_tokens\n                > self.retrieval_config.llm_config.max_output_tokens\n                or total_pairs >= self.retrieval_config.max_history\n            ):\n                break\n            filtered_chat_history.append(human_message)\n            filtered_chat_history.append(ai_message)\n            total_tokens += message_tokens\n            total_pairs += 1\n\n        return filtered_chat_history[::-1]\n\n    def build_chain(self, files: str):\n        \"\"\"\n        Builds the chain for the QuivrQA RAG.\n        \"\"\"\n        compression_retriever = ContextualCompressionRetriever(\n            base_compressor=self.reranker, base_retriever=self.retriever\n        )\n\n        loaded_memory = RunnablePassthrough.assign(\n            chat_history=RunnableLambda(\n                lambda x: self.filter_history(x[\"chat_history\"]),\n            ),\n            question=lambda x: x[\"question\"],\n        )\n\n        standalone_question = {\n            \"standalone_question\": {\n                \"question\": lambda x: x[\"question\"],\n                \"chat_history\": itemgetter(\"chat_history\"),\n            }\n            | custom_prompts[TemplatePromptName.DEFAULT_DOCUMENT_PROMPT]\n            | self.llm_endpoint._llm\n            | StrOutputParser(),\n        }\n\n        # Now we retrieve the documents\n        retrieved_documents = {\n            \"docs\": itemgetter(\"standalone_question\") | compression_retriever,\n            \"question\": lambda x: x[\"standalone_question\"],\n            \"custom_instructions\": lambda x: self.retrieval_config.prompt,\n        }\n\n        final_inputs = {\n            \"context\": lambda x: combine_documents(x[\"docs\"]),\n            \"question\": itemgetter(\"question\"),\n            \"custom_instructions\": itemgetter(\"custom_instructions\"),\n            \"files\": lambda _: files,  # TODO: shouldn't be here\n        }\n\n        # Bind the llm to cited_answer if model supports it\n        llm = self.llm_endpoint._llm\n        if self.llm_endpoint.supports_func_calling():\n            llm = self.llm_endpoint._llm.bind_tools(\n                [cited_answer],\n                tool_choice=\"any\",\n            )\n\n        answer = {\n            \"answer\": final_inputs\n            | custom_prompts[TemplatePromptName.RAG_ANSWER_PROMPT]\n            | llm,\n            \"docs\": itemgetter(\"docs\"),\n        }\n\n        return loaded_memory | standalone_question | retrieved_documents | answer\n\n    def answer(\n        self,\n        question: str,\n        history: ChatHistory,\n        list_files: list[QuivrKnowledge],\n        metadata: dict[str, str] = {},\n    ) -> ParsedRAGResponse:\n        \"\"\"\n        Answers a question using the QuivrQA RAG synchronously.\n        \"\"\"\n        concat_list_files = format_file_list(\n            list_files, self.retrieval_config.max_files\n        )\n        conversational_qa_chain = self.build_chain(concat_list_files)\n        raw_llm_response = conversational_qa_chain.invoke(\n            {\n                \"question\": question,\n                \"chat_history\": history,\n                \"custom_instructions\": (self.retrieval_config.prompt),\n            },\n            config={\"metadata\": metadata, \"callbacks\": [langfuse_handler]},\n        )\n        response = parse_response(\n            raw_llm_response, self.retrieval_config.llm_config.model\n        )\n        return response\n\n    async def answer_astream(\n        self,\n        question: str,\n        history: ChatHistory,\n        list_files: list[QuivrKnowledge],\n        metadata: dict[str, str] = {},\n    ) -> AsyncGenerator[ParsedRAGChunkResponse, ParsedRAGChunkResponse]:\n        \"\"\"\n        Answers a question using the QuivrQA RAG asynchronously.\n        \"\"\"\n        concat_list_files = format_file_list(\n            list_files, self.retrieval_config.max_files\n        )\n        conversational_qa_chain = self.build_chain(concat_list_files)\n\n        rolling_message = AIMessageChunk(content=\"\")\n        sources = []\n        prev_answer = \"\"\n        chunk_id = 0\n\n        async for chunk in conversational_qa_chain.astream(\n            {\n                \"question\": question,\n                \"chat_history\": history,\n                \"custom_personality\": (self.retrieval_config.prompt),\n            },\n            config={\"metadata\": metadata, \"callbacks\": [langfuse_handler]},\n        ):\n            # Could receive this anywhere so we need to save it for the last chunk\n            if \"docs\" in chunk:\n                sources = chunk[\"docs\"] if \"docs\" in chunk else []\n\n            if \"answer\" in chunk:\n                rolling_message, answer_str = parse_chunk_response(\n                    rolling_message,\n                    chunk,\n                    self.llm_endpoint.supports_func_calling(),\n                )\n\n                if len(answer_str) > 0:\n                    if self.llm_endpoint.supports_func_calling():\n                        diff_answer = answer_str[len(prev_answer) :]\n                        if len(diff_answer) > 0:\n                            parsed_chunk = ParsedRAGChunkResponse(\n                                answer=diff_answer,\n                                metadata=RAGResponseMetadata(),\n                            )\n                            prev_answer += diff_answer\n\n                            logger.debug(\n                                f\"answer_astream func_calling=True question={question} rolling_msg={rolling_message} chunk_id={chunk_id}, chunk={parsed_chunk}\"\n                            )\n                            yield parsed_chunk\n                    else:\n                        parsed_chunk = ParsedRAGChunkResponse(\n                            answer=answer_str,\n                            metadata=RAGResponseMetadata(),\n                        )\n                        logger.debug(\n                            f\"answer_astream func_calling=False question={question} rolling_msg={rolling_message} chunk_id={chunk_id}, chunk={parsed_chunk}\"\n                        )\n                        yield parsed_chunk\n\n                    chunk_id += 1\n\n        # Last chunk provides metadata\n        last_chunk = ParsedRAGChunkResponse(\n            answer=\"\",\n            metadata=get_chunk_metadata(rolling_message, sources),\n            last_chunk=True,\n        )\n        logger.debug(\n            f\"answer_astream last_chunk={last_chunk} question={question} rolling_msg={rolling_message} chunk_id={chunk_id}\"\n        )\n        yield last_chunk\n"
  },
  {
    "path": "core/quivr_core/rag/quivr_rag_langgraph.py",
    "content": "import asyncio\nimport datetime\nimport logging\nfrom collections import OrderedDict\nfrom typing import (\n    Annotated,\n    Any,\n    AsyncGenerator,\n    Dict,\n    List,\n    Optional,\n    Sequence,\n    Tuple,\n    Type,\n    TypedDict,\n)\nfrom uuid import UUID, uuid4\n\nimport openai\nfrom langchain.retrievers import ContextualCompressionRetriever\nfrom langchain_cohere import CohereRerank\nfrom langchain_community.document_compressors import JinaRerank\nfrom langchain_core.callbacks import Callbacks\nfrom langchain_core.documents import BaseDocumentCompressor, Document\nfrom langchain_core.messages import BaseMessage, HumanMessage, SystemMessage\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\nfrom langchain_core.prompts.base import BasePromptTemplate\nfrom langchain_core.runnables.schema import StreamEvent\nfrom langchain_core.vectorstores import VectorStore\nfrom langgraph.graph import END, START, StateGraph\nfrom langgraph.graph.message import add_messages\nfrom langgraph.types import Send\nfrom pydantic import BaseModel, Field\n\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.llm_tools.llm_tools import LLMToolFactory\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.rag.entities.config import DefaultRerankers, NodeConfig, RetrievalConfig\nfrom quivr_core.rag.entities.models import (\n    LangchainMetadata,\n    ParsedRAGChunkResponse,\n    QuivrKnowledge,\n    RAGResponseMetadata,\n)\nfrom quivr_core.rag.prompts import TemplatePromptName, custom_prompts\nfrom quivr_core.rag.utils import (\n    LangfuseService,\n    collect_tools,\n    combine_documents,\n    format_dict,\n    format_file_list,\n    get_chunk_metadata,\n    parse_chunk_response,\n)\n\nlogger = logging.getLogger(\"quivr_core\")\n\nlangfuse_service = LangfuseService()\nlangfuse_handler = langfuse_service.get_handler()\n\n\nclass SplittedInput(BaseModel):\n    instructions_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The reasoning that leads to identifying the user instructions to the system\",\n    )\n    instructions: Optional[str] = Field(\n        default=None, description=\"The instructions to the system\"\n    )\n\n    tasks_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The reasoning that leads to identifying the explicit or implicit user tasks and questions\",\n    )\n    task_list: Optional[List[str]] = Field(\n        default_factory=lambda: [\"No explicit or implicit tasks found\"],\n        description=\"The list of standalone, self-contained tasks or questions.\",\n    )\n\n\nclass TasksCompletion(BaseModel):\n    is_task_completable_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The reasoning that leads to identifying whether the user task or question can be completed using the provided context and chat history BEFORE any tool is used.\",\n    )\n\n    is_task_completable: bool = Field(\n        description=\"Whether the user task or question can be completed using the provided context and chat history BEFORE any tool is used.\",\n    )\n\n    tool_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The reasoning that leads to identifying the tool that shall be used to complete the task.\",\n    )\n    tool: Optional[str] = Field(\n        description=\"The tool that shall be used to complete the task.\",\n    )\n\n\nclass FinalAnswer(BaseModel):\n    reasoning_answer: str = Field(\n        description=\"The step-by-step reasoning that led to the final answer\"\n    )\n    answer: str = Field(description=\"The final answer to the user tasks/questions\")\n\n    all_tasks_completed: bool = Field(\n        description=\"Whether all tasks/questions have been successfully answered/completed or not. \"\n        \" If the final answer to the user is 'I don't know' or 'I don't have enough information' or 'I'm not sure', \"\n        \" this variable should be 'false'\"\n    )\n\n\nclass UpdatedPromptAndTools(BaseModel):\n    prompt_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The step-by-step reasoning that leads to the updated system prompt\",\n    )\n    prompt: Optional[str] = Field(default=None, description=\"The updated system prompt\")\n\n    tools_reasoning: Optional[str] = Field(\n        default=None,\n        description=\"The reasoning that leads to activating and deactivating the tools\",\n    )\n    tools_to_activate: Optional[List[str]] = Field(\n        default_factory=list, description=\"The list of tools to activate\"\n    )\n    tools_to_deactivate: Optional[List[str]] = Field(\n        default_factory=list, description=\"The list of tools to deactivate\"\n    )\n\n\nclass UserTaskEntity(BaseModel):\n    id: UUID\n    definition: str\n    docs: List[Document] = Field(default_factory=list)\n    completable: bool = Field(\n        default=False, description=\"Whether the task has been completed or not\"\n    )\n    tool: Optional[str] = Field(\n        default=None, description=\"The tool that shall be used to complete the task\"\n    )\n\n    def has_tool(self) -> bool:\n        return bool(self.tool)\n\n    def is_completable(self) -> bool:\n        return self.completable\n\n\nclass UserTasks:\n    def __init__(self, task_definitions: List[str] | None = None):\n        self.user_tasks = {}\n        if task_definitions:\n            for definition in task_definitions:\n                id = uuid4()\n                self.user_tasks[id] = UserTaskEntity(\n                    id=id, definition=definition, docs=[]\n                )\n\n    def __iter__(self):\n        return iter(self.user_tasks.values())\n\n    def set_docs(self, id: UUID, docs: List[Document]):\n        if self.user_tasks:\n            if id in self.user_tasks:\n                self.user_tasks[id].docs = docs\n            else:\n                raise ValueError(f\"Task with id {id} not found\")\n\n    def set_definition(self, id: UUID, definition: str):\n        if self.user_tasks:\n            if id in self.user_tasks:\n                self.user_tasks[id].definition = definition\n            else:\n                raise ValueError(f\"Task with id {id} not found\")\n\n    def set_completion(self, id: UUID, completable: bool):\n        if self.user_tasks:\n            if id in self.user_tasks:\n                self.user_tasks[id].completable = completable\n            else:\n                raise ValueError(f\"Task with id {id} not found\")\n\n    def set_tool(self, id: UUID, tool: str):\n        if self.user_tasks:\n            if id in self.user_tasks:\n                self.user_tasks[id].tool = tool\n            else:\n                raise ValueError(f\"Task with id {id} not found\")\n\n    def __call__(self, id: UUID) -> UserTaskEntity:\n        return self.user_tasks[id]\n\n    def has_tasks(self) -> bool:\n        return bool(self.user_tasks)\n\n    def has_non_completable_tasks(self) -> bool:\n        return bool(self.non_completable_tasks)\n\n    @property\n    def non_completable_tasks(self) -> List[UserTaskEntity]:\n        return [task for task in self.user_tasks.values() if not task.is_completable()]\n\n    @property\n    def completable_tasks(self) -> List[UserTaskEntity]:\n        return [task for task in self.user_tasks.values() if task.is_completable()]\n\n    @property\n    def ids(self) -> List[UUID]:\n        return list(self.user_tasks.keys())\n\n    @property\n    def definitions(self) -> List[str]:\n        return [task.definition for task in self.user_tasks.values()]\n\n    @property\n    def docs(self) -> List[Document]:\n        # Return the concatenation of all docs\n        return [doc for task in self.user_tasks.values() for doc in task.docs]\n\n\nclass AgentState(TypedDict):\n    messages: Annotated[Sequence[BaseMessage], add_messages]\n    reasoning: List[str]\n    chat_history: ChatHistory\n    files: str\n    tasks: UserTasks\n    instructions: str\n    ticket_metadata: Optional[dict[str, str]]\n    user_metadata: Optional[dict[str, str]]\n    additional_information: Optional[dict[str, str]]\n    tool: str\n    guidelines: str\n    enforced_system_prompt: str\n    _filter: Optional[Dict[str, Any]]\n    ticket_history: str\n\n\nclass IdempotentCompressor(BaseDocumentCompressor):\n    def compress_documents(\n        self,\n        documents: Sequence[Document],\n        query: str,\n        callbacks: Optional[Callbacks] = None,\n    ) -> Sequence[Document]:\n        \"\"\"\n        A no-op document compressor that simply returns the documents it is given.\n\n        This is a placeholder until a more sophisticated document compression\n        algorithm is implemented.\n        \"\"\"\n        return documents\n\n\nclass QuivrQARAGLangGraph:\n    def __init__(\n        self,\n        *,\n        retrieval_config: RetrievalConfig,\n        llm: LLMEndpoint,\n        vector_store: VectorStore | None = None,\n    ):\n        \"\"\"\n        Construct a QuivrQARAGLangGraph object.\n\n        Args:\n            retrieval_config (RetrievalConfig): The configuration for the RAG model.\n            llm (LLMEndpoint): The LLM to use for generating text.\n            vector_store (VectorStore): The vector store to use for storing and retrieving documents.\n            reranker (BaseDocumentCompressor | None): The document compressor to use for re-ranking documents. Defaults to IdempotentCompressor if not provided.\n        \"\"\"\n        self.retrieval_config = retrieval_config\n        self.vector_store = vector_store\n        self.llm_endpoint = llm\n\n        self.graph = None\n\n    def get_reranker(self, **kwargs):\n        # Extract the reranker configuration from self\n        config = self.retrieval_config.reranker_config\n\n        # Allow kwargs to override specific config values\n        supplier = kwargs.pop(\"supplier\", config.supplier)\n        model = kwargs.pop(\"model\", config.model)\n        top_n = kwargs.pop(\"top_n\", config.top_n)\n        api_key = kwargs.pop(\"api_key\", config.api_key)\n\n        if supplier == DefaultRerankers.COHERE:\n            reranker = CohereRerank(\n                model=model, top_n=top_n, cohere_api_key=api_key, **kwargs\n            )\n        elif supplier == DefaultRerankers.JINA:\n            reranker = JinaRerank(\n                model=model, top_n=top_n, jina_api_key=api_key, **kwargs\n            )\n        else:\n            reranker = IdempotentCompressor()\n\n        return reranker\n\n    def get_retriever(self, **kwargs):\n        \"\"\"\n        Returns a retriever that can retrieve documents from the vector store.\n\n        Returns:\n            VectorStoreRetriever: The retriever.\n        \"\"\"\n        if self.vector_store:\n            retriever = self.vector_store.as_retriever(**kwargs)\n        else:\n            raise ValueError(\"No vector store provided\")\n\n        return retriever\n\n    def routing(self, state: AgentState) -> List[Send]:\n        \"\"\"\n        The routing function for the RAG model.\n\n        Args:\n            state (AgentState): The current state of the agent.\n\n        Returns:\n            dict: The next state of the agent.\n        \"\"\"\n\n        msg = custom_prompts[TemplatePromptName.SPLIT_PROMPT].format(\n            user_input=state[\"messages\"][0].content,\n        )\n\n        response: SplittedInput\n\n        try:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(\n                SplittedInput, method=\"json_schema\"\n            )\n            response = structured_llm.invoke(msg)\n\n        except openai.BadRequestError:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(\n                SplittedInput\n            )\n            response = structured_llm.invoke(msg)\n\n        send_list: List[Send] = []\n\n        instructions = (\n            response.instructions\n            if response.instructions\n            else self.retrieval_config.prompt\n        )\n\n        if instructions:\n            send_list.append(Send(\"edit_system_prompt\", {\"instructions\": instructions}))\n        elif response.task_list:\n            chat_history = state[\"chat_history\"]\n            send_list.append(\n                Send(\n                    \"filter_history\",\n                    {\n                        \"chat_history\": chat_history,\n                        \"tasks\": UserTasks(response.task_list),\n                    },\n                )\n            )\n\n        return send_list\n\n    def routing_split(self, state: AgentState):\n        response: SplittedInput = self.invoke_structured_output(\n            custom_prompts[TemplatePromptName.SPLIT_PROMPT].format(\n                chat_history=state[\"chat_history\"].to_list(),\n                user_input=state[\"messages\"][0].content,\n            ),\n            SplittedInput,\n        )\n\n        instructions = response.instructions or self.retrieval_config.prompt\n        tasks = UserTasks(response.task_list) if response.task_list else None\n\n        if instructions:\n            return [\n                Send(\n                    \"edit_system_prompt\",\n                    {**state, \"instructions\": instructions, \"tasks\": tasks},\n                )\n            ]\n        elif tasks:\n            return [Send(\"filter_history\", {**state, \"tasks\": tasks})]\n\n        return []\n\n    def update_active_tools(self, updated_prompt_and_tools: UpdatedPromptAndTools):\n        if updated_prompt_and_tools.tools_to_activate:\n            for tool in updated_prompt_and_tools.tools_to_activate:\n                for (\n                    validated_tool\n                ) in self.retrieval_config.workflow_config.validated_tools:\n                    if tool == validated_tool.name:\n                        self.retrieval_config.workflow_config.activated_tools.append(\n                            validated_tool\n                        )\n\n        if updated_prompt_and_tools.tools_to_deactivate:\n            for tool in updated_prompt_and_tools.tools_to_deactivate:\n                for (\n                    activated_tool\n                ) in self.retrieval_config.workflow_config.activated_tools:\n                    if tool == activated_tool.name:\n                        self.retrieval_config.workflow_config.activated_tools.remove(\n                            activated_tool\n                        )\n\n    def edit_system_prompt(self, state: AgentState) -> AgentState:\n        user_instruction = state[\"instructions\"]\n        prompt = self.retrieval_config.prompt\n        available_tools, activated_tools = collect_tools(\n            self.retrieval_config.workflow_config\n        )\n        inputs = {\n            \"instruction\": user_instruction,\n            \"system_prompt\": prompt if prompt else \"\",\n            \"available_tools\": available_tools,\n            \"activated_tools\": activated_tools,\n        }\n\n        msg = custom_prompts[TemplatePromptName.UPDATE_PROMPT].format(**inputs)\n\n        response: UpdatedPromptAndTools = self.invoke_structured_output(\n            msg, UpdatedPromptAndTools\n        )\n\n        self.update_active_tools(response)\n        self.retrieval_config.prompt = response.prompt\n\n        reasoning = [response.prompt_reasoning] if response.prompt_reasoning else []\n        reasoning += [response.tools_reasoning] if response.tools_reasoning else []\n\n        return {**state, \"messages\": [], \"reasoning\": reasoning}\n\n    def filter_history(self, state: AgentState) -> AgentState:\n        \"\"\"\n        Filter out the chat history to only include the messages that are relevant to the current question\n\n        Takes in a chat_history= [HumanMessage(content='Qui est Chloé ? '),\n        AIMessage(content=\"Chloé est une salariée travaillant pour l'entreprise Quivr en tant qu'AI Engineer,\n        sous la direction de son supérieur hiérarchique, Stanislas Girard.\"),\n        HumanMessage(content='Dis moi en plus sur elle'), AIMessage(content=''),\n        HumanMessage(content='Dis moi en plus sur elle'),\n        AIMessage(content=\"Désolé, je n'ai pas d'autres informations sur Chloé à partir des fichiers fournis.\")]\n        Returns a filtered chat_history with in priority: first max_tokens, then max_history where a Human message and an AI message count as one pair\n        a token is 4 characters\n        \"\"\"\n\n        chat_history = state[\"chat_history\"]\n        total_tokens = 0\n        total_pairs = 0\n        _chat_id = uuid4()\n        _chat_history = ChatHistory(chat_id=_chat_id, brain_id=chat_history.brain_id)\n        for human_message, ai_message in reversed(list(chat_history.iter_pairs())):\n            # TODO: replace with tiktoken\n            message_tokens = self.llm_endpoint.count_tokens(\n                human_message.content\n            ) + self.llm_endpoint.count_tokens(ai_message.content)\n\n            if (\n                total_tokens + message_tokens\n                > self.retrieval_config.llm_config.max_context_tokens\n                or total_pairs >= self.retrieval_config.max_history\n            ):\n                break\n            _chat_history.append(human_message)\n            _chat_history.append(ai_message)\n            total_tokens += message_tokens\n            total_pairs += 1\n\n        return {**state, \"chat_history\": _chat_history}\n\n    async def rewrite(self, state: AgentState) -> AgentState:\n        \"\"\"\n        Transform the query to produce a better question.\n\n        Args:\n            state (messages): The current state\n\n        Returns:\n            dict: The updated state with re-phrased question\n        \"\"\"\n\n        if \"tasks\" in state and state[\"tasks\"]:\n            tasks = state[\"tasks\"]\n        else:\n            tasks = UserTasks([state[\"messages\"][0].content])\n\n        # Prepare the async tasks for all user tsks\n        async_jobs = []\n        for task_id in tasks.ids:\n            msg = custom_prompts[TemplatePromptName.CONDENSE_TASK_PROMPT].format(\n                chat_history=state[\"chat_history\"].to_list(),\n                task=tasks(task_id).definition,\n            )\n\n            model = self.llm_endpoint._llm\n            # Asynchronously invoke the model for each question\n            async_jobs.append((model.ainvoke(msg), task_id))\n\n        # Gather all the responses asynchronously\n        responses = (\n            await asyncio.gather(*(jobs[0] for jobs in async_jobs))\n            if async_jobs\n            else []\n        )\n        task_ids = [jobs[1] for jobs in async_jobs] if async_jobs else []\n\n        # Replace each question with its condensed version\n        for response, task_id in zip(responses, task_ids, strict=False):\n            tasks.set_definition(task_id, response.content)\n\n        return {**state, \"tasks\": tasks}\n\n    def filter_chunks_by_relevance(self, chunks: List[Document], **kwargs):\n        config = self.retrieval_config.reranker_config\n        relevance_score_threshold = kwargs.get(\n            \"relevance_score_threshold\", config.relevance_score_threshold\n        )\n\n        if relevance_score_threshold is None:\n            return chunks\n\n        filtered_chunks = []\n        for chunk in chunks:\n            if config.relevance_score_key not in chunk.metadata:\n                logger.warning(\n                    f\"Relevance score key {config.relevance_score_key} not found in metadata, cannot filter chunks by relevance\"\n                )\n                filtered_chunks.append(chunk)\n            elif (\n                chunk.metadata[config.relevance_score_key] >= relevance_score_threshold\n            ):\n                filtered_chunks.append(chunk)\n\n        return filtered_chunks\n\n    async def tool_routing(self, state: AgentState):\n        tasks = state[\"tasks\"]\n        if not tasks.has_tasks():\n            return [Send(\"generate_rag\", state)]\n\n        validated_tools, _ = collect_tools(self.retrieval_config.workflow_config)\n\n        async_jobs = []\n        for task_id in tasks.ids:\n            input = {\n                \"chat_history\": state[\"chat_history\"].to_list(),\n                \"tasks\": tasks(task_id).definition,\n                \"context\": combine_documents(tasks(task_id).docs),\n                \"activated_tools\": validated_tools,\n            }\n\n            msg = custom_prompts[TemplatePromptName.TOOL_ROUTING_PROMPT].format(**input)\n            async_jobs.append(\n                (self.ainvoke_structured_output(msg, TasksCompletion), task_id)\n            )\n\n        responses: List[TasksCompletion] = (\n            await asyncio.gather(*(jobs[0] for jobs in async_jobs))\n            if async_jobs\n            else []\n        )\n        task_ids = [jobs[1] for jobs in async_jobs] if async_jobs else []\n\n        for response, task_id in zip(responses, task_ids, strict=False):\n            tasks.set_completion(task_id, response.is_task_completable)\n            if not response.is_task_completable and response.tool:\n                tasks.set_tool(task_id, response.tool)\n\n        send_list: List[Send] = []\n\n        payload = {**state, \"tasks\": tasks}\n\n        if tasks.has_non_completable_tasks():\n            send_list.append(Send(\"run_tool\", payload))\n        else:\n            send_list.append(Send(\"generate_rag\", payload))\n\n        return send_list\n\n    async def run_tool(self, state: AgentState) -> AgentState:\n        # if tool not in [\n        #     t.name for t in self.retrieval_config.workflow_config.activated_tools\n        # ]:\n        #     raise ValueError(f\"Tool {tool} not activated\")\n\n        tasks = state[\"tasks\"]\n\n        # Prepare the async tasks for all questions\n        async_jobs = []\n        for task_id in tasks.ids:\n            if not tasks(task_id).is_completable() and tasks(task_id).has_tool():\n                tool = tasks(task_id).tool\n                tool_wrapper = LLMToolFactory.create_tool(tool, {})\n                formatted_input = tool_wrapper.format_input(tasks(task_id).definition)\n                async_jobs.append((tool_wrapper.tool.ainvoke(formatted_input), task_id))\n\n        # Gather all the responses asynchronously\n        responses = (\n            await asyncio.gather(*(jobs[0] for jobs in async_jobs))\n            if async_jobs\n            else []\n        )\n        task_ids = [jobs[1] for jobs in async_jobs] if async_jobs else []\n\n        for response, task_id in zip(responses, task_ids, strict=False):\n            _docs = tool_wrapper.format_output(response)\n            _docs = self.filter_chunks_by_relevance(_docs)\n            tasks.set_docs(task_id, _docs)\n\n        return {**state, \"tasks\": tasks}\n\n    async def retrieve(self, state: AgentState) -> AgentState:\n        \"\"\"\n        Retrieve relevent chunks\n\n        Args:\n            state (messages): The current state\n\n        Returns:\n            dict: The retrieved chunks\n        \"\"\"\n        if \"tasks\" in state:\n            tasks = state[\"tasks\"]\n        else:\n            tasks = UserTasks([state[\"messages\"][0].content])\n\n        if not tasks.has_tasks():\n            return {**state}\n\n        _filter = state.get(\"_filter\", None)\n\n        kwargs = {\n            \"search_kwargs\": {\n                \"k\": self.retrieval_config.k,\n                \"filter\": _filter,  # Add your desired filter here\n            }\n        }  # type: ignore\n        base_retriever = self.get_retriever(**kwargs)\n\n        kwargs = {\"top_n\": self.retrieval_config.reranker_config.top_n}  # type: ignore\n        reranker = self.get_reranker(**kwargs)\n\n        compression_retriever = ContextualCompressionRetriever(\n            base_compressor=reranker, base_retriever=base_retriever\n        )\n\n        # Prepare the async tasks for all questions\n        async_jobs = []\n        for task_id in tasks.ids:\n            # Create a tuple of the retrieval task and task_id\n            async_jobs.append(\n                (compression_retriever.ainvoke(tasks(task_id).definition), task_id)\n            )\n\n        # Gather all the responses asynchronously\n        responses = (\n            await asyncio.gather(*(task[0] for task in async_jobs))\n            if async_jobs\n            else []\n        )\n        task_ids = [task[1] for task in async_jobs] if async_jobs else []\n\n        # Process responses and associate docs with tasks\n        for response, task_id in zip(responses, task_ids, strict=False):\n            _docs = self.filter_chunks_by_relevance(response)\n            tasks.set_docs(task_id, _docs)  # Associate docs with the specific task\n\n        return {**state, \"tasks\": tasks}\n\n    async def dynamic_retrieve(self, state: AgentState) -> AgentState:\n        \"\"\"\n        Retrieve relevent chunks\n\n        Args:\n            state (messages): The current state\n\n        Returns:\n            dict: The retrieved chunks\n        \"\"\"\n\n        MAX_ITERATIONS = 3\n\n        if \"tasks\" in state:\n            tasks = state[\"tasks\"]\n        else:\n            tasks = UserTasks([state[\"messages\"][0].content])\n\n        if not tasks or not tasks.has_tasks():\n            return {**state}\n\n        k = self.retrieval_config.k\n        top_n = self.retrieval_config.reranker_config.top_n\n        number_of_relevant_chunks = top_n\n        i = 1\n\n        while number_of_relevant_chunks == top_n and i <= MAX_ITERATIONS:\n            top_n = self.retrieval_config.reranker_config.top_n * i\n            kwargs = {\"top_n\": top_n}\n            reranker = self.get_reranker(**kwargs)\n\n            k = max([top_n * 2, self.retrieval_config.k])\n            kwargs = {\"search_kwargs\": {\"k\": k}}  # type: ignore\n            base_retriever = self.get_retriever(**kwargs)\n\n            if i > 1:\n                logging.info(\n                    f\"Increasing top_n to {top_n} and k to {k} to retrieve more relevant chunks\"\n                )\n\n            compression_retriever = ContextualCompressionRetriever(\n                base_compressor=reranker, base_retriever=base_retriever\n            )\n\n            # Prepare the async tasks for all questions\n            async_jobs = []\n            for task_id in tasks.ids:\n                # Asynchronously invoke the model for each question\n                async_jobs.append(\n                    (compression_retriever.ainvoke(tasks(task_id).definition), task_id)\n                )\n\n            # Gather all the responses asynchronously\n            responses = (\n                await asyncio.gather(*(jobs[0] for jobs in async_jobs))\n                if async_jobs\n                else []\n            )\n            task_ids = [jobs[1] for jobs in async_jobs] if async_jobs else []\n\n            _n = []\n            for response, task_id in zip(responses, task_ids, strict=False):\n                _docs = self.filter_chunks_by_relevance(response)\n                _n.append(len(_docs))\n                tasks.set_docs(task_id, _docs)\n\n            docs = tasks.docs\n            if not docs:\n                break\n\n            context_length = self.get_rag_context_length(state, docs)\n            if context_length >= self.retrieval_config.llm_config.max_context_tokens:\n                logging.warning(\n                    f\"The context length is {context_length} which is greater than \"\n                    f\"the max context tokens of {self.retrieval_config.llm_config.max_context_tokens}\"\n                )\n                break\n\n            number_of_relevant_chunks = max(_n)\n            i += 1\n\n        return {**state, \"tasks\": tasks}\n\n    def _sort_docs_by_relevance(self, docs: List[Document]) -> List[Document]:\n        return sorted(\n            docs,\n            key=lambda x: x.metadata[\n                self.retrieval_config.reranker_config.relevance_score_key\n            ],\n            reverse=True,\n        )\n\n    async def retrieve_full_documents_context(self, state: AgentState) -> AgentState:\n        if \"tasks\" in state:\n            tasks = state[\"tasks\"]\n        else:\n            tasks = UserTasks([state[\"messages\"][0].content])\n\n        if not tasks.has_tasks():\n            return {**state}\n\n        docs = tasks.docs if tasks else []\n\n        relevant_knowledge: Dict[str, Dict[str, Any]] = {}\n        for doc in docs:\n            knowledge_id = doc.metadata[\"knowledge_id\"]\n            similarity_score = doc.metadata.get(\"similarity\", 0)\n            if knowledge_id in relevant_knowledge:\n                relevant_knowledge[knowledge_id][\"count\"] += 1\n                relevant_knowledge[knowledge_id][\"max_similarity_score\"] = max(\n                    relevant_knowledge[knowledge_id][\"max_similarity_score\"],\n                    similarity_score,\n                )\n                relevant_knowledge[knowledge_id][\"chunk_index\"] = max(\n                    doc.metadata[\"chunk_index\"],\n                    relevant_knowledge[knowledge_id][\"chunk_index\"],\n                )\n            else:\n                relevant_knowledge[knowledge_id] = {\n                    \"count\": 1,\n                    \"max_similarity_score\": similarity_score,\n                    \"chunk_index\": doc.metadata[\"chunk_index\"],\n                }\n\n        top_n = min(3, len(relevant_knowledge))\n        # FIXME: Tweak this to return the most relevant knowledges\n        top_knowledge_ids = OrderedDict(\n            sorted(\n                relevant_knowledge.items(),\n                key=lambda x: (\n                    x[1][\"max_similarity_score\"],\n                    x[1][\"count\"],\n                ),\n                reverse=True,\n            )[:top_n]\n        )\n\n        logger.info(f\"Top knowledge IDs: {top_knowledge_ids}\")\n\n        _docs = []\n\n        assert hasattr(\n            self.vector_store, \"get_vectors_by_knowledge_id\"\n        ), \"Vector store must have method 'get_vectors_by_knowledge_id', this is an enterprise only feature\"\n\n        for knowledge_id in top_knowledge_ids:\n            _docs.append(\n                await self.vector_store.get_vectors_by_knowledge_id(  # type: ignore\n                    knowledge_id,\n                    end_index=relevant_knowledge[knowledge_id][\"chunk_index\"],\n                )\n            )\n\n        tasks.set_docs(\n            id=tasks.ids[0], docs=_docs\n        )  # FIXME If multiple IDs is not handled.\n\n        return {**state, \"tasks\": tasks}\n\n    def get_rag_context_length(self, state: AgentState, docs: List[Document]) -> int:\n        final_inputs = self._build_rag_prompt_inputs(state, docs)\n        msg = custom_prompts[TemplatePromptName.RAG_ANSWER_PROMPT].format(\n            **final_inputs\n        )\n        return self.llm_endpoint.count_tokens(msg)\n\n    def reduce_rag_context(\n        self,\n        state: AgentState,\n        inputs: Dict[str, Any],\n        prompt: BasePromptTemplate,\n        max_context_tokens: int | None = None,\n    ) -> Tuple[AgentState, Dict[str, Any]]:\n        MAX_ITERATIONS = 20\n        SECURITY_FACTOR = 0.85\n        iteration = 0\n\n        tasks = state[\"tasks\"] if \"tasks\" in state else None\n        docs = tasks.docs if tasks else []\n        msg = prompt.format(**inputs)\n        n = self.llm_endpoint.count_tokens(msg)\n\n        max_context_tokens = (\n            max_context_tokens\n            if max_context_tokens\n            else self.retrieval_config.llm_config.max_context_tokens\n        )\n\n        # Get token counts for each doc in each task\n        if tasks:\n            task_token_counts = {}\n            for task_id in tasks.ids:\n                doc_tokens = [\n                    self.llm_endpoint.count_tokens(doc.page_content)\n                    for doc in tasks(task_id).docs\n                ]\n                task_token_counts[task_id] = {\n                    \"docs\": doc_tokens,\n                    \"total\": sum(doc_tokens),\n                }\n\n        while n > max_context_tokens * SECURITY_FACTOR:\n            chat_history = inputs[\"chat_history\"] if \"chat_history\" in inputs else []\n\n            if len(chat_history) > 0:\n                inputs[\"chat_history\"] = chat_history[2:]\n            elif tasks:\n                longest_task_id = max(\n                    task_token_counts.items(), key=lambda x: x[1][\"total\"]\n                )[0]\n\n                # Remove last doc from that task\n                if task_token_counts[longest_task_id][\"docs\"]:\n                    removed_tokens = task_token_counts[longest_task_id][\"docs\"].pop()\n                    task_token_counts[longest_task_id][\"total\"] -= removed_tokens\n                    tasks.set_docs(longest_task_id, tasks(longest_task_id).docs[:-1])\n            else:\n                logging.warning(\n                    f\"Not enough context to reduce. The context length is {n} \"\n                    f\"which is greater than the max context tokens of {max_context_tokens}\"\n                )\n                break\n\n            docs = tasks.docs if tasks else []\n            inputs[\"context\"] = combine_documents(docs)\n\n            msg = prompt.format(**inputs)\n            n = self.llm_endpoint.count_tokens(msg)\n\n            iteration += 1\n            if iteration > MAX_ITERATIONS:\n                logging.warning(\n                    f\"Attained the maximum number of iterations ({MAX_ITERATIONS})\"\n                )\n                break\n\n        return {**state, \"tasks\": tasks}, inputs\n\n    def bind_tools_to_llm(self, node_name: str):\n        if self.llm_endpoint.supports_func_calling():\n            tools = self.retrieval_config.workflow_config.get_node_tools(node_name)\n            if tools:  # Only bind tools if there are any available\n                return self.llm_endpoint._llm.bind_tools(tools, tool_choice=\"any\")\n        return self.llm_endpoint._llm\n\n    def generate_zendesk_rag(self, state: AgentState) -> AgentState:\n        tasks = state[\"tasks\"]\n        docs: List[Document] = tasks.docs if tasks else []\n        messages = state[\"messages\"]\n        user_task = messages[0].content\n        prompt_template: BasePromptTemplate = custom_prompts[\n            TemplatePromptName.ZENDESK_TEMPLATE_PROMPT\n        ]\n\n        ticket_metadata = state[\"ticket_metadata\"] or {}\n        user_metadata = state[\"user_metadata\"] or {}\n        ticket_history = state.get(\"ticket_history\", \"\")\n        current_time = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\")\n        inputs = {\n            \"similar_tickets\": \"\\n\".join([doc.page_content for doc in docs]),\n            \"ticket_metadata\": format_dict(ticket_metadata),\n            \"user_metadata\": format_dict(user_metadata),\n            \"client_query\": user_task,\n            \"ticket_history\": ticket_history,\n            \"current_time\": current_time,\n        }\n        required_variables = prompt_template.input_variables\n        for variable in required_variables:\n            if variable not in inputs:\n                inputs[variable] = state.get(variable, \"\")\n\n        msg = prompt_template.format_prompt(**inputs)\n        llm = self.bind_tools_to_llm(self.generate_zendesk_rag.__name__)\n\n        response = llm.invoke(msg)\n\n        return {**state, \"messages\": [response]}\n\n    def generate_rag(self, state: AgentState) -> AgentState:\n        tasks = state[\"tasks\"]\n        docs = tasks.docs if tasks else []\n        inputs = self._build_rag_prompt_inputs(state, docs)\n        prompt = custom_prompts[TemplatePromptName.RAG_ANSWER_PROMPT]\n        state, inputs = self.reduce_rag_context(state, inputs, prompt)\n        msg = prompt.format(**inputs)\n        llm = self.bind_tools_to_llm(self.generate_rag.__name__)\n        response = llm.invoke(msg)\n\n        return {**state, \"messages\": [response]}\n\n    def generate_chat_llm(self, state: AgentState) -> AgentState:\n        \"\"\"\n        Generate answer\n\n        Args:\n            state (messages): The current state\n\n        Returns:\n            dict: The updated state with re-phrased question\n        \"\"\"\n        messages = state[\"messages\"]\n\n        # Check if there is a system message in messages\n        system_message = None\n        user_message = None\n\n        for msg in messages:\n            if isinstance(msg, SystemMessage):\n                system_message = str(msg.content)\n            elif isinstance(msg, HumanMessage):\n                user_message = str(msg.content)\n\n        user_task = (\n            user_message if user_message else (messages[0].content if messages else \"\")\n        )\n\n        # Prompt\n        prompt = self.retrieval_config.prompt\n\n        final_inputs = {}\n        final_inputs[\"task\"] = user_task\n        final_inputs[\"custom_instructions\"] = prompt if prompt else \"None\"\n        final_inputs[\"chat_history\"] = state[\"chat_history\"].to_list()\n\n        # LLM\n        llm = self.llm_endpoint._llm\n\n        prompt = custom_prompts[TemplatePromptName.CHAT_LLM_PROMPT]\n        state, reduced_inputs = self.reduce_rag_context(\n            state, final_inputs, system_message if system_message else prompt\n        )\n        CHAT_LLM_PROMPT = ChatPromptTemplate.from_messages(\n            [\n                SystemMessage(content=str(system_message)),\n                MessagesPlaceholder(variable_name=\"chat_history\"),\n                HumanMessage(content=str(user_message)),\n            ]\n        )\n        # Run\n        chat_llm_prompt = CHAT_LLM_PROMPT.invoke(\n            {\"chat_history\": final_inputs[\"chat_history\"]}\n        )\n        response = llm.invoke(chat_llm_prompt)\n        return {**state, \"messages\": [response]}\n\n    def build_chain(self):\n        \"\"\"\n        Builds the langchain chain for the given configuration.\n\n        Returns:\n            Callable[[Dict], Dict]: The langchain chain.\n        \"\"\"\n        if not self.graph:\n            self.graph = self.create_graph()\n\n        return self.graph\n\n    def create_graph(self):\n        workflow = StateGraph(AgentState)\n        self.final_nodes = []\n\n        self._build_workflow(workflow)\n\n        return workflow.compile()\n\n    def _build_workflow(self, workflow: StateGraph):\n        for node in self.retrieval_config.workflow_config.nodes:\n            if node.name not in [START, END]:\n                workflow.add_node(node.name, getattr(self, node.name))\n\n        for node in self.retrieval_config.workflow_config.nodes:\n            self._add_node_edges(workflow, node)\n\n    def _add_node_edges(self, workflow: StateGraph, node: NodeConfig):\n        if node.edges:\n            for edge in node.edges:\n                workflow.add_edge(node.name, edge)\n                if edge == END:\n                    self.final_nodes.append(node.name)\n        elif node.conditional_edge:\n            routing_function = getattr(self, node.conditional_edge.routing_function)\n            workflow.add_conditional_edges(\n                node.name, routing_function, node.conditional_edge.conditions\n            )\n            if END in node.conditional_edge.conditions:\n                self.final_nodes.append(node.name)\n        else:\n            raise ValueError(\"Node should have at least one edge or conditional_edge\")\n\n    async def answer_astream(\n        self,\n        run_id: UUID,\n        question: str,\n        system_prompt: str | None,\n        history: ChatHistory,\n        list_files: list[QuivrKnowledge],\n        metadata: LangchainMetadata | None = None,\n        **input_kwargs,\n    ) -> AsyncGenerator[ParsedRAGChunkResponse, ParsedRAGChunkResponse]:\n        \"\"\"\n        Answer a question using the langgraph chain and yield each chunk of the answer separately.\n        \"\"\"\n        concat_list_files = format_file_list(\n            list_files, self.retrieval_config.max_files\n        )\n        conversational_qa_chain = self.build_chain()\n\n        rolling_message = AIMessageChunk(content=\"\")\n        docs: list[Document] | None = None\n        previous_content = \"\"\n        system_prompt = system_prompt\n        messages = [(\"system\", system_prompt)] if system_prompt else []\n        messages.append((\"user\", question))\n\n        async for event in conversational_qa_chain.astream_events(\n            {\n                \"messages\": messages,\n                \"chat_history\": history,\n                \"files\": concat_list_files,\n                **input_kwargs,\n            },\n            version=\"v1\",\n            config={\n                \"run_id\": run_id,\n                \"metadata\": metadata.model_dump() if metadata else {},\n                \"callbacks\": [langfuse_handler],\n            },\n        ):\n            node_name = self._extract_node_name(event)\n\n            if self._is_final_node_with_docs(event):\n                tasks = event[\"data\"][\"output\"][\"tasks\"]\n                docs = tasks.docs if tasks else []\n\n            if self._is_final_node_and_chat_model_stream(event):\n                chunk = event[\"data\"][\"chunk\"]\n                rolling_message, new_content, previous_content = parse_chunk_response(\n                    rolling_message,\n                    chunk,\n                    self.llm_endpoint.supports_func_calling(),\n                    previous_content,\n                )\n\n                if new_content:\n                    chunk_metadata = get_chunk_metadata(rolling_message, docs)\n                    if node_name:\n                        chunk_metadata.workflow_step = node_name\n                    yield ParsedRAGChunkResponse(\n                        answer=new_content, metadata=chunk_metadata\n                    )\n            else:\n                if node_name:\n                    yield ParsedRAGChunkResponse(\n                        answer=\"\",\n                        metadata=RAGResponseMetadata(workflow_step=node_name),\n                    )\n\n        # Yield final metadata chunk\n        chunk_metadata = get_chunk_metadata(rolling_message, docs)\n        if metadata:\n            chunk_metadata.langchain_metadata = metadata\n            chunk_metadata.langchain_metadata.langfuse_trace_url = (\n                langfuse_handler.get_trace_url()\n            )\n\n        yield ParsedRAGChunkResponse(\n            answer=\"\",\n            metadata=chunk_metadata,\n            last_chunk=True,\n        )\n\n    def _is_final_node_with_docs(self, event: StreamEvent) -> bool:\n        return (\n            \"output\" in event[\"data\"]\n            and event[\"data\"][\"output\"] is not None\n            and \"tasks\" in event[\"data\"][\"output\"]\n            and event[\"metadata\"][\"langgraph_node\"] in self.final_nodes\n        )\n\n    def _is_final_node_and_chat_model_stream(self, event: StreamEvent) -> bool:\n        return (\n            event[\"event\"] == \"on_chat_model_stream\"\n            and \"langgraph_node\" in event[\"metadata\"]\n            and event[\"metadata\"][\"langgraph_node\"] in self.final_nodes\n        )\n\n    def _extract_node_name(self, event: StreamEvent) -> str:\n        if \"metadata\" in event and \"langgraph_node\" in event[\"metadata\"]:\n            name = event[\"metadata\"][\"langgraph_node\"]\n            for node in self.retrieval_config.workflow_config.nodes:\n                if node.name == name:\n                    if node.description:\n                        return node.description\n                    else:\n                        return node.name\n        return \"\"\n\n    async def ainvoke_structured_output(\n        self, prompt: str, output_class: Type[BaseModel]\n    ) -> Any:\n        try:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(\n                output_class, method=\"json_schema\"\n            )\n            return await structured_llm.ainvoke(prompt)\n        except openai.BadRequestError:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(output_class)\n            return await structured_llm.ainvoke(prompt)\n\n    def invoke_structured_output(\n        self, prompt: str, output_class: Type[BaseModel]\n    ) -> Any:\n        try:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(\n                output_class, method=\"json_schema\"\n            )\n            return structured_llm.invoke(prompt)\n        except openai.BadRequestError:\n            structured_llm = self.llm_endpoint._llm.with_structured_output(output_class)\n            return structured_llm.invoke(prompt)\n\n    def _build_rag_prompt_inputs(\n        self, state: AgentState, docs: List[Document] | None\n    ) -> Dict[str, Any]:\n        \"\"\"Build the input dictionary for RAG_ANSWER_PROMPT.\n\n        Args:\n            state: Current agent state\n            docs: List of documents or None\n\n        Returns:\n            Dictionary containing all inputs needed for RAG_ANSWER_PROMPT\n        \"\"\"\n        messages = state[\"messages\"]\n        user_task = messages[0].content\n        files = state[\"files\"]\n        prompt = self.retrieval_config.prompt\n        # available_tools, _ = collect_tools(self.retrieval_config.workflow_config)\n\n        return {\n            \"context\": combine_documents(docs) if docs else \"None\",\n            \"task\": user_task,\n            \"rephrased_task\": state[\"tasks\"].definitions if state[\"tasks\"] else \"None\",\n            \"custom_instructions\": prompt if prompt else \"None\",\n            \"files\": files if files else \"None\",\n            \"chat_history\": state[\"chat_history\"].to_list(),\n            # \"reasoning\": state[\"reasoning\"] if \"reasoning\" in state else \"None\",\n            # \"tools\": available_tools,\n        }\n"
  },
  {
    "path": "core/quivr_core/rag/utils.py",
    "content": "import logging\nfrom typing import Any, Dict, List, Tuple, no_type_check\n\nfrom langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.prompts import format_document\nfrom langfuse.callback import CallbackHandler\n\nfrom quivr_core.rag.entities.config import WorkflowConfig\nfrom quivr_core.rag.entities.models import (\n    ChatLLMMetadata,\n    ParsedRAGResponse,\n    QuivrKnowledge,\n    RAGResponseMetadata,\n    RawRAGResponse,\n)\nfrom quivr_core.rag.prompts import TemplatePromptName, custom_prompts\n\n# TODO(@aminediro): define a types packages where we clearly define IO types\n# This should be used for serialization/deseriallization later\n\n\nlogger = logging.getLogger(\"quivr_core\")\n\n\ndef model_supports_function_calling(model_name: str):\n    models_not_supporting_function_calls: list[str] = [\"llama2\", \"test\", \"ollama3\"]\n\n    return model_name not in models_not_supporting_function_calls\n\n\ndef format_history_to_openai_mesages(\n    tuple_history: List[Tuple[str, str]], system_message: str, question: str\n) -> List[BaseMessage]:\n    \"\"\"Format the chat history into a list of Base Messages\"\"\"\n    messages = []\n    messages.append(SystemMessage(content=system_message))\n    for human, ai in tuple_history:\n        messages.append(HumanMessage(content=human))\n        messages.append(AIMessage(content=ai))\n    messages.append(HumanMessage(content=question))\n    return messages\n\n\ndef cited_answer_filter(tool):\n    return tool[\"name\"] == \"cited_answer\"\n\n\ndef get_chunk_metadata(\n    msg: AIMessageChunk, sources: list[Any] | None = None\n) -> RAGResponseMetadata:\n    metadata = {\"sources\": sources or []}\n\n    if not msg.tool_calls:\n        return RAGResponseMetadata(**metadata, metadata_model=None)\n\n    all_citations = []\n    all_followup_questions = []\n\n    for tool_call in msg.tool_calls:\n        if tool_call.get(\"name\") == \"cited_answer\" and \"args\" in tool_call:\n            args = tool_call[\"args\"]\n            all_citations.extend(args.get(\"citations\", []))\n            all_followup_questions.extend(args.get(\"followup_questions\", []))\n\n    metadata[\"citations\"] = all_citations\n    metadata[\"followup_questions\"] = all_followup_questions[:3]  # Limit to 3\n\n    return RAGResponseMetadata(**metadata, metadata_model=None)\n\n\ndef get_prev_message_str(msg: AIMessageChunk) -> str:\n    if msg.tool_calls:\n        cited_answer = next(x for x in msg.tool_calls if cited_answer_filter(x))\n        if \"args\" in cited_answer and \"answer\" in cited_answer[\"args\"]:\n            return cited_answer[\"args\"][\"answer\"]\n    return \"\"\n\n\n# TODO: CONVOLUTED LOGIC !\n# TODO(@aminediro): redo this\n@no_type_check\ndef parse_chunk_response(\n    rolling_msg: AIMessageChunk,\n    raw_chunk: AIMessageChunk,\n    supports_func_calling: bool,\n    previous_content: str = \"\",\n) -> Tuple[AIMessageChunk, str, str]:\n    \"\"\"Parse a chunk response\n    Args:\n        rolling_msg: The accumulated message so far\n        raw_chunk: The new chunk to add\n        supports_func_calling: Whether function calling is supported\n        previous_content: The previous content string\n    Returns:\n        Tuple of (updated rolling message, new content only, full content)\n    \"\"\"\n    rolling_msg += raw_chunk\n\n    tool_calls = rolling_msg.tool_calls\n\n    if not supports_func_calling or not tool_calls:\n        new_content = raw_chunk.content  # Just the new chunk's content\n        full_content = rolling_msg.content  # The full accumulated content\n        return rolling_msg, new_content, full_content\n\n    current_answers = get_answers_from_tool_calls(tool_calls)\n    full_answer = \"\\n\\n\".join(current_answers)\n    if not full_answer:\n        full_answer = previous_content\n\n    new_content = full_answer[len(previous_content) :]\n\n    return rolling_msg, new_content, full_answer\n\n\ndef get_answers_from_tool_calls(tool_calls):\n    answers = []\n    for tool_call in tool_calls:\n        if tool_call.get(\"name\") == \"cited_answer\":\n            args = tool_call.get(\"args\", {})\n            if isinstance(args, dict):\n                answers.append(args.get(\"answer\", \"\"))\n            else:\n                logger.warning(f\"Expected dict for tool_call args, got {type(args)}\")\n    return answers\n\n\n@no_type_check\ndef parse_response(raw_response: RawRAGResponse, model_name: str) -> ParsedRAGResponse:\n    answers = []\n    sources = raw_response[\"docs\"] if \"docs\" in raw_response else []\n\n    metadata = RAGResponseMetadata(\n        sources=sources, metadata_model=ChatLLMMetadata(name=model_name)\n    )\n\n    if (\n        model_supports_function_calling(model_name)\n        and \"tool_calls\" in raw_response[\"answer\"]\n        and raw_response[\"answer\"].tool_calls\n    ):\n        all_citations = []\n        all_followup_questions = []\n        for tool_call in raw_response[\"answer\"].tool_calls:\n            if \"args\" in tool_call:\n                args = tool_call[\"args\"]\n                if \"citations\" in args:\n                    all_citations.extend(args[\"citations\"])\n                if \"followup_questions\" in args:\n                    all_followup_questions.extend(args[\"followup_questions\"])\n                if \"answer\" in args:\n                    answers.append(args[\"answer\"])\n        metadata.citations = all_citations\n        metadata.followup_questions = all_followup_questions\n    else:\n        answers.append(raw_response[\"answer\"].content)\n\n    answer_str = \"\\n\".join(answers)\n    parsed_response = ParsedRAGResponse(answer=answer_str, metadata=metadata)\n    return parsed_response\n\n\ndef combine_documents(\n    docs,\n    document_prompt=custom_prompts[TemplatePromptName.DEFAULT_DOCUMENT_PROMPT],\n    document_separator=\"\\n\\n\",\n):\n    # for each docs, add an index in the metadata to be able to cite the sources\n    for doc, index in zip(docs, range(len(docs)), strict=False):\n        doc.metadata[\"index\"] = index\n    doc_strings = [format_document(doc, document_prompt) for doc in docs]\n    return document_separator.join(doc_strings)\n\n\ndef format_file_list(\n    list_files_array: list[QuivrKnowledge], max_files: int = 20\n) -> str:\n    list_files = [file.file_name or file.url for file in list_files_array]\n    files: list[str] = list(filter(lambda n: n is not None, list_files))  # type: ignore\n    files = files[:max_files]\n\n    files_str = \"\\n\".join(files) if list_files_array else \"None\"\n    return files_str\n\n\ndef collect_tools(workflow_config: WorkflowConfig):\n    validated_tools = \"Available tools which can be activated:\\n\"\n    for i, tool in enumerate(workflow_config.validated_tools):\n        validated_tools += f\"Tool {i+1} name: {tool.name}\\n\"\n        validated_tools += f\"Tool {i+1} description: {tool.description}\\n\\n\"\n\n    activated_tools = \"Activated tools which can be deactivated:\\n\"\n    for i, tool in enumerate(workflow_config.activated_tools):\n        activated_tools += f\"Tool {i+1} name: {tool.name}\\n\"\n        activated_tools += f\"Tool {i+1} description: {tool.description}\\n\\n\"\n\n    return validated_tools, activated_tools\n\n\ndef format_dict(kv: Dict[str, str]) -> str:\n    return \"\\n\".join([f\"{k}: {v}\" for k, v in kv.items() if v is not None and v != \"\"])\n\n\nclass LangfuseService:\n    def __init__(self):\n        self.langfuse_handler = CallbackHandler()\n\n    def get_handler(self):\n        return self.langfuse_handler\n"
  },
  {
    "path": "core/quivr_core/storage/__init__.py",
    "content": ""
  },
  {
    "path": "core/quivr_core/storage/file.py",
    "content": "import hashlib\nimport mimetypes\nimport os\nimport warnings\nfrom contextlib import asynccontextmanager\nfrom enum import Enum\nfrom pathlib import Path\nfrom typing import Any, AsyncGenerator, AsyncIterable\nfrom uuid import UUID, uuid4\n\nimport aiofiles\n\n\nclass FileExtension(str, Enum):\n    txt = \".txt\"\n    pdf = \".pdf\"\n    docx = \".docx\"\n\n\ndef get_file_extension(file_path: Path) -> FileExtension | str:\n    try:\n        mime_type, _ = mimetypes.guess_type(file_path.name)\n        if mime_type:\n            mime_ext = mimetypes.guess_extension(mime_type)\n            if mime_ext:\n                return FileExtension(mime_ext)\n        return FileExtension(file_path.suffix)\n    except ValueError:\n        warnings.warn(\n            f\"File {file_path.name} extension isn't recognized. Make sure you have registered a parser for {file_path.suffix}\",\n            stacklevel=2,\n        )\n        return file_path.suffix\n\n\nasync def load_qfile(brain_id: UUID, path: str | Path):\n    if not isinstance(path, Path):\n        path = Path(path)\n\n    if not path.exists():\n        raise FileExistsError(f\"file {path} doesn't exist\")\n\n    file_size = os.stat(path).st_size\n\n    async with aiofiles.open(path, mode=\"rb\") as f:\n        file_sha1 = hashlib.sha1(await f.read()).hexdigest()\n\n    try:\n        # NOTE: when loading from existing storage, file name will be uuid\n        id = UUID(path.name)\n    except ValueError:\n        id = uuid4()\n\n    return QuivrFile(\n        id=id,\n        brain_id=brain_id,\n        path=path,\n        original_filename=path.name,\n        file_extension=get_file_extension(path),\n        file_size=file_size,\n        file_sha1=file_sha1,\n    )\n\n\nclass QuivrFile:\n    __slots__ = [\n        \"id\",\n        \"brain_id\",\n        \"path\",\n        \"original_filename\",\n        \"file_size\",\n        \"file_extension\",\n        \"file_sha1\",\n    ]\n\n    def __init__(\n        self,\n        id: UUID,\n        original_filename: str,\n        path: Path,\n        brain_id: UUID,\n        file_sha1: str,\n        file_extension: FileExtension | str,\n        file_size: int | None = None,\n    ) -> None:\n        self.id = id\n        self.brain_id = brain_id\n        self.path = path\n        self.original_filename = original_filename\n        self.file_size = file_size\n        self.file_extension = file_extension\n        self.file_sha1 = file_sha1\n\n    @asynccontextmanager\n    async def open(self) -> AsyncGenerator[AsyncIterable[bytes], None]:\n        # TODO(@aminediro) : match on path type\n        f = await aiofiles.open(self.path, mode=\"rb\")\n        try:\n            yield f\n        finally:\n            await f.close()\n\n    @property\n    def metadata(self) -> dict[str, Any]:\n        return {\n            \"qfile_id\": self.id,\n            \"qfile_path\": self.path,\n            \"original_file_name\": self.original_filename,\n            \"file_md4\": self.file_sha1,\n            \"file_size\": self.file_size,\n        }\n"
  },
  {
    "path": "core/quivr_core/storage/local_storage.py",
    "content": "import os\nimport shutil\nfrom pathlib import Path\nfrom typing import Self, Set\nfrom uuid import UUID\n\nfrom quivr_core.brain.serialization import LocalStorageConfig, TransparentStorageConfig\nfrom quivr_core.files.file import QuivrFile\nfrom quivr_core.storage.storage_base import StorageBase\n\n\nclass LocalStorage(StorageBase):\n    \"\"\"\n    LocalStorage is a concrete implementation of the `StorageBase` class that\n    stores files locally on disk. This class manages file uploads, tracks file\n    hashes, and allows retrieval of stored files from a specified directory.\n\n    Attributes:\n        name (str): The name of the storage type, set to \"local_storage\".\n        files (list[QuivrFile]): A list of files stored in this local storage.\n        hashes (Set[str]): A set of SHA-1 hashes of the uploaded files.\n        copy_flag (bool): If `True`, files are copied to the storage directory.\n                          If `False`, symbolic links are used instead.\n        dir_path (Path): The directory path where files are stored.\n\n    Args:\n        dir_path (Path | None): Optional directory path for storing files.\n                                Defaults to the environment variable `QUIVR_LOCAL_STORAGE`\n                                or `~/.cache/quivr/files`.\n        copy_flag (bool): Whether to copy the file or create a symlink.\n                          Defaults to `True`.\n    \"\"\"\n\n    name: str = \"local_storage\"\n\n    def __init__(self, dir_path: Path | None = None, copy_flag: bool = True):\n        self.files: list[QuivrFile] = []\n        self.hashes: Set[str] = set()\n        self.copy_flag = copy_flag\n\n        if dir_path is None:\n            self.dir_path = Path(\n                os.getenv(\"QUIVR_LOCAL_STORAGE\", \"~/.cache/quivr/files\")\n            )\n        else:\n            self.dir_path = dir_path\n        os.makedirs(self.dir_path, exist_ok=True)\n\n    def _load_files(self) -> None:\n        # TODO(@aminediro): load existing files\n        pass\n\n    def nb_files(self) -> int:\n        return len(self.files)\n\n    def info(self):\n        return {\"directory_path\": self.dir_path, **super().info()}\n\n    async def upload_file(self, file: QuivrFile, exists_ok: bool = False) -> None:\n        \"\"\"\n        Uploads a file to the local storage. Copies or creates a symlink based\n        on the `copy_flag` attribute. Checks for duplicate file uploads using\n        the file's SHA-1 hash.\n\n        Args:\n            file (QuivrFile): The file object to upload.\n            exists_ok (bool): If `True`, allows overwriting an existing file.\n                              Defaults to `False`.\n\n        Raises:\n            FileExistsError: If a file with the same SHA-1 hash already exists\n                             and `exists_ok` is set to `False`.\n        \"\"\"\n        dst_path = os.path.join(\n            self.dir_path, str(file.brain_id), f\"{file.id}{file.file_extension}\"\n        )\n\n        if file.file_sha1 in self.hashes and not exists_ok:\n            raise FileExistsError(f\"file {file.original_filename} already uploaded\")\n\n        if self.copy_flag:\n            shutil.copy2(file.path, dst_path)\n        else:\n            os.symlink(file.path, dst_path)\n\n        file.path = Path(dst_path)\n        self.files.append(file)\n        self.hashes.add(file.file_sha1)\n\n    async def get_files(self) -> list[QuivrFile]:\n        \"\"\"\n        Retrieves the list of files stored in the local storage.\n\n        Returns:\n            list[QuivrFile]: A list of stored file objects.\n        \"\"\"\n        return self.files\n\n    async def remove_file(self, file_id: UUID) -> None:\n        \"\"\"\n        Removes a file from the local storage. This method is currently not\n        implemented.\n\n        Args:\n            file_id (UUID): The unique identifier of the file to remove.\n\n        Raises:\n            NotImplementedError: Always raises this error as the method is not yet implemented.\n        \"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def load(cls, config: LocalStorageConfig) -> Self:\n        \"\"\"\n        Loads the local storage from a configuration object. This method\n        initializes the storage directory and populates it with deserialized\n        files from the configuration.\n\n        Args:\n            config (LocalStorageConfig): Configuration object containing the\n                                         storage path and serialized file data.\n\n        Returns:\n            LocalStorage: An instance of `LocalStorage` with files loaded\n                          from the configuration.\n        \"\"\"\n        tstorage = cls(dir_path=config.storage_path)\n        tstorage.files = [QuivrFile.deserialize(f) for f in config.files.values()]\n        return tstorage\n\n\nclass TransparentStorage(StorageBase):\n    \"\"\"Transparent Storage.\"\"\"\n\n    name: str = \"transparent_storage\"\n\n    def __init__(self):\n        self.id_files = {}\n\n    async def upload_file(self, file: QuivrFile, exists_ok: bool = False) -> None:\n        self.id_files[file.id] = file\n\n    def nb_files(self) -> int:\n        return len(self.id_files)\n\n    async def remove_file(self, file_id: UUID) -> None:\n        raise NotImplementedError\n\n    async def get_files(self) -> list[QuivrFile]:\n        return list(self.id_files.values())\n\n    @classmethod\n    def load(cls, config: TransparentStorageConfig) -> Self:\n        tstorage = cls()\n        tstorage.id_files = {\n            i: QuivrFile.deserialize(f) for i, f in config.files.items()\n        }\n        return tstorage\n"
  },
  {
    "path": "core/quivr_core/storage/storage_base.py",
    "content": "from abc import ABC, abstractmethod\nfrom uuid import UUID\n\nfrom quivr_core.brain.info import StorageInfo\nfrom quivr_core.storage.local_storage import QuivrFile\n\n\nclass StorageBase(ABC):\n    \"\"\"\n    Abstract base class for storage systems. All subclasses are required to define certain attributes and implement specific methods for managing files\n\n    Attributes:\n        name (str): Name of the storage type.\n    \"\"\"\n\n    name: str\n\n    def __init_subclass__(cls, **kwargs):\n        for required in (\"name\",):\n            if not getattr(cls, required):\n                raise TypeError(\n                    f\"Can't instantiate abstract class {cls.__name__} without {required} attribute defined\"\n                )\n        return super().__init_subclass__(**kwargs)\n\n    def __repr__(self) -> str:\n        return f\"storage_type: {self.name}\"\n\n    @abstractmethod\n    def nb_files(self) -> int:\n        \"\"\"\n        Abstract method to get the number of files in the storage.\n\n        Returns:\n            int: The number of files in the storage.\n\n        Raises:\n            Exception: If the method is not implemented.\n        \"\"\"\n        raise Exception(\"Unimplemented nb_files method\")\n\n    @abstractmethod\n    async def get_files(self) -> list[QuivrFile]:\n        \"\"\"\n        Abstract asynchronous method to get the files `QuivrFile` in the storage.\n\n        Returns:\n            list[QuivrFile]: A list of QuivrFile objects representing the files in the storage.\n\n        Raises:\n            Exception: If the method is not implemented.\n        \"\"\"\n        raise Exception(\"Unimplemented get_files method\")\n\n    @abstractmethod\n    async def upload_file(self, file: QuivrFile, exists_ok: bool = False) -> None:\n        \"\"\"\n        Abstract asynchronous method to upload a file to the storage.\n\n        Args:\n            file (QuivrFile): The file to upload.\n            exists_ok (bool): If True, allows overwriting the file if it already exists. Default is False.\n\n        Raises:\n            Exception: If the method is not implemented.\n        \"\"\"\n        raise Exception(\"Unimplemented  upload_file method\")\n\n    @abstractmethod\n    async def remove_file(self, file_id: UUID) -> None:\n        \"\"\"\n        Abstract asynchronous method to remove a file from the storage.\n\n        Args:\n            file_id (UUID): The unique identifier of the file to be removed.\n\n        Raises:\n            Exception: If the method is not implemented.\n        \"\"\"\n        raise Exception(\"Unimplemented remove_file method\")\n\n    def info(self) -> StorageInfo:\n        \"\"\"\n        Returns information about the storage, including the storage type and the number of files.\n\n        Returns:\n            StorageInfo: An object containing details about the storage.\n        \"\"\"\n        return StorageInfo(\n            storage_type=self.name,\n            n_files=self.nb_files(),\n        )\n"
  },
  {
    "path": "core/scripts/run_tests.sh",
    "content": "#!/bin/bash\n\n# Exit immediately if a command exits with a non-zero status\nset -e\n\n# Constants\nIMAGE_NAME=\"quivr-core-test\"\nIMAGE_TAG=\"latest\"\nDOCKERFILE=\"Dockerfile.test\"\nVOLUME_MAPPING=\"$PWD:/code\"\nTOX_DIR=\"/code/.tox-docker\"\nCMD=\"poetry run tox -p auto\"\n\n# Functions\nbuild_image() {\n    echo \"Building Docker image...\"\n    docker build -f $DOCKERFILE -t $IMAGE_NAME:$IMAGE_TAG .\n}\n\nrun_container() {\n    echo \"Running tests in Docker container...\"\n    docker run -it --rm \\\n        -e TOX_WORK_DIR=$TOX_DIR \\\n        -v $VOLUME_MAPPING \\\n        $IMAGE_NAME:$IMAGE_TAG $CMD\n}\n\n# Main script execution\nbuild_image\nrun_container\n\necho \"Tests completed successfully.\"\n"
  },
  {
    "path": "core/scripts/run_tests_buildx.sh",
    "content": "#!/bin/bash\n\nset -e\n\n# Constants\nIMAGE_NAME=\"quivr-core-test\"\nIMAGE_TAG=\"latest\"\nDOCKERFILE=\"Dockerfile.test\"\nVOLUME_MAPPING=\"$PWD:/code\"\nCMD=\"poetry run tox\"\nPLATFORM=\"linux/amd64\"\nBUILDER_NAME=\"amd64_builder\"\n\n# Functions\nbuild_image() {\n    echo \"Building Docker image for $PLATFORM...\"\n    EXISTING_BUILDER=$(docker buildx ls | grep -w $BUILDER_NAME)\n\n    # Create the builder if it doesn't exist\n    if [ -z \"$EXISTING_BUILDER\" ]; then\n        echo \"Creating builder: $BUILDER_NAME\"\n        docker buildx create --use --name $BUILDER_NAME --platform $PLATFORM\n    else\n        echo \"Builder $BUILDER_NAME already exists. Skipping creation.\"\n    fi\n\n    docker buildx build --platform $PLATFORM -f $DOCKERFILE -t $IMAGE_NAME:$IMAGE_TAG --load .\n}\n\nrun_container() {\n    echo \"Running tests in Docker container...\"\n    docker run -it --rm --platform $PLATFORM -v $VOLUME_MAPPING $IMAGE_NAME:$IMAGE_TAG $CMD\n}\n\n# Main script execution\nbuild_image\nrun_container\n\necho \"Tests completed successfully.\""
  },
  {
    "path": "core/tests/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/chunk_stream_fixture.jsonl",
    "content": "{\"docs\": []}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": \"call_mjPLkzPy8NPmr4imoirwmhn1\", \"function\": {\"arguments\": \"\", \"name\": \"cited_answer\"}, \"type\": \"function\"}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [{\"name\": \"cited_answer\", \"args\": {}, \"id\": \"call_mjPLkzPy8NPmr4imoirwmhn1\"}], \"invalid_tool_calls\": [], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": \"cited_answer\", \"args\": \"\", \"id\": \"call_mjPLkzPy8NPmr4imoirwmhn1\", \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"{\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [{\"name\": \"\", \"args\": {}, \"id\": null}], \"invalid_tool_calls\": [], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"{\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"answer\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"answer\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"answer\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\":\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\":\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\":\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"Natural\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"Natural\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"Natural\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Processing\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" (\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" (\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" (\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"N\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"N\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"N\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"LP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"LP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"LP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \")\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \")\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \")\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" is\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" a\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" field\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" field\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" field\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" of\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" artificial\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" artificial\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" artificial\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" intelligence\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" intelligence\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" intelligence\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" that\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" that\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" that\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" focuses\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" focuses\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" focuses\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" on\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" on\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" on\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" the\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" interaction\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" interaction\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" interaction\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" between\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" between\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" between\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" computers\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" humans\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" humans\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" humans\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" through\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" through\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" through\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" natural\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" natural\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" natural\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" The\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" The\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" The\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" ultimate\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" ultimate\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" ultimate\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" objective\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" objective\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" objective\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" of\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" NLP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" is\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" to\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" enable\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" enable\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" enable\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" computers\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" to\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" understand\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" understand\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" understand\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" interpret\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" interpret\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" interpret\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" respond\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" respond\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" respond\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" to\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" human\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" in\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" a\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" way\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" way\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" way\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" that\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" that\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" that\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" is\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" both\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" both\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" both\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" valuable\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" valuable\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" valuable\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" meaningful\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" meaningful\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" meaningful\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" NLP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" combines\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" combines\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" combines\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" computational\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" computational\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" computational\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" lingu\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" lingu\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" lingu\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"istics\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"istics\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"istics\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\u2014\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\u2014\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\u2014\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"rule\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"rule\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"rule\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"-based\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"-based\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"-based\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" modeling\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" modeling\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" modeling\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" of\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" human\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\u2014with\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\u2014with\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\u2014with\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" statistical\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" statistical\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" statistical\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" machine\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" machine\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" machine\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" learning\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" learning\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" learning\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" deep\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" deep\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" deep\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" learning\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" learning\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" learning\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" models\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" models\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" models\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" This\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" This\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" This\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" combination\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" combination\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" combination\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" allows\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" allows\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" allows\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" computers\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" computers\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" to\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" process\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" process\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" process\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" human\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" human\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" in\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" the\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" form\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" form\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" form\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" of\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" text\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" text\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" text\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" or\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" or\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" or\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" voice\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" voice\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" voice\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" data\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" data\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" data\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" to\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" to\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" understand\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" understand\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" understand\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" its\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" its\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" its\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" full\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" full\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" full\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" meaning\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" meaning\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" meaning\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" complete\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" complete\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" complete\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" with\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" with\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" with\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" the\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" speaker\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" speaker\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" speaker\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" or\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" or\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" or\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" writer\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" writer\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" writer\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\u2019s\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\u2019s\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\u2019s\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" intent\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" intent\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" intent\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" sentiment\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Key\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Key\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Key\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" tasks\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" tasks\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" tasks\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" in\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" NLP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" include\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" include\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" include\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" text\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" text\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" text\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" speech\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" speech\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" speech\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" recognition\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" recognition\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" recognition\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" translation\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" translation\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" translation\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" sentiment\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" analysis\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" analysis\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" analysis\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" topic\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" topic\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" topic\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" segmentation\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" segmentation\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" segmentation\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\\\",\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\\\",\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\\\",\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"thought\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"thought\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"thought\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"s\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"s\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"s\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\":\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\":\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\":\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"Based\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"Based\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"Based\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" on\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" on\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" on\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" the\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" context\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" context\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" context\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" provided\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" provided\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" provided\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" I\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" I\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" I\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" have\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" have\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" have\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" created\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" created\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" created\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" a\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" a\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" detailed\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" detailed\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" detailed\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" answer\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" answer\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" answer\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" about\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" about\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" about\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" what\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" what\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" what\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Natural\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Processing\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" (\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" (\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" (\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"N\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"N\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"N\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"LP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"LP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"LP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \")\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \")\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \")\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" is\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" is\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" including\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" including\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" including\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" its\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" its\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" its\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" objectives\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" objectives\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" objectives\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" components\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" components\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" components\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" and\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" and\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" key\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" key\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" key\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" tasks\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" tasks\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" tasks\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \".\\\",\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \".\\\",\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \".\\\",\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"cit\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"cit\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"cit\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"ations\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"ations\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"ations\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\":[]\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\":[]\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\":[]\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \",\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \",\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \",\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"follow\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"follow\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"follow\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"up\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"up\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"up\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"_questions\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"_questions\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"_questions\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\":[\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\":[\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\":[\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"What\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"What\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"What\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" are\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" are\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" are\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" some\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" some\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" some\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" common\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" common\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" common\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" applications\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" applications\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" applications\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" of\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" of\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Natural\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Processing\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"?\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\",\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\",\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\",\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"How\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"How\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"How\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" does\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" does\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" does\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" sentiment\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" sentiment\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" analysis\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" analysis\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" analysis\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" work\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" work\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" work\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" in\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" NLP\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" NLP\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"?\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\",\\\"\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\",\\\"\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\",\\\"\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"What\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"What\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"What\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" are\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" are\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" are\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" the\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" the\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" challenges\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" challenges\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" challenges\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" faced\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" faced\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" faced\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" in\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" in\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Natural\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Natural\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Language\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Language\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \" Processing\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \" Processing\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"?\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"?\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"\\\"]\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"\\\"]\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"\\\"]\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {\"tool_calls\": [{\"index\": 0, \"id\": null, \"function\": {\"arguments\": \"}\", \"name\": null}, \"type\": null}]}, \"response_metadata\": {}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [{\"name\": null, \"args\": \"}\", \"id\": null, \"error\": null}], \"usage_metadata\": null, \"tool_call_chunks\": [{\"name\": null, \"args\": \"}\", \"id\": null, \"index\": 0}]}}\n{\"answer\": {\"content\": \"\", \"additional_kwargs\": {}, \"response_metadata\": {\"finish_reason\": \"tool_calls\", \"model_name\": \"gpt-4o-2024-05-13\", \"system_fingerprint\": \"fp_298125635f\"}, \"type\": \"AIMessageChunk\", \"name\": null, \"id\": \"run-8387322c-9e92-4a63-8f63-f37f86acd5c4\", \"example\": false, \"tool_calls\": [], \"invalid_tool_calls\": [], \"usage_metadata\": null, \"tool_call_chunks\": []}}\n"
  },
  {
    "path": "core/tests/conftest.py",
    "content": "import json\nimport os\nfrom pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom langchain_core.embeddings import DeterministicFakeEmbedding\nfrom langchain_core.language_models import FakeListChatModel\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.runnables.utils import AddableDict\nfrom langchain_core.vectorstores import InMemoryVectorStore\nfrom quivr_core.rag.entities.config import LLMEndpointConfig\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.llm import LLMEndpoint\n\n\n@pytest.fixture(scope=\"function\")\ndef temp_data_file(tmp_path):\n    data = \"This is some test data.\"\n    temp_file = tmp_path / \"data.txt\"\n    temp_file.write_text(data)\n    return temp_file\n\n\n@pytest.fixture(scope=\"function\")\ndef quivr_txt(temp_data_file):\n    return QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=temp_data_file.name,\n        path=temp_data_file,\n        file_extension=FileExtension.txt,\n        file_sha1=\"123\",\n    )\n\n\n@pytest.fixture\ndef quivr_pdf():\n    return QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=\"dummy.pdf\",\n        path=Path(\"./tests/processor/data/dummy.pdf\"),\n        file_extension=FileExtension.pdf,\n        file_sha1=\"13bh234jh234\",\n    )\n\n\n@pytest.fixture\ndef full_response():\n    return \"Natural Language Processing (NLP) is a field of artificial intelligence that focuses on the interaction between computers and humans through natural language. The ultimate objective of NLP is to enable computers to understand, interpret, and respond to human language in a way that is both valuable and meaningful. NLP combines computational linguistics—rule-based modeling of human language—with statistical, machine learning, and deep learning models. This combination allows computers to process human language in the form of text or voice data and to understand its full meaning, complete with the speaker or writer’s intent and sentiment. Key tasks in NLP include text and speech recognition, translation, sentiment analysis, and topic segmentation.\"\n\n\n@pytest.fixture\ndef chunks_stream_answer():\n    with open(\"./tests/chunk_stream_fixture.jsonl\", \"r\") as f:\n        raw_chunks = list(f)\n\n    chunks = []\n    for rc in raw_chunks:\n        chunk = AddableDict(**json.loads(rc))\n        if \"answer\" in chunk:\n            chunk[\"answer\"] = AIMessageChunk(**chunk[\"answer\"])\n            chunks.append(chunk)\n    return chunks\n\n\n@pytest.fixture(autouse=True)\ndef openai_api_key():\n    os.environ[\"OPENAI_API_KEY\"] = \"this-is-a-test-key\"\n\n\n@pytest.fixture\ndef answers():\n    return [f\"answer_{i}\" for i in range(10)]\n\n\n@pytest.fixture(scope=\"function\")\ndef fake_llm(answers: list[str]):\n    llm = FakeListChatModel(responses=answers)\n    return LLMEndpoint(llm=llm, llm_config=LLMEndpointConfig(model=\"fake_model\"))\n\n\n@pytest.fixture(scope=\"function\")\ndef embedder():\n    return DeterministicFakeEmbedding(size=20)\n\n\n@pytest.fixture(scope=\"function\")\ndef mem_vector_store(embedder):\n    return InMemoryVectorStore(embedder)\n"
  },
  {
    "path": "core/tests/fixture_chunks.py",
    "content": "import asyncio\nimport json\nfrom uuid import uuid4\n\nfrom langchain_core.embeddings import DeterministicFakeEmbedding\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.vectorstores import InMemoryVectorStore\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.rag.entities.config import LLMEndpointConfig, RetrievalConfig\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.rag.quivr_rag_langgraph import QuivrQARAGLangGraph\n\n\nasync def main():\n    retrieval_config = RetrievalConfig(llm_config=LLMEndpointConfig(model=\"gpt-4o\"))\n    embedder = DeterministicFakeEmbedding(size=20)\n    vec = InMemoryVectorStore(embedder)\n\n    llm = LLMEndpoint.from_config(retrieval_config.llm_config)\n    chat_history = ChatHistory(uuid4(), uuid4())\n    rag_pipeline = QuivrQARAGLangGraph(\n        retrieval_config=retrieval_config, llm=llm, vector_store=vec\n    )\n\n    conversational_qa_chain = rag_pipeline.build_chain()\n\n    with open(\"response.jsonl\", \"w\") as f:\n        async for event in conversational_qa_chain.astream_events(\n            {\n                \"messages\": [\n                    (\"user\", \"What is NLP, give a very long detailed answer\"),\n                ],\n                \"chat_history\": chat_history,\n                \"custom_personality\": None,\n            },\n            version=\"v1\",\n            config={\"metadata\": {}},\n        ):\n            kind = event[\"event\"]\n            if (\n                kind == \"on_chat_model_stream\"\n                and event[\"metadata\"][\"langgraph_node\"] == \"generate\"\n            ):\n                chunk = event[\"data\"][\"chunk\"]\n                dict_chunk = {\n                    k: v.dict() if isinstance(v, AIMessageChunk) else v\n                    for k, v in chunk.items()\n                }\n                f.write(json.dumps(dict_chunk) + \"\\n\")\n\n\nasyncio.run(main())\n"
  },
  {
    "path": "core/tests/processor/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/community/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/community/test_markdown_processor.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.implementations.default import MarkdownProcessor\n\nunstructured = pytest.importorskip(\"unstructured\")\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_markdown_processor():\n    p = Path(\"./tests/processor/data/guidelines_code.md\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.md,\n        file_sha1=\"123\",\n    )\n    processor = MarkdownProcessor()\n    result = await processor.process_file(f)\n    assert len(result) > 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_markdown_processor_fail(quivr_txt):\n    processor = MarkdownProcessor()\n    with pytest.raises(ValueError):\n        await processor.process_file(quivr_txt)\n"
  },
  {
    "path": "core/tests/processor/data/guidelines_code.md",
    "content": "# Backend code guidelines\n\n## **Code Structure and Organization**\n\n- Follow a clear project structure :\n    - In quivr-api we have modules divided into : controller, entity, services, repositories, utils)\n- **Use dependency injection for better testability and modularity** 🔺\n- Use environment variables for configuration 🔺\n    - We use Pydantic settings for parsing the arguments\n- Don’t add unnecessary abstractions → **KISS principle.**\n    - Premature abstractions are a bad pattern\n- Avoid using Global Scoped Objects 🔺🔺🔺\n- Understand the implications of using the following syntax: 🔺🔺🔺\n    - Context manager :\n    - Wrapper functions and High order Function\n    - Generator / AsyncGenerators\n    - ThreadPools and ProcessPool\n    - Asynchronous code\n- Don’t replicate object that are Standalone/Singleton or with heavy dependencies. All python objects are references. Use the references: 🔺🔺🔺\n    - **Example**: Recreating a `BrainService`  inside a function is an antipattern. This function should take `service : BrainService` as a parameter ( also easily testable via dependency injection)\n    - **Example**: Recreating a class that connects to a `APIService` is an antipattern. Connection creation is pretty costly process. You should the a **single object** and pass it accross function calls\n- Error handling:\n    - Use specific exception types rather than catching all exceptions. The caller can then `try .. except CustomException`\n    - Create custom exception classes for **application-specific errors.**\n    - Add logs when Errors are catched for better debugging\n\n        ```python\n        try:\n            result = perform_operation()\n        except OperationError as e:\n            log.error(f\"Operation failed: {str(e)}\")\n            return error_response()\n        ```\n\n    - Consider using **assertion statements ! IMHO this is really important** 🔺. Checkout : https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md#safety\n\n**(Advanced):**\n\n- Try encoding business pattern in Type ( known as Typestate pattern):\n    - For example if a File can either be in Open or Close state → use two Types OpenFile and CloseFile with separate behaviour to avoid calling methods on a closed file.\n- May need to consider adding route level exception handling to FastAPI\n\n## **Database and ORM**\n\n- Use SQLModel for all database operations:\n    - SQlmodel docs : [https://sqlmodel.tiangolo.com/](https://sqlmodel.tiangolo.com/)\n    - Use **eager** or **lazy** relationship for modeling 1-many and many-many relationships depending on join cost\n    - Be aware of async session and lazy attributes\n- Use async as much as possible\n- Think about access patterns in your code :  🔺🔺🔺\n    - Reduce n+1 calls : If we can get the information with a single query, we do it in a single query\n\n    > **Always ask if this chunk of call can be done via a single SQL query !**\n    >\n    - Batch writes to the database. If we Insert N times in a loop → 1 insert many !\n    - Write database queries with proper indexing in mind.\n        - Example : Do we need to filter results ? If yes then add a WHERE clause …\n        - Do we frequently filter on some attribute → Add index.\n        - Think about which index :BTreeIndex when ordered access, HashIndex where data is really dissimilar and we need extremely fast access …\n    - Think about Joins. If we do 2 queries to get the data then maybe we can do it in one :\n        - For example User/UserSettings/UserUsage. We can get all of this info eagerly when accessing user.\n\n            > DB side fetching is FAST ! Network is slow !\n            >\n- Think about atomic guarantees and transactions in the whole workflow\n    - Example : deleting a knowledge and its vectors should be atomic\n\n## **API and External Services**\n\n- When sending requests to external services (APIs), always include:\n    - Defined timeouts\n    - Backoff policy\n    - Retry mechanism\n    - Conversion of HTTP errors to business-level exceptions\n- Use a circuit breaker pattern for frequently called external services\n- Implement proper **error handling and logging**\n\n## **HTTP and Routing**\n\n- Keep HTTP logic confined to the routes layer\n- Raise HTTP errors only through FastAPI\n- Use appropriate HTTP status codes consistently with\n- Implement request validation at the API entry point\n\n## **Performance**\n\n- Use caching mechanisms where appropriate (e.g., Redis)\n- Implement pagination for list endpoints\n- Use asynchronous programming where beneficial\n    - Keep in mind that python is single threaded !\n- Avoid unnecessary serialization/deserialization\n- Optimize database queries and use indexing effectively\n- For performance critical code :\n    - Use libraries that are True wrappers (ie don’t call subprocess)\n    - Use libraries that  release the GIL\n    - Use Threadpools and ProcessPool when possible\n    - Be aware of libraries spawning their own threadpool !!!!\n- Understand underlying systems : networks, disk access, operating system syscalls\n\n## **Testing**\n\n- Write unit tests for all business logic. The code should be written with dependency injection in mind !\n- Write unit test for repositories:\n    - Use the rollback session fixture ( see ChatHistory tests)\n    - Test with different configurations of Brain types, User settings, … → Use parametrized test for this\n- Implement integration tests for API endpoints\n    - FastAPI testclient :  https://fastapi.tiangolo.com/tutorial/testing/\n- Use mocking for external services in tests.\n\n## **Logging and Monitoring**\n\n- Implement structured logging\n- *TODO: define where and how*\n\n## **Security**\n\n- Implement input validation and sanitization\n- Use parameterized queries to prevent SQL injection\n- Implement rate limiting for API endpoints\n- Regularly update dependencies and address security vulnerabilities\n\n## **Documentation**\n\n- Maintain a README with setup and run instructions\n- Document all non-obvious code sections\n\n## **Version Control and CI/CD**\n\n- Use feature branches and pull requests\n- Keep a changelog for version control\n- Implement automated CI/CD pipelines\n- **Perform code reviews for all changes**\n"
  },
  {
    "path": "core/tests/processor/docx/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/docx/test_docx.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.implementations.default import DOCXProcessor\n\nunstructured = pytest.importorskip(\"unstructured\")\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_docx_filedocx():\n    p = Path(\"./tests/processor/docx/demo.docx\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.docx,\n        file_sha1=\"123\",\n    )\n    processor = DOCXProcessor()\n    result = await processor.process_file(f)\n    assert len(result) > 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_docx_processor_fail(quivr_txt):\n    processor = DOCXProcessor()\n    with pytest.raises(ValueError):\n        await processor.process_file(quivr_txt)\n"
  },
  {
    "path": "core/tests/processor/epub/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/epub/test_epub_processor.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.implementations.default import EpubProcessor\n\nunstructured = pytest.importorskip(\"unstructured\")\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_epub_page_blanche():\n    p = Path(\"./tests/processor/epub/page-blanche.epub\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.epub,\n        file_sha1=\"123\",\n    )\n    processor = EpubProcessor()\n    result = await processor.process_file(f)\n    assert len(result) == 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_epub_processor():\n    p = Path(\"./tests/processor/epub/sway.epub\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.epub,\n        file_sha1=\"123\",\n    )\n\n    processor = EpubProcessor()\n    result = await processor.process_file(f)\n    assert len(result) > 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_epub_processor_fail(quivr_txt):\n    processor = EpubProcessor()\n    with pytest.raises(ValueError):\n        await processor.process_file(quivr_txt)\n"
  },
  {
    "path": "core/tests/processor/odt/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/odt/bad_odt.odt",
    "content": "<!DOCTYPE html><html><head> <meta charset=\"UTF-8\"> <title>File Examples | Download redirect...</title> <meta name=\"description\" content=\"Download redirect page.\" > <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"> <link href=\"https://fonts.googleapis.com/css?family=Catamaran:100,200,300,400,500,600,700,800,900\" rel=\"stylesheet\"> <style>h2{font-family: Catamaran,Helvetica,Arial,sans-serif; font-weight: 200; font-size: 50px; color: #333;}section{padding-top: 10%; max-width:100%; text-align: center;}a{color: #00CC66;}a:focus{outline:none; outline-offset:inherit;}@media (max-device-width: 1027px){body{text-align:center; font-size:larger;}section{max-width: 90%;}}@media (max-device-width: 640px){section{max-width: 97%;}}</style></head><body> <section> <h2>Downloading...</h2> <em>Please wait a moment</em><br/><br/><script>document.write('<a href=\"' + document.referrer + '\">[Go Back]</a>');</script></section><script>document.addEventListener('DOMContentLoaded', function(){setTimeout(function (){url=window.location.href.replace('file-examples.com/wp-content/storage/','file-examples.com/storage/fe8a1df88b669e6bf987ef5/'); window.location.replace(url);}, 3000);}, false);</script></body></html>\n"
  },
  {
    "path": "core/tests/processor/odt/test_odt.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.implementations.default import ODTProcessor\n\nunstructured = pytest.importorskip(\"unstructured\")\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_odt_processor():\n    p = Path(\"./tests/processor/odt/sample.odt\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.odt,\n        file_sha1=\"123\",\n    )\n    processor = ODTProcessor()\n    result = await processor.process_file(f)\n    assert len(result) > 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_odt_processor_fail():\n    p = Path(\"./tests/processor/odt/bad_odt.odt\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.txt,\n        file_sha1=\"123\",\n    )\n    processor = ODTProcessor()\n    with pytest.raises(ValueError):\n        await processor.process_file(f)\n"
  },
  {
    "path": "core/tests/processor/pdf/__init__.py",
    "content": ""
  },
  {
    "path": "core/tests/processor/pdf/test_unstructured_pdf_processor.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nimport pytest\nfrom quivr_core.files.file import FileExtension, QuivrFile\n\nunstructured = pytest.importorskip(\"unstructured\")\n\nall_but_pdf = list(filter(lambda ext: ext != \".pdf\", list(FileExtension)))\n\n\n@pytest.mark.unstructured\n@pytest.mark.asyncio\nasync def test_unstructured_pdf_processor():\n    from quivr_core.processor.implementations.default import UnstructuredPDFProcessor\n\n    p = Path(\"./tests/processor/pdf/sample.pdf\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=FileExtension.pdf,\n        file_sha1=\"123\",\n    )\n    processor = UnstructuredPDFProcessor()\n    result = await processor.process_file(f)\n    assert len(result) > 0\n\n\n@pytest.mark.unstructured\n@pytest.mark.parametrize(\"ext\", all_but_pdf)\n@pytest.mark.asyncio\nasync def test_unstructured_pdf_processor_fail(ext):\n    from quivr_core.processor.implementations.default import UnstructuredPDFProcessor\n\n    p = Path(\"./tests/processor/pdf/sample.pdf\")\n    f = QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=p.stem,\n        path=p,\n        file_extension=ext,\n        file_sha1=\"123\",\n    )\n    processor = UnstructuredPDFProcessor()\n    with pytest.raises(ValueError):\n        await processor.process_file(f)\n"
  },
  {
    "path": "core/tests/processor/test_default_implementations.py",
    "content": "import pytest\nfrom quivr_core.files.file import FileExtension\nfrom quivr_core.processor.processor_base import ProcessorBase\n\n\n@pytest.mark.base\ndef test___build_processor():\n    from langchain_community.document_loaders.base import BaseLoader\n    from quivr_core.processor.implementations.default import _build_processor\n\n    cls = _build_processor(\"TestCLS\", BaseLoader, [FileExtension.txt])\n\n    assert cls.__name__ == \"TestCLS\"\n    assert issubclass(cls, ProcessorBase)\n    assert \"__init__\" in cls.__dict__\n    assert cls.supported_extensions == [FileExtension.txt]\n    proc = cls()\n    assert hasattr(proc, \"loader_cls\")\n    # FIXME: proper mypy typing\n    assert proc.loader_cls == BaseLoader  # type: ignore\n"
  },
  {
    "path": "core/tests/processor/test_registry.py",
    "content": "import logging\nfrom heapq import heappop\n\nimport pytest\nfrom langchain_core.documents import Document\nfrom quivr_core import registry\nfrom quivr_core.files.file import FileExtension, QuivrFile\nfrom quivr_core.processor.implementations.simple_txt_processor import SimpleTxtProcessor\nfrom quivr_core.processor.implementations.tika_processor import TikaProcessor\nfrom quivr_core.processor.processor_base import ProcessorBase\nfrom quivr_core.processor.registry import (\n    _LOWEST_PRIORITY,\n    ProcEntry,\n    ProcMapping,\n    _append_proc_mapping,\n    _import_class,\n    available_processors,\n    get_processor_class,\n    known_processors,\n    register_processor,\n)\n\n\n# TODO : reimplement when quivr-core will be its own package\n@pytest.mark.skip(reason=\"TODO: reimplement when quivr-core will be its own package\")\ndef test_get_default_processors_cls():\n    from quivr_core.processor.implementations.default import TikTokenTxtProcessor\n\n    cls = get_processor_class(FileExtension.txt)\n    assert cls == TikTokenTxtProcessor\n\n    cls = get_processor_class(FileExtension.pdf)\n    # FIXME: using this class will actually fail if you don't have the\n    assert cls == TikaProcessor\n\n\n@pytest.mark.skip(reason=\"TODO: reimplement when quivr-core will be its own package\")\ndef test_get_default_processors_cls_core():\n    cls = get_processor_class(FileExtension.txt)\n    assert cls == SimpleTxtProcessor\n\n    cls = get_processor_class(FileExtension.pdf)\n    assert cls == TikaProcessor\n\n\ndef test_append_proc_mapping_empty():\n    proc_mapping = {}\n\n    _append_proc_mapping(\n        proc_mapping,\n        file_ext=FileExtension.txt,\n        cls_mod=\"test.test\",\n        errtxt=\"error\",\n        priority=None,\n    )\n    assert len(proc_mapping) == 1\n    assert len(proc_mapping[FileExtension.txt]) == 1\n    assert proc_mapping[FileExtension.txt][0] == ProcEntry(\n        priority=_LOWEST_PRIORITY, cls_mod=\"test.test\", err=\"error\"\n    )\n\n\ndef test_append_proc_mapping_priority():\n    proc_mapping: ProcMapping = {\n        FileExtension.txt: [\n            ProcEntry(\n                cls_mod=\"quivr_core.processor.implementations.simple_txt_processor.SimpleTxtProcessor\",\n                err=None,\n                priority=_LOWEST_PRIORITY,\n            )\n        ],\n    }\n    _append_proc_mapping(\n        proc_mapping,\n        file_ext=FileExtension.txt,\n        cls_mod=\"test.test\",\n        errtxt=\"error\",\n        priority=0,\n    )\n\n    assert len(proc_mapping[FileExtension.txt]) == 2\n    # Procs are appended in order\n    assert heappop(proc_mapping[FileExtension.txt]) == ProcEntry(\n        priority=0, cls_mod=\"test.test\", err=\"error\"\n    )\n\n\ndef test_append_proc_mapping():\n    proc_mapping: ProcMapping = {\n        FileExtension.txt: [\n            ProcEntry(\n                cls_mod=\"quivr_core.processor.implementations.simple_txt_processor.SimpleTxtProcessor\",\n                err=None,\n                priority=_LOWEST_PRIORITY,\n            )\n        ],\n    }\n    _append_proc_mapping(\n        proc_mapping,\n        file_ext=FileExtension.txt,\n        cls_mod=\"test.test\",\n        errtxt=\"error\",\n        priority=None,\n    )\n\n    assert len(proc_mapping[FileExtension.txt]) == 2\n    # Procs are appended in order\n    assert heappop(proc_mapping[FileExtension.txt]) == ProcEntry(\n        priority=_LOWEST_PRIORITY - 1, cls_mod=\"test.test\", err=\"error\"\n    )\n    assert heappop(proc_mapping[FileExtension.txt]) == ProcEntry(\n        cls_mod=\"quivr_core.processor.implementations.simple_txt_processor.SimpleTxtProcessor\",\n        err=None,\n        priority=_LOWEST_PRIORITY,\n    )\n\n\n@pytest.mark.skip(\n    reason=\"TODO: audio processors will be added to quivr-core very soon!\"\n)\ndef test_known_processors():\n    assert all(\n        ext in known_processors for ext in list(FileExtension)\n    ), \"base-env : Some file extensions don't have a default processor\"\n\n\ndef test__import_class():\n    mod_path = \"quivr_core.processor.implementations.tika_processor.TikaProcessor\"\n    mod = _import_class(mod_path)\n    assert mod == TikaProcessor\n\n    with pytest.raises(TypeError, match=r\".* is not a class\"):\n        mod_path = \"quivr_core.processor\"\n        _import_class(mod_path)\n\n    with pytest.raises(TypeError, match=r\".* ProcessorBase\"):\n        mod_path = \"quivr_core.Brain\"\n        _import_class(mod_path)\n\n\n@pytest.mark.skip(reason=\"TODO: reimplement when quivr-core will be its own package\")\ndef test_get_processor_cls_import_error(caplog):\n    \"\"\"\n    Test in an environement where we only have the bare minimum parsers.\n    The .html can't be parsed so we should raise an ImportError\"\"\"\n    with pytest.raises(ImportError):\n        get_processor_class(\".html\")\n\n\ndef test_get_processor_cls_error():\n    with pytest.raises(ValueError):\n        get_processor_class(\".sdfkj\")\n\n\n@pytest.mark.skip(\"needs tox for separating side effects on other tests\")\ndef test_register_new_proc_noappend():\n    with pytest.raises(ValueError):\n        register_processor(FileExtension.txt, \"test.\", append=False)\n\n\n@pytest.mark.skip(\"needs tox for separating side effects on other tests\")\ndef test_register_new_proc_append(caplog):\n    n = len(known_processors[FileExtension.txt])\n    register_processor(FileExtension.txt, \"test.\", append=True)\n    assert len(known_processors[FileExtension.txt]) == n + 1\n\n    with caplog.at_level(logging.INFO, logger=\"quivr_core\"):\n        register_processor(FileExtension.txt, \"test.\", append=True)\n        assert caplog.record_tuples == [\n            (\"quivr_core\", logging.INFO, \"test. already in registry...\")\n        ]\n\n\n@pytest.mark.skip(\"needs tox for separating side effects on other tests\")\ndef test_register_new_proc():\n    nprocs = len(registry)\n\n    class TestProcessor(ProcessorBase):\n        supported_extensions = [\".test\"]\n\n        async def process_file(self, file: QuivrFile) -> list[Document]:\n            return []\n\n    register_processor(\".test\", TestProcessor)\n    assert len(registry) == nprocs + 1\n\n    cls = get_processor_class(\".test\")\n    assert cls == TestProcessor\n\n\ndef test_register_non_processor():\n    class NOTPROC:\n        supported_extensions = [\".pdf\"]\n\n    with pytest.raises(AssertionError):\n        register_processor(\".pdf\", NOTPROC)  # type: ignore\n\n\ndef test_register_override_proc():\n    class TestProcessor(ProcessorBase):\n        supported_extensions = [\".pdf\"]\n\n        @property\n        def processor_metadata(self):\n            return {}\n\n        async def process_file_inner(self, file: QuivrFile) -> list[Document]:\n            return []\n\n    register_processor(\".pdf\", TestProcessor, override=True)\n    cls = get_processor_class(FileExtension.pdf)\n    assert cls == TestProcessor\n\n\ndef test_register_override_error():\n    # Register class to pdf\n    _ = get_processor_class(FileExtension.pdf)\n\n    class TestProcessor(ProcessorBase):\n        supported_extensions = [FileExtension.pdf]\n\n        @property\n        def processor_metadata(self):\n            return {}\n\n        async def process_file_inner(self, file: QuivrFile) -> list[Document]:\n            return []\n\n    with pytest.raises(ValueError):\n        register_processor(\".pdf\", TestProcessor, override=False)\n\n\ndef test_available_processors():\n    assert 17 == len(available_processors())\n"
  },
  {
    "path": "core/tests/processor/test_simple_txt_processor.py",
    "content": "import pytest\nfrom langchain_core.documents import Document\nfrom quivr_core.files.file import FileExtension\nfrom quivr_core.processor.implementations.simple_txt_processor import (\n    SimpleTxtProcessor,\n    recursive_character_splitter,\n)\nfrom quivr_core.processor.splitter import SplitterConfig\n\n\ndef test_recursive_character_splitter():\n    doc = Document(page_content=\"abcdefgh\", metadata={\"key\": \"value\"})\n\n    docs = recursive_character_splitter(doc, chunk_size=2, chunk_overlap=1)\n\n    assert [d.page_content for d in docs] == [\"ab\", \"bc\", \"cd\", \"de\", \"ef\", \"fg\", \"gh\"]\n    assert [d.metadata for d in docs] == [doc.metadata] * len(docs)\n\n\n@pytest.mark.asyncio\nasync def test_simple_processor(quivr_pdf, quivr_txt):\n    proc = SimpleTxtProcessor(\n        splitter_config=SplitterConfig(chunk_size=100, chunk_overlap=20)\n    )\n    assert proc.supported_extensions == [FileExtension.txt]\n\n    with pytest.raises(ValueError):\n        await proc.process_file(quivr_pdf)\n\n    docs = await proc.process_file(quivr_txt)\n\n    assert len(docs) == 1\n    assert docs[0].page_content == \"This is some test data.\"\n"
  },
  {
    "path": "core/tests/processor/test_tika_processor.py",
    "content": "import pytest\nfrom quivr_core.processor.implementations.tika_processor import TikaProcessor\n\n# TODO: TIKA server should be set\n\n\n@pytest.mark.tika\n@pytest.mark.asyncio\nasync def test_process_file(quivr_pdf):\n    tparser = TikaProcessor()\n    doc = await tparser.process_file(quivr_pdf)\n    assert len(doc) > 0\n    assert doc[0].page_content.strip(\"\\n\") == \"Dummy PDF download\"\n\n\n@pytest.mark.tika\n@pytest.mark.asyncio\nasync def test_send_parse_tika_exception(quivr_pdf):\n    # TODO: Mock correct tika for retries\n    tparser = TikaProcessor(tika_url=\"test.test\")\n    with pytest.raises(RuntimeError):\n        doc = await tparser.process_file(quivr_pdf)\n        assert len(doc) > 0\n        assert doc[0].page_content.strip(\"\\n\") == \"Dummy PDF download\"\n"
  },
  {
    "path": "core/tests/processor/test_txt_processor.py",
    "content": "from uuid import uuid4\n\nimport pytest\nfrom quivr_core.storage.file import FileExtension, QuivrFile\n\nunstructured = pytest.importorskip(\"unstructured\")\n\n\n@pytest.fixture\ndef txt_qfile(temp_data_file):\n    return QuivrFile(\n        id=uuid4(),\n        brain_id=uuid4(),\n        original_filename=\"data.txt\",\n        path=temp_data_file,\n        file_extension=FileExtension.txt,\n        file_sha1=\"hash\",\n    )\n\n\n@pytest.mark.base\n@pytest.mark.asyncio\nasync def test_process_txt(txt_qfile):\n    from quivr_core.processor.implementations.default import TikTokenTxtProcessor\n    from quivr_core.processor.splitter import SplitterConfig\n\n    tparser = TikTokenTxtProcessor(\n        splitter_config=SplitterConfig(chunk_size=20, chunk_overlap=0)\n    )\n    doc = await tparser.process_file(txt_qfile)\n    assert len(doc) > 0\n    assert doc[0].page_content == \"This is some test data.\"\n    assert (\n        doc[0].metadata.items()\n        >= {\n            \"chunk_index\": 1,\n            \"original_file_name\": \"data.txt\",\n            \"chunk_size\": 6,\n            \"processor_cls\": \"TextLoader\",\n            \"splitter\": {\"chunk_size\": 20, \"chunk_overlap\": 0},\n            **txt_qfile.metadata,\n        }.items()\n    )\n"
  },
  {
    "path": "core/tests/rag_config.yaml",
    "content": "ingestion_config:\n  parser_config:\n    megaparse_config:\n      strategy: \"fast\"\n      pdf_parser: \"unstructured\"\n    splitter_config:\n      chunk_size: 400\n      chunk_overlap: 100\n\nretrieval_config:\n  # Maximum number of previous conversation iterations\n  # to include in the context of the answer\n  max_history: 10\n\n  max_files: 20\n  reranker_config:\n    # The reranker supplier to use\n    supplier: \"cohere\"\n\n    # The model to use for the reranker for the given supplier\n    model: \"rerank-multilingual-v3.0\"\n\n    # Number of chunks returned by the reranker\n    top_n: 5\n  llm_config:\n    # The LLM supplier to use\n    supplier: \"openai\"\n\n    # The model to use for the LLM for the given supplier\n    model: \"gpt-3.5-turbo-0125\"\n\n    max_context_tokens: 2000\n\n    # Maximum number of tokens to pass to the LLM\n    # as a context to generate the answer\n    max_output_tokens: 2000\n\n    temperature: 0.7\n    streaming: true\n"
  },
  {
    "path": "core/tests/rag_config_workflow.yaml",
    "content": "ingestion_config:\n  parser_config:\n    megaparse_config:\n      strategy: \"fast\"\n      pdf_parser: \"unstructured\"\n    splitter_config:\n      chunk_size: 400\n      chunk_overlap: 100\n\nretrieval_config:\n  workflow_config:\n    name: \"standard RAG\"\n    nodes:\n      - name: \"START\"\n        edges: [\"filter_history\"]\n\n      - name: \"filter_history\"\n        edges: [\"generate_chat_llm\"]\n\n      - name: \"generate_chat_llm\" # the name of the last node, from which we want to stream the answer to the user, should always start with \"generate\"\n        edges: [\"END\"]\n  # Maximum number of previous conversation iterations\n  # to include in the context of the answer\n  max_history: 10\n\n  #prompt: \"my prompt\"\n\n  max_files: 20\n  reranker_config:\n    # The reranker supplier to use\n    supplier: \"cohere\"\n\n    # The model to use for the reranker for the given supplier\n    model: \"rerank-multilingual-v3.0\"\n\n    # Number of chunks returned by the reranker\n    top_n: 5\n  llm_config:\n    # The LLM supplier to use\n    supplier: \"openai\"\n\n    # The model to use for the LLM for the given supplier\n    model: \"gpt-3.5-turbo-0125\"\n\n    max_context_tokens: 2000\n\n    # Maximum number of tokens to pass to the LLM\n    # as a context to generate the answer\n    max_output_tokens: 2000\n\n    temperature: 0.7\n    streaming: true\n"
  },
  {
    "path": "core/tests/test_brain.py",
    "content": "from dataclasses import asdict\nfrom uuid import uuid4\n\nimport pytest\nfrom langchain_core.documents import Document\nfrom langchain_core.embeddings import Embeddings\nfrom quivr_core.brain import Brain\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.storage.local_storage import TransparentStorage\n\n\n@pytest.mark.base\ndef test_brain_empty_files_no_vectordb(fake_llm, embedder):\n    # Testing no files\n    with pytest.raises(ValueError):\n        Brain.from_files(\n            name=\"test_brain\",\n            file_paths=[],\n            llm=fake_llm,\n            embedder=embedder,\n        )\n\n\ndef test_brain_empty_files(fake_llm, embedder, mem_vector_store):\n    brain = Brain.from_files(\n        name=\"test_brain\",\n        file_paths=[],\n        llm=fake_llm,\n        embedder=embedder,\n        vector_db=mem_vector_store,\n    )\n    assert brain\n\n\n@pytest.mark.asyncio\nasync def test_brain_from_files_success(\n    fake_llm: LLMEndpoint, embedder, temp_data_file, mem_vector_store\n):\n    brain = await Brain.afrom_files(\n        name=\"test_brain\",\n        file_paths=[temp_data_file],\n        embedder=embedder,\n        llm=fake_llm,\n        vector_db=mem_vector_store,\n    )\n    assert brain.name == \"test_brain\"\n    assert len(brain.chat_history) == 0\n    assert brain.llm == fake_llm\n    assert brain.vector_db.embeddings == embedder\n    assert isinstance(brain.default_chat, ChatHistory)\n    assert len(brain.default_chat) == 0\n\n    # storage\n    assert isinstance(brain.storage, TransparentStorage)\n    assert len(await brain.storage.get_files()) == 1\n\n\n@pytest.mark.asyncio\nasync def test_brain_from_langchain_docs(embedder, fake_llm, mem_vector_store):\n    chunk = Document(\"content_1\", metadata={\"id\": uuid4()})\n    brain = await Brain.afrom_langchain_documents(\n        name=\"test\",\n        llm=fake_llm,\n        langchain_documents=[chunk],\n        embedder=embedder,\n        vector_db=mem_vector_store,\n    )\n    # No appended files\n    assert len(await brain.storage.get_files()) == 0\n    assert len(brain.chat_history) == 0\n\n\n@pytest.mark.base\n@pytest.mark.asyncio\nasync def test_brain_search(\n    embedder: Embeddings,\n):\n    chunk1 = Document(\"content_1\", metadata={\"id\": uuid4()})\n    chunk2 = Document(\"content_2\", metadata={\"id\": uuid4()})\n    brain = await Brain.afrom_langchain_documents(\n        name=\"test\", langchain_documents=[chunk1, chunk2], embedder=embedder\n    )\n\n    k = 2\n    result = await brain.asearch(\"content_1\", n_results=k)\n\n    assert len(result) == k\n    assert result[0].chunk == chunk1\n    assert result[1].chunk == chunk2\n    assert result[0].distance == 0\n    assert result[1].distance > result[0].distance\n\n\n@pytest.mark.asyncio\nasync def test_brain_get_history(\n    fake_llm: LLMEndpoint, embedder, temp_data_file, mem_vector_store\n):\n    brain = await Brain.afrom_files(\n        name=\"test_brain\",\n        file_paths=[temp_data_file],\n        embedder=embedder,\n        llm=fake_llm,\n        vector_db=mem_vector_store,\n    )\n\n    await brain.aask(\"question\")\n    await brain.aask(\"question\")\n\n    assert len(brain.default_chat) == 4\n\n\n@pytest.mark.base\n@pytest.mark.asyncio\nasync def test_brain_ask_streaming(\n    fake_llm: LLMEndpoint, embedder, temp_data_file, answers\n):\n    brain = await Brain.afrom_files(\n        name=\"test_brain\", file_paths=[temp_data_file], embedder=embedder, llm=fake_llm\n    )\n\n    response = \"\"\n    async for chunk in brain.ask_streaming(\"question\"):\n        response += chunk.answer\n\n    assert response == answers[1]\n\n\ndef test_brain_info_empty(fake_llm: LLMEndpoint, embedder, mem_vector_store):\n    storage = TransparentStorage()\n    id = uuid4()\n    brain = Brain(\n        name=\"test\",\n        id=id,\n        llm=fake_llm,\n        embedder=embedder,\n        storage=storage,\n        vector_db=mem_vector_store,\n    )\n\n    assert asdict(brain.info()) == {\n        \"brain_id\": id,\n        \"brain_name\": \"test\",\n        \"files_info\": asdict(storage.info()),\n        \"chats_info\": {\n            \"nb_chats\": 1,  # start with a default chat\n            \"current_default_chat\": brain.default_chat.id,\n            \"current_chat_history_length\": 0,\n        },\n        \"llm_info\": asdict(fake_llm.info()),\n    }\n"
  },
  {
    "path": "core/tests/test_chat_history.py",
    "content": "from time import sleep\nfrom uuid import uuid4\n\nimport pytest\nfrom langchain_core.messages import AIMessage, HumanMessage\nfrom quivr_core.rag.entities.chat import ChatHistory\n\n\n@pytest.fixture\ndef ai_message():\n    return AIMessage(\"ai message\")\n\n\n@pytest.fixture\ndef human_message():\n    return HumanMessage(\"human message\")\n\n\ndef test_chat_history_constructor():\n    brain_id, chat_id = uuid4(), uuid4()\n    chat_history = ChatHistory(brain_id=brain_id, chat_id=chat_id)\n\n    assert chat_history.brain_id == brain_id\n    assert chat_history.id == chat_id\n    assert len(chat_history._msgs) == 0\n\n\ndef test_chat_history_append(ai_message: AIMessage, human_message: HumanMessage):\n    chat_history = ChatHistory(uuid4(), uuid4())\n    chat_history.append(ai_message)\n\n    assert len(chat_history) == 1\n    chat_history.append(human_message)\n    assert len(chat_history) == 2\n\n\ndef test_chat_history_get_history(ai_message: AIMessage, human_message: HumanMessage):\n    chat_history = ChatHistory(uuid4(), uuid4())\n    chat_history.append(ai_message)\n    chat_history.append(human_message)\n    chat_history.append(ai_message)\n    sleep(0.01)\n    chat_history.append(human_message)\n\n    msgs = chat_history.get_chat_history()\n\n    assert len(msgs) == 4\n    assert msgs[-1].message_time > msgs[0].message_time\n    assert isinstance(msgs[0].msg, AIMessage)\n    assert isinstance(msgs[1].msg, HumanMessage)\n\n    msgs = chat_history.get_chat_history(newest_first=True)\n    assert msgs[-1].message_time < msgs[0].message_time\n\n\ndef test_chat_history_iter_pairs_invalid(\n    ai_message: AIMessage, human_message: HumanMessage\n):\n    with pytest.raises(AssertionError):\n        chat_history = ChatHistory(uuid4(), uuid4())\n        chat_history.append(ai_message)\n        chat_history.append(ai_message)\n        next(chat_history.iter_pairs())\n\n\ndef test_chat_history_iter_pais(ai_message: AIMessage, human_message: HumanMessage):\n    chat_history = ChatHistory(uuid4(), uuid4())\n\n    chat_history.append(human_message)\n    chat_history.append(ai_message)\n    chat_history.append(human_message)\n    chat_history.append(ai_message)\n\n    result = list(chat_history.iter_pairs())\n\n    assert result == [(human_message, ai_message), (human_message, ai_message)]\n"
  },
  {
    "path": "core/tests/test_config.py",
    "content": "from quivr_core.rag.entities.config import LLMEndpointConfig, RetrievalConfig\n\n\ndef test_default_llm_config():\n    config = LLMEndpointConfig()\n\n    assert (\n        config.model_dump()\n        == LLMEndpointConfig(\n            model=\"gpt-4o\",\n            llm_base_url=None,\n            llm_api_key=None,\n            max_context_tokens=2000,\n            max_output_tokens=2000,\n            temperature=0.7,\n            streaming=True,\n        ).model_dump()\n    )\n\n\ndef test_default_retrievalconfig():\n    config = RetrievalConfig()\n\n    assert config.max_files == 20\n    assert config.prompt is None\n    print(\"\\n\\n\", config.llm_config, \"\\n\\n\")\n    print(\"\\n\\n\", LLMEndpointConfig(), \"\\n\\n\")\n    assert config.llm_config == LLMEndpointConfig()\n"
  },
  {
    "path": "core/tests/test_llm_endpoint.py",
    "content": "import os\n\nimport pytest\nfrom langchain_core.language_models import FakeListChatModel\nfrom pydantic import ValidationError\nfrom quivr_core.rag.entities.config import LLMEndpointConfig\nfrom quivr_core.llm import LLMEndpoint\n\n\n@pytest.mark.base\ndef test_llm_endpoint_from_config_default():\n    from langchain_openai import ChatOpenAI\n\n    del os.environ[\"OPENAI_API_KEY\"]\n\n    with pytest.raises((ValidationError, ValueError)):\n        llm = LLMEndpoint.from_config(LLMEndpointConfig())\n\n    # Working default\n    config = LLMEndpointConfig(llm_api_key=\"test\")\n    llm = LLMEndpoint.from_config(config=config)\n\n    assert llm.supports_func_calling()\n    assert isinstance(llm._llm, ChatOpenAI)\n    assert llm._llm.model_name in llm.get_config().model\n\n\n@pytest.mark.base\ndef test_llm_endpoint_from_config():\n    from langchain_openai import ChatOpenAI\n\n    config = LLMEndpointConfig(\n        model=\"llama2\", llm_api_key=\"test\", llm_base_url=\"http://localhost:8441\"\n    )\n    llm = LLMEndpoint.from_config(config)\n\n    assert not llm.supports_func_calling()\n    assert isinstance(llm._llm, ChatOpenAI)\n    assert llm._llm.model_name in llm.get_config().model\n\n\ndef test_llm_endpoint_constructor():\n    llm_endpoint = FakeListChatModel(responses=[])\n    llm_endpoint = LLMEndpoint(\n        llm=llm_endpoint, llm_config=LLMEndpointConfig(model=\"test\")\n    )\n\n    assert not llm_endpoint.supports_func_calling()\n"
  },
  {
    "path": "core/tests/test_quivr_file.py",
    "content": "from pathlib import Path\nfrom uuid import uuid4\n\nfrom quivr_core.files.file import FileExtension, QuivrFile\n\n\ndef test_create_file():\n    id = uuid4()\n    brain_id = uuid4()\n    qfile = QuivrFile(\n        id=id,\n        brain_id=brain_id,\n        original_filename=\"name\",\n        path=Path(\"/tmp/name\"),\n        file_extension=FileExtension.txt,\n        file_sha1=\"123\",\n    )\n\n    assert qfile.id == id\n    assert qfile.brain_id == brain_id\n    assert qfile.original_filename == \"name\"\n    assert qfile.path == Path(\"/tmp/name\")\n\n\ndef test_create_file_add_metadata():\n    id = uuid4()\n    brain_id = uuid4()\n    qfile = QuivrFile(\n        id=id,\n        brain_id=brain_id,\n        original_filename=\"name\",\n        path=Path(\"/tmp/name\"),\n        file_extension=FileExtension.txt,\n        file_sha1=\"123\",\n        metadata={\"other_id\": \"id\"},\n    )\n\n    assert qfile.metadata[\"other_id\"] == \"id\"\n"
  },
  {
    "path": "core/tests/test_quivr_rag.py",
    "content": "from uuid import uuid4\n\nimport pytest\nfrom quivr_core.rag.entities.chat import ChatHistory\nfrom quivr_core.rag.entities.config import LLMEndpointConfig, RetrievalConfig\nfrom quivr_core.llm import LLMEndpoint\nfrom quivr_core.rag.entities.models import ParsedRAGChunkResponse, RAGResponseMetadata\nfrom quivr_core.rag.quivr_rag_langgraph import QuivrQARAGLangGraph\n\n\n@pytest.fixture(scope=\"function\")\ndef mock_chain_qa_stream(monkeypatch, chunks_stream_answer):\n    class MockQAChain:\n        async def astream_events(self, *args, **kwargs):\n            default_metadata = {\n                \"langgraph_node\": \"generate\",\n                \"is_final_node\": False,\n                \"citations\": None,\n                \"followup_questions\": None,\n                \"sources\": None,\n                \"metadata_model\": None,\n            }\n\n            # Send all chunks except the last one\n            for chunk in chunks_stream_answer[:-1]:\n                yield {\n                    \"event\": \"on_chat_model_stream\",\n                    \"metadata\": default_metadata,\n                    \"data\": {\"chunk\": chunk[\"answer\"]},\n                }\n\n            # Send the last chunk\n            yield {\n                \"event\": \"end\",\n                \"metadata\": {\n                    \"langgraph_node\": \"generate\",\n                    \"is_final_node\": True,\n                    \"citations\": [],\n                    \"followup_questions\": None,\n                    \"sources\": [],\n                    \"metadata_model\": None,\n                },\n                \"data\": {\"chunk\": chunks_stream_answer[-1][\"answer\"]},\n            }\n\n    def mock_qa_chain(*args, **kwargs):\n        self = args[0]\n        self.final_nodes = [\"generate\"]\n        return MockQAChain()\n\n    monkeypatch.setattr(QuivrQARAGLangGraph, \"build_chain\", mock_qa_chain)\n\n\n@pytest.mark.base\n@pytest.mark.asyncio\nasync def test_quivrqaraglanggraph(\n    mem_vector_store, full_response, mock_chain_qa_stream, openai_api_key\n):\n    # Making sure the model\n    llm_config = LLMEndpointConfig(model=\"gpt-4o\")\n    llm = LLMEndpoint.from_config(llm_config)\n    retrieval_config = RetrievalConfig(llm_config=llm_config)\n    chat_history = ChatHistory(uuid4(), uuid4())\n    rag_pipeline = QuivrQARAGLangGraph(\n        retrieval_config=retrieval_config, llm=llm, vector_store=mem_vector_store\n    )\n\n    stream_responses: list[ParsedRAGChunkResponse] = []\n\n    # Making sure that we are calling the func_calling code path\n    assert rag_pipeline.llm_endpoint.supports_func_calling()\n    async for resp in rag_pipeline.answer_astream(\n        \"answer in bullet points. tell me something\", chat_history, []\n    ):\n        stream_responses.append(resp)\n\n    # This assertion passed\n    assert all(\n        not r.last_chunk for r in stream_responses[:-1]\n    ), \"Some chunks before last have last_chunk=True\"\n    assert stream_responses[-1].last_chunk\n\n    # Let's check this assertion\n    for idx, response in enumerate(stream_responses[1:-1]):\n        assert (\n            len(response.answer) > 0\n        ), f\"Sent an empty answer {response} at index {idx+1}\"\n\n    # Verify metadata\n    default_metadata = RAGResponseMetadata().model_dump()\n    assert all(\n        r.metadata.model_dump() == default_metadata for r in stream_responses[:-1]\n    )\n    last_response = stream_responses[-1]\n    # TODO(@aminediro) : test responses with sources\n    assert last_response.metadata.sources == []\n    assert last_response.metadata.citations == []\n\n    # Assert whole response makes sense\n    assert \"\".join([r.answer for r in stream_responses]) == full_response\n"
  },
  {
    "path": "core/tests/test_utils.py",
    "content": "from uuid import uuid4\n\nimport pytest\nfrom langchain_core.messages.ai import AIMessageChunk\nfrom langchain_core.messages.tool import ToolCall\nfrom quivr_core.rag.utils import (\n    get_prev_message_str,\n    model_supports_function_calling,\n    parse_chunk_response,\n)\n\n\ndef test_model_supports_function_calling():\n    assert model_supports_function_calling(\"gpt-4\") is True\n    assert model_supports_function_calling(\"ollama3\") is False\n\n\ndef test_get_prev_message_incorrect_message():\n    with pytest.raises(StopIteration):\n        chunk = AIMessageChunk(\n            content=\"\",\n            tool_calls=[ToolCall(name=\"test\", args={\"answer\": \"\"}, id=str(uuid4()))],\n        )\n        assert get_prev_message_str(chunk) == \"\"\n\n\ndef test_get_prev_message_str():\n    chunk = AIMessageChunk(content=\"\")\n    assert get_prev_message_str(chunk) == \"\"\n    # Test a correct chunk\n    chunk = AIMessageChunk(\n        content=\"\",\n        tool_calls=[\n            ToolCall(\n                name=\"cited_answer\",\n                args={\"answer\": \"this is an answer\"},\n                id=str(uuid4()),\n            )\n        ],\n    )\n    assert get_prev_message_str(chunk) == \"this is an answer\"\n\n\ndef test_parse_chunk_response_nofunc_calling():\n    rolling_msg = AIMessageChunk(content=\"\")\n    chunk = AIMessageChunk(content=\"next \")\n    for i in range(10):\n        rolling_msg, parsed_chunk, _ = parse_chunk_response(rolling_msg, chunk, False)\n        assert rolling_msg.content == \"next \" * (i + 1)\n        assert parsed_chunk == \"next \"\n\n\ndef _check_rolling_msg(rol_msg: AIMessageChunk) -> bool:\n    return (\n        len(rol_msg.tool_calls) > 0\n        and rol_msg.tool_calls[0][\"name\"] == \"cited_answer\"\n        and rol_msg.tool_calls[0][\"args\"] is not None\n        and \"answer\" in rol_msg.tool_calls[0][\"args\"]\n    )\n\n\ndef test_parse_chunk_response_func_calling(chunks_stream_answer):\n    rolling_msg = AIMessageChunk(content=\"\")\n\n    rolling_msgs_history = []\n    answer_str_history: list[str] = []\n\n    for chunk in chunks_stream_answer:\n        # Extract the AIMessageChunk from the chunk dictionary\n        chunk_msg = chunk[\"answer\"]  # Get the AIMessageChunk from the dict\n        rolling_msg, answer_str, _ = parse_chunk_response(rolling_msg, chunk_msg, True)\n        rolling_msgs_history.append(rolling_msg)\n        answer_str_history.append(answer_str)\n\n    # Checks that we accumulate into correctly\n    last_rol_msg = None\n    last_answer_chunk = None\n\n    # TEST1:\n    # Asserting that parsing accumulates the chunks\n    for rol_msg in rolling_msgs_history:\n        if last_rol_msg is not None:\n            # Check tool_call_chunks accumulated correctly\n            assert (\n                len(rol_msg.tool_call_chunks) > 0\n                and rol_msg.tool_call_chunks[0][\"name\"] == \"cited_answer\"\n                and rol_msg.tool_call_chunks[0][\"args\"]\n            )\n            answer_chunk = rol_msg.tool_call_chunks[0][\"args\"]\n            # assert that the answer is accumulated\n            assert last_answer_chunk in answer_chunk\n\n        if _check_rolling_msg(rol_msg):\n            last_rol_msg = rol_msg\n            last_answer_chunk = rol_msg.tool_call_chunks[0][\"args\"]\n\n    # TEST2:\n    # Progressively acc answer string\n    assert all(\n        answer_str_history[i] in answer_str_history[i + 1]\n        for i in range(len(answer_str_history) - 1)\n    )\n    # NOTE: Last chunk's answer should match the accumulated history\n    assert last_rol_msg.tool_calls[0][\"args\"][\"answer\"] == answer_str_history[-1]  # type: ignore\n"
  },
  {
    "path": "core/tox.ini",
    "content": "[tox]\nisolated_build = True\nskipsdist = true\nenvlist =\n  py311\n  py311-base\n  py311-unstructured\n  py311-pdf\n\n\n[testenv:py311]\nallowlist_externals =\n    poetry\ncommands_pre =\n    poetry install --no-root --with test\ncommands =\n    poetry run pytest tests/ -m \"not base\"  \\\n        --ignore=./tests/processor/epub \\\n        --ignore=./tests/processor/docx \\\n        --ignore=./tests/processor/odt \\\n        --ignore=./tests/processor/pdf  \\\n        --ignore=tests/processor/community\n\n[testenv:py311-base]\nallowlist_externals =\n    poetry\ncommands_pre =\n    poetry install --no-root --with test -E base\ncommands =\n    poetry run pytest tests/ -m base  \\\n        --ignore=./tests/processor/epub \\\n        --ignore=./tests/processor/docx \\\n        --ignore=./tests/processor/odt \\\n        --ignore=./tests/processor/pdf \\\n        --ignore=tests/processor/community\n\n[testenv:py311-unstructured]\nallowlist_externals =\n    poetry\ncommands_pre =\n    poetry install --no-root \\\n                -E csv \\\n                -E md \\\n                -E ipynb \\\n                -E epub \\\n                -E odt \\\n                -E docx \\\n                -E pptx \\\n                -E xlsx \\\n                --with test\ncommands =\n    poetry run pytest \\\n        tests/processor/epub \\\n        tests/processor/docx \\\n        tests/processor/docx \\\n        tests/processor/odt \\\n        tests/processor/community\n\n\n[testenv:py311-pdf]\nallowlist_externals =\n    poetry\ncommands_pre =\n    poetry install --no-root -E pdf --with test\ncommands =\n    poetry run pytest tests/processor/pdf\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "# python generated files\n__pycache__/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# venv\n.venv\n"
  },
  {
    "path": "docs/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "docs/README.md",
    "content": "# docs\n\nDescribe your project here.\n"
  },
  {
    "path": "docs/docs/brain/brain.md",
    "content": "::: quivr_core.brain.brain\n    options:\n      heading_level: 2\n"
  },
  {
    "path": "docs/docs/brain/chat.md",
    "content": "## ChatHistory\n\nThe `ChatHistory` class is where all the conversation between the user and the LLM gets stored. A `ChatHistory` object will transparently be instanciated in the `Brain` every time you create one.\n\nAt each interaction with `Brain.ask_streaming` both your message and the LLM's response are added to this chat history. It's super handy because this history is used in the Retrieval-Augmented Generation (RAG) process to give the LLM more context, working as form of memory between the user and the system and helping it generate better responses by looking at what’s already been said.\n\nYou can also get some cool info about the brain by printing its details with the `print_info()` method, which shows things like how many chats are stored, the current chat history, and more. This makes it easy to keep track of what’s going on in your conversations and manage the context being sent to the LLM!\n\n::: quivr_core.rag.entities.chat\noptions:\nheading_level: 2\n"
  },
  {
    "path": "docs/docs/brain/index.md",
    "content": "# Brain\n\nThe brain is the essential component of Quivr that stores and processes the knowledge you want to retrieve informations from. Simply create a brain with the files you want to process and use the latest Quivr RAG workflow to retrieve informations from the knowledge.\n\nQuick Start 🪄:\n\n```python\nfrom quivr_core import Brain\nfrom quivr_core.quivr_rag_langgraph import QuivrQARAGLangGraph\n\n\nbrain = Brain.from_files(name=\"My Brain\", file_paths=[\"file1.pdf\", \"file2.pdf\"])\nanswer = brain.ask(\"What is Quivr ?\")\nprint(\"Answer Quivr :\", answer.answer)\n\n```\n\nPimp your Brain 🔨 :\n\n```python\nfrom quivr_core import Brain\nfrom quivr_core.llm.llm_endpoint import LLMEndpoint\nfrom quivr_core.embedder.embedder import DeterministicFakeEmbedding\nfrom quivr_core.llm.llm_endpoint import LLMEndpointConfig\nfrom quivr_core.llm.llm_endpoint import FakeListChatModel\n\nbrain = Brain.from_files(\n        name=\"test_brain\",\n        file_paths=[\"my/information/source/file.pdf\"],\n        llm=LLMEndpoint(\n            llm=FakeListChatModel(responses=[\"good\"]),\n            llm_config=LLMEndpointConfig(model=\"fake_model\", llm_base_url=\"local\"),\n        ),\n        embedder=DeterministicFakeEmbedding(size=20),\n    )\n\nanswer = brain.ask(\n            \"What is Quivr ?\"\n        )\nprint(\"Answer Quivr :\", answer.answer)\n\n```\n"
  },
  {
    "path": "docs/docs/config/base_config.md",
    "content": "# Configuration Base Class\n\n::: quivr_core.base_config\n    options:\n      heading_level: 2"
  },
  {
    "path": "docs/docs/config/config.md",
    "content": "# Configuration\n\n## Retrieval Configuration\n::: quivr_core.rag.entities.config.RetrievalConfig\n\n## Workflow Configuration\n::: quivr_core.rag.entities.config.WorkflowConfig\n\n## LLM Configuration\n::: quivr_core.rag.entities.config.LLMEndpointConfig\n\n## Reranker Configuration\n::: quivr_core.rag.entities.config.RerankerConfig\n\n## Supported LLM Model Suppliers\n::: quivr_core.rag.entities.config.DefaultModelSuppliers\n\n## Supported Rerankers\n::: quivr_core.rag.entities.config.DefaultRerankers\n"
  },
  {
    "path": "docs/docs/config/index.md",
    "content": "# Configuration\n\nThe configuration classes are based on [Pydantic](https://docs.pydantic.dev/latest/) and allow the configuration of the ingestion and retrieval workflows via YAML files.\n\nBelow is an example of a YAML configuration file for a basic RAG retrieval workflow.\n```yaml\nworkflow_config:\n  name: \"standard RAG\"\n  nodes:\n    - name: \"START\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"rewrite\"]\n\n    - name: \"rewrite\"\n      edges: [\"retrieve\"]\n\n    - name: \"retrieve\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user, should always start with \"generate\"\n      edges: [\"END\"]\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\nprompt: \"my prompt\"\n\nmax_files: 20\nreranker_config:\n  # The reranker supplier to use\n  supplier: \"cohere\"\n\n  # The model to use for the reranker for the given supplier\n  model: \"rerank-multilingual-v3.0\"\n\n  # Number of chunks returned by the reranker\n  top_n: 5\nllm_config:\n\n  max_context_tokens: 2000\n\n  temperature: 0.7\n  streaming: true\n```\n"
  },
  {
    "path": "docs/docs/css/style.css",
    "content": ".md-container .jp-Cell-outputWrapper .jp-OutputPrompt.jp-OutputArea-prompt,\n.md-container .jp-Cell-inputWrapper .jp-InputPrompt.jp-InputArea-prompt {\n    display: none !important;\n}\n\n/* CSS styles for side-by-side layout */\n.container {\n    display: flex-col;\n    justify-content: space-between;\n    margin-bottom: 20px;\n    /* Adjust spacing between sections */\n    position: sticky;\n    top: 2.4rem;\n    z-index: 1000;\n    /* Ensure it's above other content */\n    background-color: white;\n    /* Match your page background */\n    padding: 0.2rem;\n}\n\n.example-heading {\n    margin: 0.2rem !important;\n}\n\n.usage-examples {\n    width: 100%;\n    /* Adjust the width as needed */\n    border: 1px solid var(--md-default-fg-color--light);\n    border-radius: 2px;\n    padding: 0.2rem;\n}\n\n/* Additional styling for the toggle */\n.toggle-example {\n    cursor: pointer;\n    color: white;\n    text-decoration: underline;\n    background-color: var(--md-primary-fg-color);\n    padding: 0.2rem;\n    border-radius: 2px;\n}\n\n.hidden {\n    display: none;\n}\n\n/* mendable search styling */\n#my-component-root>div {\n    bottom: 100px;\n}"
  },
  {
    "path": "docs/docs/examples/chatbot.md",
    "content": "# Chatbot with Chainlit\n\nThis example demonstrates a simple chatbot using **Quivr** and **Chainlit**, where users can upload a `.txt` file and ask questions based on its content.\n\n---\n\n## Prerequisites\n\n- **Python**: Version 3.8 or higher.\n- **OpenAI API Key**: Ensure you have a valid OpenAI API key.\n\n---\n\n## Installation\n\n1. Clone the repository and navigate to the appropriate directory:\n    ```bash\n    git clone https://github.com/QuivrHQ/quivr\n    cd examples/chatbot\n    ```\n\n2. Set the OpenAI API key as an environment variable:\n    ```bash\n    export OPENAI_API_KEY='<your-key-here>'\n    ```\n\n3. Install the required dependencies:\n    ```bash\n    pip install -r requirements.lock\n    ```\n\n---\n\n## Running the Chatbot\n\n1. Start the Chainlit server:\n    ```bash\n    chainlit run main.py\n    ```\n\n2. Open your web browser and navigate to the URL displayed in the terminal (default: `http://localhost:8000`).\n\n---\n\n## Using the Chatbot\n\n### File Upload\n\n1. On the chatbot interface, upload a `.txt` file when prompted.\n2. Ensure the file size is under **20MB**.\n3. After uploading, the file is processed, and you will be notified when the chatbot is ready.\n\n### Asking Questions\n\n1. Type your questions into the chat input and press Enter.\n2. The chatbot will respond based on the content of the uploaded file.\n3. Relevant file sources for the answers are displayed in the chat.\n\n---\n\n## How It Works\n\n1. **File Upload**:\n    - Users upload a `.txt` file, which is temporarily saved.\n    - The chatbot processes the file using Quivr to create a \"brain.\"\n\n2. **Session Handling**:\n    - Chainlit manages the session to retain the file path and brain context.\n\n3. **Question Answering**:\n    - The chatbot uses the `ask_streaming` method from Quivr to process user queries.\n    - Responses are streamed incrementally for faster feedback.\n    - Relevant file excerpts (sources) are extracted and displayed.\n\n4. **Retrieval Configuration**:\n    - A YAML file (`basic_rag_workflow.yaml`) defines retrieval parameters for Quivr.\n\n---\n\n## Workflow\n\n### Chat Start\n\n1. Waits for the user to upload a `.txt` file.\n2. Processes the file and creates a \"brain.\"\n3. Notifies the user when the system is ready for questions.\n\n### On User Message\n\n1. Retrieves the \"brain\" from the session.\n2. Processes the user's question with Quivr.\n3. Streams the response and displays it in the chat.\n4. Extracts and shows relevant sources from the file.\n\n---\n\n## Features\n\n1. **File Processing**: Creates a context-aware \"brain\" from the uploaded file.\n2. **Streaming Responses**: Delivers answers incrementally for better user experience.\n3. **Source Highlighting**: Displays file excerpts relevant to the answers.\n\n---\n\nEnjoy interacting with your text files in a seamless Q&A format!"
  },
  {
    "path": "docs/docs/examples/chatbot_voice.md",
    "content": "# Voice Chatbot with Chainlit\n\nThis example demonstrates how to create a voice-enabled chatbot using **Quivr** and **Chainlit**. The chatbot lets users upload a text file, ask questions about its content, and interact using speech.\n\n---\n\n## Prerequisites\n\n- **Python**: Version 3.8 or higher.\n- **OpenAI API Key**: Ensure you have a valid OpenAI API key.\n\n---\n\n## Installation\n\n1. Clone the repository and navigate to the appropriate directory:\n    ```bash\n    git clone https://github.com/QuivrHQ/quivr\n    cd examples/chatbot_voice\n    ```\n\n2. Set the OpenAI API key as an environment variable:\n    ```bash\n    export OPENAI_API_KEY='<your-key-here>'\n    ```\n\n3. Install the required dependencies:\n    ```bash\n    pip install -r requirements.lock\n    ```\n\n---\n\n## Running the Chatbot\n\n1. Start the Chainlit server:\n    ```bash\n    chainlit run main.py\n    ```\n\n2. Open your web browser and navigate to the URL displayed in the terminal (default: `http://localhost:8000`).\n\n---\n\n## Using the Chatbot\n\n### File Upload\n\n1. Once the interface loads, the chatbot will prompt you to upload a `.txt` file.\n2. Click on the upload area or drag-and-drop a text file. Ensure the file size is under **20MB**.\n3. After processing, the chatbot will notify you that it’s ready for interaction.\n\n### Asking Questions\n\n1. Type your questions in the input box or upload an audio file containing your question.\n2. If using text input, the chatbot will respond with an answer derived from the uploaded file's content.\n3. If using audio input:\n   - The chatbot converts speech to text using OpenAI Whisper.\n   - Processes the text query and provides a response.\n   - Converts the response to audio, enabling hands-free interaction.\n\n---\n\n## Features\n\n1. **Text File Processing**: Creates a \"brain\" for the uploaded file using Quivr for question answering.\n2. **Speech-to-Text (STT)**: Transcribes user-uploaded audio queries using OpenAI Whisper.\n3. **Text-to-Speech (TTS)**: Converts chatbot responses into audio for a seamless voice chat experience.\n4. **Source Display**: Shows relevant file sources for each response.\n5. **Real-Time Updates**: Uses streaming for live feedback during processing.\n\n---\n\n## How It Works\n\n1. **File Upload**: The user uploads a `.txt` file, which is temporarily saved and processed into a \"brain\" using Quivr.\n2. **Session Handling**: Chainlit manages user sessions to retain the uploaded file and brain context.\n3. **Voice Interaction**:\n    - Audio queries are processed via the OpenAI Whisper API.\n    - Responses are generated and optionally converted into audio for playback.\n4. **Streaming**: The chatbot streams its answers incrementally, improving response speed.\n\n---\n\n## Workflow\n\n### Chat Start\n\n1. Waits for a text file upload.\n2. Processes the file into a \"brain.\"\n3. Notifies the user when ready for interaction.\n\n### On User Message\n\n1. Extracts the \"brain\" and queries it using the message content.\n2. Streams the response back to the user.\n3. Displays file sources related to the response.\n\n### Audio Interaction\n\n1. Captures and processes audio chunks during user input.\n2. Converts captured audio into text using Whisper.\n3. Queries the brain and provides both text and audio responses.\n\n---\n\nEnjoy interacting with your documents in both text and voice modes!"
  },
  {
    "path": "docs/docs/examples/chatbot_voice_flask.md",
    "content": "# Voice Chatbot with Flask\n\nThis example demonstrates a simple chatbot using **Flask** and **Quivr**, where users can upload a `.txt` file and ask questions based on its content. It supports speech-to-text and text-to-speech capabilities for a seamless interactive experience.\n\n<video style=\"width:100%\" muted=\"\" controls=\"\" alt=\"type:video\">\n   <source src=\"../assets/chatbot_voice_flask.mp4\" type=\"video/mp4\">\n</video>\n---\n\n## Prerequisites\n\n- **Python**: Version 3.8 or higher.\n- **OpenAI API Key**: Ensure you have a valid OpenAI API key.\n\n---\n\n## Installation\n\n1. Clone the repository and navigate to the project directory:\n    ```bash\n    git clone https://github.com/QuivrHQ/quivr\n    cd examples/quivr-whisper\n    ```\n\n2. Set the OpenAI API key as an environment variable:\n    ```bash\n    export OPENAI_API_KEY='<your-key-here>'\n    ```\n\n3. Install the required dependencies:\n    ```bash\n    pip install -r requirements.lock\n    ```\n\n---\n\n## Running the Application\n\n1. Start the Flask server:\n    ```bash\n    python app.py\n    ```\n\n2. Open your web browser and navigate to the URL displayed in the terminal (default: `http://localhost:5000`).\n\n---\n\n## Using the Chatbot\n\n### File Upload\n\n1. On the interface, upload a `.txt` file.\n2. Ensure the file format is supported and its size is manageable.\n3. The file will be processed, and a \"brain\" instance will be created.\n\n### Asking Questions\n\n1. Use the microphone to record your question (audio upload).\n2. The chatbot will process your question and respond with an audio answer.\n\n---\n\n## How It Works\n\n### File Upload\n- Users upload a `.txt` file.\n- The file is saved to the `uploads` directory and used to create a \"brain\" using **Quivr**.\n\n### Session Management\n- Each session is associated with a unique ID, allowing the system to cache the user's \"brain.\"\n\n### Speech-to-Text\n- User audio files are processed with OpenAI's **Whisper** model to generate transcripts.\n\n### Question Answering\n- The \"brain\" processes the transcribed text, retrieves relevant answers, and generates a response.\n\n### Text-to-Speech\n- The answer is converted to audio using OpenAI's text-to-speech model and returned to the user.\n\n---\n\n## Workflow\n\n1. **Upload File**:\n    - The user uploads a `.txt` file.\n    - A \"brain\" is created and cached for the session.\n\n2. **Ask Questions**:\n    - The user uploads an audio file containing a question.\n    - The question is transcribed, processed, and answered using the \"brain.\"\n\n3. **Answer Delivery**:\n    - The answer is converted to audio and returned to the user as a Base64-encoded string.\n\n---\n\n## Features\n\n1. **File Upload and Processing**:\n    - Creates a context-aware \"brain\" from the uploaded text file.\n\n2. **Audio-based Interaction**:\n    - Supports speech-to-text for input and text-to-speech for responses.\n\n3. **Session Management**:\n    - Retains user context throughout the interaction.\n\n4. **Integration with OpenAI**:\n    - Uses OpenAI models for transcription, answer generation, and audio synthesis.\n\n---\n\nEnjoy interacting with your text files through an intuitive voice-based interface!"
  },
  {
    "path": "docs/docs/examples/custom_storage.md",
    "content": "# Transparent Storage\n\n**todo**\n"
  },
  {
    "path": "docs/docs/examples/index.md",
    "content": "# Examples"
  },
  {
    "path": "docs/docs/index.md",
    "content": "# Welcome to Quivr Documentation\n\nQuivr, helps you build your second brain, utilizes the power of GenerativeAI to be your personal assistant !\n\n## Key Features 🎯\n\n- **Opiniated RAG**: We created a RAG that is opinionated, fast and efficient so you can focus on your product\n- **LLMs**: Quivr works with any LLM, you can use it with OpenAI, Anthropic, Mistral, Gemma, etc.\n- **Any File**: Quivr works with any file, you can use it with PDF, TXT, Markdown, etc and even add your own parsers.\n- **Customize your RAG**: Quivr allows you to customize your RAG, add internet search, add tools, etc.\n- **Integrations with Megaparse**: Quivr works with [Megaparse](https://github.com/quivrhq/megaparse), so you can ingest your files with Megaparse and use the RAG with Quivr.\n\n>We take care of the RAG so you can focus on your product. Simply install quivr-core and add it to your project. You can now ingest your files and ask questions.*\n\n**We will be improving the RAG and adding more features everything, stay tuned!**\n\n\nThis is the core of Quivr, the brain of Quivr.com.\n\n<!-- ## Demo Highlight 🎥\n\nhttps://github.com/quivrhq/quivr/assets/19614572/a6463b73-76c7-4bc0-978d-70562dca71f5 -->\n\n## Getting Started 🚀\n\nYou can find everything on the [documentation](https://core.quivr.app/).\n\n### Prerequisites 📋\n\nEnsure you have the following installed:\n\n- Python 3.10 or newer\n\n### 30 seconds Installation 💽\n\n\n- **Step 1**: Install the package\n\n  \n\n  ```bash\n  pip install quivr-core # Check that the installation worked\n  ```\n\n\n- **Step 2**: Create a RAG with 5 lines of code\n\n  ```python\n    import tempfile\n\n    from quivr_core import Brain\n\n    if __name__ == \"__main__\":\n        with tempfile.NamedTemporaryFile(mode=\"w\", suffix=\".txt\") as temp_file:\n            temp_file.write(\"Gold is a liquid of blue-like colour.\")\n            temp_file.flush()\n\n            brain = Brain.from_files(\n                name=\"test_brain\",\n                file_paths=[temp_file.name],\n            )\n\n            answer = brain.ask(\n                \"what is gold? asnwer in french\"\n            )\n            print(\"answer:\", answer)\n  ```\n\n"
  },
  {
    "path": "docs/docs/parsers/index.md",
    "content": "# Parsers\n\nQuivr provides a suite of parsers to extract structured data from various sources.\n"
  },
  {
    "path": "docs/docs/parsers/megaparse.md",
    "content": "## Megaparse\n\n::: quivr_core.processor.implementations.megaparse_processor\n    options:\n      heading_level: 2"
  },
  {
    "path": "docs/docs/parsers/simple.md",
    "content": "## Simple Txt\n\n::: quivr_core.processor.implementations.simple_txt_processor\n    options:\n      heading_level: 2"
  },
  {
    "path": "docs/docs/quickstart.md",
    "content": "# Quick start\n\nIf you need to quickly start talking to your list of files, here are the steps.\n\n1. Add your API Keys to your environment variables\n```python\nimport os\nos.environ[\"OPENAI_API_KEY\"] = \"myopenai_apikey\"\n\n```\nCheck our `.env.example` file to see the possible environment variables you can configure. Quivr supports APIs from Anthropic, OpenAI, and Mistral. It also supports local models using Ollama.\n\n2. Create a Brain with Quivr default configuration\n```python\nfrom quivr_core import Brain\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"/my_smart_doc.pdf\", \"/my_intelligent_doc.txt\"],\n                        )\n\n```\n\n3. Launch a Chat\n```python\nbrain.print_info()\n\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\n\nconsole = Console()\nconsole.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\nwhile True:\n    # Get user input\n    question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n    # Check if user wants to exit\n    if question.lower() == \"exit\":\n        console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n        break\n\n    answer = brain.ask(question)\n    # Print the answer with typing effect\n    console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n    console.print(\"-\" * console.width)\n\nbrain.print_info()\n```\n\nAnd now you are all set up to talk with your brain !\n\n## Custom Brain\nIf you want to change the language or embeddings model, you can modify the parameters of the brain.\n\nLet's say you want to use a LLM from Mistral and a specific embedding model :\n```python\nfrom quivr_core import Brain\nfrom langchain_core.embeddings import Embeddings\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"/my_smart_doc.pdf\", \"/my_intelligent_doc.txt\"],\n                        llm=LLMEndpoint(\n                            llm_config=LLMEndpointConfig(model=\"mistral-small-latest\", llm_base_url=\"https://api.mistral.ai/v1/chat/completions\"),\n                        ),\n                        embedder=Embeddings(size=64),\n                        )\n```\n\nNote : [Embeddings](https://python.langchain.com/docs/integrations/text_embedding/) is a langchain class that lets you chose from a large variety of embedding models. Please check out the following docs to know the panel of models you can try.\n\n## Launch with Chainlit\n\nIf you want to quickly launch an interface with streamlit, you can simply do at the root of the project :\n```bash\ncd examples/chatbot /\nrye sync /\nrye run chainlit run chainlit.py\n```\nFor more detail, go in [examples/chatbot/chainlit.md](https://github.com/QuivrHQ/quivr/tree/main/examples/chatbot)\n\nNote : Modify the Brain configs directly in examples/chatbot/main.py;\n"
  },
  {
    "path": "docs/docs/storage/base.md",
    "content": "# StorageBase\n\n::: quivr_core.storage.storage_base\noptions:\nheading_level: 2\n"
  },
  {
    "path": "docs/docs/storage/index.md",
    "content": "# 🗄️ Storage\n\n## Your Brain’s File Management System\n\nThe `Storage` class is the backbone of how a brain interacts with files in `quivr-core`. Every brain holds a reference to an underlying storage system to manage its files. All storages should implement the `StorageBase` base classe that provides the structure and methods to make that happen seamlessly. Let's walk through how it works:\n\n- **Brain-Storage Connection:** Your brain holds a reference to a storage system. This class is the main way your brain can interact with and manage the files it uses. Adding files to a brain will upload them to the storage. This means that files in the storage are stored **before** processing!\n- **File Management:** the storage holds a set of `QuivrFile` objects, which are the building blocks of your brain’s file system. The storage can store them remotely or locally or hold simple\n\n### What can you do with this storage system?\n\n1. Upload Files: You can add new files to your storage whenever you need. The system also lets you decide whether to overwrite existing files or not.\n2. Get Files: Need to see what's in your storage? No problem. You can easily retrieve a list of all the files that are stored.\n3. Delete Files: Clean-up is simple. You can remove any file from your storage by referencing its unique file ID (more on that in `QuivrFile`).\n\nStorageBase is the foundation of how your brain organizes, uploads, retrieves, and deletes its files. It ensures that your brain can always stay up-to-date with the files it needs, making file management smooth and intuitive. You can build your own storage system by subclassing the `StorageBase` class and passing it to the brain. See [custom_storage](../examples/custom_storage.md) for more details.\n\n### Storage Implementations in `quivr_core`\n\n`quivr_core` currently offers two storage implementations: `LocalStorage` and `TransparentStorage`:\n\n- **LocalStorage**:  \n  This storage type is perfect when you want to keep files on your local machine. `LocalStorage` saves your files to a specific directory, either a default path (`~/.cache/quivr/files`) or a user-defined location. It can store files by copying them or by creating symbolic links to the original files, based on your preference. This storage type also keeps track of file hashes to prevent accidental overwrites during uploads.\n\n- **TransparentStorage**:  \n  The `TransparentStorage` implementation offers a lightweight and flexible approach, mainly managing files in memory without a need for local file paths. This storage system is useful when you don't need persistent storage but rather an easy way to store and retrieve files temporarily during the brain's operation.\n\nEach of these storage systems has its own strengths, catering to different use cases. As `quivr_core` evolves, we will implementat more ande more storage systems allowing for even more advanced and customized ways to manage your files like `S3Storage`, `NFSStorage` ...\n"
  },
  {
    "path": "docs/docs/storage/local_storage.md",
    "content": "# LocalStorage\n\n::: quivr_core.storage.local_storage\noptions:\nheading_level: 2\n"
  },
  {
    "path": "docs/docs/vectorstores/faiss.md",
    "content": "# Faiss"
  },
  {
    "path": "docs/docs/vectorstores/index.md",
    "content": "# Vector Stores\n\n"
  },
  {
    "path": "docs/docs/vectorstores/pgvector.md",
    "content": "# PGVector"
  },
  {
    "path": "docs/docs/workflows/examples/basic_ingestion.md",
    "content": "# Basic ingestion\n\n![](basic_ingestion.excalidraw.png)\n\n\nCreating a basic ingestion workflow like the one above is simple, here are the steps:\n\n1. Add your API Keys to your environment variables\n```python\nimport os\nos.environ[\"OPENAI_API_KEY\"] = \"myopenai_apikey\"\n\n```\nCheck our `.env.example` file to see the possible environment variables you can configure. Quivr supports APIs from Anthropic, OpenAI, and Mistral. It also supports local models using Ollama.\n\n2. Create the YAML file ``basic_ingestion_workflow.yaml`` and copy the following content in it\n```yaml\nparser_config:\n  megaparse_config:\n    strategy: \"auto\" # for unstructured, it can be \"auto\", \"fast\", \"hi_res\", \"ocr_only\", see https://docs.unstructured.io/open-source/concepts/partitioning-strategies#partitioning-strategies\n    pdf_parser: \"unstructured\"\n  splitter_config:\n    chunk_size: 400 # in tokens\n    chunk_overlap: 100 # in tokens\n```\n\n3. Create a Brain using the above configuration and the list of files you want to ingest\n```python\nfrom quivr_core import Brain\nfrom quivr_core.config import IngestionConfig\n\nconfig_file_name = \"./basic_ingestion_workflow.yaml\"\n\ningestion_config = IngestionConfig.from_yaml(config_file_name)\n\nprocessor_kwargs = {\n    \"megaparse_config\": ingestion_config.parser_config.megaparse_config,\n    \"splitter_config\": ingestion_config.parser_config.splitter_config,\n}\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"./my_first_doc.pdf\", \"./my_second_doc.txt\"],\n                        processor_kwargs=processor_kwargs,\n                        )\n\n```\n\n4. Launch a Chat\n```python\nbrain.print_info()\n\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\n\nconsole = Console()\nconsole.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\nwhile True:\n    # Get user input\n    question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n    # Check if user wants to exit\n    if question.lower() == \"exit\":\n        console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n        break\n\n    answer = brain.ask(question)\n    # Print the answer with typing effect\n    console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n    console.print(\"-\" * console.width)\n\nbrain.print_info()\n```\n\n5. You are now all set up to talk with your brain and test different chunking strategies by simply changing the configuration file!\n"
  },
  {
    "path": "docs/docs/workflows/examples/basic_rag.md",
    "content": "# Basic RAG\n\n![](basic_rag.excalidraw.png)\n\n\nCreating a basic RAG workflow like the one above is simple, here are the steps:\n\n\n1. Add your API Keys to your environment variables\n```python\nimport os\nos.environ[\"OPENAI_API_KEY\"] = \"myopenai_apikey\"\n\n```\nCheck our `.env.example` file to see the possible environment variables you can configure. Quivr supports APIs from Anthropic, OpenAI, and Mistral. It also supports local models using Ollama.\n\n2. Create the YAML file ``basic_rag_workflow.yaml`` and copy the following content in it\n```yaml\nworkflow_config:\n  name: \"standard RAG\"\n  nodes:\n    - name: \"START\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"rewrite\"]\n\n    - name: \"rewrite\"\n      edges: [\"retrieve\"]\n\n    - name: \"retrieve\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user\n      edges: [\"END\"]\n\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\n# Reranker configuration\nreranker_config:\n  # The reranker supplier to use\n  supplier: \"cohere\"\n\n  # The model to use for the reranker for the given supplier\n  model: \"rerank-multilingual-v3.0\"\n\n  # Number of chunks returned by the reranker\n  top_n: 5\n\n# Configuration for the LLM\nllm_config:\n\n  # maximum number of tokens passed to the LLM to generate the answer\n  max_input_tokens: 4000\n\n  # temperature for the LLM\n  temperature: 0.7\n```\n\n3. Create a Brain with the default configuration\n```python\nfrom quivr_core import Brain\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"./my_first_doc.pdf\", \"./my_second_doc.txt\"],\n                        )\n\n```\n\n4. Launch a Chat\n```python\nbrain.print_info()\n\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\nfrom quivr_core.config import RetrievalConfig\n\nconfig_file_name = \"./basic_rag_workflow.yaml\"\n\nretrieval_config = RetrievalConfig.from_yaml(config_file_name)\n\nconsole = Console()\nconsole.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\nwhile True:\n    # Get user input\n    question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n    # Check if user wants to exit\n    if question.lower() == \"exit\":\n        console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n        break\n\n    answer = brain.ask(question, retrieval_config=retrieval_config)\n    # Print the answer with typing effect\n    console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n    console.print(\"-\" * console.width)\n\nbrain.print_info()\n```\n\n5. You are now all set up to talk with your brain and test different retrieval strategies by simply changing the configuration file!\n"
  },
  {
    "path": "docs/docs/workflows/examples/rag_with_web_search.md",
    "content": "# RAG with web search\n\n\n![](rag_with_web_search.excalidraw.png)\n\nFollow the instructions below to create the agentic RAG workflow shown above, which includes some advanced capabilities such as:\n\n* **user intention detection** - the agent can detect if the user wants to activate the web search tool to look for information not present in the documents;\n* **dynamic chunk retrieval** - the number of retrieved chunks is not fixed, but determined dynamically using the reranker's relevance scores and the user-provided ``relevance_score_threshold``;\n* **web search** - the agent can search the web for more information if needed.\n\n\n---\n\n1. Add your API Keys to your environment variables\n```python\nimport os\nos.environ[\"OPENAI_API_KEY\"] = \"my_openai_api_key\"\nos.environ[\"TAVILY_API_KEY\"] = \"my_tavily_api_key\"\n\n```\nCheck our `.env.example` file to see the possible environment variables you can configure. Quivr supports APIs from Anthropic, OpenAI, and Mistral. It also supports local models using Ollama.\n\n2. Create the YAML file ``rag_with_web_search_workflow.yaml`` and copy the following content in it\n```yaml\nworkflow_config:\n  name: \"RAG with web search\"\n\n  # List of tools that the agent can activate if the user instructions require it\n  available_tools:\n    - \"web search\"\n\n  nodes:\n    - name: \"START\"\n      conditional_edge:\n        routing_function: \"routing_split\"\n        conditions: [\"edit_system_prompt\", \"filter_history\"]\n\n    - name: \"edit_system_prompt\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"dynamic_retrieve\"]\n\n    - name: \"dynamic_retrieve\"\n      conditional_edge:\n        routing_function: \"tool_routing\"\n        conditions: [\"run_tool\", \"generate_rag\"]\n\n    - name: \"run_tool\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user\n      edges: [\"END\"]\n      tools:\n        - name: \"cited_answer\"\n\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\n# Number of chunks returned by the retriever\nk: 40\n\n# Reranker configuration\nreranker_config:\n  # The reranker supplier to use\n  supplier: \"cohere\"\n\n  # The model to use for the reranker for the given supplier\n  model: \"rerank-multilingual-v3.0\"\n\n  # Number of chunks returned by the reranker\n  top_n: 5\n\n  # Among the chunks returned by the reranker, only those with relevance\n  # scores equal or above the relevance_score_threshold will be returned\n  # to the LLM to generate the answer (allowed values are between 0 and 1,\n  # a value of 0.1 works well with the cohere and jina rerankers)\n  relevance_score_threshold: 0.01\n\n# LLM configuration\nllm_config:\n\n  # maximum number of tokens passed to the LLM to generate the answer\n  max_input_tokens: 8000\n\n  # temperature for the LLM\n  temperature: 0.7\n```\n\n3. Create a Brain with the default configuration\n```python\nfrom quivr_core import Brain\n\nbrain = Brain.from_files(name = \"my smart brain\",\n                        file_paths = [\"./my_first_doc.pdf\", \"./my_second_doc.txt\"],\n                        )\n\n```\n\n4. Launch a Chat\n```python\nbrain.print_info()\n\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\nfrom quivr_core.config import RetrievalConfig\n\nconfig_file_name = \"./rag_with_web_search_workflow.yaml\"\n\nretrieval_config = RetrievalConfig.from_yaml(config_file_name)\n\nconsole = Console()\nconsole.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\nwhile True:\n    # Get user input\n    question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n    # Check if user wants to exit\n    if question.lower() == \"exit\":\n        console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n        break\n\n    answer = brain.ask(question, retrieval_config=retrieval_config)\n    # Print the answer with typing effect\n    console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n    console.print(\"-\" * console.width)\n\nbrain.print_info()\n```\n\n5. You are now all set up to talk with your brain and test different retrieval strategies by simply changing the configuration file!\n"
  },
  {
    "path": "docs/docs/workflows/index.md",
    "content": "# Workflows\n\nIn this section, you will find examples of workflows that you can use to create your own agentic RAG systems.\n"
  },
  {
    "path": "docs/mkdocs.yml",
    "content": "site_name: Quivr\nextra_css:\n  - css/style.css\n\nmarkdown_extensions:\n  - attr_list\n  - admonition\n  - pymdownx.details\n  - pymdownx.superfences\n  - md_in_html\n  - toc:\n      permalink: \"#\"\n\ntheme:\n  custom_dir: overrides\n  features:\n    - navigation.instant\n    - navigation.tabs\n    - navigation.indexes\n    - navigation.top\n    - navigation.footer\n    - toc.follow\n    - content.code.copy\n    - search.suggest\n    - search.highlight\n  name: material\n  palette:\n    - media: (prefers-color-scheme)\n      toggle:\n        icon: material/brightness-auto\n        name: Switch to light mode\n    - accent: purple\n      media: \"(prefers-color-scheme: light)\"\n      primary: white\n      scheme: default\n      toggle:\n        icon: material/brightness-7\n        name: Switch to dark mode\n    - accent: purple\n      media: \"(prefers-color-scheme: dark)\"\n      primary: black\n      scheme: slate\n      toggle:\n        icon: material/brightness-4\n        name: Switch to system preference\n\nplugins:\n  - search\n  - mkdocstrings:\n      default_handler: python\n      handlers:\n        python:\n          docstring_style: google\n          options:\n            show_source: false\n            heading_level: 2\n            separate_signature: true\n\nnav:\n  - Home:\n      - index.md\n      - quickstart.md\n      - Brain:\n          - brain/index.md\n          - brain/brain.md\n          - brain/chat.md\n      - Storage:\n          - storage/index.md\n          - storage/base.md\n          - storage/local_storage.md\n      - Parsers:\n          - parsers/index.md\n          - parsers/megaparse.md\n          - parsers/simple.md\n      - Vector Stores:\n          - vectorstores/index.md\n          - vectorstores/faiss.md\n          - vectorstores/pgvector.md\n      - Workflows:\n          - workflows/index.md\n          - Examples:\n              - workflows/examples/basic_ingestion.md\n              - workflows/examples/basic_rag.md\n              - workflows/examples/rag_with_web_search.md\n      - Configuration:\n          - config/index.md\n          - config/config.md\n          - config/base_config.md\n      - Examples:\n          - examples/index.md\n          - examples/custom_storage.md\n          - examples/chatbot.md\n          - examples/chatbot_voice.md\n          - examples/chatbot_voice_flask.md\n  - Enterprise: https://docs.quivr.app/\n"
  },
  {
    "path": "docs/overrides/empty",
    "content": "empty"
  },
  {
    "path": "docs/pyproject.toml",
    "content": "[project]\nname = \"docs\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nauthors = [\n    { name = \"Stan Girard\", email = \"stan@quivr.app\" }\n]\ndependencies = [\n    \"quivr-core @ file:///${PROJECT_ROOT}/../core\",\n    \"mkdocs>=1.6.1\",\n    \"mkdocstrings[python]>=0.26.0\",\n    \"mkdocs-jupyter>=0.24.8\",\n    \"mkdocs-include-dir-to-nav>=1.2.0\",\n    \"mkdocs-material>=9.5.34\",\n    \"mkdocs-redirects>=1.2.1\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.8\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.rye]\nmanaged = true\ndev-dependencies = []\nvirtual = true\n\n[tool.rye.scripts]\ndocs = \"mkdocs serve\"\nbuild_docs = \"mkdocs build --strict\"\n\n[tool.basedpyright]\ninclude = [\"src/\"]\n# Ensure that it uses the .venv that we created for this project with the lockfile\nvenvPath=\"./\"\nvenv=\".venv\"\n# We really only care about some import issues, so we disable everything and report on missing imports:\ntypeCheckingMode = \"off\"\nreportMissingImports = true\n\n\n[tool.hatch.metadata]\nallow-direct-references = true\n"
  },
  {
    "path": "docs/src/docs/__init__.py",
    "content": "def hello() -> str:\n    return \"Hello from docs!\"\n"
  },
  {
    "path": "examples/chatbot/.chainlit/config.toml",
    "content": "[project]\n# Whether to enable telemetry (default: true). No personal data is collected.\nenable_telemetry = true\n\n\n# List of environment variables to be provided by each user to use the app.\nuser_env = []\n\n# Duration (in seconds) during which the session is saved when the connection is lost\nsession_timeout = 3600\n\n# Enable third parties caching (e.g LangChain cache)\ncache = false\n\n# Authorized origins\nallow_origins = [\"*\"]\n\n# Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)\n# follow_symlink = false\n\n[features]\n# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)\nunsafe_allow_html = false\n\n# Process and display mathematical expressions. This can clash with \"$\" characters in messages.\nlatex = false\n\n# Automatically tag threads with the current chat profile (if a chat profile is used)\nauto_tag_thread = true\n\n# Authorize users to spontaneously upload files with messages\n[features.spontaneous_file_upload]\n    enabled = true\n    accept = [\"*/*\"]\n    max_files = 20\n    max_size_mb = 500\n\n[features.audio]\n    # Threshold for audio recording\n    min_decibels = -45\n    # Delay for the user to start speaking in MS\n    initial_silence_timeout = 3000\n    # Delay for the user to continue speaking in MS. If the user stops speaking for this duration, the recording will stop.\n    silence_timeout = 1500\n    # Above this duration (MS), the recording will forcefully stop.\n    max_duration = 15000\n    # Duration of the audio chunks in MS\n    chunk_duration = 1000\n    # Sample rate of the audio\n    sample_rate = 44100\n\nedit_message = true\n\n[UI]\n# Name of the assistant.\nname = \"Quivr\"\n\n# Description of the assistant. This is used for HTML tags.\ndescription = \"Demo of Quivr\"\n\n# Large size content are by default collapsed for a cleaner ui\ndefault_collapse_content = true\n\n# Chain of Thought (CoT) display mode. Can be \"hidden\", \"tool_call\" or \"full\".\ncot = \"full\"\n\n# Link to your github repo. This will add a github button in the UI's header.\ngithub = \"https://github.com/quivrhq/quivr\"\n\n# Specify a CSS file that can be used to customize the user interface.\n# The CSS file can be served from the public directory or via an external link.\n# custom_css = \"/public/custom.css\"\n\n# Specify a Javascript file that can be used to customize the user interface.\n# The Javascript file can be served from the public directory.\n# custom_js = \"/public/test.js\"\n\n# Specify a custom font url.\n# custom_font = \"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap\"\n\n# Specify a custom meta image url.\n# custom_meta_image_url = \"https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png\"\n\n# Specify a custom build directory for the frontend.\n# This can be used to customize the frontend code.\n# Be careful: If this is a relative path, it should not start with a slash.\n# custom_build = \"./public/build\"\n\n[UI.theme]\n    default = \"dark\"\n    font_family = \"Tahoma,Verdana,Segoe,sans-serif\"\n\n# Override default MUI light theme. (Check theme.ts)\n[UI.theme.light]\n    background = \"#fcfcfc\"\n    paper = \"#f8f8f8\"\n\n    [UI.theme.light.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.light.text]\n        primary = \"#1f1f1f\"\n        secondary = \"#818080\"\n\n# Override default MUI dark theme. (Check theme.ts)\n[UI.theme.dark]\n    background = \"#252525\"\n    paper = \"#1f1f1f\"\n\n    [UI.theme.dark.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.dark.text]\n        primary = \"#f4f4f4\"\n        secondary = \"#c8c8c8\"\n\n[meta]\ngenerated_by = \"1.1.402\"\n"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/bn.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"\\u098f\\u09aa\\u09bf\\u0986\\u0987 \\u0995\\u09c0\",\n                        \"logout\": \"\\u09b2\\u0997\\u0986\\u0989\\u099f\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u0986\\u09a1\\u09cd\\u09a1\\u09be\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0995\\u09be\\u09b0\\u09cd\\u09af \\u09a4\\u09be\\u09b2\\u09bf\\u0995\\u09be\",\n                    \"loading\": \"\\u09b2\\u09cb\\u09a1\\u0964\\u0964\\u0964\",\n                    \"error\": \"\\u098f\\u0995\\u099f\\u09bf \\u09a4\\u09cd\\u09b0\\u09c1\\u099f\\u09bf \\u09b8\\u0982\\u0998\\u099f\\u09bf\\u09a4 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u09ac\\u09be\\u09a4\\u09bf\\u09b2 \\u0995\\u09b0\\u09c1\\u09a8\",\n                \"removeAttachment\": \"\\u09b8\\u0982\\u09af\\u09c1\\u0995\\u09cd\\u09a4\\u09bf \\u09b8\\u09b0\\u09be\\u09a8\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u09a4\\u09c8\\u09b0\\u09bf \\u0995\\u09b0\\u09ac\\u09c7\\u09a8?\",\n                \"clearChat\": \"\\u098f\\u099f\\u09bf \\u09ac\\u09b0\\u09cd\\u09a4\\u09ae\\u09be\\u09a8 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be\\u0997\\u09c1\\u09b2\\u09bf \\u09b8\\u09be\\u09ab \\u0995\\u09b0\\u09ac\\u09c7 \\u098f\\u09ac\\u0982 \\u098f\\u0995\\u099f\\u09bf \\u09a8\\u09a4\\u09c1\\u09a8 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09ac\\u09c7\\u0964\",\n                \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8\",\n                \"expandMessages\": \"\\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be\\u0997\\u09c1\\u09b2\\u09bf \\u09aa\\u09cd\\u09b0\\u09b8\\u09be\\u09b0\\u09bf\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\",\n                \"hideChainOfThought\": \"\\u099a\\u09bf\\u09a8\\u09cd\\u09a4\\u09be\\u09b0 \\u09b6\\u09c3\\u0999\\u09cd\\u0996\\u09b2 \\u09b2\\u09c1\\u0995\\u09be\\u09a8\",\n                \"darkMode\": \"\\u09a1\\u09be\\u09b0\\u09cd\\u0995 \\u09ae\\u09cb\\u09a1\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0\",\n                \"running\": \"\\u099a\\u09b2\\u09ae\\u09be\\u09a8\",\n                \"took_one\": \"{{count}} \\u09aa\\u09a6\\u0995\\u09cd\\u09b7\\u09c7\\u09aa \\u09a8\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                \"took_other\": \"{{count}}\\u099f\\u09bf \\u09aa\\u09a6\\u0995\\u09cd\\u09b7\\u09c7\\u09aa \\u09a8\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0985\\u09cd\\u09af\\u09be\\u09aa\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09cd\\u09b8\\u09c7\\u09b8 \\u0995\\u09b0\\u09a4\\u09c7 \\u09b2\\u0997\\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"form\": {\n                        \"email\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be\",\n                        \"password\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\",\n                        \"noAccount\": \"\\u0995\\u09cb\\u09a8\\u0993 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a8\\u09c7\\u0987?\",\n                        \"alreadyHaveAccount\": \"\\u0987\\u09a4\\u09bf\\u09ae\\u09a7\\u09cd\\u09af\\u09c7 \\u098f\\u0995\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u0986\\u099b\\u09c7?\",\n                        \"signup\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0986\\u09aa \\u0995\\u09b0\\u09cb\",\n                        \"signin\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09cb\",\n                        \"or\": \"\\u09ac\\u09be\",\n                        \"continue\": \"\\u0985\\u09ac\\u09bf\\u09b0\\u09a4\",\n                        \"forgotPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09ad\\u09c1\\u09b2\\u09c7 \\u0997\\u09c7\\u099b\\u09c7\\u09a8?\",\n                        \"passwordMustContain\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\\u09c7 \\u0985\\u09ac\\u09b6\\u09cd\\u09af\\u0987 \\u09a5\\u09be\\u0995\\u09a4\\u09c7 \\u09b9\\u09ac\\u09c7:\",\n                        \"emailRequired\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u098f\\u0995\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u09c0\\u09af\\u09bc \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                        \"passwordRequired\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09a4\\u09c7 \\u0985\\u0995\\u09cd\\u09b7\\u09ae\\u0964\",\n                        \"signin\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthsignin\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"redirect_uri_mismatch\": \"\\u09aa\\u09c1\\u09a8\\u0983\\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09bf\\u09a4 URI OAUTH \\u0985\\u09cd\\u09af\\u09be\\u09aa \\u0995\\u09a8\\u09ab\\u09bf\\u0997\\u09be\\u09b0\\u09c7\\u09b6\\u09a8\\u09c7\\u09b0 \\u09b8\\u09be\\u09a5\\u09c7 \\u09ae\\u09bf\\u09b2\\u099b\\u09c7 \\u09a8\\u09be\\u0964\",\n                        \"oauthcallbackerror\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthcreateaccount\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"emailcreateaccount\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"callback\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthaccountnotlinked\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09b0\\u09bf\\u099a\\u09af\\u09bc \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09a4\\u09c7, \\u0986\\u09aa\\u09a8\\u09bf \\u09ae\\u09c2\\u09b2\\u09a4 \\u09af\\u09c7 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f\\u099f\\u09bf \\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0 \\u0995\\u09b0\\u09c7\\u099b\\u09c7\\u09a8 \\u09b8\\u09c7\\u0987 \\u098f\\u0995\\u0987 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"emailsignin\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09be \\u09af\\u09be\\u09af\\u09bc\\u09a8\\u09bf\\u0964\",\n                        \"emailverify\": \"\\u0985\\u09a8\\u09c1\\u0997\\u09cd\\u09b0\\u09b9 \\u0995\\u09b0\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2\\u099f\\u09bf \\u09af\\u09be\\u099a\\u09be\\u0987 \\u0995\\u09b0\\u09c1\\u09a8, \\u098f\\u0995\\u099f\\u09bf \\u09a8\\u09a4\\u09c1\\u09a8 \\u0987\\u09ae\\u09c7\\u09b2 \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\",\n                        \"credentialssignin\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09cd\\u09b0\\u09a6\\u09a4\\u09cd\\u09a4 \\u09ac\\u09bf\\u09ac\\u09b0\\u09a3\\u0997\\u09c1\\u09b2\\u09bf \\u09b8\\u09a0\\u09bf\\u0995 \\u0995\\u09bf\\u09a8\\u09be \\u09a4\\u09be \\u09aa\\u09b0\\u09c0\\u0995\\u09cd\\u09b7\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"sessionrequired\": \"\\u098f\\u0987 \\u09aa\\u09c3\\u09b7\\u09cd\\u09a0\\u09be\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09cd\\u09b8\\u09c7\\u09b8 \\u0995\\u09b0\\u09a4\\u09c7 \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0986\\u09aa\\u09a8\\u09bf \\u09aa\\u09cd\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u0996\\u09be\\u09a8\\u09c7 \\u09aa\\u09cc\\u0981\\u099b\\u09c7\\u099b\\u09c7\\u09a8! \\u0986\\u09ae\\u09b0\\u09be \\u098f\\u0995\\u099f\\u09bf \\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09be\\u09a0\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09bf \",\n                    \"verifyEmailLink\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09b8\\u09be\\u0987\\u09a8\\u0986\\u09aa \\u09b8\\u09ae\\u09cd\\u09aa\\u09c2\\u09b0\\u09cd\\u09a3 \\u0995\\u09b0\\u09a4\\u09c7 \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u09b8\\u09c7\\u0987 \\u0987\\u09ae\\u09c7\\u09b2\\u09c7\\u09b0 \\u09b2\\u09bf\\u0999\\u09cd\\u0995\\u099f\\u09bf\\u09a4\\u09c7 \\u0995\\u09cd\\u09b2\\u09bf\\u0995 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"didNotReceive\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u0996\\u09c1\\u0981\\u099c\\u09c7 \\u09aa\\u09be\\u099a\\u09cd\\u099b\\u09c7\\u09a8 \\u09a8\\u09be?\",\n                    \"resendEmail\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09aa\\u09be\\u09a0\\u09be\\u09a8\",\n                    \"goBack\": \"\\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u0993\",\n                    \"emailSent\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09aa\\u09be\\u09a0\\u09be\\u09a8\\u09cb \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\",\n                    \"verifyEmail\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be \\u09af\\u09be\\u099a\\u09be\\u0987 \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u099a\\u09be\\u09b2\\u09bf\\u09af\\u09bc\\u09c7 \\u09af\\u09be\\u09a8\",\n                    \"signup\": \"{{provider}} \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0986\\u09aa \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"passwordsMustMatch\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u0985\\u09ac\\u09b6\\u09cd\\u09af\\u0987 \\u09ae\\u09bf\\u09b2\\u09a4\\u09c7 \\u09b9\\u09ac\\u09c7\",\n                    \"confirmPasswordRequired\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09be \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"newPassword\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\",\n                    \"confirmPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\",\n                    \"resetPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09b0\\u09bf\\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be\",\n                    \"emailRequired\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u098f\\u0995\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u09c0\\u09af\\u09bc \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"emailSent\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\\u099f\\u09bf \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09be\\u09b0 \\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09be\\u09ac\\u09b2\\u09c0\\u09b0 \\u099c\\u09a8\\u09cd\\u09af \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be {{email}} \\u09aa\\u09b0\\u09c0\\u0995\\u09cd\\u09b7\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"enterEmail\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be \\u09b2\\u09bf\\u0996\\u09c1\\u09a8 \\u098f\\u09ac\\u0982 \\u0986\\u09ae\\u09b0\\u09be \\u0986\\u09aa\\u09a8\\u09be\\u0995\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09a4\\u09c7 \\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09be\\u09ac\\u09b2\\u09c0 \\u09aa\\u09be\\u09a0\\u09be\\u09ac\\u0964\",\n                    \"resendEmail\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09aa\\u09be\\u09a0\\u09be\\u09a8\",\n                    \"continue\": \"\\u0985\\u09ac\\u09bf\\u09b0\\u09a4\",\n                    \"goBack\": \"\\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u0993\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0987\\u09a4\\u09bf\\u09b9\\u09be\\u09b8 \\u09a6\\u09c7\\u0996\\u09be\\u09a8\",\n                        \"lastInputs\": \"\\u09b8\\u09b0\\u09cd\\u09ac\\u09b6\\u09c7\\u09b7 \\u0987\\u09a8\\u09aa\\u09c1\\u099f\",\n                        \"noInputs\": \"\\u098f\\u09a4 \\u09ab\\u09be\\u0981\\u0995\\u09be...\",\n                        \"loading\": \"\\u09b2\\u09cb\\u09a1\\u0964\\u0964\\u0964\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u098f\\u0996\\u09be\\u09a8\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u099f\\u09be\\u0987\\u09aa \\u0995\\u09b0\\u09c1\\u09a8...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u09b0\\u09c7\\u0995\\u09b0\\u09cd\\u09a1\\u09bf\\u0982 \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"stop\": \"\\u09b0\\u09c7\\u0995\\u09b0\\u09cd\\u09a1\\u09bf\\u0982 \\u09ac\\u09a8\\u09cd\\u09a7 \\u0995\\u09b0\\u09c1\\u09a8\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"stopTask\": \"\\u09b8\\u09cd\\u099f\\u09aa \\u099f\\u09be\\u09b8\\u09cd\\u0995\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u09ab\\u09be\\u0987\\u09b2 \\u09b8\\u0982\\u09af\\u09c1\\u0995\\u09cd\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u09b8\\u0999\\u09cd\\u0997\\u09c7 \\u09a8\\u09bf\\u09b0\\u09cd\\u09ae\\u09bf\\u09a4\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u099a\\u09b2\\u09ae\\u09be\\u09a8\",\n                        \"executedSuccessfully\": \"\\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09b8\\u09ae\\u09cd\\u09aa\\u09be\\u09a6\\u09bf\\u09a4 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                        \"failed\": \"\\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5\",\n                        \"feedbackUpdated\": \"\\u09ab\\u09bf\\u09a1\\u09ac\\u09cd\\u09af\\u09be\\u0995 \\u0986\\u09aa\\u09a1\\u09c7\\u099f \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                        \"updating\": \"\\u0986\\u09a7\\u09c1\\u09a8\\u09bf\\u0995\\u09c0\\u0995\\u09b0\\u09a3\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09ab\\u09be\\u0987\\u09b2\\u0997\\u09c1\\u09b2\\u09bf \\u098f\\u0996\\u09be\\u09a8\\u09c7 \\u09ab\\u09c7\\u09b2\\u09c7 \\u09a6\\u09bf\\u09a8\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u0995\\u09b0\\u09a4\\u09c7 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                    \"cancelledUploadOf\": \"\\u098f\\u09b0 \\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                    \"couldNotReachServer\": \"\\u09b8\\u09be\\u09b0\\u09cd\\u09ad\\u09be\\u09b0\\u09c7 \\u09aa\\u09cc\\u0981\\u099b\\u09be\\u09a8\\u09cb \\u09af\\u09be\\u09af\\u09bc\\u09a8\\u09bf\",\n                    \"continuingChat\": \"\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\\u09ac\\u09b0\\u09cd\\u09a4\\u09c0 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u0985\\u09ac\\u09bf\\u09b0\\u09a4 \\u09b0\\u09be\\u0996\\u09be\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8 \\u09aa\\u09cd\\u09af\\u09be\\u09a8\\u09c7\\u09b2\",\n                    \"reset\": \"\\u09b0\\u09bf\\u09b8\\u09c7\\u099f\",\n                    \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                    \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u09b8\\u09ac\",\n                            \"feedbackPositive\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u0987\\u09a4\\u09bf\\u09ac\\u09be\\u099a\\u0995\",\n                            \"feedbackNegative\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u09a8\\u09c7\\u09a4\\u09bf\\u09ac\\u09be\\u099a\\u0995\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u09b8\\u09a8\\u09cd\\u09a7\\u09be\\u09a8\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u098f\\u099f\\u09bf \\u09a5\\u09cd\\u09b0\\u09c7\\u09a1\\u09c7\\u09b0 \\u09aa\\u09be\\u09b6\\u09be\\u09aa\\u09be\\u09b6\\u09bf \\u098f\\u09b0 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u098f\\u09ac\\u0982 \\u0989\\u09aa\\u09be\\u09a6\\u09be\\u09a8\\u0997\\u09c1\\u09b2\\u09bf\\u0993 \\u09ae\\u09c1\\u099b\\u09c7 \\u09ab\\u09c7\\u09b2\\u09ac\\u09c7\\u0964\",\n                        \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                        \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\",\n                        \"deletingChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09ae\\u09cb\\u099b\\u09be \\u09b9\\u099a\\u09cd\\u099b\\u09c7\",\n                        \"chatDeleted\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09ae\\u09cb\\u099b\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0985\\u09a4\\u09c0\\u09a4 \\u099a\\u09cd\\u09af\\u09be\\u099f\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0996\\u09be\\u09b2\\u09bf\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0986\\u099c\",\n                        \"yesterday\": \"\\u0997\\u09a4\\u0995\\u09be\\u09b2\",\n                        \"previous7days\": \"Previous 7 \\u09a6\\u09bf\\u09a8\",\n                        \"previous30days\": \"\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\\u09ac\\u09b0\\u09cd\\u09a4\\u09c0 30 \\u09a6\\u09bf\\u09a8\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u09b8\\u09be\\u0987\\u09a1\\u09ac\\u09be\\u09b0 \\u09ac\\u09a8\\u09cd\\u09a7 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"openSidebar\": \"\\u09b8\\u09be\\u0987\\u09a1\\u09ac\\u09be\\u09b0 \\u0996\\u09c1\\u09b2\\u09c1\\u09a8\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f\\u09c7 \\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u09a8\",\n                    \"chatCreatedOn\": \"\\u098f\\u0987 \\u099a\\u09cd\\u09af\\u09be\\u099f\\u099f\\u09bf \\u09a4\\u09c8\\u09b0\\u09bf \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09bf\\u09b2\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0986\\u09b2\\u09be\\u09aa\",\n                \"readme\": \"\\u09b0\\u09bf\\u09a1\\u09ae\\u09bf\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u09b8\\u09b0\\u09ac\\u09b0\\u09be\\u09b9\\u0995\\u09be\\u09b0\\u09c0\\u09a6\\u09c7\\u09b0 \\u0986\\u09a8\\u09a4\\u09c7 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09b8\\u0982\\u09b0\\u0995\\u09cd\\u09b7\\u09a3 \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n            \"requiredApiKeys\": \"\\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 API \\u0995\\u09c0\",\n            \"requiredApiKeysInfo\": \"\\u098f\\u0987 \\u0985\\u09cd\\u09af\\u09be\\u09aa\\u099f\\u09bf \\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0 \\u0995\\u09b0\\u09a4\\u09c7, \\u09a8\\u09bf\\u09ae\\u09cd\\u09a8\\u09b2\\u09bf\\u0996\\u09bf\\u09a4 API \\u0995\\u09c0\\u0997\\u09c1\\u09b2\\u09bf\\u09b0 \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u0964 \\u0995\\u09c0\\u0997\\u09c1\\u09b2\\u09bf \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09a1\\u09bf\\u09ad\\u09be\\u0987\\u09b8\\u09c7\\u09b0 \\u09b8\\u09cd\\u09a5\\u09be\\u09a8\\u09c0\\u09af\\u09bc \\u09b8\\u09cd\\u099f\\u09cb\\u09b0\\u09c7\\u099c\\u09c7 \\u09b8\\u099e\\u09cd\\u099a\\u09bf\\u09a4 \\u09b0\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0986\\u09aa\\u09a8\\u09bf \\u098f\\u0987 \\u09aa\\u09cd\\u09b0\\u0995\\u09b2\\u09cd\\u09aa\\u09c7\\u09b0 \\u0985\\u0982\\u09b6 \\u09a8\\u09a8\\u0964\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09c1\\u09a8\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/en-US.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"Settings\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"New Chat\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f Task List\",\n                    \"loading\": \"Loading...\",\n                    \"error\": \"An error occurred\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"Cancel upload\",\n                \"removeAttachment\": \"Remove attachment\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"Create new chat?\",\n                \"clearChat\": \"This will clear the current messages and start a new chat.\",\n                \"cancel\": \"Cancel\",\n                \"confirm\": \"Confirm\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"Settings\",\n                \"expandMessages\": \"Expand Messages\",\n                \"hideChainOfThought\": \"Hide Chain of Thought\",\n                \"darkMode\": \"Dark Mode\"\n            },\n            \"detailsButton\": {\n                \"using\": \"Using\",\n                \"used\": \"Used\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"Login to access the app.\",\n                    \"form\": {\n                        \"email\": \"Email address\",\n                        \"password\": \"Password\",\n                        \"noAccount\": \"Don't have an account?\",\n                        \"alreadyHaveAccount\": \"Already have an account?\",\n                        \"signup\": \"Sign Up\",\n                        \"signin\": \"Sign In\",\n                        \"or\": \"OR\",\n                        \"continue\": \"Continue\",\n                        \"forgotPassword\": \"Forgot password?\",\n                        \"passwordMustContain\": \"Your password must contain:\",\n                        \"emailRequired\": \"email is a required field\",\n                        \"passwordRequired\": \"password is a required field\"\n                    },\n                    \"error\": {\n                        \"default\": \"Unable to sign in.\",\n                        \"signin\": \"Try signing in with a different account.\",\n                        \"oauthsignin\": \"Try signing in with a different account.\",\n                        \"redirect_uri_mismatch\": \"The redirect URI is not matching the oauth app configuration.\",\n                        \"oauthcallbackerror\": \"Try signing in with a different account.\",\n                        \"oauthcreateaccount\": \"Try signing in with a different account.\",\n                        \"emailcreateaccount\": \"Try signing in with a different account.\",\n                        \"callback\": \"Try signing in with a different account.\",\n                        \"oauthaccountnotlinked\": \"To confirm your identity, sign in with the same account you used originally.\",\n                        \"emailsignin\": \"The e-mail could not be sent.\",\n                        \"emailverify\": \"Please verify your email, a new email has been sent.\",\n                        \"credentialssignin\": \"Sign in failed. Check the details you provided are correct.\",\n                        \"sessionrequired\": \"Please sign in to access this page.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"You're almost there! We've sent an email to \",\n                    \"verifyEmailLink\": \"Please click on the link in that email to complete your signup.\",\n                    \"didNotReceive\": \"Can't find the email?\",\n                    \"resendEmail\": \"Resend email\",\n                    \"goBack\": \"Go Back\",\n                    \"emailSent\": \"Email sent successfully.\",\n                    \"verifyEmail\": \"Verify your email address\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"Continue with {{provider}}\",\n                    \"signup\": \"Sign up with {{provider}}\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"New password is a required field\",\n                    \"passwordsMustMatch\": \"Passwords must match\",\n                    \"confirmPasswordRequired\": \"Confirm password is a required field\",\n                    \"newPassword\": \"New password\",\n                    \"confirmPassword\": \"Confirm password\",\n                    \"resetPassword\": \"Reset Password\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"Email address\",\n                    \"emailRequired\": \"email is a required field\",\n                    \"emailSent\": \"Please check the email address {{email}} for instructions to reset your password.\",\n                    \"enterEmail\": \"Enter your email address and we will send you instructions to reset your password.\",\n                    \"resendEmail\": \"Resend email\",\n                    \"continue\": \"Continue\",\n                    \"goBack\": \"Go Back\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"Show history\",\n                        \"lastInputs\": \"Last Inputs\",\n                        \"noInputs\": \"Such empty...\",\n                        \"loading\": \"Loading...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"Type your message here...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"Start recording\",\n                        \"stop\": \"Stop recording\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"Send message\",\n                        \"stopTask\": \"Stop Task\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"Attach files\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"Built with\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"Running\",\n                        \"executedSuccessfully\": \"executed successfully\",\n                        \"failed\": \"failed\",\n                        \"feedbackUpdated\": \"Feedback updated\",\n                        \"updating\": \"Updating\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"Drop your files here\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"Failed to upload\",\n                    \"cancelledUploadOf\": \"Cancelled upload of\",\n                    \"couldNotReachServer\": \"Could not reach the server\",\n                    \"continuingChat\": \"Continuing previous chat\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"Settings panel\",\n                    \"reset\": \"Reset\",\n                    \"cancel\": \"Cancel\",\n                    \"confirm\": \"Confirm\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"Feedback: All\",\n                            \"feedbackPositive\": \"Feedback: Positive\",\n                            \"feedbackNegative\": \"Feedback: Negative\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"Search\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"This will delete the thread as well as it's messages and elements.\",\n                        \"cancel\": \"Cancel\",\n                        \"confirm\": \"Confirm\",\n                        \"deletingChat\": \"Deleting chat\",\n                        \"chatDeleted\": \"Chat deleted\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"Past Chats\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"Empty...\",\n                        \"today\": \"Today\",\n                        \"yesterday\": \"Yesterday\",\n                        \"previous7days\": \"Previous 7 days\",\n                        \"previous30days\": \"Previous 30 days\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"Close sidebar\",\n                        \"openSidebar\": \"Open sidebar\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"Go back to chat\",\n                    \"chatCreatedOn\": \"This chat was created on\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"Chat\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"Failed to fetch providers:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"Saved successfully\",\n            \"requiredApiKeys\": \"Required API Keys\",\n            \"requiredApiKeysInfo\": \"To use this app, the following API keys are required. The keys are stored on your device's local storage.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"You are not part of this project.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"Resume Chat\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/gu.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0a95\\u0ac0\\u0a93\",\n                        \"logout\": \"\\u0aac\\u0ab9\\u0abe\\u0ab0 \\u0aa8\\u0ac0\\u0a95\\u0ab3\\u0acb\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0aa8\\u0ab5\\u0acb \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0a95\\u0abe\\u0ab0\\u0acd\\u0aaf \\u0aaf\\u0abe\\u0aa6\\u0ac0\",\n                    \"loading\": \"\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7...\",\n                    \"error\": \"\\u0aad\\u0ac2\\u0ab2 \\u0a89\\u0aa6\\u0acd\\u0aad\\u0ab5\\u0ac0\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0ab0\\u0aa6 \\u0a95\\u0ab0\\u0acb\",\n                \"removeAttachment\": \"\\u0a9c\\u0acb\\u0aa1\\u0abe\\u0aa3\\u0aa8\\u0ac7 \\u0aa6\\u0ac2\\u0ab0 \\u0a95\\u0ab0\\u0acb\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0ab6\\u0ac1\\u0a82 \\u0aa8\\u0ab5\\u0ac1\\u0a82 \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6 \\u0aac\\u0aa8\\u0abe\\u0ab5\\u0ab5\\u0ac1\\u0a82 \\u0a9b\\u0ac7?\",\n                \"clearChat\": \"\\u0a86 \\u0ab5\\u0ab0\\u0acd\\u0aa4\\u0aae\\u0abe\\u0aa8 \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe\\u0a93\\u0aa8\\u0ac7 \\u0ab8\\u0abe\\u0aab \\u0a95\\u0ab0\\u0ab6\\u0ac7 \\u0a85\\u0aa8\\u0ac7 \\u0aa8\\u0ab5\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0ab6\\u0ac7.\",\n                \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                \"expandMessages\": \"\\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe\\u0a93 \\u0ab5\\u0abf\\u0ab8\\u0acd\\u0aa4\\u0ac3\\u0aa4 \\u0a95\\u0ab0\\u0acb\",\n                \"hideChainOfThought\": \"\\u0ab5\\u0abf\\u0a9a\\u0abe\\u0ab0\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0a82\\u0a95\\u0ab3 \\u0a9b\\u0ac1\\u0aaa\\u0abe\\u0ab5\\u0acb\",\n                \"darkMode\": \"\\u0a98\\u0abe\\u0a9f\\u0ac0 \\u0ab8\\u0acd\\u0aa5\\u0abf\\u0aa4\\u0abf\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0ab5\\u0abe\\u0aaa\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\",\n                \"running\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0ac1 \\u0a9b\\u0ac7\",\n                \"took_one\": \"{{count}} \\u0aaa\\u0a97\\u0ab2\\u0ac1\\u0a82 \\u0aad\\u0ab0\\u0acd\\u0aaf\\u0ac1\\u0a82\",\n                \"took_other\": \"{{count}} \\u0aaa\\u0a97\\u0ab2\\u0abe\\u0a82\\u0a93 \\u0ab2\\u0ac0\\u0aa7\\u0abe\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8\\u0aa8\\u0ac7 \\u0a8d\\u0a95\\u0acd\\u0ab8\\u0ac7\\u0ab8 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0ab2\\u0acb\\u0a97\\u0abf\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                    \"form\": {\n                        \"email\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0ab0\\u0aa8\\u0abe\\u0aae\\u0ac1\\u0a82\",\n                        \"password\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                        \"noAccount\": \"\\u0a96\\u0abe\\u0aa4\\u0ac1\\u0a82 \\u0aa8\\u0aa5\\u0ac0?\",\n                        \"alreadyHaveAccount\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0ac7\\u0aa5\\u0ac0 \\u0a9c \\u0a96\\u0abe\\u0aa4\\u0ac1\\u0a82 \\u0a9b\\u0ac7?\",\n                        \"signup\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a85\\u0aaa \\u0a95\\u0ab0\\u0acb\",\n                        \"signin\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb\",\n                        \"or\": \"\\u0a85\\u0aa5\\u0ab5\\u0abe\",\n                        \"continue\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                        \"forgotPassword\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0aad\\u0ac2\\u0ab2\\u0ac0 \\u0a97\\u0aaf\\u0abe?\",\n                        \"passwordMustContain\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab8\\u0aae\\u0abe\\u0ab5\\u0aa4\\u0acb \\u0a9c \\u0ab9\\u0acb\\u0ab5\\u0acb \\u0a9c\\u0acb\\u0a87\\u0a8f:\",\n                        \"emailRequired\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                        \"passwordRequired\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0aaa\\u0acd\\u0ab0\\u0ab5\\u0ac7\\u0ab6 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0a85\\u0ab8\\u0aae\\u0ab0\\u0acd\\u0aa5.\",\n                        \"signin\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthsignin\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"redirect_uri_mismatch\": \"\\u0ab0\\u0ac0\\u0aa1\\u0abe\\u0aaf\\u0ab0\\u0ac7\\u0a95\\u0acd\\u0a9f URI \\u0a8f oauth \\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8 \\u0ab0\\u0ac2\\u0aaa\\u0ab0\\u0ac7\\u0a96\\u0abe\\u0a82\\u0a95\\u0aa8 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aac\\u0a82\\u0aa7\\u0aac\\u0ac7\\u0ab8\\u0aa4\\u0ac0 \\u0aa8\\u0aa5\\u0ac0.\",\n                        \"oauthcallbackerror\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthcreateaccount\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"emailcreateaccount\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"callback\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthaccountnotlinked\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac0 \\u0a93\\u0ab3\\u0a96\\u0aa8\\u0ac0 \\u0aaa\\u0ac1\\u0ab7\\u0acd\\u0a9f\\u0abf \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7, \\u0aa4\\u0aae\\u0ac7 \\u0a9c\\u0ac7 \\u0aae\\u0ac2\\u0ab3\\u0aad\\u0ac2\\u0aa4 \\u0ab0\\u0ac0\\u0aa4\\u0ac7 \\u0a89\\u0aaa\\u0aaf\\u0acb\\u0a97 \\u0a95\\u0ab0\\u0acd\\u0aaf\\u0acb \\u0ab9\\u0aa4\\u0acb \\u0aa4\\u0ac7 \\u0a9c \\u0a8f\\u0a95\\u0abe\\u0a89\\u0aa8\\u0acd\\u0a9f \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"emailsignin\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ac0 \\u0ab6\\u0a95\\u0abe\\u0aaf\\u0acb \\u0aa8\\u0ab9\\u0abf.\",\n                        \"emailverify\": \"\\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2\\u0aa8\\u0ac0 \\u0a96\\u0abe\\u0aa4\\u0acd\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb, \\u0a8f\\u0a95 \\u0aa8\\u0ab5\\u0ac1\\u0a82 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0a86\\u0ab5\\u0acd\\u0aaf\\u0ac1\\u0a82 \\u0a9b\\u0ac7.\",\n                        \"credentialssignin\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3. \\u0aa4\\u0aae\\u0ac7 \\u0aaa\\u0ac2\\u0ab0\\u0ac0 \\u0aaa\\u0abe\\u0aa1\\u0ac7\\u0ab2\\u0ac0 \\u0ab5\\u0abf\\u0a97\\u0aa4\\u0acb \\u0ab8\\u0abe\\u0a9a\\u0ac0 \\u0a9b\\u0ac7 \\u0aa4\\u0ac7 \\u0a9a\\u0a95\\u0abe\\u0ab8\\u0acb.\",\n                        \"sessionrequired\": \"\\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0a86 \\u0aaa\\u0ac3\\u0ab7\\u0acd\\u0aa0\\u0aa8\\u0ac7 \\u0a8d\\u0a95\\u0acd\\u0ab8\\u0ac7\\u0ab8 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0aa4\\u0aae\\u0ac7 \\u0aa4\\u0acb \\u0ab2\\u0a97\\u0aad\\u0a97 \\u0aa4\\u0acd\\u0aaf\\u0abe\\u0a82 \\u0a9c \\u0a9b\\u0acb! \\u0a85\\u0aae\\u0ac7 \\u0a86\\u0aa8\\u0abe \\u0aaa\\u0ab0 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acd\\u0aaf\\u0acb \\u0a9b\\u0ac7 \",\n                    \"verifyEmailLink\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0ab8\\u0abe\\u0a87\\u0aa8\\u0a85\\u0aaa \\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0aa3 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0ac7 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2\\u0aa8\\u0ac0 \\u0ab2\\u0abf\\u0a82\\u0a95 \\u0aaa\\u0ab0 \\u0a95\\u0acd\\u0ab2\\u0abf\\u0a95 \\u0a95\\u0ab0\\u0acb.\",\n                    \"didNotReceive\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab6\\u0acb\\u0aa7\\u0ac0 \\u0ab6\\u0a95\\u0aa4\\u0abe \\u0aa8\\u0aa5\\u0ac0?\",\n                    \"resendEmail\": \"\\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aab\\u0ab0\\u0ac0 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                    \"goBack\": \"\\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\",\n                    \"emailSent\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0abe\\u0a88 \\u0a97\\u0aaf\\u0acb.\",\n                    \"verifyEmail\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8\\u0aa8\\u0ac0 \\u0a96\\u0abe\\u0aa4\\u0acd\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                    \"signup\": \"{{provider}} \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a85\\u0aaa \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0aa8\\u0ab5\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"passwordsMustMatch\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\\u0acb \\u0aac\\u0a82\\u0aa7\\u0aac\\u0ac7\\u0ab8\\u0aa4\\u0abe \\u0a9c \\u0ab9\\u0acb\\u0ab5\\u0abe \\u0a9c\\u0acb\\u0a88\\u0a8f\",\n                    \"confirmPasswordRequired\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"newPassword\": \"\\u0aa8\\u0ab5\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                    \"confirmPassword\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                    \"resetPassword\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\\u0aa8\\u0ac7 \\u0aaa\\u0ac1\\u0aa8:\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0abf\\u0aa4 \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0ab0\\u0aa8\\u0abe\\u0aae\\u0ac1\\u0a82\",\n                    \"emailRequired\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"emailSent\": \"\\u0ab8\\u0ac2\\u0a9a\\u0aa8\\u0abe\\u0a93 \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab0\\u0abf\\u0ab8\\u0ac5\\u0a9f \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8 {{email}} \\u0a9a\\u0a95\\u0abe\\u0ab8\\u0acb.\",\n                    \"enterEmail\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8 \\u0aa6\\u0abe\\u0a96\\u0ab2 \\u0a95\\u0ab0\\u0acb \\u0a85\\u0aa8\\u0ac7 \\u0a85\\u0aae\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab0\\u0ac0\\u0ab8\\u0ac7\\u0a9f \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0aa4\\u0aae\\u0aa8\\u0ac7 \\u0ab8\\u0ac2\\u0a9a\\u0aa8\\u0abe\\u0a93 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ac0\\u0ab6\\u0ac1\\u0a82.\",\n                    \"resendEmail\": \"\\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aab\\u0ab0\\u0ac0 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                    \"continue\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                    \"goBack\": \"\\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0a87\\u0aa4\\u0abf\\u0ab9\\u0abe\\u0ab8 \\u0aac\\u0aa4\\u0abe\\u0ab5\\u0acb\",\n                        \"lastInputs\": \"\\u0a9b\\u0ac7\\u0ab2\\u0acd\\u0ab2\\u0abe \\u0a87\\u0aa8\\u0aaa\\u0ac1\\u0a9f\\u0acd\\u0ab8\",\n                        \"noInputs\": \"\\u0a86\\u0ab5\\u0abe \\u0a96\\u0abe\\u0ab2\\u0ac0...\",\n                        \"loading\": \"\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0acb \\u0a85\\u0ab9\\u0ac0\\u0a82 \\u0a9f\\u0abe\\u0a87\\u0aaa \\u0a95\\u0ab0\\u0acb...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0ab0\\u0ac7\\u0a95\\u0acb\\u0ab0\\u0acd\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0acb\",\n                        \"stop\": \"\\u0ab0\\u0ac7\\u0a95\\u0acb\\u0ab0\\u0acd\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0aac\\u0a82\\u0aa7 \\u0a95\\u0ab0\\u0acb\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0acb \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                        \"stopTask\": \"\\u0a95\\u0abe\\u0ab0\\u0acd\\u0aaf\\u0aa8\\u0ac7 \\u0a85\\u0a9f\\u0a95\\u0abe\\u0ab5\\u0acb\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0aab\\u0abe\\u0a87\\u0ab2\\u0acb\\u0aa8\\u0ac7 \\u0a9c\\u0acb\\u0aa1\\u0acb\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aac\\u0abf\\u0ab2\\u0acd\\u0a9f \\u0aa5\\u0aaf\\u0ac7\\u0ab2\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0ac1 \\u0a9b\\u0ac7\",\n                        \"executedSuccessfully\": \"\\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0a9a\\u0ab2\\u0abe\\u0ab5\\u0acd\\u0aaf\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                        \"failed\": \"\\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\",\n                        \"feedbackUpdated\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6 \\u0ab8\\u0ac1\\u0aa7\\u0abe\\u0ab0\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                        \"updating\": \"\\u0ab8\\u0ac1\\u0aa7\\u0abe\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac0 \\u0aab\\u0abe\\u0a87\\u0ab2\\u0acb\\u0aa8\\u0ac7 \\u0a85\\u0a82\\u0ab9\\u0abf \\u0aae\\u0ac2\\u0a95\\u0acb\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\",\n                    \"cancelledUploadOf\": \"\\u0aa8\\u0ac1\\u0a82 \\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0ab0\\u0aa6 \\u0aa5\\u0aaf\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                    \"couldNotReachServer\": \"\\u0ab8\\u0ab0\\u0acd\\u0ab5\\u0ab0 \\u0ab8\\u0ac1\\u0aa7\\u0ac0 \\u0aaa\\u0ab9\\u0acb\\u0a82\\u0a9a\\u0ac0 \\u0ab6\\u0a95\\u0acd\\u0aaf\\u0abe \\u0aa8\\u0ab9\\u0abf\\u0a82\",\n                    \"continuingChat\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4\\u0aa8\\u0ac7 \\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0aaa\\u0ac7\\u0aa8\\u0ab2 \\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                    \"reset\": \"\\u0aaa\\u0ac1\\u0aa8:\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0abf\\u0aa4 \\u0a95\\u0ab0\\u0acb\",\n                    \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                    \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0aac\\u0aa7\\u0abe\",\n                            \"feedbackPositive\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0ab9\\u0a95\\u0abe\\u0ab0\\u0abe\\u0aa4\\u0acd\\u0aae\\u0a95\",\n                            \"feedbackNegative\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0aa8\\u0a95\\u0abe\\u0ab0\\u0abe\\u0aa4\\u0acd\\u0aae\\u0a95\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0ab6\\u0acb\\u0aa7\\u0ab5\\u0ac1\\u0a82\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0a86 \\u0aa5\\u0acd\\u0ab0\\u0ac7\\u0aa1\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aa4\\u0ac7\\u0aa8\\u0abe \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe \\u0a85\\u0aa8\\u0ac7 \\u0aa4\\u0aa4\\u0acd\\u0ab5\\u0acb\\u0aa8\\u0ac7 \\u0aaa\\u0aa3 \\u0a95\\u0abe\\u0aa2\\u0ac0 \\u0aa8\\u0abe\\u0a96\\u0ab6\\u0ac7.\",\n                        \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                        \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\",\n                        \"deletingChat\": \"\\u0a9a\\u0ac5\\u0a9f\\u0aa8\\u0ac7 \\u0a95\\u0abe\\u0aa2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\",\n                        \"chatDeleted\": \"\\u0a9a\\u0ac5\\u0a9f \\u0aa1\\u0abf\\u0ab2\\u0ac0\\u0a9f \\u0aa5\\u0a88 \\u0a97\\u0a88\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0aad\\u0ac2\\u0aa4\\u0a95\\u0abe\\u0ab3\\u0aa8\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4\\u0acb\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0a96\\u0abe\\u0ab2\\u0ac0...\",\n                        \"today\": \"\\u0a86\\u0a9c\\u0ac7\",\n                        \"yesterday\": \"\\u0a97\\u0a87\\u0a95\\u0abe\\u0ab2\\u0ac7\",\n                        \"previous7days\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0abe \\u0aed \\u0aa6\\u0abf\\u0ab5\\u0ab8\\u0acb\",\n                        \"previous30days\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0abe \\u0ae9\\u0ae6 \\u0aa6\\u0abf\\u0ab5\\u0ab8\\u0acb\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0aac\\u0abe\\u0a9c\\u0ac1\\u0aaa\\u0a9f\\u0acd\\u0a9f\\u0ac0\\u0aa8\\u0ac7 \\u0aac\\u0a82\\u0aa7 \\u0a95\\u0ab0\\u0acb\",\n                        \"openSidebar\": \"\\u0aac\\u0abe\\u0a9c\\u0ac1\\u0aaa\\u0a9f\\u0acd\\u0a9f\\u0ac0 \\u0a96\\u0acb\\u0ab2\\u0acb\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\\u0aae\\u0abe\\u0a82 \\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\",\n                    \"chatCreatedOn\": \"\\u0a86 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4 \\u0aa4\\u0ac7\\u0aa8\\u0ac0 \\u0aaa\\u0ab0 \\u0aac\\u0aa8\\u0abe\\u0ab5\\u0ac7\\u0ab2 \\u0ab9\\u0aa4\\u0ac0\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\",\n                \"readme\": \"\\u0ab0\\u0ac0\\u0aa1\\u0aae\\u0ac7\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa6\\u0abe\\u0aa4\\u0abe\\u0a93\\u0aa8\\u0ac7 \\u0ab2\\u0abe\\u0ab5\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\\u0aa4\\u0abe:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0ab8\\u0a82\\u0a97\\u0acd\\u0ab0\\u0ab9\\u0abe\\u0aaf\\u0ac7\\u0ab2\",\n            \"requiredApiKeys\": \"\\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 API \\u0a95\\u0ac0\\u0a93\",\n            \"requiredApiKeysInfo\": \"\\u0a86 \\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8\\u0aa8\\u0acb \\u0a89\\u0aaa\\u0aaf\\u0acb\\u0a97 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7, \\u0aa8\\u0ac0\\u0a9a\\u0ac7\\u0aa8\\u0ac0 API \\u0a95\\u0ac0\\u0a93 \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a9b\\u0ac7. \\u0a95\\u0ac0\\u0a93 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0aa1\\u0abf\\u0ab5\\u0abe\\u0a87\\u0ab8\\u0aa8\\u0abe \\u0ab8\\u0acd\\u0aa5\\u0abe\\u0aa8\\u0abf\\u0a95 \\u0ab8\\u0acd\\u0a9f\\u0acb\\u0ab0\\u0ac7\\u0a9c \\u0aaa\\u0ab0 \\u0ab8\\u0a82\\u0a97\\u0acd\\u0ab0\\u0ab9\\u0abf\\u0aa4 \\u0aa5\\u0abe\\u0aaf \\u0a9b\\u0ac7.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0aa4\\u0aae\\u0ac7 \\u0a86 \\u0aaa\\u0acd\\u0ab0\\u0acb\\u0a9c\\u0ac7\\u0a95\\u0acd\\u0a9f\\u0aa8\\u0acb \\u0aad\\u0abe\\u0a97 \\u0aa8\\u0aa5\\u0ac0.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0aab\\u0ab0\\u0ac0 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0acb \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/he-IL.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"\\u05d4\\u05ea\\u05e0\\u05ea\\u05e7\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f Task List\",\n                    \"loading\": \"\\u05d8\\u05d5\\u05e2\\u05df...\",\n                    \"error\": \"\\u05e9\\u05d2\\u05d9\\u05d0\\u05d4\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u05d1\\u05d8\\u05dc \\u05d4\\u05e2\\u05dc\\u05d0\\u05d4\",\n                \"removeAttachment\": \"\\u05d4\\u05e1\\u05e8 \\u05e7\\u05d5\\u05d1\\u05e5 \\u05de\\u05e6\\u05d5\\u05e8\\u05e3\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u05e6\\u05d5\\u05e8 \\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9?\",\n                \"clearChat\": \"\\u05e4\\u05e2\\u05d5\\u05dc\\u05d4 \\u05d6\\u05d5 \\u05ea\\u05e0\\u05e7\\u05d4 \\u05d0\\u05ea \\u05d4\\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea \\u05d4\\u05e0\\u05d5\\u05db\\u05d7\\u05d9\\u05d5\\u05ea \\u05d5\\u05ea\\u05ea\\u05d7\\u05d9\\u05dc \\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9.\",\n                \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                \"confirm\": \"\\u05d0\\u05e9\\u05e8\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                \"expandMessages\": \"\\u05d4\\u05e8\\u05d7\\u05d1 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea\",\n                \"hideChainOfThought\": \"\\u05d4\\u05e1\\u05ea\\u05e8 \\u05e9\\u05e8\\u05e9\\u05e8\\u05ea \\u05de\\u05d7\\u05e9\\u05d1\\u05d5\\u05ea\",\n                \"darkMode\": \"\\u05de\\u05e6\\u05d1 \\u05db\\u05d4\\u05d4\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u05de\\u05e9\\u05ea\\u05de\\u05e9 \\u05d1-\",\n                \"running\": \"\\u05e8\\u05e5\",\n                \"took_one\": \"\\u05dc\\u05e7\\u05d7 \\u05e6\\u05e2\\u05d3 {{count}}\",\n                \"took_other\": \"\\u05dc\\u05e7\\u05d7 \\u05e6\\u05e2\\u05d3\\u05d9\\u05dd {{count}}\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u05d4\\u05ea\\u05d7\\u05d1\\u05e8 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d2\\u05e9\\u05ea \\u05dc\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4.\",\n                    \"form\": {\n                        \"email\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                        \"password\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d0\",\n                        \"noAccount\": \"\\u05d0\\u05d9\\u05df \\u05dc\\u05da \\u05d7\\u05e9\\u05d1\\u05d5\\u05df?\",\n                        \"alreadyHaveAccount\": \"\\u05db\\u05d1\\u05e8 \\u05d9\\u05e9 \\u05dc\\u05da \\u05d7\\u05e9\\u05d1\\u05d5\\u05df?\",\n                        \"signup\": \"\\u05d4\\u05d9\\u05e8\\u05e9\\u05dd\",\n                        \"signin\": \"\\u05d4\\u05d9\\u05db\\u05e0\\u05e1\",\n                        \"or\": \"\\u05d0\\u05d5\",\n                        \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da\",\n                        \"forgotPassword\": \"\\u05e9\\u05db\\u05d7\\u05ea \\u05e1\\u05d9\\u05e1\\u05de\\u05d4?\",\n                        \"passwordMustContain\": \"\\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da \\u05d7\\u05d9\\u05d9\\u05d1\\u05ea \\u05dc\\u05d4\\u05db\\u05d9\\u05dc:\",\n                        \"emailRequired\": \"\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                        \"passwordRequired\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d4\\u05d9\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1.\",\n                        \"signin\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthsignin\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"redirect_uri_mismatch\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4-URI \\u05dc\\u05d4\\u05e4\\u05e0\\u05d9\\u05d4 \\u05d0\\u05d9\\u05e0\\u05d4 \\u05ea\\u05d5\\u05d0\\u05de\\u05ea \\u05dc\\u05ea\\u05e6\\u05d5\\u05e8\\u05ea \\u05d4\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4 \\u05e9\\u05dc oauth.\",\n                        \"oauthcallbackerror\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthcreateaccount\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"emailcreateaccount\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"callback\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthaccountnotlinked\": \"\\u05db\\u05d3\\u05d9 \\u05dc\\u05d0\\u05e9\\u05e8 \\u05d0\\u05ea \\u05d6\\u05d4\\u05d5\\u05ea\\u05da, \\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d0\\u05d5\\u05ea\\u05d5 \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05e9\\u05d1\\u05d5 \\u05d4\\u05e9\\u05ea\\u05de\\u05e9\\u05ea \\u05d1\\u05de\\u05e7\\u05d5\\u05e8.\",\n                        \"emailsignin\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05dc\\u05e9\\u05dc\\u05d5\\u05d7 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc.\",\n                        \"emailverify\": \"\\u05d0\\u05e0\\u05d0 \\u05d0\\u05e9\\u05e8 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da, \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d7\\u05d3\\u05e9 \\u05e0\\u05e9\\u05dc\\u05d7.\",\n                        \"credentialssignin\": \"\\u05d4\\u05db\\u05e0\\u05d9\\u05e1\\u05d4 \\u05e0\\u05db\\u05e9\\u05dc\\u05d4. \\u05d1\\u05d3\\u05d5\\u05e7 \\u05e9\\u05d4\\u05e4\\u05e8\\u05d8\\u05d9\\u05dd \\u05e9\\u05e1\\u05d9\\u05e4\\u05e7\\u05ea \\u05e0\\u05db\\u05d5\\u05e0\\u05d9\\u05dd.\",\n                        \"sessionrequired\": \"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d2\\u05e9\\u05ea \\u05dc\\u05d3\\u05e3 \\u05d6\\u05d4.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u05d0\\u05ea\\u05d4 \\u05db\\u05de\\u05e2\\u05d8 \\u05e9\\u05dd! \\u05e9\\u05dc\\u05d7\\u05e0\\u05d5 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d0\\u05dc \",\n                    \"verifyEmailLink\": \"\\u05d0\\u05e0\\u05d0 \\u05dc\\u05d7\\u05e5 \\u05e2\\u05dc \\u05d4\\u05e7\\u05d9\\u05e9\\u05d5\\u05e8 \\u05d1\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d6\\u05d4 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d4\\u05e9\\u05dc\\u05d9\\u05dd \\u05d0\\u05ea \\u05d4\\u05d4\\u05e8\\u05e9\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"didNotReceive\": \"\\u05dc\\u05d0 \\u05de\\u05d5\\u05e6\\u05d0 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc?\",\n                    \"resendEmail\": \"\\u05e9\\u05dc\\u05d7 \\u05e9\\u05d5\\u05d1 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"goBack\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05d0\\u05d7\\u05d5\\u05e8\\u05d4\",\n                    \"emailSent\": \"\\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e0\\u05e9\\u05dc\\u05d7 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4.\",\n                    \"verifyEmail\": \"\\u05d0\\u05de\\u05ea \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da \\u05e2\\u05dd {{provider}}\",\n                    \"signup\": \"\\u05d4\\u05d9\\u05e8\\u05e9\\u05dd \\u05e2\\u05dd {{provider}}\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d7\\u05d3\\u05e9\\u05d4 \\u05d4\\u05d9\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"passwordsMustMatch\": \"\\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d0\\u05d5\\u05ea \\u05d7\\u05d9\\u05d9\\u05d1\\u05d5\\u05ea \\u05dc\\u05d4\\u05ea\\u05d0\\u05d9\\u05dd\",\n                    \"confirmPasswordRequired\": \"\\u05d0\\u05d9\\u05e9\\u05d5\\u05e8 \\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"newPassword\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d0 \\u05d7\\u05d3\\u05e9\\u05d4\",\n                    \"confirmPassword\": \"\\u05d0\\u05e9\\u05e8 \\u05e1\\u05d9\\u05e1\\u05de\\u05d0\",\n                    \"resetPassword\": \"\\u05d0\\u05e4\\u05e1 \\u05e1\\u05d9\\u05e1\\u05de\\u05d4\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"emailRequired\": \"\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"emailSent\": \"\\u05d0\\u05e0\\u05d0 \\u05d1\\u05d3\\u05d5\\u05e7 \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc {{email}} \\u05dc\\u05e7\\u05d1\\u05dc\\u05ea \\u05d4\\u05d5\\u05e8\\u05d0\\u05d5\\u05ea \\u05dc\\u05d0\\u05d9\\u05e4\\u05d5\\u05e1 \\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"enterEmail\": \"\\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da \\u05d5\\u05d0\\u05e0\\u05d5 \\u05e0\\u05e9\\u05dc\\u05d7 \\u05dc\\u05da \\u05d4\\u05d5\\u05e8\\u05d0\\u05d5\\u05ea \\u05dc\\u05d0\\u05d9\\u05e4\\u05d5\\u05e1 \\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"resendEmail\": \"\\u05e9\\u05dc\\u05d7 \\u05e9\\u05d5\\u05d1 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da\",\n                    \"goBack\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05d0\\u05d7\\u05d5\\u05e8\\u05d4\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u05d4\\u05e6\\u05d2 \\u05d4\\u05d9\\u05e1\\u05d8\\u05d5\\u05e8\\u05d9\\u05d4\",\n                        \"lastInputs\": \"\\u05e7\\u05dc\\u05d8 \\u05d0\\u05d7\\u05e8\\u05d5\\u05df\",\n                        \"noInputs\": \"\\u05e8\\u05d9\\u05e7...\",\n                        \"loading\": \"\\u05d8\\u05d5\\u05e2\\u05df...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u05db\\u05ea\\u05d5\\u05d1 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d4 \\u05db\\u05d0\\u05df...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u05d4\\u05ea\\u05d7\\u05dc \\u05d4\\u05e7\\u05dc\\u05d8\\u05d4\",\n                        \"stop\": \"\\u05e2\\u05e6\\u05d5\\u05e8 \\u05d4\\u05e7\\u05dc\\u05d8\\u05d4\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u05e9\\u05dc\\u05d7 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d4\",\n                        \"stopTask\": \"\\u05e2\\u05e6\\u05d5\\u05e8 \\u05de\\u05e9\\u05d9\\u05de\\u05d4\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u05e6\\u05e8\\u05e3 \\u05e7\\u05d1\\u05e6\\u05d9\\u05dd\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u05e0\\u05d1\\u05e0\\u05d4 \\u05e2\\u05dd\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u05e8\\u05e5\",\n                        \"executedSuccessfully\": \"\\u05d1\\u05d5\\u05e6\\u05e2 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4\",\n                        \"failed\": \"\\u05e0\\u05db\\u05e9\\u05dc\",\n                        \"feedbackUpdated\": \"\\u05de\\u05e9\\u05d5\\u05d1 \\u05e2\\u05d5\\u05d3\\u05db\\u05df\",\n                        \"updating\": \"\\u05de\\u05e2\\u05d3\\u05db\\u05df\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u05e9\\u05d7\\u05e8\\u05e8 \\u05d0\\u05ea \\u05d4\\u05e7\\u05d1\\u05e6\\u05d9\\u05dd \\u05e9\\u05dc\\u05da \\u05db\\u05d0\\u05df\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u05d4\\u05e2\\u05dc\\u05d0\\u05d4 \\u05e0\\u05db\\u05e9\\u05dc\\u05d4\",\n                    \"cancelledUploadOf\": \"\\u05d4\\u05e2\\u05dc\\u05d0\\u05d4 \\u05e9\\u05dc \\u05d1\\u05d5\\u05d8\\u05dc\\u05d4\",\n                    \"couldNotReachServer\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05d4\\u05d9\\u05d4 \\u05dc\\u05d4\\u05d2\\u05d9\\u05e2 \\u05dc\\u05e9\\u05e8\\u05ea\",\n                    \"continuingChat\": \"\\u05de\\u05de\\u05e9\\u05d9\\u05da \\u05d1\\u05e6'\\u05d0\\u05d8 \\u05d4\\u05e7\\u05d5\\u05d3\\u05dd\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u05dc\\u05d5\\u05d7 \\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                    \"reset\": \"\\u05d0\\u05e4\\u05e1\",\n                    \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                    \"confirm\": \"\\u05d0\\u05e9\\u05e8\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05d4\\u05db\\u05dc\",\n                            \"feedbackPositive\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05d7\\u05d9\\u05d5\\u05d1\\u05d9\",\n                            \"feedbackNegative\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05e9\\u05dc\\u05d9\\u05dc\\u05d9\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u05d7\\u05d9\\u05e4\\u05d5\\u05e9\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u05e4\\u05e2\\u05d5\\u05dc\\u05d4 \\u05d6\\u05d5 \\u05ea\\u05de\\u05d7\\u05e7 \\u05d0\\u05ea \\u05d4\\u05e9\\u05e8\\u05e9\\u05d5\\u05e8 \\u05d5\\u05db\\u05df \\u05d0\\u05ea \\u05d4\\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea \\u05d5\\u05d4\\u05e8\\u05db\\u05d9\\u05d1\\u05d9\\u05dd \\u05e9\\u05dc\\u05d5.\",\n                        \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                        \"confirm\": \"\\u05d0\\u05e9\\u05e8\",\n                        \"deletingChat\": \"\\u05de\\u05d5\\u05d7\\u05e7 \\u05e6'\\u05d0\\u05d8\",\n                        \"chatDeleted\": \"\\u05d4\\u05e6'\\u05d0\\u05d8 \\u05e0\\u05de\\u05d7\\u05e7\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u05e6'\\u05d0\\u05d8\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u05e8\\u05d9\\u05e7...\",\n                        \"today\": \"\\u05d4\\u05d9\\u05d5\\u05dd\",\n                        \"yesterday\": \"\\u05d0\\u05ea\\u05de\\u05d5\\u05dc\",\n                        \"previous7days\": \"7 \\u05d9\\u05de\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\",\n                        \"previous30days\": \"30 \\u05d9\\u05de\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u05e1\\u05d2\\u05d5\\u05e8 \\u05e1\\u05e8\\u05d2\\u05dc \\u05e6\\u05d3\",\n                        \"openSidebar\": \"\\u05e4\\u05ea\\u05d7 \\u05e1\\u05e8\\u05d2\\u05dc \\u05e6\\u05d3\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05dc\\u05e6'\\u05d0\\u05d8\",\n                    \"chatCreatedOn\": \"\\u05d4\\u05e6'\\u05d0\\u05d8 \\u05d4\\u05d6\\u05d4 \\u05e0\\u05d5\\u05e6\\u05e8 \\u05d1\\u05ea\\u05d0\\u05e8\\u05d9\\u05da\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u05e6'\\u05d0\\u05d8\",\n                \"readme\": \"\\u05d0\\u05d5\\u05d3\\u05d5\\u05ea\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u05e0\\u05db\\u05e9\\u05dc\\u05d4 \\u05d4\\u05d1\\u05d0\\u05ea \\u05e1\\u05e4\\u05e7\\u05d9\\u05dd:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u05e0\\u05e9\\u05de\\u05e8 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4\",\n            \"requiredApiKeys\": \"\\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea API \\u05e0\\u05d3\\u05e8\\u05e9\\u05d9\\u05dd\",\n            \"requiredApiKeysInfo\": \"\\u05db\\u05d3\\u05d9 \\u05dc\\u05d4\\u05e9\\u05ea\\u05de\\u05e9 \\u05d1\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4 \\u05d6\\u05d5, \\u05e0\\u05d3\\u05e8\\u05e9\\u05d9\\u05dd \\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea \\u05d4-API \\u05d4\\u05d1\\u05d0\\u05d9\\u05dd. \\u05d4\\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea \\u05de\\u05d0\\u05d5\\u05d7\\u05e1\\u05e0\\u05d9\\u05dd \\u05d1\\u05d0\\u05d7\\u05e1\\u05d5\\u05df \\u05d4\\u05de\\u05e7\\u05d5\\u05de\\u05d9 \\u05e9\\u05dc \\u05d4\\u05de\\u05db\\u05e9\\u05d9\\u05e8 \\u05e9\\u05dc\\u05da.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u05d0\\u05ea\\u05d4 \\u05dc\\u05d0 \\u05d7\\u05dc\\u05e7 \\u05de\\u05d4\\u05e4\\u05e8\\u05d5\\u05d9\\u05e7\\u05d8 \\u05d4\\u05d6\\u05d4.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u05d4\\u05de\\u05e9\\u05da \\u05e6'\\u05d0\\u05d8\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/hi.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                        \"settingsKey\": \"\\u0926\\u0915\\u094d\\u0937\\u093f\\u0923\\u0940\",\n                        \"APIKeys\": \"\\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u0940\",\n                        \"logout\": \"\\u0932\\u0949\\u0917\\u0906\\u0909\\u091f\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0928\\u0908 \\u091a\\u0948\\u091f\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0915\\u093e\\u0930\\u094d\\u092f \\u0938\\u0942\\u091a\\u0940\",\n                    \"loading\": \"\\u0932\\u094b\\u0921\\u0964\\u0964\\u0964\",\n                    \"error\": \"\\u0915\\u094b\\u0908 \\u0924\\u094d\\u0930\\u0941\\u091f\\u093f \\u0909\\u0924\\u094d\\u092a\\u0928\\u094d\\u0928 \\u0939\\u0941\\u0908\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0947\\u0902\",\n                \"removeAttachment\": \"\\u0905\\u0928\\u0941\\u0932\\u0917\\u094d\\u0928\\u0915 \\u0928\\u093f\\u0915\\u093e\\u0932\\u0947\\u0902\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0928\\u0908 \\u091a\\u0948\\u091f \\u092c\\u0928\\u093e\\u090f\\u0901?\",\n                \"clearChat\": \"\\u092f\\u0939 \\u0935\\u0930\\u094d\\u0924\\u092e\\u093e\\u0928 \\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u094b \\u0938\\u093e\\u092b\\u093c \\u0915\\u0930\\u0947\\u0917\\u093e \\u0914\\u0930 \\u090f\\u0915 \\u0928\\u0908 \\u091a\\u0948\\u091f \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0917\\u093e\\u0964\",\n                \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                \"expandMessages\": \"\\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u093e \\u0935\\u093f\\u0938\\u094d\\u0924\\u093e\\u0930 \\u0915\\u0930\\u0947\\u0902\",\n                \"hideChainOfThought\": \"\\u0935\\u093f\\u091a\\u093e\\u0930 \\u0915\\u0940 \\u0936\\u094d\\u0930\\u0943\\u0902\\u0916\\u0932\\u093e \\u091b\\u093f\\u092a\\u093e\\u090f\\u0902\",\n                \"darkMode\": \"\\u0921\\u093e\\u0930\\u094d\\u0915 \\u092e\\u094b\\u0921\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0915\\u093e \\u0909\\u092a\\u092f\\u094b\\u0917 \\u0915\\u0930\\u0915\\u0947\",\n                \"running\": \"\\u092d\\u093e\\u0917\\u0928\\u093e\",\n                \"took_one\": \"{{count}} \\u0915\\u0926\\u092e \\u0909\\u0920\\u093e\\u092f\\u093e\",\n                \"took_other\": \"{{count}} \\u0915\\u0926\\u092e \\u0909\\u0920\\u093e\\u090f\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0910\\u092a \\u0924\\u0915 \\u092a\\u0939\\u0941\\u0902\\u091a\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0932\\u0949\\u0917\\u093f\\u0928 \\u0915\\u0930\\u0947\\u0902\\u0964\",\n                    \"form\": {\n                        \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e\",\n                        \"password\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                        \"noAccount\": \"\\u0915\\u094d\\u092f\\u093e \\u0906\\u092a\\u0915\\u0947 \\u092a\\u093e\\u0938 \\u0916\\u093e\\u0924\\u093e \\u0928\\u0939\\u0940\\u0902 \\u0939\\u0948?\",\n                        \"alreadyHaveAccount\": \"\\u092a\\u0939\\u0932\\u0947 \\u0938\\u0947 \\u0939\\u0940 \\u090f\\u0915 \\u0916\\u093e\\u0924\\u093e \\u0939\\u0948?\",\n                        \"signup\": \"\\u0928\\u093e\\u092e \\u0932\\u093f\\u0916\\u094b\",\n                        \"signin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902\",\n                        \"or\": \"\\u0928\\u0939\\u0940\\u0902 \\u0924\\u094b\",\n                        \"continue\": \"\\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\",\n                        \"forgotPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092d\\u0942\\u0932 \\u0917\\u090f?\",\n                        \"passwordMustContain\": \"\\u0906\\u092a\\u0915\\u0947 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092e\\u0947\\u0902 \\u0939\\u094b\\u0928\\u093e \\u091a\\u093e\\u0939\\u093f\\u090f:\",\n                        \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                        \"passwordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0905\\u0938\\u092e\\u0930\\u094d\\u0925.\",\n                        \"signin\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthsignin\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"redirect_uri_mismatch\": \"\\u0930\\u0940\\u0921\\u093e\\u092f\\u0930\\u0947\\u0915\\u094d\\u091f \\u092f\\u0942\\u0906\\u0930\\u0906\\u0908 \\u0913\\u0925 \\u0910\\u092a \\u0915\\u0949\\u0928\\u094d\\u092b\\u093c\\u093f\\u0917\\u0930\\u0947\\u0936\\u0928 \\u0938\\u0947 \\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u0916\\u093e \\u0930\\u0939\\u093e \\u0939\\u0948\\u0964\",\n                        \"oauthcallbackerror\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthcreateaccount\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"emailcreateaccount\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"callback\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthaccountnotlinked\": \"\\u0905\\u092a\\u0928\\u0940 \\u092a\\u0939\\u091a\\u093e\\u0928 \\u0915\\u0928\\u094d\\u092b\\u093c\\u0930\\u094d\\u092e \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f, \\u0909\\u0938\\u0940 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902 \\u091c\\u093f\\u0938\\u0915\\u093e \\u0907\\u0938\\u094d\\u0924\\u0947\\u092e\\u093e\\u0932 \\u0906\\u092a\\u0928\\u0947 \\u092a\\u0939\\u0932\\u0947 \\u0915\\u093f\\u092f\\u093e \\u0925\\u093e.\",\n                        \"emailsignin\": \"\\u0908-\\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u092d\\u0947\\u091c\\u0940 \\u091c\\u093e \\u0938\\u0915\\u0940.\",\n                        \"emailverify\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u0938\\u0924\\u094d\\u092f\\u093e\\u092a\\u093f\\u0924 \\u0915\\u0930\\u0947\\u0902, \\u090f\\u0915 \\u0928\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092d\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e \\u0939\\u0948\\u0964\",\n                        \"credentialssignin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0935\\u093f\\u092b\\u0932 \\u0930\\u0939\\u093e. \\u091c\\u093e\\u0902\\u091a\\u0947\\u0902 \\u0915\\u093f \\u0906\\u092a\\u0915\\u0947 \\u0926\\u094d\\u0935\\u093e\\u0930\\u093e \\u092a\\u094d\\u0930\\u0926\\u093e\\u0928 \\u0915\\u093f\\u090f \\u0917\\u090f \\u0935\\u093f\\u0935\\u0930\\u0923 \\u0938\\u0939\\u0940 \\u0939\\u0948\\u0902\\u0964\",\n                        \"sessionrequired\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0907\\u0938 \\u092a\\u0943\\u0937\\u094d\\u0920 \\u0924\\u0915 \\u092a\\u0939\\u0941\\u0902\\u091a\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902\\u0964\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0906\\u092a \\u0932\\u0917\\u092d\\u0917 \\u0935\\u0939\\u093e\\u0901 \\u0939\\u0948\\u0902! \\u0939\\u092e\\u0928\\u0947 \\u090f\\u0915 \\u0908\\u092e\\u0947\\u0932 \\u092d\\u0947\\u091c\\u093e \\u0939\\u0948 \",\n                    \"verifyEmailLink\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0905\\u092a\\u0928\\u093e \\u0938\\u093e\\u0907\\u0928\\u0905\\u092a \\u092a\\u0942\\u0930\\u093e \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0909\\u0938 \\u0908\\u092e\\u0947\\u0932 \\u092e\\u0947\\u0902 \\u0926\\u093f\\u090f \\u0917\\u090f \\u0932\\u093f\\u0902\\u0915 \\u092a\\u0930 \\u0915\\u094d\\u0932\\u093f\\u0915 \\u0915\\u0930\\u0947\\u0902\\u0964\",\n                    \"didNotReceive\": \"\\u0908\\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u092e\\u093f\\u0932 \\u0930\\u0939\\u093e \\u0939\\u0948?\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u0903 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                    \"goBack\": \"\\u092a\\u0938 \\u091c\\u093e\\u0913\",\n                    \"emailSent\": \"\\u0908\\u092e\\u0947\\u0932 \\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u092d\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e\\u0964\",\n                    \"verifyEmail\": \"\\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e \\u0938\\u0924\\u094d\\u092f\\u093e\\u092a\\u093f\\u0924 \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0915\\u0947 \\u0938\\u093e\\u0925 \\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0947\\u0902\",\n                    \"signup\": \"{{provider}} \\u0915\\u0947 \\u0938\\u093e\\u0925 \\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0928\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"passwordsMustMatch\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092e\\u0947\\u0932 \\u0916\\u093e\\u0928\\u093e \\u091a\\u093e\\u0939\\u093f\\u090f\",\n                    \"confirmPasswordRequired\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f \\u0915\\u0930\\u0947\\u0902 \\u0915\\u093f \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"newPassword\": \"\\u0928\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                    \"confirmPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0915\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u093f \\u0915\\u0930\\u0947\\u0902\",\n                    \"resetPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e\",\n                    \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"emailSent\": \"\\u0905\\u092a\\u0928\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0928\\u093f\\u0930\\u094d\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0915\\u0943\\u092a\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e {{email}} \\u0926\\u0947\\u0916\\u0947\\u0902\\u0964\",\n                    \"enterEmail\": \"\\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e \\u0926\\u0930\\u094d\\u091c \\u0915\\u0930\\u0947\\u0902 \\u0914\\u0930 \\u0939\\u092e \\u0906\\u092a\\u0915\\u094b \\u0905\\u092a\\u0928\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0928\\u093f\\u0930\\u094d\\u0926\\u0947\\u0936 \\u092d\\u0947\\u091c\\u0947\\u0902\\u0917\\u0947\\u0964\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u0903 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                    \"continue\": \"\\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\",\n                    \"goBack\": \"\\u092a\\u0938 \\u091c\\u093e\\u0913\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0907\\u0924\\u093f\\u0939\\u093e\\u0938 \\u0926\\u093f\\u0916\\u093e\\u090f\\u0902\",\n                        \"lastInputs\": \"\\u0905\\u0902\\u0924\\u093f\\u092e \\u0907\\u0928\\u092a\\u0941\\u091f\",\n                        \"noInputs\": \"\\u0910\\u0938\\u0947 \\u0916\\u093e\\u0932\\u0940...\",\n                        \"loading\": \"\\u0932\\u094b\\u0921\\u0964\\u0964\\u0964\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0905\\u092a\\u0928\\u093e \\u0938\\u0902\\u0926\\u0947\\u0936 \\u092f\\u0939\\u093e\\u0901 \\u091f\\u093e\\u0907\\u092a \\u0915\\u0930\\u0947\\u0902...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0930\\u093f\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0902\",\n                        \"stop\": \"\\u0930\\u093f\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u094b\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                        \"stopTask\": \"\\u0915\\u093e\\u0930\\u094d\\u092f \\u092c\\u0902\\u0926 \\u0915\\u0930\\u094b\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u092b\\u093c\\u093e\\u0907\\u0932\\u0947\\u0902 \\u0905\\u0928\\u0941\\u0932\\u0917\\u094d\\u0928 \\u0915\\u0930\\u0947\\u0902\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0915\\u0947 \\u0938\\u093e\\u0925 \\u0928\\u093f\\u0930\\u094d\\u092e\\u093f\\u0924\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u092d\\u093e\\u0917\\u0928\\u093e\",\n                        \"executedSuccessfully\": \"\\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u0928\\u093f\\u0937\\u094d\\u092a\\u093e\\u0926\\u093f\\u0924\",\n                        \"failed\": \"\\u0905\\u0938\\u092b\\u0932\",\n                        \"feedbackUpdated\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u0915\\u094d\\u0930\\u093f\\u092f\\u093e \\u0905\\u092a\\u0921\\u0947\\u091f \\u0915\\u0940 \\u0917\\u0908\",\n                        \"updating\": \"\\u0905\\u0926\\u094d\\u092f\\u0924\\u0928\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0905\\u092a\\u0928\\u0940 \\u092b\\u093c\\u093e\\u0907\\u0932\\u0947\\u0902 \\u092f\\u0939\\u093e\\u0901 \\u0921\\u094d\\u0930\\u0949\\u092a \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0915\\u0930\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0935\\u093f\\u092b\\u0932\",\n                    \"cancelledUploadOf\": \"\\u0915\\u093e \\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u093f\\u092f\\u093e \\u0917\\u092f\\u093e\",\n                    \"couldNotReachServer\": \"\\u0938\\u0930\\u094d\\u0935\\u0930 \\u0924\\u0915 \\u0928\\u0939\\u0940\\u0902 \\u092a\\u0939\\u0941\\u0901\\u091a \\u0938\\u0915\\u093e\",\n                    \"continuingChat\": \"\\u092a\\u093f\\u091b\\u0932\\u0940 \\u091a\\u0948\\u091f \\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938 \\u092a\\u0948\\u0928\\u0932\",\n                    \"reset\": \"\\u0930\\u0940\\u0938\\u0947\\u091f\",\n                    \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                    \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0938\\u092d\\u0940\",\n                            \"feedbackPositive\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0938\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\",\n                            \"feedbackNegative\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0928\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0922\\u0942\\u0901\\u0922\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u092f\\u0939 \\u0925\\u094d\\u0930\\u0947\\u0921 \\u0915\\u0947 \\u0938\\u093e\\u0925-\\u0938\\u093e\\u0925 \\u0907\\u0938\\u0915\\u0947 \\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0914\\u0930 \\u0924\\u0924\\u094d\\u0935\\u094b\\u0902 \\u0915\\u094b \\u092d\\u0940 \\u0939\\u091f\\u093e \\u0926\\u0947\\u0917\\u093e\\u0964\",\n                        \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                        \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\",\n                        \"deletingChat\": \"\\u091a\\u0948\\u091f \\u0939\\u091f\\u093e\\u0928\\u093e\",\n                        \"chatDeleted\": \"\\u091a\\u0948\\u091f \\u0939\\u091f\\u093e\\u0908 \\u0917\\u0908\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u092a\\u093f\\u091b\\u0932\\u0940 \\u091a\\u0948\\u091f\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0916\\u093e\\u0932\\u0940\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0906\\u091c\",\n                        \"yesterday\": \"\\u092c\\u0940\\u0924\\u093e \\u0939\\u0941\\u0906 \\u0915\\u0932\",\n                        \"previous7days\": \"\\u092a\\u093f\\u091b\\u0932\\u0947 7 \\u0926\\u093f\\u0928\",\n                        \"previous30days\": \"\\u092a\\u093f\\u091b\\u0932\\u0947 30 \\u0926\\u093f\\u0928\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u0947\\u0902\",\n                        \"openSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u0916\\u094b\\u0932\\u0947\\u0902\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u091a\\u0948\\u091f \\u092a\\u0930 \\u0935\\u093e\\u092a\\u0938 \\u091c\\u093e\\u090f\\u0902\",\n                    \"chatCreatedOn\": \"\\u092f\\u0939 \\u091a\\u0948\\u091f \\u0907\\u0938 \\u092a\\u0930 \\u092c\\u0928\\u093e\\u0908 \\u0917\\u0908 \\u0925\\u0940\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u091a\\u0948\\u091f\",\n                \"readme\": \"\\u0930\\u0940\\u0921\\u092e\\u0940\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u092a\\u094d\\u0930\\u0926\\u093e\\u0924\\u093e\\u0913\\u0902 \\u0915\\u094b \\u0932\\u093e\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0935\\u093f\\u092b\\u0932:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u0938\\u0939\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e\",\n            \"requiredApiKeys\": \"\\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u0940\",\n            \"requiredApiKeysInfo\": \"\\u0907\\u0938 \\u0910\\u092a \\u0915\\u093e \\u0909\\u092a\\u092f\\u094b\\u0917 \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f, \\u0928\\u093f\\u092e\\u094d\\u0928\\u0932\\u093f\\u0916\\u093f\\u0924 \\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u093f\\u092f\\u094b\\u0902 \\u0915\\u0940 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915\\u0924\\u093e \\u0939\\u094b\\u0924\\u0940 \\u0939\\u0948\\u0964 \\u091a\\u093e\\u092c\\u093f\\u092f\\u093e\\u0901 \\u0906\\u092a\\u0915\\u0947 \\u0921\\u093f\\u0935\\u093e\\u0907\\u0938 \\u0915\\u0947 \\u0938\\u094d\\u0925\\u093e\\u0928\\u0940\\u092f \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u0923 \\u092a\\u0930 \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u0940\\u0924 \\u0915\\u0940 \\u091c\\u093e\\u0924\\u0940 \\u0939\\u0948\\u0902\\u0964\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0906\\u092a \\u0907\\u0938 \\u092a\\u0930\\u093f\\u092f\\u094b\\u091c\\u0928\\u093e \\u0915\\u093e \\u0939\\u093f\\u0938\\u094d\\u0938\\u093e \\u0928\\u0939\\u0940\\u0902 \\u0939\\u0948\\u0902\\u0964\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u091a\\u0948\\u091f \\u092b\\u093f\\u0930 \\u0938\\u0947 \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0902\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/kn.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1\",\n                        \"logout\": \"\\u0cb2\\u0cbe\\u0c97\\u0ccd \\u0c94\\u0c9f\\u0ccd\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf \\u0caa\\u0c9f\\u0ccd\\u0c9f\\u0cbf\",\n                    \"loading\": \"\\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6...\",\n                    \"error\": \"\\u0ca6\\u0ccb\\u0cb7 \\u0cb8\\u0c82\\u0cad\\u0cb5\\u0cbf\\u0cb8\\u0cbf\\u0ca6\\u0cc6\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1 \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                \"removeAttachment\": \"\\u0cb2\\u0c97\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0ca4\\u0cc6\\u0c97\\u0cc6\\u0ca6\\u0cc1\\u0cb9\\u0cbe\\u0c95\\u0cbf\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0cb0\\u0c9a\\u0cbf\\u0cb8\\u0cac\\u0cc7\\u0c95\\u0cc6?\",\n                \"clearChat\": \"\\u0c87\\u0ca6\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cb8\\u0ccd\\u0ca4\\u0cc1\\u0ca4 \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca4\\u0cc6\\u0cb0\\u0cb5\\u0cc1\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\",\n                \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                \"expandMessages\": \"\\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb5\\u0cbf\\u0cb8\\u0ccd\\u0ca4\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                \"hideChainOfThought\": \"\\u0c9a\\u0cbf\\u0c82\\u0ca4\\u0ca8\\u0cc6\\u0caf \\u0cb8\\u0cb0\\u0caa\\u0cb3\\u0cbf\\u0caf\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0cb0\\u0cc6\\u0cae\\u0cbe\\u0ca1\\u0cc1\",\n                \"darkMode\": \"\\u0ca1\\u0cbe\\u0cb0\\u0ccd\\u0c95\\u0ccd \\u0cae\\u0ccb\\u0ca1\\u0ccd\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0cac\\u0cb3\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                \"running\": \"\\u0c9a\\u0cb2\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                \"took_one\": \"{{count}} \\u0cb9\\u0cc6\\u0c9c\\u0ccd\\u0c9c\\u0cc6 \\u0c87\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0ca6\\u0cc6\",\n                \"took_other\": \"{{count}} \\u0cb9\\u0cc6\\u0c9c\\u0ccd\\u0c9c\\u0cc6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca4\\u0cc6\\u0c97\\u0cc6\\u0ca6\\u0cc1\\u0c95\\u0cca\\u0c82\\u0ca1\\u0cb0\\u0cc1\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0c85\\u0caa\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0caa\\u0ccd\\u0cb0\\u0cb5\\u0cc7\\u0cb6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                    \"form\": {\n                        \"email\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\",\n                        \"password\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd\",\n                        \"noAccount\": \"\\u0c96\\u0cbe\\u0ca4\\u0cc6 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc7?\",\n                        \"alreadyHaveAccount\": \"\\u0c88\\u0c97\\u0cbe\\u0c97\\u0cb2\\u0cc7 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbe?\",\n                        \"signup\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"signin\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"or\": \"\\u0c85\\u0ca5\\u0cb5\\u0cbe\",\n                        \"continue\": \"\\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                        \"forgotPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc6\\u0ca4\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbe?\",\n                        \"passwordMustContain\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c87\\u0cb5\\u0cc1\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c92\\u0cb3\\u0c97\\u0cca\\u0c82\\u0ca1\\u0cbf\\u0cb0\\u0cac\\u0cc7\\u0c95\\u0cc1:\",\n                        \"emailRequired\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"passwordRequired\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0c85\\u0cb8\\u0cae\\u0cb0\\u0ccd\\u0ca5\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                        \"signin\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthsignin\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"redirect_uri_mismatch\": \"\\u0cae\\u0cb0\\u0cc1\\u0ca8\\u0cbf\\u0cb0\\u0ccd\\u0ca6\\u0cc7\\u0cb6\\u0ca8\\u0ca6 URI \\u0c86\\u0ccd\\u0caf\\u0caa\\u0ccd \\u0c95\\u0cbe\\u0ca8\\u0ccd\\u0cab\\u0cbf\\u0c97\\u0cb0\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0c97\\u0cc6 \\u0cb9\\u0ccb\\u0cb2\\u0cbf\\u0c95\\u0cc6\\u0caf\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\",\n                        \"oauthcallbackerror\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthcreateaccount\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"emailcreateaccount\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"callback\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthaccountnotlinked\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c97\\u0cc1\\u0cb0\\u0cc1\\u0ca4\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca6\\u0cc3\\u0ca2\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cc1, \\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0cae\\u0cc2\\u0cb2\\u0ca4\\u0c83 \\u0cac\\u0cb3\\u0cb8\\u0cbf\\u0ca6 \\u0c85\\u0ca6\\u0cc7 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                        \"emailsignin\": \"\\u0c87-\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbe\\u0c97\\u0cb2\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\",\n                        \"emailverify\": \"\\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf, \\u0cb9\\u0cca\\u0cb8 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                        \"credentialssignin\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6. \\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0c92\\u0ca6\\u0c97\\u0cbf\\u0cb8\\u0cbf\\u0ca6 \\u0cb5\\u0cbf\\u0cb5\\u0cb0\\u0c97\\u0cb3\\u0cc1 \\u0cb8\\u0cb0\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf\\u0cb5\\u0cc6\\u0caf\\u0cc7 \\u0c8e\\u0c82\\u0ca6\\u0cc1 \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"sessionrequired\": \"\\u0c88 \\u0caa\\u0cc1\\u0c9f\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cb5\\u0cc7\\u0cb6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0cac\\u0cb9\\u0cc1\\u0ca4\\u0cc7\\u0c95 \\u0c85\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbf! \\u0ca8\\u0cbe\\u0cb5\\u0cc1 \\u0c97\\u0cc6 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc7\\u0cb5\\u0cc6 \",\n                    \"verifyEmailLink\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0ca3\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0c86 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0ca8\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb0\\u0cc1\\u0cb5 \\u0cb2\\u0cbf\\u0c82\\u0c95\\u0ccd \\u0c95\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                    \"didNotReceive\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb9\\u0cc1\\u0ca1\\u0cc1\\u0c95\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc7?\",\n                    \"resendEmail\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                    \"goBack\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cc6 \\u0cb9\\u0cc6\\u0cc2\\u0cd5\\u0c97\\u0cc1\",\n                    \"emailSent\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                    \"verifyEmail\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0ca8\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                    \"signup\": \"{{provider}} \\u0ca8\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0cb9\\u0cca\\u0cb8 \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"passwordsMustMatch\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c97\\u0cb3\\u0cc1 \\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c95\\u0cc6\\u0caf\\u0cbe\\u0c97\\u0cac\\u0cc7\\u0c95\\u0cc1\",\n                    \"confirmPasswordRequired\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c8e\\u0c82\\u0ca6\\u0cc1 \\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                    \"newPassword\": \"\\u0cb9\\u0cca\\u0cb8 \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd\",\n                    \"confirmPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                    \"resetPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cbf\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\",\n                    \"emailRequired\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"emailSent\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb8\\u0cc2\\u0c9a\\u0ca8\\u0cc6\\u0c97\\u0cb3\\u0cbf\\u0c97\\u0cbe\\u0c97\\u0cbf \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8 {{email}} \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf.\",\n                    \"enterEmail\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca8\\u0cae\\u0cc2\\u0ca6\\u0cbf\\u0cb8\\u0cbf \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca8\\u0cbe\\u0cb5\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0c97\\u0cc6 \\u0cb8\\u0cc2\\u0c9a\\u0ca8\\u0cc6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cc7\\u0cb5\\u0cc6.\",\n                    \"resendEmail\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                    \"continue\": \"\\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                    \"goBack\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cc6 \\u0cb9\\u0cc6\\u0cc2\\u0cd5\\u0c97\\u0cc1\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0c87\\u0ca4\\u0cbf\\u0cb9\\u0cbe\\u0cb8 \\u0ca4\\u0ccb\\u0cb0\\u0cbf\\u0cb8\\u0cc1\",\n                        \"lastInputs\": \"\\u0c95\\u0cca\\u0ca8\\u0cc6\\u0caf \\u0c87\\u0ca8\\u0ccd \\u0caa\\u0cc1\\u0c9f\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                        \"noInputs\": \"\\u0c8e\\u0c82\\u0ca4\\u0cb9 \\u0c96\\u0cbe\\u0cb2\\u0cbf...\",\n                        \"loading\": \"\\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cac\\u0cc6\\u0cb0\\u0cb3\\u0c9a\\u0ccd\\u0c9a\\u0cbf\\u0cb8\\u0cbf...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0cb0\\u0cc6\\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0ca1\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0caa\\u0ccd\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cbf\",\n                        \"stop\": \"\\u0cb0\\u0cc6\\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0ca1\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0ca8\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb8\\u0cc1\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                        \"stopTask\": \"\\u0ca8\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb8\\u0cc1 \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0cab\\u0cc8\\u0cb2\\u0ccd \\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb2\\u0c97\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0cb8\\u0cbf\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0c87\\u0ca6\\u0cb0\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0ca8\\u0cbf\\u0cb0\\u0ccd\\u0cae\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0c9a\\u0cb2\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                        \"executedSuccessfully\": \"\\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf\\u0c97\\u0ca4\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"failed\": \"\\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"feedbackUpdated\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6 \\u0ca8\\u0cb5\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"updating\": \"\\u0ca8\\u0cb5\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cab\\u0cc8\\u0cb2\\u0ccd \\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cac\\u0cbf\\u0ca1\\u0cbf\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"cancelledUploadOf\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0c97\\u0cca\\u0c82\\u0ca1\\u0cbf\\u0ca6\\u0cc6\",\n                    \"couldNotReachServer\": \"\\u0cb8\\u0cb0\\u0ccd\\u0cb5\\u0cb0\\u0ccd \\u0ca4\\u0cb2\\u0cc1\\u0caa\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbe\\u0c97\\u0cb2\\u0cbf\\u0cb2\\u0ccd\\u0cb2\",\n                    \"continuingChat\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0caf\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3 \\u0cab\\u0cb2\\u0c95\",\n                    \"reset\": \"\\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cbf\",\n                    \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                    \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0c8e\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc2\",\n                            \"feedbackPositive\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0ca7\\u0ca8\\u0cbe\\u0ca4\\u0ccd\\u0cae\\u0c95\",\n                            \"feedbackNegative\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0ca8\\u0c95\\u0cbe\\u0cb0\\u0cbe\\u0ca4\\u0ccd\\u0cae\\u0c95\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0cb9\\u0cc1\\u0ca1\\u0cc1\\u0c95\\u0cc1\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0c87\\u0ca6\\u0cc1 \\u0ca5\\u0ccd\\u0cb0\\u0cc6\\u0ca1\\u0ccd \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0c85\\u0ca6\\u0cb0 \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0c85\\u0c82\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\",\n                        \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                        \"deletingChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                        \"chatDeleted\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c97\\u0cb3\\u0cc1\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0c96\\u0cbe\\u0cb2\\u0cbf...\",\n                        \"today\": \"\\u0c87\\u0c82\\u0ca6\\u0cc1\",\n                        \"yesterday\": \"\\u0ca8\\u0cbf\\u0ca8\\u0ccd\\u0ca8\\u0cc6\",\n                        \"previous7days\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 7 \\u0ca6\\u0cbf\\u0ca8\\u0c97\\u0cb3\\u0cc1\",\n                        \"previous30days\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 30 \\u0ca6\\u0cbf\\u0ca8\\u0c97\\u0cb3\\u0cc1\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0cb8\\u0cc8\\u0ca1\\u0ccd \\u0cac\\u0cbe\\u0cb0\\u0ccd \\u0cae\\u0cc1\\u0c9a\\u0ccd\\u0c9a\\u0cc1\",\n                        \"openSidebar\": \"\\u0cb8\\u0cc8\\u0ca1\\u0ccd \\u0cac\\u0cbe\\u0cb0\\u0ccd \\u0ca4\\u0cc6\\u0cb0\\u0cc6\\u0caf\\u0cbf\\u0cb0\\u0cbf\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c97\\u0cc6 \\u0cb9\\u0cbf\\u0c82\\u0ca4\\u0cbf\\u0cb0\\u0cc1\\u0c97\\u0cbf\",\n                    \"chatCreatedOn\": \"\\u0c88 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c88 \\u0ca8\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cb0\\u0c9a\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0caa\\u0cc2\\u0cb0\\u0cc8\\u0c95\\u0cc6\\u0ca6\\u0cbe\\u0cb0\\u0cb0\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c95\\u0cb0\\u0cc6\\u0ca4\\u0cb0\\u0cb2\\u0cc1 \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c89\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n            \"requiredApiKeys\": \"\\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 API \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1\",\n            \"requiredApiKeysInfo\": \"\\u0c88 \\u0c85\\u0caa\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cac\\u0cb3\\u0cb8\\u0cb2\\u0cc1, \\u0c88 \\u0c95\\u0cc6\\u0cb3\\u0c97\\u0cbf\\u0ca8 \\u0c8e\\u0caa\\u0cbf\\u0c90 \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1 \\u0cac\\u0cc7\\u0c95\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cb5\\u0cc6. \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0cbe\\u0ca7\\u0ca8\\u0ca6 \\u0cb8\\u0ccd\\u0ca5\\u0cb3\\u0cc0\\u0caf \\u0cb8\\u0c82\\u0c97\\u0ccd\\u0cb0\\u0cb9\\u0ca3\\u0cc6\\u0caf\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cb8\\u0c82\\u0c97\\u0ccd\\u0cb0\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0c88 \\u0caf\\u0ccb\\u0c9c\\u0ca8\\u0cc6\\u0caf \\u0cad\\u0cbe\\u0c97\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0caa\\u0cc1\\u0ca8\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cbf\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/ml.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23\\u0d19\\u0d4d\\u0d19\\u0d7e\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0d15\\u0d40\\u0d15\\u0d7e\",\n                        \"logout\": \"\\u0d32\\u0d4b\\u0d17\\u0d4b\\u0d1f\\u0d4d\\u0d1f\\u0d4d\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0d1f\\u0d3e\\u0d38\\u0d4d\\u0d15\\u0d4d \\u0d32\\u0d3f\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n                    \"loading\": \"\\u0d32\\u0d4b\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d...\",\n                    \"error\": \"\\u0d12\\u0d30\\u0d41 \\u0d2a\\u0d3f\\u0d36\\u0d15\\u0d4d \\u0d38\\u0d02\\u0d2d\\u0d35\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d31\\u0d26\\u0d4d\\u0d26\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"removeAttachment\": \"\\u0d05\\u0d31\\u0d4d\\u0d31\\u0d3e\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2e\\u0d46\\u0d28\\u0d4d\\u0d31\\u0d4d \\u0d28\\u0d40\\u0d15\\u0d4d\\u0d15\\u0d02\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d09\\u0d23\\u0d4d\\u0d1f\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d23\\u0d4b?\",\n                \"clearChat\": \"\\u0d07\\u0d24\\u0d4d \\u0d28\\u0d3f\\u0d32\\u0d35\\u0d3f\\u0d32\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d15\\u0d4d\\u0d32\\u0d3f\\u0d2f\\u0d7c \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\\u0d2f\\u0d41\\u0d02 \\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d06\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\\u0d2f\\u0d41\\u0d02 \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d02.\",\n                \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23\\u0d19\\u0d4d\\u0d19\\u0d7e\",\n                \"expandMessages\": \"\\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d35\\u0d3f\\u0d15\\u0d38\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"hideChainOfThought\": \"\\u0d1a\\u0d3f\\u0d28\\u0d4d\\u0d24\\u0d2f\\u0d41\\u0d1f\\u0d46 \\u0d36\\u0d43\\u0d02\\u0d16\\u0d32 \\u0d2e\\u0d31\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"darkMode\": \"\\u0d21\\u0d3e\\u0d7c\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d2e\\u0d4b\\u0d21\\u0d4d\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d02\",\n                \"running\": \"\\u0d13\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\",\n                \"took_one\": \"{{count}} \\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d46\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d0e\\u0d1f\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d41\",\n                \"took_other\": \"{{count}} \\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d46\\u0d2a\\u0d4d\\u0d2a\\u0d41\\u0d15\\u0d7e \\u0d0e\\u0d1f\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d41\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d37\\u0d7b \\u0d06\\u0d15\\u0d4d\\u0d38\\u0d38\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d32\\u0d4b\\u0d17\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                    \"form\": {\n                        \"email\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02\",\n                        \"password\": \"Password\",\n                        \"noAccount\": \"\\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d47?\",\n                        \"alreadyHaveAccount\": \"\\u0d12\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d23\\u0d4d\\u0d1f\\u0d4b?\",\n                        \"signup\": \"\\u0d38\\u0d48\\u0d7b \\u0d05\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\",\n                        \"signin\": \"\\u0d38\\u0d48\\u0d7b \\u0d07\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\",\n                        \"or\": \"\\u0d05\\u0d32\\u0d4d\\u0d32\\u0d46\\u0d19\\u0d4d\\u0d15\\u0d3f\\u0d7d\",\n                        \"continue\": \"\\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                        \"forgotPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2e\\u0d31\\u0d28\\u0d4d\\u0d28\\u0d4b?\",\n                        \"passwordMustContain\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d3f\\u0d7d \\u0d07\\u0d28\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d31\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d35 \\u0d05\\u0d1f\\u0d19\\u0d4d\\u0d19\\u0d3f\\u0d2f\\u0d3f\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d23\\u0d02:\",\n                        \"emailRequired\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                        \"passwordRequired\": \"Password \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0d38\\u0d48\\u0d28\\u0d4d \\u0d07\\u0d28\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d28\\u0d4d \\u0d15\\u0d34\\u0d3f\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"signin\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthsignin\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"redirect_uri_mismatch\": \"\\u0d31\\u0d40\\u0d21\\u0d2f\\u0d31\\u0d15\\u0d4d\\u0d1f\\u0d4d \\u0d2f\\u0d41\\u0d06\\u0d7c\\u0d10 \\u0d13\\u0d24\\u0d4d\\u0d24\\u0d4d \\u0d06\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d15\\u0d4b\\u0d7a\\u0d2b\\u0d3f\\u0d17\\u0d31\\u0d47\\u0d37\\u0d28\\u0d41\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d2a\\u0d4a\\u0d30\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"oauthcallbackerror\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthcreateaccount\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"emailcreateaccount\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"callback\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthaccountnotlinked\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d10\\u0d21\\u0d28\\u0d4d\\u0d31\\u0d3f\\u0d31\\u0d4d\\u0d31\\u0d3f \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d, \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d06\\u0d26\\u0d4d\\u0d2f\\u0d02 \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a \\u0d05\\u0d24\\u0d47 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                        \"emailsignin\": \"\\u0d07-\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d1e\\u0d4d\\u0d1e\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"emailverify\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15, \\u0d12\\u0d30\\u0d41 \\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d23\\u0d4d\\u0d1f\\u0d4d.\",\n                        \"credentialssignin\": \"\\u0d38\\u0d48\\u0d7b \\u0d07\\u0d7b \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41. \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d28\\u0d7d\\u0d15\\u0d3f\\u0d2f \\u0d35\\u0d3f\\u0d36\\u0d26\\u0d3e\\u0d02\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d36\\u0d30\\u0d3f\\u0d2f\\u0d3e\\u0d23\\u0d4b \\u0d0e\\u0d28\\u0d4d\\u0d28\\u0d4d \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"sessionrequired\": \"\\u0d08 \\u0d2a\\u0d47\\u0d1c\\u0d4d \\u0d06\\u0d15\\u0d4d\\u0d38\\u0d38\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d \\u0d26\\u0d2f\\u0d35\\u0d3e\\u0d2f\\u0d3f \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d3f\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d0e\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d31\\u0d3e\\u0d2f\\u0d3f! \\u0d1e\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d12\\u0d30\\u0d41 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d23\\u0d4d\\u0d1f\\u0d4d \",\n                    \"verifyEmailLink\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d38\\u0d48\\u0d28\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d2a\\u0d42\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d2f\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d7b \\u0d06 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d32\\u0d3f\\u0d32\\u0d46 \\u0d32\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d3f\\u0d7d \\u0d15\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                    \"didNotReceive\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d15\\u0d23\\u0d4d\\u0d1f\\u0d46\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32\\u0d47?\",\n                    \"resendEmail\": \"Email \\u0d35\\u0d40\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"goBack\": \"\\u0d24\\u0d3f\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2a\\u0d4b\\u0d15\\u0d42\",\n                    \"emailSent\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d41.\",\n                    \"verifyEmail\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                    \"signup\": \"{{provider}} \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d7b \\u0d05\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                    \"passwordsMustMatch\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d41\\u0d15\\u0d7e \\u0d2a\\u0d4a\\u0d30\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d23\\u0d02\",\n                    \"confirmPasswordRequired\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d23\\u0d4d\\u0d1f\\u0d24\\u0d4d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d23\\u0d4d\",\n                    \"newPassword\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d\",\n                    \"confirmPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"resetPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02\",\n                    \"emailRequired\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                    \"emailSent\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d28\\u0d3f\\u0d7c\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d2f\\u0d3f {{email}} \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                    \"enterEmail\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d28\\u0d7d\\u0d15\\u0d41\\u0d15, \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d28\\u0d3f\\u0d7c\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d1e\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d02.\",\n                    \"resendEmail\": \"Email \\u0d35\\u0d40\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"continue\": \"\\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                    \"goBack\": \"\\u0d24\\u0d3f\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2a\\u0d4b\\u0d15\\u0d42\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0d1a\\u0d30\\u0d3f\\u0d24\\u0d4d\\u0d30\\u0d02 \\u0d15\\u0d3e\\u0d23\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"lastInputs\": \"\\u0d05\\u0d35\\u0d38\\u0d3e\\u0d28 \\u0d07\\u0d7b\\u0d2a\\u0d41\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d15\\u0d7e\",\n                        \"noInputs\": \"\\u0d36\\u0d42\\u0d28\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f...\",\n                        \"loading\": \"\\u0d32\\u0d4b\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d02 \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d1f\\u0d48\\u0d2a\\u0d4d\\u0d2a\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0d31\\u0d46\\u0d15\\u0d4d\\u0d15\\u0d4b\\u0d7c\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d \\u0d06\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"stop\": \"\\u0d31\\u0d46\\u0d15\\u0d4d\\u0d15\\u0d4b\\u0d7c\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d \\u0d28\\u0d3f\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d41\\u0d15\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"stopTask\": \"\\u0d1c\\u0d4b\\u0d32\\u0d3f \\u0d28\\u0d3f\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d41\\u0d15\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0d2b\\u0d2f\\u0d32\\u0d41\\u0d15\\u0d7e \\u0d05\\u0d31\\u0d4d\\u0d31\\u0d3e\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0d28\\u0d3f\\u0d7c\\u0d2e\\u0d4d\\u0d2e\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d24\\u0d4d\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0d13\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\",\n                        \"executedSuccessfully\": \"\\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d28\\u0d1f\\u0d2a\\u0d4d\\u0d2a\\u0d3f\\u0d32\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3f\",\n                        \"failed\": \"\\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41\",\n                        \"feedbackUpdated\": \"\\u0d2b\\u0d40\\u0d21\\u0d4d\\u0d2c\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d05\\u0d2a\\u0d4d \\u0d21\\u0d47\\u0d31\\u0d4d\\u0d31\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d \\u0d24\\u0d41\",\n                        \"updating\": \"\\u0d05\\u0d2a\\u0d4d \\u0d21\\u0d47\\u0d31\\u0d4d\\u0d31\\u0d4d\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2b\\u0d2f\\u0d32\\u0d41\\u0d15\\u0d7e \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d07\\u0d1f\\u0d41\\u0d15\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0d05\\u0d2a\\u0d4d \\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41\",\n                    \"cancelledUploadOf\": \"\\u0d05\\u0d2a\\u0d4d \\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d31\\u0d26\\u0d4d\\u0d26\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3f\",\n                    \"couldNotReachServer\": \"\\u0d38\\u0d46\\u0d7c\\u0d35\\u0d31\\u0d3f\\u0d7d \\u0d0e\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d1e\\u0d4d\\u0d1e\\u0d3f\\u0d32\\u0d4d\\u0d32\",\n                    \"continuingChat\": \"\\u0d2e\\u0d41\\u0d2e\\u0d4d\\u0d2a\\u0d24\\u0d4d\\u0d24\\u0d46 \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23 \\u0d2a\\u0d3e\\u0d28\\u0d7d\",\n                    \"reset\": \"\\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                    \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"Feedback: \\u0d0e\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d02\",\n                            \"feedbackPositive\": \"Feedback: \\u0d2a\\u0d4b\\u0d38\\u0d3f\\u0d31\\u0d4d\\u0d31\\u0d40\\u0d35\\u0d4d\",\n                            \"feedbackNegative\": \"Feedback: \\u0d28\\u0d46\\u0d17\\u0d31\\u0d4d\\u0d31\\u0d40\\u0d35\\u0d4d\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0d24\\u0d3f\\u0d30\\u0d2f\\u0d41\\u0d15\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0d07\\u0d24\\u0d4d \\u0d24\\u0d4d\\u0d30\\u0d46\\u0d21\\u0d41\\u0d02 \\u0d05\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d02 \\u0d18\\u0d1f\\u0d15\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d02 \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d02.\",\n                        \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                        \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"deletingChat\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d7d\",\n                        \"chatDeleted\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d28\\u0d40\\u0d15\\u0d4d\\u0d15\\u0d02 \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d24\\u0d41\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"Past Chats\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0d36\\u0d42\\u0d28\\u0d4d\\u0d2f\\u0d02...\",\n                        \"today\": \"\\u0d07\\u0d28\\u0d4d\\u0d28\\u0d4d\",\n                        \"yesterday\": \"\\u0d07\\u0d28\\u0d4d\\u0d28\\u0d32\\u0d46\",\n                        \"previous7days\": \"Previous 7 \\u0d26\\u0d3f\\u0d35\\u0d38\\u0d02\",\n                        \"previous30days\": \"Previous 30 \\u0d26\\u0d3f\\u0d35\\u0d38\\u0d02\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0d38\\u0d48\\u0d21\\u0d4d \\u0d2c\\u0d3e\\u0d7c \\u0d05\\u0d1f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"openSidebar\": \"\\u0d38\\u0d48\\u0d21\\u0d4d \\u0d2c\\u0d3e\\u0d7c \\u0d24\\u0d41\\u0d31\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d3f\\u0d32\\u0d47\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d2e\\u0d1f\\u0d19\\u0d4d\\u0d19\\u0d41\\u0d15\",\n                    \"chatCreatedOn\": \"\\u0d08 \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d38\\u0d43\\u0d37\\u0d4d\\u0d1f\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0d38\\u0d02\\u0d2d\\u0d3e\\u0d37\\u0d23\\u0d02\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0d26\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d33\\u0d46 \\u0d15\\u0d4a\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d35\\u0d30\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d38\\u0d02\\u0d30\\u0d15\\u0d4d\\u0d37\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\",\n            \"requiredApiKeys\": \"\\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 API \\u0d15\\u0d40\\u0d15\\u0d7e\",\n            \"requiredApiKeysInfo\": \"\\u0d08 \\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d37\\u0d7b \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d, \\u0d07\\u0d28\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d31\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28 \\u0d0e\\u0d2a\\u0d3f\\u0d10 \\u0d15\\u0d40\\u0d15\\u0d7e \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d23\\u0d4d. \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d09\\u0d2a\\u0d15\\u0d30\\u0d23\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46 \\u0d2a\\u0d4d\\u0d30\\u0d3e\\u0d26\\u0d47\\u0d36\\u0d3f\\u0d15 \\u0d38\\u0d02\\u0d2d\\u0d30\\u0d23\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d32\\u0d3e\\u0d23\\u0d4d \\u0d15\\u0d40\\u0d15\\u0d7e \\u0d38\\u0d02\\u0d2d\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d4d.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d08 \\u0d2a\\u0d26\\u0d4d\\u0d27\\u0d24\\u0d3f\\u0d2f\\u0d41\\u0d1f\\u0d46 \\u0d2d\\u0d3e\\u0d17\\u0d2e\\u0d32\\u0d4d\\u0d32.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0d38\\u0d02\\u0d2d\\u0d3e\\u0d37\\u0d23\\u0d02 \\u0d2a\\u0d41\\u0d28\\u0d30\\u0d3e\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/mr.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"\\u090f\\u092a\\u0940\\u0906\\u092f \\u0915\\u0940\\u091c\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0928\\u0935\\u0940\\u0928 \\u0917\\u092a\\u094d\\u092a\\u093e\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0915\\u093e\\u0930\\u094d\\u092f \\u0938\\u0942\\u091a\\u0940\",\n                    \"loading\": \"\\u0932\\u094b\\u0921\\u093f\\u0902\\u0917...\",\n                    \"error\": \"\\u090f\\u0915 \\u0924\\u094d\\u0930\\u0941\\u091f\\u0940 \\u091d\\u093e\\u0932\\u0940\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                \"removeAttachment\": \"\\u0938\\u0902\\u0932\\u0917\\u094d\\u0928\\u0924\\u093e \\u0915\\u093e\\u0922\\u0942\\u0928 \\u091f\\u093e\\u0915\\u093e\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0928\\u0935\\u0940\\u0928 \\u091a\\u0945\\u091f \\u0924\\u092f\\u093e\\u0930 \\u0915\\u0930\\u093e?\",\n                \"clearChat\": \"\\u092f\\u093e\\u092e\\u0941\\u0933\\u0947 \\u0938\\u0927\\u094d\\u092f\\u093e\\u091a\\u0947 \\u092e\\u0947\\u0938\\u0947\\u091c \\u0915\\u094d\\u0932\\u093f\\u0905\\u0930 \\u0939\\u094b\\u0924\\u0940\\u0932 \\u0906\\u0923\\u093f \\u0928\\u0935\\u0940\\u0928 \\u091a\\u0945\\u091f \\u0938\\u0941\\u0930\\u0942 \\u0939\\u094b\\u0908\\u0932.\",\n                \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                \"expandMessages\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u093e\\u0902\\u091a\\u093e \\u0935\\u093f\\u0938\\u094d\\u0924\\u093e\\u0930 \\u0915\\u0930\\u093e\",\n                \"hideChainOfThought\": \"\\u0935\\u093f\\u091a\\u093e\\u0930\\u093e\\u0902\\u091a\\u0940 \\u0938\\u093e\\u0916\\u0933\\u0940 \\u0932\\u092a\\u0935\\u093e\",\n                \"darkMode\": \"\\u0921\\u093e\\u0930\\u094d\\u0915 \\u092e\\u094b\\u0921\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0935\\u093e\\u092a\\u0930\\u0924\",\n                \"running\": \"\\u0927\\u093e\\u0935\\u0924 \\u0906\\u0939\\u0947.\",\n                \"took_one\": \"{{count}} \\u092a\\u093e\\u090a\\u0932 \\u0909\\u091a\\u0932\\u0932\\u0947\",\n                \"took_other\": \"{{count}} \\u092a\\u093e\\u0935\\u0932\\u0947 \\u0909\\u091a\\u0932\\u0932\\u0940\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0905 \\u0945\\u092a\\u092e\\u0927\\u094d\\u092f\\u0947 \\u092a\\u094d\\u0930\\u0935\\u0947\\u0936 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0932\\u0949\\u0917\\u093f\\u0928 \\u0915\\u0930\\u093e.\",\n                    \"form\": {\n                        \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e\",\n                        \"password\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                        \"noAccount\": \"\\u0916\\u093e\\u0924\\u0947 \\u0928\\u093e\\u0939\\u0940 \\u0915\\u093e?\",\n                        \"alreadyHaveAccount\": \"\\u0906\\u0927\\u0940\\u091a \\u0916\\u093e\\u0924\\u0947 \\u0906\\u0939\\u0947 \\u0915\\u093e?\",\n                        \"signup\": \"\\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u093e\",\n                        \"signin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928\",\n                        \"or\": \"\\u0915\\u093f\\u0902\\u0935\\u093e\",\n                        \"continue\": \"\\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                        \"forgotPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0935\\u093f\\u0938\\u0930\\u0932\\u093e?\",\n                        \"passwordMustContain\": \"\\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\\u092e\\u0927\\u094d\\u092f\\u0947 \\u0939\\u0947 \\u0905\\u0938\\u0923\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947:\",\n                        \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                        \"passwordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938 \\u0905\\u0915\\u094d\\u0937\\u092e.\",\n                        \"signin\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthsignin\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"redirect_uri_mismatch\": \"\\u0930\\u093f\\u0921\\u093e\\u092f\\u0930\\u0947\\u0915\\u094d\\u091f \\u092f\\u0942\\u0906\\u0930\\u0906\\u092f \\u0911\\u0925 \\u0905\\u0945\\u092a \\u0915\\u0949\\u0928\\u094d\\u092b\\u093f\\u0917\\u0930\\u0947\\u0936\\u0928\\u0936\\u0940 \\u091c\\u0941\\u0933\\u0924 \\u0928\\u093e\\u0939\\u0940.\",\n                        \"oauthcallbackerror\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthcreateaccount\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"emailcreateaccount\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"callback\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthaccountnotlinked\": \"\\u0906\\u092a\\u0932\\u0940 \\u0913\\u0933\\u0916 \\u0928\\u093f\\u0936\\u094d\\u091a\\u093f\\u0924 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940, \\u0906\\u092a\\u0923 \\u092e\\u0942\\u0933\\u0935\\u093e\\u092a\\u0930\\u0932\\u0947\\u0932\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"emailsignin\": \"\\u0908-\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u0924\\u093e \\u0906\\u0932\\u093e \\u0928\\u093e\\u0939\\u0940.\",\n                        \"emailverify\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932\\u091a\\u0940 \\u092a\\u0921\\u0924\\u093e\\u0933\\u0923\\u0940 \\u0915\\u0930\\u093e, \\u090f\\u0915 \\u0928\\u0935\\u0940\\u0928 \\u0908\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u093f\\u0932\\u093e \\u0917\\u0947\\u0932\\u093e \\u0906\\u0939\\u0947.\",\n                        \"credentialssignin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0905\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940 \\u091d\\u093e\\u0932\\u0947. \\u0906\\u092a\\u0923 \\u0926\\u093f\\u0932\\u0947\\u0932\\u093e \\u0924\\u092a\\u0936\\u0940\\u0932 \\u092f\\u094b\\u0917\\u094d\\u092f \\u0906\\u0939\\u0947 \\u0939\\u0947 \\u0924\\u092a\\u093e\\u0938\\u093e.\",\n                        \"sessionrequired\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u092f\\u093e \\u092a\\u0943\\u0937\\u094d\\u0920\\u093e\\u0935\\u0930 \\u092a\\u094d\\u0930\\u0935\\u0947\\u0936 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u093e.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0924\\u0942 \\u091c\\u0935\\u0933\\u091c\\u0935\\u0933 \\u0924\\u093f\\u0925\\u0947\\u091a \\u0906\\u0939\\u0947\\u0938! \\u0906\\u092e\\u094d\\u0939\\u0940 \\u090f\\u0915 \\u0908\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u0932\\u093e \\u0906\\u0939\\u0947. \",\n                    \"verifyEmailLink\": \"\\u0906\\u092a\\u0932\\u0947 \\u0938\\u093e\\u0907\\u0928\\u0905\\u092a \\u092a\\u0942\\u0930\\u094d\\u0923 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0915\\u0943\\u092a\\u092f\\u093e \\u0924\\u094d\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932\\u092e\\u0927\\u0940\\u0932 \\u0932\\u093f\\u0902\\u0915\\u0935\\u0930 \\u0915\\u094d\\u0932\\u093f\\u0915 \\u0915\\u0930\\u093e.\",\n                    \"didNotReceive\": \"\\u0908\\u092e\\u0947\\u0932 \\u0938\\u093e\\u092a\\u0921\\u0924 \\u0928\\u093e\\u0939\\u0940 \\u0915\\u093e?\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                    \"goBack\": \"\\u092a\\u0930\\u0924 \\u091c\\u093e\",\n                    \"emailSent\": \"\\u0908\\u092e\\u0947\\u0932 \\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u092a\\u093e\\u0920\\u0935\\u093f\\u0932\\u093e.\",\n                    \"verifyEmail\": \"\\u0906\\u092a\\u0932\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e \\u092a\\u0921\\u0924\\u093e\\u0933\\u0942\\u0928 \\u092a\\u0939\\u093e\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                    \"signup\": \"{{provider}} \\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u093e\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0928\\u0935\\u0940\\u0928 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0939\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                    \"passwordsMustMatch\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u091c\\u0941\\u0933\\u0923\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947\",\n                    \"confirmPasswordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947 \\u092f\\u093e\\u091a\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                    \"newPassword\": \"\\u0928\\u0935\\u0940\\u0928 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                    \"confirmPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u091a\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                    \"resetPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u093e\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e\",\n                    \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                    \"emailSent\": \"\\u0906\\u092a\\u0932\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u094d\\u092f\\u093e \\u0938\\u0942\\u091a\\u0928\\u093e\\u0902\\u0938\\u093e\\u0920\\u0940 \\u0915\\u0943\\u092a\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e {{email}} \\u0924\\u092a\\u093e\\u0938\\u093e.\",\n                    \"enterEmail\": \"\\u0906\\u092a\\u0932\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e \\u092a\\u094d\\u0930\\u0935\\u093f\\u0937\\u094d\\u091f \\u0915\\u0930\\u093e \\u0906\\u0923\\u093f \\u0906\\u092e\\u094d\\u0939\\u0940 \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e\\u0932\\u093e \\u0906\\u092a\\u0932\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u094d\\u092f\\u093e \\u0938\\u0942\\u091a\\u0928\\u093e \\u092a\\u093e\\u0920\\u0935\\u0942.\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                    \"continue\": \"\\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                    \"goBack\": \"\\u092a\\u0930\\u0924 \\u091c\\u093e\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0907\\u0924\\u093f\\u0939\\u093e\\u0938 \\u0926\\u093e\\u0916\\u0935\\u093e\",\n                        \"lastInputs\": \"\\u0936\\u0947\\u0935\\u091f\\u091a\\u0940 \\u092e\\u093e\\u0939\\u093f\\u0924\\u0940\",\n                        \"noInputs\": \"\\u0907\\u0924\\u0915\\u0940 \\u0930\\u093f\\u0915\\u093e\\u092e\\u0940...\",\n                        \"loading\": \"\\u0932\\u094b\\u0921\\u093f\\u0902\\u0917...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0924\\u0941\\u092e\\u091a\\u093e \\u092e\\u0947\\u0938\\u0947\\u091c \\u0907\\u0925\\u0947 \\u091f\\u093e\\u0908\\u092a \\u0915\\u0930\\u093e...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0930\\u0947\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0938\\u0941\\u0930\\u0942 \\u0915\\u0930\\u093e\",\n                        \"stop\": \"\\u0930\\u0947\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0925\\u093e\\u0902\\u092c\\u0935\\u093e\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                        \"stopTask\": \"\\u0915\\u093e\\u0930\\u094d\\u092f \\u0925\\u093e\\u0902\\u092c\\u0935\\u093e\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u092b\\u093e\\u0908\\u0932\\u094d\\u0938 \\u0938\\u0902\\u0932\\u0917\\u094d\\u0928 \\u0915\\u0930\\u093e\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u092f\\u093e\\u0938\\u0939 \\u092c\\u093e\\u0902\\u0927\\u0932\\u0947 \\u0906\\u0939\\u0947\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0927\\u093e\\u0935\\u0924 \\u0906\\u0939\\u0947.\",\n                        \"executedSuccessfully\": \"\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u0930\\u093e\\u092c\\u0935\\u093f\\u0932\\u0940\",\n                        \"failed\": \"\\u0905\\u092a\\u092f\\u0936\\u0940 \\u0920\\u0930\\u0932\\u0947\",\n                        \"feedbackUpdated\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f \\u0905\\u0926\\u094d\\u092f\\u092f\\u093e\\u0935\\u0924\",\n                        \"updating\": \"\\u0905\\u0926\\u094d\\u092f\\u092f\\u093e\\u0935\\u0924 \\u0915\\u0930\\u0923\\u0947\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u092b\\u093e\\u092f\\u0932\\u0940 \\u092f\\u0947\\u0925\\u0947 \\u091f\\u093e\\u0915\\u093e\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0905\\u092a\\u092f\\u0936 \\u0906\\u0932\\u0947\",\n                    \"cancelledUploadOf\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0947\\u0932\\u0947\\u0932\\u0947 \\u0905\\u092a\\u0932\\u094b\\u0921\",\n                    \"couldNotReachServer\": \"\\u0938\\u0930\\u094d\\u0935\\u094d\\u0939\\u0930\\u092a\\u0930\\u094d\\u092f\\u0902\\u0924 \\u092a\\u094b\\u0939\\u094b\\u091a\\u0942 \\u0936\\u0915\\u0932\\u0947 \\u0928\\u093e\\u0939\\u0940\",\n                    \"continuingChat\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0917\\u092a\\u094d\\u092a\\u093e \\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938 \\u092a\\u0945\\u0928\\u0947\\u0932\",\n                    \"reset\": \"\\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u093e\",\n                    \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                    \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0938\\u0930\\u094d\\u0935\",\n                            \"feedbackPositive\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0938\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\",\n                            \"feedbackNegative\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0928\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0936\\u094b\\u0927\\u0923\\u0947\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0939\\u0947 \\u0927\\u093e\\u0917\\u093e \\u0924\\u0938\\u0947\\u091a \\u0924\\u094d\\u092f\\u093e\\u0924\\u0940\\u0932 \\u0938\\u0902\\u0926\\u0947\\u0936 \\u0906\\u0923\\u093f \\u0918\\u091f\\u0915 \\u0921\\u093f\\u0932\\u0940\\u091f \\u0915\\u0930\\u0947\\u0932.\",\n                        \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                        \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                        \"deletingChat\": \"\\u091a\\u0945\\u091f \\u0921\\u093f\\u0932\\u0940\\u091f \\u0915\\u0930\\u0923\\u0947\",\n                        \"chatDeleted\": \"\\u091a\\u0945\\u091f \\u0921\\u093f\\u0932\\u0940\\u091f\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0917\\u092a\\u094d\\u092a\\u093e\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0930\\u093f\\u0915\\u094d\\u0924\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0906\\u091c\",\n                        \"yesterday\": \"\\u0915\\u093e\\u0932\",\n                        \"previous7days\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 7 \\u0926\\u093f\\u0935\\u0938\",\n                        \"previous30days\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0969\\u0966 \\u0926\\u093f\\u0935\\u0938\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u093e\",\n                        \"openSidebar\": \"\\u0913\\u092a\\u0928 \\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u092a\\u0930\\u0924 \\u0917\\u092a\\u094d\\u092a\\u093e \\u092e\\u093e\\u0930\\u093e\\u092f\\u0932\\u093e \\u091c\\u093e\",\n                    \"chatCreatedOn\": \"\\u0939\\u0947 \\u091a\\u0945\\u091f \\u0924\\u092f\\u093e\\u0930 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0906\\u0932\\u0947 \\u0939\\u094b\\u0924\\u0947.\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u092c\\u0915\\u0935\\u093e\\u0926 \\u0915\\u0930\\u0923\\u0947\\u0902\",\n                \"readme\": \"\\u0935\\u093e\\u091a\\u093e\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u092a\\u094d\\u0930\\u0926\\u093e\\u0924\\u094d\\u092f\\u093e\\u0902\\u0928\\u093e \\u0906\\u0923\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0905\\u092a\\u092f\\u0936\\u0940:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u0935\\u093e\\u091a\\u0935\\u0932\\u0947\",\n            \"requiredApiKeys\": \"\\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u090f\\u092a\\u0940\\u0906\\u092f \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e\",\n            \"requiredApiKeysInfo\": \"\\u0939\\u0947 \\u0905\\u0945\\u092a \\u0935\\u093e\\u092a\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0916\\u093e\\u0932\\u0940\\u0932 \\u090f\\u092a\\u0940\\u0906\\u092f \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947\\u0924. \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u0921\\u093f\\u0935\\u094d\\u0939\\u093e\\u0907\\u0938\\u091a\\u094d\\u092f\\u093e \\u0938\\u094d\\u0925\\u093e\\u0928\\u093f\\u0915 \\u0938\\u094d\\u091f\\u094b\\u0930\\u0947\\u091c\\u0935\\u0930 \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u093f\\u0924 \\u0915\\u0947\\u0932\\u094d\\u092f\\u093e \\u091c\\u093e\\u0924\\u093e\\u0924.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0924\\u0941\\u092e\\u094d\\u0939\\u0940 \\u092f\\u093e \\u092a\\u094d\\u0930\\u0915\\u0932\\u094d\\u092a\\u093e\\u091a\\u093e \\u092d\\u093e\\u0917 \\u0928\\u093e\\u0939\\u0940.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u091a\\u0945\\u091f \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u0938\\u0941\\u0930\\u0942 \\u0915\\u0930\\u093e\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/ta.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd\",\n                        \"logout\": \"\\u0bb5\\u0bc6\\u0bb3\\u0bbf\\u0baf\\u0bc7\\u0bb1\\u0bc1\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0baa\\u0ba3\\u0bbf \\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bb2\\u0bcd\",\n                    \"loading\": \"\\u0b8f\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1...\",\n                    \"error\": \"\\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0bbf\\u0bb4\\u0bc8 \\u0b8f\\u0bb1\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\",\n                \"removeAttachment\": \"\\u0b87\\u0ba3\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc8 \\u0b85\\u0b95\\u0bb1\\u0bcd\\u0bb1\\u0bc1\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0b89\\u0bb0\\u0bc1\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bbe?\",\n                \"clearChat\": \"\\u0b87\\u0ba4\\u0bc1 \\u0ba4\\u0bb1\\u0bcd\\u0baa\\u0bcb\\u0ba4\\u0bc8\\u0baf \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0b85\\u0bb4\\u0bbf\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8\\u0ba4\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bc1\\u0bae\\u0bcd.\",\n                \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                \"expandMessages\": \"\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0bb5\\u0bbf\\u0bb0\\u0bbf\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0bc1\",\n                \"hideChainOfThought\": \"\\u0b9a\\u0bbf\\u0ba8\\u0bcd\\u0ba4\\u0ba9\\u0bc8\\u0b9a\\u0bcd \\u0b9a\\u0b99\\u0bcd\\u0b95\\u0bbf\\u0bb2\\u0bbf\\u0baf\\u0bc8 \\u0bae\\u0bb1\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                \"darkMode\": \"\\u0b87\\u0bb0\\u0bc1\\u0ba3\\u0bcd\\u0b9f \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0bae\\u0bc1\\u0bb1\\u0bc8\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbf\",\n                \"running\": \"\\u0b93\\u0b9f\\u0bc1\\u0ba4\\u0bb2\\u0bcd\",\n                \"took_one\": \"{{count}} \\u0b85\\u0b9f\\u0bbf \\u0b8e\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0bb5\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bbe\\u0bb0\\u0bcd\",\n                \"took_other\": \"{{count}} \\u0baa\\u0b9f\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0b8e\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbe\\u0bb0\\u0bcd\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0b85\\u0ba3\\u0bc1\\u0b95 \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0b95.\",\n                    \"form\": {\n                        \"email\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\",\n                        \"password\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\",\n                        \"noAccount\": \"\\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b87\\u0bb2\\u0bcd\\u0bb2\\u0bc8\\u0baf\\u0bbe?\",\n                        \"alreadyHaveAccount\": \"\\u0b8f\\u0bb1\\u0bcd\\u0b95\\u0ba9\\u0bb5\\u0bc7 \\u0b92\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0ba4\\u0bbe?\",\n                        \"signup\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1\\u0baa\\u0bc6\\u0bb1\\u0bc1\",\n                        \"signin\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0b95\",\n                        \"or\": \"\\u0b85\\u0bb2\\u0bcd\\u0bb2\\u0ba4\\u0bc1\",\n                        \"continue\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bcd\",\n                        \"forgotPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bb1\\u0ba8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0bc0\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bbe?\",\n                        \"passwordMustContain\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0b87\\u0bb5\\u0bc8 \\u0b87\\u0bb0\\u0bc1\\u0b95\\u0bcd\\u0b95 \\u0bb5\\u0bc7\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd:\",\n                        \"emailRequired\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                        \"passwordRequired\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0b87\\u0baf\\u0bb2\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"signin\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthsignin\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"redirect_uri_mismatch\": \"\\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bbe\\u0bb1\\u0bcd\\u0bb1\\u0bc1 URI oauth \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc1 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bae\\u0bc8\\u0bb5\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0baa\\u0bca\\u0bb0\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"oauthcallbackerror\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthcreateaccount\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"emailcreateaccount\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"callback\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthaccountnotlinked\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b85\\u0b9f\\u0bc8\\u0baf\\u0bbe\\u0bb3\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4, \\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bc1\\u0ba4\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0ba4\\u0bc7 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"emailsignin\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa \\u0b87\\u0baf\\u0bb2\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"emailverify\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd, \\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1.\",\n                        \"credentialssignin\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0bb5\\u0bc1 \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\\u0baf\\u0bc1\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bc1. \\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bb5\\u0bb4\\u0b99\\u0bcd\\u0b95\\u0bbf\\u0baf \\u0bb5\\u0bbf\\u0bb5\\u0bb0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bb0\\u0bbf\\u0baf\\u0bbe\\u0ba9\\u0ba4\\u0bbe \\u0b8e\\u0ba9\\u0bcd\\u0bb1\\u0bc1 \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"sessionrequired\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4\\u0baa\\u0bcd \\u0baa\\u0b95\\u0bcd\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b85\\u0ba3\\u0bc1\\u0b95 \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bcd\\u0ba4\\u0b9f\\u0bcd\\u0b9f \\u0bb5\\u0ba8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0bc0\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bcd! -\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b92\\u0bb0\\u0bc1 \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0baf\\u0bc1\\u0bb3\\u0bcd\\u0bb3\\u0bcb\\u0bae\\u0bcd \",\n                    \"verifyEmailLink\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bb2\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc8\\u0bb5\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf \\u0b85\\u0ba8\\u0bcd\\u0ba4 \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0bb3 \\u0b87\\u0ba3\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0bbf\\u0bb3\\u0bbf\\u0b95\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                    \"didNotReceive\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0baa\\u0bbf\\u0b9f\\u0bbf\\u0b95\\u0bcd\\u0b95 \\u0bae\\u0bc1\\u0b9f\\u0bbf\\u0baf\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8\\u0baf\\u0bbe?\",\n                    \"resendEmail\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"goBack\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\",\n                    \"emailSent\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1.\",\n                    \"verifyEmail\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b88\\u0bae\\u0bc6\\u0baf\\u0bbf\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8\\u0b9a\\u0bcd \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"signup\": \"{{provider}} \\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0b95\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"passwordsMustMatch\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb1\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0baa\\u0bca\\u0bb0\\u0bc1\\u0ba8\\u0bcd\\u0ba4 \\u0bb5\\u0bc7\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd\",\n                    \"confirmPasswordRequired\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bb5\\u0bc1\\u0bae\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"newPassword\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\",\n                    \"confirmPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"resetPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\",\n                    \"emailRequired\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"emailSent\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0ba4\\u0bb1\\u0bcd\\u0b95\\u0bbe\\u0ba9 \\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bc1\\u0bb1\\u0bc8\\u0b95\\u0bb3\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 {{email}} \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8 \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                    \"enterEmail\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bbf\\u0b9f\\u0bb5\\u0bc1\\u0bae\\u0bcd, \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\\u0b95\\u0bcd\\u0b95 \\u0ba8\\u0bbe\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bc1\\u0bb1\\u0bc8\\u0b95\\u0bb3\\u0bc8 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0bb5\\u0bcb\\u0bae\\u0bcd.\",\n                    \"resendEmail\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"continue\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bcd\",\n                    \"goBack\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0bb5\\u0bb0\\u0bb2\\u0bbe\\u0bb1\\u0bcd\\u0bb1\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc1\\u0b95\",\n                        \"lastInputs\": \"\\u0b95\\u0b9f\\u0bc8\\u0b9a\\u0bbf \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bc0\\u0b9f\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                        \"noInputs\": \"\\u0b85\\u0bb5\\u0bcd\\u0bb5\\u0bb3\\u0bb5\\u0bc1 \\u0bb5\\u0bc6\\u0bb1\\u0bc1\\u0bae\\u0bc8...\",\n                        \"loading\": \"\\u0b8f\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0baf\\u0bc8 \\u0b87\\u0b99\\u0bcd\\u0b95\\u0bc7 \\u0ba4\\u0b9f\\u0bcd\\u0b9f\\u0b9a\\u0bcd\\u0b9a\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0b95...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0ba4\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bc1\",\n                        \"stop\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0bb5\\u0ba4\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bc1\",\n                        \"stopTask\": \"\\u0baa\\u0ba3\\u0bbf\\u0baf\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0b95\\u0bcb\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0b87\\u0ba3\\u0bc8\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0b95\\u0b9f\\u0bcd\\u0b9f\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0b93\\u0b9f\\u0bc1\\u0ba4\\u0bb2\\u0bcd\",\n                        \"executedSuccessfully\": \"\\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b9a\\u0bc6\\u0baf\\u0bb2\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n                        \"failed\": \"\\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\\u0baf\\u0bc1\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bc1\",\n                        \"feedbackUpdated\": \"\\u0b95\\u0bb0\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n                        \"updating\": \"\\u0baa\\u0bc1\\u0ba4\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bcb\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0b87\\u0b99\\u0bcd\\u0b95\\u0bc7 \\u0bb5\\u0bbf\\u0b9f\\u0bc1\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd:\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bb5\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\",\n                    \"cancelledUploadOf\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bae\\u0bcd\",\n                    \"couldNotReachServer\": \"\\u0b9a\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b85\\u0b9f\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0b9f\\u0bbf\\u0baf\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8\",\n                    \"continuingChat\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bc1\\u0bae\\u0bcd \\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bc1\\u0bb4\\u0bc1\",\n                    \"reset\": \"\\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\",\n                    \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                    \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0b85\\u0ba9\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0bae\\u0bcd\",\n                            \"feedbackPositive\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0ba8\\u0bc7\\u0bb0\\u0bcd\\u0bae\\u0bb1\\u0bc8\",\n                            \"feedbackNegative\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0b8e\\u0ba4\\u0bbf\\u0bb0\\u0bcd\\u0bae\\u0bb1\\u0bc8\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0ba4\\u0bc7\\u0b9f\\u0bc1\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0b87\\u0ba4\\u0bc1 \\u0ba8\\u0bc2\\u0bb2\\u0bcd \\u0bae\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba4\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bae\\u0bcd \\u0b95\\u0bc2\\u0bb1\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0bae\\u0bcd.\",\n                        \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                        \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\",\n                        \"deletingChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1\",\n                        \"chatDeleted\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0b95\\u0b9f\\u0ba8\\u0bcd\\u0ba4 \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0b95\\u0bb3\\u0bcd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0b95\\u0bbe\\u0bb2\\u0bbf\\u0baf\\u0bbe\\u0ba9...\",\n                        \"today\": \"\\u0b87\\u0ba9\\u0bcd\\u0bb1\\u0bc1\",\n                        \"yesterday\": \"\\u0ba8\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bc1\",\n                        \"previous7days\": \"\\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf 7 \\u0ba8\\u0bbe\\u0b9f\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n                        \"previous30days\": \"\\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf 30 \\u0ba8\\u0bbe\\u0b9f\\u0bcd\\u0b95\\u0bb3\\u0bcd\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0baa\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bc8 \\u0bae\\u0bc2\\u0b9f\\u0bc1\",\n                        \"openSidebar\": \"\\u0baa\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bc8\\u0ba4\\u0bcd \\u0ba4\\u0bbf\\u0bb1\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\\u0bb2\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"chatCreatedOn\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4 \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0b89\\u0bb0\\u0bc1\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f \\u0ba4\\u0bc7\\u0ba4\\u0bbf\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\",\n                \"readme\": \"\\u0bb0\\u0bc0\\u0b9f\\u0bcd\\u0bae\\u0bc0\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0bb5\\u0bb4\\u0b99\\u0bcd\\u0b95\\u0bc1\\u0ba8\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bc8\\u0baa\\u0bcd \\u0baa\\u0bc6\\u0bb1\\u0bc1\\u0bb5\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n            \"requiredApiKeys\": \"\\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd\",\n            \"requiredApiKeysInfo\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4 \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baa\\u0bcd \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4, \\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0bb5\\u0bb0\\u0bc1\\u0bae\\u0bcd API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8. \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bbe\\u0ba4\\u0ba9\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bc2\\u0bb0\\u0bcd \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0bae\\u0bcd.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b87\\u0ba8\\u0bcd\\u0ba4\\u0ba4\\u0bcd \\u0ba4\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0ba9\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0b95\\u0bc1\\u0ba4\\u0bbf\\u0baf\\u0bbe\\u0b95 \\u0b87\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/te.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c32\\u0c41\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0c1f\\u0c3e\\u0c38\\u0c4d\\u0c15\\u0c4d \\u0c32\\u0c3f\\u0c38\\u0c4d\\u0c1f\\u0c4d\",\n                    \"loading\": \"\\u0c32\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d...\",\n                    \"error\": \"\\u0c12\\u0c15 \\u0c26\\u0c4b\\u0c37\\u0c02 \\u0c38\\u0c02\\u0c2d\\u0c35\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d \\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\",\n                \"removeAttachment\": \"\\u0c05\\u0c1f\\u0c3e\\u0c1a\\u0c4d \\u0c2e\\u0c46\\u0c02\\u0c1f\\u0c4d \\u0c24\\u0c4a\\u0c32\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c41\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c38\\u0c43\\u0c37\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c3e\\u0c32\\u0c3e?\",\n                \"clearChat\": \"\\u0c07\\u0c26\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c24 \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c28\\u0c41 \\u0c15\\u0c4d\\u0c32\\u0c3f\\u0c2f\\u0c30\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d\\u0c28\\u0c41 \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c30\\u0c02\\u0c2d\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f.\",\n                \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c32\\u0c41\",\n                \"expandMessages\": \"\\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c28\\u0c41 \\u0c35\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                \"hideChainOfThought\": \"\\u0c06\\u0c32\\u0c4b\\u0c1a\\u0c28\\u0c3e \\u0c17\\u0c4a\\u0c32\\u0c41\\u0c38\\u0c41\\u0c28\\u0c41 \\u0c26\\u0c3e\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                \"darkMode\": \"\\u0c21\\u0c3e\\u0c30\\u0c4d\\u0c15\\u0c4d \\u0c2e\\u0c4b\\u0c21\\u0c4d\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c02\",\n                \"running\": \"\\u0c30\\u0c28\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c17\\u0c4d\",\n                \"took_one\": \"{{count}} \\u0c05\\u0c21\\u0c41\\u0c17\\u0c41 \\u0c35\\u0c47\\u0c38\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                \"took_other\": \"{{count}} \\u0c05\\u0c21\\u0c41\\u0c17\\u0c41\\u0c32\\u0c41 \\u0c35\\u0c47\\u0c38\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c2f\\u0c3e\\u0c15\\u0c4d\\u0c38\\u0c46\\u0c38\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c41\\u0c15\\u0c4b\\u0c35\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c32\\u0c3e\\u0c17\\u0c3f\\u0c28\\u0c4d \\u0c05\\u0c35\\u0c4d\\u0c35\\u0c02\\u0c21\\u0c3f.\",\n                    \"form\": {\n                        \"email\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\",\n                        \"password\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\",\n                        \"noAccount\": \"\\u0c2e\\u0c40\\u0c15\\u0c41 \\u0c05\\u0c15\\u0c4c\\u0c02\\u0c1f\\u0c4d \\u0c32\\u0c47\\u0c26\\u0c3e?\",\n                        \"alreadyHaveAccount\": \"\\u0c07\\u0c2a\\u0c4d\\u0c2a\\u0c1f\\u0c3f\\u0c15\\u0c47 \\u0c16\\u0c3e\\u0c24\\u0c3e \\u0c09\\u0c02\\u0c26\\u0c3e?\",\n                        \"signup\": \"\\u0c38\\u0c46\\u0c56\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d\",\n                        \"signin\": \"\\u0c38\\u0c46\\u0c56\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d\",\n                        \"or\": \"\\u0c32\\u0c47\\u0c26\\u0c3e\",\n                        \"continue\": \"\\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c41\",\n                        \"forgotPassword\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c2e\\u0c30\\u0c4d\\u0c1a\\u0c3f\\u0c2a\\u0c4b\\u0c2f\\u0c3e\\u0c30\\u0c3e?\",\n                        \"passwordMustContain\": \"\\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c32\\u0c4b \\u0c07\\u0c35\\u0c3f \\u0c09\\u0c02\\u0c21\\u0c3e\\u0c32\\u0c3f:\",\n                        \"emailRequired\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                        \"passwordRequired\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\",\n                        \"signin\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthsignin\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"redirect_uri_mismatch\": \"\\u0c30\\u0c40\\u0c21\\u0c48\\u0c30\\u0c46\\u0c15\\u0c4d\\u0c1f\\u0c4d URI \\u0c13\\u0c2f\\u0c42\\u0c24\\u0c4d \\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c15\\u0c3e\\u0c28\\u0c4d\\u0c2b\\u0c3f\\u0c17\\u0c30\\u0c47\\u0c37\\u0c28\\u0c4d \\u0c15\\u0c41 \\u0c38\\u0c30\\u0c3f\\u0c2a\\u0c4b\\u0c32\\u0c21\\u0c02 \\u0c32\\u0c47\\u0c26\\u0c41.\",\n                        \"oauthcallbackerror\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthcreateaccount\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"emailcreateaccount\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"callback\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthaccountnotlinked\": \"\\u0c2e\\u0c40 \\u0c17\\u0c41\\u0c30\\u0c4d\\u0c24\\u0c3f\\u0c02\\u0c2a\\u0c41\\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f, \\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c2e\\u0c4a\\u0c26\\u0c1f \\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c28 \\u0c05\\u0c26\\u0c47 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                        \"emailsignin\": \"\\u0c07-\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\",\n                        \"emailverify\": \"\\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f, \\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f.\",\n                        \"credentialssignin\": \"\\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f. \\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c05\\u0c02\\u0c26\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c28 \\u0c35\\u0c3f\\u0c35\\u0c30\\u0c3e\\u0c32\\u0c41 \\u0c38\\u0c30\\u0c3f\\u0c17\\u0c4d\\u0c17\\u0c3e \\u0c09\\u0c28\\u0c4d\\u0c28\\u0c3e\\u0c2f\\u0c4b \\u0c32\\u0c47\\u0c26\\u0c4b \\u0c1a\\u0c46\\u0c15\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c41\\u0c15\\u0c4b\\u0c02\\u0c21\\u0c3f.\",\n                        \"sessionrequired\": \"\\u0c08 \\u0c2a\\u0c47\\u0c1c\\u0c40\\u0c28\\u0c3f \\u0c2f\\u0c3e\\u0c15\\u0c4d\\u0c38\\u0c46\\u0c38\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c15\\u0c4a\\u0c30\\u0c15\\u0c41 \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c26\\u0c3e\\u0c26\\u0c3e\\u0c2a\\u0c41 \\u0c05\\u0c15\\u0c4d\\u0c15\\u0c21\\u0c47 \\u0c09\\u0c28\\u0c4d\\u0c28\\u0c3e\\u0c30\\u0c41! \\u0c2e\\u0c47\\u0c2e\\u0c41 \\u0c26\\u0c40\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c12\\u0c15 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c3e\\u0c2e\\u0c41 \",\n                    \"verifyEmailLink\": \"\\u0c2e\\u0c40 \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c2a\\u0c42\\u0c30\\u0c4d\\u0c24\\u0c3f \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c06 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c32\\u0c4b\\u0c28\\u0c3f \\u0c32\\u0c3f\\u0c02\\u0c15\\u0c4d \\u0c2a\\u0c48 \\u0c15\\u0c4d\\u0c32\\u0c3f\\u0c15\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                    \"didNotReceive\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c15\\u0c28\\u0c41\\u0c17\\u0c4a\\u0c28\\u0c32\\u0c47\\u0c15\\u0c2a\\u0c4b\\u0c2f\\u0c3e\\u0c30\\u0c3e?\",\n                    \"resendEmail\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c2a\\u0c02\\u0c2a\\u0c02\\u0c21\\u0c3f\",\n                    \"goBack\": \"\\u0c35\\u0c46\\u0c28\\u0c15\\u0c4d\\u0c15\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c33\\u0c41\",\n                    \"emailSent\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c2a\\u0c02\\u0c2a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f.\",\n                    \"verifyEmail\": \"\\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0c24\\u0c4b \\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"signup\": \"{{provider}} \\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                    \"passwordsMustMatch\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c32\\u0c41 \\u0c24\\u0c2a\\u0c4d\\u0c2a\\u0c28\\u0c3f\\u0c38\\u0c30\\u0c3f\\u0c17\\u0c3e \\u0c38\\u0c30\\u0c3f\\u0c2a\\u0c4b\\u0c32\\u0c3e\\u0c32\\u0c3f\",\n                    \"confirmPasswordRequired\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c3f \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"newPassword\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\",\n                    \"confirmPassword\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"resetPassword\": \"\\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\",\n                    \"emailRequired\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                    \"emailSent\": \"\\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c38\\u0c42\\u0c1a\\u0c28\\u0c32 \\u0c15\\u0c4a\\u0c30\\u0c15\\u0c41 \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f {{email}} \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c24\\u0c28\\u0c3f\\u0c16\\u0c40 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                    \"enterEmail\": \"\\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c28\\u0c2e\\u0c4b\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c28\\u0c41 \\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2e\\u0c47\\u0c2e\\u0c41 \\u0c2e\\u0c40\\u0c15\\u0c41 \\u0c38\\u0c42\\u0c1a\\u0c28\\u0c32\\u0c41 \\u0c2a\\u0c02\\u0c2a\\u0c41\\u0c24\\u0c3e\\u0c2e\\u0c41.\",\n                    \"resendEmail\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c2a\\u0c02\\u0c2a\\u0c02\\u0c21\\u0c3f\",\n                    \"continue\": \"\\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c41\",\n                    \"goBack\": \"\\u0c35\\u0c46\\u0c28\\u0c15\\u0c4d\\u0c15\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c33\\u0c41\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0c1a\\u0c30\\u0c3f\\u0c24\\u0c4d\\u0c30\\u0c28\\u0c41 \\u0c1a\\u0c42\\u0c2a\\u0c3f\\u0c02\\u0c1a\\u0c41\",\n                        \"lastInputs\": \"\\u0c1a\\u0c3f\\u0c35\\u0c30\\u0c3f \\u0c07\\u0c28\\u0c4d \\u0c2a\\u0c41\\u0c1f\\u0c4d \\u0c32\\u0c41\",\n                        \"noInputs\": \"\\u0c05\\u0c02\\u0c24 \\u0c16\\u0c3e\\u0c33\\u0c40\\u0c17\\u0c3e...\",\n                        \"loading\": \"\\u0c32\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0c2e\\u0c40 \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c28\\u0c4d\\u0c28\\u0c3f \\u0c07\\u0c15\\u0c4d\\u0c15\\u0c21 \\u0c1f\\u0c48\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0c30\\u0c3f\\u0c15\\u0c3e\\u0c30\\u0c4d\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c30\\u0c02\\u0c2d\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                        \"stop\": \"\\u0c30\\u0c3f\\u0c15\\u0c3e\\u0c30\\u0c4d\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c06\\u0c2a\\u0c02\\u0c21\\u0c3f\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c02 \\u0c2a\\u0c02\\u0c2a\\u0c41\",\n                        \"stopTask\": \"\\u0c38\\u0c4d\\u0c1f\\u0c3e\\u0c2a\\u0c4d \\u0c1f\\u0c3e\\u0c38\\u0c4d\\u0c15\\u0c4d\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0c2b\\u0c48\\u0c33\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c1c\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c1a\\u0c41\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0c26\\u0c40\\u0c28\\u0c3f\\u0c24\\u0c4b \\u0c28\\u0c3f\\u0c30\\u0c4d\\u0c2e\\u0c3f\\u0c02\\u0c1a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0c30\\u0c28\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c17\\u0c4d\",\n                        \"executedSuccessfully\": \"\\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c05\\u0c2e\\u0c32\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                        \"failed\": \"\\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f\",\n                        \"feedbackUpdated\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c21\\u0c47\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                        \"updating\": \"\\u0c05\\u0c2a\\u0c4d \\u0c21\\u0c47\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0c2e\\u0c40 \\u0c2b\\u0c48\\u0c33\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c07\\u0c15\\u0c4d\\u0c15\\u0c21 \\u0c21\\u0c4d\\u0c30\\u0c3e\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f\",\n                    \"cancelledUploadOf\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c38\\u0c3f\\u0c28 \\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d\",\n                    \"couldNotReachServer\": \"\\u0c38\\u0c30\\u0c4d\\u0c35\\u0c30\\u0c4d \\u0c15\\u0c41 \\u0c1a\\u0c47\\u0c30\\u0c41\\u0c15\\u0c4b\\u0c35\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c32\\u0c47\\u0c26\\u0c41\",\n                    \"continuingChat\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c28\\u0c41 \\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c02\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d\\u0c38\\u0c4d \\u0c2a\\u0c4d\\u0c2f\\u0c3e\\u0c28\\u0c46\\u0c32\\u0c4d\",\n                    \"reset\": \"\\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d\",\n                    \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                    \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c05\\u0c28\\u0c4d\\u0c28\\u0c40\",\n                            \"feedbackPositive\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c2a\\u0c3e\\u0c1c\\u0c3f\\u0c1f\\u0c3f\\u0c35\\u0c4d\",\n                            \"feedbackNegative\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c28\\u0c46\\u0c17\\u0c46\\u0c1f\\u0c3f\\u0c35\\u0c4d\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0c35\\u0c46\\u0c24\\u0c41\\u0c15\\u0c41\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0c07\\u0c26\\u0c3f \\u0c25\\u0c4d\\u0c30\\u0c46\\u0c21\\u0c4d\\u0c24\\u0c4b \\u0c2a\\u0c3e\\u0c1f\\u0c41 \\u0c26\\u0c3e\\u0c28\\u0c3f \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c41 \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c0e\\u0c32\\u0c3f\\u0c2e\\u0c46\\u0c02\\u0c1f\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c24\\u0c4a\\u0c32\\u0c17\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f.\",\n                        \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                        \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\",\n                        \"deletingChat\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c28\\u0c41 \\u0c21\\u0c3f\\u0c32\\u0c40\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02\",\n                        \"chatDeleted\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c21\\u0c3f\\u0c32\\u0c40\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0c17\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c32\\u0c41\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0c16\\u0c3e\\u0c33\\u0c40...\",\n                        \"today\": \"\\u0c08 \\u0c30\\u0c4b\\u0c1c\\u0c41\",\n                        \"yesterday\": \"\\u0c28\\u0c3f\\u0c28\\u0c4d\\u0c28\",\n                        \"previous7days\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f 7 \\u0c30\\u0c4b\\u0c1c\\u0c41\\u0c32\\u0c41\",\n                        \"previous30days\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f 30 \\u0c30\\u0c4b\\u0c1c\\u0c41\\u0c32\\u0c41\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0c15\\u0c4d\\u0c32\\u0c4b\\u0c1c\\u0c4d \\u0c38\\u0c48\\u0c21\\u0c4d \\u0c2c\\u0c3e\\u0c30\\u0c4d\",\n                        \"openSidebar\": \"\\u0c13\\u0c2a\\u0c46\\u0c28\\u0c4d \\u0c38\\u0c48\\u0c21\\u0c4d \\u0c2c\\u0c3e\\u0c30\\u0c4d\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c32\\u0c02\\u0c21\\u0c3f\",\n                    \"chatCreatedOn\": \"\\u0c08 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c26\\u0c40\\u0c28\\u0c3f\\u0c32\\u0c4b \\u0c38\\u0c43\\u0c37\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0c2e\\u0c41\\u0c1a\\u0c4d\\u0c1a\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c41\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0c2a\\u0c4d\\u0c30\\u0c4a\\u0c35\\u0c48\\u0c21\\u0c30\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c2a\\u0c4a\\u0c02\\u0c26\\u0c21\\u0c02\\u0c32\\u0c4b \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c38\\u0c47\\u0c35\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n            \"requiredApiKeys\": \"\\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 API \\u0c15\\u0c40\\u0c32\\u0c41\",\n            \"requiredApiKeysInfo\": \"\\u0c08 \\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f, \\u0c08 \\u0c15\\u0c4d\\u0c30\\u0c3f\\u0c02\\u0c26\\u0c3f API \\u0c15\\u0c40\\u0c32\\u0c41 \\u0c05\\u0c35\\u0c38\\u0c30\\u0c02 \\u0c05\\u0c35\\u0c41\\u0c24\\u0c3e\\u0c2f\\u0c3f. \\u0c15\\u0c40\\u0c32\\u0c41 \\u0c2e\\u0c40 \\u0c2a\\u0c30\\u0c3f\\u0c15\\u0c30\\u0c02 \\u0c2f\\u0c4a\\u0c15\\u0c4d\\u0c15 \\u0c38\\u0c4d\\u0c25\\u0c3e\\u0c28\\u0c3f\\u0c15 \\u0c38\\u0c4d\\u0c1f\\u0c4b\\u0c30\\u0c47\\u0c1c\\u0c40\\u0c32\\u0c4b \\u0c28\\u0c3f\\u0c32\\u0c4d\\u0c35 \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c24\\u0c3e\\u0c2f\\u0c3f.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c08 \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c1c\\u0c46\\u0c15\\u0c4d\\u0c1f\\u0c41\\u0c32\\u0c4b \\u0c2d\\u0c3e\\u0c17\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0c30\\u0c46\\u0c1c\\u0c4d\\u0c2f\\u0c42\\u0c2e\\u0c4d \\u0c1a\\u0c3e\\u0c1f\\u0c4d\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.chainlit/translations/zh-CN.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u8bbe\\u7f6e\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u5bc6\\u94a5\",\n                        \"logout\": \"\\u767b\\u51fa\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u65b0\\u5efa\\u5bf9\\u8bdd\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u4efb\\u52a1\\u5217\\u8868\",\n                    \"loading\": \"\\u52a0\\u8f7d\\u4e2d...\",\n                    \"error\": \"\\u53d1\\u751f\\u9519\\u8bef\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u53d6\\u6d88\\u4e0a\\u4f20\",\n                \"removeAttachment\": \"\\u79fb\\u9664\\u9644\\u4ef6\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u521b\\u5efa\\u65b0\\u5bf9\\u8bdd\\uff1f\",\n                \"clearChat\": \"\\u8fd9\\u5c06\\u6e05\\u9664\\u5f53\\u524d\\u6d88\\u606f\\u5e76\\u5f00\\u59cb\\u65b0\\u7684\\u5bf9\\u8bdd\\u3002\",\n                \"cancel\": \"\\u53d6\\u6d88\",\n                \"confirm\": \"\\u786e\\u8ba4\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u8bbe\\u7f6e\",\n                \"expandMessages\": \"\\u5c55\\u5f00\\u6d88\\u606f\",\n                \"hideChainOfThought\": \"\\u9690\\u85cf\\u601d\\u8003\\u94fe\",\n                \"darkMode\": \"\\u6697\\u8272\\u6a21\\u5f0f\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u4f7f\\u7528\",\n                \"used\": \"\\u5df2\\u7528\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u767b\\u5f55\\u4ee5\\u8bbf\\u95ee\\u5e94\\u7528\\u3002\",\n                    \"form\": {\n                        \"email\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\",\n                        \"password\": \"\\u5bc6\\u7801\",\n                        \"noAccount\": \"\\u6ca1\\u6709\\u8d26\\u6237\\uff1f\",\n                        \"alreadyHaveAccount\": \"\\u5df2\\u6709\\u8d26\\u6237\\uff1f\",\n                        \"signup\": \"\\u6ce8\\u518c\",\n                        \"signin\": \"\\u767b\\u5f55\",\n                        \"or\": \"\\u6216\\u8005\",\n                        \"continue\": \"\\u7ee7\\u7eed\",\n                        \"forgotPassword\": \"\\u5fd8\\u8bb0\\u5bc6\\u7801\\uff1f\",\n                        \"passwordMustContain\": \"\\u60a8\\u7684\\u5bc6\\u7801\\u5fc5\\u987b\\u5305\\u542b\\uff1a\",\n                        \"emailRequired\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u662f\\u5fc5\\u586b\\u9879\",\n                        \"passwordRequired\": \"\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u65e0\\u6cd5\\u767b\\u5f55\\u3002\",\n                        \"signin\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthsignin\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"redirect_uri_mismatch\": \"\\u91cd\\u5b9a\\u5411URI\\u4e0eOAuth\\u5e94\\u7528\\u914d\\u7f6e\\u4e0d\\u5339\\u914d\\u3002\",\n                        \"oauthcallbackerror\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthcreateaccount\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"emailcreateaccount\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"callback\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthaccountnotlinked\": \"\\u4e3a\\u4e86\\u9a8c\\u8bc1\\u60a8\\u7684\\u8eab\\u4efd\\uff0c\\u8bf7\\u4f7f\\u7528\\u6700\\u521d\\u4f7f\\u7528\\u7684\\u540c\\u4e00\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"emailsignin\": \"\\u65e0\\u6cd5\\u53d1\\u9001\\u90ae\\u4ef6\\u3002\",\n                        \"emailverify\": \"\\u8bf7\\u9a8c\\u8bc1\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u4ef6\\uff0c\\u5df2\\u53d1\\u9001\\u4e00\\u5c01\\u65b0\\u90ae\\u4ef6\\u3002\",\n                        \"credentialssignin\": \"\\u767b\\u5f55\\u5931\\u8d25\\u3002\\u8bf7\\u68c0\\u67e5\\u60a8\\u63d0\\u4f9b\\u7684\\u8be6\\u7ec6\\u4fe1\\u606f\\u662f\\u5426\\u6b63\\u786e\\u3002\",\n                        \"sessionrequired\": \"\\u8bf7\\u767b\\u5f55\\u4ee5\\u8bbf\\u95ee\\u6b64\\u9875\\u9762\\u3002\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u60a8\\u5feb\\u6210\\u529f\\u4e86\\uff01\\u6211\\u4eec\\u5df2\\u5411 \",\n                    \"verifyEmailLink\": \"\\u8bf7\\u5355\\u51fb\\u8be5\\u90ae\\u4ef6\\u4e2d\\u7684\\u94fe\\u63a5\\u4ee5\\u5b8c\\u6210\\u6ce8\\u518c\\u3002\",\n                    \"didNotReceive\": \"\\u6ca1\\u627e\\u5230\\u90ae\\u4ef6\\uff1f\",\n                    \"resendEmail\": \"\\u91cd\\u65b0\\u53d1\\u9001\\u90ae\\u4ef6\",\n                    \"goBack\": \"\\u8fd4\\u56de\",\n                    \"emailSent\": \"\\u90ae\\u4ef6\\u5df2\\u6210\\u529f\\u53d1\\u9001\\u3002\",\n                    \"verifyEmail\": \"\\u9a8c\\u8bc1\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u4ef6\\u5730\\u5740\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"\\u4f7f\\u7528{{provider}}\\u7ee7\\u7eed\",\n                    \"signup\": \"\\u4f7f\\u7528{{provider}}\\u6ce8\\u518c\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u65b0\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"passwordsMustMatch\": \"\\u5bc6\\u7801\\u5fc5\\u987b\\u4e00\\u81f4\",\n                    \"confirmPasswordRequired\": \"\\u786e\\u8ba4\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"newPassword\": \"\\u65b0\\u5bc6\\u7801\",\n                    \"confirmPassword\": \"\\u786e\\u8ba4\\u5bc6\\u7801\",\n                    \"resetPassword\": \"\\u91cd\\u7f6e\\u5bc6\\u7801\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\",\n                    \"emailRequired\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"emailSent\": \"\\u8bf7\\u68c0\\u67e5\\u7535\\u5b50\\u90ae\\u7bb1{{email}}\\u4ee5\\u83b7\\u53d6\\u91cd\\u7f6e\\u5bc6\\u7801\\u7684\\u6307\\u793a\\u3002\",\n                    \"enterEmail\": \"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\\uff0c\\u6211\\u4eec\\u5c06\\u53d1\\u9001\\u91cd\\u7f6e\\u5bc6\\u7801\\u7684\\u6307\\u793a\\u3002\",\n                    \"resendEmail\": \"\\u91cd\\u65b0\\u53d1\\u9001\\u90ae\\u4ef6\",\n                    \"continue\": \"\\u7ee7\\u7eed\",\n                    \"goBack\": \"\\u8fd4\\u56de\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u663e\\u793a\\u5386\\u53f2\",\n                        \"lastInputs\": \"\\u6700\\u540e\\u8f93\\u5165\",\n                        \"noInputs\": \"\\u5982\\u6b64\\u7a7a\\u65f7...\",\n                        \"loading\": \"\\u52a0\\u8f7d\\u4e2d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u5728\\u8fd9\\u91cc\\u8f93\\u5165\\u60a8\\u7684\\u6d88\\u606f...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u5f00\\u59cb\\u5f55\\u97f3\",\n                        \"stop\": \"\\u505c\\u6b62\\u5f55\\u97f3\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u53d1\\u9001\\u6d88\\u606f\",\n                        \"stopTask\": \"\\u505c\\u6b62\\u4efb\\u52a1\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u9644\\u52a0\\u6587\\u4ef6\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u4f7f\\u7528\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u8fd0\\u884c\\u4e2d\",\n                        \"executedSuccessfully\": \"\\u6267\\u884c\\u6210\\u529f\",\n                        \"failed\": \"\\u5931\\u8d25\",\n                        \"feedbackUpdated\": \"\\u53cd\\u9988\\u66f4\\u65b0\",\n                        \"updating\": \"\\u6b63\\u5728\\u66f4\\u65b0\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u5728\\u8fd9\\u91cc\\u62d6\\u653e\\u60a8\\u7684\\u6587\\u4ef6\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u4e0a\\u4f20\\u5931\\u8d25\",\n                    \"cancelledUploadOf\": \"\\u53d6\\u6d88\\u4e0a\\u4f20\",\n                    \"couldNotReachServer\": \"\\u65e0\\u6cd5\\u8fde\\u63a5\\u5230\\u670d\\u52a1\\u5668\",\n                    \"continuingChat\": \"\\u7ee7\\u7eed\\u4e4b\\u524d\\u7684\\u5bf9\\u8bdd\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u8bbe\\u7f6e\\u9762\\u677f\",\n                    \"reset\": \"\\u91cd\\u7f6e\",\n                    \"cancel\": \"\\u53d6\\u6d88\",\n                    \"confirm\": \"\\u786e\\u8ba4\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u53cd\\u9988\\uff1a\\u5168\\u90e8\",\n                            \"feedbackPositive\": \"\\u53cd\\u9988\\uff1a\\u6b63\\u9762\",\n                            \"feedbackNegative\": \"\\u53cd\\u9988\\uff1a\\u8d1f\\u9762\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u641c\\u7d22\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u8fd9\\u5c06\\u5220\\u9664\\u7ebf\\u7a0b\\u53ca\\u5176\\u6d88\\u606f\\u548c\\u5143\\u7d20\\u3002\",\n                        \"cancel\": \"\\u53d6\\u6d88\",\n                        \"confirm\": \"\\u786e\\u8ba4\",\n                        \"deletingChat\": \"\\u5220\\u9664\\u5bf9\\u8bdd\",\n                        \"chatDeleted\": \"\\u5bf9\\u8bdd\\u5df2\\u5220\\u9664\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u8fc7\\u5f80\\u5bf9\\u8bdd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u7a7a\\u7684...\",\n                        \"today\": \"\\u4eca\\u5929\",\n                        \"yesterday\": \"\\u6628\\u5929\",\n                        \"previous7days\": \"\\u524d7\\u5929\",\n                        \"previous30days\": \"\\u524d30\\u5929\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u5173\\u95ed\\u4fa7\\u8fb9\\u680f\",\n                        \"openSidebar\": \"\\u6253\\u5f00\\u4fa7\\u8fb9\\u680f\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u8fd4\\u56de\\u5bf9\\u8bdd\",\n                    \"chatCreatedOn\": \"\\u6b64\\u5bf9\\u8bdd\\u521b\\u5efa\\u4e8e\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u5bf9\\u8bdd\",\n                \"readme\": \"\\u8bf4\\u660e\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u83b7\\u53d6\\u63d0\\u4f9b\\u8005\\u5931\\u8d25:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u4fdd\\u5b58\\u6210\\u529f\",\n            \"requiredApiKeys\": \"\\u5fc5\\u9700\\u7684API\\u5bc6\\u94a5\",\n            \"requiredApiKeysInfo\": \"\\u8981\\u4f7f\\u7528\\u6b64\\u5e94\\u7528\\uff0c\\u9700\\u8981\\u4ee5\\u4e0bAPI\\u5bc6\\u94a5\\u3002\\u8fd9\\u4e9b\\u5bc6\\u94a5\\u5b58\\u50a8\\u5728\\u60a8\\u7684\\u8bbe\\u5907\\u672c\\u5730\\u5b58\\u50a8\\u4e2d\\u3002\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u60a8\\u4e0d\\u662f\\u6b64\\u9879\\u76ee\\u7684\\u4e00\\u90e8\\u5206\\u3002\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u6062\\u590d\\u5bf9\\u8bdd\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot/.gitignore",
    "content": "# python generated files\n__pycache__/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# venv\n.venv\n.files"
  },
  {
    "path": "examples/chatbot/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "examples/chatbot/README.md",
    "content": "# Quivr Chatbot Example\n\nThis example demonstrates how to create a simple chatbot using Quivr and Chainlit. The chatbot allows users to upload a text file and then ask questions about its content.\n\n## Prerequisites\n\n- Python 3.8 or higher\n\n## Installation\n\n1. Clone the repository and navigate to the `examples/chatbot` directory.\n\n2. Make sure you have [rye](https://rye.astral.sh/) installed.\n\n3. Install the requirements using `rye`:\n\n   ```sh\n   rye sync\n   ```\n4. Activate the venv\n\n   ```sh\n   source ./venv/bin/activate\n   ```\n\n## Running the Chatbot\n\n1. Define your API key as environment variable. e.g. `export OPENAI_API_KEY=your-key-here`\n\n2. Start the Chainlit server:\n\n   ```\n   chainlit run main.py\n   ```\n\n3. Open your web browser and go to the URL displayed in the terminal (usually `http://localhost:8000`).\n\n## Using the Chatbot\n\n1. When the chatbot interface loads, you will be prompted to upload a text file.\n\n2. Click on the upload area and select a `.txt` file from your computer. The file size should not exceed 20MB.\n\n3. After uploading, the chatbot will process the file and inform you when it's ready.\n\n4. You can now start asking questions about the content of the uploaded file.\n\n5. Type your questions in the chat input and press Enter. The chatbot will respond based on the information in the uploaded file.\n\n## How It Works\n\nThe chatbot uses the Quivr library to create a \"brain\" from the uploaded text file. This brain is then used to answer questions about the file's content. The Chainlit library provides the user interface and handles the chat interactions.\n\nEnjoy chatting with your documents!\n"
  },
  {
    "path": "examples/chatbot/basic_rag_workflow.yaml",
    "content": "workflow_config:\n  name: \"standard RAG\"\n  nodes:\n    - name: \"START\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"rewrite\"]\n\n    - name: \"rewrite\"\n      edges: [\"retrieve\"]\n\n    - name: \"retrieve\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user\n      edges: [\"END\"]\n      tools:\n        - name: \"cited_answer\"\n\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\n# Reranker configuration\n# reranker_config:\n#   # The reranker supplier to use\n#   supplier: \"cohere\"\n\n#   # The model to use for the reranker for the given supplier\n#   model: \"rerank-multilingual-v3.0\"\n\n#   # Number of chunks returned by the reranker\n#   top_n: 5\n\n# Configuration for the LLM\nllm_config:\n\n  # maximum number of tokens passed to the LLM to generate the answer\n  max_output_tokens: 4000\n\n  # temperature for the LLM\n  temperature: 0.7\n"
  },
  {
    "path": "examples/chatbot/chainlit.md",
    "content": "# Quivr Chatbot Example\n\nThis example demonstrates how to create a simple chatbot using Quivr and Chainlit. The chatbot allows users to upload a text file and then ask questions about its content.\n\n## Prerequisites\n\n- Python 3.8 or higher\n\n## Installation\n\n1. Clone the repository or navigate to the `backend/core/examples/chatbot` directory.\n\n2. Install the required dependencies:\n\n   ```\n   pip install -r requirements.txt\n   ```\n\n## Running the Chatbot\n\n1. Start the Chainlit server:\n\n   ```\n   chainlit run main.py\n   ```\n\n2. Open your web browser and go to the URL displayed in the terminal (usually `http://localhost:8000`).\n\n## Using the Chatbot\n\n1. When the chatbot interface loads, you will be prompted to upload a text file.\n\n2. Click on the upload area and select a `.txt` file from your computer. The file size should not exceed 20MB.\n\n3. After uploading, the chatbot will process the file and inform you when it's ready.\n\n4. You can now start asking questions about the content of the uploaded file.\n\n5. Type your questions in the chat input and press Enter. The chatbot will respond based on the information in the uploaded file.\n\n## How It Works\n\nThe chatbot uses the Quivr library to create a \"brain\" from the uploaded text file. This brain is then used to answer questions about the file's content. The Chainlit library provides the user interface and handles the chat interactions.\n\nEnjoy chatting with your documents!\n"
  },
  {
    "path": "examples/chatbot/main.py",
    "content": "import tempfile\n\nimport chainlit as cl\nfrom quivr_core import Brain\nfrom quivr_core.rag.entities.config import RetrievalConfig\n\n\n@cl.on_chat_start\nasync def on_chat_start():\n    files = None\n\n    # Wait for the user to upload a file\n    while files is None:\n        files = await cl.AskFileMessage(\n            content=\"Please upload a text .txt file to begin!\",\n            accept=[\"text/plain\"],\n            max_size_mb=20,\n            timeout=180,\n        ).send()\n\n    file = files[0]\n\n    msg = cl.Message(content=f\"Processing `{file.name}`...\")\n    await msg.send()\n\n    with open(file.path, \"r\", encoding=\"utf-8\") as f:\n        text = f.read()\n\n    with tempfile.NamedTemporaryFile(\n        mode=\"w\", suffix=file.name, delete=False\n    ) as temp_file:\n        temp_file.write(text)\n        temp_file.flush()\n        temp_file_path = temp_file.name\n\n    brain = Brain.from_files(name=\"user_brain\", file_paths=[temp_file_path])\n\n    # Store the file path in the session\n    cl.user_session.set(\"file_path\", temp_file_path)\n\n    # Let the user know that the system is ready\n    msg.content = f\"Processing `{file.name}` done. You can now ask questions!\"\n    await msg.update()\n\n    cl.user_session.set(\"brain\", brain)\n\n\n@cl.on_message\nasync def main(message: cl.Message):\n    brain = cl.user_session.get(\"brain\")  # type: Brain\n    path_config = \"basic_rag_workflow.yaml\"\n    retrieval_config = RetrievalConfig.from_yaml(path_config)\n\n    if brain is None:\n        await cl.Message(content=\"Please upload a file first.\").send()\n        return\n\n    # Prepare the message for streaming\n    msg = cl.Message(content=\"\", elements=[])\n    await msg.send()\n\n    saved_sources = set()\n    saved_sources_complete = []\n    elements = []\n\n    # Use the ask_stream method for streaming responses\n    async for chunk in brain.ask_streaming(message.content, retrieval_config=retrieval_config):\n        await msg.stream_token(chunk.answer)\n        for source in chunk.metadata.sources:\n            if source.page_content not in saved_sources:\n                saved_sources.add(source.page_content)\n                saved_sources_complete.append(source)\n                print(source)\n                elements.append(cl.Text(name=source.metadata[\"original_file_name\"], content=source.page_content, display=\"side\"))\n\n    \n    await msg.send()\n    sources = \"\"\n    for source in saved_sources_complete:\n        sources += f\"- {source.metadata['original_file_name']}\\n\"\n    msg.elements = elements\n    msg.content = msg.content + f\"\\n\\nSources:\\n{sources}\"\n    await msg.update()"
  },
  {
    "path": "examples/chatbot/pyproject.toml",
    "content": "[project]\nname = \"chatbot\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nauthors = [\n    { name = \"Stan Girard\", email = \"stan@quivr.app\" }\n]\ndependencies = [\n    \"quivr-core @ file:///${PROJECT_ROOT}/../../core\",\n    \"chainlit>=1.2.0\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.11\"\n\n[tool.rye]\nmanaged = true\nvirtual = true\ndev-dependencies = []\n"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/config.toml",
    "content": "[project]\n# Whether to enable telemetry (default: true). No personal data is collected.\nenable_telemetry = true\n\n\n# List of environment variables to be provided by each user to use the app.\nuser_env = []\n\n# Duration (in seconds) during which the session is saved when the connection is lost\nsession_timeout = 3600\n\n# Enable third parties caching (e.g LangChain cache)\ncache = false\n\n# Authorized origins\nallow_origins = [\"*\"]\n\n# Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)\n# follow_symlink = false\n\n[features]\n# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)\nunsafe_allow_html = false\n\n# Process and display mathematical expressions. This can clash with \"$\" characters in messages.\nlatex = false\n\n# Automatically tag threads with the current chat profile (if a chat profile is used)\nauto_tag_thread = true\n\n# Authorize users to spontaneously upload files with messages\n[features.spontaneous_file_upload]\n    enabled = false\n    accept = [\"*/*\"]\n    max_files = 20\n    max_size_mb = 500\n\n[features.audio]\n    # Threshold for audio recording\n    min_decibels = -45\n    # Delay for the user to start speaking in MS\n    initial_silence_timeout = 3000\n    # Delay for the user to continue speaking in MS. If the user stops speaking for this duration, the recording will stop.\n    silence_timeout = 1500\n    # Above this duration (MS), the recording will forcefully stop.\n    max_duration = 15000\n    # Duration of the audio chunks in MS\n    chunk_duration = 1000\n    # Sample rate of the audio\n    sample_rate = 44100\n\nedit_message = true\n\n[UI]\n# Name of the assistant.\nname = \"Quivr\"\n\n# Description of the assistant. This is used for HTML tags.\ndescription = \"Demo of Quivr\"\n\n# Large size content are by default collapsed for a cleaner ui\ndefault_collapse_content = true\n\n# Chain of Thought (CoT) display mode. Can be \"hidden\", \"tool_call\" or \"full\".\ncot = \"hidden\"\n\n# Link to your github repo. This will add a github button in the UI's header.\ngithub = \"https://github.com/quivrhq/quivr\"\n\n# Specify a CSS file that can be used to customize the user interface.\n# The CSS file can be served from the public directory or via an external link.\n# custom_css = \"/public/style.css\"\n\n# Specify a Javascript file that can be used to customize the user interface.\n# The Javascript file can be served from the public directory.\n# custom_js = \"/public/test.js\"\n\n# Specify a custom font url.\n# custom_font = \"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap\"\n\n# Specify a custom meta image url.\n# custom_meta_image_url = \"https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png\"\n\n# Specify a custom build directory for the frontend.\n# This can be used to customize the frontend code.\n# Be careful: If this is a relative path, it should not start with a slash.\n# custom_build = \"./public/build\"\n\n[UI.theme]\n    default = \"dark\"\n    font_family = \"Tahoma,Verdana,Segoe,sans-serif\"\n\n# Override default MUI light theme. (Check theme.ts)\n[UI.theme.light]\n    background = \"#fcfcfc\"\n    paper = \"#f8f8f8\"\n\n    [UI.theme.light.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.light.text]\n        primary = \"#1f1f1f\"\n        secondary = \"#818080\"\n\n# Override default MUI dark theme. (Check theme.ts)\n[UI.theme.dark]\n    background = \"#252525\"\n    paper = \"#1f1f1f\"\n\n    [UI.theme.dark.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.dark.text]\n        primary = \"#f4f4f4\"\n        secondary = \"#c8c8c8\"\n\n[meta]\ngenerated_by = \"1.1.402\"\n"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/bn.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"\\u098f\\u09aa\\u09bf\\u0986\\u0987 \\u0995\\u09c0\",\n                        \"logout\": \"\\u09b2\\u0997\\u0986\\u0989\\u099f\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u0986\\u09a1\\u09cd\\u09a1\\u09be\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0995\\u09be\\u09b0\\u09cd\\u09af \\u09a4\\u09be\\u09b2\\u09bf\\u0995\\u09be\",\n                    \"loading\": \"\\u09b2\\u09cb\\u09a1\\u0964\\u0964\\u0964\",\n                    \"error\": \"\\u098f\\u0995\\u099f\\u09bf \\u09a4\\u09cd\\u09b0\\u09c1\\u099f\\u09bf \\u09b8\\u0982\\u0998\\u099f\\u09bf\\u09a4 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u09ac\\u09be\\u09a4\\u09bf\\u09b2 \\u0995\\u09b0\\u09c1\\u09a8\",\n                \"removeAttachment\": \"\\u09b8\\u0982\\u09af\\u09c1\\u0995\\u09cd\\u09a4\\u09bf \\u09b8\\u09b0\\u09be\\u09a8\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u09a4\\u09c8\\u09b0\\u09bf \\u0995\\u09b0\\u09ac\\u09c7\\u09a8?\",\n                \"clearChat\": \"\\u098f\\u099f\\u09bf \\u09ac\\u09b0\\u09cd\\u09a4\\u09ae\\u09be\\u09a8 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be\\u0997\\u09c1\\u09b2\\u09bf \\u09b8\\u09be\\u09ab \\u0995\\u09b0\\u09ac\\u09c7 \\u098f\\u09ac\\u0982 \\u098f\\u0995\\u099f\\u09bf \\u09a8\\u09a4\\u09c1\\u09a8 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09ac\\u09c7\\u0964\",\n                \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8\",\n                \"expandMessages\": \"\\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be\\u0997\\u09c1\\u09b2\\u09bf \\u09aa\\u09cd\\u09b0\\u09b8\\u09be\\u09b0\\u09bf\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\",\n                \"hideChainOfThought\": \"\\u099a\\u09bf\\u09a8\\u09cd\\u09a4\\u09be\\u09b0 \\u09b6\\u09c3\\u0999\\u09cd\\u0996\\u09b2 \\u09b2\\u09c1\\u0995\\u09be\\u09a8\",\n                \"darkMode\": \"\\u09a1\\u09be\\u09b0\\u09cd\\u0995 \\u09ae\\u09cb\\u09a1\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0\",\n                \"running\": \"\\u099a\\u09b2\\u09ae\\u09be\\u09a8\",\n                \"took_one\": \"{{count}} \\u09aa\\u09a6\\u0995\\u09cd\\u09b7\\u09c7\\u09aa \\u09a8\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                \"took_other\": \"{{count}}\\u099f\\u09bf \\u09aa\\u09a6\\u0995\\u09cd\\u09b7\\u09c7\\u09aa \\u09a8\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0985\\u09cd\\u09af\\u09be\\u09aa\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09cd\\u09b8\\u09c7\\u09b8 \\u0995\\u09b0\\u09a4\\u09c7 \\u09b2\\u0997\\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"form\": {\n                        \"email\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be\",\n                        \"password\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\",\n                        \"noAccount\": \"\\u0995\\u09cb\\u09a8\\u0993 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a8\\u09c7\\u0987?\",\n                        \"alreadyHaveAccount\": \"\\u0987\\u09a4\\u09bf\\u09ae\\u09a7\\u09cd\\u09af\\u09c7 \\u098f\\u0995\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u0986\\u099b\\u09c7?\",\n                        \"signup\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0986\\u09aa \\u0995\\u09b0\\u09cb\",\n                        \"signin\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09cb\",\n                        \"or\": \"\\u09ac\\u09be\",\n                        \"continue\": \"\\u0985\\u09ac\\u09bf\\u09b0\\u09a4\",\n                        \"forgotPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09ad\\u09c1\\u09b2\\u09c7 \\u0997\\u09c7\\u099b\\u09c7\\u09a8?\",\n                        \"passwordMustContain\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\\u09c7 \\u0985\\u09ac\\u09b6\\u09cd\\u09af\\u0987 \\u09a5\\u09be\\u0995\\u09a4\\u09c7 \\u09b9\\u09ac\\u09c7:\",\n                        \"emailRequired\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u098f\\u0995\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u09c0\\u09af\\u09bc \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                        \"passwordRequired\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09a4\\u09c7 \\u0985\\u0995\\u09cd\\u09b7\\u09ae\\u0964\",\n                        \"signin\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthsignin\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"redirect_uri_mismatch\": \"\\u09aa\\u09c1\\u09a8\\u0983\\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09bf\\u09a4 URI OAUTH \\u0985\\u09cd\\u09af\\u09be\\u09aa \\u0995\\u09a8\\u09ab\\u09bf\\u0997\\u09be\\u09b0\\u09c7\\u09b6\\u09a8\\u09c7\\u09b0 \\u09b8\\u09be\\u09a5\\u09c7 \\u09ae\\u09bf\\u09b2\\u099b\\u09c7 \\u09a8\\u09be\\u0964\",\n                        \"oauthcallbackerror\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthcreateaccount\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"emailcreateaccount\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"callback\": \"\\u098f\\u0995\\u099f\\u09bf \\u09ad\\u09bf\\u09a8\\u09cd\\u09a8 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09be\\u09b0 \\u099a\\u09c7\\u09b7\\u09cd\\u099f\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"oauthaccountnotlinked\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09b0\\u09bf\\u099a\\u09af\\u09bc \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09a4\\u09c7, \\u0986\\u09aa\\u09a8\\u09bf \\u09ae\\u09c2\\u09b2\\u09a4 \\u09af\\u09c7 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f\\u099f\\u09bf \\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0 \\u0995\\u09b0\\u09c7\\u099b\\u09c7\\u09a8 \\u09b8\\u09c7\\u0987 \\u098f\\u0995\\u0987 \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09be\\u0989\\u09a8\\u09cd\\u099f \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"emailsignin\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09be \\u09af\\u09be\\u09af\\u09bc\\u09a8\\u09bf\\u0964\",\n                        \"emailverify\": \"\\u0985\\u09a8\\u09c1\\u0997\\u09cd\\u09b0\\u09b9 \\u0995\\u09b0\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2\\u099f\\u09bf \\u09af\\u09be\\u099a\\u09be\\u0987 \\u0995\\u09b0\\u09c1\\u09a8, \\u098f\\u0995\\u099f\\u09bf \\u09a8\\u09a4\\u09c1\\u09a8 \\u0987\\u09ae\\u09c7\\u09b2 \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\",\n                        \"credentialssignin\": \"\\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09cd\\u09b0\\u09a6\\u09a4\\u09cd\\u09a4 \\u09ac\\u09bf\\u09ac\\u09b0\\u09a3\\u0997\\u09c1\\u09b2\\u09bf \\u09b8\\u09a0\\u09bf\\u0995 \\u0995\\u09bf\\u09a8\\u09be \\u09a4\\u09be \\u09aa\\u09b0\\u09c0\\u0995\\u09cd\\u09b7\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                        \"sessionrequired\": \"\\u098f\\u0987 \\u09aa\\u09c3\\u09b7\\u09cd\\u09a0\\u09be\\u099f\\u09bf \\u0985\\u09cd\\u09af\\u09be\\u0995\\u09cd\\u09b8\\u09c7\\u09b8 \\u0995\\u09b0\\u09a4\\u09c7 \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0987\\u09a8 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0986\\u09aa\\u09a8\\u09bf \\u09aa\\u09cd\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u0996\\u09be\\u09a8\\u09c7 \\u09aa\\u09cc\\u0981\\u099b\\u09c7\\u099b\\u09c7\\u09a8! \\u0986\\u09ae\\u09b0\\u09be \\u098f\\u0995\\u099f\\u09bf \\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09be\\u09a0\\u09bf\\u09af\\u09bc\\u09c7\\u099b\\u09bf \",\n                    \"verifyEmailLink\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09b8\\u09be\\u0987\\u09a8\\u0986\\u09aa \\u09b8\\u09ae\\u09cd\\u09aa\\u09c2\\u09b0\\u09cd\\u09a3 \\u0995\\u09b0\\u09a4\\u09c7 \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u09b8\\u09c7\\u0987 \\u0987\\u09ae\\u09c7\\u09b2\\u09c7\\u09b0 \\u09b2\\u09bf\\u0999\\u09cd\\u0995\\u099f\\u09bf\\u09a4\\u09c7 \\u0995\\u09cd\\u09b2\\u09bf\\u0995 \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"didNotReceive\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u0996\\u09c1\\u0981\\u099c\\u09c7 \\u09aa\\u09be\\u099a\\u09cd\\u099b\\u09c7\\u09a8 \\u09a8\\u09be?\",\n                    \"resendEmail\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09aa\\u09be\\u09a0\\u09be\\u09a8\",\n                    \"goBack\": \"\\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u0993\",\n                    \"emailSent\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09aa\\u09be\\u09a0\\u09be\\u09a8\\u09cb \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\",\n                    \"verifyEmail\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be \\u09af\\u09be\\u099a\\u09be\\u0987 \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u099a\\u09be\\u09b2\\u09bf\\u09af\\u09bc\\u09c7 \\u09af\\u09be\\u09a8\",\n                    \"signup\": \"{{provider}} \\u09a6\\u09bf\\u09af\\u09bc\\u09c7 \\u09b8\\u09be\\u0987\\u09a8 \\u0986\\u09aa \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"passwordsMustMatch\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u0985\\u09ac\\u09b6\\u09cd\\u09af\\u0987 \\u09ae\\u09bf\\u09b2\\u09a4\\u09c7 \\u09b9\\u09ac\\u09c7\",\n                    \"confirmPasswordRequired\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09be \\u098f\\u0995\\u099f\\u09bf \\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"newPassword\": \"\\u09a8\\u09a4\\u09c1\\u09a8 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\",\n                    \"confirmPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\",\n                    \"resetPassword\": \"\\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09b0\\u09bf\\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09c1\\u09a8\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0987-\\u09ae\\u09c7\\u0987\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be\",\n                    \"emailRequired\": \"\\u0987\\u09ae\\u09c7\\u09b2 \\u098f\\u0995\\u099f\\u09bf \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u09c0\\u09af\\u09bc \\u0995\\u09cd\\u09b7\\u09c7\\u09a4\\u09cd\\u09b0\",\n                    \"emailSent\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1\\u099f\\u09bf \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09be\\u09b0 \\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09be\\u09ac\\u09b2\\u09c0\\u09b0 \\u099c\\u09a8\\u09cd\\u09af \\u09a6\\u09af\\u09bc\\u09be \\u0995\\u09b0\\u09c7 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be {{email}} \\u09aa\\u09b0\\u09c0\\u0995\\u09cd\\u09b7\\u09be \\u0995\\u09b0\\u09c1\\u09a8\\u0964\",\n                    \"enterEmail\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u0987\\u09ae\\u09c7\\u09b2 \\u09a0\\u09bf\\u0995\\u09be\\u09a8\\u09be \\u09b2\\u09bf\\u0996\\u09c1\\u09a8 \\u098f\\u09ac\\u0982 \\u0986\\u09ae\\u09b0\\u09be \\u0986\\u09aa\\u09a8\\u09be\\u0995\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09aa\\u09be\\u09b8\\u0993\\u09af\\u09bc\\u09be\\u09b0\\u09cd\\u09a1 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b8\\u09c7\\u099f \\u0995\\u09b0\\u09a4\\u09c7 \\u09a8\\u09bf\\u09b0\\u09cd\\u09a6\\u09c7\\u09b6\\u09be\\u09ac\\u09b2\\u09c0 \\u09aa\\u09be\\u09a0\\u09be\\u09ac\\u0964\",\n                    \"resendEmail\": \"\\u0987\\u09ae\\u09c7\\u0987\\u09b2 \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09aa\\u09be\\u09a0\\u09be\\u09a8\",\n                    \"continue\": \"\\u0985\\u09ac\\u09bf\\u09b0\\u09a4\",\n                    \"goBack\": \"\\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u0993\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0987\\u09a4\\u09bf\\u09b9\\u09be\\u09b8 \\u09a6\\u09c7\\u0996\\u09be\\u09a8\",\n                        \"lastInputs\": \"\\u09b8\\u09b0\\u09cd\\u09ac\\u09b6\\u09c7\\u09b7 \\u0987\\u09a8\\u09aa\\u09c1\\u099f\",\n                        \"noInputs\": \"\\u098f\\u09a4 \\u09ab\\u09be\\u0981\\u0995\\u09be...\",\n                        \"loading\": \"\\u09b2\\u09cb\\u09a1\\u0964\\u0964\\u0964\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u098f\\u0996\\u09be\\u09a8\\u09c7 \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u099f\\u09be\\u0987\\u09aa \\u0995\\u09b0\\u09c1\\u09a8...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u09b0\\u09c7\\u0995\\u09b0\\u09cd\\u09a1\\u09bf\\u0982 \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"stop\": \"\\u09b0\\u09c7\\u0995\\u09b0\\u09cd\\u09a1\\u09bf\\u0982 \\u09ac\\u09a8\\u09cd\\u09a7 \\u0995\\u09b0\\u09c1\\u09a8\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u09aa\\u09cd\\u09b0\\u09c7\\u09b0\\u09a3 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"stopTask\": \"\\u09b8\\u09cd\\u099f\\u09aa \\u099f\\u09be\\u09b8\\u09cd\\u0995\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u09ab\\u09be\\u0987\\u09b2 \\u09b8\\u0982\\u09af\\u09c1\\u0995\\u09cd\\u09a4 \\u0995\\u09b0\\u09c1\\u09a8\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u09b8\\u0999\\u09cd\\u0997\\u09c7 \\u09a8\\u09bf\\u09b0\\u09cd\\u09ae\\u09bf\\u09a4\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u099a\\u09b2\\u09ae\\u09be\\u09a8\",\n                        \"executedSuccessfully\": \"\\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09b8\\u09ae\\u09cd\\u09aa\\u09be\\u09a6\\u09bf\\u09a4 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                        \"failed\": \"\\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5\",\n                        \"feedbackUpdated\": \"\\u09ab\\u09bf\\u09a1\\u09ac\\u09cd\\u09af\\u09be\\u0995 \\u0986\\u09aa\\u09a1\\u09c7\\u099f \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                        \"updating\": \"\\u0986\\u09a7\\u09c1\\u09a8\\u09bf\\u0995\\u09c0\\u0995\\u09b0\\u09a3\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09ab\\u09be\\u0987\\u09b2\\u0997\\u09c1\\u09b2\\u09bf \\u098f\\u0996\\u09be\\u09a8\\u09c7 \\u09ab\\u09c7\\u09b2\\u09c7 \\u09a6\\u09bf\\u09a8\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u0995\\u09b0\\u09a4\\u09c7 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5 \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n                    \"cancelledUploadOf\": \"\\u098f\\u09b0 \\u0986\\u09aa\\u09b2\\u09cb\\u09a1 \\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                    \"couldNotReachServer\": \"\\u09b8\\u09be\\u09b0\\u09cd\\u09ad\\u09be\\u09b0\\u09c7 \\u09aa\\u09cc\\u0981\\u099b\\u09be\\u09a8\\u09cb \\u09af\\u09be\\u09af\\u09bc\\u09a8\\u09bf\",\n                    \"continuingChat\": \"\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\\u09ac\\u09b0\\u09cd\\u09a4\\u09c0 \\u099a\\u09cd\\u09af\\u09be\\u099f \\u0985\\u09ac\\u09bf\\u09b0\\u09a4 \\u09b0\\u09be\\u0996\\u09be\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u09b8\\u09c7\\u099f\\u09bf\\u0982\\u09b8 \\u09aa\\u09cd\\u09af\\u09be\\u09a8\\u09c7\\u09b2\",\n                    \"reset\": \"\\u09b0\\u09bf\\u09b8\\u09c7\\u099f\",\n                    \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                    \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u09b8\\u09ac\",\n                            \"feedbackPositive\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u0987\\u09a4\\u09bf\\u09ac\\u09be\\u099a\\u0995\",\n                            \"feedbackNegative\": \"\\u09aa\\u09cd\\u09b0\\u09a4\\u09bf\\u0995\\u09cd\\u09b0\\u09bf\\u09af\\u09bc\\u09be: \\u09a8\\u09c7\\u09a4\\u09bf\\u09ac\\u09be\\u099a\\u0995\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u09b8\\u09a8\\u09cd\\u09a7\\u09be\\u09a8\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u098f\\u099f\\u09bf \\u09a5\\u09cd\\u09b0\\u09c7\\u09a1\\u09c7\\u09b0 \\u09aa\\u09be\\u09b6\\u09be\\u09aa\\u09be\\u09b6\\u09bf \\u098f\\u09b0 \\u09ac\\u09be\\u09b0\\u09cd\\u09a4\\u09be \\u098f\\u09ac\\u0982 \\u0989\\u09aa\\u09be\\u09a6\\u09be\\u09a8\\u0997\\u09c1\\u09b2\\u09bf\\u0993 \\u09ae\\u09c1\\u099b\\u09c7 \\u09ab\\u09c7\\u09b2\\u09ac\\u09c7\\u0964\",\n                        \"cancel\": \"\\u09ac\\u09be\\u09a4\\u09bf\\u09b2\",\n                        \"confirm\": \"\\u09a8\\u09bf\\u09b6\\u09cd\\u099a\\u09bf\\u09a4\",\n                        \"deletingChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09ae\\u09cb\\u099b\\u09be \\u09b9\\u099a\\u09cd\\u099b\\u09c7\",\n                        \"chatDeleted\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09ae\\u09cb\\u099b\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0985\\u09a4\\u09c0\\u09a4 \\u099a\\u09cd\\u09af\\u09be\\u099f\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0996\\u09be\\u09b2\\u09bf\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0986\\u099c\",\n                        \"yesterday\": \"\\u0997\\u09a4\\u0995\\u09be\\u09b2\",\n                        \"previous7days\": \"Previous 7 \\u09a6\\u09bf\\u09a8\",\n                        \"previous30days\": \"\\u09aa\\u09c2\\u09b0\\u09cd\\u09ac\\u09ac\\u09b0\\u09cd\\u09a4\\u09c0 30 \\u09a6\\u09bf\\u09a8\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u09b8\\u09be\\u0987\\u09a1\\u09ac\\u09be\\u09b0 \\u09ac\\u09a8\\u09cd\\u09a7 \\u0995\\u09b0\\u09c1\\u09a8\",\n                        \"openSidebar\": \"\\u09b8\\u09be\\u0987\\u09a1\\u09ac\\u09be\\u09b0 \\u0996\\u09c1\\u09b2\\u09c1\\u09a8\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f\\u09c7 \\u09ab\\u09bf\\u09b0\\u09c7 \\u09af\\u09be\\u09a8\",\n                    \"chatCreatedOn\": \"\\u098f\\u0987 \\u099a\\u09cd\\u09af\\u09be\\u099f\\u099f\\u09bf \\u09a4\\u09c8\\u09b0\\u09bf \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09bf\\u09b2\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0986\\u09b2\\u09be\\u09aa\",\n                \"readme\": \"\\u09b0\\u09bf\\u09a1\\u09ae\\u09bf\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u09b8\\u09b0\\u09ac\\u09b0\\u09be\\u09b9\\u0995\\u09be\\u09b0\\u09c0\\u09a6\\u09c7\\u09b0 \\u0986\\u09a8\\u09a4\\u09c7 \\u09ac\\u09cd\\u09af\\u09b0\\u09cd\\u09a5:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u09b8\\u09ab\\u09b2\\u09ad\\u09be\\u09ac\\u09c7 \\u09b8\\u0982\\u09b0\\u0995\\u09cd\\u09b7\\u09a3 \\u0995\\u09b0\\u09be \\u09b9\\u09af\\u09bc\\u09c7\\u099b\\u09c7\",\n            \"requiredApiKeys\": \"\\u0986\\u09ac\\u09b6\\u09cd\\u09af\\u0995 API \\u0995\\u09c0\",\n            \"requiredApiKeysInfo\": \"\\u098f\\u0987 \\u0985\\u09cd\\u09af\\u09be\\u09aa\\u099f\\u09bf \\u09ac\\u09cd\\u09af\\u09ac\\u09b9\\u09be\\u09b0 \\u0995\\u09b0\\u09a4\\u09c7, \\u09a8\\u09bf\\u09ae\\u09cd\\u09a8\\u09b2\\u09bf\\u0996\\u09bf\\u09a4 API \\u0995\\u09c0\\u0997\\u09c1\\u09b2\\u09bf\\u09b0 \\u09aa\\u09cd\\u09b0\\u09af\\u09bc\\u09cb\\u099c\\u09a8\\u0964 \\u0995\\u09c0\\u0997\\u09c1\\u09b2\\u09bf \\u0986\\u09aa\\u09a8\\u09be\\u09b0 \\u09a1\\u09bf\\u09ad\\u09be\\u0987\\u09b8\\u09c7\\u09b0 \\u09b8\\u09cd\\u09a5\\u09be\\u09a8\\u09c0\\u09af\\u09bc \\u09b8\\u09cd\\u099f\\u09cb\\u09b0\\u09c7\\u099c\\u09c7 \\u09b8\\u099e\\u09cd\\u099a\\u09bf\\u09a4 \\u09b0\\u09af\\u09bc\\u09c7\\u099b\\u09c7\\u0964\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0986\\u09aa\\u09a8\\u09bf \\u098f\\u0987 \\u09aa\\u09cd\\u09b0\\u0995\\u09b2\\u09cd\\u09aa\\u09c7\\u09b0 \\u0985\\u0982\\u09b6 \\u09a8\\u09a8\\u0964\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u099a\\u09cd\\u09af\\u09be\\u099f \\u09aa\\u09c1\\u09a8\\u09b0\\u09be\\u09af\\u09bc \\u09b6\\u09c1\\u09b0\\u09c1 \\u0995\\u09b0\\u09c1\\u09a8\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/en-US.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"Settings\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"New Chat\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f Task List\",\n                    \"loading\": \"Loading...\",\n                    \"error\": \"An error occurred\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"Cancel upload\",\n                \"removeAttachment\": \"Remove attachment\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"Create new chat?\",\n                \"clearChat\": \"This will clear the current messages and start a new chat.\",\n                \"cancel\": \"Cancel\",\n                \"confirm\": \"Confirm\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"Settings\",\n                \"expandMessages\": \"Expand Messages\",\n                \"hideChainOfThought\": \"Hide Chain of Thought\",\n                \"darkMode\": \"Dark Mode\"\n            },\n            \"detailsButton\": {\n                \"using\": \"Using\",\n                \"used\": \"Used\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"Login to access the app.\",\n                    \"form\": {\n                        \"email\": \"Email address\",\n                        \"password\": \"Password\",\n                        \"noAccount\": \"Don't have an account?\",\n                        \"alreadyHaveAccount\": \"Already have an account?\",\n                        \"signup\": \"Sign Up\",\n                        \"signin\": \"Sign In\",\n                        \"or\": \"OR\",\n                        \"continue\": \"Continue\",\n                        \"forgotPassword\": \"Forgot password?\",\n                        \"passwordMustContain\": \"Your password must contain:\",\n                        \"emailRequired\": \"email is a required field\",\n                        \"passwordRequired\": \"password is a required field\"\n                    },\n                    \"error\": {\n                        \"default\": \"Unable to sign in.\",\n                        \"signin\": \"Try signing in with a different account.\",\n                        \"oauthsignin\": \"Try signing in with a different account.\",\n                        \"redirect_uri_mismatch\": \"The redirect URI is not matching the oauth app configuration.\",\n                        \"oauthcallbackerror\": \"Try signing in with a different account.\",\n                        \"oauthcreateaccount\": \"Try signing in with a different account.\",\n                        \"emailcreateaccount\": \"Try signing in with a different account.\",\n                        \"callback\": \"Try signing in with a different account.\",\n                        \"oauthaccountnotlinked\": \"To confirm your identity, sign in with the same account you used originally.\",\n                        \"emailsignin\": \"The e-mail could not be sent.\",\n                        \"emailverify\": \"Please verify your email, a new email has been sent.\",\n                        \"credentialssignin\": \"Sign in failed. Check the details you provided are correct.\",\n                        \"sessionrequired\": \"Please sign in to access this page.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"You're almost there! We've sent an email to \",\n                    \"verifyEmailLink\": \"Please click on the link in that email to complete your signup.\",\n                    \"didNotReceive\": \"Can't find the email?\",\n                    \"resendEmail\": \"Resend email\",\n                    \"goBack\": \"Go Back\",\n                    \"emailSent\": \"Email sent successfully.\",\n                    \"verifyEmail\": \"Verify your email address\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"Continue with {{provider}}\",\n                    \"signup\": \"Sign up with {{provider}}\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"New password is a required field\",\n                    \"passwordsMustMatch\": \"Passwords must match\",\n                    \"confirmPasswordRequired\": \"Confirm password is a required field\",\n                    \"newPassword\": \"New password\",\n                    \"confirmPassword\": \"Confirm password\",\n                    \"resetPassword\": \"Reset Password\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"Email address\",\n                    \"emailRequired\": \"email is a required field\",\n                    \"emailSent\": \"Please check the email address {{email}} for instructions to reset your password.\",\n                    \"enterEmail\": \"Enter your email address and we will send you instructions to reset your password.\",\n                    \"resendEmail\": \"Resend email\",\n                    \"continue\": \"Continue\",\n                    \"goBack\": \"Go Back\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"Show history\",\n                        \"lastInputs\": \"Last Inputs\",\n                        \"noInputs\": \"Such empty...\",\n                        \"loading\": \"Loading...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"Type your message here...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"Start recording\",\n                        \"stop\": \"Stop recording\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"Send message\",\n                        \"stopTask\": \"Stop Task\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"Attach files\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"Built with\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"Running\",\n                        \"executedSuccessfully\": \"executed successfully\",\n                        \"failed\": \"failed\",\n                        \"feedbackUpdated\": \"Feedback updated\",\n                        \"updating\": \"Updating\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"Drop your files here\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"Failed to upload\",\n                    \"cancelledUploadOf\": \"Cancelled upload of\",\n                    \"couldNotReachServer\": \"Could not reach the server\",\n                    \"continuingChat\": \"Continuing previous chat\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"Settings panel\",\n                    \"reset\": \"Reset\",\n                    \"cancel\": \"Cancel\",\n                    \"confirm\": \"Confirm\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"Feedback: All\",\n                            \"feedbackPositive\": \"Feedback: Positive\",\n                            \"feedbackNegative\": \"Feedback: Negative\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"Search\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"This will delete the thread as well as it's messages and elements.\",\n                        \"cancel\": \"Cancel\",\n                        \"confirm\": \"Confirm\",\n                        \"deletingChat\": \"Deleting chat\",\n                        \"chatDeleted\": \"Chat deleted\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"Past Chats\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"Empty...\",\n                        \"today\": \"Today\",\n                        \"yesterday\": \"Yesterday\",\n                        \"previous7days\": \"Previous 7 days\",\n                        \"previous30days\": \"Previous 30 days\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"Close sidebar\",\n                        \"openSidebar\": \"Open sidebar\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"Go back to chat\",\n                    \"chatCreatedOn\": \"This chat was created on\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"Chat\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"Failed to fetch providers:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"Saved successfully\",\n            \"requiredApiKeys\": \"Required API Keys\",\n            \"requiredApiKeysInfo\": \"To use this app, the following API keys are required. The keys are stored on your device's local storage.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"You are not part of this project.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"Resume Chat\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/gu.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0a95\\u0ac0\\u0a93\",\n                        \"logout\": \"\\u0aac\\u0ab9\\u0abe\\u0ab0 \\u0aa8\\u0ac0\\u0a95\\u0ab3\\u0acb\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0aa8\\u0ab5\\u0acb \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0a95\\u0abe\\u0ab0\\u0acd\\u0aaf \\u0aaf\\u0abe\\u0aa6\\u0ac0\",\n                    \"loading\": \"\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7...\",\n                    \"error\": \"\\u0aad\\u0ac2\\u0ab2 \\u0a89\\u0aa6\\u0acd\\u0aad\\u0ab5\\u0ac0\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0ab0\\u0aa6 \\u0a95\\u0ab0\\u0acb\",\n                \"removeAttachment\": \"\\u0a9c\\u0acb\\u0aa1\\u0abe\\u0aa3\\u0aa8\\u0ac7 \\u0aa6\\u0ac2\\u0ab0 \\u0a95\\u0ab0\\u0acb\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0ab6\\u0ac1\\u0a82 \\u0aa8\\u0ab5\\u0ac1\\u0a82 \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6 \\u0aac\\u0aa8\\u0abe\\u0ab5\\u0ab5\\u0ac1\\u0a82 \\u0a9b\\u0ac7?\",\n                \"clearChat\": \"\\u0a86 \\u0ab5\\u0ab0\\u0acd\\u0aa4\\u0aae\\u0abe\\u0aa8 \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe\\u0a93\\u0aa8\\u0ac7 \\u0ab8\\u0abe\\u0aab \\u0a95\\u0ab0\\u0ab6\\u0ac7 \\u0a85\\u0aa8\\u0ac7 \\u0aa8\\u0ab5\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0ab6\\u0ac7.\",\n                \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                \"expandMessages\": \"\\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe\\u0a93 \\u0ab5\\u0abf\\u0ab8\\u0acd\\u0aa4\\u0ac3\\u0aa4 \\u0a95\\u0ab0\\u0acb\",\n                \"hideChainOfThought\": \"\\u0ab5\\u0abf\\u0a9a\\u0abe\\u0ab0\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0a82\\u0a95\\u0ab3 \\u0a9b\\u0ac1\\u0aaa\\u0abe\\u0ab5\\u0acb\",\n                \"darkMode\": \"\\u0a98\\u0abe\\u0a9f\\u0ac0 \\u0ab8\\u0acd\\u0aa5\\u0abf\\u0aa4\\u0abf\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0ab5\\u0abe\\u0aaa\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\",\n                \"running\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0ac1 \\u0a9b\\u0ac7\",\n                \"took_one\": \"{{count}} \\u0aaa\\u0a97\\u0ab2\\u0ac1\\u0a82 \\u0aad\\u0ab0\\u0acd\\u0aaf\\u0ac1\\u0a82\",\n                \"took_other\": \"{{count}} \\u0aaa\\u0a97\\u0ab2\\u0abe\\u0a82\\u0a93 \\u0ab2\\u0ac0\\u0aa7\\u0abe\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8\\u0aa8\\u0ac7 \\u0a8d\\u0a95\\u0acd\\u0ab8\\u0ac7\\u0ab8 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0ab2\\u0acb\\u0a97\\u0abf\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                    \"form\": {\n                        \"email\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0ab0\\u0aa8\\u0abe\\u0aae\\u0ac1\\u0a82\",\n                        \"password\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                        \"noAccount\": \"\\u0a96\\u0abe\\u0aa4\\u0ac1\\u0a82 \\u0aa8\\u0aa5\\u0ac0?\",\n                        \"alreadyHaveAccount\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0ac7\\u0aa5\\u0ac0 \\u0a9c \\u0a96\\u0abe\\u0aa4\\u0ac1\\u0a82 \\u0a9b\\u0ac7?\",\n                        \"signup\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a85\\u0aaa \\u0a95\\u0ab0\\u0acb\",\n                        \"signin\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb\",\n                        \"or\": \"\\u0a85\\u0aa5\\u0ab5\\u0abe\",\n                        \"continue\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                        \"forgotPassword\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0aad\\u0ac2\\u0ab2\\u0ac0 \\u0a97\\u0aaf\\u0abe?\",\n                        \"passwordMustContain\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab8\\u0aae\\u0abe\\u0ab5\\u0aa4\\u0acb \\u0a9c \\u0ab9\\u0acb\\u0ab5\\u0acb \\u0a9c\\u0acb\\u0a87\\u0a8f:\",\n                        \"emailRequired\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                        \"passwordRequired\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0aaa\\u0acd\\u0ab0\\u0ab5\\u0ac7\\u0ab6 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0a85\\u0ab8\\u0aae\\u0ab0\\u0acd\\u0aa5.\",\n                        \"signin\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthsignin\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"redirect_uri_mismatch\": \"\\u0ab0\\u0ac0\\u0aa1\\u0abe\\u0aaf\\u0ab0\\u0ac7\\u0a95\\u0acd\\u0a9f URI \\u0a8f oauth \\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8 \\u0ab0\\u0ac2\\u0aaa\\u0ab0\\u0ac7\\u0a96\\u0abe\\u0a82\\u0a95\\u0aa8 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aac\\u0a82\\u0aa7\\u0aac\\u0ac7\\u0ab8\\u0aa4\\u0ac0 \\u0aa8\\u0aa5\\u0ac0.\",\n                        \"oauthcallbackerror\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthcreateaccount\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"emailcreateaccount\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"callback\": \"\\u0a85\\u0ab2\\u0a97 \\u0a96\\u0abe\\u0aa4\\u0abe \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0acb \\u0aaa\\u0acd\\u0ab0\\u0aaf\\u0aa4\\u0acd\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"oauthaccountnotlinked\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac0 \\u0a93\\u0ab3\\u0a96\\u0aa8\\u0ac0 \\u0aaa\\u0ac1\\u0ab7\\u0acd\\u0a9f\\u0abf \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7, \\u0aa4\\u0aae\\u0ac7 \\u0a9c\\u0ac7 \\u0aae\\u0ac2\\u0ab3\\u0aad\\u0ac2\\u0aa4 \\u0ab0\\u0ac0\\u0aa4\\u0ac7 \\u0a89\\u0aaa\\u0aaf\\u0acb\\u0a97 \\u0a95\\u0ab0\\u0acd\\u0aaf\\u0acb \\u0ab9\\u0aa4\\u0acb \\u0aa4\\u0ac7 \\u0a9c \\u0a8f\\u0a95\\u0abe\\u0a89\\u0aa8\\u0acd\\u0a9f \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb.\",\n                        \"emailsignin\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ac0 \\u0ab6\\u0a95\\u0abe\\u0aaf\\u0acb \\u0aa8\\u0ab9\\u0abf.\",\n                        \"emailverify\": \"\\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2\\u0aa8\\u0ac0 \\u0a96\\u0abe\\u0aa4\\u0acd\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb, \\u0a8f\\u0a95 \\u0aa8\\u0ab5\\u0ac1\\u0a82 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0a86\\u0ab5\\u0acd\\u0aaf\\u0ac1\\u0a82 \\u0a9b\\u0ac7.\",\n                        \"credentialssignin\": \"\\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3. \\u0aa4\\u0aae\\u0ac7 \\u0aaa\\u0ac2\\u0ab0\\u0ac0 \\u0aaa\\u0abe\\u0aa1\\u0ac7\\u0ab2\\u0ac0 \\u0ab5\\u0abf\\u0a97\\u0aa4\\u0acb \\u0ab8\\u0abe\\u0a9a\\u0ac0 \\u0a9b\\u0ac7 \\u0aa4\\u0ac7 \\u0a9a\\u0a95\\u0abe\\u0ab8\\u0acb.\",\n                        \"sessionrequired\": \"\\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0a86 \\u0aaa\\u0ac3\\u0ab7\\u0acd\\u0aa0\\u0aa8\\u0ac7 \\u0a8d\\u0a95\\u0acd\\u0ab8\\u0ac7\\u0ab8 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a87\\u0aa8 \\u0a95\\u0ab0\\u0acb.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0aa4\\u0aae\\u0ac7 \\u0aa4\\u0acb \\u0ab2\\u0a97\\u0aad\\u0a97 \\u0aa4\\u0acd\\u0aaf\\u0abe\\u0a82 \\u0a9c \\u0a9b\\u0acb! \\u0a85\\u0aae\\u0ac7 \\u0a86\\u0aa8\\u0abe \\u0aaa\\u0ab0 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acd\\u0aaf\\u0acb \\u0a9b\\u0ac7 \",\n                    \"verifyEmailLink\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0ab8\\u0abe\\u0a87\\u0aa8\\u0a85\\u0aaa \\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0aa3 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0ac7 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2\\u0aa8\\u0ac0 \\u0ab2\\u0abf\\u0a82\\u0a95 \\u0aaa\\u0ab0 \\u0a95\\u0acd\\u0ab2\\u0abf\\u0a95 \\u0a95\\u0ab0\\u0acb.\",\n                    \"didNotReceive\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab6\\u0acb\\u0aa7\\u0ac0 \\u0ab6\\u0a95\\u0aa4\\u0abe \\u0aa8\\u0aa5\\u0ac0?\",\n                    \"resendEmail\": \"\\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aab\\u0ab0\\u0ac0 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                    \"goBack\": \"\\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\",\n                    \"emailSent\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0abe\\u0a88 \\u0a97\\u0aaf\\u0acb.\",\n                    \"verifyEmail\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8\\u0aa8\\u0ac0 \\u0a96\\u0abe\\u0aa4\\u0acd\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                    \"signup\": \"{{provider}} \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0a87\\u0aa8 \\u0a85\\u0aaa \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0aa8\\u0ab5\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"passwordsMustMatch\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\\u0acb \\u0aac\\u0a82\\u0aa7\\u0aac\\u0ac7\\u0ab8\\u0aa4\\u0abe \\u0a9c \\u0ab9\\u0acb\\u0ab5\\u0abe \\u0a9c\\u0acb\\u0a88\\u0a8f\",\n                    \"confirmPasswordRequired\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"newPassword\": \"\\u0aa8\\u0ab5\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                    \"confirmPassword\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\",\n                    \"resetPassword\": \"\\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1\\u0aa8\\u0ac7 \\u0aaa\\u0ac1\\u0aa8:\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0abf\\u0aa4 \\u0a95\\u0ab0\\u0acb\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0ab8\\u0ab0\\u0aa8\\u0abe\\u0aae\\u0ac1\\u0a82\",\n                    \"emailRequired\": \"\\u0a88-\\u0aae\\u0ac7\\u0a88\\u0ab2 \\u0a8f \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a95\\u0acd\\u0ab7\\u0ac7\\u0aa4\\u0acd\\u0ab0 \\u0a9b\\u0ac7\",\n                    \"emailSent\": \"\\u0ab8\\u0ac2\\u0a9a\\u0aa8\\u0abe\\u0a93 \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a95\\u0ac3\\u0aaa\\u0abe \\u0a95\\u0ab0\\u0ac0\\u0aa8\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab0\\u0abf\\u0ab8\\u0ac5\\u0a9f \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8 {{email}} \\u0a9a\\u0a95\\u0abe\\u0ab8\\u0acb.\",\n                    \"enterEmail\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac1\\u0a82 \\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0a8f\\u0aa1\\u0acd\\u0ab0\\u0ac7\\u0ab8 \\u0aa6\\u0abe\\u0a96\\u0ab2 \\u0a95\\u0ab0\\u0acb \\u0a85\\u0aa8\\u0ac7 \\u0a85\\u0aae\\u0ac7 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0aaa\\u0abe\\u0ab8\\u0ab5\\u0ab0\\u0acd\\u0aa1 \\u0ab0\\u0ac0\\u0ab8\\u0ac7\\u0a9f \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7 \\u0aa4\\u0aae\\u0aa8\\u0ac7 \\u0ab8\\u0ac2\\u0a9a\\u0aa8\\u0abe\\u0a93 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0ac0\\u0ab6\\u0ac1\\u0a82.\",\n                    \"resendEmail\": \"\\u0a87\\u0aae\\u0ac7\\u0a87\\u0ab2 \\u0aab\\u0ab0\\u0ac0 \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                    \"continue\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0acb\",\n                    \"goBack\": \"\\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0a87\\u0aa4\\u0abf\\u0ab9\\u0abe\\u0ab8 \\u0aac\\u0aa4\\u0abe\\u0ab5\\u0acb\",\n                        \"lastInputs\": \"\\u0a9b\\u0ac7\\u0ab2\\u0acd\\u0ab2\\u0abe \\u0a87\\u0aa8\\u0aaa\\u0ac1\\u0a9f\\u0acd\\u0ab8\",\n                        \"noInputs\": \"\\u0a86\\u0ab5\\u0abe \\u0a96\\u0abe\\u0ab2\\u0ac0...\",\n                        \"loading\": \"\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0acb \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0acb \\u0a85\\u0ab9\\u0ac0\\u0a82 \\u0a9f\\u0abe\\u0a87\\u0aaa \\u0a95\\u0ab0\\u0acb...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0ab0\\u0ac7\\u0a95\\u0acb\\u0ab0\\u0acd\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0acb\",\n                        \"stop\": \"\\u0ab0\\u0ac7\\u0a95\\u0acb\\u0ab0\\u0acd\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aa8\\u0ac1\\u0a82 \\u0aac\\u0a82\\u0aa7 \\u0a95\\u0ab0\\u0acb\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0acb \\u0aae\\u0acb\\u0a95\\u0ab2\\u0acb\",\n                        \"stopTask\": \"\\u0a95\\u0abe\\u0ab0\\u0acd\\u0aaf\\u0aa8\\u0ac7 \\u0a85\\u0a9f\\u0a95\\u0abe\\u0ab5\\u0acb\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0aab\\u0abe\\u0a87\\u0ab2\\u0acb\\u0aa8\\u0ac7 \\u0a9c\\u0acb\\u0aa1\\u0acb\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aac\\u0abf\\u0ab2\\u0acd\\u0a9f \\u0aa5\\u0aaf\\u0ac7\\u0ab2\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0a9a\\u0abe\\u0ab2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0ac1 \\u0a9b\\u0ac7\",\n                        \"executedSuccessfully\": \"\\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0a9a\\u0ab2\\u0abe\\u0ab5\\u0acd\\u0aaf\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                        \"failed\": \"\\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\",\n                        \"feedbackUpdated\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6 \\u0ab8\\u0ac1\\u0aa7\\u0abe\\u0ab0\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                        \"updating\": \"\\u0ab8\\u0ac1\\u0aa7\\u0abe\\u0ab0\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0aa4\\u0aae\\u0abe\\u0ab0\\u0ac0 \\u0aab\\u0abe\\u0a87\\u0ab2\\u0acb\\u0aa8\\u0ac7 \\u0a85\\u0a82\\u0ab9\\u0abf \\u0aae\\u0ac2\\u0a95\\u0acb\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0a95\\u0ab0\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\",\n                    \"cancelledUploadOf\": \"\\u0aa8\\u0ac1\\u0a82 \\u0a85\\u0aaa\\u0ab2\\u0acb\\u0aa1 \\u0ab0\\u0aa6 \\u0aa5\\u0aaf\\u0ac7\\u0ab2 \\u0a9b\\u0ac7\",\n                    \"couldNotReachServer\": \"\\u0ab8\\u0ab0\\u0acd\\u0ab5\\u0ab0 \\u0ab8\\u0ac1\\u0aa7\\u0ac0 \\u0aaa\\u0ab9\\u0acb\\u0a82\\u0a9a\\u0ac0 \\u0ab6\\u0a95\\u0acd\\u0aaf\\u0abe \\u0aa8\\u0ab9\\u0abf\\u0a82\",\n                    \"continuingChat\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4\\u0aa8\\u0ac7 \\u0a9a\\u0abe\\u0ab2\\u0ac1 \\u0ab0\\u0abe\\u0a96\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac7\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0aaa\\u0ac7\\u0aa8\\u0ab2 \\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0aa8\\u0acb\",\n                    \"reset\": \"\\u0aaa\\u0ac1\\u0aa8:\\u0ab8\\u0ac1\\u0aaf\\u0acb\\u0a9c\\u0abf\\u0aa4 \\u0a95\\u0ab0\\u0acb\",\n                    \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                    \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0aac\\u0aa7\\u0abe\",\n                            \"feedbackPositive\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0ab9\\u0a95\\u0abe\\u0ab0\\u0abe\\u0aa4\\u0acd\\u0aae\\u0a95\",\n                            \"feedbackNegative\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa4\\u0abf\\u0ab8\\u0abe\\u0aa6: \\u0aa8\\u0a95\\u0abe\\u0ab0\\u0abe\\u0aa4\\u0acd\\u0aae\\u0a95\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0ab6\\u0acb\\u0aa7\\u0ab5\\u0ac1\\u0a82\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0a86 \\u0aa5\\u0acd\\u0ab0\\u0ac7\\u0aa1\\u0aa8\\u0ac0 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0ab8\\u0abe\\u0aa5\\u0ac7 \\u0aa4\\u0ac7\\u0aa8\\u0abe \\u0ab8\\u0a82\\u0aa6\\u0ac7\\u0ab6\\u0abe \\u0a85\\u0aa8\\u0ac7 \\u0aa4\\u0aa4\\u0acd\\u0ab5\\u0acb\\u0aa8\\u0ac7 \\u0aaa\\u0aa3 \\u0a95\\u0abe\\u0aa2\\u0ac0 \\u0aa8\\u0abe\\u0a96\\u0ab6\\u0ac7.\",\n                        \"cancel\": \"\\u0ab0\\u0aa6\\u0acd\\u0aa6\",\n                        \"confirm\": \"\\u0a96\\u0abe\\u0aa4\\u0ab0\\u0ac0 \\u0a95\\u0ab0\\u0acb\",\n                        \"deletingChat\": \"\\u0a9a\\u0ac5\\u0a9f\\u0aa8\\u0ac7 \\u0a95\\u0abe\\u0aa2\\u0ac0 \\u0ab0\\u0ab9\\u0acd\\u0aaf\\u0abe \\u0a9b\\u0ac0\\u0a8f\",\n                        \"chatDeleted\": \"\\u0a9a\\u0ac5\\u0a9f \\u0aa1\\u0abf\\u0ab2\\u0ac0\\u0a9f \\u0aa5\\u0a88 \\u0a97\\u0a88\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0aad\\u0ac2\\u0aa4\\u0a95\\u0abe\\u0ab3\\u0aa8\\u0ac0 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4\\u0acb\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0a96\\u0abe\\u0ab2\\u0ac0...\",\n                        \"today\": \"\\u0a86\\u0a9c\\u0ac7\",\n                        \"yesterday\": \"\\u0a97\\u0a87\\u0a95\\u0abe\\u0ab2\\u0ac7\",\n                        \"previous7days\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0abe \\u0aed \\u0aa6\\u0abf\\u0ab5\\u0ab8\\u0acb\",\n                        \"previous30days\": \"\\u0aaa\\u0ab9\\u0ac7\\u0ab2\\u0abe\\u0aa8\\u0abe \\u0ae9\\u0ae6 \\u0aa6\\u0abf\\u0ab5\\u0ab8\\u0acb\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0aac\\u0abe\\u0a9c\\u0ac1\\u0aaa\\u0a9f\\u0acd\\u0a9f\\u0ac0\\u0aa8\\u0ac7 \\u0aac\\u0a82\\u0aa7 \\u0a95\\u0ab0\\u0acb\",\n                        \"openSidebar\": \"\\u0aac\\u0abe\\u0a9c\\u0ac1\\u0aaa\\u0a9f\\u0acd\\u0a9f\\u0ac0 \\u0a96\\u0acb\\u0ab2\\u0acb\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\\u0aae\\u0abe\\u0a82 \\u0aaa\\u0abe\\u0a9b\\u0abe \\u0a9c\\u0abe\\u0a93\",\n                    \"chatCreatedOn\": \"\\u0a86 \\u0ab5\\u0abe\\u0aa4\\u0a9a\\u0ac0\\u0aa4 \\u0aa4\\u0ac7\\u0aa8\\u0ac0 \\u0aaa\\u0ab0 \\u0aac\\u0aa8\\u0abe\\u0ab5\\u0ac7\\u0ab2 \\u0ab9\\u0aa4\\u0ac0\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\",\n                \"readme\": \"\\u0ab0\\u0ac0\\u0aa1\\u0aae\\u0ac7\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0aaa\\u0acd\\u0ab0\\u0aa6\\u0abe\\u0aa4\\u0abe\\u0a93\\u0aa8\\u0ac7 \\u0ab2\\u0abe\\u0ab5\\u0ab5\\u0abe\\u0aae\\u0abe\\u0a82 \\u0aa8\\u0abf\\u0ab7\\u0acd\\u0aab\\u0ab3\\u0aa4\\u0abe:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0ab8\\u0aab\\u0ab3\\u0aa4\\u0abe\\u0aaa\\u0ac2\\u0ab0\\u0acd\\u0ab5\\u0a95 \\u0ab8\\u0a82\\u0a97\\u0acd\\u0ab0\\u0ab9\\u0abe\\u0aaf\\u0ac7\\u0ab2\",\n            \"requiredApiKeys\": \"\\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 API \\u0a95\\u0ac0\\u0a93\",\n            \"requiredApiKeysInfo\": \"\\u0a86 \\u0a8f\\u0aaa\\u0acd\\u0ab2\\u0abf\\u0a95\\u0ac7\\u0ab6\\u0aa8\\u0aa8\\u0acb \\u0a89\\u0aaa\\u0aaf\\u0acb\\u0a97 \\u0a95\\u0ab0\\u0ab5\\u0abe \\u0aae\\u0abe\\u0a9f\\u0ac7, \\u0aa8\\u0ac0\\u0a9a\\u0ac7\\u0aa8\\u0ac0 API \\u0a95\\u0ac0\\u0a93 \\u0a9c\\u0ab0\\u0ac2\\u0ab0\\u0ac0 \\u0a9b\\u0ac7. \\u0a95\\u0ac0\\u0a93 \\u0aa4\\u0aae\\u0abe\\u0ab0\\u0abe \\u0aa1\\u0abf\\u0ab5\\u0abe\\u0a87\\u0ab8\\u0aa8\\u0abe \\u0ab8\\u0acd\\u0aa5\\u0abe\\u0aa8\\u0abf\\u0a95 \\u0ab8\\u0acd\\u0a9f\\u0acb\\u0ab0\\u0ac7\\u0a9c \\u0aaa\\u0ab0 \\u0ab8\\u0a82\\u0a97\\u0acd\\u0ab0\\u0ab9\\u0abf\\u0aa4 \\u0aa5\\u0abe\\u0aaf \\u0a9b\\u0ac7.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0aa4\\u0aae\\u0ac7 \\u0a86 \\u0aaa\\u0acd\\u0ab0\\u0acb\\u0a9c\\u0ac7\\u0a95\\u0acd\\u0a9f\\u0aa8\\u0acb \\u0aad\\u0abe\\u0a97 \\u0aa8\\u0aa5\\u0ac0.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0aab\\u0ab0\\u0ac0 \\u0ab6\\u0ab0\\u0ac2 \\u0a95\\u0ab0\\u0acb \\u0ab8\\u0a82\\u0ab5\\u0abe\\u0aa6\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/he-IL.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"\\u05d4\\u05ea\\u05e0\\u05ea\\u05e7\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f Task List\",\n                    \"loading\": \"\\u05d8\\u05d5\\u05e2\\u05df...\",\n                    \"error\": \"\\u05e9\\u05d2\\u05d9\\u05d0\\u05d4\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u05d1\\u05d8\\u05dc \\u05d4\\u05e2\\u05dc\\u05d0\\u05d4\",\n                \"removeAttachment\": \"\\u05d4\\u05e1\\u05e8 \\u05e7\\u05d5\\u05d1\\u05e5 \\u05de\\u05e6\\u05d5\\u05e8\\u05e3\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u05e6\\u05d5\\u05e8 \\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9?\",\n                \"clearChat\": \"\\u05e4\\u05e2\\u05d5\\u05dc\\u05d4 \\u05d6\\u05d5 \\u05ea\\u05e0\\u05e7\\u05d4 \\u05d0\\u05ea \\u05d4\\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea \\u05d4\\u05e0\\u05d5\\u05db\\u05d7\\u05d9\\u05d5\\u05ea \\u05d5\\u05ea\\u05ea\\u05d7\\u05d9\\u05dc \\u05e6'\\u05d0\\u05d8 \\u05d7\\u05d3\\u05e9.\",\n                \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                \"confirm\": \"\\u05d0\\u05e9\\u05e8\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                \"expandMessages\": \"\\u05d4\\u05e8\\u05d7\\u05d1 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea\",\n                \"hideChainOfThought\": \"\\u05d4\\u05e1\\u05ea\\u05e8 \\u05e9\\u05e8\\u05e9\\u05e8\\u05ea \\u05de\\u05d7\\u05e9\\u05d1\\u05d5\\u05ea\",\n                \"darkMode\": \"\\u05de\\u05e6\\u05d1 \\u05db\\u05d4\\u05d4\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u05de\\u05e9\\u05ea\\u05de\\u05e9 \\u05d1-\",\n                \"running\": \"\\u05e8\\u05e5\",\n                \"took_one\": \"\\u05dc\\u05e7\\u05d7 \\u05e6\\u05e2\\u05d3 {{count}}\",\n                \"took_other\": \"\\u05dc\\u05e7\\u05d7 \\u05e6\\u05e2\\u05d3\\u05d9\\u05dd {{count}}\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u05d4\\u05ea\\u05d7\\u05d1\\u05e8 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d2\\u05e9\\u05ea \\u05dc\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4.\",\n                    \"form\": {\n                        \"email\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                        \"password\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d0\",\n                        \"noAccount\": \"\\u05d0\\u05d9\\u05df \\u05dc\\u05da \\u05d7\\u05e9\\u05d1\\u05d5\\u05df?\",\n                        \"alreadyHaveAccount\": \"\\u05db\\u05d1\\u05e8 \\u05d9\\u05e9 \\u05dc\\u05da \\u05d7\\u05e9\\u05d1\\u05d5\\u05df?\",\n                        \"signup\": \"\\u05d4\\u05d9\\u05e8\\u05e9\\u05dd\",\n                        \"signin\": \"\\u05d4\\u05d9\\u05db\\u05e0\\u05e1\",\n                        \"or\": \"\\u05d0\\u05d5\",\n                        \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da\",\n                        \"forgotPassword\": \"\\u05e9\\u05db\\u05d7\\u05ea \\u05e1\\u05d9\\u05e1\\u05de\\u05d4?\",\n                        \"passwordMustContain\": \"\\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da \\u05d7\\u05d9\\u05d9\\u05d1\\u05ea \\u05dc\\u05d4\\u05db\\u05d9\\u05dc:\",\n                        \"emailRequired\": \"\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                        \"passwordRequired\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d4\\u05d9\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1.\",\n                        \"signin\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthsignin\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"redirect_uri_mismatch\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4-URI \\u05dc\\u05d4\\u05e4\\u05e0\\u05d9\\u05d4 \\u05d0\\u05d9\\u05e0\\u05d4 \\u05ea\\u05d5\\u05d0\\u05de\\u05ea \\u05dc\\u05ea\\u05e6\\u05d5\\u05e8\\u05ea \\u05d4\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4 \\u05e9\\u05dc oauth.\",\n                        \"oauthcallbackerror\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthcreateaccount\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"emailcreateaccount\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"callback\": \"\\u05e0\\u05e1\\u05d4 \\u05dc\\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05d0\\u05d7\\u05e8.\",\n                        \"oauthaccountnotlinked\": \"\\u05db\\u05d3\\u05d9 \\u05dc\\u05d0\\u05e9\\u05e8 \\u05d0\\u05ea \\u05d6\\u05d4\\u05d5\\u05ea\\u05da, \\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05e2\\u05dd \\u05d0\\u05d5\\u05ea\\u05d5 \\u05d7\\u05e9\\u05d1\\u05d5\\u05df \\u05e9\\u05d1\\u05d5 \\u05d4\\u05e9\\u05ea\\u05de\\u05e9\\u05ea \\u05d1\\u05de\\u05e7\\u05d5\\u05e8.\",\n                        \"emailsignin\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05dc\\u05e9\\u05dc\\u05d5\\u05d7 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc.\",\n                        \"emailverify\": \"\\u05d0\\u05e0\\u05d0 \\u05d0\\u05e9\\u05e8 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da, \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d7\\u05d3\\u05e9 \\u05e0\\u05e9\\u05dc\\u05d7.\",\n                        \"credentialssignin\": \"\\u05d4\\u05db\\u05e0\\u05d9\\u05e1\\u05d4 \\u05e0\\u05db\\u05e9\\u05dc\\u05d4. \\u05d1\\u05d3\\u05d5\\u05e7 \\u05e9\\u05d4\\u05e4\\u05e8\\u05d8\\u05d9\\u05dd \\u05e9\\u05e1\\u05d9\\u05e4\\u05e7\\u05ea \\u05e0\\u05db\\u05d5\\u05e0\\u05d9\\u05dd.\",\n                        \"sessionrequired\": \"\\u05d0\\u05e0\\u05d0 \\u05d4\\u05d9\\u05db\\u05e0\\u05e1 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d2\\u05e9\\u05ea \\u05dc\\u05d3\\u05e3 \\u05d6\\u05d4.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u05d0\\u05ea\\u05d4 \\u05db\\u05de\\u05e2\\u05d8 \\u05e9\\u05dd! \\u05e9\\u05dc\\u05d7\\u05e0\\u05d5 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d0\\u05dc \",\n                    \"verifyEmailLink\": \"\\u05d0\\u05e0\\u05d0 \\u05dc\\u05d7\\u05e5 \\u05e2\\u05dc \\u05d4\\u05e7\\u05d9\\u05e9\\u05d5\\u05e8 \\u05d1\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d6\\u05d4 \\u05db\\u05d3\\u05d9 \\u05dc\\u05d4\\u05e9\\u05dc\\u05d9\\u05dd \\u05d0\\u05ea \\u05d4\\u05d4\\u05e8\\u05e9\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"didNotReceive\": \"\\u05dc\\u05d0 \\u05de\\u05d5\\u05e6\\u05d0 \\u05d0\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc?\",\n                    \"resendEmail\": \"\\u05e9\\u05dc\\u05d7 \\u05e9\\u05d5\\u05d1 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"goBack\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05d0\\u05d7\\u05d5\\u05e8\\u05d4\",\n                    \"emailSent\": \"\\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e0\\u05e9\\u05dc\\u05d7 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4.\",\n                    \"verifyEmail\": \"\\u05d0\\u05de\\u05ea \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da \\u05e2\\u05dd {{provider}}\",\n                    \"signup\": \"\\u05d4\\u05d9\\u05e8\\u05e9\\u05dd \\u05e2\\u05dd {{provider}}\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d7\\u05d3\\u05e9\\u05d4 \\u05d4\\u05d9\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"passwordsMustMatch\": \"\\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d0\\u05d5\\u05ea \\u05d7\\u05d9\\u05d9\\u05d1\\u05d5\\u05ea \\u05dc\\u05d4\\u05ea\\u05d0\\u05d9\\u05dd\",\n                    \"confirmPasswordRequired\": \"\\u05d0\\u05d9\\u05e9\\u05d5\\u05e8 \\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"newPassword\": \"\\u05e1\\u05d9\\u05e1\\u05de\\u05d0 \\u05d7\\u05d3\\u05e9\\u05d4\",\n                    \"confirmPassword\": \"\\u05d0\\u05e9\\u05e8 \\u05e1\\u05d9\\u05e1\\u05de\\u05d0\",\n                    \"resetPassword\": \"\\u05d0\\u05e4\\u05e1 \\u05e1\\u05d9\\u05e1\\u05de\\u05d4\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"emailRequired\": \"\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05d4\\u05d5\\u05d0 \\u05e9\\u05d3\\u05d4 \\u05d7\\u05d5\\u05d1\\u05d4\",\n                    \"emailSent\": \"\\u05d0\\u05e0\\u05d0 \\u05d1\\u05d3\\u05d5\\u05e7 \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc {{email}} \\u05dc\\u05e7\\u05d1\\u05dc\\u05ea \\u05d4\\u05d5\\u05e8\\u05d0\\u05d5\\u05ea \\u05dc\\u05d0\\u05d9\\u05e4\\u05d5\\u05e1 \\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"enterEmail\": \"\\u05d4\\u05d6\\u05df \\u05d0\\u05ea \\u05db\\u05ea\\u05d5\\u05d1\\u05ea \\u05d4\\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc \\u05e9\\u05dc\\u05da \\u05d5\\u05d0\\u05e0\\u05d5 \\u05e0\\u05e9\\u05dc\\u05d7 \\u05dc\\u05da \\u05d4\\u05d5\\u05e8\\u05d0\\u05d5\\u05ea \\u05dc\\u05d0\\u05d9\\u05e4\\u05d5\\u05e1 \\u05d4\\u05e1\\u05d9\\u05e1\\u05de\\u05d4 \\u05e9\\u05dc\\u05da.\",\n                    \"resendEmail\": \"\\u05e9\\u05dc\\u05d7 \\u05e9\\u05d5\\u05d1 \\u05d0\\u05d9\\u05de\\u05d9\\u05d9\\u05dc\",\n                    \"continue\": \"\\u05d4\\u05de\\u05e9\\u05da\",\n                    \"goBack\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05d0\\u05d7\\u05d5\\u05e8\\u05d4\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u05d4\\u05e6\\u05d2 \\u05d4\\u05d9\\u05e1\\u05d8\\u05d5\\u05e8\\u05d9\\u05d4\",\n                        \"lastInputs\": \"\\u05e7\\u05dc\\u05d8 \\u05d0\\u05d7\\u05e8\\u05d5\\u05df\",\n                        \"noInputs\": \"\\u05e8\\u05d9\\u05e7...\",\n                        \"loading\": \"\\u05d8\\u05d5\\u05e2\\u05df...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u05db\\u05ea\\u05d5\\u05d1 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d4 \\u05db\\u05d0\\u05df...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u05d4\\u05ea\\u05d7\\u05dc \\u05d4\\u05e7\\u05dc\\u05d8\\u05d4\",\n                        \"stop\": \"\\u05e2\\u05e6\\u05d5\\u05e8 \\u05d4\\u05e7\\u05dc\\u05d8\\u05d4\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u05e9\\u05dc\\u05d7 \\u05d4\\u05d5\\u05d3\\u05e2\\u05d4\",\n                        \"stopTask\": \"\\u05e2\\u05e6\\u05d5\\u05e8 \\u05de\\u05e9\\u05d9\\u05de\\u05d4\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u05e6\\u05e8\\u05e3 \\u05e7\\u05d1\\u05e6\\u05d9\\u05dd\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u05e0\\u05d1\\u05e0\\u05d4 \\u05e2\\u05dd\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u05e8\\u05e5\",\n                        \"executedSuccessfully\": \"\\u05d1\\u05d5\\u05e6\\u05e2 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4\",\n                        \"failed\": \"\\u05e0\\u05db\\u05e9\\u05dc\",\n                        \"feedbackUpdated\": \"\\u05de\\u05e9\\u05d5\\u05d1 \\u05e2\\u05d5\\u05d3\\u05db\\u05df\",\n                        \"updating\": \"\\u05de\\u05e2\\u05d3\\u05db\\u05df\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u05e9\\u05d7\\u05e8\\u05e8 \\u05d0\\u05ea \\u05d4\\u05e7\\u05d1\\u05e6\\u05d9\\u05dd \\u05e9\\u05dc\\u05da \\u05db\\u05d0\\u05df\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u05d4\\u05e2\\u05dc\\u05d0\\u05d4 \\u05e0\\u05db\\u05e9\\u05dc\\u05d4\",\n                    \"cancelledUploadOf\": \"\\u05d4\\u05e2\\u05dc\\u05d0\\u05d4 \\u05e9\\u05dc \\u05d1\\u05d5\\u05d8\\u05dc\\u05d4\",\n                    \"couldNotReachServer\": \"\\u05dc\\u05d0 \\u05e0\\u05d9\\u05ea\\u05df \\u05d4\\u05d9\\u05d4 \\u05dc\\u05d4\\u05d2\\u05d9\\u05e2 \\u05dc\\u05e9\\u05e8\\u05ea\",\n                    \"continuingChat\": \"\\u05de\\u05de\\u05e9\\u05d9\\u05da \\u05d1\\u05e6'\\u05d0\\u05d8 \\u05d4\\u05e7\\u05d5\\u05d3\\u05dd\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u05dc\\u05d5\\u05d7 \\u05d4\\u05d2\\u05d3\\u05e8\\u05d5\\u05ea\",\n                    \"reset\": \"\\u05d0\\u05e4\\u05e1\",\n                    \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                    \"confirm\": \"\\u05d0\\u05e9\\u05e8\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05d4\\u05db\\u05dc\",\n                            \"feedbackPositive\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05d7\\u05d9\\u05d5\\u05d1\\u05d9\",\n                            \"feedbackNegative\": \"\\u05de\\u05e9\\u05d5\\u05d1: \\u05e9\\u05dc\\u05d9\\u05dc\\u05d9\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u05d7\\u05d9\\u05e4\\u05d5\\u05e9\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u05e4\\u05e2\\u05d5\\u05dc\\u05d4 \\u05d6\\u05d5 \\u05ea\\u05de\\u05d7\\u05e7 \\u05d0\\u05ea \\u05d4\\u05e9\\u05e8\\u05e9\\u05d5\\u05e8 \\u05d5\\u05db\\u05df \\u05d0\\u05ea \\u05d4\\u05d4\\u05d5\\u05d3\\u05e2\\u05d5\\u05ea \\u05d5\\u05d4\\u05e8\\u05db\\u05d9\\u05d1\\u05d9\\u05dd \\u05e9\\u05dc\\u05d5.\",\n                        \"cancel\": \"\\u05d1\\u05d8\\u05dc\",\n                        \"confirm\": \"\\u05d0\\u05e9\\u05e8\",\n                        \"deletingChat\": \"\\u05de\\u05d5\\u05d7\\u05e7 \\u05e6'\\u05d0\\u05d8\",\n                        \"chatDeleted\": \"\\u05d4\\u05e6'\\u05d0\\u05d8 \\u05e0\\u05de\\u05d7\\u05e7\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u05e6'\\u05d0\\u05d8\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u05e8\\u05d9\\u05e7...\",\n                        \"today\": \"\\u05d4\\u05d9\\u05d5\\u05dd\",\n                        \"yesterday\": \"\\u05d0\\u05ea\\u05de\\u05d5\\u05dc\",\n                        \"previous7days\": \"7 \\u05d9\\u05de\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\",\n                        \"previous30days\": \"30 \\u05d9\\u05de\\u05d9\\u05dd \\u05e7\\u05d5\\u05d3\\u05de\\u05d9\\u05dd\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u05e1\\u05d2\\u05d5\\u05e8 \\u05e1\\u05e8\\u05d2\\u05dc \\u05e6\\u05d3\",\n                        \"openSidebar\": \"\\u05e4\\u05ea\\u05d7 \\u05e1\\u05e8\\u05d2\\u05dc \\u05e6\\u05d3\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u05d7\\u05d6\\u05d5\\u05e8 \\u05dc\\u05e6'\\u05d0\\u05d8\",\n                    \"chatCreatedOn\": \"\\u05d4\\u05e6'\\u05d0\\u05d8 \\u05d4\\u05d6\\u05d4 \\u05e0\\u05d5\\u05e6\\u05e8 \\u05d1\\u05ea\\u05d0\\u05e8\\u05d9\\u05da\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u05e6'\\u05d0\\u05d8\",\n                \"readme\": \"\\u05d0\\u05d5\\u05d3\\u05d5\\u05ea\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u05e0\\u05db\\u05e9\\u05dc\\u05d4 \\u05d4\\u05d1\\u05d0\\u05ea \\u05e1\\u05e4\\u05e7\\u05d9\\u05dd:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u05e0\\u05e9\\u05de\\u05e8 \\u05d1\\u05d4\\u05e6\\u05dc\\u05d7\\u05d4\",\n            \"requiredApiKeys\": \"\\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea API \\u05e0\\u05d3\\u05e8\\u05e9\\u05d9\\u05dd\",\n            \"requiredApiKeysInfo\": \"\\u05db\\u05d3\\u05d9 \\u05dc\\u05d4\\u05e9\\u05ea\\u05de\\u05e9 \\u05d1\\u05d0\\u05e4\\u05dc\\u05d9\\u05e7\\u05e6\\u05d9\\u05d4 \\u05d6\\u05d5, \\u05e0\\u05d3\\u05e8\\u05e9\\u05d9\\u05dd \\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea \\u05d4-API \\u05d4\\u05d1\\u05d0\\u05d9\\u05dd. \\u05d4\\u05de\\u05e4\\u05ea\\u05d7\\u05d5\\u05ea \\u05de\\u05d0\\u05d5\\u05d7\\u05e1\\u05e0\\u05d9\\u05dd \\u05d1\\u05d0\\u05d7\\u05e1\\u05d5\\u05df \\u05d4\\u05de\\u05e7\\u05d5\\u05de\\u05d9 \\u05e9\\u05dc \\u05d4\\u05de\\u05db\\u05e9\\u05d9\\u05e8 \\u05e9\\u05dc\\u05da.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u05d0\\u05ea\\u05d4 \\u05dc\\u05d0 \\u05d7\\u05dc\\u05e7 \\u05de\\u05d4\\u05e4\\u05e8\\u05d5\\u05d9\\u05e7\\u05d8 \\u05d4\\u05d6\\u05d4.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u05d4\\u05de\\u05e9\\u05da \\u05e6'\\u05d0\\u05d8\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/hi.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                        \"settingsKey\": \"\\u0926\\u0915\\u094d\\u0937\\u093f\\u0923\\u0940\",\n                        \"APIKeys\": \"\\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u0940\",\n                        \"logout\": \"\\u0932\\u0949\\u0917\\u0906\\u0909\\u091f\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0928\\u0908 \\u091a\\u0948\\u091f\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0915\\u093e\\u0930\\u094d\\u092f \\u0938\\u0942\\u091a\\u0940\",\n                    \"loading\": \"\\u0932\\u094b\\u0921\\u0964\\u0964\\u0964\",\n                    \"error\": \"\\u0915\\u094b\\u0908 \\u0924\\u094d\\u0930\\u0941\\u091f\\u093f \\u0909\\u0924\\u094d\\u092a\\u0928\\u094d\\u0928 \\u0939\\u0941\\u0908\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0947\\u0902\",\n                \"removeAttachment\": \"\\u0905\\u0928\\u0941\\u0932\\u0917\\u094d\\u0928\\u0915 \\u0928\\u093f\\u0915\\u093e\\u0932\\u0947\\u0902\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0928\\u0908 \\u091a\\u0948\\u091f \\u092c\\u0928\\u093e\\u090f\\u0901?\",\n                \"clearChat\": \"\\u092f\\u0939 \\u0935\\u0930\\u094d\\u0924\\u092e\\u093e\\u0928 \\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u094b \\u0938\\u093e\\u092b\\u093c \\u0915\\u0930\\u0947\\u0917\\u093e \\u0914\\u0930 \\u090f\\u0915 \\u0928\\u0908 \\u091a\\u0948\\u091f \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0917\\u093e\\u0964\",\n                \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                \"expandMessages\": \"\\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u093e \\u0935\\u093f\\u0938\\u094d\\u0924\\u093e\\u0930 \\u0915\\u0930\\u0947\\u0902\",\n                \"hideChainOfThought\": \"\\u0935\\u093f\\u091a\\u093e\\u0930 \\u0915\\u0940 \\u0936\\u094d\\u0930\\u0943\\u0902\\u0916\\u0932\\u093e \\u091b\\u093f\\u092a\\u093e\\u090f\\u0902\",\n                \"darkMode\": \"\\u0921\\u093e\\u0930\\u094d\\u0915 \\u092e\\u094b\\u0921\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0915\\u093e \\u0909\\u092a\\u092f\\u094b\\u0917 \\u0915\\u0930\\u0915\\u0947\",\n                \"running\": \"\\u092d\\u093e\\u0917\\u0928\\u093e\",\n                \"took_one\": \"{{count}} \\u0915\\u0926\\u092e \\u0909\\u0920\\u093e\\u092f\\u093e\",\n                \"took_other\": \"{{count}} \\u0915\\u0926\\u092e \\u0909\\u0920\\u093e\\u090f\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0910\\u092a \\u0924\\u0915 \\u092a\\u0939\\u0941\\u0902\\u091a\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0932\\u0949\\u0917\\u093f\\u0928 \\u0915\\u0930\\u0947\\u0902\\u0964\",\n                    \"form\": {\n                        \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e\",\n                        \"password\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                        \"noAccount\": \"\\u0915\\u094d\\u092f\\u093e \\u0906\\u092a\\u0915\\u0947 \\u092a\\u093e\\u0938 \\u0916\\u093e\\u0924\\u093e \\u0928\\u0939\\u0940\\u0902 \\u0939\\u0948?\",\n                        \"alreadyHaveAccount\": \"\\u092a\\u0939\\u0932\\u0947 \\u0938\\u0947 \\u0939\\u0940 \\u090f\\u0915 \\u0916\\u093e\\u0924\\u093e \\u0939\\u0948?\",\n                        \"signup\": \"\\u0928\\u093e\\u092e \\u0932\\u093f\\u0916\\u094b\",\n                        \"signin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902\",\n                        \"or\": \"\\u0928\\u0939\\u0940\\u0902 \\u0924\\u094b\",\n                        \"continue\": \"\\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\",\n                        \"forgotPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092d\\u0942\\u0932 \\u0917\\u090f?\",\n                        \"passwordMustContain\": \"\\u0906\\u092a\\u0915\\u0947 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092e\\u0947\\u0902 \\u0939\\u094b\\u0928\\u093e \\u091a\\u093e\\u0939\\u093f\\u090f:\",\n                        \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                        \"passwordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0905\\u0938\\u092e\\u0930\\u094d\\u0925.\",\n                        \"signin\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthsignin\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"redirect_uri_mismatch\": \"\\u0930\\u0940\\u0921\\u093e\\u092f\\u0930\\u0947\\u0915\\u094d\\u091f \\u092f\\u0942\\u0906\\u0930\\u0906\\u0908 \\u0913\\u0925 \\u0910\\u092a \\u0915\\u0949\\u0928\\u094d\\u092b\\u093c\\u093f\\u0917\\u0930\\u0947\\u0936\\u0928 \\u0938\\u0947 \\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u0916\\u093e \\u0930\\u0939\\u093e \\u0939\\u0948\\u0964\",\n                        \"oauthcallbackerror\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthcreateaccount\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"emailcreateaccount\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"callback\": \"\\u0915\\u093f\\u0938\\u0940 \\u0926\\u0942\\u0938\\u0930\\u0947 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0915\\u0947 \\u0926\\u0947\\u0916\\u0947\\u0902.\",\n                        \"oauthaccountnotlinked\": \"\\u0905\\u092a\\u0928\\u0940 \\u092a\\u0939\\u091a\\u093e\\u0928 \\u0915\\u0928\\u094d\\u092b\\u093c\\u0930\\u094d\\u092e \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f, \\u0909\\u0938\\u0940 \\u0916\\u093e\\u0924\\u0947 \\u0938\\u0947 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902 \\u091c\\u093f\\u0938\\u0915\\u093e \\u0907\\u0938\\u094d\\u0924\\u0947\\u092e\\u093e\\u0932 \\u0906\\u092a\\u0928\\u0947 \\u092a\\u0939\\u0932\\u0947 \\u0915\\u093f\\u092f\\u093e \\u0925\\u093e.\",\n                        \"emailsignin\": \"\\u0908-\\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u092d\\u0947\\u091c\\u0940 \\u091c\\u093e \\u0938\\u0915\\u0940.\",\n                        \"emailverify\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u0938\\u0924\\u094d\\u092f\\u093e\\u092a\\u093f\\u0924 \\u0915\\u0930\\u0947\\u0902, \\u090f\\u0915 \\u0928\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092d\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e \\u0939\\u0948\\u0964\",\n                        \"credentialssignin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0935\\u093f\\u092b\\u0932 \\u0930\\u0939\\u093e. \\u091c\\u093e\\u0902\\u091a\\u0947\\u0902 \\u0915\\u093f \\u0906\\u092a\\u0915\\u0947 \\u0926\\u094d\\u0935\\u093e\\u0930\\u093e \\u092a\\u094d\\u0930\\u0926\\u093e\\u0928 \\u0915\\u093f\\u090f \\u0917\\u090f \\u0935\\u093f\\u0935\\u0930\\u0923 \\u0938\\u0939\\u0940 \\u0939\\u0948\\u0902\\u0964\",\n                        \"sessionrequired\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0907\\u0938 \\u092a\\u0943\\u0937\\u094d\\u0920 \\u0924\\u0915 \\u092a\\u0939\\u0941\\u0902\\u091a\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0947\\u0902\\u0964\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0906\\u092a \\u0932\\u0917\\u092d\\u0917 \\u0935\\u0939\\u093e\\u0901 \\u0939\\u0948\\u0902! \\u0939\\u092e\\u0928\\u0947 \\u090f\\u0915 \\u0908\\u092e\\u0947\\u0932 \\u092d\\u0947\\u091c\\u093e \\u0939\\u0948 \",\n                    \"verifyEmailLink\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0905\\u092a\\u0928\\u093e \\u0938\\u093e\\u0907\\u0928\\u0905\\u092a \\u092a\\u0942\\u0930\\u093e \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0909\\u0938 \\u0908\\u092e\\u0947\\u0932 \\u092e\\u0947\\u0902 \\u0926\\u093f\\u090f \\u0917\\u090f \\u0932\\u093f\\u0902\\u0915 \\u092a\\u0930 \\u0915\\u094d\\u0932\\u093f\\u0915 \\u0915\\u0930\\u0947\\u0902\\u0964\",\n                    \"didNotReceive\": \"\\u0908\\u092e\\u0947\\u0932 \\u0928\\u0939\\u0940\\u0902 \\u092e\\u093f\\u0932 \\u0930\\u0939\\u093e \\u0939\\u0948?\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u0903 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                    \"goBack\": \"\\u092a\\u0938 \\u091c\\u093e\\u0913\",\n                    \"emailSent\": \"\\u0908\\u092e\\u0947\\u0932 \\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u092d\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e\\u0964\",\n                    \"verifyEmail\": \"\\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e \\u0938\\u0924\\u094d\\u092f\\u093e\\u092a\\u093f\\u0924 \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0915\\u0947 \\u0938\\u093e\\u0925 \\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0947\\u0902\",\n                    \"signup\": \"{{provider}} \\u0915\\u0947 \\u0938\\u093e\\u0925 \\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0928\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"passwordsMustMatch\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u092e\\u0947\\u0932 \\u0916\\u093e\\u0928\\u093e \\u091a\\u093e\\u0939\\u093f\\u090f\",\n                    \"confirmPasswordRequired\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f \\u0915\\u0930\\u0947\\u0902 \\u0915\\u093f \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"newPassword\": \"\\u0928\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                    \"confirmPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0915\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u093f \\u0915\\u0930\\u0947\\u0902\",\n                    \"resetPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e\",\n                    \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u092b\\u093c\\u0940\\u0932\\u094d\\u0921 \\u0939\\u0948\",\n                    \"emailSent\": \"\\u0905\\u092a\\u0928\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0928\\u093f\\u0930\\u094d\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0915\\u0943\\u092a\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e {{email}} \\u0926\\u0947\\u0916\\u0947\\u0902\\u0964\",\n                    \"enterEmail\": \"\\u0905\\u092a\\u0928\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u093e \\u0926\\u0930\\u094d\\u091c \\u0915\\u0930\\u0947\\u0902 \\u0914\\u0930 \\u0939\\u092e \\u0906\\u092a\\u0915\\u094b \\u0905\\u092a\\u0928\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f \\u0928\\u093f\\u0930\\u094d\\u0926\\u0947\\u0936 \\u092d\\u0947\\u091c\\u0947\\u0902\\u0917\\u0947\\u0964\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u0903 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                    \"continue\": \"\\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\",\n                    \"goBack\": \"\\u092a\\u0938 \\u091c\\u093e\\u0913\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0907\\u0924\\u093f\\u0939\\u093e\\u0938 \\u0926\\u093f\\u0916\\u093e\\u090f\\u0902\",\n                        \"lastInputs\": \"\\u0905\\u0902\\u0924\\u093f\\u092e \\u0907\\u0928\\u092a\\u0941\\u091f\",\n                        \"noInputs\": \"\\u0910\\u0938\\u0947 \\u0916\\u093e\\u0932\\u0940...\",\n                        \"loading\": \"\\u0932\\u094b\\u0921\\u0964\\u0964\\u0964\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0905\\u092a\\u0928\\u093e \\u0938\\u0902\\u0926\\u0947\\u0936 \\u092f\\u0939\\u093e\\u0901 \\u091f\\u093e\\u0907\\u092a \\u0915\\u0930\\u0947\\u0902...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0930\\u093f\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0902\",\n                        \"stop\": \"\\u0930\\u093f\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u094b\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u092d\\u0947\\u091c\\u0947\\u0902\",\n                        \"stopTask\": \"\\u0915\\u093e\\u0930\\u094d\\u092f \\u092c\\u0902\\u0926 \\u0915\\u0930\\u094b\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u092b\\u093c\\u093e\\u0907\\u0932\\u0947\\u0902 \\u0905\\u0928\\u0941\\u0932\\u0917\\u094d\\u0928 \\u0915\\u0930\\u0947\\u0902\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0915\\u0947 \\u0938\\u093e\\u0925 \\u0928\\u093f\\u0930\\u094d\\u092e\\u093f\\u0924\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u092d\\u093e\\u0917\\u0928\\u093e\",\n                        \"executedSuccessfully\": \"\\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u0928\\u093f\\u0937\\u094d\\u092a\\u093e\\u0926\\u093f\\u0924\",\n                        \"failed\": \"\\u0905\\u0938\\u092b\\u0932\",\n                        \"feedbackUpdated\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u0915\\u094d\\u0930\\u093f\\u092f\\u093e \\u0905\\u092a\\u0921\\u0947\\u091f \\u0915\\u0940 \\u0917\\u0908\",\n                        \"updating\": \"\\u0905\\u0926\\u094d\\u092f\\u0924\\u0928\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0905\\u092a\\u0928\\u0940 \\u092b\\u093c\\u093e\\u0907\\u0932\\u0947\\u0902 \\u092f\\u0939\\u093e\\u0901 \\u0921\\u094d\\u0930\\u0949\\u092a \\u0915\\u0930\\u0947\\u0902\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0915\\u0930\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0935\\u093f\\u092b\\u0932\",\n                    \"cancelledUploadOf\": \"\\u0915\\u093e \\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u093f\\u092f\\u093e \\u0917\\u092f\\u093e\",\n                    \"couldNotReachServer\": \"\\u0938\\u0930\\u094d\\u0935\\u0930 \\u0924\\u0915 \\u0928\\u0939\\u0940\\u0902 \\u092a\\u0939\\u0941\\u0901\\u091a \\u0938\\u0915\\u093e\",\n                    \"continuingChat\": \"\\u092a\\u093f\\u091b\\u0932\\u0940 \\u091a\\u0948\\u091f \\u091c\\u093e\\u0930\\u0940 \\u0930\\u0916\\u0928\\u093e\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938 \\u092a\\u0948\\u0928\\u0932\",\n                    \"reset\": \"\\u0930\\u0940\\u0938\\u0947\\u091f\",\n                    \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                    \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0938\\u092d\\u0940\",\n                            \"feedbackPositive\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0938\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\",\n                            \"feedbackNegative\": \"\\u092a\\u094d\\u0930\\u0924\\u093f\\u092a\\u0941\\u0937\\u094d\\u091f\\u093f: \\u0928\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0922\\u0942\\u0901\\u0922\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u092f\\u0939 \\u0925\\u094d\\u0930\\u0947\\u0921 \\u0915\\u0947 \\u0938\\u093e\\u0925-\\u0938\\u093e\\u0925 \\u0907\\u0938\\u0915\\u0947 \\u0938\\u0902\\u0926\\u0947\\u0936\\u094b\\u0902 \\u0914\\u0930 \\u0924\\u0924\\u094d\\u0935\\u094b\\u0902 \\u0915\\u094b \\u092d\\u0940 \\u0939\\u091f\\u093e \\u0926\\u0947\\u0917\\u093e\\u0964\",\n                        \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u0928\\u093e\",\n                        \"confirm\": \"\\u0938\\u0941\\u0926\\u0943\\u0922\\u093c \\u0915\\u0930\\u0928\\u093e\",\n                        \"deletingChat\": \"\\u091a\\u0948\\u091f \\u0939\\u091f\\u093e\\u0928\\u093e\",\n                        \"chatDeleted\": \"\\u091a\\u0948\\u091f \\u0939\\u091f\\u093e\\u0908 \\u0917\\u0908\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u092a\\u093f\\u091b\\u0932\\u0940 \\u091a\\u0948\\u091f\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0916\\u093e\\u0932\\u0940\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0906\\u091c\",\n                        \"yesterday\": \"\\u092c\\u0940\\u0924\\u093e \\u0939\\u0941\\u0906 \\u0915\\u0932\",\n                        \"previous7days\": \"\\u092a\\u093f\\u091b\\u0932\\u0947 7 \\u0926\\u093f\\u0928\",\n                        \"previous30days\": \"\\u092a\\u093f\\u091b\\u0932\\u0947 30 \\u0926\\u093f\\u0928\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u0947\\u0902\",\n                        \"openSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u0916\\u094b\\u0932\\u0947\\u0902\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u091a\\u0948\\u091f \\u092a\\u0930 \\u0935\\u093e\\u092a\\u0938 \\u091c\\u093e\\u090f\\u0902\",\n                    \"chatCreatedOn\": \"\\u092f\\u0939 \\u091a\\u0948\\u091f \\u0907\\u0938 \\u092a\\u0930 \\u092c\\u0928\\u093e\\u0908 \\u0917\\u0908 \\u0925\\u0940\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u091a\\u0948\\u091f\",\n                \"readme\": \"\\u0930\\u0940\\u0921\\u092e\\u0940\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u092a\\u094d\\u0930\\u0926\\u093e\\u0924\\u093e\\u0913\\u0902 \\u0915\\u094b \\u0932\\u093e\\u0928\\u0947 \\u092e\\u0947\\u0902 \\u0935\\u093f\\u092b\\u0932:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0938\\u092b\\u0932\\u0924\\u093e\\u092a\\u0942\\u0930\\u094d\\u0935\\u0915 \\u0938\\u0939\\u0947\\u091c\\u093e \\u0917\\u092f\\u093e\",\n            \"requiredApiKeys\": \"\\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u0940\",\n            \"requiredApiKeysInfo\": \"\\u0907\\u0938 \\u0910\\u092a \\u0915\\u093e \\u0909\\u092a\\u092f\\u094b\\u0917 \\u0915\\u0930\\u0928\\u0947 \\u0915\\u0947 \\u0932\\u093f\\u090f, \\u0928\\u093f\\u092e\\u094d\\u0928\\u0932\\u093f\\u0916\\u093f\\u0924 \\u090f\\u092a\\u0940\\u0906\\u0908 \\u0915\\u0941\\u0902\\u091c\\u093f\\u092f\\u094b\\u0902 \\u0915\\u0940 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915\\u0924\\u093e \\u0939\\u094b\\u0924\\u0940 \\u0939\\u0948\\u0964 \\u091a\\u093e\\u092c\\u093f\\u092f\\u093e\\u0901 \\u0906\\u092a\\u0915\\u0947 \\u0921\\u093f\\u0935\\u093e\\u0907\\u0938 \\u0915\\u0947 \\u0938\\u094d\\u0925\\u093e\\u0928\\u0940\\u092f \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u0923 \\u092a\\u0930 \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u0940\\u0924 \\u0915\\u0940 \\u091c\\u093e\\u0924\\u0940 \\u0939\\u0948\\u0902\\u0964\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0906\\u092a \\u0907\\u0938 \\u092a\\u0930\\u093f\\u092f\\u094b\\u091c\\u0928\\u093e \\u0915\\u093e \\u0939\\u093f\\u0938\\u094d\\u0938\\u093e \\u0928\\u0939\\u0940\\u0902 \\u0939\\u0948\\u0902\\u0964\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u091a\\u0948\\u091f \\u092b\\u093f\\u0930 \\u0938\\u0947 \\u0936\\u0941\\u0930\\u0942 \\u0915\\u0930\\u0947\\u0902\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/kn.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1\",\n                        \"logout\": \"\\u0cb2\\u0cbe\\u0c97\\u0ccd \\u0c94\\u0c9f\\u0ccd\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf \\u0caa\\u0c9f\\u0ccd\\u0c9f\\u0cbf\",\n                    \"loading\": \"\\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6...\",\n                    \"error\": \"\\u0ca6\\u0ccb\\u0cb7 \\u0cb8\\u0c82\\u0cad\\u0cb5\\u0cbf\\u0cb8\\u0cbf\\u0ca6\\u0cc6\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1 \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                \"removeAttachment\": \"\\u0cb2\\u0c97\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0ca4\\u0cc6\\u0c97\\u0cc6\\u0ca6\\u0cc1\\u0cb9\\u0cbe\\u0c95\\u0cbf\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0cb0\\u0c9a\\u0cbf\\u0cb8\\u0cac\\u0cc7\\u0c95\\u0cc6?\",\n                \"clearChat\": \"\\u0c87\\u0ca6\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cb8\\u0ccd\\u0ca4\\u0cc1\\u0ca4 \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca4\\u0cc6\\u0cb0\\u0cb5\\u0cc1\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0cb9\\u0cca\\u0cb8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\",\n                \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                \"expandMessages\": \"\\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb5\\u0cbf\\u0cb8\\u0ccd\\u0ca4\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                \"hideChainOfThought\": \"\\u0c9a\\u0cbf\\u0c82\\u0ca4\\u0ca8\\u0cc6\\u0caf \\u0cb8\\u0cb0\\u0caa\\u0cb3\\u0cbf\\u0caf\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0cb0\\u0cc6\\u0cae\\u0cbe\\u0ca1\\u0cc1\",\n                \"darkMode\": \"\\u0ca1\\u0cbe\\u0cb0\\u0ccd\\u0c95\\u0ccd \\u0cae\\u0ccb\\u0ca1\\u0ccd\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0cac\\u0cb3\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                \"running\": \"\\u0c9a\\u0cb2\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                \"took_one\": \"{{count}} \\u0cb9\\u0cc6\\u0c9c\\u0ccd\\u0c9c\\u0cc6 \\u0c87\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0ca6\\u0cc6\",\n                \"took_other\": \"{{count}} \\u0cb9\\u0cc6\\u0c9c\\u0ccd\\u0c9c\\u0cc6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca4\\u0cc6\\u0c97\\u0cc6\\u0ca6\\u0cc1\\u0c95\\u0cca\\u0c82\\u0ca1\\u0cb0\\u0cc1\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0c85\\u0caa\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0caa\\u0ccd\\u0cb0\\u0cb5\\u0cc7\\u0cb6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                    \"form\": {\n                        \"email\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\",\n                        \"password\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd\",\n                        \"noAccount\": \"\\u0c96\\u0cbe\\u0ca4\\u0cc6 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc7?\",\n                        \"alreadyHaveAccount\": \"\\u0c88\\u0c97\\u0cbe\\u0c97\\u0cb2\\u0cc7 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbe?\",\n                        \"signup\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"signin\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"or\": \"\\u0c85\\u0ca5\\u0cb5\\u0cbe\",\n                        \"continue\": \"\\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                        \"forgotPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc6\\u0ca4\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbe?\",\n                        \"passwordMustContain\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c87\\u0cb5\\u0cc1\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c92\\u0cb3\\u0c97\\u0cca\\u0c82\\u0ca1\\u0cbf\\u0cb0\\u0cac\\u0cc7\\u0c95\\u0cc1:\",\n                        \"emailRequired\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"passwordRequired\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0c85\\u0cb8\\u0cae\\u0cb0\\u0ccd\\u0ca5\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                        \"signin\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthsignin\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"redirect_uri_mismatch\": \"\\u0cae\\u0cb0\\u0cc1\\u0ca8\\u0cbf\\u0cb0\\u0ccd\\u0ca6\\u0cc7\\u0cb6\\u0ca8\\u0ca6 URI \\u0c86\\u0ccd\\u0caf\\u0caa\\u0ccd \\u0c95\\u0cbe\\u0ca8\\u0ccd\\u0cab\\u0cbf\\u0c97\\u0cb0\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0c97\\u0cc6 \\u0cb9\\u0ccb\\u0cb2\\u0cbf\\u0c95\\u0cc6\\u0caf\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\",\n                        \"oauthcallbackerror\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthcreateaccount\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"emailcreateaccount\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"callback\": \"\\u0cac\\u0cc7\\u0cb0\\u0cc6 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0caf\\u0ca4\\u0ccd\\u0ca8\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"oauthaccountnotlinked\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c97\\u0cc1\\u0cb0\\u0cc1\\u0ca4\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca6\\u0cc3\\u0ca2\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cc1, \\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0cae\\u0cc2\\u0cb2\\u0ca4\\u0c83 \\u0cac\\u0cb3\\u0cb8\\u0cbf\\u0ca6 \\u0c85\\u0ca6\\u0cc7 \\u0c96\\u0cbe\\u0ca4\\u0cc6\\u0caf\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                        \"emailsignin\": \"\\u0c87-\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbe\\u0c97\\u0cb2\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\",\n                        \"emailverify\": \"\\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf, \\u0cb9\\u0cca\\u0cb8 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                        \"credentialssignin\": \"\\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6. \\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0c92\\u0ca6\\u0c97\\u0cbf\\u0cb8\\u0cbf\\u0ca6 \\u0cb5\\u0cbf\\u0cb5\\u0cb0\\u0c97\\u0cb3\\u0cc1 \\u0cb8\\u0cb0\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf\\u0cb5\\u0cc6\\u0caf\\u0cc7 \\u0c8e\\u0c82\\u0ca6\\u0cc1 \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf.\",\n                        \"sessionrequired\": \"\\u0c88 \\u0caa\\u0cc1\\u0c9f\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0ccd\\u0cb0\\u0cb5\\u0cc7\\u0cb6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c87\\u0ca8\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0cac\\u0cb9\\u0cc1\\u0ca4\\u0cc7\\u0c95 \\u0c85\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc0\\u0cb0\\u0cbf! \\u0ca8\\u0cbe\\u0cb5\\u0cc1 \\u0c97\\u0cc6 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cbf\\u0ca6\\u0ccd\\u0ca6\\u0cc7\\u0cb5\\u0cc6 \",\n                    \"verifyEmailLink\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0caa\\u0cc2\\u0cb0\\u0ccd\\u0ca3\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0c86 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0ca8\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb0\\u0cc1\\u0cb5 \\u0cb2\\u0cbf\\u0c82\\u0c95\\u0ccd \\u0c95\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf.\",\n                    \"didNotReceive\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb9\\u0cc1\\u0ca1\\u0cc1\\u0c95\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc7?\",\n                    \"resendEmail\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                    \"goBack\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cc6 \\u0cb9\\u0cc6\\u0cc2\\u0cd5\\u0c97\\u0cc1\",\n                    \"emailSent\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6.\",\n                    \"verifyEmail\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0ca8\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                    \"signup\": \"{{provider}} \\u0ca8\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0cb8\\u0cc8\\u0ca8\\u0ccd \\u0c85\\u0caa\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cbf\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0cb9\\u0cca\\u0cb8 \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"passwordsMustMatch\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c97\\u0cb3\\u0cc1 \\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c95\\u0cc6\\u0caf\\u0cbe\\u0c97\\u0cac\\u0cc7\\u0c95\\u0cc1\",\n                    \"confirmPasswordRequired\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c8e\\u0c82\\u0ca6\\u0cc1 \\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                    \"newPassword\": \"\\u0cb9\\u0cca\\u0cb8 \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd\",\n                    \"confirmPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                    \"resetPassword\": \"\\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cbf\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\",\n                    \"emailRequired\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 \\u0cab\\u0cc0\\u0cb2\\u0ccd\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"emailSent\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0cb8\\u0cc2\\u0c9a\\u0ca8\\u0cc6\\u0c97\\u0cb3\\u0cbf\\u0c97\\u0cbe\\u0c97\\u0cbf \\u0ca6\\u0caf\\u0cb5\\u0cbf\\u0c9f\\u0ccd\\u0c9f\\u0cc1 \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8 {{email}} \\u0caa\\u0cb0\\u0cbf\\u0cb6\\u0cc0\\u0cb2\\u0cbf\\u0cb8\\u0cbf.\",\n                    \"enterEmail\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0cb5\\u0cbf\\u0cb3\\u0cbe\\u0cb8\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca8\\u0cae\\u0cc2\\u0ca6\\u0cbf\\u0cb8\\u0cbf \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0caa\\u0cbe\\u0cb8\\u0ccd \\u0cb5\\u0cb0\\u0ccd\\u0ca1\\u0ccd \\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cb2\\u0cc1 \\u0ca8\\u0cbe\\u0cb5\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0c97\\u0cc6 \\u0cb8\\u0cc2\\u0c9a\\u0ca8\\u0cc6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c95\\u0cb3\\u0cc1\\u0cb9\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cc7\\u0cb5\\u0cc6.\",\n                    \"resendEmail\": \"\\u0c87\\u0cae\\u0cc7\\u0cb2\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                    \"continue\": \"\\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0cb8\\u0cbf\",\n                    \"goBack\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cc6 \\u0cb9\\u0cc6\\u0cc2\\u0cd5\\u0c97\\u0cc1\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0c87\\u0ca4\\u0cbf\\u0cb9\\u0cbe\\u0cb8 \\u0ca4\\u0ccb\\u0cb0\\u0cbf\\u0cb8\\u0cc1\",\n                        \"lastInputs\": \"\\u0c95\\u0cca\\u0ca8\\u0cc6\\u0caf \\u0c87\\u0ca8\\u0ccd \\u0caa\\u0cc1\\u0c9f\\u0ccd \\u0c97\\u0cb3\\u0cc1\",\n                        \"noInputs\": \"\\u0c8e\\u0c82\\u0ca4\\u0cb9 \\u0c96\\u0cbe\\u0cb2\\u0cbf...\",\n                        \"loading\": \"\\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0c86\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0cb5\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cac\\u0cc6\\u0cb0\\u0cb3\\u0c9a\\u0ccd\\u0c9a\\u0cbf\\u0cb8\\u0cbf...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0cb0\\u0cc6\\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0ca1\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0caa\\u0ccd\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cbf\",\n                        \"stop\": \"\\u0cb0\\u0cc6\\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0ca1\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0ca8\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb8\\u0cc1\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6 \\u0c95\\u0cb3\\u0cbf\\u0cb8\\u0cbf\",\n                        \"stopTask\": \"\\u0ca8\\u0cbf\\u0cb2\\u0ccd\\u0cb2\\u0cbf\\u0cb8\\u0cc1 \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0cab\\u0cc8\\u0cb2\\u0ccd \\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cb2\\u0c97\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0cb8\\u0cbf\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0c87\\u0ca6\\u0cb0\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0c97\\u0cc6 \\u0ca8\\u0cbf\\u0cb0\\u0ccd\\u0cae\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0c9a\\u0cb2\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                        \"executedSuccessfully\": \"\\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c95\\u0cbe\\u0cb0\\u0ccd\\u0caf\\u0c97\\u0ca4\\u0c97\\u0cca\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"failed\": \"\\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"feedbackUpdated\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6 \\u0ca8\\u0cb5\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                        \"updating\": \"\\u0ca8\\u0cb5\\u0cc0\\u0c95\\u0cb0\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cab\\u0cc8\\u0cb2\\u0ccd \\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c87\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cac\\u0cbf\\u0ca1\\u0cbf\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cae\\u0cbe\\u0ca1\\u0cb2\\u0cc1 \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n                    \"cancelledUploadOf\": \"\\u0c85\\u0caa\\u0ccd \\u0cb2\\u0ccb\\u0ca1\\u0ccd \\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0c97\\u0cca\\u0c82\\u0ca1\\u0cbf\\u0ca6\\u0cc6\",\n                    \"couldNotReachServer\": \"\\u0cb8\\u0cb0\\u0ccd\\u0cb5\\u0cb0\\u0ccd \\u0ca4\\u0cb2\\u0cc1\\u0caa\\u0cb2\\u0cc1 \\u0cb8\\u0cbe\\u0ca7\\u0ccd\\u0caf\\u0cb5\\u0cbe\\u0c97\\u0cb2\\u0cbf\\u0cb2\\u0ccd\\u0cb2\",\n                    \"continuingChat\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0cae\\u0cc1\\u0c82\\u0ca6\\u0cc1\\u0cb5\\u0cb0\\u0cbf\\u0caf\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0cb8\\u0cc6\\u0c9f\\u0ccd\\u0c9f\\u0cbf\\u0c82\\u0c97\\u0ccd \\u0c97\\u0cb3 \\u0cab\\u0cb2\\u0c95\",\n                    \"reset\": \"\\u0cae\\u0cb0\\u0cc1\\u0cb9\\u0cca\\u0c82\\u0ca6\\u0cbf\\u0cb8\\u0cbf\",\n                    \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                    \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0c8e\\u0cb2\\u0ccd\\u0cb2\\u0cb5\\u0cc2\",\n                            \"feedbackPositive\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0ca7\\u0ca8\\u0cbe\\u0ca4\\u0ccd\\u0cae\\u0c95\",\n                            \"feedbackNegative\": \"\\u0caa\\u0ccd\\u0cb0\\u0ca4\\u0cbf\\u0c95\\u0ccd\\u0cb0\\u0cbf\\u0caf\\u0cc6: \\u0ca8\\u0c95\\u0cbe\\u0cb0\\u0cbe\\u0ca4\\u0ccd\\u0cae\\u0c95\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0cb9\\u0cc1\\u0ca1\\u0cc1\\u0c95\\u0cc1\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0c87\\u0ca6\\u0cc1 \\u0ca5\\u0ccd\\u0cb0\\u0cc6\\u0ca1\\u0ccd \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0c85\\u0ca6\\u0cb0 \\u0cb8\\u0c82\\u0ca6\\u0cc7\\u0cb6\\u0c97\\u0cb3\\u0cc1 \\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 \\u0c85\\u0c82\\u0cb6\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\",\n                        \"cancel\": \"\\u0cb0\\u0ca6\\u0ccd\\u0ca6\\u0cc1\\u0cae\\u0cbe\\u0ca1\\u0cbf\",\n                        \"confirm\": \"\\u0ca6\\u0cc3\\u0ca2\\u0caa\\u0ca1\\u0cbf\\u0cb8\\u0cbf\",\n                        \"deletingChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cbf\\u0ca6\\u0cc6\",\n                        \"chatDeleted\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c97\\u0cb3\\u0cc1\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0c96\\u0cbe\\u0cb2\\u0cbf...\",\n                        \"today\": \"\\u0c87\\u0c82\\u0ca6\\u0cc1\",\n                        \"yesterday\": \"\\u0ca8\\u0cbf\\u0ca8\\u0ccd\\u0ca8\\u0cc6\",\n                        \"previous7days\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 7 \\u0ca6\\u0cbf\\u0ca8\\u0c97\\u0cb3\\u0cc1\",\n                        \"previous30days\": \"\\u0cb9\\u0cbf\\u0c82\\u0ca6\\u0cbf\\u0ca8 30 \\u0ca6\\u0cbf\\u0ca8\\u0c97\\u0cb3\\u0cc1\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0cb8\\u0cc8\\u0ca1\\u0ccd \\u0cac\\u0cbe\\u0cb0\\u0ccd \\u0cae\\u0cc1\\u0c9a\\u0ccd\\u0c9a\\u0cc1\",\n                        \"openSidebar\": \"\\u0cb8\\u0cc8\\u0ca1\\u0ccd \\u0cac\\u0cbe\\u0cb0\\u0ccd \\u0ca4\\u0cc6\\u0cb0\\u0cc6\\u0caf\\u0cbf\\u0cb0\\u0cbf\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c97\\u0cc6 \\u0cb9\\u0cbf\\u0c82\\u0ca4\\u0cbf\\u0cb0\\u0cc1\\u0c97\\u0cbf\",\n                    \"chatCreatedOn\": \"\\u0c88 \\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c88 \\u0ca8\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cb0\\u0c9a\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0caa\\u0cc2\\u0cb0\\u0cc8\\u0c95\\u0cc6\\u0ca6\\u0cbe\\u0cb0\\u0cb0\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0c95\\u0cb0\\u0cc6\\u0ca4\\u0cb0\\u0cb2\\u0cc1 \\u0cb5\\u0cbf\\u0cab\\u0cb2\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0caf\\u0cb6\\u0cb8\\u0ccd\\u0cb5\\u0cbf\\u0caf\\u0cbe\\u0c97\\u0cbf \\u0c89\\u0cb3\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cbf\\u0ca6\\u0cc6\",\n            \"requiredApiKeys\": \"\\u0c85\\u0cb5\\u0cb6\\u0ccd\\u0caf\\u0c95 API \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1\",\n            \"requiredApiKeysInfo\": \"\\u0c88 \\u0c85\\u0caa\\u0ccd\\u0cb2\\u0cbf\\u0c95\\u0cc7\\u0cb6\\u0ca8\\u0ccd \\u0c85\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0cac\\u0cb3\\u0cb8\\u0cb2\\u0cc1, \\u0c88 \\u0c95\\u0cc6\\u0cb3\\u0c97\\u0cbf\\u0ca8 \\u0c8e\\u0caa\\u0cbf\\u0c90 \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0cc1 \\u0cac\\u0cc7\\u0c95\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0cb5\\u0cc6. \\u0c95\\u0cc0\\u0cb2\\u0cbf\\u0c97\\u0cb3\\u0ca8\\u0ccd\\u0ca8\\u0cc1 \\u0ca8\\u0cbf\\u0cae\\u0ccd\\u0cae \\u0cb8\\u0cbe\\u0ca7\\u0ca8\\u0ca6 \\u0cb8\\u0ccd\\u0ca5\\u0cb3\\u0cc0\\u0caf \\u0cb8\\u0c82\\u0c97\\u0ccd\\u0cb0\\u0cb9\\u0ca3\\u0cc6\\u0caf\\u0cb2\\u0ccd\\u0cb2\\u0cbf \\u0cb8\\u0c82\\u0c97\\u0ccd\\u0cb0\\u0cb9\\u0cbf\\u0cb8\\u0cb2\\u0cbe\\u0c97\\u0cc1\\u0ca4\\u0ccd\\u0ca4\\u0ca6\\u0cc6.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0ca8\\u0cc0\\u0cb5\\u0cc1 \\u0c88 \\u0caf\\u0ccb\\u0c9c\\u0ca8\\u0cc6\\u0caf \\u0cad\\u0cbe\\u0c97\\u0cb5\\u0cbe\\u0c97\\u0cbf\\u0cb2\\u0ccd\\u0cb2.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0c9a\\u0cbe\\u0c9f\\u0ccd \\u0caa\\u0cc1\\u0ca8\\u0cb0\\u0cbe\\u0cb0\\u0c82\\u0cad\\u0cbf\\u0cb8\\u0cbf\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/ml.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23\\u0d19\\u0d4d\\u0d19\\u0d7e\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0d15\\u0d40\\u0d15\\u0d7e\",\n                        \"logout\": \"\\u0d32\\u0d4b\\u0d17\\u0d4b\\u0d1f\\u0d4d\\u0d1f\\u0d4d\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0d1f\\u0d3e\\u0d38\\u0d4d\\u0d15\\u0d4d \\u0d32\\u0d3f\\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d4d\",\n                    \"loading\": \"\\u0d32\\u0d4b\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d...\",\n                    \"error\": \"\\u0d12\\u0d30\\u0d41 \\u0d2a\\u0d3f\\u0d36\\u0d15\\u0d4d \\u0d38\\u0d02\\u0d2d\\u0d35\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d31\\u0d26\\u0d4d\\u0d26\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"removeAttachment\": \"\\u0d05\\u0d31\\u0d4d\\u0d31\\u0d3e\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2e\\u0d46\\u0d28\\u0d4d\\u0d31\\u0d4d \\u0d28\\u0d40\\u0d15\\u0d4d\\u0d15\\u0d02\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d09\\u0d23\\u0d4d\\u0d1f\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d23\\u0d4b?\",\n                \"clearChat\": \"\\u0d07\\u0d24\\u0d4d \\u0d28\\u0d3f\\u0d32\\u0d35\\u0d3f\\u0d32\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d15\\u0d4d\\u0d32\\u0d3f\\u0d2f\\u0d7c \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\\u0d2f\\u0d41\\u0d02 \\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d06\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\\u0d2f\\u0d41\\u0d02 \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d02.\",\n                \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23\\u0d19\\u0d4d\\u0d19\\u0d7e\",\n                \"expandMessages\": \"\\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d35\\u0d3f\\u0d15\\u0d38\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"hideChainOfThought\": \"\\u0d1a\\u0d3f\\u0d28\\u0d4d\\u0d24\\u0d2f\\u0d41\\u0d1f\\u0d46 \\u0d36\\u0d43\\u0d02\\u0d16\\u0d32 \\u0d2e\\u0d31\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                \"darkMode\": \"\\u0d21\\u0d3e\\u0d7c\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d2e\\u0d4b\\u0d21\\u0d4d\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d02\",\n                \"running\": \"\\u0d13\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\",\n                \"took_one\": \"{{count}} \\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d46\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d0e\\u0d1f\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d41\",\n                \"took_other\": \"{{count}} \\u0d38\\u0d4d\\u0d31\\u0d4d\\u0d31\\u0d46\\u0d2a\\u0d4d\\u0d2a\\u0d41\\u0d15\\u0d7e \\u0d0e\\u0d1f\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d41\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d37\\u0d7b \\u0d06\\u0d15\\u0d4d\\u0d38\\u0d38\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d32\\u0d4b\\u0d17\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                    \"form\": {\n                        \"email\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02\",\n                        \"password\": \"Password\",\n                        \"noAccount\": \"\\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d47?\",\n                        \"alreadyHaveAccount\": \"\\u0d12\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d23\\u0d4d\\u0d1f\\u0d4b?\",\n                        \"signup\": \"\\u0d38\\u0d48\\u0d7b \\u0d05\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\",\n                        \"signin\": \"\\u0d38\\u0d48\\u0d7b \\u0d07\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\",\n                        \"or\": \"\\u0d05\\u0d32\\u0d4d\\u0d32\\u0d46\\u0d19\\u0d4d\\u0d15\\u0d3f\\u0d7d\",\n                        \"continue\": \"\\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                        \"forgotPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2e\\u0d31\\u0d28\\u0d4d\\u0d28\\u0d4b?\",\n                        \"passwordMustContain\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d3f\\u0d7d \\u0d07\\u0d28\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d31\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d35 \\u0d05\\u0d1f\\u0d19\\u0d4d\\u0d19\\u0d3f\\u0d2f\\u0d3f\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d23\\u0d02:\",\n                        \"emailRequired\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                        \"passwordRequired\": \"Password \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0d38\\u0d48\\u0d28\\u0d4d \\u0d07\\u0d28\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d28\\u0d4d \\u0d15\\u0d34\\u0d3f\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"signin\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthsignin\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"redirect_uri_mismatch\": \"\\u0d31\\u0d40\\u0d21\\u0d2f\\u0d31\\u0d15\\u0d4d\\u0d1f\\u0d4d \\u0d2f\\u0d41\\u0d06\\u0d7c\\u0d10 \\u0d13\\u0d24\\u0d4d\\u0d24\\u0d4d \\u0d06\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d15\\u0d4b\\u0d7a\\u0d2b\\u0d3f\\u0d17\\u0d31\\u0d47\\u0d37\\u0d28\\u0d41\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d2a\\u0d4a\\u0d30\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"oauthcallbackerror\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthcreateaccount\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"emailcreateaccount\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"callback\": \"\\u0d2e\\u0d31\\u0d4d\\u0d31\\u0d4a\\u0d30\\u0d41 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d3e\\u0d7b \\u0d36\\u0d4d\\u0d30\\u0d2e\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"oauthaccountnotlinked\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d10\\u0d21\\u0d28\\u0d4d\\u0d31\\u0d3f\\u0d31\\u0d4d\\u0d31\\u0d3f \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d, \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d06\\u0d26\\u0d4d\\u0d2f\\u0d02 \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a \\u0d05\\u0d24\\u0d47 \\u0d05\\u0d15\\u0d4d\\u0d15\\u0d57\\u0d23\\u0d4d\\u0d1f\\u0d4d \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                        \"emailsignin\": \"\\u0d07-\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d1e\\u0d4d\\u0d1e\\u0d3f\\u0d32\\u0d4d\\u0d32.\",\n                        \"emailverify\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15, \\u0d12\\u0d30\\u0d41 \\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d23\\u0d4d\\u0d1f\\u0d4d.\",\n                        \"credentialssignin\": \"\\u0d38\\u0d48\\u0d7b \\u0d07\\u0d7b \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41. \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d28\\u0d7d\\u0d15\\u0d3f\\u0d2f \\u0d35\\u0d3f\\u0d36\\u0d26\\u0d3e\\u0d02\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d36\\u0d30\\u0d3f\\u0d2f\\u0d3e\\u0d23\\u0d4b \\u0d0e\\u0d28\\u0d4d\\u0d28\\u0d4d \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                        \"sessionrequired\": \"\\u0d08 \\u0d2a\\u0d47\\u0d1c\\u0d4d \\u0d06\\u0d15\\u0d4d\\u0d38\\u0d38\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d \\u0d26\\u0d2f\\u0d35\\u0d3e\\u0d2f\\u0d3f \\u0d38\\u0d48\\u0d28\\u0d3f\\u0d7b \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d3f\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d0e\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d31\\u0d3e\\u0d2f\\u0d3f! \\u0d1e\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d12\\u0d30\\u0d41 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d23\\u0d4d\\u0d1f\\u0d4d \",\n                    \"verifyEmailLink\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d38\\u0d48\\u0d28\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d2a\\u0d42\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d2f\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d7b \\u0d06 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d32\\u0d3f\\u0d32\\u0d46 \\u0d32\\u0d3f\\u0d19\\u0d4d\\u0d15\\u0d3f\\u0d7d \\u0d15\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15.\",\n                    \"didNotReceive\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d15\\u0d23\\u0d4d\\u0d1f\\u0d46\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d3f\\u0d32\\u0d4d\\u0d32\\u0d47?\",\n                    \"resendEmail\": \"Email \\u0d35\\u0d40\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"goBack\": \"\\u0d24\\u0d3f\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2a\\u0d4b\\u0d15\\u0d42\",\n                    \"emailSent\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d05\\u0d2f\\u0d1a\\u0d4d\\u0d1a\\u0d41.\",\n                    \"verifyEmail\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                    \"signup\": \"{{provider}} \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d38\\u0d48\\u0d7b \\u0d05\\u0d2a\\u0d4d\\u0d2a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                    \"passwordsMustMatch\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d41\\u0d15\\u0d7e \\u0d2a\\u0d4a\\u0d30\\u0d41\\u0d24\\u0d4d\\u0d24\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d23\\u0d02\",\n                    \"confirmPasswordRequired\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d23\\u0d4d\\u0d1f\\u0d24\\u0d4d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d23\\u0d4d\",\n                    \"newPassword\": \"\\u0d2a\\u0d41\\u0d24\\u0d3f\\u0d2f \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d\",\n                    \"confirmPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"resetPassword\": \"\\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02\",\n                    \"emailRequired\": \"\\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f \\u0d12\\u0d30\\u0d41 \\u0d2b\\u0d40\\u0d7d\\u0d21\\u0d3e\\u0d23\\u0d4d\",\n                    \"emailSent\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d28\\u0d3f\\u0d7c\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e\\u0d15\\u0d4d\\u0d15\\u0d3e\\u0d2f\\u0d3f {{email}} \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d2a\\u0d30\\u0d3f\\u0d36\\u0d4b\\u0d27\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15.\",\n                    \"enterEmail\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d07\\u0d2e\\u0d46\\u0d2f\\u0d3f\\u0d7d \\u0d35\\u0d3f\\u0d32\\u0d3e\\u0d38\\u0d02 \\u0d28\\u0d7d\\u0d15\\u0d41\\u0d15, \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2a\\u0d3e\\u0d38\\u0d4d \\u0d35\\u0d47\\u0d21\\u0d4d \\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d41\\u0d33\\u0d4d\\u0d33 \\u0d28\\u0d3f\\u0d7c\\u0d26\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d1e\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d02.\",\n                    \"resendEmail\": \"Email \\u0d35\\u0d40\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"continue\": \"\\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d15\",\n                    \"goBack\": \"\\u0d24\\u0d3f\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d2a\\u0d4b\\u0d15\\u0d42\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0d1a\\u0d30\\u0d3f\\u0d24\\u0d4d\\u0d30\\u0d02 \\u0d15\\u0d3e\\u0d23\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"lastInputs\": \"\\u0d05\\u0d35\\u0d38\\u0d3e\\u0d28 \\u0d07\\u0d7b\\u0d2a\\u0d41\\u0d1f\\u0d4d\\u0d1f\\u0d41\\u0d15\\u0d7e\",\n                        \"noInputs\": \"\\u0d36\\u0d42\\u0d28\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d2f...\",\n                        \"loading\": \"\\u0d32\\u0d4b\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d02 \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d1f\\u0d48\\u0d2a\\u0d4d\\u0d2a\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0d31\\u0d46\\u0d15\\u0d4d\\u0d15\\u0d4b\\u0d7c\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d \\u0d06\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"stop\": \"\\u0d31\\u0d46\\u0d15\\u0d4d\\u0d15\\u0d4b\\u0d7c\\u0d21\\u0d3f\\u0d02\\u0d17\\u0d4d \\u0d28\\u0d3f\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d41\\u0d15\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d02 \\u0d05\\u0d2f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"stopTask\": \"\\u0d1c\\u0d4b\\u0d32\\u0d3f \\u0d28\\u0d3f\\u0d7c\\u0d24\\u0d4d\\u0d24\\u0d41\\u0d15\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0d2b\\u0d2f\\u0d32\\u0d41\\u0d15\\u0d7e \\u0d05\\u0d31\\u0d4d\\u0d31\\u0d3e\\u0d1a\\u0d4d\\u0d1a\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d15\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0d28\\u0d3f\\u0d7c\\u0d2e\\u0d4d\\u0d2e\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d24\\u0d4d\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0d13\\u0d1f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\",\n                        \"executedSuccessfully\": \"\\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d28\\u0d1f\\u0d2a\\u0d4d\\u0d2a\\u0d3f\\u0d32\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3f\",\n                        \"failed\": \"\\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41\",\n                        \"feedbackUpdated\": \"\\u0d2b\\u0d40\\u0d21\\u0d4d\\u0d2c\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d05\\u0d2a\\u0d4d \\u0d21\\u0d47\\u0d31\\u0d4d\\u0d31\\u0d41\\u0d1a\\u0d46\\u0d2f\\u0d4d \\u0d24\\u0d41\",\n                        \"updating\": \"\\u0d05\\u0d2a\\u0d4d \\u0d21\\u0d47\\u0d31\\u0d4d\\u0d31\\u0d4d\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d2b\\u0d2f\\u0d32\\u0d41\\u0d15\\u0d7e \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d07\\u0d1f\\u0d41\\u0d15\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0d05\\u0d2a\\u0d4d \\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41\",\n                    \"cancelledUploadOf\": \"\\u0d05\\u0d2a\\u0d4d \\u0d32\\u0d4b\\u0d21\\u0d4d \\u0d31\\u0d26\\u0d4d\\u0d26\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d3f\",\n                    \"couldNotReachServer\": \"\\u0d38\\u0d46\\u0d7c\\u0d35\\u0d31\\u0d3f\\u0d7d \\u0d0e\\u0d24\\u0d4d\\u0d24\\u0d3e\\u0d7b \\u0d15\\u0d34\\u0d3f\\u0d1e\\u0d4d\\u0d1e\\u0d3f\\u0d32\\u0d4d\\u0d32\",\n                    \"continuingChat\": \"\\u0d2e\\u0d41\\u0d2e\\u0d4d\\u0d2a\\u0d24\\u0d4d\\u0d24\\u0d46 \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d24\\u0d41\\u0d1f\\u0d30\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d41\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d23 \\u0d2a\\u0d3e\\u0d28\\u0d7d\",\n                    \"reset\": \"\\u0d2a\\u0d41\\u0d28\\u0d03\\u0d15\\u0d4d\\u0d30\\u0d2e\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                    \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                    \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"Feedback: \\u0d0e\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d02\",\n                            \"feedbackPositive\": \"Feedback: \\u0d2a\\u0d4b\\u0d38\\u0d3f\\u0d31\\u0d4d\\u0d31\\u0d40\\u0d35\\u0d4d\",\n                            \"feedbackNegative\": \"Feedback: \\u0d28\\u0d46\\u0d17\\u0d31\\u0d4d\\u0d31\\u0d40\\u0d35\\u0d4d\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0d24\\u0d3f\\u0d30\\u0d2f\\u0d41\\u0d15\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0d07\\u0d24\\u0d4d \\u0d24\\u0d4d\\u0d30\\u0d46\\u0d21\\u0d41\\u0d02 \\u0d05\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46 \\u0d38\\u0d28\\u0d4d\\u0d26\\u0d47\\u0d36\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d02 \\u0d18\\u0d1f\\u0d15\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d02 \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d02.\",\n                        \"cancel\": \"\\u0d15\\u0d4d\\u0d2f\\u0d3e\\u0d7b\\u0d38\\u0d7d \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d2f\\u0d4d\",\n                        \"confirm\": \"\\u0d38\\u0d4d\\u0d25\\u0d3f\\u0d30\\u0d40\\u0d15\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"deletingChat\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d07\\u0d32\\u0d4d\\u0d32\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d7d\",\n                        \"chatDeleted\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d28\\u0d40\\u0d15\\u0d4d\\u0d15\\u0d02 \\u0d1a\\u0d46\\u0d2f\\u0d4d\\u0d24\\u0d41\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"Past Chats\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0d36\\u0d42\\u0d28\\u0d4d\\u0d2f\\u0d02...\",\n                        \"today\": \"\\u0d07\\u0d28\\u0d4d\\u0d28\\u0d4d\",\n                        \"yesterday\": \"\\u0d07\\u0d28\\u0d4d\\u0d28\\u0d32\\u0d46\",\n                        \"previous7days\": \"Previous 7 \\u0d26\\u0d3f\\u0d35\\u0d38\\u0d02\",\n                        \"previous30days\": \"Previous 30 \\u0d26\\u0d3f\\u0d35\\u0d38\\u0d02\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0d38\\u0d48\\u0d21\\u0d4d \\u0d2c\\u0d3e\\u0d7c \\u0d05\\u0d1f\\u0d2f\\u0d4d\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\",\n                        \"openSidebar\": \"\\u0d38\\u0d48\\u0d21\\u0d4d \\u0d2c\\u0d3e\\u0d7c \\u0d24\\u0d41\\u0d31\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d3f\\u0d32\\u0d47\\u0d15\\u0d4d\\u0d15\\u0d4d \\u0d2e\\u0d1f\\u0d19\\u0d4d\\u0d19\\u0d41\\u0d15\",\n                    \"chatCreatedOn\": \"\\u0d08 \\u0d1a\\u0d3e\\u0d31\\u0d4d\\u0d31\\u0d4d \\u0d07\\u0d35\\u0d3f\\u0d1f\\u0d46 \\u0d38\\u0d43\\u0d37\\u0d4d\\u0d1f\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0d38\\u0d02\\u0d2d\\u0d3e\\u0d37\\u0d23\\u0d02\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0d26\\u0d3e\\u0d24\\u0d3e\\u0d15\\u0d4d\\u0d15\\u0d33\\u0d46 \\u0d15\\u0d4a\\u0d23\\u0d4d\\u0d1f\\u0d41\\u0d35\\u0d30\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d7d \\u0d2a\\u0d30\\u0d3e\\u0d1c\\u0d2f\\u0d2a\\u0d4d\\u0d2a\\u0d46\\u0d1f\\u0d4d\\u0d1f\\u0d41:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0d35\\u0d3f\\u0d1c\\u0d2f\\u0d15\\u0d30\\u0d2e\\u0d3e\\u0d2f\\u0d3f \\u0d38\\u0d02\\u0d30\\u0d15\\u0d4d\\u0d37\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d41\",\n            \"requiredApiKeys\": \"\\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d41\\u0d33\\u0d4d\\u0d33 API \\u0d15\\u0d40\\u0d15\\u0d7e\",\n            \"requiredApiKeysInfo\": \"\\u0d08 \\u0d05\\u0d2a\\u0d4d\\u0d32\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d47\\u0d37\\u0d7b \\u0d09\\u0d2a\\u0d2f\\u0d4b\\u0d17\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d3f\\u0d28\\u0d4d, \\u0d07\\u0d28\\u0d3f\\u0d2a\\u0d4d\\u0d2a\\u0d31\\u0d2f\\u0d41\\u0d28\\u0d4d\\u0d28 \\u0d0e\\u0d2a\\u0d3f\\u0d10 \\u0d15\\u0d40\\u0d15\\u0d7e \\u0d06\\u0d35\\u0d36\\u0d4d\\u0d2f\\u0d2e\\u0d3e\\u0d23\\u0d4d. \\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d33\\u0d41\\u0d1f\\u0d46 \\u0d09\\u0d2a\\u0d15\\u0d30\\u0d23\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d28\\u0d4d\\u0d31\\u0d46 \\u0d2a\\u0d4d\\u0d30\\u0d3e\\u0d26\\u0d47\\u0d36\\u0d3f\\u0d15 \\u0d38\\u0d02\\u0d2d\\u0d30\\u0d23\\u0d24\\u0d4d\\u0d24\\u0d3f\\u0d32\\u0d3e\\u0d23\\u0d4d \\u0d15\\u0d40\\u0d15\\u0d7e \\u0d38\\u0d02\\u0d2d\\u0d30\\u0d3f\\u0d1a\\u0d4d\\u0d1a\\u0d3f\\u0d30\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d28\\u0d4d\\u0d28\\u0d24\\u0d4d.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0d28\\u0d3f\\u0d19\\u0d4d\\u0d19\\u0d7e \\u0d08 \\u0d2a\\u0d26\\u0d4d\\u0d27\\u0d24\\u0d3f\\u0d2f\\u0d41\\u0d1f\\u0d46 \\u0d2d\\u0d3e\\u0d17\\u0d2e\\u0d32\\u0d4d\\u0d32.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0d38\\u0d02\\u0d2d\\u0d3e\\u0d37\\u0d23\\u0d02 \\u0d2a\\u0d41\\u0d28\\u0d30\\u0d3e\\u0d30\\u0d02\\u0d2d\\u0d3f\\u0d15\\u0d4d\\u0d15\\u0d41\\u0d15\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/mr.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"\\u090f\\u092a\\u0940\\u0906\\u092f \\u0915\\u0940\\u091c\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0928\\u0935\\u0940\\u0928 \\u0917\\u092a\\u094d\\u092a\\u093e\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0915\\u093e\\u0930\\u094d\\u092f \\u0938\\u0942\\u091a\\u0940\",\n                    \"loading\": \"\\u0932\\u094b\\u0921\\u093f\\u0902\\u0917...\",\n                    \"error\": \"\\u090f\\u0915 \\u0924\\u094d\\u0930\\u0941\\u091f\\u0940 \\u091d\\u093e\\u0932\\u0940\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                \"removeAttachment\": \"\\u0938\\u0902\\u0932\\u0917\\u094d\\u0928\\u0924\\u093e \\u0915\\u093e\\u0922\\u0942\\u0928 \\u091f\\u093e\\u0915\\u093e\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0928\\u0935\\u0940\\u0928 \\u091a\\u0945\\u091f \\u0924\\u092f\\u093e\\u0930 \\u0915\\u0930\\u093e?\",\n                \"clearChat\": \"\\u092f\\u093e\\u092e\\u0941\\u0933\\u0947 \\u0938\\u0927\\u094d\\u092f\\u093e\\u091a\\u0947 \\u092e\\u0947\\u0938\\u0947\\u091c \\u0915\\u094d\\u0932\\u093f\\u0905\\u0930 \\u0939\\u094b\\u0924\\u0940\\u0932 \\u0906\\u0923\\u093f \\u0928\\u0935\\u0940\\u0928 \\u091a\\u0945\\u091f \\u0938\\u0941\\u0930\\u0942 \\u0939\\u094b\\u0908\\u0932.\",\n                \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938\",\n                \"expandMessages\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u093e\\u0902\\u091a\\u093e \\u0935\\u093f\\u0938\\u094d\\u0924\\u093e\\u0930 \\u0915\\u0930\\u093e\",\n                \"hideChainOfThought\": \"\\u0935\\u093f\\u091a\\u093e\\u0930\\u093e\\u0902\\u091a\\u0940 \\u0938\\u093e\\u0916\\u0933\\u0940 \\u0932\\u092a\\u0935\\u093e\",\n                \"darkMode\": \"\\u0921\\u093e\\u0930\\u094d\\u0915 \\u092e\\u094b\\u0921\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0935\\u093e\\u092a\\u0930\\u0924\",\n                \"running\": \"\\u0927\\u093e\\u0935\\u0924 \\u0906\\u0939\\u0947.\",\n                \"took_one\": \"{{count}} \\u092a\\u093e\\u090a\\u0932 \\u0909\\u091a\\u0932\\u0932\\u0947\",\n                \"took_other\": \"{{count}} \\u092a\\u093e\\u0935\\u0932\\u0947 \\u0909\\u091a\\u0932\\u0932\\u0940\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0905 \\u0945\\u092a\\u092e\\u0927\\u094d\\u092f\\u0947 \\u092a\\u094d\\u0930\\u0935\\u0947\\u0936 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0932\\u0949\\u0917\\u093f\\u0928 \\u0915\\u0930\\u093e.\",\n                    \"form\": {\n                        \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e\",\n                        \"password\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                        \"noAccount\": \"\\u0916\\u093e\\u0924\\u0947 \\u0928\\u093e\\u0939\\u0940 \\u0915\\u093e?\",\n                        \"alreadyHaveAccount\": \"\\u0906\\u0927\\u0940\\u091a \\u0916\\u093e\\u0924\\u0947 \\u0906\\u0939\\u0947 \\u0915\\u093e?\",\n                        \"signup\": \"\\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u093e\",\n                        \"signin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928\",\n                        \"or\": \"\\u0915\\u093f\\u0902\\u0935\\u093e\",\n                        \"continue\": \"\\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                        \"forgotPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0935\\u093f\\u0938\\u0930\\u0932\\u093e?\",\n                        \"passwordMustContain\": \"\\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\\u092e\\u0927\\u094d\\u092f\\u0947 \\u0939\\u0947 \\u0905\\u0938\\u0923\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947:\",\n                        \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                        \"passwordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938 \\u0905\\u0915\\u094d\\u0937\\u092e.\",\n                        \"signin\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthsignin\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"redirect_uri_mismatch\": \"\\u0930\\u093f\\u0921\\u093e\\u092f\\u0930\\u0947\\u0915\\u094d\\u091f \\u092f\\u0942\\u0906\\u0930\\u0906\\u092f \\u0911\\u0925 \\u0905\\u0945\\u092a \\u0915\\u0949\\u0928\\u094d\\u092b\\u093f\\u0917\\u0930\\u0947\\u0936\\u0928\\u0936\\u0940 \\u091c\\u0941\\u0933\\u0924 \\u0928\\u093e\\u0939\\u0940.\",\n                        \"oauthcallbackerror\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthcreateaccount\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"emailcreateaccount\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"callback\": \"\\u0935\\u0947\\u0917\\u0933\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u093e \\u092a\\u094d\\u0930\\u092f\\u0924\\u094d\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"oauthaccountnotlinked\": \"\\u0906\\u092a\\u0932\\u0940 \\u0913\\u0933\\u0916 \\u0928\\u093f\\u0936\\u094d\\u091a\\u093f\\u0924 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940, \\u0906\\u092a\\u0923 \\u092e\\u0942\\u0933\\u0935\\u093e\\u092a\\u0930\\u0932\\u0947\\u0932\\u094d\\u092f\\u093e \\u0916\\u093e\\u0924\\u094d\\u092f\\u093e\\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u093e.\",\n                        \"emailsignin\": \"\\u0908-\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u0924\\u093e \\u0906\\u0932\\u093e \\u0928\\u093e\\u0939\\u0940.\",\n                        \"emailverify\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932\\u091a\\u0940 \\u092a\\u0921\\u0924\\u093e\\u0933\\u0923\\u0940 \\u0915\\u0930\\u093e, \\u090f\\u0915 \\u0928\\u0935\\u0940\\u0928 \\u0908\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u093f\\u0932\\u093e \\u0917\\u0947\\u0932\\u093e \\u0906\\u0939\\u0947.\",\n                        \"credentialssignin\": \"\\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0905\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940 \\u091d\\u093e\\u0932\\u0947. \\u0906\\u092a\\u0923 \\u0926\\u093f\\u0932\\u0947\\u0932\\u093e \\u0924\\u092a\\u0936\\u0940\\u0932 \\u092f\\u094b\\u0917\\u094d\\u092f \\u0906\\u0939\\u0947 \\u0939\\u0947 \\u0924\\u092a\\u093e\\u0938\\u093e.\",\n                        \"sessionrequired\": \"\\u0915\\u0943\\u092a\\u092f\\u093e \\u092f\\u093e \\u092a\\u0943\\u0937\\u094d\\u0920\\u093e\\u0935\\u0930 \\u092a\\u094d\\u0930\\u0935\\u0947\\u0936 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0938\\u093e\\u0907\\u0928 \\u0907\\u0928 \\u0915\\u0930\\u093e.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0924\\u0942 \\u091c\\u0935\\u0933\\u091c\\u0935\\u0933 \\u0924\\u093f\\u0925\\u0947\\u091a \\u0906\\u0939\\u0947\\u0938! \\u0906\\u092e\\u094d\\u0939\\u0940 \\u090f\\u0915 \\u0908\\u092e\\u0947\\u0932 \\u092a\\u093e\\u0920\\u0935\\u0932\\u093e \\u0906\\u0939\\u0947. \",\n                    \"verifyEmailLink\": \"\\u0906\\u092a\\u0932\\u0947 \\u0938\\u093e\\u0907\\u0928\\u0905\\u092a \\u092a\\u0942\\u0930\\u094d\\u0923 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0915\\u0943\\u092a\\u092f\\u093e \\u0924\\u094d\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932\\u092e\\u0927\\u0940\\u0932 \\u0932\\u093f\\u0902\\u0915\\u0935\\u0930 \\u0915\\u094d\\u0932\\u093f\\u0915 \\u0915\\u0930\\u093e.\",\n                    \"didNotReceive\": \"\\u0908\\u092e\\u0947\\u0932 \\u0938\\u093e\\u092a\\u0921\\u0924 \\u0928\\u093e\\u0939\\u0940 \\u0915\\u093e?\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                    \"goBack\": \"\\u092a\\u0930\\u0924 \\u091c\\u093e\",\n                    \"emailSent\": \"\\u0908\\u092e\\u0947\\u0932 \\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u092a\\u093e\\u0920\\u0935\\u093f\\u0932\\u093e.\",\n                    \"verifyEmail\": \"\\u0906\\u092a\\u0932\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e \\u092a\\u0921\\u0924\\u093e\\u0933\\u0942\\u0928 \\u092a\\u0939\\u093e\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                    \"signup\": \"{{provider}} \\u0938\\u0939 \\u0938\\u093e\\u0907\\u0928 \\u0905\\u092a \\u0915\\u0930\\u093e\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0928\\u0935\\u0940\\u0928 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0939\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                    \"passwordsMustMatch\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u091c\\u0941\\u0933\\u0923\\u0947 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947\",\n                    \"confirmPasswordRequired\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947 \\u092f\\u093e\\u091a\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                    \"newPassword\": \"\\u0928\\u0935\\u0940\\u0928 \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921\",\n                    \"confirmPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u091a\\u0940 \\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                    \"resetPassword\": \"\\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u093e\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e\",\n                    \"emailRequired\": \"\\u0908\\u092e\\u0947\\u0932 \\u0939\\u0947 \\u090f\\u0915 \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930 \\u0906\\u0939\\u0947\",\n                    \"emailSent\": \"\\u0906\\u092a\\u0932\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u094d\\u092f\\u093e \\u0938\\u0942\\u091a\\u0928\\u093e\\u0902\\u0938\\u093e\\u0920\\u0940 \\u0915\\u0943\\u092a\\u092f\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e {{email}} \\u0924\\u092a\\u093e\\u0938\\u093e.\",\n                    \"enterEmail\": \"\\u0906\\u092a\\u0932\\u093e \\u0908\\u092e\\u0947\\u0932 \\u092a\\u0924\\u094d\\u0924\\u093e \\u092a\\u094d\\u0930\\u0935\\u093f\\u0937\\u094d\\u091f \\u0915\\u0930\\u093e \\u0906\\u0923\\u093f \\u0906\\u092e\\u094d\\u0939\\u0940 \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e\\u0932\\u093e \\u0906\\u092a\\u0932\\u093e \\u092a\\u093e\\u0938\\u0935\\u0930\\u094d\\u0921 \\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u091a\\u094d\\u092f\\u093e \\u0938\\u0942\\u091a\\u0928\\u093e \\u092a\\u093e\\u0920\\u0935\\u0942.\",\n                    \"resendEmail\": \"\\u0908\\u092e\\u0947\\u0932 \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                    \"continue\": \"\\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\",\n                    \"goBack\": \"\\u092a\\u0930\\u0924 \\u091c\\u093e\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0907\\u0924\\u093f\\u0939\\u093e\\u0938 \\u0926\\u093e\\u0916\\u0935\\u093e\",\n                        \"lastInputs\": \"\\u0936\\u0947\\u0935\\u091f\\u091a\\u0940 \\u092e\\u093e\\u0939\\u093f\\u0924\\u0940\",\n                        \"noInputs\": \"\\u0907\\u0924\\u0915\\u0940 \\u0930\\u093f\\u0915\\u093e\\u092e\\u0940...\",\n                        \"loading\": \"\\u0932\\u094b\\u0921\\u093f\\u0902\\u0917...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0924\\u0941\\u092e\\u091a\\u093e \\u092e\\u0947\\u0938\\u0947\\u091c \\u0907\\u0925\\u0947 \\u091f\\u093e\\u0908\\u092a \\u0915\\u0930\\u093e...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0930\\u0947\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0938\\u0941\\u0930\\u0942 \\u0915\\u0930\\u093e\",\n                        \"stop\": \"\\u0930\\u0947\\u0915\\u0949\\u0930\\u094d\\u0921\\u093f\\u0902\\u0917 \\u0925\\u093e\\u0902\\u092c\\u0935\\u093e\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0938\\u0902\\u0926\\u0947\\u0936 \\u092a\\u093e\\u0920\\u0935\\u093e\",\n                        \"stopTask\": \"\\u0915\\u093e\\u0930\\u094d\\u092f \\u0925\\u093e\\u0902\\u092c\\u0935\\u093e\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u092b\\u093e\\u0908\\u0932\\u094d\\u0938 \\u0938\\u0902\\u0932\\u0917\\u094d\\u0928 \\u0915\\u0930\\u093e\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u092f\\u093e\\u0938\\u0939 \\u092c\\u093e\\u0902\\u0927\\u0932\\u0947 \\u0906\\u0939\\u0947\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0927\\u093e\\u0935\\u0924 \\u0906\\u0939\\u0947.\",\n                        \"executedSuccessfully\": \"\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u0930\\u093e\\u092c\\u0935\\u093f\\u0932\\u0940\",\n                        \"failed\": \"\\u0905\\u092a\\u092f\\u0936\\u0940 \\u0920\\u0930\\u0932\\u0947\",\n                        \"feedbackUpdated\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f \\u0905\\u0926\\u094d\\u092f\\u092f\\u093e\\u0935\\u0924\",\n                        \"updating\": \"\\u0905\\u0926\\u094d\\u092f\\u092f\\u093e\\u0935\\u0924 \\u0915\\u0930\\u0923\\u0947\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u092b\\u093e\\u092f\\u0932\\u0940 \\u092f\\u0947\\u0925\\u0947 \\u091f\\u093e\\u0915\\u093e\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0905\\u092a\\u0932\\u094b\\u0921 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0905\\u092a\\u092f\\u0936 \\u0906\\u0932\\u0947\",\n                    \"cancelledUploadOf\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0947\\u0932\\u0947\\u0932\\u0947 \\u0905\\u092a\\u0932\\u094b\\u0921\",\n                    \"couldNotReachServer\": \"\\u0938\\u0930\\u094d\\u0935\\u094d\\u0939\\u0930\\u092a\\u0930\\u094d\\u092f\\u0902\\u0924 \\u092a\\u094b\\u0939\\u094b\\u091a\\u0942 \\u0936\\u0915\\u0932\\u0947 \\u0928\\u093e\\u0939\\u0940\",\n                    \"continuingChat\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0917\\u092a\\u094d\\u092a\\u093e \\u091a\\u093e\\u0932\\u0942 \\u0920\\u0947\\u0935\\u093e\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0938\\u0947\\u091f\\u093f\\u0902\\u0917\\u094d\\u0938 \\u092a\\u0945\\u0928\\u0947\\u0932\",\n                    \"reset\": \"\\u0930\\u0940\\u0938\\u0947\\u091f \\u0915\\u0930\\u093e\",\n                    \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                    \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0938\\u0930\\u094d\\u0935\",\n                            \"feedbackPositive\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0938\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\",\n                            \"feedbackNegative\": \"\\u0905\\u092d\\u093f\\u092a\\u094d\\u0930\\u093e\\u092f: \\u0928\\u0915\\u093e\\u0930\\u093e\\u0924\\u094d\\u092e\\u0915\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0936\\u094b\\u0927\\u0923\\u0947\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0939\\u0947 \\u0927\\u093e\\u0917\\u093e \\u0924\\u0938\\u0947\\u091a \\u0924\\u094d\\u092f\\u093e\\u0924\\u0940\\u0932 \\u0938\\u0902\\u0926\\u0947\\u0936 \\u0906\\u0923\\u093f \\u0918\\u091f\\u0915 \\u0921\\u093f\\u0932\\u0940\\u091f \\u0915\\u0930\\u0947\\u0932.\",\n                        \"cancel\": \"\\u0930\\u0926\\u094d\\u0926 \\u0915\\u0930\\u093e\",\n                        \"confirm\": \"\\u092a\\u0941\\u0937\\u094d\\u091f\\u0940 \\u0915\\u0930\\u093e\",\n                        \"deletingChat\": \"\\u091a\\u0945\\u091f \\u0921\\u093f\\u0932\\u0940\\u091f \\u0915\\u0930\\u0923\\u0947\",\n                        \"chatDeleted\": \"\\u091a\\u0945\\u091f \\u0921\\u093f\\u0932\\u0940\\u091f\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0917\\u092a\\u094d\\u092a\\u093e\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0930\\u093f\\u0915\\u094d\\u0924\\u0964\\u0964\\u0964\",\n                        \"today\": \"\\u0906\\u091c\",\n                        \"yesterday\": \"\\u0915\\u093e\\u0932\",\n                        \"previous7days\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 7 \\u0926\\u093f\\u0935\\u0938\",\n                        \"previous30days\": \"\\u092e\\u093e\\u0917\\u0940\\u0932 \\u0969\\u0966 \\u0926\\u093f\\u0935\\u0938\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930 \\u092c\\u0902\\u0926 \\u0915\\u0930\\u093e\",\n                        \"openSidebar\": \"\\u0913\\u092a\\u0928 \\u0938\\u093e\\u0907\\u0921\\u092c\\u093e\\u0930\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u092a\\u0930\\u0924 \\u0917\\u092a\\u094d\\u092a\\u093e \\u092e\\u093e\\u0930\\u093e\\u092f\\u0932\\u093e \\u091c\\u093e\",\n                    \"chatCreatedOn\": \"\\u0939\\u0947 \\u091a\\u0945\\u091f \\u0924\\u092f\\u093e\\u0930 \\u0915\\u0930\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0906\\u0932\\u0947 \\u0939\\u094b\\u0924\\u0947.\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u092c\\u0915\\u0935\\u093e\\u0926 \\u0915\\u0930\\u0923\\u0947\\u0902\",\n                \"readme\": \"\\u0935\\u093e\\u091a\\u093e\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u092a\\u094d\\u0930\\u0926\\u093e\\u0924\\u094d\\u092f\\u093e\\u0902\\u0928\\u093e \\u0906\\u0923\\u0923\\u094d\\u092f\\u093e\\u0924 \\u0905\\u092a\\u092f\\u0936\\u0940:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u092f\\u0936\\u0938\\u094d\\u0935\\u0940\\u0930\\u093f\\u0924\\u094d\\u092f\\u093e \\u0935\\u093e\\u091a\\u0935\\u0932\\u0947\",\n            \"requiredApiKeys\": \"\\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u090f\\u092a\\u0940\\u0906\\u092f \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e\",\n            \"requiredApiKeysInfo\": \"\\u0939\\u0947 \\u0905\\u0945\\u092a \\u0935\\u093e\\u092a\\u0930\\u0923\\u094d\\u092f\\u093e\\u0938\\u093e\\u0920\\u0940 \\u0916\\u093e\\u0932\\u0940\\u0932 \\u090f\\u092a\\u0940\\u0906\\u092f \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e \\u0906\\u0935\\u0936\\u094d\\u092f\\u0915 \\u0906\\u0939\\u0947\\u0924. \\u091a\\u093e\\u0935\\u094d\\u092f\\u093e \\u0906\\u092a\\u0932\\u094d\\u092f\\u093e \\u0921\\u093f\\u0935\\u094d\\u0939\\u093e\\u0907\\u0938\\u091a\\u094d\\u092f\\u093e \\u0938\\u094d\\u0925\\u093e\\u0928\\u093f\\u0915 \\u0938\\u094d\\u091f\\u094b\\u0930\\u0947\\u091c\\u0935\\u0930 \\u0938\\u0902\\u0917\\u094d\\u0930\\u0939\\u093f\\u0924 \\u0915\\u0947\\u0932\\u094d\\u092f\\u093e \\u091c\\u093e\\u0924\\u093e\\u0924.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0924\\u0941\\u092e\\u094d\\u0939\\u0940 \\u092f\\u093e \\u092a\\u094d\\u0930\\u0915\\u0932\\u094d\\u092a\\u093e\\u091a\\u093e \\u092d\\u093e\\u0917 \\u0928\\u093e\\u0939\\u0940.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u091a\\u0945\\u091f \\u092a\\u0941\\u0928\\u094d\\u0939\\u093e \\u0938\\u0941\\u0930\\u0942 \\u0915\\u0930\\u093e\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/ta.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd\",\n                        \"logout\": \"\\u0bb5\\u0bc6\\u0bb3\\u0bbf\\u0baf\\u0bc7\\u0bb1\\u0bc1\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0baa\\u0ba3\\u0bbf \\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bb2\\u0bcd\",\n                    \"loading\": \"\\u0b8f\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1...\",\n                    \"error\": \"\\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0bbf\\u0bb4\\u0bc8 \\u0b8f\\u0bb1\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\",\n                \"removeAttachment\": \"\\u0b87\\u0ba3\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc8 \\u0b85\\u0b95\\u0bb1\\u0bcd\\u0bb1\\u0bc1\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0b89\\u0bb0\\u0bc1\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bbe?\",\n                \"clearChat\": \"\\u0b87\\u0ba4\\u0bc1 \\u0ba4\\u0bb1\\u0bcd\\u0baa\\u0bcb\\u0ba4\\u0bc8\\u0baf \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0b85\\u0bb4\\u0bbf\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8\\u0ba4\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bc1\\u0bae\\u0bcd.\",\n                \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                \"expandMessages\": \"\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0bb5\\u0bbf\\u0bb0\\u0bbf\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0bc1\",\n                \"hideChainOfThought\": \"\\u0b9a\\u0bbf\\u0ba8\\u0bcd\\u0ba4\\u0ba9\\u0bc8\\u0b9a\\u0bcd \\u0b9a\\u0b99\\u0bcd\\u0b95\\u0bbf\\u0bb2\\u0bbf\\u0baf\\u0bc8 \\u0bae\\u0bb1\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                \"darkMode\": \"\\u0b87\\u0bb0\\u0bc1\\u0ba3\\u0bcd\\u0b9f \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0bae\\u0bc1\\u0bb1\\u0bc8\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbf\",\n                \"running\": \"\\u0b93\\u0b9f\\u0bc1\\u0ba4\\u0bb2\\u0bcd\",\n                \"took_one\": \"{{count}} \\u0b85\\u0b9f\\u0bbf \\u0b8e\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0bb5\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bbe\\u0bb0\\u0bcd\",\n                \"took_other\": \"{{count}} \\u0baa\\u0b9f\\u0bbf\\u0b95\\u0bb3\\u0bc8 \\u0b8e\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbe\\u0bb0\\u0bcd\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0b85\\u0ba3\\u0bc1\\u0b95 \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0b95.\",\n                    \"form\": {\n                        \"email\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\",\n                        \"password\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\",\n                        \"noAccount\": \"\\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b87\\u0bb2\\u0bcd\\u0bb2\\u0bc8\\u0baf\\u0bbe?\",\n                        \"alreadyHaveAccount\": \"\\u0b8f\\u0bb1\\u0bcd\\u0b95\\u0ba9\\u0bb5\\u0bc7 \\u0b92\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0ba4\\u0bbe?\",\n                        \"signup\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1\\u0baa\\u0bc6\\u0bb1\\u0bc1\",\n                        \"signin\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0b95\",\n                        \"or\": \"\\u0b85\\u0bb2\\u0bcd\\u0bb2\\u0ba4\\u0bc1\",\n                        \"continue\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bcd\",\n                        \"forgotPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bb1\\u0ba8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0bc0\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bbe?\",\n                        \"passwordMustContain\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0b87\\u0bb5\\u0bc8 \\u0b87\\u0bb0\\u0bc1\\u0b95\\u0bcd\\u0b95 \\u0bb5\\u0bc7\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd:\",\n                        \"emailRequired\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                        \"passwordRequired\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0b87\\u0baf\\u0bb2\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"signin\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthsignin\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"redirect_uri_mismatch\": \"\\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bbe\\u0bb1\\u0bcd\\u0bb1\\u0bc1 URI oauth \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc1 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bae\\u0bc8\\u0bb5\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0baa\\u0bca\\u0bb0\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"oauthcallbackerror\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthcreateaccount\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"emailcreateaccount\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"callback\": \"\\u0bb5\\u0bc7\\u0bb1\\u0bca\\u0bb0\\u0bc1 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0baf\\u0bb1\\u0bcd\\u0b9a\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"oauthaccountnotlinked\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b85\\u0b9f\\u0bc8\\u0baf\\u0bbe\\u0bb3\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4, \\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bc1\\u0ba4\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0baf \\u0b85\\u0ba4\\u0bc7 \\u0b95\\u0ba3\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b9f\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"emailsignin\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa \\u0b87\\u0baf\\u0bb2\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\",\n                        \"emailverify\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd, \\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1.\",\n                        \"credentialssignin\": \"\\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0bb5\\u0bc1 \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\\u0baf\\u0bc1\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bc1. \\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bb5\\u0bb4\\u0b99\\u0bcd\\u0b95\\u0bbf\\u0baf \\u0bb5\\u0bbf\\u0bb5\\u0bb0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bb0\\u0bbf\\u0baf\\u0bbe\\u0ba9\\u0ba4\\u0bbe \\u0b8e\\u0ba9\\u0bcd\\u0bb1\\u0bc1 \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                        \"sessionrequired\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4\\u0baa\\u0bcd \\u0baa\\u0b95\\u0bcd\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b85\\u0ba3\\u0bc1\\u0b95 \\u0b89\\u0bb3\\u0bcd\\u0ba8\\u0bc1\\u0bb4\\u0bc8\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bcd\\u0ba4\\u0b9f\\u0bcd\\u0b9f \\u0bb5\\u0ba8\\u0bcd\\u0ba4\\u0bc1\\u0bb5\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0bc0\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bcd! -\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0b92\\u0bb0\\u0bc1 \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0baf\\u0bc1\\u0bb3\\u0bcd\\u0bb3\\u0bcb\\u0bae\\u0bcd \",\n                    \"verifyEmailLink\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bb2\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc8\\u0bb5\\u0bc1\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf \\u0b85\\u0ba8\\u0bcd\\u0ba4 \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bbf\\u0bb2\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0bb3 \\u0b87\\u0ba3\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0bbf\\u0bb3\\u0bbf\\u0b95\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                    \"didNotReceive\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0baa\\u0bbf\\u0b9f\\u0bbf\\u0b95\\u0bcd\\u0b95 \\u0bae\\u0bc1\\u0b9f\\u0bbf\\u0baf\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8\\u0baf\\u0bbe?\",\n                    \"resendEmail\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"goBack\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\",\n                    \"emailSent\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1.\",\n                    \"verifyEmail\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b88\\u0bae\\u0bc6\\u0baf\\u0bbf\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8\\u0b9a\\u0bcd \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"signup\": \"{{provider}} \\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0b95\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"passwordsMustMatch\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb1\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0baa\\u0bca\\u0bb0\\u0bc1\\u0ba8\\u0bcd\\u0ba4 \\u0bb5\\u0bc7\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd\",\n                    \"confirmPasswordRequired\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bb5\\u0bc1\\u0bae\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"newPassword\": \"\\u0baa\\u0bc1\\u0ba4\\u0bbf\\u0baf \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\",\n                    \"confirmPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"resetPassword\": \"\\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\",\n                    \"emailRequired\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 \\u0baa\\u0bc1\\u0bb2\\u0bae\\u0bcd\",\n                    \"emailSent\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0ba4\\u0bb1\\u0bcd\\u0b95\\u0bbe\\u0ba9 \\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bc1\\u0bb1\\u0bc8\\u0b95\\u0bb3\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 {{email}} \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8 \\u0b9a\\u0bb0\\u0bbf\\u0baa\\u0bbe\\u0bb0\\u0bcd\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd.\",\n                    \"enterEmail\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bcd \\u0bae\\u0bc1\\u0b95\\u0bb5\\u0bb0\\u0bbf\\u0baf\\u0bc8 \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bbf\\u0b9f\\u0bb5\\u0bc1\\u0bae\\u0bcd, \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0b9f\\u0bb5\\u0bc1\\u0b9a\\u0bcd\\u0b9a\\u0bca\\u0bb2\\u0bcd\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\\u0b95\\u0bcd\\u0b95 \\u0ba8\\u0bbe\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bc1\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bb5\\u0bb4\\u0bbf\\u0bae\\u0bc1\\u0bb1\\u0bc8\\u0b95\\u0bb3\\u0bc8 \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0bb5\\u0bcb\\u0bae\\u0bcd.\",\n                    \"resendEmail\": \"\\u0bae\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0b9e\\u0bcd\\u0b9a\\u0bb2\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"continue\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bcd\",\n                    \"goBack\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0bb5\\u0bb0\\u0bb2\\u0bbe\\u0bb1\\u0bcd\\u0bb1\\u0bc8\\u0b95\\u0bcd \\u0b95\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc1\\u0b95\",\n                        \"lastInputs\": \"\\u0b95\\u0b9f\\u0bc8\\u0b9a\\u0bbf \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bc0\\u0b9f\\u0bc1\\u0b95\\u0bb3\\u0bcd\",\n                        \"noInputs\": \"\\u0b85\\u0bb5\\u0bcd\\u0bb5\\u0bb3\\u0bb5\\u0bc1 \\u0bb5\\u0bc6\\u0bb1\\u0bc1\\u0bae\\u0bc8...\",\n                        \"loading\": \"\\u0b8f\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0baf\\u0bc8 \\u0b87\\u0b99\\u0bcd\\u0b95\\u0bc7 \\u0ba4\\u0b9f\\u0bcd\\u0b9f\\u0b9a\\u0bcd\\u0b9a\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0b95...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0ba4\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bc1\",\n                        \"stop\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0bb5\\u0ba4\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf \\u0b85\\u0ba9\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bc1\",\n                        \"stopTask\": \"\\u0baa\\u0ba3\\u0bbf\\u0baf\\u0bc8 \\u0ba8\\u0bbf\\u0bb1\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0b95\\u0bcb\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0b87\\u0ba3\\u0bc8\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0b89\\u0b9f\\u0ba9\\u0bcd \\u0b95\\u0b9f\\u0bcd\\u0b9f\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0b93\\u0b9f\\u0bc1\\u0ba4\\u0bb2\\u0bcd\",\n                        \"executedSuccessfully\": \"\\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b9a\\u0bc6\\u0baf\\u0bb2\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n                        \"failed\": \"\\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\\u0baf\\u0bc1\\u0bb1\\u0bcd\\u0bb1\\u0ba4\\u0bc1\",\n                        \"feedbackUpdated\": \"\\u0b95\\u0bb0\\u0bc1\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0baa\\u0bc1\\u0ba4\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n                        \"updating\": \"\\u0baa\\u0bc1\\u0ba4\\u0bc1\\u0baa\\u0bcd\\u0baa\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bcb\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0b87\\u0b99\\u0bcd\\u0b95\\u0bc7 \\u0bb5\\u0bbf\\u0b9f\\u0bc1\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd:\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bb5\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf\",\n                    \"cancelledUploadOf\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1 \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0baf\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f \\u0baa\\u0ba4\\u0bbf\\u0bb5\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bae\\u0bcd\",\n                    \"couldNotReachServer\": \"\\u0b9a\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bc8 \\u0b85\\u0b9f\\u0bc8\\u0baf \\u0bae\\u0bc1\\u0b9f\\u0bbf\\u0baf\\u0bb5\\u0bbf\\u0bb2\\u0bcd\\u0bb2\\u0bc8\",\n                    \"continuingChat\": \"\\u0ba4\\u0bca\\u0b9f\\u0bb0\\u0bc1\\u0bae\\u0bcd \\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0b85\\u0bae\\u0bc8\\u0baa\\u0bcd\\u0baa\\u0bc1\\u0b95\\u0bb3\\u0bcd \\u0b95\\u0bc1\\u0bb4\\u0bc1\",\n                    \"reset\": \"\\u0bae\\u0bc0\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bc8\",\n                    \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                    \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0b85\\u0ba9\\u0bc8\\u0ba4\\u0bcd\\u0ba4\\u0bc1\\u0bae\\u0bcd\",\n                            \"feedbackPositive\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0ba8\\u0bc7\\u0bb0\\u0bcd\\u0bae\\u0bb1\\u0bc8\",\n                            \"feedbackNegative\": \"\\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0ba9\\u0bc2\\u0b9f\\u0bcd\\u0b9f\\u0bae\\u0bcd: \\u0b8e\\u0ba4\\u0bbf\\u0bb0\\u0bcd\\u0bae\\u0bb1\\u0bc8\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0ba4\\u0bc7\\u0b9f\\u0bc1\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0b87\\u0ba4\\u0bc1 \\u0ba8\\u0bc2\\u0bb2\\u0bcd \\u0bae\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bae\\u0bcd \\u0b85\\u0ba4\\u0ba9\\u0bcd \\u0b9a\\u0bc6\\u0baf\\u0bcd\\u0ba4\\u0bbf\\u0b95\\u0bb3\\u0bcd \\u0bae\\u0bb1\\u0bcd\\u0bb1\\u0bc1\\u0bae\\u0bcd \\u0b95\\u0bc2\\u0bb1\\u0bc1\\u0b95\\u0bb3\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0bae\\u0bcd.\",\n                        \"cancel\": \"\\u0bb0\\u0ba4\\u0bcd\\u0ba4\\u0bc1\",\n                        \"confirm\": \"\\u0b89\\u0bb1\\u0bc1\\u0ba4\\u0bbf\\u0b9a\\u0bc6\\u0baf\\u0bcd\",\n                        \"deletingChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0bc1\\u0b95\\u0bbf\\u0bb1\\u0ba4\\u0bc1\",\n                        \"chatDeleted\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0ba8\\u0bc0\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0b95\\u0b9f\\u0ba8\\u0bcd\\u0ba4 \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0b95\\u0bb3\\u0bcd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0b95\\u0bbe\\u0bb2\\u0bbf\\u0baf\\u0bbe\\u0ba9...\",\n                        \"today\": \"\\u0b87\\u0ba9\\u0bcd\\u0bb1\\u0bc1\",\n                        \"yesterday\": \"\\u0ba8\\u0bc7\\u0bb1\\u0bcd\\u0bb1\\u0bc1\",\n                        \"previous7days\": \"\\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf 7 \\u0ba8\\u0bbe\\u0b9f\\u0bcd\\u0b95\\u0bb3\\u0bcd\",\n                        \"previous30days\": \"\\u0bae\\u0bc1\\u0ba8\\u0bcd\\u0ba4\\u0bc8\\u0baf 30 \\u0ba8\\u0bbe\\u0b9f\\u0bcd\\u0b95\\u0bb3\\u0bcd\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0baa\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bc8 \\u0bae\\u0bc2\\u0b9f\\u0bc1\",\n                        \"openSidebar\": \"\\u0baa\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0bbf\\u0baf\\u0bc8\\u0ba4\\u0bcd \\u0ba4\\u0bbf\\u0bb1\\u0b95\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0b95\\u0bcd\\u0b95\\u0bc1 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0b9a\\u0bc6\\u0bb2\\u0bcd\\u0bb2\\u0bb5\\u0bc1\\u0bae\\u0bcd\",\n                    \"chatCreatedOn\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4 \\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8 \\u0b89\\u0bb0\\u0bc1\\u0bb5\\u0bbe\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f \\u0ba4\\u0bc7\\u0ba4\\u0bbf\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\",\n                \"readme\": \"\\u0bb0\\u0bc0\\u0b9f\\u0bcd\\u0bae\\u0bc0\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0bb5\\u0bb4\\u0b99\\u0bcd\\u0b95\\u0bc1\\u0ba8\\u0bb0\\u0bcd\\u0b95\\u0bb3\\u0bc8\\u0baa\\u0bcd \\u0baa\\u0bc6\\u0bb1\\u0bc1\\u0bb5\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0ba4\\u0bcb\\u0bb2\\u0bcd\\u0bb5\\u0bbf:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0bb5\\u0bc6\\u0bb1\\u0bcd\\u0bb1\\u0bbf\\u0b95\\u0bb0\\u0bae\\u0bbe\\u0b95 \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bc1\",\n            \"requiredApiKeys\": \"\\u0ba4\\u0bc7\\u0bb5\\u0bc8\\u0baf\\u0bbe\\u0ba9 API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd\",\n            \"requiredApiKeysInfo\": \"\\u0b87\\u0ba8\\u0bcd\\u0ba4 \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0bbe\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baa\\u0bcd \\u0baa\\u0baf\\u0ba9\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0ba4\\u0bcd\\u0ba4, \\u0baa\\u0bbf\\u0ba9\\u0bcd\\u0bb5\\u0bb0\\u0bc1\\u0bae\\u0bcd API \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd \\u0ba4\\u0bc7\\u0bb5\\u0bc8. \\u0bb5\\u0bbf\\u0b9a\\u0bc8\\u0b95\\u0bb3\\u0bcd \\u0b89\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b9a\\u0bbe\\u0ba4\\u0ba9\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0ba9\\u0bcd \\u0b89\\u0bb3\\u0bcd\\u0bb3\\u0bc2\\u0bb0\\u0bcd \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0baa\\u0bcd\\u0baa\\u0b95\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0bb2\\u0bcd \\u0b9a\\u0bc7\\u0bae\\u0bbf\\u0b95\\u0bcd\\u0b95\\u0baa\\u0bcd\\u0baa\\u0b9f\\u0bc1\\u0bae\\u0bcd.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0ba8\\u0bc0\\u0b99\\u0bcd\\u0b95\\u0bb3\\u0bcd \\u0b87\\u0ba8\\u0bcd\\u0ba4\\u0ba4\\u0bcd \\u0ba4\\u0bbf\\u0b9f\\u0bcd\\u0b9f\\u0ba4\\u0bcd\\u0ba4\\u0bbf\\u0ba9\\u0bcd \\u0b92\\u0bb0\\u0bc1 \\u0baa\\u0b95\\u0bc1\\u0ba4\\u0bbf\\u0baf\\u0bbe\\u0b95 \\u0b87\\u0bb2\\u0bcd\\u0bb2\\u0bc8.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0b85\\u0bb0\\u0b9f\\u0bcd\\u0b9f\\u0bc8\\u0baf\\u0bc8 \\u0bae\\u0bc0\\u0ba3\\u0bcd\\u0b9f\\u0bc1\\u0bae\\u0bcd \\u0ba4\\u0bca\\u0b9f\\u0b99\\u0bcd\\u0b95\\u0bb5\\u0bc1\\u0bae\\u0bcd\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/te.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c32\\u0c41\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API Keys\",\n                        \"logout\": \"Logout\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u0c1f\\u0c3e\\u0c38\\u0c4d\\u0c15\\u0c4d \\u0c32\\u0c3f\\u0c38\\u0c4d\\u0c1f\\u0c4d\",\n                    \"loading\": \"\\u0c32\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d...\",\n                    \"error\": \"\\u0c12\\u0c15 \\u0c26\\u0c4b\\u0c37\\u0c02 \\u0c38\\u0c02\\u0c2d\\u0c35\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d \\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\",\n                \"removeAttachment\": \"\\u0c05\\u0c1f\\u0c3e\\u0c1a\\u0c4d \\u0c2e\\u0c46\\u0c02\\u0c1f\\u0c4d \\u0c24\\u0c4a\\u0c32\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c41\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c38\\u0c43\\u0c37\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c3e\\u0c32\\u0c3e?\",\n                \"clearChat\": \"\\u0c07\\u0c26\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c24 \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c28\\u0c41 \\u0c15\\u0c4d\\u0c32\\u0c3f\\u0c2f\\u0c30\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d\\u0c28\\u0c41 \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c30\\u0c02\\u0c2d\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f.\",\n                \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c32\\u0c41\",\n                \"expandMessages\": \"\\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c28\\u0c41 \\u0c35\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                \"hideChainOfThought\": \"\\u0c06\\u0c32\\u0c4b\\u0c1a\\u0c28\\u0c3e \\u0c17\\u0c4a\\u0c32\\u0c41\\u0c38\\u0c41\\u0c28\\u0c41 \\u0c26\\u0c3e\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                \"darkMode\": \"\\u0c21\\u0c3e\\u0c30\\u0c4d\\u0c15\\u0c4d \\u0c2e\\u0c4b\\u0c21\\u0c4d\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c02\",\n                \"running\": \"\\u0c30\\u0c28\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c17\\u0c4d\",\n                \"took_one\": \"{{count}} \\u0c05\\u0c21\\u0c41\\u0c17\\u0c41 \\u0c35\\u0c47\\u0c38\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                \"took_other\": \"{{count}} \\u0c05\\u0c21\\u0c41\\u0c17\\u0c41\\u0c32\\u0c41 \\u0c35\\u0c47\\u0c38\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c2f\\u0c3e\\u0c15\\u0c4d\\u0c38\\u0c46\\u0c38\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c41\\u0c15\\u0c4b\\u0c35\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c32\\u0c3e\\u0c17\\u0c3f\\u0c28\\u0c4d \\u0c05\\u0c35\\u0c4d\\u0c35\\u0c02\\u0c21\\u0c3f.\",\n                    \"form\": {\n                        \"email\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\",\n                        \"password\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\",\n                        \"noAccount\": \"\\u0c2e\\u0c40\\u0c15\\u0c41 \\u0c05\\u0c15\\u0c4c\\u0c02\\u0c1f\\u0c4d \\u0c32\\u0c47\\u0c26\\u0c3e?\",\n                        \"alreadyHaveAccount\": \"\\u0c07\\u0c2a\\u0c4d\\u0c2a\\u0c1f\\u0c3f\\u0c15\\u0c47 \\u0c16\\u0c3e\\u0c24\\u0c3e \\u0c09\\u0c02\\u0c26\\u0c3e?\",\n                        \"signup\": \"\\u0c38\\u0c46\\u0c56\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d\",\n                        \"signin\": \"\\u0c38\\u0c46\\u0c56\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d\",\n                        \"or\": \"\\u0c32\\u0c47\\u0c26\\u0c3e\",\n                        \"continue\": \"\\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c41\",\n                        \"forgotPassword\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c2e\\u0c30\\u0c4d\\u0c1a\\u0c3f\\u0c2a\\u0c4b\\u0c2f\\u0c3e\\u0c30\\u0c3e?\",\n                        \"passwordMustContain\": \"\\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c32\\u0c4b \\u0c07\\u0c35\\u0c3f \\u0c09\\u0c02\\u0c21\\u0c3e\\u0c32\\u0c3f:\",\n                        \"emailRequired\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                        \"passwordRequired\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\",\n                        \"signin\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthsignin\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"redirect_uri_mismatch\": \"\\u0c30\\u0c40\\u0c21\\u0c48\\u0c30\\u0c46\\u0c15\\u0c4d\\u0c1f\\u0c4d URI \\u0c13\\u0c2f\\u0c42\\u0c24\\u0c4d \\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c15\\u0c3e\\u0c28\\u0c4d\\u0c2b\\u0c3f\\u0c17\\u0c30\\u0c47\\u0c37\\u0c28\\u0c4d \\u0c15\\u0c41 \\u0c38\\u0c30\\u0c3f\\u0c2a\\u0c4b\\u0c32\\u0c21\\u0c02 \\u0c32\\u0c47\\u0c26\\u0c41.\",\n                        \"oauthcallbackerror\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthcreateaccount\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"emailcreateaccount\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"callback\": \"\\u0c35\\u0c47\\u0c30\\u0c4a\\u0c15 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2a\\u0c4d\\u0c30\\u0c2f\\u0c24\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f.\",\n                        \"oauthaccountnotlinked\": \"\\u0c2e\\u0c40 \\u0c17\\u0c41\\u0c30\\u0c4d\\u0c24\\u0c3f\\u0c02\\u0c2a\\u0c41\\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f, \\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c2e\\u0c4a\\u0c26\\u0c1f \\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c28 \\u0c05\\u0c26\\u0c47 \\u0c16\\u0c3e\\u0c24\\u0c3e\\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                        \"emailsignin\": \"\\u0c07-\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\",\n                        \"emailverify\": \"\\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f, \\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f.\",\n                        \"credentialssignin\": \"\\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f. \\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c05\\u0c02\\u0c26\\u0c3f\\u0c02\\u0c1a\\u0c3f\\u0c28 \\u0c35\\u0c3f\\u0c35\\u0c30\\u0c3e\\u0c32\\u0c41 \\u0c38\\u0c30\\u0c3f\\u0c17\\u0c4d\\u0c17\\u0c3e \\u0c09\\u0c28\\u0c4d\\u0c28\\u0c3e\\u0c2f\\u0c4b \\u0c32\\u0c47\\u0c26\\u0c4b \\u0c1a\\u0c46\\u0c15\\u0c4d \\u0c1a\\u0c47\\u0c38\\u0c41\\u0c15\\u0c4b\\u0c02\\u0c21\\u0c3f.\",\n                        \"sessionrequired\": \"\\u0c08 \\u0c2a\\u0c47\\u0c1c\\u0c40\\u0c28\\u0c3f \\u0c2f\\u0c3e\\u0c15\\u0c4d\\u0c38\\u0c46\\u0c38\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c15\\u0c4a\\u0c30\\u0c15\\u0c41 \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c07\\u0c28\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c26\\u0c3e\\u0c26\\u0c3e\\u0c2a\\u0c41 \\u0c05\\u0c15\\u0c4d\\u0c15\\u0c21\\u0c47 \\u0c09\\u0c28\\u0c4d\\u0c28\\u0c3e\\u0c30\\u0c41! \\u0c2e\\u0c47\\u0c2e\\u0c41 \\u0c26\\u0c40\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c12\\u0c15 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c2a\\u0c02\\u0c2a\\u0c3e\\u0c2e\\u0c41 \",\n                    \"verifyEmailLink\": \"\\u0c2e\\u0c40 \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c2a\\u0c42\\u0c30\\u0c4d\\u0c24\\u0c3f \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f \\u0c06 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c32\\u0c4b\\u0c28\\u0c3f \\u0c32\\u0c3f\\u0c02\\u0c15\\u0c4d \\u0c2a\\u0c48 \\u0c15\\u0c4d\\u0c32\\u0c3f\\u0c15\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                    \"didNotReceive\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c15\\u0c28\\u0c41\\u0c17\\u0c4a\\u0c28\\u0c32\\u0c47\\u0c15\\u0c2a\\u0c4b\\u0c2f\\u0c3e\\u0c30\\u0c3e?\",\n                    \"resendEmail\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c2a\\u0c02\\u0c2a\\u0c02\\u0c21\\u0c3f\",\n                    \"goBack\": \"\\u0c35\\u0c46\\u0c28\\u0c15\\u0c4d\\u0c15\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c33\\u0c41\",\n                    \"emailSent\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c2a\\u0c02\\u0c2a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f.\",\n                    \"verifyEmail\": \"\\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"{{provider}} \\u0c24\\u0c4b \\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"signup\": \"{{provider}} \\u0c24\\u0c4b \\u0c38\\u0c48\\u0c28\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                    \"passwordsMustMatch\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c32\\u0c41 \\u0c24\\u0c2a\\u0c4d\\u0c2a\\u0c28\\u0c3f\\u0c38\\u0c30\\u0c3f\\u0c17\\u0c3e \\u0c38\\u0c30\\u0c3f\\u0c2a\\u0c4b\\u0c32\\u0c3e\\u0c32\\u0c3f\",\n                    \"confirmPasswordRequired\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d \\u0c05\\u0c28\\u0c3f \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"newPassword\": \"\\u0c15\\u0c4a\\u0c24\\u0c4d\\u0c24 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\",\n                    \"confirmPassword\": \"\\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c28\\u0c41 \\u0c27\\u0c43\\u0c35\\u0c40\\u0c15\\u0c30\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                    \"resetPassword\": \"\\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\",\n                    \"emailRequired\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c05\\u0c28\\u0c47\\u0c26\\u0c3f \\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 \\u0c2b\\u0c40\\u0c32\\u0c4d\\u0c21\\u0c4d\",\n                    \"emailSent\": \"\\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c38\\u0c42\\u0c1a\\u0c28\\u0c32 \\u0c15\\u0c4a\\u0c30\\u0c15\\u0c41 \\u0c26\\u0c2f\\u0c1a\\u0c47\\u0c38\\u0c3f {{email}} \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c24\\u0c28\\u0c3f\\u0c16\\u0c40 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f.\",\n                    \"enterEmail\": \"\\u0c2e\\u0c40 \\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c1a\\u0c3f\\u0c30\\u0c41\\u0c28\\u0c3e\\u0c2e\\u0c3e\\u0c28\\u0c41 \\u0c28\\u0c2e\\u0c4b\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c2e\\u0c40 \\u0c2a\\u0c3e\\u0c38\\u0c4d \\u0c35\\u0c30\\u0c4d\\u0c21\\u0c4d \\u0c28\\u0c41 \\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c2e\\u0c47\\u0c2e\\u0c41 \\u0c2e\\u0c40\\u0c15\\u0c41 \\u0c38\\u0c42\\u0c1a\\u0c28\\u0c32\\u0c41 \\u0c2a\\u0c02\\u0c2a\\u0c41\\u0c24\\u0c3e\\u0c2e\\u0c41.\",\n                    \"resendEmail\": \"\\u0c07\\u0c2e\\u0c46\\u0c2f\\u0c3f\\u0c32\\u0c4d \\u0c28\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c2a\\u0c02\\u0c2a\\u0c02\\u0c21\\u0c3f\",\n                    \"continue\": \"\\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c41\",\n                    \"goBack\": \"\\u0c35\\u0c46\\u0c28\\u0c15\\u0c4d\\u0c15\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c33\\u0c41\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u0c1a\\u0c30\\u0c3f\\u0c24\\u0c4d\\u0c30\\u0c28\\u0c41 \\u0c1a\\u0c42\\u0c2a\\u0c3f\\u0c02\\u0c1a\\u0c41\",\n                        \"lastInputs\": \"\\u0c1a\\u0c3f\\u0c35\\u0c30\\u0c3f \\u0c07\\u0c28\\u0c4d \\u0c2a\\u0c41\\u0c1f\\u0c4d \\u0c32\\u0c41\",\n                        \"noInputs\": \"\\u0c05\\u0c02\\u0c24 \\u0c16\\u0c3e\\u0c33\\u0c40\\u0c17\\u0c3e...\",\n                        \"loading\": \"\\u0c32\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u0c2e\\u0c40 \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c28\\u0c4d\\u0c28\\u0c3f \\u0c07\\u0c15\\u0c4d\\u0c15\\u0c21 \\u0c1f\\u0c48\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u0c30\\u0c3f\\u0c15\\u0c3e\\u0c30\\u0c4d\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c30\\u0c02\\u0c2d\\u0c3f\\u0c02\\u0c1a\\u0c02\\u0c21\\u0c3f\",\n                        \"stop\": \"\\u0c30\\u0c3f\\u0c15\\u0c3e\\u0c30\\u0c4d\\u0c21\\u0c3f\\u0c02\\u0c17\\u0c4d \\u0c06\\u0c2a\\u0c02\\u0c21\\u0c3f\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c02 \\u0c2a\\u0c02\\u0c2a\\u0c41\",\n                        \"stopTask\": \"\\u0c38\\u0c4d\\u0c1f\\u0c3e\\u0c2a\\u0c4d \\u0c1f\\u0c3e\\u0c38\\u0c4d\\u0c15\\u0c4d\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u0c2b\\u0c48\\u0c33\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c1c\\u0c4b\\u0c21\\u0c3f\\u0c02\\u0c1a\\u0c41\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u0c26\\u0c40\\u0c28\\u0c3f\\u0c24\\u0c4b \\u0c28\\u0c3f\\u0c30\\u0c4d\\u0c2e\\u0c3f\\u0c02\\u0c1a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u0c30\\u0c28\\u0c4d\\u0c28\\u0c3f\\u0c02\\u0c17\\u0c4d\",\n                        \"executedSuccessfully\": \"\\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c05\\u0c2e\\u0c32\\u0c41 \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                        \"failed\": \"\\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f\",\n                        \"feedbackUpdated\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d \\u0c05\\u0c2a\\u0c4d \\u0c21\\u0c47\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n                        \"updating\": \"\\u0c05\\u0c2a\\u0c4d \\u0c21\\u0c47\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u0c2e\\u0c40 \\u0c2b\\u0c48\\u0c33\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c07\\u0c15\\u0c4d\\u0c15\\u0c21 \\u0c21\\u0c4d\\u0c30\\u0c3e\\u0c2a\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c02\\u0c21\\u0c3f\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02 \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f\",\n                    \"cancelledUploadOf\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41 \\u0c1a\\u0c47\\u0c38\\u0c3f\\u0c28 \\u0c05\\u0c2a\\u0c4d \\u0c32\\u0c4b\\u0c21\\u0c4d\",\n                    \"couldNotReachServer\": \"\\u0c38\\u0c30\\u0c4d\\u0c35\\u0c30\\u0c4d \\u0c15\\u0c41 \\u0c1a\\u0c47\\u0c30\\u0c41\\u0c15\\u0c4b\\u0c35\\u0c21\\u0c02 \\u0c38\\u0c3e\\u0c27\\u0c4d\\u0c2f\\u0c02 \\u0c15\\u0c3e\\u0c32\\u0c47\\u0c26\\u0c41\",\n                    \"continuingChat\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c28\\u0c41 \\u0c15\\u0c4a\\u0c28\\u0c38\\u0c3e\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c02\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u0c38\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c17\\u0c4d\\u0c38\\u0c4d \\u0c2a\\u0c4d\\u0c2f\\u0c3e\\u0c28\\u0c46\\u0c32\\u0c4d\",\n                    \"reset\": \"\\u0c30\\u0c40\\u0c38\\u0c46\\u0c1f\\u0c4d\",\n                    \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                    \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c05\\u0c28\\u0c4d\\u0c28\\u0c40\",\n                            \"feedbackPositive\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c2a\\u0c3e\\u0c1c\\u0c3f\\u0c1f\\u0c3f\\u0c35\\u0c4d\",\n                            \"feedbackNegative\": \"\\u0c2b\\u0c40\\u0c21\\u0c4d \\u0c2c\\u0c4d\\u0c2f\\u0c3e\\u0c15\\u0c4d: \\u0c28\\u0c46\\u0c17\\u0c46\\u0c1f\\u0c3f\\u0c35\\u0c4d\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u0c35\\u0c46\\u0c24\\u0c41\\u0c15\\u0c41\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u0c07\\u0c26\\u0c3f \\u0c25\\u0c4d\\u0c30\\u0c46\\u0c21\\u0c4d\\u0c24\\u0c4b \\u0c2a\\u0c3e\\u0c1f\\u0c41 \\u0c26\\u0c3e\\u0c28\\u0c3f \\u0c38\\u0c02\\u0c26\\u0c47\\u0c36\\u0c3e\\u0c32\\u0c41 \\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 \\u0c0e\\u0c32\\u0c3f\\u0c2e\\u0c46\\u0c02\\u0c1f\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c24\\u0c4a\\u0c32\\u0c17\\u0c3f\\u0c38\\u0c4d\\u0c24\\u0c41\\u0c02\\u0c26\\u0c3f.\",\n                        \"cancel\": \"\\u0c30\\u0c26\\u0c4d\\u0c26\\u0c41\",\n                        \"confirm\": \"\\u0c27\\u0c4d\\u0c30\\u0c41\\u0c35\\u0c2a\\u0c30\\u0c1a\\u0c41\",\n                        \"deletingChat\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c28\\u0c41 \\u0c21\\u0c3f\\u0c32\\u0c40\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c02\",\n                        \"chatDeleted\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c21\\u0c3f\\u0c32\\u0c40\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u0c17\\u0c24 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c32\\u0c41\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u0c16\\u0c3e\\u0c33\\u0c40...\",\n                        \"today\": \"\\u0c08 \\u0c30\\u0c4b\\u0c1c\\u0c41\",\n                        \"yesterday\": \"\\u0c28\\u0c3f\\u0c28\\u0c4d\\u0c28\",\n                        \"previous7days\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f 7 \\u0c30\\u0c4b\\u0c1c\\u0c41\\u0c32\\u0c41\",\n                        \"previous30days\": \"\\u0c2e\\u0c41\\u0c28\\u0c41\\u0c2a\\u0c1f\\u0c3f 30 \\u0c30\\u0c4b\\u0c1c\\u0c41\\u0c32\\u0c41\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u0c15\\u0c4d\\u0c32\\u0c4b\\u0c1c\\u0c4d \\u0c38\\u0c48\\u0c21\\u0c4d \\u0c2c\\u0c3e\\u0c30\\u0c4d\",\n                        \"openSidebar\": \"\\u0c13\\u0c2a\\u0c46\\u0c28\\u0c4d \\u0c38\\u0c48\\u0c21\\u0c4d \\u0c2c\\u0c3e\\u0c30\\u0c4d\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f \\u0c24\\u0c3f\\u0c30\\u0c3f\\u0c17\\u0c3f \\u0c35\\u0c46\\u0c33\\u0c4d\\u0c32\\u0c02\\u0c21\\u0c3f\",\n                    \"chatCreatedOn\": \"\\u0c08 \\u0c1a\\u0c3e\\u0c1f\\u0c4d \\u0c26\\u0c40\\u0c28\\u0c3f\\u0c32\\u0c4b \\u0c38\\u0c43\\u0c37\\u0c4d\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u0c2e\\u0c41\\u0c1a\\u0c4d\\u0c1a\\u0c1f\\u0c3f\\u0c02\\u0c1a\\u0c41\",\n                \"readme\": \"Readme\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u0c2a\\u0c4d\\u0c30\\u0c4a\\u0c35\\u0c48\\u0c21\\u0c30\\u0c4d\\u0c32\\u0c28\\u0c41 \\u0c2a\\u0c4a\\u0c02\\u0c26\\u0c21\\u0c02\\u0c32\\u0c4b \\u0c35\\u0c3f\\u0c2b\\u0c32\\u0c2e\\u0c48\\u0c02\\u0c26\\u0c3f:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u0c35\\u0c3f\\u0c1c\\u0c2f\\u0c35\\u0c02\\u0c24\\u0c02\\u0c17\\u0c3e \\u0c38\\u0c47\\u0c35\\u0c4d \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c3f\\u0c02\\u0c26\\u0c3f\",\n            \"requiredApiKeys\": \"\\u0c05\\u0c35\\u0c38\\u0c30\\u0c2e\\u0c48\\u0c28 API \\u0c15\\u0c40\\u0c32\\u0c41\",\n            \"requiredApiKeysInfo\": \"\\u0c08 \\u0c2f\\u0c3e\\u0c2a\\u0c4d \\u0c09\\u0c2a\\u0c2f\\u0c4b\\u0c17\\u0c3f\\u0c02\\u0c1a\\u0c21\\u0c3e\\u0c28\\u0c3f\\u0c15\\u0c3f, \\u0c08 \\u0c15\\u0c4d\\u0c30\\u0c3f\\u0c02\\u0c26\\u0c3f API \\u0c15\\u0c40\\u0c32\\u0c41 \\u0c05\\u0c35\\u0c38\\u0c30\\u0c02 \\u0c05\\u0c35\\u0c41\\u0c24\\u0c3e\\u0c2f\\u0c3f. \\u0c15\\u0c40\\u0c32\\u0c41 \\u0c2e\\u0c40 \\u0c2a\\u0c30\\u0c3f\\u0c15\\u0c30\\u0c02 \\u0c2f\\u0c4a\\u0c15\\u0c4d\\u0c15 \\u0c38\\u0c4d\\u0c25\\u0c3e\\u0c28\\u0c3f\\u0c15 \\u0c38\\u0c4d\\u0c1f\\u0c4b\\u0c30\\u0c47\\u0c1c\\u0c40\\u0c32\\u0c4b \\u0c28\\u0c3f\\u0c32\\u0c4d\\u0c35 \\u0c1a\\u0c47\\u0c2f\\u0c2c\\u0c21\\u0c24\\u0c3e\\u0c2f\\u0c3f.\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u0c2e\\u0c40\\u0c30\\u0c41 \\u0c08 \\u0c2a\\u0c4d\\u0c30\\u0c3e\\u0c1c\\u0c46\\u0c15\\u0c4d\\u0c1f\\u0c41\\u0c32\\u0c4b \\u0c2d\\u0c3e\\u0c17\\u0c02 \\u0c15\\u0c3e\\u0c26\\u0c41.\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u0c30\\u0c46\\u0c1c\\u0c4d\\u0c2f\\u0c42\\u0c2e\\u0c4d \\u0c1a\\u0c3e\\u0c1f\\u0c4d\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.chainlit/translations/zh-CN.json",
    "content": "{\n    \"components\": {\n        \"atoms\": {\n            \"buttons\": {\n                \"userButton\": {\n                    \"menu\": {\n                        \"settings\": \"\\u8bbe\\u7f6e\",\n                        \"settingsKey\": \"S\",\n                        \"APIKeys\": \"API \\u5bc6\\u94a5\",\n                        \"logout\": \"\\u767b\\u51fa\"\n                    }\n                }\n            }\n        },\n        \"molecules\": {\n            \"newChatButton\": {\n                \"newChat\": \"\\u65b0\\u5efa\\u5bf9\\u8bdd\"\n            },\n            \"tasklist\": {\n                \"TaskList\": {\n                    \"title\": \"\\ud83d\\uddd2\\ufe0f \\u4efb\\u52a1\\u5217\\u8868\",\n                    \"loading\": \"\\u52a0\\u8f7d\\u4e2d...\",\n                    \"error\": \"\\u53d1\\u751f\\u9519\\u8bef\"\n                }\n            },\n            \"attachments\": {\n                \"cancelUpload\": \"\\u53d6\\u6d88\\u4e0a\\u4f20\",\n                \"removeAttachment\": \"\\u79fb\\u9664\\u9644\\u4ef6\"\n            },\n            \"newChatDialog\": {\n                \"createNewChat\": \"\\u521b\\u5efa\\u65b0\\u5bf9\\u8bdd\\uff1f\",\n                \"clearChat\": \"\\u8fd9\\u5c06\\u6e05\\u9664\\u5f53\\u524d\\u6d88\\u606f\\u5e76\\u5f00\\u59cb\\u65b0\\u7684\\u5bf9\\u8bdd\\u3002\",\n                \"cancel\": \"\\u53d6\\u6d88\",\n                \"confirm\": \"\\u786e\\u8ba4\"\n            },\n            \"settingsModal\": {\n                \"settings\": \"\\u8bbe\\u7f6e\",\n                \"expandMessages\": \"\\u5c55\\u5f00\\u6d88\\u606f\",\n                \"hideChainOfThought\": \"\\u9690\\u85cf\\u601d\\u8003\\u94fe\",\n                \"darkMode\": \"\\u6697\\u8272\\u6a21\\u5f0f\"\n            },\n            \"detailsButton\": {\n                \"using\": \"\\u4f7f\\u7528\",\n                \"used\": \"\\u5df2\\u7528\"\n            },\n            \"auth\": {\n                \"authLogin\": {\n                    \"title\": \"\\u767b\\u5f55\\u4ee5\\u8bbf\\u95ee\\u5e94\\u7528\\u3002\",\n                    \"form\": {\n                        \"email\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\",\n                        \"password\": \"\\u5bc6\\u7801\",\n                        \"noAccount\": \"\\u6ca1\\u6709\\u8d26\\u6237\\uff1f\",\n                        \"alreadyHaveAccount\": \"\\u5df2\\u6709\\u8d26\\u6237\\uff1f\",\n                        \"signup\": \"\\u6ce8\\u518c\",\n                        \"signin\": \"\\u767b\\u5f55\",\n                        \"or\": \"\\u6216\\u8005\",\n                        \"continue\": \"\\u7ee7\\u7eed\",\n                        \"forgotPassword\": \"\\u5fd8\\u8bb0\\u5bc6\\u7801\\uff1f\",\n                        \"passwordMustContain\": \"\\u60a8\\u7684\\u5bc6\\u7801\\u5fc5\\u987b\\u5305\\u542b\\uff1a\",\n                        \"emailRequired\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u662f\\u5fc5\\u586b\\u9879\",\n                        \"passwordRequired\": \"\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\"\n                    },\n                    \"error\": {\n                        \"default\": \"\\u65e0\\u6cd5\\u767b\\u5f55\\u3002\",\n                        \"signin\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthsignin\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"redirect_uri_mismatch\": \"\\u91cd\\u5b9a\\u5411URI\\u4e0eOAuth\\u5e94\\u7528\\u914d\\u7f6e\\u4e0d\\u5339\\u914d\\u3002\",\n                        \"oauthcallbackerror\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthcreateaccount\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"emailcreateaccount\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"callback\": \"\\u5c1d\\u8bd5\\u4f7f\\u7528\\u4e0d\\u540c\\u7684\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"oauthaccountnotlinked\": \"\\u4e3a\\u4e86\\u9a8c\\u8bc1\\u60a8\\u7684\\u8eab\\u4efd\\uff0c\\u8bf7\\u4f7f\\u7528\\u6700\\u521d\\u4f7f\\u7528\\u7684\\u540c\\u4e00\\u8d26\\u6237\\u767b\\u5f55\\u3002\",\n                        \"emailsignin\": \"\\u65e0\\u6cd5\\u53d1\\u9001\\u90ae\\u4ef6\\u3002\",\n                        \"emailverify\": \"\\u8bf7\\u9a8c\\u8bc1\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u4ef6\\uff0c\\u5df2\\u53d1\\u9001\\u4e00\\u5c01\\u65b0\\u90ae\\u4ef6\\u3002\",\n                        \"credentialssignin\": \"\\u767b\\u5f55\\u5931\\u8d25\\u3002\\u8bf7\\u68c0\\u67e5\\u60a8\\u63d0\\u4f9b\\u7684\\u8be6\\u7ec6\\u4fe1\\u606f\\u662f\\u5426\\u6b63\\u786e\\u3002\",\n                        \"sessionrequired\": \"\\u8bf7\\u767b\\u5f55\\u4ee5\\u8bbf\\u95ee\\u6b64\\u9875\\u9762\\u3002\"\n                    }\n                },\n                \"authVerifyEmail\": {\n                    \"almostThere\": \"\\u60a8\\u5feb\\u6210\\u529f\\u4e86\\uff01\\u6211\\u4eec\\u5df2\\u5411 \",\n                    \"verifyEmailLink\": \"\\u8bf7\\u5355\\u51fb\\u8be5\\u90ae\\u4ef6\\u4e2d\\u7684\\u94fe\\u63a5\\u4ee5\\u5b8c\\u6210\\u6ce8\\u518c\\u3002\",\n                    \"didNotReceive\": \"\\u6ca1\\u627e\\u5230\\u90ae\\u4ef6\\uff1f\",\n                    \"resendEmail\": \"\\u91cd\\u65b0\\u53d1\\u9001\\u90ae\\u4ef6\",\n                    \"goBack\": \"\\u8fd4\\u56de\",\n                    \"emailSent\": \"\\u90ae\\u4ef6\\u5df2\\u6210\\u529f\\u53d1\\u9001\\u3002\",\n                    \"verifyEmail\": \"\\u9a8c\\u8bc1\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u4ef6\\u5730\\u5740\"\n                },\n                \"providerButton\": {\n                    \"continue\": \"\\u4f7f\\u7528{{provider}}\\u7ee7\\u7eed\",\n                    \"signup\": \"\\u4f7f\\u7528{{provider}}\\u6ce8\\u518c\"\n                },\n                \"authResetPassword\": {\n                    \"newPasswordRequired\": \"\\u65b0\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"passwordsMustMatch\": \"\\u5bc6\\u7801\\u5fc5\\u987b\\u4e00\\u81f4\",\n                    \"confirmPasswordRequired\": \"\\u786e\\u8ba4\\u5bc6\\u7801\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"newPassword\": \"\\u65b0\\u5bc6\\u7801\",\n                    \"confirmPassword\": \"\\u786e\\u8ba4\\u5bc6\\u7801\",\n                    \"resetPassword\": \"\\u91cd\\u7f6e\\u5bc6\\u7801\"\n                },\n                \"authForgotPassword\": {\n                    \"email\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\",\n                    \"emailRequired\": \"\\u7535\\u5b50\\u90ae\\u7bb1\\u662f\\u5fc5\\u586b\\u9879\",\n                    \"emailSent\": \"\\u8bf7\\u68c0\\u67e5\\u7535\\u5b50\\u90ae\\u7bb1{{email}}\\u4ee5\\u83b7\\u53d6\\u91cd\\u7f6e\\u5bc6\\u7801\\u7684\\u6307\\u793a\\u3002\",\n                    \"enterEmail\": \"\\u8bf7\\u8f93\\u5165\\u60a8\\u7684\\u7535\\u5b50\\u90ae\\u7bb1\\u5730\\u5740\\uff0c\\u6211\\u4eec\\u5c06\\u53d1\\u9001\\u91cd\\u7f6e\\u5bc6\\u7801\\u7684\\u6307\\u793a\\u3002\",\n                    \"resendEmail\": \"\\u91cd\\u65b0\\u53d1\\u9001\\u90ae\\u4ef6\",\n                    \"continue\": \"\\u7ee7\\u7eed\",\n                    \"goBack\": \"\\u8fd4\\u56de\"\n                }\n            }\n        },\n        \"organisms\": {\n            \"chat\": {\n                \"history\": {\n                    \"index\": {\n                        \"showHistory\": \"\\u663e\\u793a\\u5386\\u53f2\",\n                        \"lastInputs\": \"\\u6700\\u540e\\u8f93\\u5165\",\n                        \"noInputs\": \"\\u5982\\u6b64\\u7a7a\\u65f7...\",\n                        \"loading\": \"\\u52a0\\u8f7d\\u4e2d...\"\n                    }\n                },\n                \"inputBox\": {\n                    \"input\": {\n                        \"placeholder\": \"\\u5728\\u8fd9\\u91cc\\u8f93\\u5165\\u60a8\\u7684\\u6d88\\u606f...\"\n                    },\n                    \"speechButton\": {\n                        \"start\": \"\\u5f00\\u59cb\\u5f55\\u97f3\",\n                        \"stop\": \"\\u505c\\u6b62\\u5f55\\u97f3\"\n                    },\n                    \"SubmitButton\": {\n                        \"sendMessage\": \"\\u53d1\\u9001\\u6d88\\u606f\",\n                        \"stopTask\": \"\\u505c\\u6b62\\u4efb\\u52a1\"\n                    },\n                    \"UploadButton\": {\n                        \"attachFiles\": \"\\u9644\\u52a0\\u6587\\u4ef6\"\n                    },\n                    \"waterMark\": {\n                        \"text\": \"\\u4f7f\\u7528\"\n                    }\n                },\n                \"Messages\": {\n                    \"index\": {\n                        \"running\": \"\\u8fd0\\u884c\\u4e2d\",\n                        \"executedSuccessfully\": \"\\u6267\\u884c\\u6210\\u529f\",\n                        \"failed\": \"\\u5931\\u8d25\",\n                        \"feedbackUpdated\": \"\\u53cd\\u9988\\u66f4\\u65b0\",\n                        \"updating\": \"\\u6b63\\u5728\\u66f4\\u65b0\"\n                    }\n                },\n                \"dropScreen\": {\n                    \"dropYourFilesHere\": \"\\u5728\\u8fd9\\u91cc\\u62d6\\u653e\\u60a8\\u7684\\u6587\\u4ef6\"\n                },\n                \"index\": {\n                    \"failedToUpload\": \"\\u4e0a\\u4f20\\u5931\\u8d25\",\n                    \"cancelledUploadOf\": \"\\u53d6\\u6d88\\u4e0a\\u4f20\",\n                    \"couldNotReachServer\": \"\\u65e0\\u6cd5\\u8fde\\u63a5\\u5230\\u670d\\u52a1\\u5668\",\n                    \"continuingChat\": \"\\u7ee7\\u7eed\\u4e4b\\u524d\\u7684\\u5bf9\\u8bdd\"\n                },\n                \"settings\": {\n                    \"settingsPanel\": \"\\u8bbe\\u7f6e\\u9762\\u677f\",\n                    \"reset\": \"\\u91cd\\u7f6e\",\n                    \"cancel\": \"\\u53d6\\u6d88\",\n                    \"confirm\": \"\\u786e\\u8ba4\"\n                }\n            },\n            \"threadHistory\": {\n                \"sidebar\": {\n                    \"filters\": {\n                        \"FeedbackSelect\": {\n                            \"feedbackAll\": \"\\u53cd\\u9988\\uff1a\\u5168\\u90e8\",\n                            \"feedbackPositive\": \"\\u53cd\\u9988\\uff1a\\u6b63\\u9762\",\n                            \"feedbackNegative\": \"\\u53cd\\u9988\\uff1a\\u8d1f\\u9762\"\n                        },\n                        \"SearchBar\": {\n                            \"search\": \"\\u641c\\u7d22\"\n                        }\n                    },\n                    \"DeleteThreadButton\": {\n                        \"confirmMessage\": \"\\u8fd9\\u5c06\\u5220\\u9664\\u7ebf\\u7a0b\\u53ca\\u5176\\u6d88\\u606f\\u548c\\u5143\\u7d20\\u3002\",\n                        \"cancel\": \"\\u53d6\\u6d88\",\n                        \"confirm\": \"\\u786e\\u8ba4\",\n                        \"deletingChat\": \"\\u5220\\u9664\\u5bf9\\u8bdd\",\n                        \"chatDeleted\": \"\\u5bf9\\u8bdd\\u5df2\\u5220\\u9664\"\n                    },\n                    \"index\": {\n                        \"pastChats\": \"\\u8fc7\\u5f80\\u5bf9\\u8bdd\"\n                    },\n                    \"ThreadList\": {\n                        \"empty\": \"\\u7a7a\\u7684...\",\n                        \"today\": \"\\u4eca\\u5929\",\n                        \"yesterday\": \"\\u6628\\u5929\",\n                        \"previous7days\": \"\\u524d7\\u5929\",\n                        \"previous30days\": \"\\u524d30\\u5929\"\n                    },\n                    \"TriggerButton\": {\n                        \"closeSidebar\": \"\\u5173\\u95ed\\u4fa7\\u8fb9\\u680f\",\n                        \"openSidebar\": \"\\u6253\\u5f00\\u4fa7\\u8fb9\\u680f\"\n                    }\n                },\n                \"Thread\": {\n                    \"backToChat\": \"\\u8fd4\\u56de\\u5bf9\\u8bdd\",\n                    \"chatCreatedOn\": \"\\u6b64\\u5bf9\\u8bdd\\u521b\\u5efa\\u4e8e\"\n                }\n            },\n            \"header\": {\n                \"chat\": \"\\u5bf9\\u8bdd\",\n                \"readme\": \"\\u8bf4\\u660e\"\n            }\n        }\n    },\n    \"hooks\": {\n        \"useLLMProviders\": {\n            \"failedToFetchProviders\": \"\\u83b7\\u53d6\\u63d0\\u4f9b\\u8005\\u5931\\u8d25:\"\n        }\n    },\n    \"pages\": {\n        \"Design\": {},\n        \"Env\": {\n            \"savedSuccessfully\": \"\\u4fdd\\u5b58\\u6210\\u529f\",\n            \"requiredApiKeys\": \"\\u5fc5\\u9700\\u7684API\\u5bc6\\u94a5\",\n            \"requiredApiKeysInfo\": \"\\u8981\\u4f7f\\u7528\\u6b64\\u5e94\\u7528\\uff0c\\u9700\\u8981\\u4ee5\\u4e0bAPI\\u5bc6\\u94a5\\u3002\\u8fd9\\u4e9b\\u5bc6\\u94a5\\u5b58\\u50a8\\u5728\\u60a8\\u7684\\u8bbe\\u5907\\u672c\\u5730\\u5b58\\u50a8\\u4e2d\\u3002\"\n        },\n        \"Page\": {\n            \"notPartOfProject\": \"\\u60a8\\u4e0d\\u662f\\u6b64\\u9879\\u76ee\\u7684\\u4e00\\u90e8\\u5206\\u3002\"\n        },\n        \"ResumeButton\": {\n            \"resumeChat\": \"\\u6062\\u590d\\u5bf9\\u8bdd\"\n        }\n    }\n}"
  },
  {
    "path": "examples/chatbot_voice/.gitignore",
    "content": "# python generated files\n__pycache__/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# venv\n.venv\n.files"
  },
  {
    "path": "examples/chatbot_voice/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "examples/chatbot_voice/README.md",
    "content": "# Quivr Chatbot Example\n\nThis example demonstrates how to create a simple chatbot using Quivr and Chainlit. The chatbot allows users to upload a text file and then ask questions about its content.\n\n## Prerequisites\n\n- Python 3.8 or higher\n\n## Installation\n\n1. Clone the repository or navigate to the `core/examples/chatbot` directory.\n\n2. Install the required dependencies:\n\n   ```\n   pip install -r requirements.lock\n   ```\n\n## Running the Chatbot\n\n1. Start the Chainlit server:\n\n   ```\n   chainlit run main.py\n   ```\n\n2. Open your web browser and go to the URL displayed in the terminal (usually `http://localhost:8000`).\n\n## Using the Chatbot\n\n1. When the chatbot interface loads, you will be prompted to upload a text file.\n\n2. Click on the upload area and select a `.txt` file from your computer. The file size should not exceed 20MB.\n\n3. After uploading, the chatbot will process the file and inform you when it's ready.\n\n4. You can now start asking questions about the content of the uploaded file.\n\n5. Type your questions in the chat input and press Enter. The chatbot will respond based on the information in the uploaded file.\n\n## How It Works\n\nThe chatbot uses the Quivr library to create a \"brain\" from the uploaded text file. This brain is then used to answer questions about the file's content. The Chainlit library provides the user interface and handles the chat interactions.\n\nEnjoy chatting with your documents!\n"
  },
  {
    "path": "examples/chatbot_voice/basic_rag_workflow.yaml",
    "content": "workflow_config:\n  name: \"standard RAG\"\n  nodes:\n    - name: \"START\"\n      edges: [\"filter_history\"]\n\n    - name: \"filter_history\"\n      edges: [\"rewrite\"]\n\n    - name: \"rewrite\"\n      edges: [\"retrieve\"]\n\n    - name: \"retrieve\"\n      edges: [\"generate_rag\"]\n\n    - name: \"generate_rag\" # the name of the last node, from which we want to stream the answer to the user\n      edges: [\"END\"]\n\n# Maximum number of previous conversation iterations\n# to include in the context of the answer\nmax_history: 10\n\n# Reranker configuration\n# reranker_config:\n#   # The reranker supplier to use\n#   supplier: \"cohere\"\n\n#   # The model to use for the reranker for the given supplier\n#   model: \"rerank-multilingual-v3.0\"\n\n#   # Number of chunks returned by the reranker\n#   top_n: 5\n\n# Configuration for the LLM\nllm_config:\n\n  # maximum number of tokens passed to the LLM to generate the answer\n  max_output_tokens: 4000\n\n  # temperature for the LLM\n  temperature: 0.7\n"
  },
  {
    "path": "examples/chatbot_voice/chainlit.md",
    "content": "# Quivr Chatbot Example\n\nThis example demonstrates how to create a simple chatbot using Quivr and Chainlit. The chatbot allows users to upload a text file and then ask questions about its content.\n\n## Prerequisites\n\n- Python 3.8 or higher\n\n## Installation\n\n1. Clone the repository or navigate to the `backend/core/examples/chatbot` directory.\n\n2. Install the required dependencies:\n\n   ```\n   pip install -r requirements.txt\n   ```\n\n## Running the Chatbot\n\n1. Start the Chainlit server:\n\n   ```\n   chainlit run main.py\n   ```\n\n2. Open your web browser and go to the URL displayed in the terminal (usually `http://localhost:8000`).\n\n## Using the Chatbot\n\n1. When the chatbot interface loads, you will be prompted to upload a text file.\n\n2. Click on the upload area and select a `.txt` file from your computer. The file size should not exceed 20MB.\n\n3. After uploading, the chatbot will process the file and inform you when it's ready.\n\n4. You can now start asking questions about the content of the uploaded file.\n\n5. Type your questions in the chat input and press Enter. The chatbot will respond based on the information in the uploaded file.\n\n## How It Works\n\nThe chatbot uses the Quivr library to create a \"brain\" from the uploaded text file. This brain is then used to answer questions about the file's content. The Chainlit library provides the user interface and handles the chat interactions.\n\nEnjoy chatting with your documents!\n"
  },
  {
    "path": "examples/chatbot_voice/main.py",
    "content": "import tempfile\nimport os\nimport chainlit as cl\nfrom quivr_core import Brain\nfrom quivr_core.rag.entities.config import RetrievalConfig\nfrom openai import AsyncOpenAI\nfrom chainlit.element import Element\n\nfrom io import BytesIO\n\n\n@cl.on_chat_start\nasync def on_chat_start():\n    files = None\n\n    # Wait for the user to upload a file\n    while files is None:\n        files = await cl.AskFileMessage(\n            content=\"Please upload a text .txt file to begin!\",\n            accept=[\"text/plain\"],\n            max_size_mb=20,\n            timeout=180,\n        ).send()\n\n    file = files[0]\n\n    msg = cl.Message(content=f\"Processing `{file.name}`...\")\n    await msg.send()\n\n    with open(file.path, \"r\", encoding=\"utf-8\") as f:\n        text = f.read()\n\n    with tempfile.NamedTemporaryFile(\n        mode=\"w\", suffix=file.name, delete=False\n    ) as temp_file:\n        temp_file.write(text)\n        temp_file.flush()\n        temp_file_path = temp_file.name\n\n    brain = Brain.from_files(name=\"user_brain\", file_paths=[temp_file_path])\n\n    # Store the file path in the session\n    cl.user_session.set(\"file_path\", temp_file_path)\n\n    # Let the user know that the system is ready\n    msg.content = f\"Processing `{file.name}` done. You can now ask questions!\"\n    await msg.update()\n\n    cl.user_session.set(\"brain\", brain)\n\n\n@cl.on_message\nasync def main(message: cl.Message):\n\n    task_list = cl.TaskList(name=\"State\")\n    task_list.status = \"Running...\"\n\n    think = cl.Task(title=\"Thinking\", status=cl.TaskStatus.RUNNING)\n    await task_list.add_task(think)\n\n    tts = cl.Task(title=\"Text to speech\")\n    await task_list.add_task(tts)\n\n    await task_list.send()\n\n    brain = cl.user_session.get(\"brain\")  # type: Brain\n    path_config = \"basic_rag_workflow.yaml\"\n    retrieval_config = RetrievalConfig.from_yaml(path_config)\n\n    if brain is None:\n        await cl.Message(content=\"Please upload a file first.\").send()\n        return\n\n    # Prepare the message for streaming\n    msg = cl.Message(content=\"\", elements=[], author=\"Quivr\", type=\"assistant_message\")\n    await msg.send()\n\n    saved_sources = set()\n    saved_sources_complete = []\n    elements = []\n\n    # Use the ask_stream method for streaming responses\n    async for chunk in brain.ask_streaming(message.content, retrieval_config=retrieval_config):\n        await msg.stream_token(chunk.answer)\n        for source in chunk.metadata.sources:\n            if source.page_content not in saved_sources:\n                saved_sources.add(source.page_content)\n                saved_sources_complete.append(source)\n                print(source)\n                elements.append(cl.Text(name=source.metadata[\"original_file_name\"], content=source.page_content, display=\"side\"))\n    \n    think.status = cl.TaskStatus.DONE\n    tts.status = cl.TaskStatus.RUNNING\n    await task_list.update()\n    \n    audio_file = await text_to_speech(msg.content)\n    elements.append(cl.Audio(content=audio_file, auto_play=True, mime=\"audio/mpeg\"))\n\n    sources = \"\"\n    for source in saved_sources_complete:\n        sources += f\"- {source.metadata['original_file_name']}\\n\"\n    msg.elements = elements\n    msg.content = msg.content + f\"\\n\\nSources:\\n{sources}\"\n    await msg.update()\n\n    tts.status = cl.TaskStatus.DONE\n    task_list.status = \"Done\"\n    await task_list.update()\n    await cl.sleep(1)\n    await task_list.remove()\n\nasync_openai_client = AsyncOpenAI(api_key=os.environ.get(\"OPENAI_API_KEY\"))\n\n@cl.step(type=\"tool\", name=\"Speech to text\")\nasync def speech_to_text(audio_file):\n    response = await async_openai_client.audio.transcriptions.create(\n        model=\"whisper-1\", file=audio_file\n    )\n\n    return response.text\n\n@cl.step(type=\"tool\", name=\"Text to speech\")\nasync def text_to_speech(text):\n    response = await async_openai_client.audio.speech.create(\n        model=\"tts-1\", voice=\"alloy\", input=text\n    )\n\n    return response.content\n\n\n@cl.on_audio_chunk\nasync def on_audio_chunk(chunk: cl.AudioChunk):\n    if chunk.isStart:\n        buffer = BytesIO()\n        # This is required for whisper to recognize the file type\n        buffer.name = f\"input_audio.{chunk.mimeType.split('/')[1]}\"\n        # Initialize the session for a new audio stream\n        cl.user_session.set(\"audio_buffer\", buffer)\n        cl.user_session.set(\"audio_mime_type\", chunk.mimeType)\n\n    # Write the chunks to a buffer and transcribe the whole audio at the end\n    cl.user_session.get(\"audio_buffer\").write(chunk.data)\n\n\n@cl.on_audio_end\nasync def on_audio_end(elements: list[Element]):\n    # Get the audio buffer from the session\n    task_list = cl.TaskList(name=\"State\")\n    task_list.status = \"Running...\"\n\n    stt = cl.Task(title=\"Speech to text\", status=cl.TaskStatus.RUNNING)\n    await task_list.add_task(stt)\n\n    await task_list.send()\n\n    audio_buffer: BytesIO = cl.user_session.get(\"audio_buffer\")\n    audio_buffer.seek(0)  # Move the file pointer to the beginning\n    audio_file = audio_buffer.read()\n    audio_mime_type: str = cl.user_session.get(\"audio_mime_type\")\n\n    input_audio_el = cl.Audio(\n        mime=audio_mime_type, content=audio_file, name=audio_buffer.name\n    )\n    await cl.Message(\n        author=\"You\",\n        type=\"user_message\",\n        content=\"\",\n        elements=[input_audio_el, *elements],\n    ).send()\n\n    whisper_input = (audio_buffer.name, audio_file, audio_mime_type)\n    transcription = await speech_to_text(whisper_input)\n\n    msg = cl.Message(author=\"You\", content=transcription, elements=elements)\n\n    stt.status = cl.TaskStatus.DONE\n    task_list.status = \"Done\"\n    await task_list.update()\n    await cl.sleep(1)\n    await task_list.remove()\n\n    await main(message=msg)"
  },
  {
    "path": "examples/chatbot_voice/pyproject.toml",
    "content": "[project]\nname = \"chatbot\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nauthors = [\n    { name = \"Stan Girard\", email = \"stan@quivr.app\" }\n]\ndependencies = [\n    \"quivr-core @ file:///${PROJECT_ROOT}/../../core\",\n    \"chainlit>=1.2.0\",\n    \"openai>=1.54.5\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.11\"\n\n[tool.rye]\nmanaged = true\nvirtual = true\ndev-dependencies = []\n"
  },
  {
    "path": "examples/pdf_document_from_yaml.py",
    "content": "import asyncio\nimport logging\nimport os\nfrom pathlib import Path\n\nimport dotenv\nfrom quivr_core import Brain\nfrom quivr_core.rag.entities.config import AssistantConfig\nfrom rich.traceback import install as rich_install\n\nConsoleOutputHandler = logging.StreamHandler()\n\nlogger = logging.getLogger(\"quivr_core\")\nlogger.setLevel(logging.DEBUG)\nlogger.addHandler(ConsoleOutputHandler)\n\n\nlogger = logging.getLogger(\"megaparse\")\nlogger.setLevel(logging.DEBUG)\nlogger.addHandler(ConsoleOutputHandler)\n\n\n# Install rich's traceback handler to automatically format tracebacks\nrich_install()\n\n\nasync def main():\n    file_path = [\n        Path(\"data/YamEnterprises_Monotype Fonts Plan License.US.en 04.0 (BLP).pdf\")\n    ]\n    file_path = [\n        Path(\n            \"data/YamEnterprises_Monotype Fonts Plan License.US.en 04.0 (BLP) reduced.pdf\"\n        )\n    ]\n\n    config_file_name = (\n        \"/Users/jchevall/Coding/quivr/backend/core/tests/rag_config_workflow.yaml\"\n    )\n\n    assistant_config = AssistantConfig.from_yaml(config_file_name)\n    # megaparse_config = find_nested_key(config, \"megaparse_config\")\n    megaparse_config = assistant_config.ingestion_config.parser_config.megaparse_config\n    megaparse_config.llama_parse_api_key = os.getenv(\"LLAMA_PARSE_API_KEY\")\n\n    processor_kwargs = {\n        \"megaparse_config\": megaparse_config,\n        \"splitter_config\": assistant_config.ingestion_config.parser_config.splitter_config,\n    }\n\n    brain = await Brain.afrom_files(\n        name=\"test_brain\",\n        file_paths=file_path,\n        processor_kwargs=processor_kwargs,\n    )\n\n    # # Check brain info\n    brain.print_info()\n\n    questions = [\n        \"What is the contact name for Yam Enterprises?\",\n        \"What is the customer phone for Yam Enterprises?\",\n        \"What is the Production Fonts (maximum) for Yam Enterprises?\",\n        \"List the past use font software according to past use term for Yam Enterprises.\",\n        \"How many unique Font Name are there in the Add-On Font Software Section for Yam Enterprises?\",\n        \"What is the maximum number of Production Fonts allowed based on the license usage per term for Yam Enterprises?\",\n        \"What is the number of production fonts licensed by Yam Enterprises? List them one by one.\",\n        \"What is the number of Licensed Monthly Page Views for Yam Enterprises?\",\n        \"What is the monthly licensed impressions (Digital Marketing Communications) for Yam Enterprises?\",\n        \"What is the number of Licensed Applications for Yam Enterprises?\",\n        \"For Yam Enterprises what is the number of applications aggregate Registered users?\",\n        \"What is the number of licensed servers for Yam Enterprises?\",\n        \"When is swap of Production Fonts available in Yam Enterprises?\",\n        \"Who is the primary licensed monotype fonts user for Yam Enterprises?\",\n        \"What is the number of Licensed Commercial Electronic Documents for Yam Enterprises?\",\n        \"How many licensed monotype fonts users can Yam Enterprises have?\",\n        \"How many licensed desktop users can Yam Enterprises have?\",\n        \"Which contract type does Yam Enterprises follow?\",\n        \"What monotype fonts support does Yam Enterprises have?\",\n        \"Which monotype font services onboarding does Yam Enterprises have?\",\n        \"Which Font/User Management does Yam Enterprises have?\",\n        \"What Add-on inventory set did Yam Enterprises pick?\",\n        \"Does Yam Enterprises have Single sign on?\",\n        \"Is there Brand and Licence protection for Yam Enterprises?\",\n        \"Who is the Third Party Payor's contact in Yam Enterprises?\",\n        \"Does Yam Enterprises contract have Company Desktop License?\",\n        \"What is the Number of Swaps Allowed for Yam Enterprises?\",\n        \"When is swap of Production Fonts available in Yam Enterprises?\",\n    ]\n\n    answers = [\n        \"Haruko Yamamoto\",\n        \"81 90-1234-5603\",\n        \"300 Production Fonts\",\n        \"Helvetica Regular\",\n        \"7\",\n        \"300 Production Fonts\",\n        \"Yam Enterprises has licensed a total of 105 Production Fonts.\",\n        \"35,000,000\",\n        \"2,500,000\",\n        \"60\",\n        \"40\",\n        \"2\",\n        \"Once per quarter\",\n        \"Haruko Yamamoto\",\n        \"0\",\n        \"100\",\n        \"60\",\n        \"License\",\n        \"Premier\",\n        \"Premier\",\n        \"Premier\",\n        \"Plus\",\n        \"Yes\",\n        \"Yes\",\n        \"\"\"\n        Name: Yami Enterprises\n\n        Contact: Mei Mei\n\n        Address: 20-22 Tsuki-Tsuki-dori, Tokyo, Japan\n\n        Phone: +81 71-9336-54023\n\n        E-mail: mei.mei@example.com\n        \"\"\",\n        \"Yes\",\n        \"One (1) swap per calendar quarter\",\n        \"The swap of Production Fonts will be available one (1) time per calendar quarter by removing Font Software as a Production Font and choosing other Font Software on the Monotype Fonts Platform.\",\n    ]\n\n    retrieval_config = assistant_config.retrieval_config\n    for i, (question, truth) in enumerate(zip(questions, answers, strict=False)):\n        chunk = brain.ask(question=question, retrieval_config=retrieval_config)\n        print(\n            \"\\n Question: \", question, \"\\n Answer: \", chunk.answer, \"\\n Truth: \", truth\n        )\n        if i == 5:\n            break\n\n\nif __name__ == \"__main__\":\n    dotenv.load_dotenv()\n\n    # Run the main function in the existing event loop\n    asyncio.run(main())\n"
  },
  {
    "path": "examples/pdf_parsing_tika.py",
    "content": "from langchain_core.embeddings import DeterministicFakeEmbedding\nfrom langchain_core.language_models import FakeListChatModel\nfrom quivr_core import Brain\nfrom quivr_core.rag.entities.config import LLMEndpointConfig\nfrom quivr_core.llm.llm_endpoint import LLMEndpoint\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\n\nif __name__ == \"__main__\":\n    brain = Brain.from_files(\n        name=\"test_brain\",\n        file_paths=[\"tests/processor/data/dummy.pdf\"],\n        llm=LLMEndpoint(\n            llm=FakeListChatModel(responses=[\"good\"]),\n            llm_config=LLMEndpointConfig(model=\"fake_model\", llm_base_url=\"local\"),\n        ),\n        embedder=DeterministicFakeEmbedding(size=20),\n    )\n    # Check brain info\n    brain.print_info()\n\n    console = Console()\n    console.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\n    while True:\n        # Get user input\n        question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n        # Check if user wants to exit\n        if question.lower() == \"exit\":\n            console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n            break\n\n        answer = brain.ask(question)\n        # Print the answer with typing effect\n        console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n        console.print(\"-\" * console.width)\n\n    brain.print_info()\n"
  },
  {
    "path": "examples/quivr-whisper/.env_example",
    "content": "QUIVR_API_KEY=XXXX\nQUIVR_CHAT_ID=1XXXX\nQUIVR_BRAIN_ID=XXXX\nQUIVR_URL=XXXX\nOPENAI_API_KEY=XXXX\n"
  },
  {
    "path": "examples/quivr-whisper/.gitignore",
    "content": ".env\nuploads"
  },
  {
    "path": "examples/quivr-whisper/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "examples/quivr-whisper/README.md",
    "content": "# Quivr-Whisper\n\nQuivr-Whisper is a web application that allows users to ask questions via audio input. It leverages OpenAI's Whisper model for speech transcription and synthesizes responses using OpenAI's text-to-speech capabilities. The application queries the Quivr API to get a response based on the transcribed audio input.\n\n\n\nhttps://github.com/StanGirard/quivr-whisper/assets/19614572/9cc270c9-07e4-4ce1-bcff-380f195c9313\n\n\n\n## Features\n\n- Audio input for asking questions\n- Speech transcription using OpenAI's Whisper model\n- Integration with Quivr API for intelligent responses\n- Speech synthesis of the response for audio playback\n\n## Getting Started\n\nThese instructions will get you a copy of the project up and running on your local machine for development and testing purposes.\n\n### Prerequisites\n\nWhat things you need to install the software and how to install them:\n\n- Python 3.6+\n- pip for Python 3\n- Flask\n- OpenAI Python package\n- Requests package\n\n### Installing\n\nA step by step series of examples that tell you how to get a development environment running:\n\n1. Clone the repository to your local machine.\n```bash\ngit clone https://github.com/stangirard/quivr-whisper.git\ncd Quivr-talk\n```\n\n2. Install the required packages.\n```bash\npip install flask openai requests python-dotenv\n```\n\n3. Create a `.env` file in the root directory of the project and add your API keys and other configuration variables.\n```env\nOPENAI_API_KEY='your_openai_api_key'\nQUIVR_API_KEY='your_quivr_api_key'\nQUIVR_CHAT_ID='your_quivr_chat_id'\nQUIVR_BRAIN_ID='your_quivr_brain_id'\nQUIVR_URL='https://api.quivr.app' # Optional, only if different from the default\n```\n\n4. Run the Flask application.\n```bash\nflask run\n```\n\nYour app should now be running on `http://localhost:5000`.\n\n## Usage\n\nTo use Quivr-talk, navigate to `http://localhost:5000` in your web browser, click on \"Ask a question to Quivr\", and record your question. Wait for the transcription and response to be synthesized, and you will hear the response played back to you.\n"
  },
  {
    "path": "examples/quivr-whisper/app.py",
    "content": "from flask import Flask, render_template, request, jsonify, session\nimport openai\nimport base64\nimport os\nimport requests\nfrom dotenv import load_dotenv\nfrom quivr_core import Brain\nfrom quivr_core.rag.entities.config import RetrievalConfig\nfrom tempfile import NamedTemporaryFile\nfrom werkzeug.utils import secure_filename\nfrom asyncio import to_thread\nimport asyncio\n\n\nUPLOAD_FOLDER = \"uploads\"\nALLOWED_EXTENSIONS = {\"txt\"}\n\nos.makedirs(UPLOAD_FOLDER, exist_ok=True)\n\napp = Flask(__name__)\napp.secret_key = \"secret\"\napp.config[\"UPLOAD_FOLDER\"] = UPLOAD_FOLDER\napp.config[\"CACHE_TYPE\"] = \"SimpleCache\"  # In-memory cache for development\napp.config[\"CACHE_DEFAULT_TIMEOUT\"] = 60 * 60  # 1 hour cache timeout\nload_dotenv()\n\nopenai.api_key = os.getenv(\"OPENAI_API_KEY\")\n\nbrains = {}\n\n\n@app.route(\"/\")\ndef index():\n    return render_template(\"index.html\")\n\n\ndef run_in_event_loop(func, *args, **kwargs):\n    loop = asyncio.new_event_loop()\n    asyncio.set_event_loop(loop)\n    if asyncio.iscoroutinefunction(func):\n        result = loop.run_until_complete(func(*args, **kwargs))\n    else:\n        result = func(*args, **kwargs)\n    loop.close()\n    return result\n\n\ndef allowed_file(filename):\n    return \".\" in filename and filename.rsplit(\".\", 1)[1].lower() in ALLOWED_EXTENSIONS\n\n\n@app.route(\"/upload\", methods=[\"POST\"])\nasync def upload_file():\n    if \"file\" not in request.files:\n        return \"No file part\", 400\n\n    file = request.files[\"file\"]\n\n    if file.filename == \"\":\n        return \"No selected file\", 400\n    if not (file and file.filename and allowed_file(file.filename)):\n        return \"Invalid file type\", 400\n\n    filename = secure_filename(file.filename)\n    filepath = os.path.join(app.config[\"UPLOAD_FOLDER\"], filename)\n    file.save(filepath)\n\n    print(f\"File uploaded and saved at: {filepath}\")\n\n    print(\"Creating brain instance...\")\n\n    brain: Brain = await to_thread(\n        run_in_event_loop, Brain.from_files, name=\"user_brain\", file_paths=[filepath]\n    )\n\n    # Store brain instance in cache\n    session_id = session.sid if hasattr(session, \"sid\") else os.urandom(16).hex()\n    session[\"session_id\"] = session_id\n    # cache.set(session_id, brain)  # Store the brain instance in the cache\n    brains[session_id] = brain\n    print(f\"Brain instance created and stored in cache for session ID: {session_id}\")\n\n    return jsonify({\"message\": \"Brain created successfully\"})\n\n\n@app.route(\"/ask\", methods=[\"POST\"])\nasync def ask():\n    if \"audio_data\" not in request.files:\n        return \"Missing audio data\", 400\n\n    # Retrieve the brain instance from the cache using the session ID\n    session_id = session.get(\"session_id\")\n    if not session_id:\n        return \"Session ID not found. Upload a file first.\", 400\n\n    brain = brains.get(session_id)\n    if not brain:\n        return \"Brain instance not found in dict. Upload a file first.\", 400\n\n    print(\"Brain instance loaded from cache.\")\n\n    print(\"Speech to text...\")\n    audio_file = request.files[\"audio_data\"]\n    transcript = transcribe_audio_file(audio_file)\n    print(\"Transcript result: \", transcript)\n\n    print(\"Getting response...\")\n    quivr_response = await to_thread(run_in_event_loop, brain.ask, transcript)\n\n    print(\"Text to speech...\")\n    audio_base64 = synthesize_speech(quivr_response.answer)\n\n    print(\"Done\")\n    return jsonify({\"audio_base64\": audio_base64})\n\n\ndef transcribe_audio_file(audio_file):\n    with NamedTemporaryFile(suffix=\".webm\", delete=False) as temp_audio_file:\n        audio_file.save(temp_audio_file)\n        temp_audio_file_path = temp_audio_file.name\n\n    try:\n        with open(temp_audio_file_path, \"rb\") as f:\n            transcript_response = openai.audio.transcriptions.create(\n                model=\"whisper-1\", file=f\n            )\n        transcript = transcript_response.text\n    finally:\n        os.unlink(temp_audio_file_path)\n\n    return transcript\n\n\ndef synthesize_speech(text):\n    speech_response = openai.audio.speech.create(\n        model=\"tts-1\", voice=\"nova\", input=text\n    )\n    audio_content = speech_response.content\n    audio_base64 = base64.b64encode(audio_content).decode(\"utf-8\")\n    return audio_base64\n\n\nif __name__ == \"__main__\":\n    app.run(debug=True)\n"
  },
  {
    "path": "examples/quivr-whisper/pyproject.toml",
    "content": "[project]\nname = \"quivr-whisper\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nauthors = [\n    { name = \"Stan Girard\", email = \"stan@quivr.app\" }\n]\ndependencies = [\n    \"quivr-core @ file:///${PROJECT_ROOT}/../../core\",\n    \"flask[async]>=3.1.0\",\n    \"openai>=1.54.5\",\n    \"flask-caching>=2.3.0\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.11\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.rye]\nmanaged = true\nvirtual = true\ndev-dependencies = []\n\n[tool.hatch.metadata]\nallow-direct-references = true\n\n[tool.hatch.build.targets.wheel]\npackages = [\"src/quivr_whisper\"]\n"
  },
  {
    "path": "examples/quivr-whisper/static/app.js",
    "content": "// DOM Elements\nconst recordBtn = document.getElementById(\"record-btn\");\nconst fileInput = document.getElementById(\"fileInput\");\nconst fileInputContainer = document.querySelector(\".custom-file-input\");\nconst fileName = document.getElementById(\"fileName\");\n\nconst audioVisualizer = document.getElementById(\"audio-visualizer\");\nconst audioPlayback = document.getElementById(\"audio-playback\");\nconst canvasCtx = audioVisualizer.getContext(\"2d\");\n\nwindow.addEventListener(\"load\", () => {\n  audioVisualizer.width = window.innerWidth;\n  audioVisualizer.height = window.innerHeight;\n});\n\nwindow.addEventListener(\"resize\", (e) => {\n  audioVisualizer.width = window.innerWidth;\n  audioVisualizer.height = window.innerHeight;\n});\n\nfileInput.addEventListener(\"change\", () => {\n  fileName.textContent =\n    fileInput.files.length > 0 ? fileInput.files[0].name : \"No file chosen\";\n  fileName.classList.toggle(\"file-selected\", fileInput.files.length > 0);\n});\n\n// Configuration\nconst SILENCE_THRESHOLD = 128; // Adjusted for byte data (128 is middle)\nconst SILENCE_DURATION = 1500;\nconst FFT_SIZE = 2048;\n\n// State\nconst state = {\n  isRecording: false,\n  isVisualizing: false,\n  chunks: [],\n  silenceTimer: null,\n  lastAudioLevel: 0,\n};\n\n// Audio Analysis\nclass AudioAnalyzer {\n  constructor() {\n    this.reset();\n  }\n\n  reset() {\n    this.analyser = null;\n    this.dataArray = null;\n    this.bufferLength = null;\n    this.source = null;\n    this.cleanup();\n  }\n\n  setup(source, audioContext) {\n    this.cleanup();\n\n    this.analyser = this._createAnalyser(audioContext);\n    source.connect(this.analyser);\n\n    this._initializeBuffer();\n    return this.analyser;\n  }\n\n  setupForPlayback(audioElement, audioContext, connectToDestination = true) {\n    // Reuse existing MediaElementSourceNode if it already exists for this audio element\n    if (!this.source || this.source.mediaElement !== audioElement) {\n      this.cleanup(); // Ensure any previous connections are cleaned up\n      this.source = audioContext.createMediaElementSource(audioElement);\n    }\n\n    this.analyser = this._createAnalyser(audioContext);\n\n    this.source.connect(this.analyser);\n\n    if (connectToDestination) {\n      this.analyser.connect(audioContext.destination);\n    }\n\n    this._initializeBuffer();\n    return this.analyser;\n  }\n\n  cleanup() {\n    if (this.source) {\n      this._safeDisconnect(this.source);\n    }\n    if (this.analyser) {\n      this._safeDisconnect(this.analyser);\n    }\n  }\n\n  _createAnalyser(audioContext) {\n    const analyser = audioContext.createAnalyser();\n    analyser.fftSize = FFT_SIZE;\n    return analyser;\n  }\n\n  _initializeBuffer() {\n    this.bufferLength = this.analyser.frequencyBinCount;\n    this.dataArray = new Uint8Array(this.bufferLength);\n  }\n\n  _safeDisconnect(node) {\n    if (node) {\n      try {\n        node.disconnect();\n      } catch {\n        // Ignore disconnect errors\n      }\n    }\n  }\n}\n\n// Visualization\nclass Visualizer {\n  constructor(canvas, analyzer) {\n    this.canvas = canvas;\n    this.ctx = canvas.getContext(\"2d\");\n    this.analyzer = analyzer;\n  }\n\n  draw(currentAnalyser, onSilence) {\n    if (!currentAnalyser || this.analyzer.dataArray === null) return;\n\n    requestAnimationFrame(() => this.draw(currentAnalyser, onSilence));\n\n    // Use getByteTimeDomainData instead of getFloatTimeDomainData\n    currentAnalyser.getByteTimeDomainData(this.analyzer.dataArray);\n\n    // Clear canvas\n    this.ctx.fillStyle = \"#252525\";\n    this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n    if (!state.isVisualizing) return;\n\n    this.ctx.lineWidth = 2;\n    this.ctx.strokeStyle = \"#6142d4\";\n    this.ctx.beginPath();\n\n    const sliceWidth = (this.canvas.width * 1) / this.analyzer.bufferLength;\n    let x = 0;\n    let sum = 0;\n\n    // Draw waveform\n    for (let i = 0; i < this.analyzer.bufferLength; i++) {\n      // Scale byte data (0-255) to canvas height\n      const v = this.analyzer.dataArray[i] / 128.0; // normalize to 0-2\n      const y = (v - 1) * (this.canvas.height / 2) + this.canvas.height / 2;\n\n      sum += Math.abs(v - 1); // Calculate distance from center (128)\n\n      if (i === 0) {\n        this.ctx.moveTo(x, y);\n      } else {\n        this.ctx.lineTo(x, y);\n      }\n\n      x += sliceWidth;\n    }\n\n    this.ctx.lineTo(this.canvas.width, this.canvas.height / 2);\n    this.ctx.stroke();\n\n    // Check for silence during recording with adjusted thresholds for byte data\n    if (state.isRecording) {\n      const averageAmplitude = sum / this.analyzer.bufferLength;\n      if (averageAmplitude < 0.1) {\n        // Adjusted threshold for normalized data\n        // Reset silence timer if we detect sound\n        if (averageAmplitude > 0.05) {\n          clearTimeout(state.silenceTimer);\n          state.silenceTimer = null;\n        } else {\n          onSilence();\n        }\n      }\n    }\n  }\n}\n\n// Recording Handler\nclass RecordingHandler {\n  constructor() {\n    this.mediaRecorder = null;\n    this.audioAnalyzer = new AudioAnalyzer();\n    this.visualizer = new Visualizer(audioVisualizer, this.audioAnalyzer);\n    this.audioContext = null;\n  }\n\n  async initialize() {\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      this.mediaRecorder = new MediaRecorder(stream);\n      this.setupRecordingEvents();\n      if (!this.audioContext)\n        this.audioContext = new (window.AudioContext ||\n          window.webkitAudioContext)();\n    } catch (err) {\n      console.error(`Media device error: ${err}`);\n    }\n  }\n\n  setupRecordingEvents() {\n    this.mediaRecorder.ondataavailable = (e) => {\n      state.chunks.push(e.data);\n    };\n\n    this.mediaRecorder.onstop = async () => {\n      await this.handleRecordingStop();\n    };\n  }\n\n  startRecording() {\n    state.isVisualizing = true;\n    state.chunks = [];\n    state.isRecording = true;\n    this.mediaRecorder.start();\n\n    const source = this.audioContext.createMediaStreamSource(\n      this.mediaRecorder.stream\n    );\n\n    const analyser = this.audioAnalyzer.setup(source, this.audioContext);\n    audioVisualizer.classList.remove(\"hidden\");\n\n    this.visualizer.draw(analyser, () => {\n      if (!state.silenceTimer) {\n        state.silenceTimer = setTimeout(\n          () => this.stopRecording(),\n          SILENCE_DURATION\n        );\n      }\n    });\n\n    recordBtn.dataset.recording = true;\n    recordBtn.classList.add(\"processing\");\n  }\n\n  stopRecording() {\n    if (state.isRecording) {\n      state.isVisualizing = false;\n      state.isRecording = false;\n      this.mediaRecorder.stop();\n      clearTimeout(state.silenceTimer);\n      state.silenceTimer = null;\n      recordBtn.dataset.recording = false;\n    }\n  }\n\n  async handleRecordingStop() {\n    console.log(\"Processing recording...\");\n    recordBtn.dataset.pending = true;\n    recordBtn.disabled = true;\n\n    const audioBlob = new Blob(state.chunks, { type: \"audio/wav\" });\n    if (!fileInput.files.length) {\n      recordBtn.dataset.pending = false;\n      recordBtn.disabled = false;\n      alert(\"Please select a file.\");\n      return;\n    }\n\n    const formData = new FormData();\n    formData.append(\"audio_data\", audioBlob);\n    formData.append(\"file\", fileInput.files[0]);\n\n    try {\n      await this.processRecording(formData);\n    } catch (error) {\n      console.error(\"Processing error:\", error);\n    } finally {\n      this.audioAnalyzer.cleanup();\n    }\n  }\n\n  async processRecording(formData) {\n    const response = await fetch(\"/ask\", {\n      method: \"POST\",\n      body: formData,\n    });\n    const data = await response.json();\n\n    await this.handleResponse(data);\n  }\n\n  async handleResponse(data) {\n    audioPlayback.src = \"data:audio/wav;base64,\" + data.audio_base64;\n\n    audioPlayback.onloadedmetadata = () => {\n      const analyser = this.audioAnalyzer.setupForPlayback(\n        audioPlayback,\n        this.audioContext\n      );\n      audioVisualizer.classList.remove(\"hidden\");\n\n      this.visualizer.draw(analyser, () => {});\n      audioPlayback.play();\n      state.isVisualizing = true;\n    };\n\n    audioPlayback.onended = () => {\n      this.audioAnalyzer.cleanup();\n      recordBtn.dataset.pending = false;\n      recordBtn.disabled = false;\n      state.isVisualizing = false;\n    };\n  }\n}\n\nconst uploadFile = async (e) => {\n  uploadBtn.innerText = \"Uploading File...\";\n  e.preventDefault();\n  const file = fileInput.files[0];\n\n  if (!file) {\n    alert(\"Please select a file.\");\n    return;\n  }\n  const formData = new FormData();\n  formData.append(\"file\", file);\n  try {\n    await fetch(\"/upload\", {\n      method: \"POST\",\n      body: formData,\n    });\n    recordBtn.classList.remove(\"hidden\");\n    fileInputContainer.classList.add(\"hidden\");\n  } catch (error) {\n    recordBtn.classList.add(\"hidden\");\n    fileInputContainer.classList.remove(\"hidden\");\n    console.error(\"Error uploading file:\", error);\n    uploadBtn.innerText = \"Upload Failed. Try again\";\n  }\n};\n\nconst uploadBtn = document.getElementById(\"upload-btn\");\nuploadBtn.addEventListener(\"click\", uploadFile);\n\n// Main initialization\nasync function initializeApp() {\n  if (!navigator.mediaDevices) {\n    console.error(\"Media devices not supported\");\n    return;\n  }\n\n  const recorder = new RecordingHandler();\n  await recorder.initialize();\n\n  recordBtn.onclick = () => {\n    if (recorder.mediaRecorder.state === \"inactive\") {\n      recorder.startRecording();\n    } else if (recorder.mediaRecorder.state === \"recording\") {\n      recorder.stopRecording();\n    }\n  };\n}\n\n// Start the application\ninitializeApp();\n"
  },
  {
    "path": "examples/quivr-whisper/static/styles.css",
    "content": "* {\n    box-sizing: border-box;\n    margin: 0;\n    padding: 0;\n}\n\n\nbody {\n    color: #f4f4f4;\n    background-color: #252525;\n    display: flex;\n    gap: 1rem;\n    align-items: center;\n    flex-direction: column;\n    justify-content: center;\n    min-height: 100vh;\n}\n\n.primary {\n    background-color: #6142d4;\n}\n\nbutton {\n    background-color: #6142d4;\n    border: none;\n    padding: .75rem 2rem;\n    border-radius: 0.5rem;\n    color: #f4f4f4;\n    cursor: pointer;\n}\n\ncanvas {\n    position: absolute;\n    width: 100%;\n    height: 100%;\n    top: 0;\n    left: 0;\n    background-color: #252525;\n    z-index: -1;\n}\n\n.record-btn {\n    background-color: #f5f5f5;\n    border: none;\n    outline: none;\n    width: 256px;\n    height: 256px;\n    background-repeat: no-repeat;\n    background-position: center;\n    border-radius: 50%;\n    background-size: 50%;\n    transition: background-color 200ms ease-in, transform 200ms ease-out;\n}\n\n.record-btn:hover {\n    background-color: #fff;\n    transform: scale(1.025);\n}\n\n.record-btn:active {\n    background-color: #e2e2e2;\n    transform: scale(0.975);\n}\n\n.record-btn[data-recording=\"true\"] {\n    background-image: url(\"./mic.svg\");\n}\n\n.record-btn[data-recording=\"false\"] {\n    background-image: url(\"./mic-off.svg\");\n}\n\n.record-btn[data-pending=\"true\"] {\n    background-image: url(\"./loader.svg\") !important;\n    animation: spin 1s linear infinite;\n}\n\n.hidden {\n    display: none !important;\n    visibility: hidden;\n}\n\n.custom-file-input {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 10px;\n}\n\n.custom-file-input input[type=\"file\"] {\n  display: none;\n}\n\n.custom-file-input label {\n  border: solid 2px #6142d4;\n  color: white;\n  padding: 8px 16px;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 14px;\n  font-weight: bold;\n  transition: background-color 0.3s;\n}\n\n.custom-file-input label:hover {\n  background-color: #6142d4;\n}\n\n.custom-file-input span {\n  font-size: 14px;\n  color: #f4f4f4;\n}\n\n/* Adjust appearance when a file is selected */\n.custom-file-input span.file-selected {\n  color: #ffffff;\n  font-weight: bold;\n}\n\n/* \n# Override default MUI light theme. (Check theme.ts)\n[UI.theme.light]\n    background = \"#fcfcfc\"\n    paper = \"#f8f8f8\"\n\n    [UI.theme.light.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.light.text]\n        primary = \"#1f1f1f\"\n        secondary = \"#818080\"\n\n# Override default MUI dark theme. (Check theme.ts)\n[UI.theme.dark]\n    background = \"#252525\"\n    paper = \"#1f1f1f\"\n\n    [UI.theme.dark.primary]\n        main = \"#6142d4\"\n        dark = \"#6e53cf\"\n        light = \"#6e53cf30\"\n    [UI.theme.dark.text]\n        primary = \"#f4f4f4\"\n        secondary = \"#c8c8c8\"\n\n*/\n\n.loader {\n    border: 4px solid #f3f3f3;\n    border-radius: 50%;\n    border-top: 4px solid #3498db;\n    width: 50px;\n    height: 50px;\n    -webkit-animation: spin 2s linear infinite;\n    animation: spin 2s linear infinite;\n    position: absolute;\n    /* Center the loader in the viewport */\n    top: 50%;\n    left: 50%;\n    transform: translate(-50%, -50%);\n    display: none;\n    /* Hide it by default */\n}\n\n@-webkit-keyframes spin {\n    0% {\n        -webkit-transform: rotate(0deg);\n    }\n\n    100% {\n        -webkit-transform: rotate(360deg);\n    }\n}\n\n@keyframes spin {\n    0% {\n        transform: rotate(0deg);\n    }\n\n    100% {\n        transform: rotate(360deg);\n    }\n}"
  },
  {
    "path": "examples/quivr-whisper/templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>Audio Interaction WebApp</title>\n    <link\n      rel=\"stylesheet\"\n      href=\"{{ url_for('static', filename='styles.css') }}\"\n    />\n  </head>\n\n  <body>\n    <button\n      type=\"button\"\n      id=\"record-btn\"\n      class=\"record-btn hidden\"\n      data-recording=\"false\"\n      data-pending=\"false\"\n    ></button>\n    <div class=\"custom-file-input\">\n      <label for=\"fileInput\">Choose a file</label>\n      <input\n        type=\"file\"\n        accept=\"text/plain\"\n        name=\"fileInput\"\n        required\n        id=\"fileInput\"\n      />\n      <span id=\"fileName\">No file chosen</span>\n      <button id=\"upload-btn\" class=\"upload-btn\">Upload</button>\n    </div>\n    <canvas id=\"audio-visualizer\" class=\"\"></canvas>\n    <audio id=\"audio-playback\" controls class=\"hidden\"></audio>\n    <script src=\"{{ url_for('static', filename='app.js') }}\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/save_load_brain.py",
    "content": "import asyncio\nimport tempfile\n\nfrom quivr_core import Brain\n\n\nasync def main():\n    with tempfile.NamedTemporaryFile(mode=\"w\", suffix=\".txt\") as temp_file:\n        temp_file.write(\"Gold is a liquid of blue-like colour.\")\n        temp_file.flush()\n\n        brain = await Brain.afrom_files(name=\"test_brain\", file_paths=[temp_file.name])\n\n        save_path = await brain.save(\"/home/amine/.local/quivr\")\n\n        brain_loaded = Brain.load(save_path)\n        brain_loaded.print_info()\n\n\nif __name__ == \"__main__\":\n    # Run the main function in the existing event loop\n    asyncio.run(main())\n"
  },
  {
    "path": "examples/simple_question/.gitignore",
    "content": "# python generated files\n__pycache__/\n*.py[oc]\nbuild/\ndist/\nwheels/\n*.egg-info\n\n# venv\n.venv\n"
  },
  {
    "path": "examples/simple_question/.python-version",
    "content": "3.11.9\n"
  },
  {
    "path": "examples/simple_question/README.md",
    "content": "# simple-question\n\nDescribe your project here.\n"
  },
  {
    "path": "examples/simple_question/pyproject.toml",
    "content": "[project]\nname = \"simple-question\"\nversion = \"0.1.0\"\ndescription = \"Add your description here\"\nauthors = [\n    { name = \"Stan Girard\", email = \"stan@quivr.app\" }\n]\ndependencies = [\n    \"quivr-core @ file:///${PROJECT_ROOT}/../../core\",\n    \"python-dotenv>=1.0.1\",\n]\nreadme = \"README.md\"\nrequires-python = \">= 3.11\"\n\n[tool.rye]\nmanaged = true\nvirtual = true\ndev-dependencies = []\n"
  },
  {
    "path": "examples/simple_question/simple_question.py",
    "content": "import tempfile\n\nfrom quivr_core import Brain\n\nimport dotenv\n\ndotenv.load_dotenv()\n\nif __name__ == \"__main__\":\n    with tempfile.NamedTemporaryFile(mode=\"w\", suffix=\".txt\") as temp_file:\n        temp_file.write(\"Gold is a liquid of blue-like colour.\")\n        temp_file.flush()\n\n        brain = Brain.from_files(\n            name=\"test_brain\",\n            file_paths=[temp_file.name],\n        )\n\n        answer = brain.ask(\"what is gold? answer in french\")\n        print(\"answer QuivrQARAGLangGraph :\", answer)\n"
  },
  {
    "path": "examples/simple_question/simple_question_streaming.py",
    "content": "import asyncio\nimport tempfile\n\nfrom dotenv import load_dotenv\nfrom quivr_core import Brain\nfrom quivr_core.quivr_rag import QuivrQARAG\nfrom quivr_core.rag.quivr_rag_langgraph import QuivrQARAGLangGraph\n\n\nasync def main():\n    dotenv_path = \"/Users/jchevall/Coding/QuivrHQ/quivr/.env\"\n    load_dotenv(dotenv_path)\n\n    with tempfile.NamedTemporaryFile(mode=\"w\", suffix=\".txt\") as temp_file:\n        temp_file.write(\"Gold is a liquid of blue-like colour.\")\n        temp_file.flush()\n\n        brain = await Brain.afrom_files(name=\"test_brain\", file_paths=[temp_file.name])\n\n        await brain.save(\"~/.local/quivr\")\n\n        question = \"what is gold? answer in french\"\n        async for chunk in brain.ask_streaming(question, rag_pipeline=QuivrQARAG):\n            print(\"answer QuivrQARAG:\", chunk.answer)\n\n        async for chunk in brain.ask_streaming(\n            question, rag_pipeline=QuivrQARAGLangGraph\n        ):\n            print(\"answer QuivrQARAGLangGraph:\", chunk.answer)\n\n\nif __name__ == \"__main__\":\n    # Run the main function in the existing event loop\n    asyncio.run(main())\n"
  },
  {
    "path": "examples/simple_question_megaparse.py",
    "content": "import os\n\nfrom langchain_openai import ChatOpenAI, OpenAIEmbeddings\nfrom quivr_core import Brain\nfrom quivr_core.llm.llm_endpoint import LLMEndpoint\nfrom quivr_core.rag.entities.config import LLMEndpointConfig\nfrom rich.console import Console\nfrom rich.panel import Panel\nfrom rich.prompt import Prompt\n\nif __name__ == \"__main__\":\n    brain = Brain.from_files(\n        name=\"test_brain\",\n        file_paths=[\"./tests/processor/pdf/sample.pdf\"],\n        llm=LLMEndpoint(\n            llm_config=LLMEndpointConfig(model=\"gpt-4o\"),\n            llm=ChatOpenAI(model=\"gpt-4o\", api_key=str(os.getenv(\"OPENAI_API_KEY\"))),\n        ),\n    )\n    embedder = embeddings = OpenAIEmbeddings(\n        model=\"text-embedding-3-large\",\n    )\n    # Check brain info\n    brain.print_info()\n\n    console = Console()\n    console.print(Panel.fit(\"Ask your brain !\", style=\"bold magenta\"))\n\n    while True:\n        # Get user input\n        question = Prompt.ask(\"[bold cyan]Question[/bold cyan]\")\n\n        # Check if user wants to exit\n        if question.lower() == \"exit\":\n            console.print(Panel(\"Goodbye!\", style=\"bold yellow\"))\n            break\n\n        answer = brain.ask(question)\n        # Print the answer with typing effect\n        console.print(f\"[bold green]Quivr Assistant[/bold green]: {answer.answer}\")\n\n        console.print(\"-\" * console.width)\n\n    brain.print_info()\n"
  },
  {
    "path": "release-please-config.json",
    "content": "{\n    \"packages\": {\n        \"core\": {\n            \"release-type\": \"python\",\n            \"package-name\": \"core\",\n            \"bump-patch-for-minor-pre-major\": true,\n            \"include-v-in-tag\": false,\n            \"tag-separator\": \"-\",\n            \"component\": \"core\"\n        }\n    }\n}"
  },
  {
    "path": "vercel.json",
    "content": "{\n    \"git\": {\n        \"deploymentEnabled\": {\n            \"main\": false\n        }\n    }\n}"
  }
]