Spaces:
Sleeping
Sleeping
Bot commited on
Commit ·
05c5ed5
0
Parent(s):
Initial commit for HF Spaces
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .dockerignore +56 -0
- .env.example +130 -0
- .eslintrc.json +9 -0
- .gemini/config.yaml +4 -0
- .gitattributes +5 -0
- .github/.dangerfile.ts +45 -0
- .github/FUNDING.yml +1 -0
- .github/release-please-config.json +3 -0
- .github/workflows/container.yaml +53 -0
- .github/workflows/e2e-tests.yml +102 -0
- .github/workflows/lint-and-type-check.yml +44 -0
- .github/workflows/pr-check.yml +28 -0
- .github/workflows/release.yml +102 -0
- .gitignore +62 -0
- .husky/pre-commit +1 -0
- .vscode/extensions.json +3 -0
- .vscode/settings.json +17 -0
- AGENTS.md +42 -0
- CHANGELOG.md +314 -0
- CONTRIBUTING.md +197 -0
- LICENSE +21 -0
- README.md +458 -0
- biome.json +81 -0
- components.json +21 -0
- docker/Dockerfile +48 -0
- docker/compose.yml +36 -0
- docs/storage/s3-setup.md +61 -0
- docs/tips-guides/adding-openAI-like-providers.md +24 -0
- docs/tips-guides/docker.md +83 -0
- docs/tips-guides/e2e-testing-guide.md +341 -0
- docs/tips-guides/file-storage.md +213 -0
- docs/tips-guides/mcp-oauth-flow.md +46 -0
- docs/tips-guides/mcp-server-setup-and-tool-testing.md +72 -0
- docs/tips-guides/oauth.md +110 -0
- docs/tips-guides/system-prompts-and-customization.md +106 -0
- docs/tips-guides/temporary_chat.md +35 -0
- docs/tips-guides/vercel.md +53 -0
- drizzle.config.ts +20 -0
- messages/en.json +815 -0
- messages/es.json +513 -0
- messages/fr.json +513 -0
- messages/ja.json +512 -0
- messages/ko.json +527 -0
- messages/language.md +28 -0
- messages/no.json +815 -0
- messages/zh.json +512 -0
- next.config.ts +25 -0
- package.json +178 -0
- playwright.config.ts +63 -0
- pnpm-lock.yaml +0 -0
.dockerignore
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
| 2 |
+
|
| 3 |
+
# dependencies
|
| 4 |
+
Dockerfile
|
| 5 |
+
compose.yml
|
| 6 |
+
/node_modules
|
| 7 |
+
/.pnp
|
| 8 |
+
.pnp.*
|
| 9 |
+
.yarn/*
|
| 10 |
+
!.yarn/patches
|
| 11 |
+
!.yarn/plugins
|
| 12 |
+
!.yarn/releases
|
| 13 |
+
!.yarn/versions
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
# testing
|
| 17 |
+
/coverage
|
| 18 |
+
|
| 19 |
+
# next.js
|
| 20 |
+
/.next/
|
| 21 |
+
/out/
|
| 22 |
+
|
| 23 |
+
# production
|
| 24 |
+
/build
|
| 25 |
+
|
| 26 |
+
# misc
|
| 27 |
+
.DS_Store
|
| 28 |
+
*.pem
|
| 29 |
+
*.local.*
|
| 30 |
+
|
| 31 |
+
# debug
|
| 32 |
+
npm-debug.log*
|
| 33 |
+
yarn-debug.log*
|
| 34 |
+
yarn-error.log*
|
| 35 |
+
.pnpm-debug.log*
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
# vercel
|
| 39 |
+
.vercel
|
| 40 |
+
|
| 41 |
+
# typescript
|
| 42 |
+
*.tsbuildinfo
|
| 43 |
+
next-env.d.ts
|
| 44 |
+
.local-cache
|
| 45 |
+
|
| 46 |
+
# memory-bank
|
| 47 |
+
/memory-bank
|
| 48 |
+
|
| 49 |
+
local-data
|
| 50 |
+
|
| 51 |
+
.cursorrules
|
| 52 |
+
.cursor
|
| 53 |
+
*.ignore
|
| 54 |
+
.mcp-config.json
|
| 55 |
+
.next
|
| 56 |
+
.changeset
|
.env.example
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# === LLM Provider API Keys ===
|
| 2 |
+
# You only need to enter the keys for the providers you plan to use
|
| 3 |
+
GOOGLE_GENERATIVE_AI_API_KEY=****
|
| 4 |
+
OPENAI_API_KEY=****
|
| 5 |
+
XAI_API_KEY=****
|
| 6 |
+
ANTHROPIC_API_KEY=****
|
| 7 |
+
OPENROUTER_API_KEY=****
|
| 8 |
+
OLLAMA_BASE_URL=http://localhost:11434/api
|
| 9 |
+
GROQ_API_KEY=****
|
| 10 |
+
GROQ_BASE_URL=https://api.groq.com/openai/v1
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
# (Optional) Default model to use when none is specified
|
| 14 |
+
# Format: provider/model (e.g., openRouter/qwen3-8b:free)
|
| 15 |
+
E2E_DEFAULT_MODEL=
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
# === Database ===
|
| 19 |
+
# If you don't have PostgreSQL running locally, start it with: pnpm docker:pg
|
| 20 |
+
POSTGRES_URL=postgres://your_username:your_password@localhost:5432/your_database_name
|
| 21 |
+
|
| 22 |
+
# Secret for Better Auth (generate with: npx @better-auth/cli@latest secret)
|
| 23 |
+
BETTER_AUTH_SECRET=
|
| 24 |
+
|
| 25 |
+
# (Optional)
|
| 26 |
+
# URL for Better Auth (the URL you access the app from)
|
| 27 |
+
# IMPORTANT: Set this to https://localhost:3000 if using HTTPS locally
|
| 28 |
+
# For production, this should match your domain (e.g., https://yourdomain.com)
|
| 29 |
+
BETTER_AUTH_URL=
|
| 30 |
+
|
| 31 |
+
# (Optional)
|
| 32 |
+
# === Tools ===
|
| 33 |
+
# Exa AI for web search and content extraction (optional, but recommended for @web and research features)
|
| 34 |
+
EXA_API_KEY=
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
# ========================================================================
|
| 39 |
+
# === OPTIONAL SETTINGS BELOW (not required for basic functionality) ===
|
| 40 |
+
# ========================================================================
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
# (Optional) Redis for Multi-Instance Support
|
| 44 |
+
# When running multiple server instances (load balancing, clustering):
|
| 45 |
+
# - With Redis: Real-time MCP synchronization + reduced polling
|
| 46 |
+
# - Without Redis: Polling-only synchronization (single instance or dev mode)
|
| 47 |
+
# redis://localhost:6379
|
| 48 |
+
REDIS_URL=
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
# (Optional)
|
| 52 |
+
# Whether to use file-based MCP config (default: false)
|
| 53 |
+
FILE_BASED_MCP_CONFIG=false
|
| 54 |
+
|
| 55 |
+
# (Optional)
|
| 56 |
+
# === OAuth Settings ===
|
| 57 |
+
# Fill in these values only if you want to enable Google/GitHub/Microsoft login
|
| 58 |
+
|
| 59 |
+
#GitHub
|
| 60 |
+
GITHUB_CLIENT_ID=
|
| 61 |
+
GITHUB_CLIENT_SECRET=
|
| 62 |
+
|
| 63 |
+
#Google
|
| 64 |
+
GOOGLE_CLIENT_ID=
|
| 65 |
+
GOOGLE_CLIENT_SECRET=
|
| 66 |
+
# Set to 1 to force account selection
|
| 67 |
+
GOOGLE_FORCE_ACCOUNT_SELECTION=
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
# Microsoft
|
| 71 |
+
MICROSOFT_CLIENT_ID=
|
| 72 |
+
MICROSOFT_CLIENT_SECRET=
|
| 73 |
+
# Optional Tenant Id
|
| 74 |
+
MICROSOFT_TENANT_ID=
|
| 75 |
+
# Set to 1 to force account selection
|
| 76 |
+
MICROSOFT_FORCE_ACCOUNT_SELECTION=
|
| 77 |
+
|
| 78 |
+
# (Optional)
|
| 79 |
+
# Set this to 1 to disable email/password sign in completely
|
| 80 |
+
DISABLE_EMAIL_SIGN_IN=
|
| 81 |
+
|
| 82 |
+
# (Optional)
|
| 83 |
+
# Set this to 1 to disable email/password sign-ups (still allows sign-in for existing users)
|
| 84 |
+
DISABLE_EMAIL_SIGN_UP=
|
| 85 |
+
|
| 86 |
+
# (Optional)
|
| 87 |
+
# Set this to 1 to disable OAuth sign-ups (Google, GitHub, Microsoft)
|
| 88 |
+
DISABLE_SIGN_UP=
|
| 89 |
+
|
| 90 |
+
# (Optional)
|
| 91 |
+
# Set this to 1 to disallow adding MCP servers.
|
| 92 |
+
NOT_ALLOW_ADD_MCP_SERVERS=
|
| 93 |
+
|
| 94 |
+
# (Optional)
|
| 95 |
+
# Maximum timeout for MCP tool calls in milliseconds (default: no timeout)
|
| 96 |
+
# Useful for long-running MCP tools. Example: 600000 (10 minutes)
|
| 97 |
+
MCP_MAX_TOTAL_TIMEOUT=
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
# === File Storage ===
|
| 101 |
+
|
| 102 |
+
# -- Vercel Blob example --
|
| 103 |
+
# Pull the token locally with `vercel env pull` when testing against Vercel Blob.
|
| 104 |
+
# FILE_STORAGE_TYPE=vercel-blob
|
| 105 |
+
# FILE_STORAGE_PREFIX=uploads
|
| 106 |
+
# BLOB_READ_WRITE_TOKEN=
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
# -- S3 --
|
| 110 |
+
# FILE_STORAGE_TYPE=s3
|
| 111 |
+
# FILE_STORAGE_PREFIX=uploads
|
| 112 |
+
# FILE_STORAGE_S3_BUCKET=
|
| 113 |
+
# FILE_STORAGE_S3_REGION=
|
| 114 |
+
# Optional: Use when serving files via CDN/custom domain
|
| 115 |
+
# FILE_STORAGE_S3_PUBLIC_BASE_URL=https://cdn.example.com
|
| 116 |
+
# Optional: For S3-compatible endpoints (e.g., MinIO)
|
| 117 |
+
# FILE_STORAGE_S3_ENDPOINT=http://localhost:9000
|
| 118 |
+
# Optional: Force path-style URLs (1/true to enable)
|
| 119 |
+
# FILE_STORAGE_S3_FORCE_PATH_STYLE=1
|
| 120 |
+
|
| 121 |
+
|
| 122 |
+
# AWS Credentials (server only)
|
| 123 |
+
# The AWS SDK automatically discovers credentials in this order:
|
| 124 |
+
# 1) Environment variables below, 2) ~/.aws/credentials or AWS_PROFILE,
|
| 125 |
+
# 3) IAM role attached to the runtime (EC2/ECS/EKS/Lambda).
|
| 126 |
+
# You do NOT need to set these when using an IAM role.
|
| 127 |
+
# AWS_ACCESS_KEY_ID=
|
| 128 |
+
# AWS_SECRET_ACCESS_KEY=
|
| 129 |
+
# AWS_SESSION_TOKEN=
|
| 130 |
+
# AWS_REGION=us-east-1
|
.eslintrc.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"extends": ["next/core-web-vitals", "next/typescript"],
|
| 3 |
+
"rules": {
|
| 4 |
+
"@typescript-eslint/no-explicit-any": "off",
|
| 5 |
+
"@typescript-eslint/no-unused-expressions": "off",
|
| 6 |
+
"@typescript-eslint/no-unused-vars": "off",
|
| 7 |
+
"react-hooks/exhaustive-deps": "off"
|
| 8 |
+
}
|
| 9 |
+
}
|
.gemini/config.yaml
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
code_review:
|
| 2 |
+
pull_request_opened:
|
| 3 |
+
summary: false
|
| 4 |
+
code_review: false
|
.gitattributes
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.jpeg filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.ico filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.png filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.gif filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.jpg filter=lfs diff=lfs merge=lfs -text
|
.github/.dangerfile.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// @ts-nocheck
|
| 2 |
+
import { danger, fail, warn, message } from "danger";
|
| 3 |
+
|
| 4 |
+
const prTitle = danger.github.pr.title;
|
| 5 |
+
const conventionalRegex =
|
| 6 |
+
/^(feat|fix|chore|docs|style|refactor|test|perf|build|ci|revert)(\(.+\))?!?: .+/;
|
| 7 |
+
|
| 8 |
+
if (!conventionalRegex.test(prTitle)) {
|
| 9 |
+
fail(
|
| 10 |
+
`❌ The PR title does not follow the Conventional Commit format.
|
| 11 |
+
|
| 12 |
+
**Current title:** "${prTitle}"
|
| 13 |
+
|
| 14 |
+
**Expected formats:**
|
| 15 |
+
- \`feat: add login functionality\`
|
| 16 |
+
- \`fix: correct redirect bug\`
|
| 17 |
+
- \`chore: update dependency xyz\`
|
| 18 |
+
- \`feat(auth): add OAuth integration\`
|
| 19 |
+
|
| 20 |
+
**Supported prefixes:**
|
| 21 |
+
- \`feat\` - new features
|
| 22 |
+
- \`fix\` - bug fixes
|
| 23 |
+
- \`chore\` - maintenance tasks
|
| 24 |
+
- \`docs\` - documentation changes
|
| 25 |
+
- \`style\` - formatting changes
|
| 26 |
+
- \`refactor\` - code refactoring
|
| 27 |
+
- \`test\` - test additions/changes
|
| 28 |
+
- \`perf\` - performance improvements
|
| 29 |
+
- \`build\` - build system changes
|
| 30 |
+
- \`ci\` - CI configuration changes
|
| 31 |
+
- \`revert\` - reverting changes
|
| 32 |
+
|
| 33 |
+
Please update your PR title to match one of these formats.`,
|
| 34 |
+
);
|
| 35 |
+
} else {
|
| 36 |
+
message("✅ PR title follows Conventional Commit format!");
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
if (prTitle.length > 100) {
|
| 40 |
+
warn("⚠️ PR title is quite long. Consider keeping it under 100 characters.");
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
if (prTitle.length < 10) {
|
| 44 |
+
warn("⚠️ PR title seems too short. Consider being more descriptive.");
|
| 45 |
+
}
|
.github/FUNDING.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
github: cgoinglove
|
.github/release-please-config.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"changelog-type": "github"
|
| 3 |
+
}
|
.github/workflows/container.yaml
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Publish Containers
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches:
|
| 6 |
+
- main
|
| 7 |
+
release:
|
| 8 |
+
types: [published]
|
| 9 |
+
workflow_dispatch:
|
| 10 |
+
|
| 11 |
+
jobs:
|
| 12 |
+
|
| 13 |
+
release-container:
|
| 14 |
+
runs-on: ubuntu-latest
|
| 15 |
+
permissions:
|
| 16 |
+
contents: read
|
| 17 |
+
packages: write
|
| 18 |
+
attestations: write
|
| 19 |
+
id-token: write
|
| 20 |
+
env:
|
| 21 |
+
REGISTRY: ghcr.io
|
| 22 |
+
IMAGE_NAME: ${{ github.repository }}
|
| 23 |
+
|
| 24 |
+
steps:
|
| 25 |
+
- name: Checkout repository
|
| 26 |
+
uses: actions/checkout@v4
|
| 27 |
+
- name: Log in to the Container registry
|
| 28 |
+
uses: docker/login-action@v3
|
| 29 |
+
with:
|
| 30 |
+
registry: ${{ env.REGISTRY }}
|
| 31 |
+
username: ${{ github.actor }}
|
| 32 |
+
password: ${{ secrets.GITHUB_TOKEN }}
|
| 33 |
+
- name: Extract metadata (tags, labels) for Docker
|
| 34 |
+
id: meta
|
| 35 |
+
uses: docker/metadata-action@v5
|
| 36 |
+
with:
|
| 37 |
+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
| 38 |
+
- name: Build and push Docker image
|
| 39 |
+
id: push
|
| 40 |
+
uses: docker/build-push-action@v6
|
| 41 |
+
with:
|
| 42 |
+
context: .
|
| 43 |
+
file: docker/Dockerfile
|
| 44 |
+
push: true
|
| 45 |
+
tags: ${{ steps.meta.outputs.tags }}
|
| 46 |
+
labels: ${{ steps.meta.outputs.labels }}
|
| 47 |
+
|
| 48 |
+
- name: Generate artifact attestation
|
| 49 |
+
uses: actions/attest-build-provenance@v2
|
| 50 |
+
with:
|
| 51 |
+
subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
|
| 52 |
+
subject-digest: ${{ steps.push.outputs.digest }}
|
| 53 |
+
push-to-registry: true
|
.github/workflows/e2e-tests.yml
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: E2E Tests
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches: [main, develop]
|
| 6 |
+
pull_request:
|
| 7 |
+
branches: [main]
|
| 8 |
+
|
| 9 |
+
jobs:
|
| 10 |
+
e2e:
|
| 11 |
+
runs-on: ubuntu-latest
|
| 12 |
+
timeout-minutes: 30
|
| 13 |
+
|
| 14 |
+
env:
|
| 15 |
+
# Database
|
| 16 |
+
POSTGRES_URL: postgresql://testuser:testpass@localhost:5432/better_chatbot_test
|
| 17 |
+
|
| 18 |
+
# Authentication
|
| 19 |
+
BETTER_AUTH_SECRET: test-secret-key-for-ci-only-not-for-production-use
|
| 20 |
+
BETTER_AUTH_URL: http://localhost:3000
|
| 21 |
+
|
| 22 |
+
# Application
|
| 23 |
+
NEXT_PUBLIC_BASE_URL: http://localhost:3000
|
| 24 |
+
|
| 25 |
+
# LLM Provider (OpenRouter with free models)
|
| 26 |
+
OPENROUTER_API_KEY: ${{ secrets.E2E_OPENROUTER_API_KEY || 'test-key' }}
|
| 27 |
+
E2E_DEFAULT_MODEL: openRouter/gemini-2.0-flash-exp:free
|
| 28 |
+
|
| 29 |
+
# Feature flags
|
| 30 |
+
DISABLE_SIGN_UP: 0
|
| 31 |
+
DISABLE_EMAIL_SIGN_IN: 0
|
| 32 |
+
FILE_BASED_MCP_CONFIG: false
|
| 33 |
+
|
| 34 |
+
services:
|
| 35 |
+
postgres:
|
| 36 |
+
image: postgres:17
|
| 37 |
+
env:
|
| 38 |
+
POSTGRES_USER: testuser
|
| 39 |
+
POSTGRES_PASSWORD: testpass
|
| 40 |
+
POSTGRES_DB: better_chatbot_test
|
| 41 |
+
options: >-
|
| 42 |
+
--health-cmd pg_isready
|
| 43 |
+
--health-interval 10s
|
| 44 |
+
--health-timeout 5s
|
| 45 |
+
--health-retries 5
|
| 46 |
+
ports:
|
| 47 |
+
- 5432:5432
|
| 48 |
+
|
| 49 |
+
steps:
|
| 50 |
+
- uses: actions/checkout@v4
|
| 51 |
+
|
| 52 |
+
- uses: pnpm/action-setup@v3
|
| 53 |
+
with:
|
| 54 |
+
version: 10.2.1
|
| 55 |
+
|
| 56 |
+
- uses: actions/setup-node@v4
|
| 57 |
+
with:
|
| 58 |
+
node-version: '20'
|
| 59 |
+
cache: 'pnpm'
|
| 60 |
+
|
| 61 |
+
- name: Get pnpm store directory
|
| 62 |
+
id: pnpm-cache
|
| 63 |
+
shell: bash
|
| 64 |
+
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
| 65 |
+
|
| 66 |
+
- uses: actions/cache@v4
|
| 67 |
+
name: Setup pnpm cache
|
| 68 |
+
with:
|
| 69 |
+
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
|
| 70 |
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
| 71 |
+
restore-keys: |
|
| 72 |
+
${{ runner.os }}-pnpm-store-
|
| 73 |
+
|
| 74 |
+
- name: Install dependencies
|
| 75 |
+
run: pnpm install --frozen-lockfile
|
| 76 |
+
|
| 77 |
+
- name: Install Playwright browsers
|
| 78 |
+
run: pnpm playwright install chromium --with-deps
|
| 79 |
+
|
| 80 |
+
- name: Setup test environment
|
| 81 |
+
run: |
|
| 82 |
+
# Create minimal .env for Playwright (only non-runtime vars if needed)
|
| 83 |
+
touch .env
|
| 84 |
+
|
| 85 |
+
- name: Run database migrations
|
| 86 |
+
run: pnpm db:migrate
|
| 87 |
+
|
| 88 |
+
- name: Seed test users once before all tests
|
| 89 |
+
run: pnpm test:e2e:seed
|
| 90 |
+
|
| 91 |
+
- name: Build application
|
| 92 |
+
run: pnpm build:local
|
| 93 |
+
|
| 94 |
+
- name: Run E2E tests
|
| 95 |
+
run: pnpm test:e2e
|
| 96 |
+
|
| 97 |
+
- uses: actions/upload-artifact@v4
|
| 98 |
+
if: always()
|
| 99 |
+
with:
|
| 100 |
+
name: playwright-report
|
| 101 |
+
path: playwright-report/
|
| 102 |
+
retention-days: 30
|
.github/workflows/lint-and-type-check.yml
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Lint and Type Check
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
pull_request:
|
| 5 |
+
branches: [main]
|
| 6 |
+
|
| 7 |
+
jobs:
|
| 8 |
+
lint_and_type_check:
|
| 9 |
+
runs-on: ubuntu-latest
|
| 10 |
+
|
| 11 |
+
steps:
|
| 12 |
+
- name: Checkout code
|
| 13 |
+
uses: actions/checkout@v2
|
| 14 |
+
|
| 15 |
+
- name: Set up Node.js
|
| 16 |
+
uses: actions/setup-node@v3
|
| 17 |
+
with:
|
| 18 |
+
node-version: '20'
|
| 19 |
+
|
| 20 |
+
- name: Install pnpm
|
| 21 |
+
uses: pnpm/action-setup@v2
|
| 22 |
+
with:
|
| 23 |
+
version: 8
|
| 24 |
+
run_install: false
|
| 25 |
+
|
| 26 |
+
- name: Setup pnpm cache
|
| 27 |
+
uses: actions/cache@v3
|
| 28 |
+
with:
|
| 29 |
+
path: ~/.pnpm-store
|
| 30 |
+
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
|
| 31 |
+
restore-keys: |
|
| 32 |
+
${{ runner.os }}-pnpm-store-
|
| 33 |
+
|
| 34 |
+
- name: Install dependencies
|
| 35 |
+
run: pnpm install
|
| 36 |
+
|
| 37 |
+
- name: Run Lint
|
| 38 |
+
run: pnpm lint
|
| 39 |
+
|
| 40 |
+
- name: Run Type Check
|
| 41 |
+
run: pnpm check-types
|
| 42 |
+
|
| 43 |
+
- name: Run Tests
|
| 44 |
+
run: pnpm test
|
.github/workflows/pr-check.yml
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: PR Title Check
|
| 2 |
+
permissions:
|
| 3 |
+
contents: write
|
| 4 |
+
pull-requests: write
|
| 5 |
+
issues: write
|
| 6 |
+
statuses: write
|
| 7 |
+
checks: write
|
| 8 |
+
on:
|
| 9 |
+
pull_request:
|
| 10 |
+
types: [opened, synchronize, reopened, edited]
|
| 11 |
+
|
| 12 |
+
jobs:
|
| 13 |
+
danger:
|
| 14 |
+
runs-on: ubuntu-latest
|
| 15 |
+
|
| 16 |
+
steps:
|
| 17 |
+
- name: Checkout
|
| 18 |
+
uses: actions/checkout@v4
|
| 19 |
+
|
| 20 |
+
- name: Install Node.js
|
| 21 |
+
uses: actions/setup-node@v4
|
| 22 |
+
with:
|
| 23 |
+
node-version: 20
|
| 24 |
+
|
| 25 |
+
- name: Run Danger
|
| 26 |
+
run: npx danger ci --dangerfile=./.github/.dangerfile.ts
|
| 27 |
+
env:
|
| 28 |
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
.github/workflows/release.yml
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: release-please
|
| 2 |
+
|
| 3 |
+
on:
|
| 4 |
+
push:
|
| 5 |
+
branches:
|
| 6 |
+
- main
|
| 7 |
+
|
| 8 |
+
permissions:
|
| 9 |
+
contents: write
|
| 10 |
+
pull-requests: write
|
| 11 |
+
|
| 12 |
+
jobs:
|
| 13 |
+
release-please:
|
| 14 |
+
runs-on: ubuntu-latest
|
| 15 |
+
steps:
|
| 16 |
+
- uses: googleapis/release-please-action@v4
|
| 17 |
+
id: release
|
| 18 |
+
with:
|
| 19 |
+
token: ${{ secrets.GITHUB_TOKEN }}
|
| 20 |
+
release-type: node
|
| 21 |
+
config-file: ./.github/release-please-config.json
|
| 22 |
+
|
| 23 |
+
- name: Checkout repository
|
| 24 |
+
if: ${{ steps.release.outputs.release_created }}
|
| 25 |
+
uses: actions/checkout@v4
|
| 26 |
+
with:
|
| 27 |
+
token: ${{ secrets.GITHUB_TOKEN }}
|
| 28 |
+
fetch-depth: 0
|
| 29 |
+
|
| 30 |
+
- name: Add Authors and Update Release
|
| 31 |
+
if: ${{ steps.release.outputs.release_created }}
|
| 32 |
+
env:
|
| 33 |
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
| 34 |
+
RELEASE_TAG: ${{ steps.release.outputs.tag_name }}
|
| 35 |
+
run: |
|
| 36 |
+
set -e
|
| 37 |
+
|
| 38 |
+
echo "Starting 'Add Authors and Update Release' step..."
|
| 39 |
+
echo "Release tag detected: $RELEASE_TAG"
|
| 40 |
+
|
| 41 |
+
TEMP_CHANGELOG="CHANGELOG.md.new"
|
| 42 |
+
touch "$TEMP_CHANGELOG"
|
| 43 |
+
echo "Created temporary changelog file: $TEMP_CHANGELOG"
|
| 44 |
+
|
| 45 |
+
if [ -f "CHANGELOG.md" ]; then
|
| 46 |
+
echo "CHANGELOG.md found. Processing to add authors..."
|
| 47 |
+
while IFS= read -r line; do
|
| 48 |
+
# Check if the line already ends with " by @username"
|
| 49 |
+
if [[ "$line" =~ \)\ by\ @[[:alnum:]_-]+$ ]]; then
|
| 50 |
+
echo " Line already has author, copying as is: $line"
|
| 51 |
+
echo "$line" >> "$TEMP_CHANGELOG"
|
| 52 |
+
continue
|
| 53 |
+
fi
|
| 54 |
+
|
| 55 |
+
# If not, check if it's a commit line and add author
|
| 56 |
+
if [[ "$line" =~ \*\ (.*)\ \(\[([a-f0-9]{7,40})\]\(.*\)\) ]]; then
|
| 57 |
+
commit_hash="${BASH_REMATCH[2]}"
|
| 58 |
+
echo " Found commit hash: $commit_hash in line: $line"
|
| 59 |
+
github_user=$(gh api "repos/${{ github.repository }}/commits/${commit_hash}" | jq -r '.author.login // "unknown"')
|
| 60 |
+
echo " Fetched GitHub user for commit $commit_hash: @${github_user}"
|
| 61 |
+
echo "${line} by @${github_user}" >> "$TEMP_CHANGELOG"
|
| 62 |
+
else
|
| 63 |
+
# Copy other lines without modification
|
| 64 |
+
echo " Copying line without modification: $line"
|
| 65 |
+
echo "$line" >> "$TEMP_CHANGELOG"
|
| 66 |
+
fi
|
| 67 |
+
done < "CHANGELOG.md"
|
| 68 |
+
echo "Finished processing CHANGELOG.md. Moving temporary file to original."
|
| 69 |
+
else
|
| 70 |
+
echo "CHANGELOG.md not found. Skipping author addition to changelog content."
|
| 71 |
+
fi
|
| 72 |
+
|
| 73 |
+
mv "$TEMP_CHANGELOG" "CHANGELOG.md"
|
| 74 |
+
echo "CHANGELOG.md updated with author information."
|
| 75 |
+
|
| 76 |
+
echo "Extracting release body for tag: $RELEASE_TAG"
|
| 77 |
+
RELEASE_BODY=$(awk "/^## \\[?${RELEASE_TAG#v}/{flag=1;next} /^## / && flag{exit} flag" CHANGELOG.md)
|
| 78 |
+
|
| 79 |
+
if [ -z "$RELEASE_BODY" ]; then
|
| 80 |
+
echo "Warning: Could not find release notes for $RELEASE_TAG in CHANGELOG.md."
|
| 81 |
+
echo "Using a default message for release body."
|
| 82 |
+
RELEASE_BODY="Release $RELEASE_TAG"
|
| 83 |
+
else
|
| 84 |
+
echo "Successfully extracted release body for $RELEASE_TAG."
|
| 85 |
+
echo "Release Body Preview:"
|
| 86 |
+
echo "---"
|
| 87 |
+
echo "$RELEASE_BODY" | head -n 5
|
| 88 |
+
echo "---"
|
| 89 |
+
fi
|
| 90 |
+
|
| 91 |
+
echo "Attempting to edit GitHub release $RELEASE_TAG with extracted notes."
|
| 92 |
+
gh release edit "$RELEASE_TAG" --notes "$RELEASE_BODY"
|
| 93 |
+
echo "GitHub release $RELEASE_TAG updated successfully."
|
| 94 |
+
|
| 95 |
+
echo "Configuring git user for commit."
|
| 96 |
+
git config user.name "github-actions[bot]"
|
| 97 |
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
| 98 |
+
echo "Adding CHANGELOG.md to git index."
|
| 99 |
+
git add CHANGELOG.md
|
| 100 |
+
echo "Attempting to commit changes to CHANGELOG.md."
|
| 101 |
+
git commit -m "update CHANGELOG.md with author info [skip ci] [skip release]" || echo "No changes to commit for CHANGELOG.md or commit failed (this is expected if no changes)."
|
| 102 |
+
git push
|
.gitignore
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
| 2 |
+
|
| 3 |
+
# dependencies
|
| 4 |
+
/node_modules
|
| 5 |
+
/.pnp
|
| 6 |
+
.pnp.*
|
| 7 |
+
.yarn/*
|
| 8 |
+
!.yarn/patches
|
| 9 |
+
!.yarn/plugins
|
| 10 |
+
!.yarn/releases
|
| 11 |
+
!.yarn/versions
|
| 12 |
+
|
| 13 |
+
# testing
|
| 14 |
+
/coverage
|
| 15 |
+
/tests/.auth
|
| 16 |
+
test-results/
|
| 17 |
+
playwright-report/
|
| 18 |
+
.env.test
|
| 19 |
+
|
| 20 |
+
# next.js
|
| 21 |
+
/.next/
|
| 22 |
+
/out/
|
| 23 |
+
|
| 24 |
+
# production
|
| 25 |
+
/build
|
| 26 |
+
|
| 27 |
+
# misc
|
| 28 |
+
.DS_Store
|
| 29 |
+
*.pem
|
| 30 |
+
*.local.*
|
| 31 |
+
|
| 32 |
+
# debug
|
| 33 |
+
npm-debug.log*
|
| 34 |
+
yarn-debug.log*
|
| 35 |
+
yarn-error.log*
|
| 36 |
+
.pnpm-debug.log*
|
| 37 |
+
|
| 38 |
+
# env files (can opt-in for committing if needed)
|
| 39 |
+
.env
|
| 40 |
+
.env.*
|
| 41 |
+
!.env.example
|
| 42 |
+
|
| 43 |
+
# vercel
|
| 44 |
+
.vercel
|
| 45 |
+
|
| 46 |
+
# typescript
|
| 47 |
+
*.tsbuildinfo
|
| 48 |
+
next-env.d.ts
|
| 49 |
+
.local-cache
|
| 50 |
+
|
| 51 |
+
# memory-bank
|
| 52 |
+
/memory-bank
|
| 53 |
+
|
| 54 |
+
local-data
|
| 55 |
+
|
| 56 |
+
.cursorrules
|
| 57 |
+
.cursor
|
| 58 |
+
*.ignore
|
| 59 |
+
.mcp-config.json
|
| 60 |
+
openai-compatible.config.ts
|
| 61 |
+
certificates
|
| 62 |
+
public/uploads
|
.husky/pre-commit
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
pnpm exec lint-staged
|
.vscode/extensions.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"recommendations": ["biomejs.biome", "ms-playwright.playwright"]
|
| 3 |
+
}
|
.vscode/settings.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"editor.formatOnSave": true,
|
| 3 |
+
"[javascript]": {
|
| 4 |
+
"editor.defaultFormatter": "biomejs.biome"
|
| 5 |
+
},
|
| 6 |
+
"[typescript]": {
|
| 7 |
+
"editor.defaultFormatter": "biomejs.biome"
|
| 8 |
+
},
|
| 9 |
+
"[typescriptreact]": {
|
| 10 |
+
"editor.defaultFormatter": "biomejs.biome"
|
| 11 |
+
},
|
| 12 |
+
"typescript.tsdk": "node_modules/typescript/lib",
|
| 13 |
+
"eslint.workingDirectories": [
|
| 14 |
+
{ "pattern": "app/*" },
|
| 15 |
+
{ "pattern": "packages/*" }
|
| 16 |
+
]
|
| 17 |
+
}
|
AGENTS.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Repository Guidelines
|
| 2 |
+
|
| 3 |
+
## Project Structure & Module Organization
|
| 4 |
+
- App code lives in `src`.
|
| 5 |
+
- `src/app` (Next.js routes, API, middleware)
|
| 6 |
+
- `src/components` (UI; reusable components in PascalCase)
|
| 7 |
+
- `src/lib` (helpers: auth, db, ai, validations, etc.)
|
| 8 |
+
- `src/hooks` (React hooks: `useX`)
|
| 9 |
+
- Assets in `public/`. End‑to‑end tests in `tests/`. Scripts in `scripts/`. Docker files in `docker/`.
|
| 10 |
+
|
| 11 |
+
## Build, Test, and Development Commands
|
| 12 |
+
- `pnpm dev` — Run the app locally (Next.js dev server).
|
| 13 |
+
- `pnpm build` / `pnpm start` — Production build and run.
|
| 14 |
+
- `pnpm lint` / `pnpm lint:fix` — ESLint + Biome checks and autofix.
|
| 15 |
+
- `pnpm format` — Format with Biome.
|
| 16 |
+
- `pnpm test` / `pnpm test:watch` — Unit tests (Vitest).
|
| 17 |
+
- `pnpm test:e2e` — Playwright tests; uses `playwright.config.ts` webServer.
|
| 18 |
+
- DB: `pnpm db:push`, `pnpm db:studio`, `pnpm db:migrate` (Drizzle Kit).
|
| 19 |
+
- Docker: `pnpm docker-compose:up` / `:down` to run local stack.
|
| 20 |
+
|
| 21 |
+
## Coding Style & Naming Conventions
|
| 22 |
+
- TypeScript everywhere. Prefer `zod` for validation.
|
| 23 |
+
- Formatting via Biome: 2 spaces, LF, width 80, double quotes.
|
| 24 |
+
- Components: `PascalCase.tsx`; hooks/utilities: `camelCase.ts`.
|
| 25 |
+
- Co-locate small module tests next to code; larger suites under `tests/`.
|
| 26 |
+
- Keep modules focused; avoid circular deps; use `src/lib` for shared logic.
|
| 27 |
+
|
| 28 |
+
## Testing Guidelines
|
| 29 |
+
- Unit tests: Vitest, filename `*.test.ts(x)`.
|
| 30 |
+
- E2E: Playwright under `tests/`, filename `*.spec.ts`.
|
| 31 |
+
- Run locally: `pnpm test` and `pnpm test:e2e` (ensure app is running or let Playwright start via config).
|
| 32 |
+
- Add tests for new features and bug fixes; cover happy path + one failure mode.
|
| 33 |
+
|
| 34 |
+
## Commit & Pull Request Guidelines
|
| 35 |
+
- Conventional Commits: `feat:`, `fix:`, `chore:`, `docs:`, etc. Example: `feat: add image generation tool`.
|
| 36 |
+
- Branch names: `feat/…`, `fix/…`, `chore/…`.
|
| 37 |
+
- PRs: clear description, linked issues, screenshots or terminal output when UI/CLI changes; list test coverage and manual steps.
|
| 38 |
+
- Before opening PR: `pnpm check` (lint+types+tests) should pass.
|
| 39 |
+
|
| 40 |
+
## Security & Configuration Tips
|
| 41 |
+
- Copy `.env.example` to `.env`; never commit secrets. For local HTTP use `NO_HTTPS=1` or `pnpm build:local`.
|
| 42 |
+
- If using DB/Redis locally, start services via Docker scripts or your own stack.
|
CHANGELOG.md
ADDED
|
@@ -0,0 +1,314 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Changelog
|
| 2 |
+
|
| 3 |
+
## [1.26.0](https://github.com/cgoinglove/better-chatbot/compare/v1.25.0...v1.26.0) (2025-11-07)
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
### Features
|
| 7 |
+
|
| 8 |
+
* add LaTeX/TeX math equation rendering support ([#318](https://github.com/cgoinglove/better-chatbot/issues/318)) ([c0a8b5b](https://github.com/cgoinglove/better-chatbot/commit/c0a8b5b9b28599716013c83cac03fa5745ffd403)) by @jezweb
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
### Bug Fixes
|
| 12 |
+
|
| 13 |
+
* hide MCP server credentials from non-owners ([#317](https://github.com/cgoinglove/better-chatbot/issues/317)) ([#319](https://github.com/cgoinglove/better-chatbot/issues/319)) ([6e32417](https://github.com/cgoinglove/better-chatbot/commit/6e32417535c27f1215f96d68b7302dba4a1b904d)) by @jezweb
|
| 14 |
+
|
| 15 |
+
## [1.25.0](https://github.com/cgoinglove/better-chatbot/compare/v1.24.0...v1.25.0) (2025-10-30)
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
### Features
|
| 19 |
+
|
| 20 |
+
* s3 storage and richer file support ([#301](https://github.com/cgoinglove/better-chatbot/issues/301)) ([051a974](https://github.com/cgoinglove/better-chatbot/commit/051a9740a6ecf774bfead9ce327c376ea5b279a5)) by @mrjasonroy
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
### Bug Fixes
|
| 24 |
+
|
| 25 |
+
* model name for gpt-4.1-mini in staticModels ([#299](https://github.com/cgoinglove/better-chatbot/issues/299)) ([4513ac0](https://github.com/cgoinglove/better-chatbot/commit/4513ac0e842f588a24d7075af8700e3cc7a3eb39)) by @mayur9210
|
| 26 |
+
|
| 27 |
+
## [1.24.0](https://github.com/cgoinglove/better-chatbot/compare/v1.23.0...v1.24.0) (2025-10-06)
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
### Features
|
| 31 |
+
|
| 32 |
+
* generate image Tool (Nano Banana) ([#284](https://github.com/cgoinglove/better-chatbot/issues/284)) ([984ce66](https://github.com/cgoinglove/better-chatbot/commit/984ce665ceef7225870f4eb751afaf65bf8a2dd4)) by @cgoinglove
|
| 33 |
+
* openai image generate ([#287](https://github.com/cgoinglove/better-chatbot/issues/287)) ([0deef6e](https://github.com/cgoinglove/better-chatbot/commit/0deef6e8a83196afb1f44444ab2f13415de20e73)) by @cgoinglove
|
| 34 |
+
|
| 35 |
+
## [1.23.0](https://github.com/cgoinglove/better-chatbot/compare/v1.22.0...v1.23.0) (2025-10-04)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
### Features
|
| 39 |
+
|
| 40 |
+
* export chat thread ([#278](https://github.com/cgoinglove/better-chatbot/issues/278)) ([23e79cd](https://github.com/cgoinglove/better-chatbot/commit/23e79cd570c24bab0abc496eca639bfffcb6060b)) by @cgoinglove
|
| 41 |
+
* **file-storage:** image uploads, generate profile with ai ([#257](https://github.com/cgoinglove/better-chatbot/issues/257)) ([46eb43f](https://github.com/cgoinglove/better-chatbot/commit/46eb43f84792d48c450f3853b48b24419f67c7a1)) by @brrock
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
### Bug Fixes
|
| 45 |
+
|
| 46 |
+
* Apply DISABLE_SIGN_UP to OAuth providers ([#282](https://github.com/cgoinglove/better-chatbot/issues/282)) ([bcc0db8](https://github.com/cgoinglove/better-chatbot/commit/bcc0db8eb81997e54e8904e64fc76229fbfc1338)) by @cgoing-bot
|
| 47 |
+
* ollama disable issue ([#283](https://github.com/cgoinglove/better-chatbot/issues/283)) ([5e0a690](https://github.com/cgoinglove/better-chatbot/commit/5e0a690bb6c3f074680d13e09165ca9fff139f93)) by @cgoinglove
|
| 48 |
+
|
| 49 |
+
## [1.22.0](https://github.com/cgoinglove/better-chatbot/compare/v1.21.0...v1.22.0) (2025-09-25)
|
| 50 |
+
|
| 51 |
+
### Features
|
| 52 |
+
|
| 53 |
+
- admin and roles ([#270](https://github.com/cgoinglove/better-chatbot/issues/270)) ([63bddca](https://github.com/cgoinglove/better-chatbot/commit/63bddcaa4bc62bc85204a0982a06f2bed09fc5f5)) by @mrjasonroy
|
| 54 |
+
- groq provider ([#268](https://github.com/cgoinglove/better-chatbot/issues/268)) ([aef213d](https://github.com/cgoinglove/better-chatbot/commit/aef213d2f9dd0255996cc4184b03425db243cd7b)) by @cgoinglove
|
| 55 |
+
- hide LLM providers without API keys in model selection ([#269](https://github.com/cgoinglove/better-chatbot/issues/269)) ([63c15dd](https://github.com/cgoinglove/better-chatbot/commit/63c15dd386ea99b8fa56f7b6cb1e58e5779b525d)) by @cgoinglove
|
| 56 |
+
- **voice-chat:** binding agent tools ([#275](https://github.com/cgoinglove/better-chatbot/issues/275)) ([ed45e82](https://github.com/cgoinglove/better-chatbot/commit/ed45e822eb36447f2a02ef3aa69eeec88009e357)) by @cgoinglove
|
| 57 |
+
|
| 58 |
+
### Bug Fixes
|
| 59 |
+
|
| 60 |
+
- ensure PKCE works for MCP Server auth ([#256](https://github.com/cgoinglove/better-chatbot/issues/256)) ([09b938f](https://github.com/cgoinglove/better-chatbot/commit/09b938f17ca78993a1c7b84c5a702b95159542b2)) by @jvg123
|
| 61 |
+
|
| 62 |
+
## [1.21.0](https://github.com/cgoinglove/better-chatbot/compare/v1.20.2...v1.21.0) (2025-08-24)
|
| 63 |
+
|
| 64 |
+
### Features
|
| 65 |
+
|
| 66 |
+
- agent sharing ([#226](https://github.com/cgoinglove/better-chatbot/issues/226)) ([090dd8f](https://github.com/cgoinglove/better-chatbot/commit/090dd8f4bf4fb82beb2cd9bfa0b427425bbbf352)) by @mrjasonroy
|
| 67 |
+
- ai v5 ([#230](https://github.com/cgoinglove/better-chatbot/issues/230)) ([0461879](https://github.com/cgoinglove/better-chatbot/commit/0461879740860055a278c96656328367980fa533)) by @cgoinglove
|
| 68 |
+
- improve markdown table styling ([#244](https://github.com/cgoinglove/better-chatbot/issues/244)) ([7338e04](https://github.com/cgoinglove/better-chatbot/commit/7338e046196f72a7cc8ec7903593d94ecabcc05e)) by @hakonharnes
|
| 69 |
+
|
| 70 |
+
### Bug Fixes
|
| 71 |
+
|
| 72 |
+
- [#111](https://github.com/cgoinglove/better-chatbot/issues/111) prevent MCP server disconnection during long-running tool calls ([#238](https://github.com/cgoinglove/better-chatbot/issues/238)) ([b5bb3dc](https://github.com/cgoinglove/better-chatbot/commit/b5bb3dc40a025648ecd78f547e0e1a2edd8681ca)) by @cgoinglove
|
| 73 |
+
|
| 74 |
+
## [1.20.2](https://github.com/cgoinglove/better-chatbot/compare/v1.20.1...v1.20.2) (2025-08-09)
|
| 75 |
+
|
| 76 |
+
### Bug Fixes
|
| 77 |
+
|
| 78 |
+
- improve error display with better UX and animation handling ([#227](https://github.com/cgoinglove/better-chatbot/issues/227)) ([35d62e0](https://github.com/cgoinglove/better-chatbot/commit/35d62e05bb21760086c184511d8062444619696c)) by @cgoinglove
|
| 79 |
+
- **mcp:** ensure database and memory manager sync across server instances ([#229](https://github.com/cgoinglove/better-chatbot/issues/229)) ([c4b8ebe](https://github.com/cgoinglove/better-chatbot/commit/c4b8ebe9566530986951671e36111a2e529bf592)) by @cgoinglove
|
| 80 |
+
|
| 81 |
+
## [1.20.1](https://github.com/cgoinglove/better-chatbot/compare/v1.20.0...v1.20.1) (2025-08-06)
|
| 82 |
+
|
| 83 |
+
### Bug Fixes
|
| 84 |
+
|
| 85 |
+
- **mcp:** fix MCP infinite loading issue ([#220](https://github.com/cgoinglove/better-chatbot/issues/220)) ([c25e351](https://github.com/cgoinglove/better-chatbot/commit/c25e3515867c76cc5494a67e79711e9343196078)) by @cgoing-bot
|
| 86 |
+
|
| 87 |
+
## [1.20.0](https://github.com/cgoinglove/better-chatbot/compare/v1.19.1...v1.20.0) (2025-08-04)
|
| 88 |
+
|
| 89 |
+
### Features
|
| 90 |
+
|
| 91 |
+
- add qwen3 coder to models file for openrouter ([#206](https://github.com/cgoinglove/better-chatbot/issues/206)) ([3731d00](https://github.com/cgoinglove/better-chatbot/commit/3731d007100ac36a814704f8bde8398ce1378a4e)) by @brrock
|
| 92 |
+
- improve authentication configuration and social login handling ([#211](https://github.com/cgoinglove/better-chatbot/issues/211)) ([cd25937](https://github.com/cgoinglove/better-chatbot/commit/cd25937020710138ab82458e70ea7f6cabfd03ca)) by @mrjasonroy
|
| 93 |
+
- introduce interactive table creation and enhance visualization tools ([#205](https://github.com/cgoinglove/better-chatbot/issues/205)) ([623a736](https://github.com/cgoinglove/better-chatbot/commit/623a736f6895b8737acaa06811088be2dc1d0b3c)) by @cgoing-bot
|
| 94 |
+
- **mcp:** oauth ([#208](https://github.com/cgoinglove/better-chatbot/issues/208)) ([136aded](https://github.com/cgoinglove/better-chatbot/commit/136aded6de716367380ff64c2452d1b4afe4aa7f)) by @cgoinglove
|
| 95 |
+
- **web-search:** replace Tavily API with Exa AI integration ([#204](https://github.com/cgoinglove/better-chatbot/issues/204)) ([7140487](https://github.com/cgoinglove/better-chatbot/commit/7140487dcdadb6c5cb6af08f92b06d42411f7168)) by @cgoing-bot
|
| 96 |
+
|
| 97 |
+
### Bug Fixes
|
| 98 |
+
|
| 99 |
+
- implement responsive horizontal layout for chat mention input with improved UX And generate Agent Prompt ([43ec980](https://github.com/cgoinglove/better-chatbot/commit/43ec98059e0d27ab819491518263df55fb1c9ad3)) by @cgoinglove
|
| 100 |
+
- **mcp:** Safe MCP manager init logic for the Vercel environment ([#202](https://github.com/cgoinglove/better-chatbot/issues/202)) ([708fdfc](https://github.com/cgoinglove/better-chatbot/commit/708fdfcfed70299044a90773d3c9a76c9a139f2f)) by @cgoing-bot
|
| 101 |
+
|
| 102 |
+
## [1.19.1](https://github.com/cgoinglove/better-chatbot/compare/v1.19.0...v1.19.1) (2025-07-29)
|
| 103 |
+
|
| 104 |
+
### Bug Fixes
|
| 105 |
+
|
| 106 |
+
- **agent:** improve agent loading logic and validation handling in EditAgent component [#198](https://github.com/cgoinglove/better-chatbot/issues/198) ([ec034ab](https://github.com/cgoinglove/better-chatbot/commit/ec034ab51dfc656d7378eca1e2b4dc94fbb67863)) by @cgoinglove
|
| 107 |
+
- **agent:** update description field to allow nullish values in ChatMentionSchema ([3e4532d](https://github.com/cgoinglove/better-chatbot/commit/3e4532d4c7b561ad03836c743eefb7cd35fe9e74)) by @cgoinglove
|
| 108 |
+
- **i18n:** update agent description fields in English, Spanish, and French JSON files to improve clarity and consistency ([f07d1c4](https://github.com/cgoinglove/better-chatbot/commit/f07d1c4dc64b96584faa7e558f981199834a5370)) by @cgoinglove
|
| 109 |
+
- Invalid 'tools': array too long. Expected an array with maximum length 128, but got an array with length 217 instead. [#197](https://github.com/cgoinglove/better-chatbot/issues/197) ([b967e3a](https://github.com/cgoinglove/better-chatbot/commit/b967e3a30be3a8a48f3801b916e26ac4d7dd50f4)) by @cgoinglove
|
| 110 |
+
|
| 111 |
+
## [1.19.0](https://github.com/cgoinglove/better-chatbot/compare/v1.18.0...v1.19.0) (2025-07-28)
|
| 112 |
+
|
| 113 |
+
### Features
|
| 114 |
+
|
| 115 |
+
- Add Azure OpenAI provider support with comprehensive testing ([#189](https://github.com/cgoinglove/better-chatbot/issues/189)) ([edad917](https://github.com/cgoinglove/better-chatbot/commit/edad91707d49fcb5d3bd244a77fbaae86527742a)) by @shukyr
|
| 116 |
+
- add bot name preference to user settings ([f4aa588](https://github.com/cgoinglove/better-chatbot/commit/f4aa5885d0be06cc21149d09e604c781e551ec4a)) by @cgoinglove
|
| 117 |
+
- **agent:** agent and archive ([#192](https://github.com/cgoinglove/better-chatbot/issues/192)) ([c63ae17](https://github.com/cgoinglove/better-chatbot/commit/c63ae179363b66bfa4f4b5524bdf27b71166c299)) by @cgoinglove
|
| 118 |
+
|
| 119 |
+
### Bug Fixes
|
| 120 |
+
|
| 121 |
+
- enhance event handling for keyboard shortcuts in chat components ([95dad3b](https://github.com/cgoinglove/better-chatbot/commit/95dad3bd1dac4b6e56be2df35957a849617ba056)) by @cgoinglove
|
| 122 |
+
- refine thinking prompt condition in chat API ([0192151](https://github.com/cgoinglove/better-chatbot/commit/0192151fec1e33f3b7bc1f08b0a9582d66650ef0)) by @cgoinglove
|
| 123 |
+
|
| 124 |
+
## [1.18.0](https://github.com/cgoinglove/better-chatbot/compare/v1.17.1...v1.18.0) (2025-07-24)
|
| 125 |
+
|
| 126 |
+
### Features
|
| 127 |
+
|
| 128 |
+
- add sequential thinking tool and enhance UI components ([#183](https://github.com/cgoinglove/better-chatbot/issues/183)) ([5bcbde2](https://github.com/cgoinglove/better-chatbot/commit/5bcbde2de776b17c3cc1f47f4968b13e22fc65b2)) by @cgoinglove
|
| 129 |
+
|
| 130 |
+
## [1.17.1](https://github.com/cgoinglove/better-chatbot/compare/v1.17.0...v1.17.1) (2025-07-23)
|
| 131 |
+
|
| 132 |
+
### Bug Fixes
|
| 133 |
+
|
| 134 |
+
- ensure thread date fallback to current date in AppSidebarThreads component ([800b504](https://github.com/cgoinglove/better-chatbot/commit/800b50498576cfe1717da4385e2a496ac33ea0ad)) by @cgoinglove
|
| 135 |
+
- link to the config generator correctly ([#184](https://github.com/cgoinglove/better-chatbot/issues/184)) ([1865ecc](https://github.com/cgoinglove/better-chatbot/commit/1865ecc269e567838bc391a3236fcce82c213fc0)) by @brrock
|
| 136 |
+
- python executor ([ea58742](https://github.com/cgoinglove/better-chatbot/commit/ea58742cccd5490844b3139a37171b1b68046f85)) by @cgoinglove
|
| 137 |
+
|
| 138 |
+
## [1.17.0](https://github.com/cgoinglove/better-chatbot/compare/v1.16.0...v1.17.0) (2025-07-18)
|
| 139 |
+
|
| 140 |
+
### Features
|
| 141 |
+
|
| 142 |
+
- add Python execution tool and integrate Pyodide support ([#176](https://github.com/cgoinglove/better-chatbot/issues/176)) ([de2cf7b](https://github.com/cgoinglove/better-chatbot/commit/de2cf7b66444fe64791ed142216277a5f2cdc551)) by @cgoinglove
|
| 143 |
+
|
| 144 |
+
### Bug Fixes
|
| 145 |
+
|
| 146 |
+
- generate title by user message ([9ee4be6](https://github.com/cgoinglove/better-chatbot/commit/9ee4be69c6b90f44134d110e90f9c3da5219c79f)) by @cgoinglove
|
| 147 |
+
- generate title sync ([5f3afdc](https://github.com/cgoinglove/better-chatbot/commit/5f3afdc4cb7304460606b3480f54f513ef24940c)) by @cgoinglove
|
| 148 |
+
|
| 149 |
+
## [1.16.0](https://github.com/cgoinglove/better-chatbot/compare/v1.15.0...v1.16.0) (2025-07-15)
|
| 150 |
+
|
| 151 |
+
### Features
|
| 152 |
+
|
| 153 |
+
- Lazy Chat Title Generation: Save Empty Title First, Then Generate and Upsert in Parallel ([#162](https://github.com/cgoinglove/better-chatbot/issues/162)) ([31dfd78](https://github.com/cgoinglove/better-chatbot/commit/31dfd7802e33d8d4e91aae321c3d16a07fe42552)) by @cgoinglove
|
| 154 |
+
- publish container to GitHub registry ([#149](https://github.com/cgoinglove/better-chatbot/issues/149)) ([9f03cbc](https://github.com/cgoinglove/better-chatbot/commit/9f03cbc1d2890746f14919ebaad60f773b0a333d)) by @codingjoe
|
| 155 |
+
- update mention ux ([#161](https://github.com/cgoinglove/better-chatbot/issues/161)) ([7ceb9c6](https://github.com/cgoinglove/better-chatbot/commit/7ceb9c69c32de25d523a4d14623b25a34ffb3c9d)) by @cgoinglove
|
| 156 |
+
|
| 157 |
+
### Bug Fixes
|
| 158 |
+
|
| 159 |
+
- bug(LineChart): series are incorrectly represented [#165](https://github.com/cgoinglove/better-chatbot/issues/165) ([4e4905c](https://github.com/cgoinglove/better-chatbot/commit/4e4905c0f7f6a3eca73ea2ac06f718fa29b0f821)) by @cgoinglove
|
| 160 |
+
- ignore tool binding on unsupported models (server-side) ([#160](https://github.com/cgoinglove/better-chatbot/issues/160)) ([277b4fe](https://github.com/cgoinglove/better-chatbot/commit/277b4fe986d5b6d9780d9ade83f294d8f34806f6)) by @cgoinglove
|
| 161 |
+
- js executor tool and gemini model version ([#169](https://github.com/cgoinglove/better-chatbot/issues/169)) ([e25e10a](https://github.com/cgoinglove/better-chatbot/commit/e25e10ab9fac4247774b0dee7e01d5f6a4b16191)) by @cgoinglove
|
| 162 |
+
- **scripts:** parse openai compatible on windows ([#164](https://github.com/cgoinglove/better-chatbot/issues/164)) ([41f5ff5](https://github.com/cgoinglove/better-chatbot/commit/41f5ff55b8d17c76a23a2abf4a6e4cb0c4d95dc5)) by @axel7083
|
| 163 |
+
- **workflow-panel:** fix save button width ([#168](https://github.com/cgoinglove/better-chatbot/issues/168)) ([3e66226](https://github.com/cgoinglove/better-chatbot/commit/3e6622630c9cc40ff3d4357e051c45f8c860fc10)) by @axel7083
|
| 164 |
+
|
| 165 |
+
## [1.15.0](https://github.com/cgoinglove/better-chatbot/compare/v1.14.1...v1.15.0) (2025-07-11)
|
| 166 |
+
|
| 167 |
+
### Features
|
| 168 |
+
|
| 169 |
+
- Add js-execution tool and bug fixes(tool call) ([#148](https://github.com/cgoinglove/better-chatbot/issues/148)) ([12b18a1](https://github.com/cgoinglove/better-chatbot/commit/12b18a1cf31a17e565eddc05764b5bd2d0b0edee)) by @cgoinglove
|
| 170 |
+
|
| 171 |
+
### Bug Fixes
|
| 172 |
+
|
| 173 |
+
- enhance ToolModeDropdown with tooltip updates and debounce functionality ([d06db0b](https://github.com/cgoinglove/better-chatbot/commit/d06db0b3e1db34dc4785eb31ebd888d7c2ae0d64)) by @cgoinglove
|
| 174 |
+
|
| 175 |
+
## [1.14.1](https://github.com/cgoinglove/better-chatbot/compare/v1.14.0...v1.14.1) (2025-07-09)
|
| 176 |
+
|
| 177 |
+
### Bug Fixes
|
| 178 |
+
|
| 179 |
+
- tool select ui ([#141](https://github.com/cgoinglove/better-chatbot/issues/141)) ([0795524](https://github.com/cgoinglove/better-chatbot/commit/0795524991a7aa3e17990777ca75381e32eaa547)) by @cgoinglove
|
| 180 |
+
|
| 181 |
+
## [1.14.0](https://github.com/cgoinglove/better-chatbot/compare/v1.13.0...v1.14.0) (2025-07-07)
|
| 182 |
+
|
| 183 |
+
### Features
|
| 184 |
+
|
| 185 |
+
- web-search with images ([bea76b3](https://github.com/cgoinglove/better-chatbot/commit/bea76b3a544d4cf5584fa29e5c509b0aee1d4fee)) by @cgoinglove
|
| 186 |
+
- **workflow:** add auto layout feature for workflow nodes and update UI messages ([0cfbffd](https://github.com/cgoinglove/better-chatbot/commit/0cfbffd631c9ae5c6ed57d47ca5f34b9acbb257d)) by @cgoinglove
|
| 187 |
+
- **workflow:** stable workflow ( add example workflow : baby-research ) ([#137](https://github.com/cgoinglove/better-chatbot/issues/137)) ([c38a7ea](https://github.com/cgoinglove/better-chatbot/commit/c38a7ea748cdb117a4d0f4b886e3d8257a135956)) by @cgoinglove
|
| 188 |
+
|
| 189 |
+
### Bug Fixes
|
| 190 |
+
|
| 191 |
+
- **api:** handle error case in chat route by using orElse for unwrap ([25580a2](https://github.com/cgoinglove/better-chatbot/commit/25580a2a9f6c9fbc4abc29fee362dc4b4f27f9b4)) by @cgoinglove
|
| 192 |
+
- **workflow:** llm structure Output ([c529292](https://github.com/cgoinglove/better-chatbot/commit/c529292ddc1a4b836a5921e25103598afd7e3ab7)) by @cgoinglove
|
| 193 |
+
|
| 194 |
+
## [1.13.0](https://github.com/cgoinglove/better-chatbot/compare/v1.12.1...v1.13.0) (2025-07-04)
|
| 195 |
+
|
| 196 |
+
### Features
|
| 197 |
+
|
| 198 |
+
- Add web search and content extraction tools using Tavily API ([#126](https://github.com/cgoinglove/better-chatbot/issues/126)) ([f7b4ea5](https://github.com/cgoinglove/better-chatbot/commit/f7b4ea5828b33756a83dd881b9afa825796bf69f)) by @cgoing-bot
|
| 199 |
+
|
| 200 |
+
### Bug Fixes
|
| 201 |
+
|
| 202 |
+
- workflow condition node issue ([78b7add](https://github.com/cgoinglove/better-chatbot/commit/78b7addbba51b4553ec5d0ce8961bf90be5d649c)) by @cgoinglove
|
| 203 |
+
- **workflow:** improve mention handling by ensuring empty values are represented correctly ([92ff9c3](https://github.com/cgoinglove/better-chatbot/commit/92ff9c3e14b97d9f58a22f9df2559e479f14537c)) by @cgoinglove
|
| 204 |
+
- **workflow:** simplify mention formatting by removing bold styling for non-empty values ([ef65fd7](https://github.com/cgoinglove/better-chatbot/commit/ef65fd713ab59c7d8464cae480df7626daeff5cd)) by @cgoinglove
|
| 205 |
+
|
| 206 |
+
## [1.12.1](https://github.com/cgoinglove/better-chatbot/compare/v1.12.0...v1.12.1) (2025-07-02)
|
| 207 |
+
|
| 208 |
+
### Bug Fixes
|
| 209 |
+
|
| 210 |
+
- **workflow:** enhance structured output handling and improve user notifications ([dd43de9](https://github.com/cgoinglove/better-chatbot/commit/dd43de99881d64ca0c557e29033e953bcd4adc0e)) by @cgoinglove
|
| 211 |
+
|
| 212 |
+
## [1.12.0](https://github.com/cgoinglove/better-chatbot/compare/v1.11.0...v1.12.0) (2025-07-01)
|
| 213 |
+
|
| 214 |
+
### Features
|
| 215 |
+
|
| 216 |
+
- **chat:** enable [@mention](https://github.com/mention) and tool click to trigger workflow execution in chat ([#122](https://github.com/cgoinglove/better-chatbot/issues/122)) ([b4e7f02](https://github.com/cgoinglove/better-chatbot/commit/b4e7f022fa155ef70be2aee9228a4d1d2643bf10)) by @cgoing-bot
|
| 217 |
+
|
| 218 |
+
### Bug Fixes
|
| 219 |
+
|
| 220 |
+
- clean changlelog and stop duplicate attributions in the changelog file ([#119](https://github.com/cgoinglove/better-chatbot/issues/119)) ([aa970b6](https://github.com/cgoinglove/better-chatbot/commit/aa970b6a2d39ac1f0ca22db761dd452e3c7a5542)) by @brrock
|
| 221 |
+
|
| 222 |
+
## [1.11.0](https://github.com/cgoinglove/better-chatbot/compare/v1.10.0...v1.11.0) (2025-06-28)
|
| 223 |
+
|
| 224 |
+
### Features
|
| 225 |
+
|
| 226 |
+
- **workflow:** Add HTTP and Template nodes with LLM structured output supportWorkflow node ([#117](https://github.com/cgoinglove/better-chatbot/issues/117)) ([10ec438](https://github.com/cgoinglove/better-chatbot/commit/10ec438f13849f0745e7fab652cdd7cef8e97ab6)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 227 |
+
- **workflow:** add HTTP node configuration and execution support ([7d2f65f](https://github.com/cgoinglove/better-chatbot/commit/7d2f65fe4f0fdaae58ca2a69abb04abee3111c60)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 228 |
+
|
| 229 |
+
### Bug Fixes
|
| 230 |
+
|
| 231 |
+
- add POST endpoint for MCP client saving with session validation ([fa005aa](https://github.com/cgoinglove/better-chatbot/commit/fa005aaecbf1f8d9279f5b4ce5ba85343e18202b)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 232 |
+
- split theme system into base themes and style variants ([61ebd07](https://github.com/cgoinglove/better-chatbot/commit/61ebd0745bcfd7a84ba3ad65c3f52b7050b5131a)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 233 |
+
- update ToolMessagePart to use isExecuting state instead of isExpanded ([752f8f0](https://github.com/cgoinglove/better-chatbot/commit/752f8f06e319119569e9ee7c04d621ab1c43ca54)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 234 |
+
|
| 235 |
+
## [1.10.0](https://github.com/cgoinglove/better-chatbot/compare/v1.9.0...v1.10.0) (2025-06-27)
|
| 236 |
+
|
| 237 |
+
### Features
|
| 238 |
+
|
| 239 |
+
- **releases:** add debug logging to the add authors and update release step ([#105](https://github.com/cgoinglove/better-chatbot/issues/105)) ([c855a6a](https://github.com/cgoinglove/better-chatbot/commit/c855a6a94c49dfd93c9a8d1d0932aeda36bd6c7e)) by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock
|
| 240 |
+
- workflow beta ([#100](https://github.com/cgoinglove/better-chatbot/issues/100)) ([2f5ada2](https://github.com/cgoinglove/better-chatbot/commit/2f5ada2a66e8e3cd249094be9d28983e4331d3a1)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 241 |
+
|
| 242 |
+
### Bug Fixes
|
| 243 |
+
|
| 244 |
+
- update tool selection logic in McpServerSelector to maintain current selections ([4103c1b](https://github.com/cgoinglove/better-chatbot/commit/4103c1b828c3e5b513679a3fb9d72bd37301f99d)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 245 |
+
- **workflow:** MPC Tool Response Structure And Workflow ([#113](https://github.com/cgoinglove/better-chatbot/issues/113)) ([836ffd7](https://github.com/cgoinglove/better-chatbot/commit/836ffd7ef5858210bdce44d18ca82a1c8f0fc87f)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 246 |
+
|
| 247 |
+
## [1.9.0](https://github.com/cgoinglove/better-chatbot/compare/v1.8.0...v1.9.0) (2025-06-16)
|
| 248 |
+
|
| 249 |
+
### Features
|
| 250 |
+
|
| 251 |
+
- credit contributors in releases and changlogs ([#104](https://github.com/cgoinglove/better-chatbot/issues/104)) ([e0e4443](https://github.com/cgoinglove/better-chatbot/commit/e0e444382209a36f03b6e898f26ebd805032c306)) by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock
|
| 252 |
+
|
| 253 |
+
### Bug Fixes
|
| 254 |
+
|
| 255 |
+
- increase maxTokens for title generation in chat actions issue [#102](https://github.com/cgoinglove/better-chatbot/issues/102) ([bea2588](https://github.com/cgoinglove/better-chatbot/commit/bea2588e24cf649133e8ce5f3b6391265b604f06)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 256 |
+
- temporary chat initial model ([0393f7a](https://github.com/cgoinglove/better-chatbot/commit/0393f7a190463faf58cbfbca1c21d349a9ff05dc)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 257 |
+
- update adding-openAI-like-providers.md ([#101](https://github.com/cgoinglove/better-chatbot/issues/101)) ([2bb94e7](https://github.com/cgoinglove/better-chatbot/commit/2bb94e7df63a105e33c1d51271751c7b89fead23)) by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock
|
| 258 |
+
- update config file path in release workflow ([7209cbe](https://github.com/cgoinglove/better-chatbot/commit/7209cbeb89bd65b14aee66a40ed1abb5c5f2e018)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 259 |
+
|
| 260 |
+
## [1.8.0](https://github.com/cgoinglove/better-chatbot/compare/v1.7.0...v1.8.0) (2025-06-11)
|
| 261 |
+
|
| 262 |
+
### Features
|
| 263 |
+
|
| 264 |
+
- add openAI compatible provider support ([#92](https://github.com/cgoinglove/better-chatbot/issues/92)) ([6682c9a](https://github.com/cgoinglove/better-chatbot/commit/6682c9a320aff9d91912489661d27ae9bb0f4440)) by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock by @brrock
|
| 265 |
+
|
| 266 |
+
### Bug Fixes
|
| 267 |
+
|
| 268 |
+
- Enhance component styles and configurations ([a7284f1](https://github.com/cgoinglove/better-chatbot/commit/a7284f12ca02ee29f7da4d57e4fe6e8c6ecb2dfc)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 269 |
+
|
| 270 |
+
## [1.7.0](https://github.com/cgoinglove/better-chatbot/compare/v1.6.2...v1.7.0) (2025-06-06)
|
| 271 |
+
|
| 272 |
+
### Features
|
| 273 |
+
|
| 274 |
+
- Per User Custom instructions ([#86](https://github.com/cgoinglove/better-chatbot/issues/86)) ([d45c968](https://github.com/cgoinglove/better-chatbot/commit/d45c9684adfb0d9b163c83f3bb63310eef572279)) by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu by @vineetu
|
| 275 |
+
|
| 276 |
+
## [1.6.2](https://github.com/cgoinglove/better-chatbot/compare/v1.6.1...v1.6.2) (2025-06-04)
|
| 277 |
+
|
| 278 |
+
### Bug Fixes
|
| 279 |
+
|
| 280 |
+
- enhance error handling in chat bot component ([1519799](https://github.com/cgoinglove/better-chatbot/commit/15197996ba1f175db002b06e3eac2765cfae1518)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 281 |
+
- improve session error handling in authentication ([eb15b55](https://github.com/cgoinglove/better-chatbot/commit/eb15b550facf5368f990d58b4b521bf15aecbf72)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 282 |
+
- support OpenAI real-time chat project instructions ([2ebbb5e](https://github.com/cgoinglove/better-chatbot/commit/2ebbb5e68105ef6706340a6cfbcf10b4d481274a)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 283 |
+
- unify SSE and streamable config as RemoteConfig ([#85](https://github.com/cgoinglove/better-chatbot/issues/85)) ([66524a0](https://github.com/cgoinglove/better-chatbot/commit/66524a0398bd49230fcdec73130f1eb574e97477)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 284 |
+
|
| 285 |
+
## [1.6.1](https://github.com/cgoinglove/better-chatbot/compare/v1.6.0...v1.6.1) (2025-06-02)
|
| 286 |
+
|
| 287 |
+
### Bug Fixes
|
| 288 |
+
|
| 289 |
+
- speech ux ([baa849f](https://github.com/cgoinglove/better-chatbot/commit/baa849ff2b6b147ec685c6847834385652fc3191)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 290 |
+
|
| 291 |
+
## [1.6.0](https://github.com/cgoinglove/better-chatbot/compare/v1.5.2...v1.6.0) (2025-06-01)
|
| 292 |
+
|
| 293 |
+
### Features
|
| 294 |
+
|
| 295 |
+
- add husky for formatting and checking commits ([#71](https://github.com/cgoinglove/better-chatbot/issues/71)) ([a379cd3](https://github.com/cgoinglove/better-chatbot/commit/a379cd3e869b5caab5bcaf3b03f5607021f988ef)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 296 |
+
- add Spanish, French, Japanese, and Chinese language support with UI improvements ([#74](https://github.com/cgoinglove/better-chatbot/issues/74)) ([e34d43d](https://github.com/cgoinglove/better-chatbot/commit/e34d43df78767518f0379a434f8ffb1808b17e17)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 297 |
+
- implement cold start-like auto connection for MCP server and simplify status ([#73](https://github.com/cgoinglove/better-chatbot/issues/73)) ([987c442](https://github.com/cgoinglove/better-chatbot/commit/987c4425504d6772e0aefe08b4e1911e4cb285c1)) by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot by @cgoing-bot
|
| 298 |
+
|
| 299 |
+
## [1.5.2](https://github.com/cgoinglove/better-chatbot/compare/v1.5.1...v1.5.2) (2025-06-01)
|
| 300 |
+
|
| 301 |
+
### Features
|
| 302 |
+
|
| 303 |
+
- Add support for Streamable HTTP Transport [#56](https://github.com/cgoinglove/better-chatbot/issues/56) ([8783943](https://github.com/cgoinglove/better-chatbot/commit/878394337e3b490ec2d17bcc302f38c695108d73)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 304 |
+
- implement speech system prompt and update voice chat options for enhanced user interaction ([5a33626](https://github.com/cgoinglove/better-chatbot/commit/5a336260899ab542407c3c26925a147c1a9bba11)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 305 |
+
- update MCP server UI and translations for improved user experience ([1e2fd31](https://github.com/cgoinglove/better-chatbot/commit/1e2fd31f8804669fbcf55a4c54ccf0194a7e797c)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 306 |
+
|
| 307 |
+
### Bug Fixes
|
| 308 |
+
|
| 309 |
+
- enhance mobile UI experience with responsive design adjustments ([2eee8ba](https://github.com/cgoinglove/better-chatbot/commit/2eee8bab078207841f4d30ce7708885c7268302e)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 310 |
+
- UI improvements for mobile experience ([#66](https://github.com/cgoinglove/better-chatbot/issues/66)) ([b4349ab](https://github.com/cgoinglove/better-chatbot/commit/b4349abf75de69f65a44735de2e0988c6d9d42d8)) by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove by @cgoinglove
|
| 311 |
+
|
| 312 |
+
### Miscellaneous Chores
|
| 313 |
+
|
| 314 |
+
- release 1.5.2 ([d185514](https://github.com/cgoinglove/better-chatbot/commit/d1855148cfa53ea99c9639f8856d0e7c58eca020)) by @cgoinglove
|
CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Contributing to better-chatbot
|
| 2 |
+
|
| 3 |
+
Thank you for your interest in contributing to better-chatbot! We welcome contributions from the community and truly appreciate your effort to improve the project.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## Before You Start
|
| 8 |
+
|
| 9 |
+
### 🚨 Feature Requests & Major Changes
|
| 10 |
+
|
| 11 |
+
**For new features or significant changes, please create an issue first to discuss your idea before submitting a PR.**
|
| 12 |
+
|
| 13 |
+
This helps us:
|
| 14 |
+
|
| 15 |
+
- Align on the feature direction and design
|
| 16 |
+
- Avoid duplicate work
|
| 17 |
+
- Ensure the feature fits with the project roadmap
|
| 18 |
+
- Save your valuable time on implementation
|
| 19 |
+
|
| 20 |
+
**What requires discussion:**
|
| 21 |
+
|
| 22 |
+
- New UI components or major UI changes
|
| 23 |
+
- New API endpoints or data models
|
| 24 |
+
- Integration with external services
|
| 25 |
+
- Performance optimizations that change behavior
|
| 26 |
+
- Breaking changes
|
| 27 |
+
|
| 28 |
+
**What doesn't require discussion:**
|
| 29 |
+
|
| 30 |
+
- Bug fixes
|
| 31 |
+
- Documentation improvements
|
| 32 |
+
- Minor UI tweaks
|
| 33 |
+
- Code refactoring (without behavior changes)
|
| 34 |
+
|
| 35 |
+
---
|
| 36 |
+
|
| 37 |
+
## Getting Started
|
| 38 |
+
|
| 39 |
+
1. **Fork this repository** on GitHub.
|
| 40 |
+
|
| 41 |
+
2. **Clone your fork** locally:
|
| 42 |
+
|
| 43 |
+
```bash
|
| 44 |
+
git clone https://github.com/YOUR_USERNAME/better-chatbot.git
|
| 45 |
+
cd better-chatbot
|
| 46 |
+
```
|
| 47 |
+
|
| 48 |
+
3. **Create a new branch** for your changes:
|
| 49 |
+
|
| 50 |
+
```bash
|
| 51 |
+
git checkout -b feature/your-feature-name
|
| 52 |
+
# or
|
| 53 |
+
git checkout -b fix/your-bug-fix
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
4. **Implement your changes**, following the existing code style and structure.
|
| 57 |
+
|
| 58 |
+
For any new logic, please add comprehensive unit tests. For any UI changes, please add or modify e2e tests.
|
| 59 |
+
If you are fixing a bug, please add tests to prevent the same bug from happening again.
|
| 60 |
+
|
| 61 |
+
5. **Test your changes thoroughly**:
|
| 62 |
+
|
| 63 |
+
```bash
|
| 64 |
+
pnpm dev
|
| 65 |
+
pnpm test
|
| 66 |
+
```
|
| 67 |
+
|
| 68 |
+
6. **Run e2e tests**:
|
| 69 |
+
|
| 70 |
+
```bash
|
| 71 |
+
pnpm playwright:install # install playwright browsers
|
| 72 |
+
pnpm test:e2e # run all e2e tests (48 tests covering core functionality)
|
| 73 |
+
|
| 74 |
+
# Optional: run specific test suites
|
| 75 |
+
pnpm test:e2e -- tests/agents/
|
| 76 |
+
pnpm test:e2e -- tests/models/
|
| 77 |
+
|
| 78 |
+
# Debug specific test
|
| 79 |
+
pnpm test:e2e -- tests/agents/agent-visibility.spec.ts --headed
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
**E2E Test Requirements:**
|
| 83 |
+
|
| 84 |
+
- PostgreSQL database (use `pnpm docker:pg` for quick setup)
|
| 85 |
+
- At least one LLM provider API key (OpenAI, Anthropic, or Google)
|
| 86 |
+
- `BETTER_AUTH_SECRET` environment variable set
|
| 87 |
+
|
| 88 |
+
---
|
| 89 |
+
|
| 90 |
+
## Releasing and PR Title Rules
|
| 91 |
+
|
| 92 |
+
We use [Release Please](https://github.com/googleapis/release-please) to automate GitHub releases.
|
| 93 |
+
**Only the Pull Request title** needs to follow the [Conventional Commits](https://www.conventionalcommits.org/) format. Commit messages can be written freely.
|
| 94 |
+
|
| 95 |
+
### ✅ PR Title Examples
|
| 96 |
+
|
| 97 |
+
- `fix: voice chat audio not initializing`
|
| 98 |
+
- `feat: support multi-language UI toggle`
|
| 99 |
+
- `chore: update dependencies`
|
| 100 |
+
|
| 101 |
+
### ⚠️ Important Notes
|
| 102 |
+
|
| 103 |
+
- PR **titles must start** with one of the following prefixes:
|
| 104 |
+
|
| 105 |
+
```
|
| 106 |
+
feat: ...
|
| 107 |
+
fix: ...
|
| 108 |
+
chore: ...
|
| 109 |
+
docs: ...
|
| 110 |
+
style: ...
|
| 111 |
+
refactor: ...
|
| 112 |
+
test: ...
|
| 113 |
+
perf: ...
|
| 114 |
+
build: ...
|
| 115 |
+
```
|
| 116 |
+
|
| 117 |
+
- Only the PR title is used for changelog and versioning
|
| 118 |
+
|
| 119 |
+
- We use **squash merge** to keep the history clean
|
| 120 |
+
|
| 121 |
+
- Changelog entries and GitHub Releases are **automatically generated** after merging
|
| 122 |
+
|
| 123 |
+
---
|
| 124 |
+
|
| 125 |
+
## Submitting a Pull Request
|
| 126 |
+
|
| 127 |
+
1. **Format, check code quality and run tests**:
|
| 128 |
+
|
| 129 |
+
```bash
|
| 130 |
+
pnpm check # lint, type check, and run unit tests
|
| 131 |
+
pnpm test:e2e # run comprehensive e2e test suite (recommended)
|
| 132 |
+
```
|
| 133 |
+
|
| 134 |
+
2. **Commit and push**:
|
| 135 |
+
|
| 136 |
+
```bash
|
| 137 |
+
git add .
|
| 138 |
+
git commit -m "your internal message"
|
| 139 |
+
git push origin your-branch-name
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
3. **Open a Pull Request**:
|
| 143 |
+
|
| 144 |
+
- **Title**: Must follow the Conventional Commit format
|
| 145 |
+
- **Description**: Explain what you changed, why you made the change, and how the changes were verified and tested.
|
| 146 |
+
- Link to related issues, if any
|
| 147 |
+
- **Include screenshots or demos** for any UI changes:
|
| 148 |
+
- **Before/After images** are highly recommended
|
| 149 |
+
- **Screen recordings** for interactive features
|
| 150 |
+
- **Mobile/Desktop views** if responsive changes are made
|
| 151 |
+
|
| 152 |
+
### 📸 Visual Documentation Guidelines
|
| 153 |
+
|
| 154 |
+
When submitting **Issues** or **Pull Requests**:
|
| 155 |
+
|
| 156 |
+
**For UI changes:**
|
| 157 |
+
|
| 158 |
+
- **Always include before/after screenshots** when possible
|
| 159 |
+
- Use **clear, high-quality images** that show the changes
|
| 160 |
+
- **Highlight the changed areas** with arrows or borders if needed
|
| 161 |
+
- For **responsive changes**, include both desktop and mobile views
|
| 162 |
+
- For **interactive features**, consider adding a short screen recording
|
| 163 |
+
|
| 164 |
+
**For feature requests:**
|
| 165 |
+
|
| 166 |
+
- Include **reference images** or **mockups** to illustrate your idea
|
| 167 |
+
- Add **screenshots from similar apps** if applicable
|
| 168 |
+
- Use **diagrams** to explain complex workflows or integrations
|
| 169 |
+
|
| 170 |
+
**For bug reports:**
|
| 171 |
+
|
| 172 |
+
- Include **screenshots** showing the issue
|
| 173 |
+
- Add **console errors** or **network logs** if relevant
|
| 174 |
+
- Show **expected vs actual behavior** with images when possible
|
| 175 |
+
|
| 176 |
+
**Example:**
|
| 177 |
+
|
| 178 |
+
```markdown
|
| 179 |
+
## Before
|
| 180 |
+
|
| 181 |
+

|
| 182 |
+
|
| 183 |
+
## After
|
| 184 |
+
|
| 185 |
+

|
| 186 |
+
|
| 187 |
+
## Reference
|
| 188 |
+
|
| 189 |
+

|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
---
|
| 193 |
+
|
| 194 |
+
## Thank You
|
| 195 |
+
|
| 196 |
+
We sincerely appreciate your contribution to better-chatbot.
|
| 197 |
+
Let’s build a powerful, well tested and lightweight AI experience together! 🚀
|
LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
MIT License
|
| 2 |
+
|
| 3 |
+
Copyright (c) 2025 better-chatbot
|
| 4 |
+
|
| 5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
| 6 |
+
of this software and associated documentation files (the "Software"), to deal
|
| 7 |
+
in the Software without restriction, including without limitation the rights
|
| 8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
| 9 |
+
copies of the Software, and to permit persons to whom the Software is
|
| 10 |
+
furnished to do so, subject to the following conditions:
|
| 11 |
+
|
| 12 |
+
The above copyright notice and this permission notice shall be included in all
|
| 13 |
+
copies or substantial portions of the Software.
|
| 14 |
+
|
| 15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
| 16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
| 17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
| 18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
| 19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| 20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
| 21 |
+
SOFTWARE.
|
README.md
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Better Chatbot
|
| 3 |
+
emoji: 💬
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: indigo
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 3000
|
| 8 |
+
hardware: t4-small
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
**Keinsaas Navigator** - A better open-source AI chatbot for individuals and teams.
|
| 12 |
+
|
| 13 |
+
> Originally created by [Choi Sung Keun](https://github.com/cgoinglove).
|
| 14 |
+
|
| 15 |
+
<img width="1184" height="576" alt="thumbnail" loading="lazy" src="https://github.com/user-attachments/assets/d6ba80ff-a62a-4920-b266-85c4a89d6076" />
|
| 16 |
+
|
| 17 |
+
[](https://modelcontextprotocol.io/introduction)
|
| 18 |
+
[](https://localfirstweb.dev/)
|
| 19 |
+
[](https://discord.gg/gCRu69Upnp)
|
| 20 |
+
|
| 21 |
+
[](<https://vercel.com/new/clone?repository-url=https://github.com/cgoinglove/better-chatbot&env=BETTER_AUTH_SECRET&env=OPENAI_API_KEY&env=GOOGLE_GENERATIVE_AI_API_KEY&env=ANTHROPIC_API_KEY&envDescription=BETTER_AUTH_SECRET+is+required+(enter+any+secret+value).+At+least+one+LLM+provider+API+key+(OpenAI,+Claude,+or+Google)+is+required,+but+you+can+add+all+of+them.+See+the+link+below+for+details.&envLink=https://github.com/cgoinglove/better-chatbot/blob/main/.env.example&demo-title=better-chatbot&demo-description=An+Open-Source+Chatbot+Template+Built+With+Next.js+and+the+AI+SDK+by+Vercel.&products=[{"type":"integration","protocol":"storage","productSlug":"neon","integrationSlug":"neon"},{"type":"integration","protocol":"storage","productSlug":"upstash-kv","integrationSlug":"upstash"},{"type":"blob"}]>)
|
| 22 |
+
|
| 23 |
+
🚀 **[Live Demo](https://app.keinsaas.com/)** | See the experience in action in the [preview](#preview) below!
|
| 24 |
+
|
| 25 |
+
#### Demo Chats
|
| 26 |
+
|
| 27 |
+
- **MCP Tools Demo:** [Chat with Tools](https://better-chatbot-demo.vercel.app/export/a4820921-8012-496b-8a5d-13757050bafe)
|
| 28 |
+
- **Image Generation Demo:** [Chat with Image Generation](https://better-chatbot-demo.vercel.app/export/452ad745-9efb-49ae-9114-10db15f1b827)
|
| 29 |
+
|
| 30 |
+
## Quick Start 🚀
|
| 31 |
+
|
| 32 |
+
> **Get your app running in minutes! No installation or payment required.**
|
| 33 |
+
|
| 34 |
+
You only need **one AI Provider API Key** (OpenAI, Claude, Gemini, etc.). Everything else runs on free tiers - database, file storage, and hosting.
|
| 35 |
+
|
| 36 |
+
👉 **[Click this guide to deploy your site with just a few clicks](docs/tips-guides/vercel.md)**
|
| 37 |
+
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
**Keinsaas Navigator** - A better open-source AI chatbot for individuals and teams, inspired by ChatGPT, Claude, Grok, and Gemini.
|
| 41 |
+
|
| 42 |
+
• **Multi-AI Support** - Integrates all major LLMs: OpenAI, Anthropic, Google, xAI, Ollama, and more
|
| 43 |
+
• **Powerful Tools** - MCP protocol, web search, JS/Python code execution, data visualization
|
| 44 |
+
• **Image Generation** - Create and edit images with AI models (OpenAI, Google Gemini, xAI)
|
| 45 |
+
• **Automation** - Custom agents, visual workflows, artifact generation
|
| 46 |
+
• **Collaboration** - Share agents, workflows, and MCP configurations with your team
|
| 47 |
+
• **Voice Assistant** - Realtime voice chat with full MCP tool integration
|
| 48 |
+
• **Intuitive UX** - Instantly invoke any feature with `@mention`
|
| 49 |
+
• **Quick Start** - Deploy free with Vercel Deploy button
|
| 50 |
+
|
| 51 |
+
Built with Vercel AI SDK and Next.js, combining the best features of leading AI services into one platform.
|
| 52 |
+
|
| 53 |
+
## Table of Contents
|
| 54 |
+
|
| 55 |
+
- [Table of Contents](#table-of-contents)
|
| 56 |
+
- [Preview](#preview)
|
| 57 |
+
- [🧩 Browser Automation with Playwright MCP](#-browser-automation-with-playwright-mcp)
|
| 58 |
+
- [🔗 Visual Workflows as Custom Tools](#-visual-workflows-as-custom-tools)
|
| 59 |
+
- [🤖 Custom Agents](#-custom-agents)
|
| 60 |
+
- [🎙️ Realtime Voice Assistant + MCP Tools](#️-realtime-voice-assistant--mcp-tools)
|
| 61 |
+
- [⚡️ Quick Tool Mentions (`@`) \& Presets](#️-quick-tool-mentions---presets)
|
| 62 |
+
- [🧭 Tool Choice Mode](#-tool-choice-mode)
|
| 63 |
+
- [🛠️ Default Tools](#️-default-tools)
|
| 64 |
+
- [🌐 Web Search](#-web-search)
|
| 65 |
+
- [⚡️ JS,PYTHON Executor](#️-jspython-executor)
|
| 66 |
+
- [📊 Data Visualization Tools](#-data-visualization-tools)
|
| 67 |
+
- [Getting Started](#getting-started)
|
| 68 |
+
- [Quick Start (Docker Compose Version) 🐳](#quick-start-docker-compose-version-)
|
| 69 |
+
- [Quick Start (Local Version) 🚀](#quick-start-local-version-)
|
| 70 |
+
- [Environment Variables](#environment-variables)
|
| 71 |
+
- [📘 Guides](#-guides)
|
| 72 |
+
- [🔌 MCP Server Setup \& Tool Testing](#-mcp-server-setup--tool-testing)
|
| 73 |
+
- [🐳 Docker Hosting Guide](#-docker-hosting-guide)
|
| 74 |
+
- [▲ Vercel Hosting Guide](#-vercel-hosting-guide)
|
| 75 |
+
- [🗂️ File Storage Drivers](#️-file-storage-drivers)
|
| 76 |
+
- [🎯 System Prompts \& Chat Customization](#-system-prompts--chat-customization)
|
| 77 |
+
- [🔐 OAuth Sign-In Setup](#-oauth-sign-in-setup)
|
| 78 |
+
- [🕵🏿 Adding openAI like providers](#-adding-openai-like-providers)
|
| 79 |
+
- [🧪 E2E Testing Guide](#-e2e-testing-guide)
|
| 80 |
+
- [💡 Tips](#-tips)
|
| 81 |
+
- [💬 Temporary Chat Windows](#-temporary-chat-windows)
|
| 82 |
+
- [🗺️ Roadmap](#️-roadmap)
|
| 83 |
+
- [🙌 Contributing](#-contributing)
|
| 84 |
+
- [💬 Join Our Discord](#-join-our-discord)
|
| 85 |
+
|
| 86 |
+
> This project is evolving at lightning speed! ⚡️ We're constantly shipping new features and smashing bugs. **Star this repo** to join the ride and stay in the loop with the latest updates!
|
| 87 |
+
|
| 88 |
+
## Preview
|
| 89 |
+
|
| 90 |
+
Get a feel for the UX — here's a quick look at what's possible.
|
| 91 |
+
|
| 92 |
+
### 🧩 Browser Automation with Playwright MCP
|
| 93 |
+
|
| 94 |
+

|
| 95 |
+
|
| 96 |
+
**Example:** Control a web browser using Microsoft's [playwright-mcp](https://github.com/microsoft/playwright-mcp) tool.
|
| 97 |
+
|
| 98 |
+
- The LLM autonomously decides how to use tools from the MCP server, calling them multiple times to complete a multi-step task and return a final message.
|
| 99 |
+
|
| 100 |
+
Sample prompt:
|
| 101 |
+
|
| 102 |
+
```prompt
|
| 103 |
+
1. Use the @tool('web-search') to look up information about “modelcontetprotocol.”
|
| 104 |
+
|
| 105 |
+
2. Then, using : @mcp("playwright")
|
| 106 |
+
- navigate Google (https://www.google.com)
|
| 107 |
+
- Click the “Login” button
|
| 108 |
+
- Enter my email address (neo.cgoing@gmail.com)
|
| 109 |
+
- Clock the "Next" button
|
| 110 |
+
- Close the browser
|
| 111 |
+
```
|
| 112 |
+
|
| 113 |
+
<br/>
|
| 114 |
+
|
| 115 |
+
### 🔗 Visual Workflows as Custom Tools
|
| 116 |
+
|
| 117 |
+
<img width="1912" height="953" alt="workflow" loading="lazy" src="https://github.com/user-attachments/assets/e69e72e8-595c-480e-b519-4531f4c6331f" />
|
| 118 |
+
|
| 119 |
+
<img width="1567" alt="workflow-mention" loading="lazy" src="https://github.com/user-attachments/assets/cf3e1339-ee44-4615-a71d-f6b46833e41f" />
|
| 120 |
+
|
| 121 |
+
**Example:** Create custom workflows that become callable tools in your chat conversations.
|
| 122 |
+
|
| 123 |
+
- Build visual workflows by connecting LLM nodes (for AI reasoning) and Tool nodes (for MCP tool execution)
|
| 124 |
+
- Publish workflows to make them available as `@workflow_name` tools in chat
|
| 125 |
+
- Chain complex multi-step processes into reusable, automated sequences
|
| 126 |
+
|
| 127 |
+
<br/>
|
| 128 |
+
|
| 129 |
+
### 🤖 Custom Agents
|
| 130 |
+
|
| 131 |
+
<img width="1567" alt="agent-example" loading="lazy" src="https://github.com/user-attachments/assets/d0a325c0-ff1e-4038-b6bf-fcf57659a5c1" />
|
| 132 |
+
|
| 133 |
+
**Example:** Create specialized AI agents with custom instructions and tool access.
|
| 134 |
+
|
| 135 |
+
- Define custom agents with specific system prompts and available tools
|
| 136 |
+
- Easily invoke agents in chat using `@agent_name`
|
| 137 |
+
- Build task-specific assistants like a GitHub Manager agent with issue/PR tools and project context
|
| 138 |
+
|
| 139 |
+
For instance, create a GitHub Manager agent by:
|
| 140 |
+
|
| 141 |
+
- Providing GitHub tools (issue/PR creation, comments, queries)
|
| 142 |
+
- Adding project details to the system prompt
|
| 143 |
+
- Calling it with `@github_manager` to manage your repository
|
| 144 |
+
|
| 145 |
+
<br/>
|
| 146 |
+
|
| 147 |
+
### 🎙️ Realtime Voice Assistant + MCP Tools
|
| 148 |
+
|
| 149 |
+
<p align="center">
|
| 150 |
+
<video src="https://github.com/user-attachments/assets/e2657b8c-ce0b-40dd-80b6-755324024973" width="100%" />
|
| 151 |
+
</p>
|
| 152 |
+
|
| 153 |
+
This demo showcases a **realtime voice-based chatbot assistant** built with OpenAI's new Realtime API — now extended with full **MCP tool integration**.
|
| 154 |
+
Talk to the assistant naturally, and watch it execute tools in real time.
|
| 155 |
+
|
| 156 |
+
### ⚡️ Quick Tool Mentions (`@`) & Presets
|
| 157 |
+
|
| 158 |
+
<img width="1225" alt="image" src="https://github.com/user-attachments/assets/dfe76b3b-c3d8-436e-8a7c-7b23292e234c" loading="lazy"/>
|
| 159 |
+
|
| 160 |
+
Quickly call tool during chat by typing `@toolname`.
|
| 161 |
+
No need to memorize — just type `@` and pick from the list!
|
| 162 |
+
|
| 163 |
+
**Tool Selection vs. Mentions (`@`) — When to Use What:**
|
| 164 |
+
|
| 165 |
+
- **Tool Selection**: Make frequently used tools always available to the LLM across all chats. Great for convenience and maintaining consistent context over time.
|
| 166 |
+
- **Mentions (`@`)**: Temporarily bind only the mentioned tools for that specific response. Since only the mentioned tools are sent to the LLM, this saves tokens and can improve speed and accuracy.
|
| 167 |
+
|
| 168 |
+
Each method has its own strengths — use them together to balance efficiency and performance.
|
| 169 |
+
|
| 170 |
+
You can also create **tool presets** by selecting only the MCP servers or tools you need.
|
| 171 |
+
Switch between presets instantly with a click — perfect for organizing tools by task or workflow.
|
| 172 |
+
|
| 173 |
+
### 🧭 Tool Choice Mode
|
| 174 |
+
|
| 175 |
+
<img width="1225" alt="image" src="https://github.com/user-attachments/assets/8fc64c6a-30c9-41a4-a5e5-4e8804f73473" loading="lazy"/>
|
| 176 |
+
|
| 177 |
+
Control how tools are used in each chat with **Tool Choice Mode** — switch anytime with `⌘P`.
|
| 178 |
+
|
| 179 |
+
- **Auto:** The model automatically calls tools when needed.
|
| 180 |
+
- **Manual:** The model will ask for your permission before calling a tool.
|
| 181 |
+
- **None:** Tool usage is disabled completely.
|
| 182 |
+
|
| 183 |
+
This lets you flexibly choose between autonomous, guided, or tool-free interaction depending on the situation.
|
| 184 |
+
|
| 185 |
+
### 🛠️ Default Tools
|
| 186 |
+
|
| 187 |
+
#### 🌐 Web Search
|
| 188 |
+
|
| 189 |
+
<img width="1034" height="940" alt="web-search" src="https://github.com/user-attachments/assets/261037d9-e1a7-44ad-b45e-43780390a94e" />
|
| 190 |
+
|
| 191 |
+
Built-in web search powered by [Exa AI](https://exa.ai). Search the web with semantic AI and extract content from URLs directly in your chats.
|
| 192 |
+
|
| 193 |
+
- **Optional:** Add `EXA_API_KEY` to `.env` to enable web search
|
| 194 |
+
- **Free Tier:** 1,000 requests/month at no cost, no credit card required
|
| 195 |
+
- **Easy Setup:** Get your API key instantly at [dashboard.exa.ai](https://dashboard.exa.ai)
|
| 196 |
+
|
| 197 |
+
#### �� Image Generation
|
| 198 |
+
|
| 199 |
+
<img width="1034" height="940" loading="lazy" alt="image-generation" src="https://github.com/user-attachments/assets/b081c837-8948-4f4d-a2f4-c8630cf0eaa2" />
|
| 200 |
+
|
| 201 |
+
Built-in image generation and editing capabilities powered by AI models. Create, edit, and modify images directly in your chats.
|
| 202 |
+
|
| 203 |
+
- **Supported Operations:** Image generation, editing, and composition
|
| 204 |
+
- **Current Models:** Gemini Nano Banana, OpenAI
|
| 205 |
+
|
| 206 |
+
#### ⚡️ JS,PYTHON Executor
|
| 207 |
+
|
| 208 |
+
<img width="1225" alt="js-executor-preview" src="https://github.com/user-attachments/assets/7deed824-e70b-46d4-a294-de20ed4dc869" loading="lazy"/>
|
| 209 |
+
|
| 210 |
+
It is a simple JS execution tool.
|
| 211 |
+
|
| 212 |
+
#### 📊 Data Visualization Tools
|
| 213 |
+
|
| 214 |
+
**Interactive Tables**: Create feature-rich data tables with advanced functionality:
|
| 215 |
+
|
| 216 |
+
- **Sorting & Filtering**: Sort by any column, filter data in real-time
|
| 217 |
+
- **Search & Highlighting**: Global search with automatic text highlighting
|
| 218 |
+
- **Export Options**: Export to CSV or Excel format with lazy-loaded libraries
|
| 219 |
+
- **Column Management**: Show/hide columns with visibility controls
|
| 220 |
+
- **Pagination**: Handle large datasets with built-in pagination
|
| 221 |
+
- **Data Type Support**: Proper formatting for strings, numbers, dates, and booleans
|
| 222 |
+
|
| 223 |
+
**Chart Generation**: Visualize data with various chart types (bar, line, pie charts)
|
| 224 |
+
|
| 225 |
+
> Additionally, many other tools are provided, such as an HTTP client for API requests and more.
|
| 226 |
+
|
| 227 |
+
<br/>
|
| 228 |
+
|
| 229 |
+
…and there's even more waiting for you.
|
| 230 |
+
Try it out and see what else it can do!
|
| 231 |
+
|
| 232 |
+
<br/>
|
| 233 |
+
|
| 234 |
+
## Getting Started
|
| 235 |
+
|
| 236 |
+
> This project uses [pnpm](https://pnpm.io/) as the recommended package manager.
|
| 237 |
+
|
| 238 |
+
```bash
|
| 239 |
+
# If you don't have pnpm:
|
| 240 |
+
npm install -g pnpm
|
| 241 |
+
```
|
| 242 |
+
|
| 243 |
+
### Quick Start (Docker Compose Version) 🐳
|
| 244 |
+
|
| 245 |
+
```bash
|
| 246 |
+
# 1. Install dependencies
|
| 247 |
+
pnpm i
|
| 248 |
+
|
| 249 |
+
# 2. Enter only the LLM PROVIDER API key(s) you want to use in the .env file at the project root.
|
| 250 |
+
# Example: The app works with just OPENAI_API_KEY filled in.
|
| 251 |
+
# (The .env file is automatically created when you run pnpm i.)
|
| 252 |
+
|
| 253 |
+
# 3. Build and start all services (including PostgreSQL) with Docker Compose
|
| 254 |
+
pnpm docker-compose:up
|
| 255 |
+
|
| 256 |
+
```
|
| 257 |
+
|
| 258 |
+
### Quick Start (Local Version) 🚀
|
| 259 |
+
|
| 260 |
+
```bash
|
| 261 |
+
pnpm i
|
| 262 |
+
|
| 263 |
+
#(Optional) Start a local PostgreSQL instance
|
| 264 |
+
# If you already have your own PostgreSQL running, you can skip this step.
|
| 265 |
+
# In that case, make sure to update the PostgreSQL URL in your .env file.
|
| 266 |
+
pnpm docker:pg
|
| 267 |
+
|
| 268 |
+
# Enter required information in the .env file
|
| 269 |
+
# The .env file is created automatically. Just fill in the required values.
|
| 270 |
+
# For the fastest setup, provide at least one LLM provider's API key (e.g., OPENAI_API_KEY, CLAUDE_API_KEY, GEMINI_API_KEY, etc.) and the PostgreSQL URL you want to use.
|
| 271 |
+
|
| 272 |
+
pnpm build:local && pnpm start
|
| 273 |
+
|
| 274 |
+
# (Recommended for most cases. Ensures correct cookie settings.)
|
| 275 |
+
# For development mode with hot-reloading and debugging, you can use:
|
| 276 |
+
# pnpm dev
|
| 277 |
+
```
|
| 278 |
+
|
| 279 |
+
Alternative: Use Docker Compose for DB only (run app via pnpm)
|
| 280 |
+
|
| 281 |
+
```bash
|
| 282 |
+
# Start Postgres only via compose
|
| 283 |
+
# Ensure your .env includes: POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB matching POSTGRES_URL
|
| 284 |
+
docker compose -f docker/compose.yml up -d postgres
|
| 285 |
+
|
| 286 |
+
# Apply migrations
|
| 287 |
+
pnpm db:migrate
|
| 288 |
+
|
| 289 |
+
|
| 290 |
+
# Run app locally
|
| 291 |
+
pnpm dev # or: pnpm build && pnpm start
|
| 292 |
+
```
|
| 293 |
+
|
| 294 |
+
Open [http://localhost:3000](http://localhost:3000) in your browser to get started.
|
| 295 |
+
|
| 296 |
+
### Environment Variables
|
| 297 |
+
|
| 298 |
+
The `pnpm i` command generates a `.env` file. Add your API keys there.
|
| 299 |
+
|
| 300 |
+
```dotenv
|
| 301 |
+
# === LLM Provider API Keys ===
|
| 302 |
+
# You only need to enter the keys for the providers you plan to use
|
| 303 |
+
GOOGLE_GENERATIVE_AI_API_KEY=****
|
| 304 |
+
OPENAI_API_KEY=****
|
| 305 |
+
XAI_API_KEY=****
|
| 306 |
+
ANTHROPIC_API_KEY=****
|
| 307 |
+
OPENROUTER_API_KEY=****
|
| 308 |
+
OLLAMA_BASE_URL=http://localhost:11434/api
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
|
| 312 |
+
# Secret for Better Auth (generate with: npx @better-auth/cli@latest secret)
|
| 313 |
+
BETTER_AUTH_SECRET=****
|
| 314 |
+
|
| 315 |
+
# (Optional)
|
| 316 |
+
# URL for Better Auth (the URL you access the app from)
|
| 317 |
+
BETTER_AUTH_URL=
|
| 318 |
+
|
| 319 |
+
# === Database ===
|
| 320 |
+
# If you don't have PostgreSQL running locally, start it with: pnpm docker:pg
|
| 321 |
+
POSTGRES_URL=postgres://your_username:your_password@localhost:5432/your_database_name
|
| 322 |
+
|
| 323 |
+
# (Optional)
|
| 324 |
+
# === Tools ===
|
| 325 |
+
# Exa AI for web search and content extraction (optional, but recommended for @web and research features)
|
| 326 |
+
EXA_API_KEY=your_exa_api_key_here
|
| 327 |
+
|
| 328 |
+
|
| 329 |
+
# Whether to use file-based MCP config (default: false)
|
| 330 |
+
FILE_BASED_MCP_CONFIG=false
|
| 331 |
+
|
| 332 |
+
# === File Storage ===
|
| 333 |
+
# Vercel Blob is the default storage driver (works in both local dev and production)
|
| 334 |
+
# Pull the token locally with `vercel env pull`
|
| 335 |
+
FILE_STORAGE_TYPE=vercel-blob
|
| 336 |
+
FILE_STORAGE_PREFIX=uploads
|
| 337 |
+
BLOB_READ_WRITE_TOKEN=
|
| 338 |
+
|
| 339 |
+
# -- S3 (coming soon) --
|
| 340 |
+
# FILE_STORAGE_TYPE=s3
|
| 341 |
+
# FILE_STORAGE_PREFIX=uploads
|
| 342 |
+
# FILE_STORAGE_S3_BUCKET=
|
| 343 |
+
# FILE_STORAGE_S3_REGION=
|
| 344 |
+
|
| 345 |
+
# (Optional)
|
| 346 |
+
# === OAuth Settings ===
|
| 347 |
+
# Fill in these values only if you want to enable Google/GitHub/Microsoft login
|
| 348 |
+
|
| 349 |
+
#GitHub
|
| 350 |
+
GITHUB_CLIENT_ID=
|
| 351 |
+
GITHUB_CLIENT_SECRET=
|
| 352 |
+
|
| 353 |
+
#Google
|
| 354 |
+
GOOGLE_CLIENT_ID=
|
| 355 |
+
GOOGLE_CLIENT_SECRET=
|
| 356 |
+
# Set to 1 to force account selection
|
| 357 |
+
GOOGLE_FORCE_ACCOUNT_SELECTION=
|
| 358 |
+
|
| 359 |
+
|
| 360 |
+
# Microsoft
|
| 361 |
+
MICROSOFT_CLIENT_ID=
|
| 362 |
+
MICROSOFT_CLIENT_SECRET=
|
| 363 |
+
# Optional Tenant Id
|
| 364 |
+
MICROSOFT_TENANT_ID=
|
| 365 |
+
# Set to 1 to force account selection
|
| 366 |
+
MICROSOFT_FORCE_ACCOUNT_SELECTION=
|
| 367 |
+
|
| 368 |
+
# Set this to 1 to disable user sign-ups.
|
| 369 |
+
DISABLE_SIGN_UP=
|
| 370 |
+
|
| 371 |
+
# Set this to 1 to disallow adding MCP servers.
|
| 372 |
+
NOT_ALLOW_ADD_MCP_SERVERS=
|
| 373 |
+
```
|
| 374 |
+
|
| 375 |
+
<br/>
|
| 376 |
+
|
| 377 |
+
## 📘 Guides
|
| 378 |
+
|
| 379 |
+
Step-by-step setup guides for running and configuring better-chatbot.
|
| 380 |
+
|
| 381 |
+
#### [🔌 MCP Server Setup & Tool Testing](./docs/tips-guides/mcp-server-setup-and-tool-testing.md)
|
| 382 |
+
|
| 383 |
+
- How to add and configure MCP servers in your environment
|
| 384 |
+
|
| 385 |
+
#### [🐳 Docker Hosting Guide](./docs/tips-guides/docker.md)
|
| 386 |
+
|
| 387 |
+
- How to self-host the chatbot using Docker, including environment configuration.
|
| 388 |
+
|
| 389 |
+
#### [▲ Vercel Hosting Guide](./docs/tips-guides/vercel.md)
|
| 390 |
+
|
| 391 |
+
- Deploy the chatbot to Vercel with simple setup steps for production use.
|
| 392 |
+
|
| 393 |
+
#### [🗂️ File Storage Drivers](./docs/tips-guides/file-storage.md)
|
| 394 |
+
|
| 395 |
+
- Cloud-based file storage with Vercel Blob (default) for seamless uploads in both development and production. S3 support coming soon.
|
| 396 |
+
|
| 397 |
+
#### [🎯 System Prompts & Chat Customization](./docs/tips-guides/system-prompts-and-customization.md)
|
| 398 |
+
|
| 399 |
+
- Personalize your chatbot experience with custom system prompts, user preferences, and MCP tool instructions
|
| 400 |
+
|
| 401 |
+
#### [🔐 OAuth Sign-In Setup](./docs/tips-guides/oauth.md)
|
| 402 |
+
|
| 403 |
+
- Configure Google, GitHub, and Microsoft OAuth for secure user login support.
|
| 404 |
+
|
| 405 |
+
#### [🕵🏿 Adding openAI like providers](docs/tips-guides/adding-openAI-like-providers.md)
|
| 406 |
+
|
| 407 |
+
- Adding openAI like ai providers
|
| 408 |
+
|
| 409 |
+
#### [🧪 E2E Testing Guide](./docs/tips-guides/e2e-testing-guide.md)
|
| 410 |
+
|
| 411 |
+
- Comprehensive end-to-end testing with Playwright including multi-user scenarios, agent visibility testing, and CI/CD integration
|
| 412 |
+
<br/>
|
| 413 |
+
|
| 414 |
+
## 💡 Tips
|
| 415 |
+
|
| 416 |
+
#### [💬 Temporary Chat Windows](./docs/tips-guides/temporary_chat.md)
|
| 417 |
+
|
| 418 |
+
- Open lightweight popup chats for quick side questions or testing — separate from your main thread.
|
| 419 |
+
|
| 420 |
+
## 🗺️ Roadmap
|
| 421 |
+
|
| 422 |
+
Planned features coming soon to better-chatbot:
|
| 423 |
+
|
| 424 |
+
- [x] **File Upload & Storage** (Vercel Blob integration)
|
| 425 |
+
- [x] **Image Generation**
|
| 426 |
+
- [ ] **Collaborative Document Editing** (like OpenAI Canvas: user & assistant co-editing)
|
| 427 |
+
- [ ] **RAG (Retrieval-Augmented Generation)**
|
| 428 |
+
- [ ] **Web-based Compute** (with [WebContainers](https://webcontainers.io) integration)
|
| 429 |
+
|
| 430 |
+
💡 If you have suggestions or need specific features, please create an [issue](https://github.com/cgoinglove/better-chatbot/issues)!
|
| 431 |
+
|
| 432 |
+
## 💖 Support
|
| 433 |
+
|
| 434 |
+
If this project has been helpful to you, please consider supporting its development:
|
| 435 |
+
|
| 436 |
+
- ⭐ **Star** this repository
|
| 437 |
+
- 🐛 **Report** bugs and suggest features
|
| 438 |
+
- 💰 **[Become a sponsor](https://github.com/sponsors/cgoinglove)** to support ongoing development
|
| 439 |
+
|
| 440 |
+
Your support helps maintain and improve this project. Thank you! 🙏
|
| 441 |
+
|
| 442 |
+
## 🙌 Contributing
|
| 443 |
+
|
| 444 |
+
We welcome all contributions! Bug reports, feature ideas, code improvements — everything helps us build the best local AI assistant.
|
| 445 |
+
|
| 446 |
+
> **⚠️ Please read our [Contributing Guide](./CONTRIBUTING.md) before submitting any Pull Requests or Issues.** This helps us work together more effectively and saves time for everyone.
|
| 447 |
+
|
| 448 |
+
**For detailed contribution guidelines**, please see our [Contributing Guide](./CONTRIBUTING.md).
|
| 449 |
+
|
| 450 |
+
**Language Translations:** Help us make the chatbot accessible to more users by adding new language translations. See [language.md](./messages/language.md) for instructions on how to contribute translations.
|
| 451 |
+
|
| 452 |
+
Let's build it together 🚀
|
| 453 |
+
|
| 454 |
+
## 💬 Join Our Discord
|
| 455 |
+
|
| 456 |
+
[](https://discord.gg/gCRu69Upnp)
|
| 457 |
+
|
| 458 |
+
Connect with the community, ask questions, and get support on our official Discord server!
|
biome.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
| 3 |
+
"vcs": {
|
| 4 |
+
"enabled": true,
|
| 5 |
+
"clientKind": "git",
|
| 6 |
+
"useIgnoreFile": true,
|
| 7 |
+
"defaultBranch": "main"
|
| 8 |
+
},
|
| 9 |
+
"files": {
|
| 10 |
+
"ignoreUnknown": false,
|
| 11 |
+
"ignore": ["node_modules", ".next", "public", "docker", "dist/**", "*.d.ts"]
|
| 12 |
+
},
|
| 13 |
+
"formatter": {
|
| 14 |
+
"enabled": true,
|
| 15 |
+
"formatWithErrors": false,
|
| 16 |
+
"indentStyle": "space",
|
| 17 |
+
"indentWidth": 2,
|
| 18 |
+
"lineEnding": "lf",
|
| 19 |
+
"lineWidth": 80,
|
| 20 |
+
"attributePosition": "auto"
|
| 21 |
+
},
|
| 22 |
+
"organizeImports": { "enabled": true },
|
| 23 |
+
"linter": {
|
| 24 |
+
"enabled": true,
|
| 25 |
+
"rules": {
|
| 26 |
+
"recommended": false,
|
| 27 |
+
"complexity": { "noUselessTypeConstraint": "error" },
|
| 28 |
+
"correctness": {
|
| 29 |
+
"noUnusedVariables": "error",
|
| 30 |
+
"useArrayLiterals": "off",
|
| 31 |
+
"useExhaustiveDependencies": "off"
|
| 32 |
+
},
|
| 33 |
+
"style": { "noNamespace": "error", "useAsConstAssertion": "error" },
|
| 34 |
+
"suspicious": {
|
| 35 |
+
"noExplicitAny": "off",
|
| 36 |
+
"noExtraNonNullAssertion": "error",
|
| 37 |
+
"noMisleadingInstantiator": "error",
|
| 38 |
+
"noUnsafeDeclarationMerging": "error",
|
| 39 |
+
"useNamespaceKeyword": "error"
|
| 40 |
+
}
|
| 41 |
+
}
|
| 42 |
+
},
|
| 43 |
+
"javascript": { "formatter": { "quoteStyle": "double" } },
|
| 44 |
+
"overrides": [
|
| 45 |
+
{
|
| 46 |
+
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
| 47 |
+
"linter": {
|
| 48 |
+
"rules": {
|
| 49 |
+
"complexity": { "noWith": "off" },
|
| 50 |
+
"correctness": {
|
| 51 |
+
"noConstAssign": "off",
|
| 52 |
+
"noGlobalObjectCalls": "off",
|
| 53 |
+
"noInvalidBuiltinInstantiation": "off",
|
| 54 |
+
"noInvalidConstructorSuper": "off",
|
| 55 |
+
"noNewSymbol": "off",
|
| 56 |
+
"noSetterReturn": "off",
|
| 57 |
+
"noUndeclaredVariables": "off",
|
| 58 |
+
"noUnreachable": "off",
|
| 59 |
+
"noUnreachableSuper": "off"
|
| 60 |
+
},
|
| 61 |
+
"style": {
|
| 62 |
+
"noArguments": "error",
|
| 63 |
+
"noVar": "error",
|
| 64 |
+
"useConst": "error"
|
| 65 |
+
},
|
| 66 |
+
"suspicious": {
|
| 67 |
+
"noClassAssign": "off",
|
| 68 |
+
"noDuplicateClassMembers": "off",
|
| 69 |
+
"noDuplicateObjectKeys": "off",
|
| 70 |
+
"noDuplicateParameters": "off",
|
| 71 |
+
"noFunctionAssign": "off",
|
| 72 |
+
"noImportAssign": "off",
|
| 73 |
+
"noRedeclare": "off",
|
| 74 |
+
"noUnsafeNegation": "off",
|
| 75 |
+
"useGetterReturn": "off"
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
}
|
| 79 |
+
}
|
| 80 |
+
]
|
| 81 |
+
}
|
components.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://ui.shadcn.com/schema.json",
|
| 3 |
+
"style": "new-york",
|
| 4 |
+
"rsc": true,
|
| 5 |
+
"tsx": true,
|
| 6 |
+
"tailwind": {
|
| 7 |
+
"config": "",
|
| 8 |
+
"css": "src/app/globals.css",
|
| 9 |
+
"baseColor": "neutral",
|
| 10 |
+
"cssVariables": true,
|
| 11 |
+
"prefix": ""
|
| 12 |
+
},
|
| 13 |
+
"aliases": {
|
| 14 |
+
"components": "@/components",
|
| 15 |
+
"utils": "@/lib/utils",
|
| 16 |
+
"ui": "@/components/ui",
|
| 17 |
+
"lib": "@/lib",
|
| 18 |
+
"hooks": "@/hooks"
|
| 19 |
+
},
|
| 20 |
+
"iconLibrary": "lucide"
|
| 21 |
+
}
|
docker/Dockerfile
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM node:23-alpine AS builder
|
| 2 |
+
ARG DOCKER_BUILD="1"
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
COPY . .
|
| 6 |
+
|
| 7 |
+
# Install pnpm
|
| 8 |
+
RUN corepack enable pnpm
|
| 9 |
+
|
| 10 |
+
RUN pnpm install --frozen-lockfile
|
| 11 |
+
|
| 12 |
+
# Makes the next output standalone
|
| 13 |
+
# https://github.com/vercel/next.js/discussions/65511
|
| 14 |
+
ENV NEXT_STANDALONE_OUTPUT="true"
|
| 15 |
+
|
| 16 |
+
RUN pnpm build
|
| 17 |
+
|
| 18 |
+
FROM node:23-alpine AS runner
|
| 19 |
+
|
| 20 |
+
WORKDIR /app
|
| 21 |
+
|
| 22 |
+
ENV NODE_ENV=production
|
| 23 |
+
# disable telemetry during runtime.
|
| 24 |
+
ENV NEXT_TELEMETRY_DISABLED=1
|
| 25 |
+
|
| 26 |
+
RUN addgroup --system --gid 1001 nodejs
|
| 27 |
+
RUN adduser --system --uid 1001 nextjs
|
| 28 |
+
|
| 29 |
+
COPY --from=builder /app/public ./public
|
| 30 |
+
|
| 31 |
+
# Automatically leverage output traces to reduce image size
|
| 32 |
+
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
| 33 |
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
| 34 |
+
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
| 35 |
+
|
| 36 |
+
# Copy migrations content
|
| 37 |
+
COPY --from=builder /app/src/lib/db/migrations ./src/lib/db/migrations
|
| 38 |
+
|
| 39 |
+
USER nextjs
|
| 40 |
+
|
| 41 |
+
ENV PORT=3000
|
| 42 |
+
ENV HOSTNAME="0.0.0.0"
|
| 43 |
+
|
| 44 |
+
EXPOSE 3000
|
| 45 |
+
|
| 46 |
+
# server.js is created by next build from the standalone output
|
| 47 |
+
# https://nextjs.org/docs/pages/api-reference/config/next-config-js/output
|
| 48 |
+
CMD ["node", "server.js"]
|
docker/compose.yml
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
services:
|
| 2 |
+
better-chatbot:
|
| 3 |
+
build:
|
| 4 |
+
context: ..
|
| 5 |
+
dockerfile: ./docker/Dockerfile
|
| 6 |
+
ports:
|
| 7 |
+
- '3000:3000'
|
| 8 |
+
environment:
|
| 9 |
+
- NO_HTTPS=1
|
| 10 |
+
env_file:
|
| 11 |
+
- .env
|
| 12 |
+
dns:
|
| 13 |
+
- 8.8.8.8 # Google's public DNS server
|
| 14 |
+
- 8.8.4.4 # Google's public DNS server
|
| 15 |
+
networks:
|
| 16 |
+
- better-chatbot-networks
|
| 17 |
+
depends_on:
|
| 18 |
+
- postgres
|
| 19 |
+
restart: unless-stopped
|
| 20 |
+
|
| 21 |
+
postgres:
|
| 22 |
+
image: postgres:17
|
| 23 |
+
env_file:
|
| 24 |
+
- .env
|
| 25 |
+
networks:
|
| 26 |
+
- better-chatbot-networks
|
| 27 |
+
volumes:
|
| 28 |
+
- postgres_data:/var/lib/postgresql/data
|
| 29 |
+
restart: unless-stopped
|
| 30 |
+
|
| 31 |
+
volumes:
|
| 32 |
+
postgres_data:
|
| 33 |
+
|
| 34 |
+
networks:
|
| 35 |
+
better-chatbot-networks:
|
| 36 |
+
driver: bridge
|
docs/storage/s3-setup.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# S3 Storage Setup
|
| 2 |
+
|
| 3 |
+
This app supports S3 for file uploads (dev/prod). Development can rely on presigned PUTs directly from the browser, while production should keep the bucket private and serve via CDN (CloudFront + Origin Access Control) or signed GET URLs.
|
| 4 |
+
|
| 5 |
+
## Buckets
|
| 6 |
+
- Pick a region (e.g., `us-east-2`)
|
| 7 |
+
- Dev/Test example: `better-chatbot-dev` (public GET on `uploads/` only if needed)
|
| 8 |
+
- Prod example: `better-chatbot-prod` (private)
|
| 9 |
+
- Enable default encryption (SSE-S3) and versioning on both buckets.
|
| 10 |
+
|
| 11 |
+
## CORS
|
| 12 |
+
- Dev bucket: allow PUT/GET/HEAD from the origins you use locally and in staging, for example:
|
| 13 |
+
- `http://localhost:3000`, `http://127.0.0.1:3000`
|
| 14 |
+
- `https://staging.your-domain.com`, `http://staging.your-domain.com`
|
| 15 |
+
- Prod bucket: allow GET/HEAD only from your production domain (e.g., `https://app.your-domain.com`). Avoid enabling browser PUT in production.
|
| 16 |
+
|
| 17 |
+
## Dev public-read policy (prefix-only)
|
| 18 |
+
Grant public GET for the `uploads/` prefix on the dev bucket only if you need unauthenticated downloads:
|
| 19 |
+
```
|
| 20 |
+
{
|
| 21 |
+
"Version": "2012-10-17",
|
| 22 |
+
"Statement": [
|
| 23 |
+
{
|
| 24 |
+
"Sid": "AllowPublicReadForUploadsPrefix",
|
| 25 |
+
"Effect": "Allow",
|
| 26 |
+
"Principal": "*",
|
| 27 |
+
"Action": "s3:GetObject",
|
| 28 |
+
"Resource": "arn:aws:s3:::better-chatbot-dev/uploads/*"
|
| 29 |
+
}
|
| 30 |
+
]
|
| 31 |
+
}
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
## IAM (app runtime)
|
| 35 |
+
Least privilege for app role/user:
|
| 36 |
+
- Actions: `s3:PutObject`, `s3:GetObject`, `s3:DeleteObject`, `s3:HeadObject`
|
| 37 |
+
- Resources: `arn:aws:s3:::<bucket-name>/uploads/*`
|
| 38 |
+
|
| 39 |
+
## Env configuration
|
| 40 |
+
- Dev/local:
|
| 41 |
+
- `FILE_STORAGE_TYPE=s3`
|
| 42 |
+
- `FILE_STORAGE_PREFIX=uploads`
|
| 43 |
+
- `FILE_STORAGE_S3_BUCKET=better-chatbot-dev`
|
| 44 |
+
- `FILE_STORAGE_S3_REGION=us-east-2` (or set `AWS_REGION`)
|
| 45 |
+
- Use AWS SSO/profile or `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY`
|
| 46 |
+
- Prod:
|
| 47 |
+
- `FILE_STORAGE_S3_BUCKET=better-chatbot-prod`
|
| 48 |
+
- Prefer CloudFront; set `FILE_STORAGE_S3_PUBLIC_BASE_URL=https://<cdn-domain>`
|
| 49 |
+
|
| 50 |
+
## Verify locally
|
| 51 |
+
- Ensure `aws sso login --profile <your_profile>` (or credentials are already available).
|
| 52 |
+
- Test presign script:
|
| 53 |
+
```
|
| 54 |
+
AWS_PROFILE=<your_profile> \
|
| 55 |
+
FILE_STORAGE_TYPE=s3 \
|
| 56 |
+
FILE_STORAGE_S3_BUCKET=better-chatbot-dev \
|
| 57 |
+
FILE_STORAGE_S3_REGION=us-east-2 \
|
| 58 |
+
pnpm tsx scripts/verify-s3-upload-url.ts
|
| 59 |
+
```
|
| 60 |
+
- You should get `{ directUploadSupported: true, url, key, method: PUT }`.
|
| 61 |
+
- Upload with curl (optional): `curl -X PUT -H "Content-Type: image/png" --data-binary @file.png "<url>"`.
|
docs/tips-guides/adding-openAI-like-providers.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Adding openAI like provider
|
| 2 |
+
|
| 3 |
+
## What is an openAI like provider
|
| 4 |
+
|
| 5 |
+
It is an api that is like the openAI one. They are used as llm providers.
|
| 6 |
+
|
| 7 |
+
## Adding providers - docker and local deployment - file method
|
| 8 |
+
|
| 9 |
+
1. Set up the app as you normally would
|
| 10 |
+
2. Open `openai-compatible.config.ts` in an IDE
|
| 11 |
+
3. Uncomment the example and remove the word example
|
| 12 |
+
4. Modify the api url and other data to match your provider - to add more just copy and paste it and edit it, also add your secret key
|
| 13 |
+
5. Run `pnpm openai-compatiable:parse` to update env when you change schema
|
| 14 |
+
|
| 15 |
+
## Adding providers - vercel or anywhere else - ui based method
|
| 16 |
+
|
| 17 |
+
1. Go to [this website](https://mcp-client-chatbot-openai-like.vercel.app/) and set up your models and providers
|
| 18 |
+
2. Press generate JSON and copy it
|
| 19 |
+
3. Put in this into your env as the `OPENAI_COMPATIBLE_DATA` variable
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
### Editing
|
| 23 |
+
|
| 24 |
+
Copy the contents of the env into the import section at the top, then regenerate and update your env
|
docs/tips-guides/docker.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Using Docker
|
| 2 |
+
|
| 3 |
+
Docker provides a streamlined and efficient method for managing containerized applications, making it an ideal choice for deploying this project.
|
| 4 |
+
|
| 5 |
+
## Requirements
|
| 6 |
+
|
| 7 |
+
- **Architecture:** An x86-64 or ARM(64) based computer.
|
| 8 |
+
- **Operating System:** Linux, macOS (with Docker Desktop or equivalent), or Windows (with WSL).
|
| 9 |
+
- **Software:** Docker and Docker Compose installed and configured.
|
| 10 |
+
|
| 11 |
+
## Steps
|
| 12 |
+
|
| 13 |
+
1. **Clone the Repository:**
|
| 14 |
+
Navigate to the desired directory in your terminal and clone the project repository. If you're not already in the project directory after cloning, change into it:
|
| 15 |
+
|
| 16 |
+
```sh
|
| 17 |
+
git clone https://github.com/cgoinglove/better-chatbot
|
| 18 |
+
cd better-chatbot
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
2. **Set up Environment Variables:**
|
| 22 |
+
Run `pnpm initial:env` to generate the `.env` file.
|
| 23 |
+
Then, enter the API keys only for the LLM providers you plan to use.
|
| 24 |
+
|
| 25 |
+
You can generate an authentication secret (`BETTER_AUTH_SECRET`) with the command:
|
| 26 |
+
`pnpx auth secret`
|
| 27 |
+
|
| 28 |
+
For the database, Docker will handle all necessary configuration automatically,
|
| 29 |
+
so the default `docker/.env` file is sufficient.
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
1. **Build and Start the Container:**
|
| 34 |
+
From the project's root directory, build the Docker image and start the container in detached mode (running in the background):
|
| 35 |
+
|
| 36 |
+
```sh
|
| 37 |
+
pnpm docker-compose:up
|
| 38 |
+
```
|
| 39 |
+
|
| 40 |
+
Your application should now be running. You can access it by visiting `http://<ipofserver>:3000/` in your web browser. Replace `<ipofserver>` with the IP address of the server where Docker is running (this will likely be `localhost` if you're running it on your local machine).
|
| 41 |
+
|
| 42 |
+
## Using your own database
|
| 43 |
+
|
| 44 |
+
If you don't want to host your own db, here are some steps
|
| 45 |
+
|
| 46 |
+
1. Open up your docker compose file. `docker/compose.yml`
|
| 47 |
+
Comment out the postgres section and the volume
|
| 48 |
+
2. Update `.env` change your DB url
|
| 49 |
+
3. Migrate the DB
|
| 50 |
+
|
| 51 |
+
```sh
|
| 52 |
+
pnpm db:migrate
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
4. Run the app
|
| 56 |
+
|
| 57 |
+
```sh
|
| 58 |
+
pnpm docker-compose:up
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
## What is possible in docker and what is not
|
| 62 |
+
|
| 63 |
+
- Full support for MCP stdio servers that work with bunx, uvx and npx.
|
| 64 |
+
- Full support for SSE,Streamable Remote servers.
|
| 65 |
+
- And everything else as you would expect.
|
| 66 |
+
|
| 67 |
+
## Managing the Container
|
| 68 |
+
|
| 69 |
+
### Stopping the Container
|
| 70 |
+
|
| 71 |
+
To stop the running container, ensure you are in the project's root directory and execute:
|
| 72 |
+
|
| 73 |
+
```sh
|
| 74 |
+
pnpm docker-compose:down
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
### Updating the Application
|
| 78 |
+
|
| 79 |
+
To update the application to the latest version:
|
| 80 |
+
|
| 81 |
+
```sh
|
| 82 |
+
pnpm docker-compose:update
|
| 83 |
+
```
|
docs/tips-guides/e2e-testing-guide.md
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🧪 End-to-End Testing Guide
|
| 2 |
+
|
| 3 |
+
Comprehensive guide for running and developing end-to-end tests for better-chatbot using Playwright.
|
| 4 |
+
|
| 5 |
+
## Quick Start
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
# Install dependencies (if not already done)
|
| 9 |
+
pnpm install
|
| 10 |
+
|
| 11 |
+
# Install Playwright browsers
|
| 12 |
+
pnpm playwright:install
|
| 13 |
+
|
| 14 |
+
# Run all e2e tests
|
| 15 |
+
pnpm test:e2e
|
| 16 |
+
|
| 17 |
+
# Run tests with UI (interactive mode)
|
| 18 |
+
pnpm test:e2e:ui
|
| 19 |
+
|
| 20 |
+
# Run specific test file
|
| 21 |
+
pnpm test:e2e -- tests/agents/agent-creation.spec.ts
|
| 22 |
+
|
| 23 |
+
# Run tests in debug mode
|
| 24 |
+
pnpm test:e2e:debug
|
| 25 |
+
```
|
| 26 |
+
|
| 27 |
+
## 🏗️ Test Architecture
|
| 28 |
+
|
| 29 |
+
Our e2e tests are designed for **reliability, speed, and maintainability**:
|
| 30 |
+
|
| 31 |
+
### Test Structure (Will be expanded over time, this is just an example)
|
| 32 |
+
|
| 33 |
+
```
|
| 34 |
+
tests/
|
| 35 |
+
├── lifecycle/ # Setup and teardown for tests
|
| 36 |
+
│ ├── auth.setup.ts # User registration & authentication
|
| 37 |
+
│ └── teardown.global.ts # Test data cleanup
|
| 38 |
+
├── core/ # Core tests for landing page, auth flows, etc.
|
| 39 |
+
│ └── unauthenticated.spec.ts # Landing page & auth flows
|
| 40 |
+
├── agents/ # Agent tests
|
| 41 |
+
│ ├── agent-creation.spec.ts # Agent CRUD operations
|
| 42 |
+
│ ├── agent-visibility.spec.ts # Multi-user sharing & permissions
|
| 43 |
+
│ └── agents.spec.ts # Basic agent functionality
|
| 44 |
+
└── models/ # Model selection & persistence
|
| 45 |
+
└── model-selection.spec.ts # Model selection & persistence
|
| 46 |
+
```
|
| 47 |
+
|
| 48 |
+
### Key Features
|
| 49 |
+
|
| 50 |
+
- ✅ **Automated user registration** with unique test accounts
|
| 51 |
+
- ✅ **Multi-user testing** for sharing & permissions
|
| 52 |
+
- ✅ **Automatic cleanup** of test data
|
| 53 |
+
- ✅ **Parallel execution** for speed
|
| 54 |
+
- ✅ **Robust selectors** using data-testid attributes
|
| 55 |
+
|
| 56 |
+
## 🔧 Configuration
|
| 57 |
+
|
| 58 |
+
### Environment Setup
|
| 59 |
+
|
| 60 |
+
Tests require these environment variables:
|
| 61 |
+
|
| 62 |
+
```bash
|
| 63 |
+
# Database (required)
|
| 64 |
+
POSTGRES_URL=postgres://user:password@localhost:5432/database
|
| 65 |
+
|
| 66 |
+
# Authentication (required)
|
| 67 |
+
BETTER_AUTH_SECRET=your-secret-here
|
| 68 |
+
|
| 69 |
+
# At least one LLM provider (required)
|
| 70 |
+
OPENAI_API_KEY=your-openai-key
|
| 71 |
+
# OR
|
| 72 |
+
ANTHROPIC_API_KEY=your-anthropic-key
|
| 73 |
+
# OR
|
| 74 |
+
GOOGLE_GENERATIVE_AI_API_KEY=your-google-key
|
| 75 |
+
|
| 76 |
+
# Optional: Set default model for tests - will need to be corelated with API keys
|
| 77 |
+
E2E_DEFAULT_MODEL=openai/gpt-4o-mini
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
### VSCode Extension
|
| 81 |
+
|
| 82 |
+
We recommend using the [Playwright](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) extension for VSCode. It provides a lot of helpful features for writing and debugging tests.
|
| 83 |
+
|
| 84 |
+
### Test Database
|
| 85 |
+
|
| 86 |
+
```bash
|
| 87 |
+
pnpm docker:pg
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
## 🎯 Authentication Strategy
|
| 91 |
+
|
| 92 |
+
### Authentication Setup
|
| 93 |
+
|
| 94 |
+
Tests authenticate 4 users 1 admin, 1 editor, 1 editor2, and 1 regular by default on setup. - This is to test multi-user functionality like agent or workspace sharing. These users are defined in `tests/constants/test-users.ts`.
|
| 95 |
+
|
| 96 |
+
To test as an authenticated user (nearly all tests), you can use the `test.use({ storageState: TEST_USERS.editor.authFile });` or `test.use({ storageState: TEST_USERS.editor2.authFile });` or `test.use({ storageState: TEST_USERS.regular.authFile });` or `test.use({ storageState: TEST_USERS.admin.authFile });` in the test file. Without this, the test will run as an unauthenticated user. This can go in the describe block or the test block.
|
| 97 |
+
|
| 98 |
+
### Multi-User Testing
|
| 99 |
+
|
| 100 |
+
Playwright is designed to run tests in parallel. This means that each test will run in its own browser instance. For tests that need to test multi-user functionality, you can set the tests to run sequentially by using the `test.describe.configure({ mode: 'serial' });` decorator. See `tests/agents/agent-visibility.spec.ts` for an example.
|
| 101 |
+
|
| 102 |
+
**Example:**
|
| 103 |
+
|
| 104 |
+
#### User 1 Only
|
| 105 |
+
|
| 106 |
+
```typescript
|
| 107 |
+
// Most tests use single user authentication
|
| 108 |
+
import { TEST_USERS } from '../constants/test-users';
|
| 109 |
+
test.describe('Agent Creation', () => {
|
| 110 |
+
test.use({ storageState: TEST_USERS.editor.authFile });
|
| 111 |
+
|
| 112 |
+
test('should create agent', async ({ page }) => {
|
| 113 |
+
// Test logic here
|
| 114 |
+
});
|
| 115 |
+
});
|
| 116 |
+
```
|
| 117 |
+
|
| 118 |
+
#### User 2 Only
|
| 119 |
+
|
| 120 |
+
```typescript
|
| 121 |
+
import { TEST_USERS } from '../constants/test-users';
|
| 122 |
+
test.describe('Agent Creation', () => {
|
| 123 |
+
test.use({ storageState: TEST_USERS.editor2.authFile });
|
| 124 |
+
|
| 125 |
+
test('should create agent', async ({ page }) => {
|
| 126 |
+
// Test logic here
|
| 127 |
+
});
|
| 128 |
+
});
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
#### User 1 and User 2
|
| 132 |
+
|
| 133 |
+
This is the most common use case for multi-user testing.
|
| 134 |
+
|
| 135 |
+
```typescript
|
| 136 |
+
import { TEST_USERS } from '../constants/test-users';
|
| 137 |
+
test.describe('Agent Sharing', () => {
|
| 138 |
+
test('user sharing workflow', async ({ browser }) => {
|
| 139 |
+
// User1 creates agent
|
| 140 |
+
const user1Context = await browser.newContext({
|
| 141 |
+
storageState: TEST_USERS.editor.authFile,
|
| 142 |
+
});
|
| 143 |
+
const user1Page = await user1Context.newPage();
|
| 144 |
+
|
| 145 |
+
// User2 interacts with shared agent
|
| 146 |
+
const user2Context = await browser.newContext({
|
| 147 |
+
storageState: TEST_USERS.editor2.authFile,
|
| 148 |
+
});
|
| 149 |
+
const user2Page = await user2Context.newPage();
|
| 150 |
+
});
|
| 151 |
+
});
|
| 152 |
+
```
|
| 153 |
+
|
| 154 |
+
### Benefits
|
| 155 |
+
|
| 156 |
+
- **No duplicate test runs** - Regular tests run once with user1
|
| 157 |
+
- **Efficient multi-user testing** - Only when needed for sharing features
|
| 158 |
+
- **Clean isolation** - Each test gets fresh authentication state
|
| 159 |
+
|
| 160 |
+
## 🔍 Best Practices
|
| 161 |
+
|
| 162 |
+
### Reliable Selectors
|
| 163 |
+
|
| 164 |
+
Always use `data-testid` attributes for stable selectors:
|
| 165 |
+
|
| 166 |
+
```typescript
|
| 167 |
+
// ✅ Good - stable and semantic
|
| 168 |
+
await page.getByTestId('agent-name-input').fill('My Agent');
|
| 169 |
+
await page.getByTestId('agent-save-button').click();
|
| 170 |
+
|
| 171 |
+
// ❌ Avoid - fragile and language-dependent
|
| 172 |
+
await page.locator('input[placeholder="Enter agent name"]').fill('My Agent');
|
| 173 |
+
await page.getByText('Save').click();
|
| 174 |
+
```
|
| 175 |
+
|
| 176 |
+
### Waiting Strategies
|
| 177 |
+
|
| 178 |
+
Use appropriate waiting strategies for reliability:
|
| 179 |
+
|
| 180 |
+
```typescript
|
| 181 |
+
// Wait for network activity to settle
|
| 182 |
+
await page.waitForLoadState('networkidle');
|
| 183 |
+
|
| 184 |
+
// Wait for specific API responses
|
| 185 |
+
const responsePromise = page.waitForResponse(
|
| 186 |
+
(response) => response.url().includes('/api/agent/') && response.request().method() === 'PUT'
|
| 187 |
+
);
|
| 188 |
+
await page.getByTestId('save-button').click();
|
| 189 |
+
await responsePromise;
|
| 190 |
+
|
| 191 |
+
// Wait for navigation
|
| 192 |
+
await page.waitForURL('**/agents', { timeout: 10000 });
|
| 193 |
+
```
|
| 194 |
+
|
| 195 |
+
### Unique Test Data
|
| 196 |
+
|
| 197 |
+
Generate unique data to avoid conflicts:
|
| 198 |
+
|
| 199 |
+
```typescript
|
| 200 |
+
const testSuffix = Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
| 201 |
+
const agentName = `Test Agent ${testSuffix}`;
|
| 202 |
+
```
|
| 203 |
+
|
| 204 |
+
## 🐛 Debugging
|
| 205 |
+
|
| 206 |
+
### Debug Commands
|
| 207 |
+
|
| 208 |
+
```bash
|
| 209 |
+
# Run specific test with browser visible
|
| 210 |
+
pnpm test:e2e -- tests/agents/agent-creation.spec.ts --headed
|
| 211 |
+
|
| 212 |
+
# Debug mode with breakpoints
|
| 213 |
+
pnpm test:e2e:debug
|
| 214 |
+
|
| 215 |
+
# Run single test
|
| 216 |
+
npx playwright test -g "should create agent"
|
| 217 |
+
|
| 218 |
+
# Generate test report
|
| 219 |
+
npx playwright show-report
|
| 220 |
+
```
|
| 221 |
+
|
| 222 |
+
### Debug Helpers
|
| 223 |
+
|
| 224 |
+
Add debug information to tests:
|
| 225 |
+
|
| 226 |
+
```typescript
|
| 227 |
+
// Take screenshots for debugging
|
| 228 |
+
await page.screenshot({ path: 'debug-agent-creation.png', fullPage: true });
|
| 229 |
+
|
| 230 |
+
// Log page content
|
| 231 |
+
console.log('Current URL:', page.url());
|
| 232 |
+
const agents = await page.locator('[data-testid="agent-card-name"]').all();
|
| 233 |
+
console.log(`Found ${agents.length} agents`);
|
| 234 |
+
```
|
| 235 |
+
|
| 236 |
+
### Common Issues
|
| 237 |
+
|
| 238 |
+
**Tests timing out:**
|
| 239 |
+
|
| 240 |
+
- Ensure `E2E_DEFAULT_MODEL` is set to a fast model
|
| 241 |
+
- Check database connection and API keys
|
| 242 |
+
- Increase timeout for slow operations
|
| 243 |
+
|
| 244 |
+
**Authentication failures:**
|
| 245 |
+
|
| 246 |
+
- Verify `BETTER_AUTH_SECRET` is set
|
| 247 |
+
- Check PostgreSQL connection
|
| 248 |
+
- Ensure auth setup completes successfully
|
| 249 |
+
|
| 250 |
+
**Element not found:**
|
| 251 |
+
|
| 252 |
+
- Verify data-testid exists in component
|
| 253 |
+
- Check for loading states
|
| 254 |
+
- Use proper waiting strategies
|
| 255 |
+
|
| 256 |
+
## 🚀 CI/CD Integration
|
| 257 |
+
|
| 258 |
+
Tests run automatically on GitHub Actions with:
|
| 259 |
+
|
| 260 |
+
- **PostgreSQL 17** test database
|
| 261 |
+
- **Parallel execution** across multiple workers
|
| 262 |
+
- **Automatic artifact upload** for debugging
|
| 263 |
+
- **Clean test environment** isolated from production
|
| 264 |
+
|
| 265 |
+
## 📝 Writing New Tests
|
| 266 |
+
|
| 267 |
+
### Test Template
|
| 268 |
+
|
| 269 |
+
```typescript
|
| 270 |
+
import { test, expect } from '@playwright/test';
|
| 271 |
+
import { TEST_USERS } from '../constants/test-users';
|
| 272 |
+
test.describe('Your Feature', () => {
|
| 273 |
+
test.use({ storageState: TEST_USERS.editor.authFile });
|
| 274 |
+
|
| 275 |
+
test('should perform action', async ({ page }) => {
|
| 276 |
+
// Navigate to page
|
| 277 |
+
await page.goto('/your-feature');
|
| 278 |
+
|
| 279 |
+
// Perform actions
|
| 280 |
+
await page.getByTestId('input-field').fill('test value');
|
| 281 |
+
await page.getByTestId('submit-button').click();
|
| 282 |
+
|
| 283 |
+
// Wait for response
|
| 284 |
+
await page.waitForURL('**/success', { timeout: 10000 });
|
| 285 |
+
|
| 286 |
+
// Verify results
|
| 287 |
+
await expect(page.getByTestId('success-message')).toBeVisible();
|
| 288 |
+
});
|
| 289 |
+
});
|
| 290 |
+
```
|
| 291 |
+
|
| 292 |
+
### Multi-User Test Template
|
| 293 |
+
|
| 294 |
+
```typescript
|
| 295 |
+
import { TEST_USERS } from '../constants/test-users';
|
| 296 |
+
test('multi-user workflow', async ({ browser }) => {
|
| 297 |
+
const testId = Date.now().toString(36);
|
| 298 |
+
|
| 299 |
+
// User1 setup
|
| 300 |
+
const user1Context = await browser.newContext({
|
| 301 |
+
storageState: TEST_USERS.editor.authFile,
|
| 302 |
+
});
|
| 303 |
+
const user1Page = await user1Context.newPage();
|
| 304 |
+
|
| 305 |
+
try {
|
| 306 |
+
// User1 actions
|
| 307 |
+
await user1Page.goto('/create');
|
| 308 |
+
// ... user1 workflow
|
| 309 |
+
} finally {
|
| 310 |
+
await user1Context.close();
|
| 311 |
+
}
|
| 312 |
+
|
| 313 |
+
// User2 verification
|
| 314 |
+
const user2Context = await browser.newContext({
|
| 315 |
+
storageState: 'tests/.auth/user2.json',
|
| 316 |
+
});
|
| 317 |
+
const user2Page = await user2Context.newPage();
|
| 318 |
+
|
| 319 |
+
try {
|
| 320 |
+
// User2 actions
|
| 321 |
+
await user2Page.goto('/shared');
|
| 322 |
+
// ... user2 workflow
|
| 323 |
+
} finally {
|
| 324 |
+
await user2Context.close();
|
| 325 |
+
}
|
| 326 |
+
});
|
| 327 |
+
```
|
| 328 |
+
|
| 329 |
+
## 🧹 Data Cleanup
|
| 330 |
+
|
| 331 |
+
Tests automatically clean up after themselves:
|
| 332 |
+
|
| 333 |
+
1. **User identification** by email patterns (`playwright.*@example.com`)
|
| 334 |
+
2. **Cascade deletion** respecting foreign key constraints
|
| 335 |
+
3. **Complete cleanup** of test users and related data
|
| 336 |
+
|
| 337 |
+
No manual cleanup required - the system handles it automatically!
|
| 338 |
+
|
| 339 |
+
---
|
| 340 |
+
|
| 341 |
+
For more examples, see the existing test files in the `tests/` directory. Each test demonstrates different patterns and best practices for reliable e2e testing.
|
docs/tips-guides/file-storage.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# File Storage Setup
|
| 2 |
+
|
| 3 |
+
> **Note**: This documentation was written by Claude 3.5 Sonnet.
|
| 4 |
+
|
| 5 |
+
This project supports **cloud-based file storage** for handling file uploads and downloads.
|
| 6 |
+
|
| 7 |
+
## Overview
|
| 8 |
+
|
| 9 |
+
Files are stored with **public access** by default, making them accessible via URL. This is useful for sharing uploaded content, displaying images, and integrating with external services.
|
| 10 |
+
|
| 11 |
+
## Storage Drivers
|
| 12 |
+
|
| 13 |
+
The project supports two storage backends:
|
| 14 |
+
|
| 15 |
+
- **Vercel Blob** - Default for all deployments (recommended)
|
| 16 |
+
- **S3** - Planned for AWS/S3-compatible storage
|
| 17 |
+
|
| 18 |
+
**Vercel Blob** is the default storage driver and works seamlessly in both local development and production environments.
|
| 19 |
+
|
| 20 |
+
## Configuration
|
| 21 |
+
|
| 22 |
+
### Environment Variables
|
| 23 |
+
|
| 24 |
+
```ini
|
| 25 |
+
# Storage driver selection (defaults to vercel-blob)
|
| 26 |
+
FILE_STORAGE_TYPE=vercel-blob # or s3 (coming soon)
|
| 27 |
+
|
| 28 |
+
# Optional: Subdirectory prefix for organizing files
|
| 29 |
+
FILE_STORAGE_PREFIX=uploads
|
| 30 |
+
|
| 31 |
+
# === Vercel Blob (FILE_STORAGE_TYPE=vercel-blob) ===
|
| 32 |
+
BLOB_READ_WRITE_TOKEN=<auto on Vercel>
|
| 33 |
+
VERCEL_BLOB_CALLBACK_URL= # Optional: For local webhook testing with ngrok
|
| 34 |
+
|
| 35 |
+
# === S3 (FILE_STORAGE_TYPE=s3, not yet implemented) ===
|
| 36 |
+
# FILE_STORAGE_S3_BUCKET=
|
| 37 |
+
# FILE_STORAGE_S3_REGION=
|
| 38 |
+
# AWS_ACCESS_KEY_ID=
|
| 39 |
+
# AWS_SECRET_ACCESS_KEY=
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
### Quick Start with Vercel Blob
|
| 43 |
+
|
| 44 |
+
Vercel Blob works in both local development and production environments:
|
| 45 |
+
|
| 46 |
+
1. Go to your Vercel project → **Storage** tab
|
| 47 |
+
2. Click **Connect Database** → **Blob** → **Continue**
|
| 48 |
+
3. Name it (e.g., "Files") and click **Create**
|
| 49 |
+
4. Pull environment variables locally:
|
| 50 |
+
|
| 51 |
+
```bash
|
| 52 |
+
vercel env pull
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
That's it! File uploads will now work seamlessly in both development and production.
|
| 56 |
+
|
| 57 |
+
## Client Upload
|
| 58 |
+
|
| 59 |
+
The `useFileUpload` hook **automatically selects the optimal upload method** based on your storage backend:
|
| 60 |
+
|
| 61 |
+
- **Vercel Blob**: Direct browser → CDN upload (fastest, default)
|
| 62 |
+
- **S3**: Presigned URL upload (when implemented)
|
| 63 |
+
|
| 64 |
+
```tsx
|
| 65 |
+
"use client";
|
| 66 |
+
|
| 67 |
+
import { useFileUpload } from "hooks/use-presigned-upload";
|
| 68 |
+
|
| 69 |
+
function FileUploadComponent() {
|
| 70 |
+
const { upload, isUploading } = useFileUpload();
|
| 71 |
+
|
| 72 |
+
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
|
| 73 |
+
const file = e.target.files?.[0];
|
| 74 |
+
if (!file) return;
|
| 75 |
+
|
| 76 |
+
const result = await upload(file);
|
| 77 |
+
if (!result) return; // Upload failed (error shown via toast)
|
| 78 |
+
|
| 79 |
+
// File uploaded successfully
|
| 80 |
+
console.log("Public URL:", result.url);
|
| 81 |
+
console.log("Pathname (key):", result.pathname);
|
| 82 |
+
};
|
| 83 |
+
|
| 84 |
+
return (
|
| 85 |
+
<input type="file" onChange={handleFileChange} disabled={isUploading} />
|
| 86 |
+
);
|
| 87 |
+
}
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
### Upload Flow
|
| 91 |
+
|
| 92 |
+
#### Vercel Blob (Direct Upload)
|
| 93 |
+
|
| 94 |
+
```mermaid
|
| 95 |
+
sequenceDiagram
|
| 96 |
+
participant Browser
|
| 97 |
+
participant UploadURL as /api/storage/upload-url
|
| 98 |
+
participant Vercel as Vercel Blob CDN
|
| 99 |
+
|
| 100 |
+
Browser->>UploadURL: POST (request client token)
|
| 101 |
+
Note over Browser,UploadURL: User authenticated
|
| 102 |
+
UploadURL->>Vercel: Generate client token
|
| 103 |
+
Vercel-->>UploadURL: Return token
|
| 104 |
+
UploadURL-->>Browser: Return token + URL
|
| 105 |
+
Browser->>Vercel: PUT file (with token)
|
| 106 |
+
Vercel-->>Browser: Upload complete
|
| 107 |
+
Vercel->>UploadURL: Webhook: upload completed
|
| 108 |
+
Note over UploadURL: Optional: Save to DB
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
### Features
|
| 112 |
+
|
| 113 |
+
- ✅ **Cloud-Based Storage**: Vercel Blob provides globally distributed CDN
|
| 114 |
+
- ✅ **Works Everywhere**: Same storage in development and production
|
| 115 |
+
- ✅ **Direct Client Upload**: Browser uploads directly to CDN (fastest)
|
| 116 |
+
- ✅ **Public Access**: All files get public URLs
|
| 117 |
+
- ✅ **Authentication**: Users must be logged in to upload
|
| 118 |
+
- ✅ **Collision Prevention**: UUID-based file naming
|
| 119 |
+
- ✅ **Type Safety**: Full TypeScript support with unified interface
|
| 120 |
+
|
| 121 |
+
## Server-Side Upload
|
| 122 |
+
|
| 123 |
+
For server-side uploads (e.g., programmatically generated files):
|
| 124 |
+
|
| 125 |
+
```ts
|
| 126 |
+
import { serverFileStorage } from "lib/file-storage";
|
| 127 |
+
|
| 128 |
+
const result = await serverFileStorage.upload(buffer, {
|
| 129 |
+
filename: "generated-image.png",
|
| 130 |
+
contentType: "image/png",
|
| 131 |
+
});
|
| 132 |
+
|
| 133 |
+
console.log("Public URL:", result.sourceUrl);
|
| 134 |
+
```
|
| 135 |
+
|
| 136 |
+
## Upload Completion Webhook
|
| 137 |
+
|
| 138 |
+
The `/api/storage/upload-url` endpoint handles the `onUploadCompleted` webhook from Vercel Blob. You can add custom logic here:
|
| 139 |
+
|
| 140 |
+
```ts
|
| 141 |
+
// src/app/api/storage/upload-url/route.ts
|
| 142 |
+
|
| 143 |
+
onUploadCompleted: async ({ blob, tokenPayload }) => {
|
| 144 |
+
const { userId } = JSON.parse(tokenPayload);
|
| 145 |
+
|
| 146 |
+
// Save to database
|
| 147 |
+
await db.files.create({
|
| 148 |
+
url: blob.url,
|
| 149 |
+
pathname: blob.pathname,
|
| 150 |
+
userId,
|
| 151 |
+
size: blob.size,
|
| 152 |
+
contentType: blob.contentType,
|
| 153 |
+
});
|
| 154 |
+
|
| 155 |
+
// Send notification
|
| 156 |
+
// await sendNotification(userId, "File uploaded!");
|
| 157 |
+
};
|
| 158 |
+
```
|
| 159 |
+
|
| 160 |
+
## Advanced
|
| 161 |
+
|
| 162 |
+
### Local Development with Vercel Blob Webhooks
|
| 163 |
+
|
| 164 |
+
To test Vercel Blob's `onUploadCompleted` webhook locally, use [ngrok](https://ngrok.com/):
|
| 165 |
+
|
| 166 |
+
```bash
|
| 167 |
+
# Terminal 1: Start your app
|
| 168 |
+
pnpm dev
|
| 169 |
+
|
| 170 |
+
# Terminal 2: Start ngrok
|
| 171 |
+
ngrok http 3000
|
| 172 |
+
|
| 173 |
+
# Add to .env.local
|
| 174 |
+
VERCEL_BLOB_CALLBACK_URL=https://abc123.ngrok-free.app
|
| 175 |
+
```
|
| 176 |
+
|
| 177 |
+
Without ngrok, uploads will work but `onUploadCompleted` won't be called locally.
|
| 178 |
+
|
| 179 |
+
### Custom Storage Backend
|
| 180 |
+
|
| 181 |
+
To implement a custom storage driver (e.g., Cloudflare R2, MinIO, S3):
|
| 182 |
+
|
| 183 |
+
1. Create a new file in `src/lib/file-storage/` (e.g., `r2-file-storage.ts`)
|
| 184 |
+
2. Implement the `FileStorage` interface from `file-storage.interface.ts`
|
| 185 |
+
3. Add your driver to `index.ts`
|
| 186 |
+
4. Update `FILE_STORAGE_TYPE` environment variable
|
| 187 |
+
|
| 188 |
+
The `FileStorage` interface provides:
|
| 189 |
+
|
| 190 |
+
- `upload()` - Server-side file upload
|
| 191 |
+
- `createUploadUrl()` - Generate presigned URL for client uploads (optional)
|
| 192 |
+
- `download()`, `delete()`, `exists()`, `getMetadata()`, `getSourceUrl()`
|
| 193 |
+
|
| 194 |
+
### Storage Comparison
|
| 195 |
+
|
| 196 |
+
| Feature | Vercel Blob | S3 (Planned) |
|
| 197 |
+
| -------------------- | ------------------- | ------------------ |
|
| 198 |
+
| Direct Client Upload | ✅ Yes | ✅ Yes (presigned) |
|
| 199 |
+
| CDN | ✅ Global | Configurable |
|
| 200 |
+
| Cost | Pay-as-you-go | Pay-as-you-go |
|
| 201 |
+
| Best For | All deployments | AWS ecosystem |
|
| 202 |
+
| Setup Complexity | Minimal | Moderate |
|
| 203 |
+
| Local Development | ✅ Works with token | ✅ Works |
|
| 204 |
+
|
| 205 |
+
## Why Not Local Filesystem?
|
| 206 |
+
|
| 207 |
+
Local filesystem storage is **not supported** because:
|
| 208 |
+
|
| 209 |
+
1. **AI APIs can't access localhost**: When AI APIs receive `http://localhost:3000/file.png`, they cannot fetch the file
|
| 210 |
+
2. **Serverless incompatibility**: Platforms like Vercel don't support persistent filesystem
|
| 211 |
+
3. **No CDN**: Files aren't globally distributed
|
| 212 |
+
|
| 213 |
+
**Solution**: Vercel Blob provides a free tier and works seamlessly in both local development and production. Simply run `vercel env pull` to get your token locally.
|
docs/tips-guides/mcp-oauth-flow.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## 🔐 MCP OAuth Flow
|
| 2 |
+
|
| 3 |
+
The app acts as the OAuth client and stores OAuth sessions in PostgreSQL. On server startup, MCP clients attempt to connect. If authentication is required, the client enters the authorizing state and the UI prompts the user to authorize.
|
| 4 |
+
|
| 5 |
+
```mermaid
|
| 6 |
+
sequenceDiagram
|
| 7 |
+
autonumber
|
| 8 |
+
participant User as User
|
| 9 |
+
participant UI as MCPCard/UI
|
| 10 |
+
participant App as Next App (Server)
|
| 11 |
+
participant Client as MCPClient
|
| 12 |
+
participant Provider as PgOAuthClientProvider
|
| 13 |
+
participant Repo as OAuthRepository(DB)
|
| 14 |
+
participant OAuthSrv as OAuth Server(MCP)
|
| 15 |
+
|
| 16 |
+
Note over App: Server boot → MCP manager init
|
| 17 |
+
App->>Client: connect()
|
| 18 |
+
Client->>Provider: attach OAuth provider if needed
|
| 19 |
+
Provider->>Repo: find token session
|
| 20 |
+
alt token session exists
|
| 21 |
+
Provider-->>Client: use authenticated session
|
| 22 |
+
else no token session
|
| 23 |
+
Provider->>Repo: use in‑progress or create new state session
|
| 24 |
+
Client-->>UI: status = authorizing (needs user action)
|
| 25 |
+
end
|
| 26 |
+
|
| 27 |
+
User->>UI: click Authorize
|
| 28 |
+
UI->>App: authorizeMcpClientAction(id)
|
| 29 |
+
App->>Client: refreshClient(id)
|
| 30 |
+
Client-->>UI: authorizationUrl
|
| 31 |
+
UI->>OAuthSrv: popup login/consent
|
| 32 |
+
OAuthSrv-->>App: /api/mcp/oauth/callback?code&state
|
| 33 |
+
App->>Repo: get session by state
|
| 34 |
+
App->>Client: finishAuth(code)
|
| 35 |
+
Client->>Provider: saveTokens(tokens)
|
| 36 |
+
Provider->>Repo: saveTokensAndCleanup(mcpServerId, state)
|
| 37 |
+
App->>Client: refreshClient(id)
|
| 38 |
+
App-->>UI: postMessage(MCP_OAUTH_SUCCESS)
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
Notes:
|
| 42 |
+
|
| 43 |
+
- Multi‑instance safe: unique state per attempt; when tokens are saved, incomplete sessions for the same server are cleaned up.
|
| 44 |
+
- Security guard: redirect URI mismatch clears all sessions and restarts the flow.
|
| 45 |
+
|
| 46 |
+
|
docs/tips-guides/mcp-server-setup-and-tool-testing.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🔧 MCP Server Configuration Guide
|
| 2 |
+
|
| 3 |
+
> This guide explains how to add MCP servers by defining their configuration in JSON format. Each MCP server entry is stored in the database and supports different transport types: `stdio`, `SSE`, and `StreamableHTTP`.
|
| 4 |
+
|
| 5 |
+
You can add new MCP servers effortlessly through the UI — no need to restart the app. Each tool is available instantly and can be tested independently outside of chat. This is perfect for quick debugging and reliable development workflows.
|
| 6 |
+
|
| 7 |
+

|
| 8 |
+
|
| 9 |
+
<br/>
|
| 10 |
+
|
| 11 |
+
## 🖥️ Stdio Type
|
| 12 |
+
|
| 13 |
+
Used for locally executed tools that run via a command-line interface.
|
| 14 |
+
|
| 15 |
+
**Example:**
|
| 16 |
+
|
| 17 |
+
```json
|
| 18 |
+
{
|
| 19 |
+
"command": "npx",
|
| 20 |
+
"args": ["@playwright/mcp@latest"]
|
| 21 |
+
}
|
| 22 |
+
```
|
| 23 |
+
|
| 24 |
+
- `command`: Required. The CLI command to launch the server.
|
| 25 |
+
- `args`: Optional. A list of arguments to pass to the command.
|
| 26 |
+
|
| 27 |
+
## 🌐 SSE / StreamableHTTP Type
|
| 28 |
+
|
| 29 |
+
Used for remote servers that communicate via HTTP (SSE or streaming).
|
| 30 |
+
|
| 31 |
+
**Example:**
|
| 32 |
+
|
| 33 |
+
```json
|
| 34 |
+
{
|
| 35 |
+
"url": "https://api.example.com",
|
| 36 |
+
"headers": {
|
| 37 |
+
"Authorization": "Bearer sk-..."
|
| 38 |
+
}
|
| 39 |
+
}
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
- `url`: Required. The endpoint to connect to.
|
| 43 |
+
- `headers`: Optional. HTTP headers such as authorization tokens.
|
| 44 |
+
|
| 45 |
+
You don't need to specify the transport type manually — it is inferred based on the structure:
|
| 46 |
+
|
| 47 |
+
- If `command` is present → it's a `stdio` config
|
| 48 |
+
- If `url` is present → it's a `SSE` or `StreamableHTTP` config
|
| 49 |
+
|
| 50 |
+
## 💾 File-based Configuration (for local dev)
|
| 51 |
+
|
| 52 |
+
By default, MCP server configs are stored in the database.
|
| 53 |
+
However, for local development, you can also use a file-based approach by enabling the following setting:
|
| 54 |
+
|
| 55 |
+
```env
|
| 56 |
+
# Whether to use file-based MCP config (default: false)
|
| 57 |
+
FILE_BASED_MCP_CONFIG=true
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
Then, create a `.mcp-config.json` file in the project root and define your servers there. Example:
|
| 61 |
+
|
| 62 |
+
```jsonc
|
| 63 |
+
// .mcp-config.json
|
| 64 |
+
{
|
| 65 |
+
"playwright": {
|
| 66 |
+
"command": "npx",
|
| 67 |
+
"args": ["@playwright/mcp@latest"]
|
| 68 |
+
}
|
| 69 |
+
}
|
| 70 |
+
```
|
| 71 |
+
|
| 72 |
+
Simply paste your configuration in the MCP Configuration form (or .mcp-config.json) to register a new tool.
|
docs/tips-guides/oauth.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## Social Login Setup (Google & GitHub, English)
|
| 2 |
+
|
| 3 |
+
### Get your Google credentials
|
| 4 |
+
|
| 5 |
+
To use Google as a social provider, you need to get your Google credentials. You can get them by creating a new project in the [Google Cloud Console](https://console.cloud.google.com/apis/dashboard).
|
| 6 |
+
|
| 7 |
+
- In the Google Cloud Console, go to **APIs & Services > Credentials**.
|
| 8 |
+
- Click **Create Credentials** and select **OAuth client ID**.
|
| 9 |
+
- Choose **Web application** as the application type.
|
| 10 |
+
- In **Authorized redirect URIs**, set:
|
| 11 |
+
- For local development: `http://localhost:3000/api/auth/callback/google`
|
| 12 |
+
- For production: your deployed application's URL, e.g. `https://example.com/api/auth/callback/google`
|
| 13 |
+
- If you change the base path of your authentication routes, update the redirect URL accordingly.
|
| 14 |
+
- After creation, copy your **Client ID** and **Client Secret** and add them to your `.env` file:
|
| 15 |
+
```
|
| 16 |
+
GOOGLE_CLIENT_ID=your_client_id
|
| 17 |
+
GOOGLE_CLIENT_SECRET=your_client_secret
|
| 18 |
+
```
|
| 19 |
+
|
| 20 |
+
### Get your GitHub credentials
|
| 21 |
+
|
| 22 |
+
To use GitHub sign in, you need a client ID and client secret. You can get them from the [GitHub Developer Portal](https://github.com/settings/developers).
|
| 23 |
+
|
| 24 |
+
- For local development, set the redirect URL to:
|
| 25 |
+
- `http://localhost:3000/api/auth/callback/github`
|
| 26 |
+
- For production, set it to your deployed application's URL, e.g.:
|
| 27 |
+
- `https://your-domain.com/api/auth/callback/github`
|
| 28 |
+
- If you change the base path of your authentication routes, make sure to update the redirect URL accordingly.
|
| 29 |
+
- **Important:** You MUST include the `user:email` scope in your GitHub app to ensure the application can access the user's email address.
|
| 30 |
+
- Add your credentials to your `.env` file:
|
| 31 |
+
```
|
| 32 |
+
GITHUB_CLIENT_ID=your_client_id
|
| 33 |
+
GITHUB_CLIENT_SECRET=your_client_secret
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
### Get your Microsoft credentials
|
| 37 |
+
|
| 38 |
+
To use Microsoft as a social provider, you need to get your Microsoft credentials. You can get them by creating a new app in the [Microsoft Azure Portal](https://portal.azure.com/).
|
| 39 |
+
|
| 40 |
+
- In the Microsoft Azure Portal, go to **Azure Active Directory > App registrations**.
|
| 41 |
+
- Click **New registration**.
|
| 42 |
+
- Choose **Web** as the application type.
|
| 43 |
+
- In **Redirect URIs**, set:
|
| 44 |
+
- For local development: `http://localhost:3000/api/auth/callback/microsoft`
|
| 45 |
+
- For production: your deployed application's URL, e.g. `https://example.com/api/auth/callback/microsoft`
|
| 46 |
+
- If you change the base path of your authentication routes, update the redirect URL accordingly.
|
| 47 |
+
- Add your credentials to your `.env` file:
|
| 48 |
+
|
| 49 |
+
```text
|
| 50 |
+
MICROSOFT_CLIENT_ID=your_client_id
|
| 51 |
+
MICROSOFT_CLIENT_SECRET=your_client_secret
|
| 52 |
+
MICROSOFT_TENANT_ID=your_tenant_id # Optional
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
## Environment Variable Check
|
| 56 |
+
|
| 57 |
+
Make sure your `.env` file contains the following variables:
|
| 58 |
+
|
| 59 |
+
```text
|
| 60 |
+
GOOGLE_CLIENT_ID=your_google_client_id
|
| 61 |
+
GOOGLE_CLIENT_SECRET=your_google_client_secret
|
| 62 |
+
# Set to 1 to force account selection
|
| 63 |
+
GOOGLE_FORCE_ACCOUNT_SELECTION=1
|
| 64 |
+
|
| 65 |
+
GITHUB_CLIENT_ID=your_github_client_id
|
| 66 |
+
GITHUB_CLIENT_SECRET=your_github_client_secret
|
| 67 |
+
|
| 68 |
+
# Microsoft
|
| 69 |
+
MICROSOFT_CLIENT_ID=your_microsoft_client_id
|
| 70 |
+
MICROSOFT_CLIENT_SECRET=your_microsoft_client_secret
|
| 71 |
+
# Optional Tenant Id
|
| 72 |
+
MICROSOFT_TENANT_ID=your_microsoft_tenant_id
|
| 73 |
+
# Set to 1 to force account selection
|
| 74 |
+
MICROSOFT_FORCE_ACCOUNT_SELECTION=1
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
## Additional Configuration Options
|
| 80 |
+
|
| 81 |
+
### Authentication Settings
|
| 82 |
+
|
| 83 |
+
```text
|
| 84 |
+
# Disable email/password sign-in (optional)
|
| 85 |
+
DISABLE_EMAIL_SIGN_IN=1
|
| 86 |
+
|
| 87 |
+
# Disable new user sign-ups (optional)
|
| 88 |
+
DISABLE_SIGN_UP=1
|
| 89 |
+
```
|
| 90 |
+
|
| 91 |
+
### Base URL Configuration
|
| 92 |
+
|
| 93 |
+
For OAuth to work correctly, you must set the `BETTER_AUTH_URL` environment variable to match how you access the application:
|
| 94 |
+
|
| 95 |
+
```text
|
| 96 |
+
# For local development with HTTPS
|
| 97 |
+
BETTER_AUTH_URL=https://localhost:3000
|
| 98 |
+
|
| 99 |
+
# For local development with HTTP (default)
|
| 100 |
+
BETTER_AUTH_URL=http://localhost:3000
|
| 101 |
+
|
| 102 |
+
# For production
|
| 103 |
+
BETTER_AUTH_URL=https://yourdomain.com
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
**Important:** If you're using HTTPS locally (e.g., via a reverse proxy or custom SSL setup), make sure to set `BETTER_AUTH_URL=https://localhost:3000` to ensure OAuth callbacks work correctly.
|
| 107 |
+
|
| 108 |
+
## Done
|
| 109 |
+
|
| 110 |
+
You can now sign in to better-chatbot using your Google, GitHub or Microsoft account. Restart the application to apply the changes.
|
docs/tips-guides/system-prompts-and-customization.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🎯 System Prompts & Chat Customization Guide
|
| 2 |
+
|
| 3 |
+
> Transform your chatbot experience with powerful system prompt customization. The better-chatbot uses a sophisticated multi-layered prompt system that adapts to your preferences, project context, and MCP tool usage — making every conversation more personalized and effective.
|
| 4 |
+
|
| 5 |
+
The system intelligently combines multiple prompt layers to create the perfect context for each chat, ensuring the assistant understands exactly how to help you.
|
| 6 |
+
|
| 7 |
+
```mermaid
|
| 8 |
+
flowchart TD
|
| 9 |
+
A[Base System Prompt] --> E[Final Context]
|
| 10 |
+
B[User Preferences] --> E
|
| 11 |
+
C[Project Instructions] --> E
|
| 12 |
+
D[MCP Tool Customizations] --> E
|
| 13 |
+
```
|
| 14 |
+
|
| 15 |
+
<br/>
|
| 16 |
+
|
| 17 |
+
## 🔧 Accessing Chat Preferences
|
| 18 |
+
|
| 19 |
+
Click the **settings button** in the bottom-left corner to open the dropdown menu, then select **"Chat Preferences"** to customize how the assistant interacts with you.
|
| 20 |
+
|
| 21 |
+
### 👤 Personal Preferences
|
| 22 |
+
|
| 23 |
+
Configure three key aspects of your interaction:
|
| 24 |
+
|
| 25 |
+
**Assistant Name:** How you'd like the assistant to address you
|
| 26 |
+
- Example: "Alex", "Dr. Smith", "Team Lead"
|
| 27 |
+
|
| 28 |
+
**Your Role/Profession:** Your job or expertise area (helps the assistant tailor explanations)
|
| 29 |
+
- Example: "Software Engineer", "Marketing Manager", "Student"
|
| 30 |
+
|
| 31 |
+
**Response Style:** How you prefer the assistant to communicate
|
| 32 |
+
- Example: "Keep explanations brief and to the point"
|
| 33 |
+
- Example: "When learning new concepts, I find analogies particularly helpful"
|
| 34 |
+
- Example: "Ask clarifying questions before giving detailed answers"
|
| 35 |
+
|
| 36 |
+
<br/>
|
| 37 |
+
|
| 38 |
+
## ⚙️ Custom Instructions for MCP Tools
|
| 39 |
+
|
| 40 |
+
Access **"Custom Instructions"** to set up context that automatically applies when using MCP servers and tools.
|
| 41 |
+
|
| 42 |
+
### 🖥️ MCP Server Instructions
|
| 43 |
+
|
| 44 |
+
Set default context for entire MCP servers. Perfect for avoiding repetitive information:
|
| 45 |
+
|
| 46 |
+
**GitHub MCP Server Example:**
|
| 47 |
+
```
|
| 48 |
+
Default repository: owner/repo-name
|
| 49 |
+
Always use the main branch unless specified
|
| 50 |
+
Include issue labels when creating issues
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
**File System MCP Server Example:**
|
| 54 |
+
```
|
| 55 |
+
Working directory: /Users/username/projects/my-app
|
| 56 |
+
Prefer relative paths in responses
|
| 57 |
+
Always backup before making destructive changes
|
| 58 |
+
```
|
| 59 |
+
|
| 60 |
+
### 🔧 Individual Tool Instructions
|
| 61 |
+
|
| 62 |
+
Configure specific tools within MCP servers for even more precision:
|
| 63 |
+
|
| 64 |
+
**Google Login Tool Example:**
|
| 65 |
+
```
|
| 66 |
+
Default email: user@company.com
|
| 67 |
+
Prefer 2FA authentication when available
|
| 68 |
+
```
|
| 69 |
+
|
| 70 |
+
**Database Query Tool Example:**
|
| 71 |
+
```
|
| 72 |
+
Default database: production
|
| 73 |
+
Always explain query results in business terms
|
| 74 |
+
Include performance impact warnings for large queries
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
<br/>
|
| 78 |
+
|
| 79 |
+
## 🏗️ How the System Works
|
| 80 |
+
|
| 81 |
+
The chatbot combines four distinct prompt layers to create the perfect context:
|
| 82 |
+
|
| 83 |
+
1. **Base System Prompt** - Core better-chatbot behavior
|
| 84 |
+
2. **User Preferences** - Your personal settings and communication style
|
| 85 |
+
3. **Project Instructions** - Context from the current project (if applicable)
|
| 86 |
+
4. **MCP Customizations** - Tool-specific instructions (only when tools are used)
|
| 87 |
+
|
| 88 |
+
This layered approach ensures:
|
| 89 |
+
- ✅ **Efficiency**: Only relevant context is included
|
| 90 |
+
- ✅ **Consistency**: Your preferences apply across all chats
|
| 91 |
+
- ✅ **Flexibility**: Different projects can have different contexts
|
| 92 |
+
- ✅ **Intelligence**: Tool instructions activate only when needed
|
| 93 |
+
|
| 94 |
+
<br/>
|
| 95 |
+
|
| 96 |
+
## 💡 Pro Tips
|
| 97 |
+
|
| 98 |
+
**Start Simple:** Begin with basic preferences, then add MCP customizations as you use specific tools regularly.
|
| 99 |
+
|
| 100 |
+
**Be Specific:** The more detailed your instructions, the better the assistant can help. Instead of "be helpful," try "explain technical concepts with real-world examples."
|
| 101 |
+
|
| 102 |
+
**Test & Iterate:** Use the tool testing feature to see how your customizations affect tool behavior before using them in important chats.
|
| 103 |
+
|
| 104 |
+
**Project Synergy:** Combine personal preferences with project-specific instructions for domain expertise (e.g., "React developer" + "E-commerce project context").
|
| 105 |
+
|
| 106 |
+
> 💡 **Result:** Every conversation becomes more productive because the assistant already understands your context, preferences, and workflow — no need to repeat yourself!
|
docs/tips-guides/temporary_chat.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 💬 Temporary Chat Guide
|
| 2 |
+
|
| 3 |
+
Temporary Chat allows you to interact with the assistant in a lightweight, popup-style chat — without creating a new thread or saving any messages. It's perfect for side questions, quick tests, or one-off tasks.
|
| 4 |
+
|
| 5 |
+

|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
## 🔄 How It Works
|
| 9 |
+
|
| 10 |
+
* Open or close the temporary chat anytime using the shortcut (`⌘K`) or the button in the top right corner.
|
| 11 |
+
* You can reset the temporary chat with a shortcut (`⌘E`).
|
| 12 |
+
* It appears as a **right-side sliding panel** so you can keep your main chat open.
|
| 13 |
+
* Messages sent here are **not saved** to history — once closed, they're gone.
|
| 14 |
+
* Temporary chat supports its own **System Prompt**, allowing you to customize behavior.
|
| 15 |
+
|
| 16 |
+
<img width="1418" alt="systemprompt" src="https://github.com/user-attachments/assets/8e851ace-9deb-4cd4-87ef-2ab56ecad731" />
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
## 🧠 Why It's Useful
|
| 20 |
+
|
| 21 |
+
Imagine you're in the middle of an important discussion and you suddenly need a quick translation or to test a tool — but don't want to clutter the current chat. Temporary Chat is built exactly for that.
|
| 22 |
+
|
| 23 |
+
**Use cases include:**
|
| 24 |
+
|
| 25 |
+
* Asking a quick side question without breaking the main conversation flow
|
| 26 |
+
* Testing a prompt or tool before using it in your main chat
|
| 27 |
+
* Setting up a dedicated system prompt for focused tasks (e.g. translation, formatting)
|
| 28 |
+
|
| 29 |
+
## 📝 Real-World Example
|
| 30 |
+
|
| 31 |
+
For example, if you are not fluent in English, you can set a translation-focused system prompt in the temporary chat (e.g. "Translate everything naturally between Korean and English without extra explanation"). While having a main conversation, whenever you need a translation, you can quickly open the temporary chat using the shortcut, get the translation you need to understand the context, and then return to your main chat to continue the discussion.
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
Temporary Chat helps keep your main conversations clean, while still giving you flexibility and speed for all your side tasks.
|
docs/tips-guides/vercel.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Vercel Deployment Guide
|
| 2 |
+
|
| 3 |
+
The easiest way to get started with **better-chatbot** is to deploy it directly to Vercel.
|
| 4 |
+
You only need **one AI Provider API Key** (OpenAI, Gemini, Claude, etc.) to run the app.
|
| 5 |
+
Database, file storage, and caching are all available on free tiers.
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## Steps
|
| 10 |
+
|
| 11 |
+
1. **Click this button** to start the deployment process:
|
| 12 |
+
[](https://vercel.com/new/clone?repository-url=https://github.com/cgoinglove/better-chatbot&env=BETTER_AUTH_SECRET&env=OPENAI_API_KEY&env=GOOGLE_GENERATIVE_AI_API_KEY&env=ANTHROPIC_API_KEY&envDescription=BETTER_AUTH_SECRET+is+required+%28enter+any+secret+value%29.+At+least+one+LLM+provider+API+key+%28OpenAI,+Claude,+or+Google%29+is+required,+but+you+can+add+all+of+them.+See+the+link+below+for+details.&envLink=https://github.com/cgoinglove/better-chatbot/blob/main/.env.example&demo-title=better-chatbot&demo-description=An+Open-Source+Chatbot+Template+Built+With+Next.js+and+the+AI+SDK+by+Vercel.&products=[{%22type%22:%22integration%22,%22protocol%22:%22storage%22,%22productSlug%22:%22neon%22,%22integrationSlug%22:%22neon%22},{%22type%22:%22integration%22,%22protocol%22:%22storage%22,%22productSlug%22:%22upstash-kv%22,%22integrationSlug%22:%22upstash%22},{%22type%22:%22blob%22}])
|
| 13 |
+
|
| 14 |
+
2. **Click the "Create" button** on Vercel to begin setting up your project.
|
| 15 |
+
|
| 16 |
+
<img width="1254" alt="step2" src="https://github.com/user-attachments/assets/66806fa8-2d55-4e57-ad7e-2f37ef037a97" />
|
| 17 |
+
|
| 18 |
+
3. **Add all required resources.**
|
| 19 |
+
When prompted, add:
|
| 20 |
+
|
| 21 |
+
- **Database (Neon Postgres)**
|
| 22 |
+
- **Blob Storage (Vercel Blob)**
|
| 23 |
+
- **Redis (Upstash KV)**
|
| 24 |
+
All of these are available with free-tier plans.
|
| 25 |
+
|
| 26 |
+
<img width="1156" height="876" alt="step3" src="https://github.com/user-attachments/assets/55b2de40-9006-42f8-89e2-dbfc511c4bc6" />
|
| 27 |
+
|
| 28 |
+
4. **Set Environment Variables.**
|
| 29 |
+
|
| 30 |
+
- You must enter a value for **BETTER_AUTH_SECRET** (any random string is fine). You can generate one [here](https://auth-secret-gen.vercel.app/).
|
| 31 |
+
- Enter your **AI Provider API Key(s)**. Only one is required to start (OpenAI, Google Gemini, or Anthropic Claude).
|
| 32 |
+
- You can use placeholder values and update them later in **Project Settings > Environments** after deployment.
|
| 33 |
+
|
| 34 |
+
<img width="989" height="607" alt="step4" src="https://github.com/user-attachments/assets/1778265e-da49-433b-8724-88e8b71dea21" />
|
| 35 |
+
|
| 36 |
+
5. **Deploy your project.**
|
| 37 |
+
Once everything is set, Vercel will automatically build and deploy your project.
|
| 38 |
+
|
| 39 |
+
6. **Update API Keys and Settings (optional).**
|
| 40 |
+
After deployment, go to **Settings > Environments** to add or update your API keys and configuration.
|
| 41 |
+
|
| 42 |
+
- Example environment file: [example.env](https://github.com/cgoinglove/better-chatbot/blob/main/.env.example)
|
| 43 |
+
- You can customize authentication, signup/login, and other options by editing your environment variables here.
|
| 44 |
+
|
| 45 |
+
<img width="1712" alt="step6" src="https://github.com/user-attachments/assets/2d197389-a865-46ac-9156-40cad64258ca" />
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## Notes
|
| 50 |
+
|
| 51 |
+
- To enable **web search**, you can request an API key from [Exa](https://dashboard.exa.ai). A free tier is available.
|
| 52 |
+
- Only Remote (SSE, Streamable) MCP servers are supported. STDIO-based servers are not supported on Vercel (consider Docker or Render if needed).
|
| 53 |
+
- Check `.env.example` for all available settings.
|
drizzle.config.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { defineConfig } from "drizzle-kit";
|
| 2 |
+
import "load-env";
|
| 3 |
+
|
| 4 |
+
const dialect = "postgresql";
|
| 5 |
+
|
| 6 |
+
const url = process.env.POSTGRES_URL!;
|
| 7 |
+
|
| 8 |
+
const schema = "./src/lib/db/pg/schema.pg.ts";
|
| 9 |
+
|
| 10 |
+
const out = "./src/lib/db/migrations/pg";
|
| 11 |
+
|
| 12 |
+
export default defineConfig({
|
| 13 |
+
schema,
|
| 14 |
+
out,
|
| 15 |
+
dialect,
|
| 16 |
+
migrations: {},
|
| 17 |
+
dbCredentials: {
|
| 18 |
+
url,
|
| 19 |
+
},
|
| 20 |
+
});
|
messages/en.json
ADDED
|
@@ -0,0 +1,815 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "Cancel",
|
| 4 |
+
"update": "Update",
|
| 5 |
+
"continue": "Continue",
|
| 6 |
+
"success": "Success",
|
| 7 |
+
"delete": "Delete",
|
| 8 |
+
"save": "Save",
|
| 9 |
+
"back": "Back",
|
| 10 |
+
"next": "Next",
|
| 11 |
+
"create": "Create",
|
| 12 |
+
"showLess": "Show less",
|
| 13 |
+
"showMore": "Show more",
|
| 14 |
+
"generate": "Generate",
|
| 15 |
+
"edit": "Edit",
|
| 16 |
+
"editAgent": "Edit Agent",
|
| 17 |
+
"search": "Search...",
|
| 18 |
+
"approve": "Approve",
|
| 19 |
+
"reject": "Reject",
|
| 20 |
+
"saving": "Saving...",
|
| 21 |
+
"optional": "Optional",
|
| 22 |
+
"deleting": "Deleting...",
|
| 23 |
+
"run": "Run",
|
| 24 |
+
"description": "Description",
|
| 25 |
+
"defaultValue": "Default Value",
|
| 26 |
+
"empty": "Empty",
|
| 27 |
+
"required": "Required",
|
| 28 |
+
"options": "Options",
|
| 29 |
+
"status": "Status",
|
| 30 |
+
"result": "Result",
|
| 31 |
+
"startedAt": "Started At",
|
| 32 |
+
"duration": "Duration",
|
| 33 |
+
"addOption": "Add Option",
|
| 34 |
+
"tool": "Tool",
|
| 35 |
+
"selectTool": "Select Tool...",
|
| 36 |
+
"noResults": "No results.",
|
| 37 |
+
"generateWithAI": "Generate With AI",
|
| 38 |
+
"generateInputWithAI": "Generate Input With AI",
|
| 39 |
+
"generatingInputWithAI": "Generating input with AI...",
|
| 40 |
+
"inputGeneratedSuccessfully": "Input generated successfully",
|
| 41 |
+
"failedToGenerateInput": "Failed to generate input",
|
| 42 |
+
"createWithExample": "Create With Example",
|
| 43 |
+
"resultsFound": "{count} results found",
|
| 44 |
+
"youAreAnExpertIn": "You are an expert in {role}",
|
| 45 |
+
"sharedBy": "Shared by {userName}"
|
| 46 |
+
},
|
| 47 |
+
"Error": {},
|
| 48 |
+
"Info": {
|
| 49 |
+
"mcpAddingDisabled": "MCP server addition has been disabled by the administrator.",
|
| 50 |
+
"vercelSyncDelay": "Running on Vercel\n\nMCP changes may take 10-15 seconds to sync. Please wait a moment after adding, editing, or deleting servers if changes don't appear immediately."
|
| 51 |
+
},
|
| 52 |
+
"Workflow": {
|
| 53 |
+
"title": "Workflow",
|
| 54 |
+
"whatIsWorkflow": "What is a Workflow?",
|
| 55 |
+
"myWorkflows": "My Workflows",
|
| 56 |
+
"sharedWorkflows": "Shared Workflows",
|
| 57 |
+
"availableWorkflows": "Available Workflows",
|
| 58 |
+
"noAvailableWorkflows": "No workflows available",
|
| 59 |
+
"noAvailableWorkflowsDescription": "Ask your admin to share workflows with you",
|
| 60 |
+
"createWorkflow": "Create Workflow",
|
| 61 |
+
"draft": "Draft",
|
| 62 |
+
"publish": "Publish",
|
| 63 |
+
"createWorkflowDescription": "Create workflows as powerful tools for your chatbot.",
|
| 64 |
+
"workflowDescription": "These can be triggered during conversations to automate complex tasks.",
|
| 65 |
+
"nameAndIcon": "Name And Icon",
|
| 66 |
+
"workflowNamePlaceholder": "Chatbot will recognize this as tool name",
|
| 67 |
+
"description": "Description",
|
| 68 |
+
"descriptionPlaceholder": "Chatbot will see this as tool description",
|
| 69 |
+
"inputNodeCannotBeDeleted": "Input node cannot be deleted",
|
| 70 |
+
"autoSaveDescription": "Auto saved every 10 seconds",
|
| 71 |
+
"draftDescription": "Currently in Draft.\n\nClick Publish to make it available to chatbot\n(but no longer editable).",
|
| 72 |
+
"publishedDescription": "Currently Published and available to chatbot.\n\nClick Draft to make it editable\n(but unavailable to chatbot).",
|
| 73 |
+
"private": "Private",
|
| 74 |
+
"readonly": "Read Only",
|
| 75 |
+
"public": "Public",
|
| 76 |
+
"privateDescription": "Only you can view, edit, and use this workflow as a tool.",
|
| 77 |
+
"readonlyDescription": "Others can view and use as a tool, but only you can edit.",
|
| 78 |
+
"publicDescription": "Anyone can view, edit, and use this workflow as a tool.",
|
| 79 |
+
"visibilityDescription": "Control who can access and modify this workflow",
|
| 80 |
+
"nodeDescriptionPlaceholder": "node description...",
|
| 81 |
+
"nextNode": "Next Node",
|
| 82 |
+
"nextNodeDescription": "Add a next node to this workflow.",
|
| 83 |
+
"addNextNode": "Add Next Node",
|
| 84 |
+
"inputFields": "Input Fields",
|
| 85 |
+
"addInputField": "Add Input Field",
|
| 86 |
+
"inputFieldsDescription": "Define the parameter schema for this workflow.\n\nWhen the chatbot uses this as a tool,\nit will provide values according to this schema.",
|
| 87 |
+
"fieldEditor": "Field Editor",
|
| 88 |
+
"variableName": "Variable Name",
|
| 89 |
+
"variableNamePlaceholder": "Enter variable name...",
|
| 90 |
+
"fieldDescriptionPlaceholder": "Enter field description...",
|
| 91 |
+
"defaultValuePlaceholder": "Enter default {type} value...",
|
| 92 |
+
"selectOptionPlaceholder": "Select option...",
|
| 93 |
+
"unlink": "Unlink Node",
|
| 94 |
+
"elseIfDescription": "If the condition is not met, the logic to be executed is defined.",
|
| 95 |
+
"elseDescription": "If the condition is not met, the logic to be executed is defined.",
|
| 96 |
+
"addCondition": "Add Condition",
|
| 97 |
+
"noVariablesFound": "No variables found",
|
| 98 |
+
"outputVariables": "Output Variables",
|
| 99 |
+
"outputVariablesDescription": "Output variables are the variables that are output from the workflow.",
|
| 100 |
+
"addOutputVariable": "Add Output Variable",
|
| 101 |
+
"outputSchema": "Output Schema",
|
| 102 |
+
"addMessage": "Add Message",
|
| 103 |
+
"messagesDescription": "Generate data through LLM processing.\n\nUse '/' to mention and reference data from previous nodes as input.\n\nWith Structured Output enabled, perfect for data transformation, formatting, and validation.",
|
| 104 |
+
"descriptionAndSchema": "Description & Schema",
|
| 105 |
+
"noDescriptionAndSchema": "No description and schema",
|
| 106 |
+
"toolDescription": "Provide information needed for LLM to generate tool parameters.\n\nUse '/' to mention data from previous nodes.",
|
| 107 |
+
"generateInputWithAIDescription": "Write a prompt to generate input for the workflow",
|
| 108 |
+
"selectVariable": "Select Variable",
|
| 109 |
+
"structuredOutput": "Structured Output",
|
| 110 |
+
"structuredOutputDescription": "Generate response as JSON object with defined schema",
|
| 111 |
+
"outputSchemaEditor": "Output Schema Editor",
|
| 112 |
+
"addField": "Add Field",
|
| 113 |
+
"saveSchema": "Save Schema",
|
| 114 |
+
"generateSchemaWithAI": "Generate Schema with AI",
|
| 115 |
+
"describeOutputDataRequest": "Provide example JSON data that represents what this node should output\n\nExample: {eg}",
|
| 116 |
+
"generatingJsonSchemaWithAI": "Generating JSON Schema with AI...",
|
| 117 |
+
"jsonSchemaGeneratedSuccessfully": "JSON Schema generated successfully!",
|
| 118 |
+
"failedToGenerateSchema": "Failed to generate schema",
|
| 119 |
+
"jsonSchemaEditorDescription": "Direct JSON Schema editing with AI assistance. Supports complex nested structures and arrays.",
|
| 120 |
+
"template": "Template",
|
| 121 |
+
"templateDescription": "Generate template documents.\n\nUse '/' to reference and use output values from other nodes.",
|
| 122 |
+
"greeting": {
|
| 123 |
+
"buildAutomationTitle": "Build Automation by Connecting Nodes",
|
| 124 |
+
"buildAutomationDescription": "Connect various nodes to automate complex tasks. Each node handles specific functions, and data flows sequentially for processing.",
|
| 125 |
+
"chatbotToolTitle": "Use as Chatbot Tools",
|
| 126 |
+
"chatbotToolDescription": "The main purpose of workflows is to use them as tools in chatbot conversations. Turn repetitive tasks into workflows for easy execution during chats.",
|
| 127 |
+
"parameterBasedTitle": "Parameter-Based Start",
|
| 128 |
+
"parameterBasedDescription": "Input nodes define parameter structures, not triggers. They specify the data format needed when chatbot calls this workflow as a tool.",
|
| 129 |
+
"exampleTitle": "Usage Example",
|
| 130 |
+
"exampleDescription": "Create an \"Email Writing → Translation → Send\" workflow, then easily execute it in chatbot conversations with \"@email_workflow\".",
|
| 131 |
+
"availableNodesTitle": "Available Nodes",
|
| 132 |
+
"upcomingNodesTitle": "Upcoming Nodes",
|
| 133 |
+
"ctaMessage": "Start creating workflows now to expand your chatbot's capabilities!",
|
| 134 |
+
"soonMessage": "Coming soon."
|
| 135 |
+
},
|
| 136 |
+
"example": {
|
| 137 |
+
"babyResearch": "Baby Research",
|
| 138 |
+
"getWeather": "Get Weather"
|
| 139 |
+
},
|
| 140 |
+
"kindsDescription": {
|
| 141 |
+
"input": "Define input parameters that the chatbot will provide when using this workflow as a tool.\n\nSpecify the data structure and validation rules for tool execution.",
|
| 142 |
+
"output": "Collect and return the final results from your workflow execution.\n\nCombine data from multiple nodes into the final tool response.",
|
| 143 |
+
"llm": "Generate text or structured data using AI models.\n\nReference previous node outputs with '/' mentions to create context-aware responses.\n\nUse Structured Output to transform, format, and validate data - not just for text generation.",
|
| 144 |
+
"tool": "Execute MCP tools or external services.\n\nWrite instructions in messages, and LLM will generate the required tool parameters from your context.",
|
| 145 |
+
"note": "Add documentation and comments to organize your workflow logic.\n\nHelp team members understand complex workflow processes.",
|
| 146 |
+
"code": "Execute custom code scripts with access to previous node data.\n\nRun JavaScript, Python, or other languages within your workflow (coming soon).",
|
| 147 |
+
"http": "Fetch data from external APIs and web services via HTTP requests.\n\nIntegrate with REST APIs, webhooks, and third-party services.",
|
| 148 |
+
"template": "Create dynamic documents by combining text with data from previous nodes.\n\nGenerate emails, reports, or formatted content using variable substitution.",
|
| 149 |
+
"condition": "Add conditional logic to branch your workflow based on data evaluation.\n\nCreate if-else logic to handle different scenarios and data conditions."
|
| 150 |
+
},
|
| 151 |
+
"structuredOutputSwitchConfirm": "You currently have structured output enabled.\n What would you like to do?",
|
| 152 |
+
"structuredOutputSwitchConfirmOk": "Edit Structured Output",
|
| 153 |
+
"structuredOutputSwitchConfirmCancel": "Change to Text Output",
|
| 154 |
+
"noTools": "No published workflows available.\nCreate workflows to build custom tools.",
|
| 155 |
+
"arrangeNodes": "Auto Layout",
|
| 156 |
+
"nodesArranged": "Layout applied successfully",
|
| 157 |
+
"visibilityUpdated": "Visibility updated successfully"
|
| 158 |
+
},
|
| 159 |
+
"Auth": {
|
| 160 |
+
"SignIn": {
|
| 161 |
+
"title": "Welcome Back",
|
| 162 |
+
"description": "Sign in to continue to your account",
|
| 163 |
+
"oauthClientIdNotSet": "{provider} client ID is not set",
|
| 164 |
+
"noAccount": "Don't have an account? ",
|
| 165 |
+
"signUp": "Sign up",
|
| 166 |
+
"signIn": "Sign in",
|
| 167 |
+
"orContinueWith": "OR CONTINUE WITH"
|
| 168 |
+
},
|
| 169 |
+
"SignUp": {
|
| 170 |
+
"title": "Create an account",
|
| 171 |
+
"titleAdmin": "Create an Admin Account",
|
| 172 |
+
"signIn": "Sign in",
|
| 173 |
+
"email": "Email",
|
| 174 |
+
"description": "Sign up to your account",
|
| 175 |
+
"signUpDescription": "Start your journey with us",
|
| 176 |
+
"signUpDescriptionAdmin": "Welcome first user! You will be the admin of the system.",
|
| 177 |
+
"signUpInstructionsEmailOnly": "Sign up to your account via your email address",
|
| 178 |
+
"signUpInstructionsEmailAndSocial": "Either click \"Email\" or use a provider to sign up",
|
| 179 |
+
"signUpSocialOnly": "Use a provider to sign up",
|
| 180 |
+
"step1": "Start your journey with us by entering your email address",
|
| 181 |
+
"step2": "I'll use this name when we chat",
|
| 182 |
+
"step3": "Create a strong password to secure your account",
|
| 183 |
+
"signUp": "Sign Up",
|
| 184 |
+
"invalidEmail": "Invalid email address",
|
| 185 |
+
"emailAlreadyExists": "Email already exists",
|
| 186 |
+
"nameRequired": "Name is required",
|
| 187 |
+
"passwordRequired": "Password is required",
|
| 188 |
+
"createAccount": "Create account"
|
| 189 |
+
},
|
| 190 |
+
"Intro": {
|
| 191 |
+
"description": "Welcome to better-chatbot. Sign in to experience our AI-powered conversational tools."
|
| 192 |
+
}
|
| 193 |
+
},
|
| 194 |
+
"Chat": {
|
| 195 |
+
"Error": "Chat Error",
|
| 196 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "This message was not saved. Please try the chat again.",
|
| 197 |
+
"uploadImage": "Upload File",
|
| 198 |
+
"generateImage": "Generate Image",
|
| 199 |
+
"imageUploadedSuccessfully": "Image uploaded successfully",
|
| 200 |
+
"pleaseUploadImageFile": "Please upload an image file",
|
| 201 |
+
"imageSizeMustBeLessThan10MB": "Image size must be less than 10MB",
|
| 202 |
+
"failedToUploadImage": "Failed to upload image",
|
| 203 |
+
"imageUploadFailedUsingBase64": "Image upload failed. Using base64 encoding as fallback.",
|
| 204 |
+
"Greeting": {
|
| 205 |
+
"goodMorning": "Good morning, {name}",
|
| 206 |
+
"goodAfternoon": "Good afternoon, {name}",
|
| 207 |
+
"goodEvening": "Good evening, {name}",
|
| 208 |
+
"niceToSeeYouAgain": "Nice to see you again, {name}",
|
| 209 |
+
"whatAreYouWorkingOnToday": "What are you working on today? {name}",
|
| 210 |
+
"letMeKnowWhenYoureReadyToBegin": "Let me know when you're ready to begin.",
|
| 211 |
+
"whatAreYourThoughtsToday": "What are your thoughts today?",
|
| 212 |
+
"whereWouldYouLikeToStart": "Where would you like to start?",
|
| 213 |
+
"whatAreYouThinking": "What are you thinking? {name}"
|
| 214 |
+
},
|
| 215 |
+
"TemporaryChat": {
|
| 216 |
+
"toggleTemporaryChat": "Toggle Temporary Chat",
|
| 217 |
+
"temporaryChat": "Temporary Chat",
|
| 218 |
+
"resetChat": "Reset Chat",
|
| 219 |
+
"thisChatWontBeSaved": "This chat won't be saved.",
|
| 220 |
+
"feelFreeToAskAnythingTemporarily": "Feel free to ask anything temporarily",
|
| 221 |
+
"temporaryChatInstructions": "Temporary Chat Instructions",
|
| 222 |
+
"temporaryChatInstructionsPlaceholder": "Enter your instructions here",
|
| 223 |
+
"temporaryChatInstructionsDescription": "You can set instructions for the temporary chat. This will be used as a system prompt for the temporary chat."
|
| 224 |
+
},
|
| 225 |
+
"placeholder": "Ask anything or @mention",
|
| 226 |
+
"Tool": {
|
| 227 |
+
"webSearching": "Searching the Web...",
|
| 228 |
+
"searchedTheWeb": "Searched the Web",
|
| 229 |
+
"toolsSetupDescription": "Select tools that the chatbot can use.\nThe chatbot will use selected tools based on its own judgment.\n\nYou can also force the use of specific tools through @mention.",
|
| 230 |
+
"selectToolMode": "Select a tool mode",
|
| 231 |
+
"autoToolModeDescription": "Decides when to use tools without asking you",
|
| 232 |
+
"manualToolModeDescription": "Asks your permission before using any tools",
|
| 233 |
+
"noneToolModeDescription": "Do not use tools. @mention is still available.",
|
| 234 |
+
"toolsSetup": "Tools Setup",
|
| 235 |
+
"preset": "Preset",
|
| 236 |
+
"toolPresets": "Tool Presets",
|
| 237 |
+
"saveAsPreset": "Save As Preset",
|
| 238 |
+
"saveAsPresetDescription": "Save the current tool configuration as a preset.",
|
| 239 |
+
"noPresetsAvailableYet": "No presets available yet",
|
| 240 |
+
"presetNameCannotBeEmpty": "Preset name cannot be empty",
|
| 241 |
+
"presetNameAlreadyExists": "Preset name already exists",
|
| 242 |
+
"presetSaved": "Preset saved",
|
| 243 |
+
"clickSaveAsPresetToGetStarted": "Click Save As Preset to get started.",
|
| 244 |
+
"searchOptions": "Search Options",
|
| 245 |
+
"searchOptionsDescription": "You can pass search options to the chatbot, such as the maximum number of search results, the search date, etc.",
|
| 246 |
+
"defaultToolKit": {
|
| 247 |
+
"visualization": "Data Visualization",
|
| 248 |
+
"webSearch": "Search the Web",
|
| 249 |
+
"http": "HTTP Request",
|
| 250 |
+
"code": "Code Execution"
|
| 251 |
+
},
|
| 252 |
+
"agent": "Agent",
|
| 253 |
+
"mention": "Mention",
|
| 254 |
+
"tools": "Tools",
|
| 255 |
+
"tooManyToolsSelected": "Too many tools selected, please select less than 128 tools",
|
| 256 |
+
"presetNamePlaceholder": "Preset Name",
|
| 257 |
+
"noMcpServersDetected": "No MCP servers detected.",
|
| 258 |
+
"addServer": "Add a server",
|
| 259 |
+
"error": "error",
|
| 260 |
+
"authorizationRequired": "Authorization Required",
|
| 261 |
+
"clickToAuthorize": "Click here to authorize this MCP server and access its tools.",
|
| 262 |
+
"auto": "Auto",
|
| 263 |
+
"manual": "Manual",
|
| 264 |
+
"none": "None",
|
| 265 |
+
"mentionOnly": "@mention only",
|
| 266 |
+
"noToolsAvailable": "No tools available"
|
| 267 |
+
},
|
| 268 |
+
"VoiceChat": {
|
| 269 |
+
"title": "Voice Chat Mode",
|
| 270 |
+
"compactDisplayMode": "Compact display mode",
|
| 271 |
+
"conversationDisplayMode": "Conversation display mode",
|
| 272 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "Please close the voice chat and try again.",
|
| 273 |
+
"startConversation": "Start conversation",
|
| 274 |
+
"closeMic": "Close Mic",
|
| 275 |
+
"openMic": "Open Mic",
|
| 276 |
+
"endConversation": "End conversation",
|
| 277 |
+
"toggleVoiceChat": "Toggle Voice Chat",
|
| 278 |
+
"readyWhenYouAreJustStartTalking": "Ready when you are—just start talking.",
|
| 279 |
+
"yourMicIsOff": "Your mic is off.",
|
| 280 |
+
"preparing": "Preparing...",
|
| 281 |
+
"startVoiceChat": "Start voice chat?"
|
| 282 |
+
},
|
| 283 |
+
"Thread": {
|
| 284 |
+
"chat": "Chat",
|
| 285 |
+
"renameChat": "Rename",
|
| 286 |
+
"exportChat": "Share Link",
|
| 287 |
+
"deleteChat": "Delete Chat",
|
| 288 |
+
"deleteUnarchivedChats": "Delete All Unarchived Chats",
|
| 289 |
+
"confirmDeleteUnarchivedChats": "Are you sure you want to delete all unarchived chats?",
|
| 290 |
+
"thisActionCannotBeUndone": "This action cannot be undone.",
|
| 291 |
+
"unarchivedChatsDeleted": "Unarchived chats have been deleted",
|
| 292 |
+
"failedToDeleteUnarchivedChats": "Failed to delete unarchived chats",
|
| 293 |
+
"failedToDeleteThread": "Failed to delete thread",
|
| 294 |
+
"threadDeleted": "Thread deleted",
|
| 295 |
+
"failedToUpdateThread": "Failed to update thread",
|
| 296 |
+
"titleRequired": "Title is required",
|
| 297 |
+
"threadUpdated": "Thread updated",
|
| 298 |
+
"areYouSureYouWantToDeleteThisChatThread": "Are you sure you want to delete this Chat thread?",
|
| 299 |
+
"sharePublicLink": "Share Public Link",
|
| 300 |
+
"sharePublicLinkDescription": "All messages added after sharing will remain private.",
|
| 301 |
+
"creatingLink": "Creating link...",
|
| 302 |
+
"createLink": "Create Link",
|
| 303 |
+
"linkCopied": "Link copied"
|
| 304 |
+
},
|
| 305 |
+
"ChatPreferences": {
|
| 306 |
+
"title": "Chat Preferences",
|
| 307 |
+
"whatShouldWeCallYou": "What should we call you?",
|
| 308 |
+
"botName": "Assistant Name",
|
| 309 |
+
"whatBestDescribesYourWork": "What best describes your work?",
|
| 310 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "What personal preferences should be taken into account in responses?",
|
| 311 |
+
"responseStyleExample1": "e.g. keep explanations brief and to the point",
|
| 312 |
+
"responseStyleExample2": "e.g. when learning new concepts, I find analogies particularly helpful",
|
| 313 |
+
"responseStyleExample3": "e.g. ask clarifying questions before giving detailed answers",
|
| 314 |
+
"responseStyleExample4": "e.g. remember I primarily code in Python (not a coding beginner)",
|
| 315 |
+
"professionExample1": "e.g. software engineer",
|
| 316 |
+
"professionExample2": "e.g. product manager",
|
| 317 |
+
"professionExample3": "e.g. marketing manager",
|
| 318 |
+
"professionExample4": "e.g. sales manager",
|
| 319 |
+
"professionExample5": "e.g. business analyst",
|
| 320 |
+
"preferencesSaved": "Preferences saved",
|
| 321 |
+
"failedToSavePreferences": "Failed to save preferences",
|
| 322 |
+
"userInstructions": "User Instructions",
|
| 323 |
+
"userInstructionsDescription": "Introduce yourself and get a more personalized response.",
|
| 324 |
+
"mcpInstructions": "MCP Instructions",
|
| 325 |
+
"mcpInstructionsDescription": "Customize the MCP server instructions.",
|
| 326 |
+
"userSettings": "User Settings",
|
| 327 |
+
"myExports": "My Exports",
|
| 328 |
+
"myExportsDescription": "Manage and organize your shared chat exports.",
|
| 329 |
+
"noExportsYet": "No exports yet",
|
| 330 |
+
"exportHint": "Share a chat thread to create your first export.",
|
| 331 |
+
"exported": "Exported",
|
| 332 |
+
"expires": "Expires",
|
| 333 |
+
"messages": "messages",
|
| 334 |
+
"comments": "comments",
|
| 335 |
+
"copyLink": "Copy Link",
|
| 336 |
+
"openInNewTab": "Open in New Tab",
|
| 337 |
+
"linkCopied": "Link copied to clipboard",
|
| 338 |
+
"confirmDeleteExport": "Are you sure you want to delete this export? This action cannot be undone.",
|
| 339 |
+
"exportDeleted": "Export deleted successfully",
|
| 340 |
+
"failedToDeleteExport": "Failed to delete export"
|
| 341 |
+
}
|
| 342 |
+
},
|
| 343 |
+
"Layout": {
|
| 344 |
+
"workflow": "Workflow",
|
| 345 |
+
"admin": "Admin",
|
| 346 |
+
"users": "Users",
|
| 347 |
+
"toggleSidebar": "Toggle Sidebar",
|
| 348 |
+
"newChat": "New Chat",
|
| 349 |
+
"mcpConfiguration": "MCP Configuration",
|
| 350 |
+
"agents": "Agents",
|
| 351 |
+
"newAgent": "Create Agent",
|
| 352 |
+
"createAgent": "Create an agent",
|
| 353 |
+
"createYourOwnAgent": "Create your own specialized AI agent with unique features and personality",
|
| 354 |
+
"createYourOwnAgentOrSelectShared": "Create your own specialized AI agent or select from shared agents in the Agents page",
|
| 355 |
+
"availableAgents": "Available Agents",
|
| 356 |
+
"noAgentsAvailable": "No Agents Available",
|
| 357 |
+
"browseAgentsToBookmark": "Browse available agents to bookmark your favorites",
|
| 358 |
+
"askAdminToShareAgents": "No agents available yet. Ask your admin to share agents with you",
|
| 359 |
+
"whatIsAgent": "What is Agent?",
|
| 360 |
+
"agentDescription": "Agents are specialized AI assistants that can be customized with specific roles, instructions, and tools to help you with various tasks.",
|
| 361 |
+
"specializedAIAssistant": "Specialized AI Assistant",
|
| 362 |
+
"specializedAIAssistantDescription": "Each agent can be customized with specific roles, personalities, and expertise areas to provide focused assistance for your unique needs.",
|
| 363 |
+
"customInstructions": "Custom Instructions",
|
| 364 |
+
"customInstructionsDescription": "Define detailed system prompts and behavioral guidelines to shape how your agent responds and interacts with you.",
|
| 365 |
+
"toolIntegration": "Tool Integration",
|
| 366 |
+
"toolIntegrationDescription": "Connect your agents to MCP servers, workflows, and other tools to extend their capabilities beyond conversation.",
|
| 367 |
+
"agentExamples": "Agent Examples",
|
| 368 |
+
"businessAssistant": "Business Assistant",
|
| 369 |
+
"businessAssistantDescription": "Specialized in business analysis, report generation, and professional communication.",
|
| 370 |
+
"creativeWriter": "Creative Writer",
|
| 371 |
+
"creativeWriterDescription": "Focused on storytelling, content creation, and creative brainstorming.",
|
| 372 |
+
"technicalExpert": "Technical Expert",
|
| 373 |
+
"technicalExpertDescription": "Equipped with development tools and coding expertise for technical tasks.",
|
| 374 |
+
"createFirstAgentToStart": "Create your first agent to get started!",
|
| 375 |
+
"today": "Today",
|
| 376 |
+
"yesterday": "Yesterday",
|
| 377 |
+
"lastWeek": "Last 7 days",
|
| 378 |
+
"older": "Older",
|
| 379 |
+
"recentChats": "Recent Chats",
|
| 380 |
+
"deleteAllChats": "Delete All Chats",
|
| 381 |
+
"deleteUnarchivedChats": "Delete Unarchived Chats",
|
| 382 |
+
"noConversationsYet": "No conversations yet",
|
| 383 |
+
"deletingAllChats": "Deleting all threads...",
|
| 384 |
+
"deletingUnarchivedChats": "Deleting unarchived threads...",
|
| 385 |
+
"allChatsDeleted": "All threads deleted",
|
| 386 |
+
"unarchivedChatsDeleted": "Unarchived threads deleted",
|
| 387 |
+
"failedToDeleteAllChats": "Failed to delete all threads",
|
| 388 |
+
"failedToDeleteUnarchivedChats": "Failed to delete unarchived threads",
|
| 389 |
+
"chatPreferences": "Chat Preferences",
|
| 390 |
+
"keyboardShortcuts": "Keyboard Shortcuts",
|
| 391 |
+
"theme": "Theme",
|
| 392 |
+
"signOut": "Sign out",
|
| 393 |
+
"language": "Language",
|
| 394 |
+
"showAllChats": "View All Chats",
|
| 395 |
+
"showLessChats": "Show less",
|
| 396 |
+
"reportAnIssue": "Report an issue",
|
| 397 |
+
"joinCommunity": "Join Community",
|
| 398 |
+
"userSettings": "User Settings"
|
| 399 |
+
},
|
| 400 |
+
"Archive": {
|
| 401 |
+
"title": "Archive",
|
| 402 |
+
"addArchive": "Add Archive",
|
| 403 |
+
"archiveName": "Archive Name",
|
| 404 |
+
"archiveDescription": "Archive Description",
|
| 405 |
+
"archiveDescriptionPlaceholder": "Archives are spaces to store chat history.",
|
| 406 |
+
"noArchives": "No archives",
|
| 407 |
+
"createFirstArchive": "Create your first archive",
|
| 408 |
+
"archiveCreated": "Archive created",
|
| 409 |
+
"archiveUpdated": "Archive updated",
|
| 410 |
+
"archiveDeleted": "Archive deleted",
|
| 411 |
+
"failedToCreateArchive": "Failed to create archive",
|
| 412 |
+
"failedToUpdateArchive": "Failed to update archive",
|
| 413 |
+
"failedToDeleteArchive": "Failed to delete archive",
|
| 414 |
+
"editArchive": "Edit Archive",
|
| 415 |
+
"editArchiveDescription": "Edit archive information",
|
| 416 |
+
"deleteArchive": "Delete Archive",
|
| 417 |
+
"confirmDeleteArchive": "Are you sure you want to delete this archive?",
|
| 418 |
+
"deleteArchiveDescription": "This archive and all its items will be permanently deleted. This action cannot be undone.",
|
| 419 |
+
"addToArchive": "Add to Archive",
|
| 420 |
+
"removeFromArchive": "Remove from Archive",
|
| 421 |
+
"itemAddedToArchive": "Item added to archive",
|
| 422 |
+
"itemRemovedFromArchive": "Item removed from archive"
|
| 423 |
+
},
|
| 424 |
+
"Agent": {
|
| 425 |
+
"title": "Agent",
|
| 426 |
+
"newAgent": "Create Agent",
|
| 427 |
+
"generatingAgent": "Generating Agent...",
|
| 428 |
+
"agentNameAndIconLabel": "Give your agent a name and icon.",
|
| 429 |
+
"agentDescriptionLabel": "Add a brief description of what this agent does.",
|
| 430 |
+
"agentDescriptionPlaceholder": "This is just a description of the agent, it's not critical.",
|
| 431 |
+
"agentSettingsDescription": "From here, these are settings that can affect the agent.",
|
| 432 |
+
"thisAgentIs": "This agent is an expert in",
|
| 433 |
+
"expertIn": "",
|
| 434 |
+
"agentRolePlaceholder": "stock analysis",
|
| 435 |
+
"agentInstructionsLabel": "Feel free to write the agent's role, personality, guidelines, knowledge, etc.",
|
| 436 |
+
"agentInstructionsPlaceholder": "This agent helps with stock analysis. It uses web search tools to obtain stock information...",
|
| 437 |
+
"agentToolsLabel": "Add tools that this agent can use.",
|
| 438 |
+
"loadingTools": "Loading tools...",
|
| 439 |
+
"addTools": "Please add tools.",
|
| 440 |
+
"generateAgentGreeting": "Hello! I'll help you create your own agent. What would you like to create?",
|
| 441 |
+
"generateAgentDetailedGreeting": "Hello! I'll help you create your own agent. What would you like to create? You can write briefly or in detail.",
|
| 442 |
+
"inputPromptHere": "input prompt here...",
|
| 443 |
+
"agentNamePlaceholder": "better-agent",
|
| 444 |
+
"myAgents": "My Agents",
|
| 445 |
+
"bookmarkedAgents": "Bookmarked Agents",
|
| 446 |
+
"sharedAgents": "Shared Agents",
|
| 447 |
+
"availableAgents": "Available Agents",
|
| 448 |
+
"noAgents": "No agents yet",
|
| 449 |
+
"createFirst": "Create your first agent to get started",
|
| 450 |
+
"noSharedAgents": "No shared agents",
|
| 451 |
+
"noSharedAgentsDescription": "No public agents are available to bookmark",
|
| 452 |
+
"noAvailableAgents": "No available agents",
|
| 453 |
+
"noAvailableAgentsDescription": "Ask your admin to share agents with you",
|
| 454 |
+
"noDescription": "No description provided",
|
| 455 |
+
"bookmarkAdded": "Agent bookmarked",
|
| 456 |
+
"bookmarkRemoved": "Bookmark removed",
|
| 457 |
+
"bookmarkedAgent": "Bookmarked agent",
|
| 458 |
+
"addBookmark": "Bookmark agent",
|
| 459 |
+
"removeBookmark": "Remove bookmark",
|
| 460 |
+
"visibilityUpdated": "Visibility updated",
|
| 461 |
+
"deleted": "Agent deleted",
|
| 462 |
+
"created": "Agent created successfully",
|
| 463 |
+
"updated": "Agent updated successfully",
|
| 464 |
+
"deleteConfirm": "Are you sure you want to delete this agent?",
|
| 465 |
+
"makePrivate": "Make Private",
|
| 466 |
+
"makeReadonly": "Make Read Only",
|
| 467 |
+
"makePublic": "Make Public",
|
| 468 |
+
"visibility": "Visibility",
|
| 469 |
+
"private": "Private",
|
| 470 |
+
"readOnly": "Read Only",
|
| 471 |
+
"public": "Public",
|
| 472 |
+
"privateDescription": "Only you can view, edit, and use this agent.",
|
| 473 |
+
"readOnlyDescription": "Others can view and use as a tool, but only you can edit.",
|
| 474 |
+
"publicDescription": "Anyone can view, edit, and use this agent as a tool."
|
| 475 |
+
},
|
| 476 |
+
"KeyboardShortcuts": {
|
| 477 |
+
"title": "Keyboard Shortcuts",
|
| 478 |
+
"newChat": "New Chat",
|
| 479 |
+
"toggleTemporaryChat": "Toggle Temporary Chat",
|
| 480 |
+
"toggleSidebar": "Toggle Sidebar",
|
| 481 |
+
"toolMode": "Tool Mode",
|
| 482 |
+
"lastMessageCopy": "Copy Last Message",
|
| 483 |
+
"openChatPreferences": "Open Chat Preferences",
|
| 484 |
+
"deleteThread": "Delete Chat",
|
| 485 |
+
"openShortcutsPopup": "Open Shortcuts Popup",
|
| 486 |
+
"toggleVoiceChat": "Toggle Voice Chat"
|
| 487 |
+
},
|
| 488 |
+
"User": {
|
| 489 |
+
"Profile": {
|
| 490 |
+
"admin": {
|
| 491 |
+
"pageTitle": "User Management",
|
| 492 |
+
"pageDescription": "Manage user accounts and permissions",
|
| 493 |
+
"sectionTitle": "User Information",
|
| 494 |
+
"sectionDescription": "Update user details and manage their account",
|
| 495 |
+
"roles": "Roles",
|
| 496 |
+
"changeRole": "Change Role",
|
| 497 |
+
"accountStatus": "Account Status",
|
| 498 |
+
"updatePassword": "Reset Password",
|
| 499 |
+
"saveChanges": "Save Changes",
|
| 500 |
+
"deleteUser": "Delete User",
|
| 501 |
+
"dangerZoneDescription": "Irreversible actions for this user account",
|
| 502 |
+
"updateSuccess": "User details updated successfully",
|
| 503 |
+
"updateError": "Failed to update user details",
|
| 504 |
+
"cannotModifyOwnRole": "You cannot modify your own role",
|
| 505 |
+
"emailCannotBeModifiedSSO": "Email cannot be modified for SSO users",
|
| 506 |
+
"userDetailDescription": "Manage user information, permissions, and account settings",
|
| 507 |
+
"accessCardDescription": "Manage user permissions, account status, and security settings",
|
| 508 |
+
"userDetailsCardDescription": "Update user information and view account details",
|
| 509 |
+
"aiModelUsageFor": "AI model usage for {period}",
|
| 510 |
+
"noAiActivityDescription": "This user hasn't interacted with AI models in the last 30 days.",
|
| 511 |
+
"usageStatsWillAppear": "Usage statistics will appear here once they start chatting with AI assistants.",
|
| 512 |
+
"emailCannotBeModifiedOAuth": "Email cannot be modified for OAuth users",
|
| 513 |
+
"deleteUserPermanently": "Permanently remove this user and all associated data",
|
| 514 |
+
"userBannedDescription": "User is currently banned from accessing the application",
|
| 515 |
+
"clickToChangeUserRole": "Click to change user role",
|
| 516 |
+
"userHasPassword": "User has a password set",
|
| 517 |
+
"userOAuthOnly": "User signs in with OAuth only",
|
| 518 |
+
"clickToEdit": "Click to edit {field}",
|
| 519 |
+
"changeUserPassword": "This will change the user's password.",
|
| 520 |
+
"viewUserSessionsAndAccess": "View user sessions and access",
|
| 521 |
+
"deleteUserTitle": "Delete User Account",
|
| 522 |
+
"deleteUserDescription": "You are about to permanently delete {name}'s account. This action cannot be undone.",
|
| 523 |
+
"actionWillPermanently": "This action will permanently:",
|
| 524 |
+
"deleteAllUserData": "Delete all user data and conversations",
|
| 525 |
+
"removeAllFiles": "Remove all associated files and preferences",
|
| 526 |
+
"revokeAllAccess": "Revoke all access permissions",
|
| 527 |
+
"cannotBeUndone": "Cannot be undone or recovered",
|
| 528 |
+
"typeNameToConfirm": "Please type the user's name to confirm: {name}",
|
| 529 |
+
"typeToConfirm": "Type \"{name}\" to confirm",
|
| 530 |
+
"roleUpdatedSuccessfully": "Role updated successfully",
|
| 531 |
+
"failedToUpdateRole": "Failed to update role",
|
| 532 |
+
"changeUserRoles": "Change User Role",
|
| 533 |
+
"selectRolesFor": "Select roles for {name}",
|
| 534 |
+
"banUser": "Ban User",
|
| 535 |
+
"unbanUser": "Unban User",
|
| 536 |
+
"banning": "Banning...",
|
| 537 |
+
"unbanning": "Unbanning...",
|
| 538 |
+
"banUserConfirmation": "Are you sure you want to ban {name}? They will lose access to the application.",
|
| 539 |
+
"unbanUserConfirmation": "Are you sure you want to unban {name}? They will regain access to the application.",
|
| 540 |
+
"clickToBanUser": "Click to ban user",
|
| 541 |
+
"clickToUnbanUser": "Click to unban user",
|
| 542 |
+
"failedToUpdateUserStatus": "Failed to update user status",
|
| 543 |
+
"updatePasswordTitle": "Update User Password",
|
| 544 |
+
"passwordUpdatedSuccessfully": "User password updated successfully",
|
| 545 |
+
"failedToUpdatePassword": "Failed to update user password",
|
| 546 |
+
"newPasswordPlaceholder": "New password for user",
|
| 547 |
+
"currentPassword": "Current password",
|
| 548 |
+
"confirmPassword": "Confirm new password",
|
| 549 |
+
"updatePasswordButton": "Update Password",
|
| 550 |
+
"updateRole": "Update Role",
|
| 551 |
+
"userDeletedSuccessfully": "User deleted successfully",
|
| 552 |
+
"failedToDeleteUser": "Failed to delete user"
|
| 553 |
+
},
|
| 554 |
+
"user": {
|
| 555 |
+
"pageTitle": "My Profile",
|
| 556 |
+
"pageDescription": "Manage your account settings",
|
| 557 |
+
"sectionTitle": "Profile Information",
|
| 558 |
+
"sectionDescription": "Update your personal information",
|
| 559 |
+
"roles": "My Roles",
|
| 560 |
+
"changeRole": "Request Role Change",
|
| 561 |
+
"accountStatus": "My Account Status",
|
| 562 |
+
"updatePassword": "Change Password",
|
| 563 |
+
"saveChanges": "Save Profile",
|
| 564 |
+
"deleteUser": "Delete My Account",
|
| 565 |
+
"dangerZoneDescription": "Permanent actions for your account",
|
| 566 |
+
"updateSuccess": "Your profile has been updated",
|
| 567 |
+
"updateError": "Failed to update your profile",
|
| 568 |
+
"cannotModifyOwnRole": "Contact an admin to change your role",
|
| 569 |
+
"emailCannotBeModifiedSSO": "Your email is managed by your SSO provider",
|
| 570 |
+
"userDetailDescription": "Manage your information, permissions, and account settings",
|
| 571 |
+
"accessCardDescription": "Manage your permissions, account status, and security settings",
|
| 572 |
+
"userDetailsCardDescription": "Update your information and view account details",
|
| 573 |
+
"aiModelUsageFor": "Your AI model usage for {period}",
|
| 574 |
+
"noAiActivityDescription": "You haven't interacted with AI models in the last 30 days.",
|
| 575 |
+
"usageStatsWillAppear": "Usage statistics will appear here once you start chatting with AI assistants.",
|
| 576 |
+
"emailCannotBeModifiedOAuth": "Your email cannot be modified for OAuth accounts",
|
| 577 |
+
"deleteUserPermanently": "Permanently remove your account and all associated data",
|
| 578 |
+
"userBannedDescription": "Your account is currently banned from accessing the application",
|
| 579 |
+
"clickToChangeUserRole": "Contact an admin to change your role",
|
| 580 |
+
"userHasPassword": "You have a password set",
|
| 581 |
+
"userOAuthOnly": "You only sign in with OAuth",
|
| 582 |
+
"clickToEdit": "Click to edit your {field}",
|
| 583 |
+
"changeUserPassword": "This will change your password.",
|
| 584 |
+
"viewUserSessionsAndAccess": "View your sessions and access",
|
| 585 |
+
"deleteUserTitle": "Delete My Account",
|
| 586 |
+
"deleteUserDescription": "You are about to permanently delete your account. This action cannot be undone.",
|
| 587 |
+
"actionWillPermanently": "This action will permanently:",
|
| 588 |
+
"deleteAllUserData": "Delete all your data and conversations",
|
| 589 |
+
"removeAllFiles": "Remove all your associated files and preferences",
|
| 590 |
+
"revokeAllAccess": "Revoke all your access permissions",
|
| 591 |
+
"cannotBeUndone": "Cannot be undone or recovered",
|
| 592 |
+
"typeNameToConfirm": "Please type your name to confirm: {name}",
|
| 593 |
+
"typeToConfirm": "Type \"{name}\" to confirm",
|
| 594 |
+
"roleUpdatedSuccessfully": "Your role has been updated successfully",
|
| 595 |
+
"failedToUpdateRole": "Failed to update your role",
|
| 596 |
+
"changeUserRoles": "Request Role Change",
|
| 597 |
+
"selectRolesFor": "Select your new role",
|
| 598 |
+
"banUser": "Ban My Account",
|
| 599 |
+
"unbanUser": "Unban My Account",
|
| 600 |
+
"banning": "Banning...",
|
| 601 |
+
"unbanning": "Unbanning...",
|
| 602 |
+
"banUserConfirmation": "Are you sure you want to ban your account? You will lose access to the application.",
|
| 603 |
+
"unbanUserConfirmation": "Are you sure you want to unban your account? You will regain access to the application.",
|
| 604 |
+
"clickToBanUser": "Click to ban your account",
|
| 605 |
+
"clickToUnbanUser": "Click to unban your account",
|
| 606 |
+
"failedToUpdateUserStatus": "Failed to update your account status",
|
| 607 |
+
"updatePasswordTitle": "Change My Password",
|
| 608 |
+
"passwordUpdatedSuccessfully": "Your password has been updated successfully",
|
| 609 |
+
"failedToUpdatePassword": "Failed to update your password",
|
| 610 |
+
"newPasswordPlaceholder": "New password",
|
| 611 |
+
"currentPassword": "Current password",
|
| 612 |
+
"confirmPassword": "Confirm new password",
|
| 613 |
+
"updatePasswordButton": "Change Password",
|
| 614 |
+
"updateRole": "Update Role",
|
| 615 |
+
"userDeletedSuccessfully": "User deleted successfully",
|
| 616 |
+
"failedToDeleteUser": "Failed to delete user"
|
| 617 |
+
},
|
| 618 |
+
"common": {
|
| 619 |
+
"details": "Details",
|
| 620 |
+
"statistics": "Statistics",
|
| 621 |
+
"dangerZone": "Danger Zone",
|
| 622 |
+
"joined": "Joined",
|
| 623 |
+
"lastUpdated": "Last Updated",
|
| 624 |
+
"active": "Active",
|
| 625 |
+
"banned": "Banned",
|
| 626 |
+
"name": "Name",
|
| 627 |
+
"email": "Email",
|
| 628 |
+
"required": "Required",
|
| 629 |
+
"you": "You",
|
| 630 |
+
"saving": "Saving...",
|
| 631 |
+
"accessAndAccount": "Access & Account",
|
| 632 |
+
"editRoles": "Edit Roles",
|
| 633 |
+
"security": "Security",
|
| 634 |
+
"passwordManagement": "Password Management",
|
| 635 |
+
"userDetailsCardTitle": "User Details",
|
| 636 |
+
"usageStatistics": "Usage Statistics",
|
| 637 |
+
"noAiActivityYet": "No AI Activity Yet",
|
| 638 |
+
"totalTokens": "Total Tokens",
|
| 639 |
+
"models": "Models",
|
| 640 |
+
"messages": "Messages",
|
| 641 |
+
"topModelsByTokenUsage": "Top Models by Token Usage",
|
| 642 |
+
"conversations": "Conversations",
|
| 643 |
+
"avgTokensPerMessage": "Avg Tokens/Message",
|
| 644 |
+
"topModel": "Top Model",
|
| 645 |
+
"summary": "Summary",
|
| 646 |
+
"tokensAcross": "{tokens} tokens across {count} model{count, plural, =1 {} other {s}} in {period}.",
|
| 647 |
+
"mostActive": "Most active: {model} ({tokens} tokens).",
|
| 648 |
+
"summaryPrefix": "📊 Summary: ",
|
| 649 |
+
"uploadPhoto": "Upload Photo",
|
| 650 |
+
"chooseDefault": "Choose Default",
|
| 651 |
+
"useEmoji": "Use Emoji",
|
| 652 |
+
"generateWithAI": "Generate with AI",
|
| 653 |
+
"changeProfilePhoto": "Change Profile Photo",
|
| 654 |
+
"selectDefaultAvatar": "Choose Default Avatar",
|
| 655 |
+
"selectDefaultAvatarDescription": "Select one of the default avatars below",
|
| 656 |
+
"chooseEmojiAvatar": "Choose Emoji Avatar",
|
| 657 |
+
"chooseEmojiAvatarDescription": "Select an emoji to use as your profile photo",
|
| 658 |
+
"generateAvatarWithAI": "Generate Avatar with AI",
|
| 659 |
+
"generateAvatarWithAIDescription": "Describe your ideal profile picture and let AI create it",
|
| 660 |
+
"aiProvider": "AI Provider",
|
| 661 |
+
"describeYourAvatar": "Describe your avatar",
|
| 662 |
+
"avatarPromptPlaceholder": "e.g., A cute puppy in Studio Ghibli style",
|
| 663 |
+
"generating": "Generating...",
|
| 664 |
+
"regenerate": "Regenerate",
|
| 665 |
+
"useThisAvatar": "Use This Avatar",
|
| 666 |
+
"profilePhotoUpdatedSuccessfully": "Profile photo updated successfully",
|
| 667 |
+
"failedToUpdateProfilePhoto": "Failed to update profile photo",
|
| 668 |
+
"pleaseEnterPrompt": "Please enter a prompt",
|
| 669 |
+
"imageGeneratedSuccessfully": "Image generated successfully!",
|
| 670 |
+
"failedToGenerateImage": "Failed to generate image",
|
| 671 |
+
"failedToSaveImage": "Failed to save image",
|
| 672 |
+
"pleaseUploadValidImage": "Please upload a valid image (JPEG, PNG, or WebP)",
|
| 673 |
+
"imageSizeMustBeLessThan": "Image size must be less than 5MB",
|
| 674 |
+
"select": "Select",
|
| 675 |
+
"msgs": "msgs",
|
| 676 |
+
"unknown": "Unknown",
|
| 677 |
+
"passwordUpdatedSuccessfully": "Password updated successfully",
|
| 678 |
+
"failedToUpdatePassword": "Failed to update password",
|
| 679 |
+
"confirmPassword": "Confirm Password",
|
| 680 |
+
"failedToUpdateUserStatus": "Failed to update user status",
|
| 681 |
+
"clickToBanUser": "Click to ban user",
|
| 682 |
+
"clickToUnbanUser": "Click to unban user",
|
| 683 |
+
"banUser": "Ban User",
|
| 684 |
+
"unbanUser": "Unban User",
|
| 685 |
+
"banUserConfirmation": "Are you sure you want to ban {name}? This will prevent them from accessing the application.",
|
| 686 |
+
"unbanUserConfirmation": "Are you sure you want to unban {name}? They will regain access to the application.",
|
| 687 |
+
"banning": "Banning...",
|
| 688 |
+
"unbanning": "Unbanning...",
|
| 689 |
+
"areYouSure": "Are you sure?",
|
| 690 |
+
"changeUserPassword": "This will change the user's password.",
|
| 691 |
+
"currentPassword": "Current password",
|
| 692 |
+
"newPasswordPlaceholder": "New Password (8-20 chars, uppercase, lowercase, number, special char)",
|
| 693 |
+
"updatePasswordButton": "Update Password",
|
| 694 |
+
"activeSessions": "Active Sessions",
|
| 695 |
+
"viewUserSessionsAndAccess": "View user sessions and access",
|
| 696 |
+
"deleteUserDescription": "You are about to permanently delete your account. This action cannot be undone.",
|
| 697 |
+
"noActiveSessions": "No active sessions",
|
| 698 |
+
"created": "Created",
|
| 699 |
+
"expires": "Expires",
|
| 700 |
+
"ipAddress": "IP Address",
|
| 701 |
+
"userAgent": "User Agent",
|
| 702 |
+
"notAvailable": "N/A",
|
| 703 |
+
"userNotFound": "User not found",
|
| 704 |
+
"userDetailsUpdatedSuccessfully": "User details updated successfully",
|
| 705 |
+
"failedToUpdateUserDetails": "Failed to update user details",
|
| 706 |
+
"userHasNoPasswordAccount": "User has no password based account",
|
| 707 |
+
"cannotBanUnbanYourself": "You cannot ban/unban yourself",
|
| 708 |
+
"userBannedSuccessfully": "User banned successfully",
|
| 709 |
+
"userUnbannedSuccessfully": "User unbanned successfully",
|
| 710 |
+
"bannedByAdmin": "Banned by admin",
|
| 711 |
+
"unknownError": "Unknown error",
|
| 712 |
+
"userDeletedSuccessfully": "User deleted successfully",
|
| 713 |
+
"failedToDeleteUser": "Failed to delete user"
|
| 714 |
+
}
|
| 715 |
+
}
|
| 716 |
+
},
|
| 717 |
+
"Admin": {
|
| 718 |
+
"title": "Admin",
|
| 719 |
+
"Sidebar": {
|
| 720 |
+
"users": "Users",
|
| 721 |
+
"toggleSidebar": "Toggle Sidebar",
|
| 722 |
+
"adminPanel": "Admin Panel",
|
| 723 |
+
"backToApp": "Back to App"
|
| 724 |
+
},
|
| 725 |
+
"Users": {
|
| 726 |
+
"title": "Users",
|
| 727 |
+
"allUsers": "All Users",
|
| 728 |
+
"viewAndManageUsers": "View and manage user accounts",
|
| 729 |
+
"searchPlaceholder": "Search by name or email...",
|
| 730 |
+
"clear": "Clear",
|
| 731 |
+
"noUsersFound": "No users found",
|
| 732 |
+
"youBadge": "You",
|
| 733 |
+
"totalCount": "{count} user{count, plural, =1 {} other {s}} total",
|
| 734 |
+
"user": "User",
|
| 735 |
+
"role": "Role",
|
| 736 |
+
"status": "Status",
|
| 737 |
+
"joined": "Joined",
|
| 738 |
+
"backToUsers": "Back to Users"
|
| 739 |
+
},
|
| 740 |
+
"UserDelete": {
|
| 741 |
+
"title": "Delete User Account",
|
| 742 |
+
"description": "You are about to permanently delete {name}'s account. This action cannot be undone.",
|
| 743 |
+
"actionWillPermanently": "This action will permanently:",
|
| 744 |
+
"deleteAllUserData": "Delete all user data and conversations",
|
| 745 |
+
"removeAllFiles": "Remove all associated files and preferences",
|
| 746 |
+
"revokeAllAccess": "Revoke all access permissions",
|
| 747 |
+
"cannotBeUndone": "Cannot be undone or recovered",
|
| 748 |
+
"typeNameToConfirm": "Please type the user's name to confirm: {name}",
|
| 749 |
+
"typeToConfirm": "Type \"{name}\" to confirm",
|
| 750 |
+
"userDeletedSuccessfully": "User deleted successfully",
|
| 751 |
+
"failedToDeleteUser": "Failed to delete user"
|
| 752 |
+
},
|
| 753 |
+
"UserRoles": {
|
| 754 |
+
"changeUserRoles": "Change User Roles",
|
| 755 |
+
"selectRolesFor": "Select roles for {name}. At this time, users can only have one role.",
|
| 756 |
+
"updateRole": "Update Role",
|
| 757 |
+
"roleUpdatedSuccessfully": "Role updated successfully",
|
| 758 |
+
"failedToUpdateRole": "Failed to update role",
|
| 759 |
+
"cannotUpdateOwnRole": "You cannot update your own role",
|
| 760 |
+
"roleUpdatedSuccessfullyTo": "User role updated successfully to {role}"
|
| 761 |
+
}
|
| 762 |
+
},
|
| 763 |
+
"MCP": {
|
| 764 |
+
"marketplace": "Marketplace",
|
| 765 |
+
"addMcpServer": "Add Server",
|
| 766 |
+
"configureYourMcpServerConnectionSettings": "Configure your MCP server connection settings",
|
| 767 |
+
"mcpConfiguration": "MCP Configuration",
|
| 768 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "Name must contain only alphanumeric characters (A-Z, a-z, 0-9) and hyphens (-)",
|
| 769 |
+
"nameIsRequired": "Name is required",
|
| 770 |
+
"configurationSavedSuccessfully": "Configuration saved successfully",
|
| 771 |
+
"enterMcpServerName": "Enter MCP server name",
|
| 772 |
+
"saveConfiguration": "Save Configuration",
|
| 773 |
+
"toolsTest": "Tools Test",
|
| 774 |
+
"refresh": "Refresh",
|
| 775 |
+
"delete": "Delete",
|
| 776 |
+
"edit": "Edit",
|
| 777 |
+
"configuration": "Configuration",
|
| 778 |
+
"availableTools": "Available Tools",
|
| 779 |
+
"noToolsAvailable": "No tools available",
|
| 780 |
+
"overviewTitle": "Connect Your First Server",
|
| 781 |
+
"overviewDescription": "Add MCP servers to unlock powerful AI integrations",
|
| 782 |
+
"mcpServers": "MCP Servers",
|
| 783 |
+
"availableMcpServers": "Available MCP Servers",
|
| 784 |
+
"noMcpServersAvailable": "No MCP Servers Available",
|
| 785 |
+
"noMcpServersAvailableDescription": "Ask your admin to configure MCP servers for you to use",
|
| 786 |
+
"myMcpServers": "My MCP Servers",
|
| 787 |
+
"featuredMcpServers": "Featured MCP Servers",
|
| 788 |
+
"searchTools": "Search tools",
|
| 789 |
+
"detail": "Detail",
|
| 790 |
+
"noSchemaPropertiesAvailable": "No schema properties available",
|
| 791 |
+
"createInputWithAI": "Create Input with AI",
|
| 792 |
+
"generateExampleInputJSON": "Generate Example Input JSON",
|
| 793 |
+
"enterPromptToGenerateExampleInputJSON": "Enter a prompt to generate example input JSON for the selected tool.",
|
| 794 |
+
"callTool": "Call Tool",
|
| 795 |
+
"customInstructions": "Custom instructions",
|
| 796 |
+
"serverCustomInstructionsPlaceholder": "These lines will be added to the AI system prompt whenever a tool from this server is available.",
|
| 797 |
+
"nameAlreadyExists": "Name already exists",
|
| 798 |
+
"additionalInstructions": "Tool Customization Instructions",
|
| 799 |
+
"inputSchema": "Input Schema",
|
| 800 |
+
"toolCustomizationInstructions": "Tool customization instructions will be added to the system prompt when the tool is available.\nexample) Always enter the email in the format example@example.com.",
|
| 801 |
+
"mcpServerCustomization": "MCP Customization",
|
| 802 |
+
"mcpServerCustomizationDescription": "MCP server customization instructions will be added to the system prompt when the MCP server is available.",
|
| 803 |
+
"toolCustomizationInstructionsPlaceholder": "Tool customization instructions are not available.",
|
| 804 |
+
"mcpServerCustomizationPlaceholder": "eg. If the input value is email, always enter the email in the format example@example.com.",
|
| 805 |
+
"noInstructions": "None",
|
| 806 |
+
"private": "Private",
|
| 807 |
+
"privateDescription": "Only you can use this MCP server",
|
| 808 |
+
"readonly": "Read-only",
|
| 809 |
+
"readonlyDescription": "Others can view but not modify this MCP server",
|
| 810 |
+
"public": "Featured",
|
| 811 |
+
"publicDescription": "Featured for all users to use",
|
| 812 |
+
"featured": "Featured",
|
| 813 |
+
"featuredDescription": "Featured for all users to use"
|
| 814 |
+
}
|
| 815 |
+
}
|
messages/es.json
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "Cancelar",
|
| 4 |
+
"update": "Actualizar",
|
| 5 |
+
"continue": "Continuar",
|
| 6 |
+
"success": "Éxito",
|
| 7 |
+
"delete": "Eliminar",
|
| 8 |
+
"save": "Guardar",
|
| 9 |
+
"back": "Atrás",
|
| 10 |
+
"next": "Siguiente",
|
| 11 |
+
"create": "Crear",
|
| 12 |
+
"showLess": "Mostrar menos",
|
| 13 |
+
"showMore": "Mostrar más",
|
| 14 |
+
"generate": "Generar",
|
| 15 |
+
"edit": "Editar",
|
| 16 |
+
"editAgent": "Editar Agente",
|
| 17 |
+
"search": "Buscar...",
|
| 18 |
+
"approve": "Aprobar",
|
| 19 |
+
"reject": "Rechazar",
|
| 20 |
+
"saving": "Guardando...",
|
| 21 |
+
"optional": "Opcional",
|
| 22 |
+
"deleting": "Eliminando...",
|
| 23 |
+
"run": "Ejecutar",
|
| 24 |
+
"description": "Descripción",
|
| 25 |
+
"defaultValue": "Valor Predeterminado",
|
| 26 |
+
"empty": "Vacío",
|
| 27 |
+
"required": "Requerido",
|
| 28 |
+
"options": "Opciones",
|
| 29 |
+
"status": "Estado",
|
| 30 |
+
"result": "Resultado",
|
| 31 |
+
"startedAt": "Iniciado En",
|
| 32 |
+
"duration": "Duración",
|
| 33 |
+
"addOption": "Agregar Opción",
|
| 34 |
+
"tool": "Herramienta",
|
| 35 |
+
"selectTool": "Seleccionar Herramienta...",
|
| 36 |
+
"noResults": "Sin resultados.",
|
| 37 |
+
"generateInputWithAI": "Generar Entrada con IA",
|
| 38 |
+
"generatingInputWithAI": "Generando entrada con IA...",
|
| 39 |
+
"inputGeneratedSuccessfully": "Entrada generada exitosamente",
|
| 40 |
+
"failedToGenerateInput": "Error al generar entrada",
|
| 41 |
+
"createWithExample": "Crear con Ejemplo",
|
| 42 |
+
"resultsFound": "{count} resultados encontrados",
|
| 43 |
+
"youAreAnExpertIn": "Eres un experto en {role}",
|
| 44 |
+
"sharedBy": "Compartido por {userName}"
|
| 45 |
+
},
|
| 46 |
+
"Auth": {
|
| 47 |
+
"SignIn": {
|
| 48 |
+
"title": "Bienvenido de vuelta",
|
| 49 |
+
"description": "Inicia sesión para continuar a tu cuenta",
|
| 50 |
+
"oauthClientIdNotSet": "ID del cliente de {provider} no configurado",
|
| 51 |
+
"noAccount": "¿No tienes una cuenta?",
|
| 52 |
+
"signUp": "Registrarse",
|
| 53 |
+
"signIn": "Iniciar sesión",
|
| 54 |
+
"orContinueWith": "O CONTINÚA CON"
|
| 55 |
+
},
|
| 56 |
+
"SignUp": {
|
| 57 |
+
"title": "Crear una cuenta",
|
| 58 |
+
"signIn": "Iniciar sesión",
|
| 59 |
+
"description": "Regístrate en tu cuenta",
|
| 60 |
+
"step1": "Comienza tu viaje con nosotros ingresando tu dirección de correo electrónico",
|
| 61 |
+
"step2": "Usaré este nombre cuando charlemos",
|
| 62 |
+
"step3": "Crea una contraseña segura para proteger tu cuenta",
|
| 63 |
+
"signUp": "Registrarse",
|
| 64 |
+
"invalidEmail": "Dirección de correo electrónico inválida",
|
| 65 |
+
"emailAlreadyExists": "El correo electrónico ya existe",
|
| 66 |
+
"nameRequired": "El nombre es obligatorio",
|
| 67 |
+
"passwordRequired": "La contraseña es obligatoria",
|
| 68 |
+
"createAccount": "Crear cuenta"
|
| 69 |
+
},
|
| 70 |
+
"Intro": {
|
| 71 |
+
"description": "Bienvenido a better-chatbot. Inicia sesión para experimentar nuestras herramientas conversacionales impulsadas por IA."
|
| 72 |
+
}
|
| 73 |
+
},
|
| 74 |
+
"Chat": {
|
| 75 |
+
"Error": "Error de Chat",
|
| 76 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "Este mensaje no se guardó. Por favor, intenta el chat nuevamente.",
|
| 77 |
+
"uploadImage": "Subir archivo",
|
| 78 |
+
"generateImage": "Generar Imagen",
|
| 79 |
+
"imageUploadedSuccessfully": "Imagen subida exitosamente",
|
| 80 |
+
"pleaseUploadImageFile": "Por favor sube un archivo de imagen",
|
| 81 |
+
"imageSizeMustBeLessThan10MB": "El tamaño de la imagen debe ser menor a 10MB",
|
| 82 |
+
"failedToUploadImage": "Error al subir la imagen",
|
| 83 |
+
"imageUploadFailedUsingBase64": "Error al subir la imagen. Usando codificación base64 como alternativa.",
|
| 84 |
+
"Greeting": {
|
| 85 |
+
"goodMorning": "Buenos días, {name}",
|
| 86 |
+
"goodAfternoon": "Buenas tardes, {name}",
|
| 87 |
+
"goodEvening": "Buenas noches, {name}",
|
| 88 |
+
"niceToSeeYouAgain": "Es un placer verte de nuevo, {name}",
|
| 89 |
+
"whatAreYouWorkingOnToday": "¿En qué estás trabajando hoy, {name}?",
|
| 90 |
+
"letMeKnowWhenYoureReadyToBegin": "Avísame cuando estés listo para comenzar.",
|
| 91 |
+
"whatAreYourThoughtsToday": "¿Cuáles son tus pensamientos hoy?",
|
| 92 |
+
"whereWouldYouLikeToStart": "¿Por dónde te gustaría empezar?",
|
| 93 |
+
"whatAreYouThinking": "¿Qué estás pensando, {name}?"
|
| 94 |
+
},
|
| 95 |
+
"TemporaryChat": {
|
| 96 |
+
"toggleTemporaryChat": "Alternar Chat Temporal",
|
| 97 |
+
"temporaryChat": "Chat Temporal",
|
| 98 |
+
"resetChat": "Reiniciar Chat",
|
| 99 |
+
"thisChatWontBeSaved": "Este chat no se guardará.",
|
| 100 |
+
"feelFreeToAskAnythingTemporarily": "Siéntete libre de preguntar cualquier cosa temporalmente",
|
| 101 |
+
"temporaryChatInstructions": "Instrucciones del Chat Temporal",
|
| 102 |
+
"temporaryChatInstructionsPlaceholder": "Ingresa tus instrucciones aquí",
|
| 103 |
+
"temporaryChatInstructionsDescription": "Puedes establecer instrucciones para el chat temporal. Esto se usará como prompt del sistema para el chat temporal."
|
| 104 |
+
},
|
| 105 |
+
"placeholder": "Pregunta cualquier cosa o @menciona",
|
| 106 |
+
"Tool": {
|
| 107 |
+
"webSearching": "Buscando en la web...",
|
| 108 |
+
"searchedTheWeb": "Buscado en la web",
|
| 109 |
+
"toolModeDescription": "Elije cómo se usan las herramientas:\n• Auto: La IA decide cuándo usar herramientas\n• Manual: Pide permiso antes de usar herramientas\n• Ninguno: Desactiva todas las herramientas",
|
| 110 |
+
"toolsSetupDescription": "Selecciona las herramientas que el chatbot puede usar.\nEl chatbot utilizará las herramientas seleccionadas según su propio juicio.\n\nTambién puedes forzar el uso de herramientas específicas a través de @mention.",
|
| 111 |
+
"selectToolMode": "Seleccionar modo de herramientas",
|
| 112 |
+
"autoToolModeDescription": "Decide cuándo usar herramientas sin preguntarte",
|
| 113 |
+
"manualToolModeDescription": "Pide tu permiso antes de usar cualquier herramienta",
|
| 114 |
+
"noneToolModeDescription": "No usar herramientas. @mention sigue estando disponible.",
|
| 115 |
+
"toolsSetup": "Configuración de Herramientas",
|
| 116 |
+
"preset": "Preajuste",
|
| 117 |
+
"toolPresets": "Preajustes de Herramientas",
|
| 118 |
+
"saveAsPreset": "Guardar como Preajuste",
|
| 119 |
+
"saveAsPresetDescription": "Guarda la configuración actual de herramientas como un preajuste.",
|
| 120 |
+
"noPresetsAvailableYet": "Aún no hay preajustes disponibles",
|
| 121 |
+
"presetNameCannotBeEmpty": "El nombre del preajuste no puede estar vacío",
|
| 122 |
+
"presetNameAlreadyExists": "El nombre del preajuste ya existe",
|
| 123 |
+
"presetSaved": "Preajuste guardado",
|
| 124 |
+
"clickSaveAsPresetToGetStarted": "Haz clic en Guardar como Preajuste para comenzar.",
|
| 125 |
+
"searchOptions": "Opciones de Búsqueda",
|
| 126 |
+
"searchOptionsDescription": "Puedes pasar opciones de búsqueda al chatbot, como el número máximo de resultados de búsqueda, la fecha de búsqueda, etc.",
|
| 127 |
+
"defaultToolKit": {
|
| 128 |
+
"visualization": "Visualización de datos",
|
| 129 |
+
"webSearch": "Buscar en la web"
|
| 130 |
+
},
|
| 131 |
+
"agent": "Agente",
|
| 132 |
+
"mention": "Mención",
|
| 133 |
+
"tools": "Herramientas",
|
| 134 |
+
"tooManyToolsSelected": "Demasiadas herramientas seleccionadas, por favor selecciona menos de 128 herramientas",
|
| 135 |
+
"presetNamePlaceholder": "Nombre del Preajuste",
|
| 136 |
+
"noMcpServersDetected": "No se detectaron servidores MCP.",
|
| 137 |
+
"addServer": "Agregar un servidor",
|
| 138 |
+
"error": "error",
|
| 139 |
+
"authorizationRequired": "Se Requiere Autorización",
|
| 140 |
+
"clickToAuthorize": "Haz clic aquí para autorizar este servidor MCP y acceder a sus herramientas.",
|
| 141 |
+
"auto": "Automático",
|
| 142 |
+
"manual": "Manual",
|
| 143 |
+
"none": "Ninguno",
|
| 144 |
+
"mentionOnly": "solo @mención",
|
| 145 |
+
"noToolsAvailable": "No hay herramientas disponibles"
|
| 146 |
+
},
|
| 147 |
+
"VoiceChat": {
|
| 148 |
+
"title": "Modo de Chat por Voz",
|
| 149 |
+
"compactDisplayMode": "Modo de visualización compacta",
|
| 150 |
+
"conversationDisplayMode": "Modo de visualización de conversación",
|
| 151 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "Por favor, cierra el chat por voz e intenta de nuevo.",
|
| 152 |
+
"startConversation": "Iniciar conversación",
|
| 153 |
+
"closeMic": "Cerrar micrófono",
|
| 154 |
+
"openMic": "Abrir micrófono",
|
| 155 |
+
"endConversation": "Terminar conversación",
|
| 156 |
+
"toggleVoiceChat": "Alternar Chat por Voz",
|
| 157 |
+
"readyWhenYouAreJustStartTalking": "Listo cuando lo estés—solo comienza a hablar.",
|
| 158 |
+
"yourMicIsOff": "Tu micrófono está apagado.",
|
| 159 |
+
"preparing": "Preparando...",
|
| 160 |
+
"startVoiceChat": "¿Iniciar chat por voz?"
|
| 161 |
+
},
|
| 162 |
+
"Thread": {
|
| 163 |
+
"chat": "Chat",
|
| 164 |
+
|
| 165 |
+
"renameChat": "Renombrar",
|
| 166 |
+
"deleteChat": "Eliminar Chat",
|
| 167 |
+
"deleteUnarchivedChats": "Eliminar Todos los Chats No Archivados",
|
| 168 |
+
"confirmDeleteUnarchivedChats": "¿Estás seguro de que quieres eliminar todos los chats no archivados?",
|
| 169 |
+
"thisActionCannotBeUndone": "Esta acción no se puede deshacer.",
|
| 170 |
+
"unarchivedChatsDeleted": "Los chats no archivados han sido eliminados",
|
| 171 |
+
"failedToDeleteUnarchivedChats": "Error al eliminar chats no archivados",
|
| 172 |
+
"failedToDeleteThread": "Error al eliminar el hilo",
|
| 173 |
+
"threadDeleted": "Hilo eliminado",
|
| 174 |
+
"failedToUpdateThread": "Error al actualizar el hilo",
|
| 175 |
+
"titleRequired": "El título es obligatorio",
|
| 176 |
+
"threadUpdated": "Hilo actualizado",
|
| 177 |
+
"areYouSureYouWantToDeleteThisChatThread": "¿Estás seguro de que quieres eliminar este hilo de chat?",
|
| 178 |
+
"sharePublicLink": "Compartir Enlace Público",
|
| 179 |
+
"sharePublicLinkDescription": "Todos los mensajes añadidos después de compartir permanecerán privados.",
|
| 180 |
+
"creatingLink": "Creando enlace...",
|
| 181 |
+
"createLink": "Crear Enlace",
|
| 182 |
+
"linkCopied": "Enlace copiado"
|
| 183 |
+
},
|
| 184 |
+
|
| 185 |
+
"ChatPreferences": {
|
| 186 |
+
"title": "Preferencias de Chat",
|
| 187 |
+
"whatShouldWeCallYou": "¿Cómo deberíamos llamarte?",
|
| 188 |
+
"botName": "Nombre del Asistente",
|
| 189 |
+
"whatBestDescribesYourWork": "¿Qué describe mejor tu trabajo?",
|
| 190 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "¿Qué preferencias personales deberían considerarse en las respuestas?",
|
| 191 |
+
"responseStyleExample1": "ej. mantén las explicaciones breves y al grano",
|
| 192 |
+
"responseStyleExample2": "ej. al aprender nuevos conceptos, encuentro las analogías particularmente útiles",
|
| 193 |
+
"responseStyleExample3": "ej. haz preguntas aclaratorias antes de dar respuestas detalladas",
|
| 194 |
+
"responseStyleExample4": "ej. recuerda que programo principalmente en Python (no soy principiante en programación)",
|
| 195 |
+
"professionExample1": "ej. ingeniero de software",
|
| 196 |
+
"professionExample2": "ej. gerente de producto",
|
| 197 |
+
"professionExample3": "ej. gerente de marketing",
|
| 198 |
+
"professionExample4": "ej. gerente de ventas",
|
| 199 |
+
"professionExample5": "ej. analista de negocios",
|
| 200 |
+
"preferencesSaved": "Preferencias guardadas",
|
| 201 |
+
"failedToSavePreferences": "Error al guardar las preferencias",
|
| 202 |
+
"userInstructions": "Instrucciones de Usuario",
|
| 203 |
+
"userInstructionsDescription": "Preséntate y obtén una respuesta más personalizada.",
|
| 204 |
+
"mcpInstructions": "Instrucciones MCP",
|
| 205 |
+
"mcpInstructionsDescription": "Personaliza las instrucciones del servidor MCP.",
|
| 206 |
+
"userSettings": "Configuración de Usuario"
|
| 207 |
+
}
|
| 208 |
+
},
|
| 209 |
+
"Layout": {
|
| 210 |
+
"toggleSidebar": "Alternar Barra Lateral",
|
| 211 |
+
"newChat": "Nuevo Chat",
|
| 212 |
+
"mcpConfiguration": "Configuración MCP",
|
| 213 |
+
"agents": "Agentes",
|
| 214 |
+
"newAgent": "Nuevo Agente",
|
| 215 |
+
"createAgent": "Crear un agente",
|
| 216 |
+
"createYourOwnAgent": "Crea tu propio agente de IA especializado con características y personalidad únicas",
|
| 217 |
+
"whatIsAgent": "¿Qué es un Agente?",
|
| 218 |
+
"agentDescription": "Los agentes son asistentes de IA especializados que pueden personalizarse con roles, instrucciones y herramientas específicas para ayudarte con diversas tareas.",
|
| 219 |
+
"specializedAIAssistant": "Asistente de IA Especializado",
|
| 220 |
+
"specializedAIAssistantDescription": "Cada agente puede personalizarse con roles específicos, personalidades y áreas de experiencia para brindar asistencia enfocada en tus necesidades únicas.",
|
| 221 |
+
"customInstructions": "Instrucciones Personalizadas",
|
| 222 |
+
"customInstructionsDescription": "Define prompts de sistema detallados y pautas de comportamiento para dar forma a cómo tu agente responde e interactúa contigo.",
|
| 223 |
+
"toolIntegration": "Integración de Herramientas",
|
| 224 |
+
"toolIntegrationDescription": "Conecta tus agentes a servidores MCP, flujos de trabajo y otras herramientas para extender sus capacidades más allá de la conversación.",
|
| 225 |
+
"agentExamples": "Ejemplos de Agentes",
|
| 226 |
+
"businessAssistant": "Asistente de Negocios",
|
| 227 |
+
"businessAssistantDescription": "Especializado en análisis empresarial, generación de informes y comunicación profesional.",
|
| 228 |
+
"creativeWriter": "Escritor Creativo",
|
| 229 |
+
"creativeWriterDescription": "Enfocado en narrativa, creación de contenido y lluvia de ideas creativas.",
|
| 230 |
+
"technicalExpert": "Experto Técnico",
|
| 231 |
+
"technicalExpertDescription": "Equipado con herramientas de desarrollo y experiencia en codificación para tareas técnicas.",
|
| 232 |
+
"createFirstAgentToStart": "¡Crea tu primer agente para empezar!",
|
| 233 |
+
"today": "Hoy",
|
| 234 |
+
"yesterday": "Ayer",
|
| 235 |
+
"lastWeek": "Últimos 7 días",
|
| 236 |
+
"older": "Más antiguos",
|
| 237 |
+
"recentChats": "Chats Recientes",
|
| 238 |
+
"deleteAllChats": "Eliminar Todos los Chats",
|
| 239 |
+
"deleteUnarchivedChats": "Eliminar Chats No Archivados",
|
| 240 |
+
"noConversationsYet": "Aún no hay conversaciones",
|
| 241 |
+
"deletingAllChats": "Eliminando todos los hilos...",
|
| 242 |
+
"deletingUnarchivedChats": "Eliminando hilos no archivados...",
|
| 243 |
+
"allChatsDeleted": "Todos los hilos eliminados",
|
| 244 |
+
"unarchivedChatsDeleted": "Hilos no archivados eliminados",
|
| 245 |
+
"failedToDeleteAllChats": "Error al eliminar todos los hilos",
|
| 246 |
+
"failedToDeleteUnarchivedChats": "Error al eliminar hilos no archivados",
|
| 247 |
+
"chatPreferences": "Preferencias de Chat",
|
| 248 |
+
"keyboardShortcuts": "Atajos de Teclado",
|
| 249 |
+
"theme": "Tema",
|
| 250 |
+
"signOut": "Cerrar sesión",
|
| 251 |
+
"language": "Idioma",
|
| 252 |
+
|
| 253 |
+
"showAllChats": "Ver Todos los Chats",
|
| 254 |
+
"showLessChats": "Mostrar menos",
|
| 255 |
+
"reportAnIssue": "Reportar un problema",
|
| 256 |
+
"joinCommunity": "Unirse a la Comunidad",
|
| 257 |
+
"workflow": "Flujo de Trabajo",
|
| 258 |
+
"userSettings": "Configuración de Usuario"
|
| 259 |
+
},
|
| 260 |
+
"Archive": {
|
| 261 |
+
"title": "Archivo",
|
| 262 |
+
"addArchive": "Añadir Archivo",
|
| 263 |
+
"archiveName": "Nombre del Archivo",
|
| 264 |
+
"archiveDescription": "Descripción del Archivo",
|
| 265 |
+
"archiveDescriptionPlaceholder": "Los archivos son espacios para almacenar el historial de chat.",
|
| 266 |
+
"noArchives": "No hay archivos",
|
| 267 |
+
"createFirstArchive": "Crea tu primer archivo",
|
| 268 |
+
"archiveCreated": "Archivo creado",
|
| 269 |
+
"archiveUpdated": "Archivo actualizado",
|
| 270 |
+
"archiveDeleted": "Archivo eliminado",
|
| 271 |
+
"failedToCreateArchive": "Error al crear archivo",
|
| 272 |
+
"failedToUpdateArchive": "Error al actualizar archivo",
|
| 273 |
+
"failedToDeleteArchive": "Error al eliminar archivo",
|
| 274 |
+
"editArchive": "Editar Archivo",
|
| 275 |
+
"editArchiveDescription": "Editar información del archivo",
|
| 276 |
+
"deleteArchive": "Eliminar Archivo",
|
| 277 |
+
"confirmDeleteArchive": "¿Está seguro de que desea eliminar este archivo?",
|
| 278 |
+
"deleteArchiveDescription": "Este archivo y todos sus elementos se eliminarán permanentemente. Esta acción no se puede deshacer.",
|
| 279 |
+
"addToArchive": "Añadir al Archivo",
|
| 280 |
+
"removeFromArchive": "Eliminar del Archivo",
|
| 281 |
+
"itemAddedToArchive": "Elemento añadido al archivo",
|
| 282 |
+
"itemRemovedFromArchive": "Elemento eliminado del archivo"
|
| 283 |
+
},
|
| 284 |
+
"Agent": {
|
| 285 |
+
"title": "Agente",
|
| 286 |
+
"generatingAgent": "Generando Agente...",
|
| 287 |
+
"agentNameAndIconLabel": "Dale a tu agente un nombre y un icono.",
|
| 288 |
+
"agentDescriptionLabel": "Añade una breve descripción de lo que hace este agente.",
|
| 289 |
+
"agentDescriptionPlaceholder": "Esto es solo una descripción del agente, no es crítico.",
|
| 290 |
+
"agentSettingsDescription": "A partir de aquí, estas son configuraciones que pueden afectar al agente.",
|
| 291 |
+
"thisAgentIs": "Este agente es un experto en",
|
| 292 |
+
"expertIn": "",
|
| 293 |
+
"agentRolePlaceholder": "análisis de acciones",
|
| 294 |
+
"agentInstructionsLabel": "Siéntete libre de escribir el papel, personalidad, directrices, conocimiento, etc. del agente.",
|
| 295 |
+
"agentInstructionsPlaceholder": "Este agente ayuda con el análisis de acciones. Utiliza herramientas de búsqueda web para obtener información de acciones...",
|
| 296 |
+
"agentToolsLabel": "Añade herramientas que este agente puede usar.",
|
| 297 |
+
"loadingTools": "Cargando herramientas...",
|
| 298 |
+
"addTools": "Por favor añade herramientas.",
|
| 299 |
+
"generateAgentGreeting": "¡Hola! Te ayudaré a crear tu propio agente. ¿Qué te gustaría crear?",
|
| 300 |
+
"generateAgentDetailedGreeting": "¡Hola! Te ayudaré a crear tu propio agente. ¿Qué te gustaría crear? Puedes escribir de forma breve o detallada.",
|
| 301 |
+
"inputPromptHere": "escribe el prompt aquí...",
|
| 302 |
+
"agentNamePlaceholder": "better-agent",
|
| 303 |
+
"myAgents": "Mis Agentes",
|
| 304 |
+
"sharedAgents": "Agentes Compartidos",
|
| 305 |
+
"noAgents": "Aún no hay agentes",
|
| 306 |
+
"createFirst": "Crea tu primer agente para empezar",
|
| 307 |
+
"noSharedAgents": "No hay agentes compartidos",
|
| 308 |
+
"noSharedAgentsDescription": "No hay agentes públicos disponibles para marcar",
|
| 309 |
+
"noDescription": "No se proporcionó descripción",
|
| 310 |
+
"bookmarkAdded": "Agente marcado",
|
| 311 |
+
"bookmarkRemoved": "Marcador eliminado",
|
| 312 |
+
"bookmarkedAgent": "Agente marcado",
|
| 313 |
+
"addBookmark": "Marcar agente",
|
| 314 |
+
"removeBookmark": "Eliminar marcador",
|
| 315 |
+
"visibilityUpdated": "Visibilidad actualizada",
|
| 316 |
+
"deleted": "Agente eliminado",
|
| 317 |
+
"deleteConfirm": "¿Estás seguro de que quieres eliminar este agente?",
|
| 318 |
+
"makePrivate": "Hacer Privado",
|
| 319 |
+
"makeReadonly": "Hacer Solo Lectura",
|
| 320 |
+
"makePublic": "Hacer Público",
|
| 321 |
+
"visibility": "Visibilidad",
|
| 322 |
+
"private": "Privado",
|
| 323 |
+
"readOnly": "Solo Lectura",
|
| 324 |
+
"public": "Público",
|
| 325 |
+
"privateDescription": "Solo tú puedes ver, editar y usar este agente.",
|
| 326 |
+
"readOnlyDescription": "Otros pueden ver y usar como herramienta, pero solo tú puedes editar.",
|
| 327 |
+
"publicDescription": "Cualquiera puede ver, editar y usar este agente como herramienta."
|
| 328 |
+
},
|
| 329 |
+
"KeyboardShortcuts": {
|
| 330 |
+
"title": "Atajos de Teclado",
|
| 331 |
+
"newChat": "Nuevo Chat",
|
| 332 |
+
"toggleTemporaryChat": "Alternar Chat Temporal",
|
| 333 |
+
"toggleSidebar": "Alternar Barra Lateral",
|
| 334 |
+
"toolMode": "Modo de Herramientas",
|
| 335 |
+
"lastMessageCopy": "Copiar Último Mensaje",
|
| 336 |
+
"openChatPreferences": "Abrir Preferencias de Chat",
|
| 337 |
+
"deleteThread": "Eliminar Chat",
|
| 338 |
+
"openShortcutsPopup": "Abrir Ventana de Atajos",
|
| 339 |
+
"toggleVoiceChat": "Alternar Chat por Voz"
|
| 340 |
+
},
|
| 341 |
+
"MCP": {
|
| 342 |
+
"marketplace": "Mercado",
|
| 343 |
+
"addMcpServer": "Agregar Servidor",
|
| 344 |
+
"configureYourMcpServerConnectionSettings": "Configura los ajustes de conexión de tu servidor MCP",
|
| 345 |
+
"mcpConfiguration": "Configuración MCP",
|
| 346 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "El nombre debe contener solo caracteres alfanuméricos (A-Z, a-z, 0-9) y guiones (-)",
|
| 347 |
+
"nameIsRequired": "El nombre es obligatorio",
|
| 348 |
+
"configurationSavedSuccessfully": "Configuración guardada exitosamente",
|
| 349 |
+
"enterMcpServerName": "Ingresa el nombre del servidor MCP",
|
| 350 |
+
"saveConfiguration": "Guardar Configuración",
|
| 351 |
+
"toolsTest": "Prueba de Herramientas",
|
| 352 |
+
"refresh": "Actualizar",
|
| 353 |
+
"delete": "Eliminar",
|
| 354 |
+
"edit": "Editar",
|
| 355 |
+
"configuration": "Configuración",
|
| 356 |
+
"availableTools": "Herramientas Disponibles",
|
| 357 |
+
"noToolsAvailable": "No hay herramientas disponibles",
|
| 358 |
+
"overviewTitle": "Conecta Tu Primer Servidor",
|
| 359 |
+
"overviewDescription": "Agrega servidores MCP para desbloquear integraciones de IA poderosas",
|
| 360 |
+
"searchTools": "Buscar herramientas",
|
| 361 |
+
"detail": "Detalle",
|
| 362 |
+
"noSchemaPropertiesAvailable": "No hay propiedades de esquema disponibles",
|
| 363 |
+
"createInputWithAI": "Crear Entrada con IA",
|
| 364 |
+
"generateExampleInputJSON": "Generar JSON de Entrada de Ejemplo",
|
| 365 |
+
"enterPromptToGenerateExampleInputJSON": "Ingresa un prompt para generar un JSON de entrada de ejemplo para la herramienta seleccionada.",
|
| 366 |
+
"callTool": "Llamar a herramienta",
|
| 367 |
+
"customInstructions": "Instrucciones personalizadas",
|
| 368 |
+
"serverCustomInstructionsPlaceholder": "Estas líneas se añadirán al mensaje del sistema siempre que haya una herramienta de este servidor disponible.",
|
| 369 |
+
"nameAlreadyExists": "El nombre ya existe",
|
| 370 |
+
"additionalInstructions": "Instrucciones de Personalización de Herramientas",
|
| 371 |
+
"inputSchema": "Esquema de Entrada",
|
| 372 |
+
"toolCustomizationInstructions": "Las instrucciones de personalización de herramientas se añadirán al prompt del sistema cuando la herramienta esté disponible.\nejemplo) Siempre ingresa el email en el formato ejemplo@ejemplo.com.",
|
| 373 |
+
"mcpServerCustomization": "Personalización del Servidor MCP",
|
| 374 |
+
"mcpServerCustomizationDescription": "Las instrucciones de personalización del servidor MCP se añadirán al prompt del sistema cuando el servidor MCP esté disponible.",
|
| 375 |
+
"toolCustomizationInstructionsPlaceholder": "Las instrucciones de personalización de herramientas no están disponibles.",
|
| 376 |
+
"mcpServerCustomizationPlaceholder": "ej. Si el valor de entrada es email, siempre ingresa el email en el formato ejemplo@ejemplo.com.",
|
| 377 |
+
"noInstructions": "Ninguno"
|
| 378 |
+
},
|
| 379 |
+
"Error": {},
|
| 380 |
+
"Info": {
|
| 381 |
+
"mcpAddingDisabled": "La adición de servidores MCP ha sido deshabilitada por el administrador.",
|
| 382 |
+
"vercelSyncDelay": "Ejecutándose en Vercel\n\nLos cambios de MCP pueden tardar 10-15 segundos en sincronizarse. Por favor espera un momento si los cambios no aparecen inmediatamente después de agregar, editar o eliminar servidores."
|
| 383 |
+
},
|
| 384 |
+
"Workflow": {
|
| 385 |
+
"title": "Flujo de Trabajo",
|
| 386 |
+
"createWorkflow": "Crear Flujo de Trabajo",
|
| 387 |
+
"draft": "Borrador",
|
| 388 |
+
"publish": "Publicar",
|
| 389 |
+
"createWorkflowDescription": "Crea flujos de trabajo como herramientas poderosas para tu chatbot.",
|
| 390 |
+
"workflowDescription": "Estos pueden activarse durante conversaciones para automatizar tareas complejas.",
|
| 391 |
+
"nameAndIcon": "Nombre e Icono",
|
| 392 |
+
"workflowNamePlaceholder": "El chatbot reconocerá esto como nombre de herramienta",
|
| 393 |
+
"description": "Descripción",
|
| 394 |
+
"descriptionPlaceholder": "El chatbot verá esto como descripción de herramienta",
|
| 395 |
+
"inputNodeCannotBeDeleted": "El nodo de entrada no puede ser eliminado",
|
| 396 |
+
"autoSaveDescription": "Guardado automático cada 10 segundos",
|
| 397 |
+
"draftDescription": "Actualmente en Borrador.\n\nHaz clic en Publicar para hacerlo disponible al chatbot\n(pero ya no será editable).",
|
| 398 |
+
"publishedDescription": "Actualmente Publicado y disponible para el chatbot.\n\nHaz clic en Borrador para hacerlo editable\n(pero no disponible para el chatbot).",
|
| 399 |
+
"private": "Privado",
|
| 400 |
+
"readonly": "Solo Lectura",
|
| 401 |
+
"public": "Público",
|
| 402 |
+
"privateDescription": "Solo tú puedes ver, editar y usar este flujo de trabajo como herramienta.",
|
| 403 |
+
"readonlyDescription": "Otros pueden ver y usar como herramienta, pero solo tú puedes editar.",
|
| 404 |
+
"publicDescription": "Cualquiera puede ver, editar y usar este flujo de trabajo como herramienta.",
|
| 405 |
+
"visibilityDescription": "Controla quién puede acceder y modificar este flujo de trabajo",
|
| 406 |
+
"nodeDescriptionPlaceholder": "descripción del nodo...",
|
| 407 |
+
"nextNode": "Siguiente Nodo",
|
| 408 |
+
"nextNodeDescription": "Agregar un siguiente nodo a este flujo de trabajo.",
|
| 409 |
+
"addNextNode": "Agregar Siguiente Nodo",
|
| 410 |
+
"inputFields": "Campos de Entrada",
|
| 411 |
+
"addInputField": "Agregar Campo de Entrada",
|
| 412 |
+
"inputFieldsDescription": "Define el esquema de parámetros para este flujo de trabajo.\n\nCuando el chatbot use esto como herramienta,\nproporcionará valores según este esquema.",
|
| 413 |
+
"fieldEditor": "Editor de Campo",
|
| 414 |
+
"variableName": "Nombre de Variable",
|
| 415 |
+
"variableNamePlaceholder": "Ingresa nombre de variable...",
|
| 416 |
+
"fieldDescriptionPlaceholder": "Ingresa descripción del campo...",
|
| 417 |
+
"defaultValuePlaceholder": "Ingresa valor {type} predeterminado...",
|
| 418 |
+
"selectOptionPlaceholder": "Seleccionar opción...",
|
| 419 |
+
"unlink": "Desvincular Nodo",
|
| 420 |
+
"elseIfDescription": "Si la condición no se cumple, se define la lógica a ejecutar.",
|
| 421 |
+
"elseDescription": "Si la condición no se cumple, se define la lógica a ejecutar.",
|
| 422 |
+
"addCondition": "Agregar Condición",
|
| 423 |
+
"noVariablesFound": "No se encontraron variables",
|
| 424 |
+
"outputVariables": "Variables de Salida",
|
| 425 |
+
"outputVariablesDescription": "Las variables de salida son las variables que se generan desde el flujo de trabajo.",
|
| 426 |
+
"addOutputVariable": "Agregar Variable de Salida",
|
| 427 |
+
"outputSchema": "Esquema de Salida",
|
| 428 |
+
"addMessage": "Agregar Mensaje",
|
| 429 |
+
"messagesDescription": "Generar datos a través del procesamiento LLM.\n\nUsa '/' para mencionar y referenciar datos de nodos anteriores como entrada.\n\nCon Salida Estructurada habilitada, perfecto para transformación, formateo y validación de datos.",
|
| 430 |
+
"descriptionAndSchema": "Descripción y Esquema",
|
| 431 |
+
"noDescriptionAndSchema": "Sin descripción y esquema",
|
| 432 |
+
"toolDescription": "Proporciona información necesaria para que LLM genere parámetros de herramienta.\n\nUsa '/' para mencionar datos de nodos anteriores.",
|
| 433 |
+
"generateInputWithAIDescription": "Escribe un prompt para generar entrada para el flujo de trabajo",
|
| 434 |
+
"example": {
|
| 435 |
+
"babyResearch": "Investigación de Bebés",
|
| 436 |
+
"getWeather": "Consultar Clima"
|
| 437 |
+
},
|
| 438 |
+
"selectVariable": "Seleccionar Variable",
|
| 439 |
+
"structuredOutput": "Salida Estructurada",
|
| 440 |
+
"structuredOutputDescription": "Generar respuesta como objeto JSON con esquema definido",
|
| 441 |
+
"outputSchemaEditor": "Editor de Esquema de Salida",
|
| 442 |
+
"addField": "Agregar Campo",
|
| 443 |
+
"saveSchema": "Guardar Esquema",
|
| 444 |
+
"generateSchemaWithAI": "Generar Esquema con IA",
|
| 445 |
+
"describeOutputDataRequest": "Proporciona datos JSON de ejemplo que representen lo que este nodo debería generar\n\nEjemplo: {eg}",
|
| 446 |
+
"generatingJsonSchemaWithAI": "Generando esquema JSON con IA...",
|
| 447 |
+
"jsonSchemaGeneratedSuccessfully": "¡Esquema JSON generado exitosamente!",
|
| 448 |
+
"failedToGenerateSchema": "Error al generar esquema",
|
| 449 |
+
"jsonSchemaEditorDescription": "Edición directa de esquema JSON con asistencia de IA. Soporta estructuras anidadas complejas y arrays.",
|
| 450 |
+
"template": "Plantilla",
|
| 451 |
+
"templateDescription": "Generar documentos de plantilla.\n\nUsa '/' para referenciar y usar valores de salida de otros nodos.",
|
| 452 |
+
"kindsDescription": {
|
| 453 |
+
"input": "Define parámetros de entrada que el chatbot proporcionará al usar este flujo de trabajo como herramienta.\n\nEspecifica la estructura de datos y reglas de validación para la ejecución de la herramienta.",
|
| 454 |
+
"output": "Recopila y retorna los resultados finales de la ejecución de tu flujo de trabajo.\n\nCombina datos de múltiples nodos en la respuesta final de la herramienta.",
|
| 455 |
+
"llm": "Genera texto o datos estructurados usando modelos de IA.\n\nReferencia salidas de nodos anteriores con menciones '/' para crear respuestas conscientes del contexto.\n\nUsa Salida Estructurada para transformar, formatear y validar datos - no solo para generación de texto.",
|
| 456 |
+
"tool": "Ejecuta herramientas MCP o servicios externos.\n\nEscribe instrucciones en mensajes, y LLM generará los parámetros de herramienta requeridos desde tu contexto.",
|
| 457 |
+
"note": "Agrega documentación y comentarios para organizar la lógica de tu flujo de trabajo.\n\nAyuda a los miembros del equipo a entender procesos complejos de flujo de trabajo.",
|
| 458 |
+
"code": "Ejecuta scripts de código personalizado con acceso a datos de nodos anteriores.\n\nEjecuta JavaScript, Python u otros lenguajes dentro de tu flujo de trabajo (próximamente).",
|
| 459 |
+
"http": "Obtén datos de APIs externas y servicios web vía peticiones HTTP.\n\nIntégrate con APIs REST, webhooks y servicios de terceros.",
|
| 460 |
+
"template": "Crea documentos dinámicos combinando texto con datos de nodos anteriores.\n\nGenera correos, reportes o contenido formateado usando sustitución de variables.",
|
| 461 |
+
"condition": "Agrega lógica condicional para ramificar tu flujo de trabajo basado en evaluación de datos.\n\nCrea lógica if-else para manejar diferentes escenarios y condiciones de datos."
|
| 462 |
+
},
|
| 463 |
+
"greeting": {
|
| 464 |
+
"buildAutomationTitle": "Construir Automatización Conectando Nodos",
|
| 465 |
+
"buildAutomationDescription": "Conecta varios nodos para automatizar tareas complejas. Cada nodo maneja funciones específicas, y los datos fluyen secuencialmente para su procesamiento.",
|
| 466 |
+
"chatbotToolTitle": "Usar como Herramientas de Chatbot",
|
| 467 |
+
"chatbotToolDescription": "El propósito principal de los flujos de trabajo es usarlos como herramientas en conversaciones de chatbot. Convierte tareas repetitivas en flujos de trabajo para una fácil ejecución durante los chats.",
|
| 468 |
+
"parameterBasedTitle": "️ Inicio Basado en Parámetros",
|
| 469 |
+
"parameterBasedDescription": "Los nodos de entrada definen estructuras de parámetros, no disparadores. Especifican el formato de datos necesario cuando el chatbot llama a este flujo de trabajo como herramienta.",
|
| 470 |
+
"exampleTitle": "Ejemplo de Uso",
|
| 471 |
+
"exampleDescription": "Crea un flujo de trabajo \"Escribir Email → Traducir → Enviar\", luego ejecútalo fácilmente en conversaciones de chatbot con \"@email_workflow\".",
|
| 472 |
+
"availableNodesTitle": "Nodos Disponibles",
|
| 473 |
+
"upcomingNodesTitle": "Nodos Próximos",
|
| 474 |
+
"ctaMessage": "¡Comienza a crear flujos de trabajo ahora para expandir las capacidades de tu chatbot!",
|
| 475 |
+
"soonMessage": "Próximamente."
|
| 476 |
+
},
|
| 477 |
+
"arrangeNodes": "Auto Layout",
|
| 478 |
+
"nodesArranged": "Layout aplicado exitosamente",
|
| 479 |
+
"visibilityUpdated": "Visibilidad actualizada exitosamente"
|
| 480 |
+
},
|
| 481 |
+
"User": {
|
| 482 |
+
"Profile": {
|
| 483 |
+
"common": {
|
| 484 |
+
"uploadPhoto": "Subir Foto",
|
| 485 |
+
"chooseDefault": "Elegir Predeterminada",
|
| 486 |
+
"useEmoji": "Usar Emoji",
|
| 487 |
+
"generateWithAI": "Generar con IA",
|
| 488 |
+
"changeProfilePhoto": "Cambiar Foto de Perfil",
|
| 489 |
+
"selectDefaultAvatar": "Elegir Avatar Predeterminado",
|
| 490 |
+
"selectDefaultAvatarDescription": "Selecciona uno de los avatares predeterminados a continuación",
|
| 491 |
+
"chooseEmojiAvatar": "Elegir Avatar Emoji",
|
| 492 |
+
"chooseEmojiAvatarDescription": "Selecciona un emoji para usar como tu foto de perfil",
|
| 493 |
+
"generateAvatarWithAI": "Generar Avatar con IA",
|
| 494 |
+
"generateAvatarWithAIDescription": "Describe tu foto de perfil ideal y deja que la IA la cree",
|
| 495 |
+
"aiProvider": "Proveedor de IA",
|
| 496 |
+
"describeYourAvatar": "Describe tu avatar",
|
| 497 |
+
"avatarPromptPlaceholder": "ej., Un cachorro lindo en estilo Studio Ghibli",
|
| 498 |
+
"generating": "Generando...",
|
| 499 |
+
"regenerate": "Regenerar",
|
| 500 |
+
"useThisAvatar": "Usar Este Avatar",
|
| 501 |
+
"profilePhotoUpdatedSuccessfully": "Foto de perfil actualizada exitosamente",
|
| 502 |
+
"failedToUpdateProfilePhoto": "Error al actualizar la foto de perfil",
|
| 503 |
+
"pleaseEnterPrompt": "Por favor ingresa una descripción",
|
| 504 |
+
"imageGeneratedSuccessfully": "¡Imagen generada exitosamente!",
|
| 505 |
+
"failedToGenerateImage": "Error al generar imagen",
|
| 506 |
+
"failedToSaveImage": "Error al guardar imagen",
|
| 507 |
+
"pleaseUploadValidImage": "Por favor sube una imagen válida (JPEG, PNG o WebP)",
|
| 508 |
+
"imageSizeMustBeLessThan": "El tamaño de la imagen debe ser menor a 5MB",
|
| 509 |
+
"select": "Seleccionar"
|
| 510 |
+
}
|
| 511 |
+
}
|
| 512 |
+
}
|
| 513 |
+
}
|
messages/fr.json
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "Annuler",
|
| 4 |
+
"update": "Mettre à jour",
|
| 5 |
+
"continue": "Continuer",
|
| 6 |
+
"success": "Succès",
|
| 7 |
+
"delete": "Supprimer",
|
| 8 |
+
"save": "Enregistrer",
|
| 9 |
+
"back": "Retour",
|
| 10 |
+
"next": "Suivant",
|
| 11 |
+
"create": "Créer",
|
| 12 |
+
"showLess": "Afficher moins",
|
| 13 |
+
"showMore": "Afficher plus",
|
| 14 |
+
"generate": "Générer",
|
| 15 |
+
"edit": "Modifier",
|
| 16 |
+
"editAgent": "Modifier l'Agent",
|
| 17 |
+
"search": "Rechercher...",
|
| 18 |
+
"approve": "Approuver",
|
| 19 |
+
"reject": "Rejeter",
|
| 20 |
+
"saving": "Enregistrement...",
|
| 21 |
+
"optional": "Facultatif",
|
| 22 |
+
"deleting": "Suppression...",
|
| 23 |
+
"run": "Exécuter",
|
| 24 |
+
"description": "Description",
|
| 25 |
+
"defaultValue": "Valeur par Défaut",
|
| 26 |
+
"empty": "Vide",
|
| 27 |
+
"required": "Requis",
|
| 28 |
+
"options": "Options",
|
| 29 |
+
"status": "Statut",
|
| 30 |
+
"result": "Résultat",
|
| 31 |
+
"startedAt": "Commencé À",
|
| 32 |
+
"duration": "Durée",
|
| 33 |
+
"addOption": "Ajouter Option",
|
| 34 |
+
"tool": "Outil",
|
| 35 |
+
"selectTool": "Sélectionner Outil...",
|
| 36 |
+
"noResults": "Aucun résultat.",
|
| 37 |
+
"generateInputWithAI": "Générer Entrée avec IA",
|
| 38 |
+
"generatingInputWithAI": "Génération d'entrée avec IA...",
|
| 39 |
+
"inputGeneratedSuccessfully": "Entrée générée avec succès",
|
| 40 |
+
"failedToGenerateInput": "Échec de génération d'entrée",
|
| 41 |
+
"createWithExample": "Créer avec Exemple",
|
| 42 |
+
"resultsFound": "{count} résultats trouvés",
|
| 43 |
+
"youAreAnExpertIn": "Vous êtes un expert en {role}",
|
| 44 |
+
"sharedBy": "Partagé par {userName}"
|
| 45 |
+
},
|
| 46 |
+
"Auth": {
|
| 47 |
+
"SignIn": {
|
| 48 |
+
"title": "Bon retour",
|
| 49 |
+
"description": "Connectez-vous pour continuer vers votre compte",
|
| 50 |
+
"oauthClientIdNotSet": "L'ID client {provider} n'est pas configuré",
|
| 51 |
+
"noAccount": "Vous n'avez pas de compte ?",
|
| 52 |
+
"signUp": "S'inscrire",
|
| 53 |
+
"signIn": "Se connecter",
|
| 54 |
+
"orContinueWith": "OU CONTINUER AVEC"
|
| 55 |
+
},
|
| 56 |
+
"SignUp": {
|
| 57 |
+
"title": "Créer un compte",
|
| 58 |
+
"signIn": "Se connecter",
|
| 59 |
+
"description": "Inscrivez-vous à votre compte",
|
| 60 |
+
"step1": "Commencez votre parcours avec nous en saisissant votre adresse e-mail",
|
| 61 |
+
"step2": "J'utiliserai ce nom quand nous discuterons",
|
| 62 |
+
"step3": "Créez un mot de passe fort pour sécuriser votre compte",
|
| 63 |
+
"signUp": "S'inscrire",
|
| 64 |
+
"invalidEmail": "Adresse e-mail invalide",
|
| 65 |
+
"emailAlreadyExists": "L'e-mail existe déjà",
|
| 66 |
+
"nameRequired": "Le nom est requis",
|
| 67 |
+
"passwordRequired": "Le mot de passe est requis",
|
| 68 |
+
"createAccount": "Créer un compte"
|
| 69 |
+
},
|
| 70 |
+
"Intro": {
|
| 71 |
+
"description": "Bienvenue sur better-chatbot. Connectez-vous pour découvrir nos outils de conversation alimentés par l'IA."
|
| 72 |
+
}
|
| 73 |
+
},
|
| 74 |
+
"Chat": {
|
| 75 |
+
"Error": "Erreur de Chat",
|
| 76 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "Ce message n'a pas été enregistré. Veuillez réessayer le chat.",
|
| 77 |
+
"uploadImage": "Téléverser un fichier",
|
| 78 |
+
"generateImage": "Générer une Image",
|
| 79 |
+
"imageUploadedSuccessfully": "Image téléchargée avec succès",
|
| 80 |
+
"pleaseUploadImageFile": "Veuillez télécharger un fichier image",
|
| 81 |
+
"imageSizeMustBeLessThan10MB": "La taille de l'image doit être inférieure à 10 Mo",
|
| 82 |
+
"failedToUploadImage": "Échec du téléchargement de l'image",
|
| 83 |
+
"imageUploadFailedUsingBase64": "Le téléchargement de l'image a échoué. Utilisation de l'encodage base64 comme solution de secours.",
|
| 84 |
+
"Greeting": {
|
| 85 |
+
"goodMorning": "Bonjour, {name}",
|
| 86 |
+
"goodAfternoon": "Bon après-midi, {name}",
|
| 87 |
+
"goodEvening": "Bonsoir, {name}",
|
| 88 |
+
"niceToSeeYouAgain": "Ravi de vous revoir, {name}",
|
| 89 |
+
"whatAreYouWorkingOnToday": "Sur quoi travaillez-vous aujourd'hui, {name} ?",
|
| 90 |
+
"letMeKnowWhenYoureReadyToBegin": "Faites-moi savoir quand vous êtes prêt à commencer.",
|
| 91 |
+
"whatAreYourThoughtsToday": "Quelles sont vos pensées aujourd'hui ?",
|
| 92 |
+
"whereWouldYouLikeToStart": "Par où aimeriez-vous commencer ?",
|
| 93 |
+
"whatAreYouThinking": "À quoi pensez-vous, {name} ?"
|
| 94 |
+
},
|
| 95 |
+
"TemporaryChat": {
|
| 96 |
+
"toggleTemporaryChat": "Basculer le Chat Temporaire",
|
| 97 |
+
"temporaryChat": "Chat Temporaire",
|
| 98 |
+
"resetChat": "Réinitialiser le Chat",
|
| 99 |
+
"thisChatWontBeSaved": "Ce chat ne sera pas enregistré.",
|
| 100 |
+
"feelFreeToAskAnythingTemporarily": "N'hésitez pas à demander quoi que ce soit temporairement",
|
| 101 |
+
"temporaryChatInstructions": "Instructions du Chat Temporaire",
|
| 102 |
+
"temporaryChatInstructionsPlaceholder": "Entrez vos instructions ici",
|
| 103 |
+
"temporaryChatInstructionsDescription": "Vous pouvez définir des instructions pour le chat temporaire. Cela sera utilisé comme prompt système pour le chat temporaire."
|
| 104 |
+
},
|
| 105 |
+
"placeholder": "Demandez n'importe quoi ou @mentionnez",
|
| 106 |
+
"Tool": {
|
| 107 |
+
"webSearching": "Recherche sur le web...",
|
| 108 |
+
"searchedTheWeb": "Recherché sur le web",
|
| 109 |
+
"toolModeDescription": "Choisissez comment les outils sont utilisés:\n• Auto: L'IA décide quand utiliser les outils\n• Manuel: Demande permission avant d'utiliser les outils\n• Aucun: Désactive tous les outils",
|
| 110 |
+
"toolsSetupDescription": "Sélectionnez les outils que le chatbot peut utiliser.\nLe chatbot utilisera les outils sélectionnés selon son propre jugement.\n\nVous pouvez aussi forcer l'utilisation d'outils spécifiques via @mention.",
|
| 111 |
+
"selectToolMode": "Sélectionner le mode d'outils",
|
| 112 |
+
"autoToolModeDescription": "Décide quand utiliser les outils sans vous demander",
|
| 113 |
+
"manualToolModeDescription": "Demande votre permission avant d'utiliser des outils",
|
| 114 |
+
"noneToolModeDescription": "Ne pas utiliser d'outils. @mention est toujours disponible.",
|
| 115 |
+
"toolsSetup": "Configuration des Outils",
|
| 116 |
+
"preset": "Préréglage",
|
| 117 |
+
"toolPresets": "Préréglages d'Outils",
|
| 118 |
+
"saveAsPreset": "Enregistrer comme Préréglage",
|
| 119 |
+
"saveAsPresetDescription": "Enregistrer la configuration actuelle des outils comme préréglage.",
|
| 120 |
+
"noPresetsAvailableYet": "Aucun préréglage disponible pour le moment",
|
| 121 |
+
"presetNameCannotBeEmpty": "Le nom du préréglage ne peut pas être vide",
|
| 122 |
+
"presetNameAlreadyExists": "Le nom du préréglage existe déjà",
|
| 123 |
+
"presetSaved": "Préréglage enregistré",
|
| 124 |
+
"clickSaveAsPresetToGetStarted": "Cliquez sur Enregistrer comme Préréglage pour commencer.",
|
| 125 |
+
"searchOptions": "Options de Recherche",
|
| 126 |
+
"searchOptionsDescription": "Vous pouvez passer des options de recherche au chatbot, comme le nombre maximum de résultats de recherche, la date de recherche, etc.",
|
| 127 |
+
"defaultToolKit": {
|
| 128 |
+
"visualization": "Visualisation de données",
|
| 129 |
+
"webSearch": "Rechercher sur le le Web"
|
| 130 |
+
},
|
| 131 |
+
"agent": "Agent",
|
| 132 |
+
"mention": "Mention",
|
| 133 |
+
"tools": "Outils",
|
| 134 |
+
"tooManyToolsSelected": "Trop d'outils sélectionnés, veuillez sélectionner moins de 128 outils",
|
| 135 |
+
"presetNamePlaceholder": "Nom du Préréglage",
|
| 136 |
+
"noMcpServersDetected": "Aucun serveur MCP détecté.",
|
| 137 |
+
"addServer": "Ajouter un serveur",
|
| 138 |
+
"error": "erreur",
|
| 139 |
+
"authorizationRequired": "Autorisation Requise",
|
| 140 |
+
"clickToAuthorize": "Cliquez ici pour autoriser ce serveur MCP et accéder à ses outils.",
|
| 141 |
+
"auto": "Auto",
|
| 142 |
+
"manual": "Manuel",
|
| 143 |
+
"none": "Aucun",
|
| 144 |
+
"mentionOnly": "@mention uniquement",
|
| 145 |
+
"noToolsAvailable": "Aucun outil disponible"
|
| 146 |
+
},
|
| 147 |
+
"VoiceChat": {
|
| 148 |
+
"title": "Mode Chat Vocal",
|
| 149 |
+
"compactDisplayMode": "Mode d'affichage compact",
|
| 150 |
+
"conversationDisplayMode": "Mode d'affichage de conversation",
|
| 151 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "Veuillez fermer le chat vocal et réessayer.",
|
| 152 |
+
"startConversation": "Démarrer la conversation",
|
| 153 |
+
"closeMic": "Fermer le micro",
|
| 154 |
+
"openMic": "Ouvrir le micro",
|
| 155 |
+
"endConversation": "Terminer la conversation",
|
| 156 |
+
"toggleVoiceChat": "Basculer le Chat Vocal",
|
| 157 |
+
"readyWhenYouAreJustStartTalking": "Prêt quand vous l'êtes—commencez simplement à parler.",
|
| 158 |
+
"yourMicIsOff": "Votre micro est éteint.",
|
| 159 |
+
"preparing": "Préparation...",
|
| 160 |
+
"startVoiceChat": "Démarrer le chat vocal ?"
|
| 161 |
+
},
|
| 162 |
+
"Thread": {
|
| 163 |
+
"chat": "Chat",
|
| 164 |
+
|
| 165 |
+
"renameChat": "Renommer",
|
| 166 |
+
"deleteChat": "Supprimer le Chat",
|
| 167 |
+
"deleteUnarchivedChats": "Supprimer Tous les Chats Non Archivés",
|
| 168 |
+
"confirmDeleteUnarchivedChats": "Êtes-vous sûr de vouloir supprimer tous les chats non archivés ?",
|
| 169 |
+
"thisActionCannotBeUndone": "Cette action ne peut pas être annulée.",
|
| 170 |
+
"unarchivedChatsDeleted": "Les chats non archivés ont été supprimés",
|
| 171 |
+
"failedToDeleteUnarchivedChats": "Échec de la suppression des chats non archivés",
|
| 172 |
+
"failedToDeleteThread": "Échec de suppression du fil",
|
| 173 |
+
"threadDeleted": "Fil supprimé",
|
| 174 |
+
"failedToUpdateThread": "Échec de mise à jour du fil",
|
| 175 |
+
"titleRequired": "Le titre est requis",
|
| 176 |
+
"threadUpdated": "Fil mis à jour",
|
| 177 |
+
"areYouSureYouWantToDeleteThisChatThread": "Êtes-vous sûr de vouloir supprimer ce fil de chat ?",
|
| 178 |
+
"sharePublicLink": "Partager le Lien Public",
|
| 179 |
+
"sharePublicLinkDescription": "Tous les messages ajoutés après le partage resteront privés.",
|
| 180 |
+
"creatingLink": "Création du lien...",
|
| 181 |
+
"createLink": "Créer le Lien",
|
| 182 |
+
"linkCopied": "Lien copié"
|
| 183 |
+
},
|
| 184 |
+
|
| 185 |
+
"ChatPreferences": {
|
| 186 |
+
"title": "Préférences de Chat",
|
| 187 |
+
"whatShouldWeCallYou": "Comment devrions-nous vous appeler ?",
|
| 188 |
+
"botName": "Nom de l'Assistant",
|
| 189 |
+
"whatBestDescribesYourWork": "Qu'est-ce qui décrit le mieux votre travail ?",
|
| 190 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "Quelles préférences personnelles devraient être prises en compte dans les réponses ?",
|
| 191 |
+
"responseStyleExample1": "ex. gardez les explications brèves et directes",
|
| 192 |
+
"responseStyleExample2": "ex. quand j'apprends de nouveaux concepts, je trouve les analogies particulièrement utiles",
|
| 193 |
+
"responseStyleExample3": "ex. posez des questions de clarification avant de donner des réponses détaillées",
|
| 194 |
+
"responseStyleExample4": "ex. rappelez-vous que je programme principalement en Python (je ne suis pas débutant en programmation)",
|
| 195 |
+
"professionExample1": "ex. ingénieur logiciel",
|
| 196 |
+
"professionExample2": "ex. chef de produit",
|
| 197 |
+
"professionExample3": "ex. responsable marketing",
|
| 198 |
+
"professionExample4": "ex. directeur des ventes",
|
| 199 |
+
"professionExample5": "ex. analyste commercial",
|
| 200 |
+
"preferencesSaved": "Préférences enregistrées",
|
| 201 |
+
"failedToSavePreferences": "Échec de l'enregistrement des préférences",
|
| 202 |
+
"userInstructions": "Instructions Utilisateur",
|
| 203 |
+
"userInstructionsDescription": "Présentez-vous et obtenez une réponse plus personnalisée.",
|
| 204 |
+
"mcpInstructions": "Instructions MCP",
|
| 205 |
+
"mcpInstructionsDescription": "Personnalisez les instructions du serveur MCP.",
|
| 206 |
+
"userSettings": "Paramètres Utilisateur"
|
| 207 |
+
}
|
| 208 |
+
},
|
| 209 |
+
"Layout": {
|
| 210 |
+
"toggleSidebar": "Basculer la Barre Latérale",
|
| 211 |
+
"newChat": "Nouveau Chat",
|
| 212 |
+
"mcpConfiguration": "Configuration MCP",
|
| 213 |
+
"agents": "Agents",
|
| 214 |
+
"newAgent": "Nouvel Agent",
|
| 215 |
+
"createAgent": "Créer un agent",
|
| 216 |
+
"createYourOwnAgent": "Créez votre propre agent IA spécialisé avec des fonctionnalités et une personnalité uniques",
|
| 217 |
+
"whatIsAgent": "Qu'est-ce qu'un Agent ?",
|
| 218 |
+
"agentDescription": "Les agents sont des assistants IA spécialisés qui peuvent être personnalisés avec des rôles, des instructions et des outils spécifiques pour vous aider dans diverses tâches.",
|
| 219 |
+
"specializedAIAssistant": "Assistant IA Spécialisé",
|
| 220 |
+
"specializedAIAssistantDescription": "Chaque agent peut être personnalisé avec des rôles spécifiques, des personnalités et des domaines d'expertise pour fournir une assistance ciblée selon vos besoins uniques.",
|
| 221 |
+
"customInstructions": "Instructions Personnalisées",
|
| 222 |
+
"customInstructionsDescription": "Définissez des prompts système détaillés et des directives comportementales pour façonner la façon dont votre agent répond et interagit avec vous.",
|
| 223 |
+
"toolIntegration": "Intégration d'Outils",
|
| 224 |
+
"toolIntegrationDescription": "Connectez vos agents aux serveurs MCP, aux flux de travail et à d'autres outils pour étendre leurs capacités au-delà de la conversation.",
|
| 225 |
+
"agentExamples": "Exemples d'Agents",
|
| 226 |
+
"businessAssistant": "Assistant Business",
|
| 227 |
+
"businessAssistantDescription": "Spécialisé dans l'analyse commerciale, la génération de rapports et la communication professionnelle.",
|
| 228 |
+
"creativeWriter": "Écrivain Créatif",
|
| 229 |
+
"creativeWriterDescription": "Axé sur la narration, la création de contenu et le brainstorming créatif.",
|
| 230 |
+
"technicalExpert": "Expert Technique",
|
| 231 |
+
"technicalExpertDescription": "Équipé d'outils de développement et d'expertise en codage pour les tâches techniques.",
|
| 232 |
+
"createFirstAgentToStart": "Créez votre premier agent pour commencer !",
|
| 233 |
+
"today": "Aujourd'hui",
|
| 234 |
+
"yesterday": "Hier",
|
| 235 |
+
"lastWeek": "7 derniers jours",
|
| 236 |
+
"older": "Plus ancien",
|
| 237 |
+
"recentChats": "Chats Récents",
|
| 238 |
+
"deleteAllChats": "Supprimer Tous les Chats",
|
| 239 |
+
"deleteUnarchivedChats": "Supprimer les Chats Non Archivés",
|
| 240 |
+
"noConversationsYet": "Aucune conversation pour le moment",
|
| 241 |
+
"deletingAllChats": "Suppression de tous les fils...",
|
| 242 |
+
"deletingUnarchivedChats": "Suppression des fils non archivés...",
|
| 243 |
+
"allChatsDeleted": "Tous les fils supprimés",
|
| 244 |
+
"unarchivedChatsDeleted": "Fils non archivés supprimés",
|
| 245 |
+
"failedToDeleteAllChats": "Échec de suppression de tous les fils",
|
| 246 |
+
"failedToDeleteUnarchivedChats": "Échec de suppression des fils non archivés",
|
| 247 |
+
"chatPreferences": "Préférences de Chat",
|
| 248 |
+
"keyboardShortcuts": "Raccourcis Clavier",
|
| 249 |
+
"theme": "Thème",
|
| 250 |
+
"signOut": "Se déconnecter",
|
| 251 |
+
"language": "Langue",
|
| 252 |
+
|
| 253 |
+
"showAllChats": "Voir Tous les Chats",
|
| 254 |
+
"showLessChats": "Afficher moins",
|
| 255 |
+
"reportAnIssue": "Signaler un problème",
|
| 256 |
+
"joinCommunity": "Rejoindre la Communauté",
|
| 257 |
+
"workflow": "Flux de Travail",
|
| 258 |
+
"userSettings": "Paramètres Utilisateur"
|
| 259 |
+
},
|
| 260 |
+
"Archive": {
|
| 261 |
+
"title": "Archive",
|
| 262 |
+
"addArchive": "Ajouter une Archive",
|
| 263 |
+
"archiveName": "Nom de l'Archive",
|
| 264 |
+
"archiveDescription": "Description de l'Archive",
|
| 265 |
+
"archiveDescriptionPlaceholder": "Les archives sont des espaces pour stocker l'historique des chats.",
|
| 266 |
+
"noArchives": "Aucune archive",
|
| 267 |
+
"createFirstArchive": "Créez votre première archive",
|
| 268 |
+
"archiveCreated": "Archive créée",
|
| 269 |
+
"archiveUpdated": "Archive mise à jour",
|
| 270 |
+
"archiveDeleted": "Archive supprimée",
|
| 271 |
+
"failedToCreateArchive": "Échec de la création de l'archive",
|
| 272 |
+
"failedToUpdateArchive": "Échec de la mise à jour de l'archive",
|
| 273 |
+
"failedToDeleteArchive": "Échec de la suppression de l'archive",
|
| 274 |
+
"editArchive": "Modifier l'Archive",
|
| 275 |
+
"editArchiveDescription": "Modifier les informations de l'archive",
|
| 276 |
+
"deleteArchive": "Supprimer l'Archive",
|
| 277 |
+
"confirmDeleteArchive": "Êtes-vous sûr de vouloir supprimer cette archive ?",
|
| 278 |
+
"deleteArchiveDescription": "Cette archive et tous ses éléments seront définitivement supprimés. Cette action ne peut pas être annulée.",
|
| 279 |
+
"addToArchive": "Ajouter à l'Archive",
|
| 280 |
+
"removeFromArchive": "Supprimer de l'Archive",
|
| 281 |
+
"itemAddedToArchive": "Élément ajouté à l'archive",
|
| 282 |
+
"itemRemovedFromArchive": "Élément supprimé de l'archive"
|
| 283 |
+
},
|
| 284 |
+
"Agent": {
|
| 285 |
+
"title": "Agent",
|
| 286 |
+
"generatingAgent": "Génération de l'Agent...",
|
| 287 |
+
"agentNameAndIconLabel": "Donnez un nom et une icône à votre agent.",
|
| 288 |
+
"agentDescriptionLabel": "Ajoutez une brève description de ce que fait cet agent.",
|
| 289 |
+
"agentDescriptionPlaceholder": "Ceci n'est qu'une description de l'agent, ce n'est pas critique.",
|
| 290 |
+
"agentSettingsDescription": "À partir d'ici, ce sont des paramètres qui peuvent affecter l'agent.",
|
| 291 |
+
"thisAgentIs": "Cet agent est un expert en",
|
| 292 |
+
"expertIn": "",
|
| 293 |
+
"agentRolePlaceholder": "analyse boursière",
|
| 294 |
+
"agentInstructionsLabel": "N'hésitez pas à écrire le rôle, la personnalité, les directives, les connaissances, etc. de l'agent.",
|
| 295 |
+
"agentInstructionsPlaceholder": "Cet agent aide à l'analyse boursière. Il utilise des outils de recherche web pour obtenir des informations boursières...",
|
| 296 |
+
"agentToolsLabel": "Ajoutez des outils que cet agent peut utiliser.",
|
| 297 |
+
"loadingTools": "Chargement des outils...",
|
| 298 |
+
"addTools": "Veuillez ajouter des outils.",
|
| 299 |
+
"generateAgentGreeting": "Bonjour ! Je vais vous aider à créer votre propre agent. Que souhaitez-vous créer ?",
|
| 300 |
+
"generateAgentDetailedGreeting": "Bonjour ! Je vais vous aider à créer votre propre agent. Que souhaitez-vous créer ? Vous pouvez écrire brièvement ou en détail.",
|
| 301 |
+
"inputPromptHere": "saisissez le prompt ici...",
|
| 302 |
+
"agentNamePlaceholder": "better-agent",
|
| 303 |
+
"myAgents": "Mes Agents",
|
| 304 |
+
"sharedAgents": "Agents Partagés",
|
| 305 |
+
"noAgents": "Pas encore d'agents",
|
| 306 |
+
"createFirst": "Créez votre premier agent pour commencer",
|
| 307 |
+
"noSharedAgents": "Aucun agent partagé",
|
| 308 |
+
"noSharedAgentsDescription": "Aucun agent public n'est disponible pour les marquer",
|
| 309 |
+
"noDescription": "Aucune description fournie",
|
| 310 |
+
"bookmarkAdded": "Agent mis en favori",
|
| 311 |
+
"bookmarkRemoved": "Favori supprimé",
|
| 312 |
+
"bookmarkedAgent": "Agent en favori",
|
| 313 |
+
"addBookmark": "Mettre l'agent en favori",
|
| 314 |
+
"removeBookmark": "Supprimer le favori",
|
| 315 |
+
"visibilityUpdated": "Visibilité mise à jour",
|
| 316 |
+
"deleted": "Agent supprimé",
|
| 317 |
+
"deleteConfirm": "Êtes-vous sûr de vouloir supprimer cet agent?",
|
| 318 |
+
"makePrivate": "Rendre Privé",
|
| 319 |
+
"makeReadonly": "Rendre en Lecture Seule",
|
| 320 |
+
"makePublic": "Rendre Public",
|
| 321 |
+
"visibility": "Visibilité",
|
| 322 |
+
"private": "Privé",
|
| 323 |
+
"readOnly": "Lecture Seule",
|
| 324 |
+
"public": "Public",
|
| 325 |
+
"privateDescription": "Seul vous pouvez voir, modifier et utiliser cet agent.",
|
| 326 |
+
"readOnlyDescription": "Les autres peuvent voir et utiliser comme outil, mais seul vous pouvez modifier.",
|
| 327 |
+
"publicDescription": "Tout le monde peut voir, modifier et utiliser cet agent comme outil."
|
| 328 |
+
},
|
| 329 |
+
"KeyboardShortcuts": {
|
| 330 |
+
"title": "Raccourcis Clavier",
|
| 331 |
+
"newChat": "Nouveau Chat",
|
| 332 |
+
"toggleTemporaryChat": "Basculer Chat Temporaire",
|
| 333 |
+
"toggleSidebar": "Basculer Barre Latérale",
|
| 334 |
+
"toolMode": "Mode Outils",
|
| 335 |
+
"lastMessageCopy": "Copier le Dernier Message",
|
| 336 |
+
"openChatPreferences": "Ouvrir Préférences Chat",
|
| 337 |
+
"deleteThread": "Supprimer Chat",
|
| 338 |
+
"openShortcutsPopup": "Ouvrir Popup Raccourcis",
|
| 339 |
+
"toggleVoiceChat": "Basculer Chat Vocal"
|
| 340 |
+
},
|
| 341 |
+
"MCP": {
|
| 342 |
+
"marketplace": "Marché",
|
| 343 |
+
"addMcpServer": "Ajouter Serveur",
|
| 344 |
+
"configureYourMcpServerConnectionSettings": "Configurez les paramètres de connexion de votre serveur MCP",
|
| 345 |
+
"mcpConfiguration": "Configuration MCP",
|
| 346 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "Le nom ne doit contenir que des caractères alphanumériques (A-Z, a-z, 0-9) et des traits d'union (-)",
|
| 347 |
+
"nameIsRequired": "Le nom est requis",
|
| 348 |
+
"configurationSavedSuccessfully": "Configuration enregistrée avec succès",
|
| 349 |
+
"enterMcpServerName": "Entrez le nom du serveur MCP",
|
| 350 |
+
"saveConfiguration": "Enregistrer la Configuration",
|
| 351 |
+
"toolsTest": "Test des Outils",
|
| 352 |
+
"refresh": "Actualiser",
|
| 353 |
+
"delete": "Supprimer",
|
| 354 |
+
"edit": "Modifier",
|
| 355 |
+
"configuration": "Configuration",
|
| 356 |
+
"availableTools": "Outils Disponibles",
|
| 357 |
+
"noToolsAvailable": "Aucun outil disponible",
|
| 358 |
+
"overviewTitle": "Connectez Votre Premier Serveur",
|
| 359 |
+
"overviewDescription": "Ajoutez des serveurs MCP pour débloquer de puissantes intégrations IA",
|
| 360 |
+
"searchTools": "Rechercher des outils",
|
| 361 |
+
"detail": "Détail",
|
| 362 |
+
"noSchemaPropertiesAvailable": "Aucune propriété de schéma disponible",
|
| 363 |
+
"createInputWithAI": "Créer Entrée avec IA",
|
| 364 |
+
"generateExampleInputJSON": "Générer JSON d'Entrée d'Exemple",
|
| 365 |
+
"enterPromptToGenerateExampleInputJSON": "Entrez un prompt pour générer un JSON d'entrée d'exemple pour l'outil sélectionné.",
|
| 366 |
+
"callTool": "Appeler l'outil",
|
| 367 |
+
"customInstructions": "Instructions personnalisées",
|
| 368 |
+
"serverCustomInstructionsPlaceholder": "Ces lignes seront ajoutées à l'invite système chaque fois qu'un outil de ce serveur sera disponible.",
|
| 369 |
+
"nameAlreadyExists": "Le nom existe déjà",
|
| 370 |
+
"additionalInstructions": "Instructions de Personnalisation d'Outils",
|
| 371 |
+
"inputSchema": "Schéma d'Entrée",
|
| 372 |
+
"toolCustomizationInstructions": "Les instructions de personnalisation d'outils seront ajoutées à l'invite système lorsque l'outil sera disponible.\nexemple) Toujours entrer l'email au format exemple@exemple.com.",
|
| 373 |
+
"mcpServerCustomization": "Personnalisation du Serveur MCP",
|
| 374 |
+
"mcpServerCustomizationDescription": "Les instructions de personnalisation du serveur MCP seront ajoutées à l'invite système lorsque le serveur MCP sera disponible.",
|
| 375 |
+
"toolCustomizationInstructionsPlaceholder": "Les instructions de personnalisation d'outils ne sont pas disponibles.",
|
| 376 |
+
"mcpServerCustomizationPlaceholder": "ex. Si la valeur d'entrée est un email, toujours entrer l'email au format exemple@exemple.com.",
|
| 377 |
+
"noInstructions": "Aucun"
|
| 378 |
+
},
|
| 379 |
+
"Error": {},
|
| 380 |
+
"Info": {
|
| 381 |
+
"mcpAddingDisabled": "L'ajout de serveurs MCP a été désactivé par l'administrateur.",
|
| 382 |
+
"vercelSyncDelay": "Fonctionnement sur Vercel\n\nLes modifications MCP peuvent prendre 10-15 secondes à se synchroniser. Veuillez patienter un moment si les changements n'apparaissent pas immédiatement après avoir ajouté, modifié ou supprimé des serveurs."
|
| 383 |
+
},
|
| 384 |
+
"Workflow": {
|
| 385 |
+
"title": "Flux de Travail",
|
| 386 |
+
"createWorkflow": "Créer Flux de Travail",
|
| 387 |
+
"draft": "Brouillon",
|
| 388 |
+
"publish": "Publier",
|
| 389 |
+
"createWorkflowDescription": "Créez des flux de travail comme outils puissants pour votre chatbot.",
|
| 390 |
+
"workflowDescription": "Ceux-ci peuvent être déclenchés pendant les conversations pour automatiser des tâches complexes.",
|
| 391 |
+
"nameAndIcon": "Nom et Icône",
|
| 392 |
+
"workflowNamePlaceholder": "Le chatbot reconnaîtra ceci comme nom d'outil",
|
| 393 |
+
"description": "Description",
|
| 394 |
+
"descriptionPlaceholder": "Le chatbot verra ceci comme description d'outil",
|
| 395 |
+
"inputNodeCannotBeDeleted": "Le nœud d'entrée ne peut pas être supprimé",
|
| 396 |
+
"autoSaveDescription": "Sauvegarde automatique toutes les 10 secondes",
|
| 397 |
+
"draftDescription": "Actuellement en Brouillon.\n\nCliquez sur Publier pour le rendre disponible au chatbot\n(mais plus modifiable).",
|
| 398 |
+
"publishedDescription": "Actuellement Publié et disponible pour le chatbot.\n\nCliquez sur Brouillon pour le rendre modifiable\n(mais non disponible pour le chatbot).",
|
| 399 |
+
"private": "Privé",
|
| 400 |
+
"readonly": "Lecture Seule",
|
| 401 |
+
"public": "Public",
|
| 402 |
+
"privateDescription": "Seul vous pouvez voir, modifier et utiliser ce flux de travail comme outil.",
|
| 403 |
+
"readonlyDescription": "Les autres peuvent voir et utiliser comme outil, mais seul vous pouvez modifier.",
|
| 404 |
+
"publicDescription": "N'importe qui peut voir, modifier et utiliser ce flux de travail comme outil.",
|
| 405 |
+
"visibilityDescription": "Contrôle qui peut accéder et modifier ce flux de travail",
|
| 406 |
+
"nodeDescriptionPlaceholder": "description du nœud...",
|
| 407 |
+
"nextNode": "Nœud Suivant",
|
| 408 |
+
"nextNodeDescription": "Ajouter un nœud suivant à ce flux de travail.",
|
| 409 |
+
"addNextNode": "Ajouter Nœud Suivant",
|
| 410 |
+
"inputFields": "Champs d'Entrée",
|
| 411 |
+
"addInputField": "Ajouter Champ d'Entrée",
|
| 412 |
+
"inputFieldsDescription": "Définissez le schéma de paramètres pour ce flux de travail.\n\nQuand le chatbot utilisera ceci comme outil,\nil fournira des valeurs selon ce schéma.",
|
| 413 |
+
"fieldEditor": "Éditeur de Champ",
|
| 414 |
+
"variableName": "Nom de Variable",
|
| 415 |
+
"variableNamePlaceholder": "Entrez le nom de variable...",
|
| 416 |
+
"fieldDescriptionPlaceholder": "Entrez la description du champ...",
|
| 417 |
+
"defaultValuePlaceholder": "Entrez la valeur {type} par défaut...",
|
| 418 |
+
"selectOptionPlaceholder": "Sélectionner option...",
|
| 419 |
+
"unlink": "Délier Nœud",
|
| 420 |
+
"elseIfDescription": "Si la condition n'est pas remplie, la logique à exécuter est définie.",
|
| 421 |
+
"elseDescription": "Si la condition n'est pas remplie, la logique à exécuter est définie.",
|
| 422 |
+
"addCondition": "Ajouter Condition",
|
| 423 |
+
"noVariablesFound": "Aucune variable trouvée",
|
| 424 |
+
"outputVariables": "Variables de Sortie",
|
| 425 |
+
"outputVariablesDescription": "Les variables de sortie sont les variables qui sont générées depuis le flux de travail.",
|
| 426 |
+
"addOutputVariable": "Ajouter Variable de Sortie",
|
| 427 |
+
"outputSchema": "Schéma de Sortie",
|
| 428 |
+
"addMessage": "Ajouter Message",
|
| 429 |
+
"messagesDescription": "Générer des données par traitement LLM.\n\nUtilisez '/' pour mentionner et référencer des données de nœuds précédents comme entrée.\n\nAvec Sortie Structurée activée, parfait pour la transformation, le formatage et la validation de données.",
|
| 430 |
+
"descriptionAndSchema": "Description et Schéma",
|
| 431 |
+
"noDescriptionAndSchema": "Pas de description et schéma",
|
| 432 |
+
"toolDescription": "Fournissez les informations nécessaires pour que LLM génère les paramètres d'outil.\n\nUtilisez '/' pour mentionner des données de nœuds précédents.",
|
| 433 |
+
"generateInputWithAIDescription": "Écrivez un prompt pour générer une entrée pour le flux de travail",
|
| 434 |
+
"example": {
|
| 435 |
+
"babyResearch": "Recherche de Bébé",
|
| 436 |
+
"getWeather": "Obtenir Météo"
|
| 437 |
+
},
|
| 438 |
+
"selectVariable": "Sélectionner Variable",
|
| 439 |
+
"structuredOutput": "Sortie Structurée",
|
| 440 |
+
"structuredOutputDescription": "Générer une réponse comme objet JSON avec schéma défini",
|
| 441 |
+
"outputSchemaEditor": "Éditeur de Schéma de Sortie",
|
| 442 |
+
"addField": "Ajouter Champ",
|
| 443 |
+
"saveSchema": "Enregistrer Schéma",
|
| 444 |
+
"generateSchemaWithAI": "Générer Schéma avec IA",
|
| 445 |
+
"describeOutputDataRequest": "Fournissez des données JSON d'exemple qui représentent ce que ce nœud devrait produire\n\nExemple: {eg}",
|
| 446 |
+
"generatingJsonSchemaWithAI": "Génération du schéma JSON avec IA...",
|
| 447 |
+
"jsonSchemaGeneratedSuccessfully": "Schéma JSON généré avec succès !",
|
| 448 |
+
"failedToGenerateSchema": "Échec de génération du schéma",
|
| 449 |
+
"jsonSchemaEditorDescription": "Édition directe de schéma JSON avec assistance IA. Supporte les structures imbriquées complexes et les tableaux.",
|
| 450 |
+
"template": "Modèle",
|
| 451 |
+
"templateDescription": "Générer des documents de modèle.\n\nUtilisez '/' pour référencer et utiliser les valeurs de sortie d'autres nœuds.",
|
| 452 |
+
"kindsDescription": {
|
| 453 |
+
"input": "Définit les paramètres d'entrée que le chatbot fournira en utilisant ce flux de travail comme outil.\n\nSpécifie la structure des données et les règles de validation pour l'exécution de l'outil.",
|
| 454 |
+
"output": "Collecte et retourne les résultats finaux de l'exécution de votre flux de travail.\n\nCombine les données de plusieurs nœuds dans la réponse finale de l'outil.",
|
| 455 |
+
"llm": "Génère du texte ou des données structurées en utilisant des modèles IA.\n\nRéférence les sorties de nœuds précédents avec des mentions '/' pour créer des réponses conscientes du contexte.\n\nUtilisez Sortie Structurée pour transformer, formater et valider les données - pas seulement pour la génération de texte.",
|
| 456 |
+
"tool": "Exécute des outils MCP ou des services externes.\n\nÉcrivez des instructions dans les messages, et LLM générera les paramètres d'outil requis à partir de votre contexte.",
|
| 457 |
+
"note": "Ajoute de la documentation et des commentaires pour organiser la logique de votre flux de travail.\n\nAide les membres de l'équipe à comprendre les processus complexes de flux de travail.",
|
| 458 |
+
"code": "Exécute des scripts de code personnalisé avec accès aux données de nœuds précédents.\n\nExécute JavaScript, Python ou d'autres langages dans votre flux de travail (bientôt disponible).",
|
| 459 |
+
"http": "Récupère des données d'APIs externes et de services web via des requêtes HTTP.\n\nIntègre avec des APIs REST, webhooks et services tiers.",
|
| 460 |
+
"template": "Crée des documents dynamiques en combinant du texte avec des données de nœuds précédents.\n\nGénère des emails, rapports ou contenu formaté en utilisant la substitution de variables.",
|
| 461 |
+
"condition": "Ajoute une logique conditionnelle pour brancher votre flux de travail basé sur l'évaluation des données.\n\nCrée une logique if-else pour gérer différents scénarios et conditions de données."
|
| 462 |
+
},
|
| 463 |
+
"greeting": {
|
| 464 |
+
"buildAutomationTitle": "Construire l'Automatisation en Connectant les Nœuds",
|
| 465 |
+
"buildAutomationDescription": "Connectez divers nœuds pour automatiser des tâches complexes. Chaque nœud gère des fonctions spécifiques, et les données circulent séquentiellement pour le traitement.",
|
| 466 |
+
"chatbotToolTitle": "Utiliser comme Outils de Chatbot",
|
| 467 |
+
"chatbotToolDescription": "Le but principal des flux de travail est de les utiliser comme outils dans les conversations de chatbot. Transformez les tâches répétitives en flux de travail pour une exécution facile pendant les chats.",
|
| 468 |
+
"parameterBasedTitle": "️ Démarrage Basé sur les Paramètres",
|
| 469 |
+
"parameterBasedDescription": "Les nœuds d'entrée définissent des structures de paramètres, pas des déclencheurs. Ils spécifient le format de données nécessaire quand le chatbot appelle ce flux de travail comme outil.",
|
| 470 |
+
"exampleTitle": "Exemple d'Utilisation",
|
| 471 |
+
"exampleDescription": "Créez un flux de travail \"Écrire Email → Traduire → Envoyer\", puis exécutez-le facilement dans les conversations de chatbot avec \"@email_workflow\".",
|
| 472 |
+
"availableNodesTitle": "Nœuds Disponibles",
|
| 473 |
+
"upcomingNodesTitle": "Nœuds à Venir",
|
| 474 |
+
"ctaMessage": "Commencez à créer des flux de travail maintenant pour étendre les capacités de votre chatbot !",
|
| 475 |
+
"soonMessage": "Bientôt disponible."
|
| 476 |
+
},
|
| 477 |
+
"arrangeNodes": "Auto Layout",
|
| 478 |
+
"nodesArranged": "Layout appliqué avec succès",
|
| 479 |
+
"visibilityUpdated": "Visibilité mise à jour avec succès"
|
| 480 |
+
},
|
| 481 |
+
"User": {
|
| 482 |
+
"Profile": {
|
| 483 |
+
"common": {
|
| 484 |
+
"uploadPhoto": "Télécharger une Photo",
|
| 485 |
+
"chooseDefault": "Choisir par Défaut",
|
| 486 |
+
"useEmoji": "Utiliser un Emoji",
|
| 487 |
+
"generateWithAI": "Générer avec l'IA",
|
| 488 |
+
"changeProfilePhoto": "Changer la Photo de Profil",
|
| 489 |
+
"selectDefaultAvatar": "Choisir un Avatar par Défaut",
|
| 490 |
+
"selectDefaultAvatarDescription": "Sélectionnez l'un des avatars par défaut ci-dessous",
|
| 491 |
+
"chooseEmojiAvatar": "Choisir un Avatar Emoji",
|
| 492 |
+
"chooseEmojiAvatarDescription": "Sélectionnez un emoji à utiliser comme photo de profil",
|
| 493 |
+
"generateAvatarWithAI": "Générer un Avatar avec l'IA",
|
| 494 |
+
"generateAvatarWithAIDescription": "Décrivez votre photo de profil idéale et laissez l'IA la créer",
|
| 495 |
+
"aiProvider": "Fournisseur d'IA",
|
| 496 |
+
"describeYourAvatar": "Décrivez votre avatar",
|
| 497 |
+
"avatarPromptPlaceholder": "ex., Un chiot mignon dans le style Studio Ghibli",
|
| 498 |
+
"generating": "Génération en cours...",
|
| 499 |
+
"regenerate": "Régénérer",
|
| 500 |
+
"useThisAvatar": "Utiliser Cet Avatar",
|
| 501 |
+
"profilePhotoUpdatedSuccessfully": "Photo de profil mise à jour avec succès",
|
| 502 |
+
"failedToUpdateProfilePhoto": "Échec de la mise à jour de la photo de profil",
|
| 503 |
+
"pleaseEnterPrompt": "Veuillez entrer une description",
|
| 504 |
+
"imageGeneratedSuccessfully": "Image générée avec succès !",
|
| 505 |
+
"failedToGenerateImage": "Échec de la génération de l'image",
|
| 506 |
+
"failedToSaveImage": "Échec de l'enregistrement de l'image",
|
| 507 |
+
"pleaseUploadValidImage": "Veuillez télécharger une image valide (JPEG, PNG ou WebP)",
|
| 508 |
+
"imageSizeMustBeLessThan": "La taille de l'image doit être inférieure à 5 Mo",
|
| 509 |
+
"select": "Sélectionner"
|
| 510 |
+
}
|
| 511 |
+
}
|
| 512 |
+
}
|
| 513 |
+
}
|
messages/ja.json
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "キャンセル",
|
| 4 |
+
"update": "更新",
|
| 5 |
+
"continue": "続行",
|
| 6 |
+
"success": "成功",
|
| 7 |
+
"delete": "削除",
|
| 8 |
+
"save": "保存",
|
| 9 |
+
"back": "戻る",
|
| 10 |
+
"next": "次へ",
|
| 11 |
+
"create": "作成",
|
| 12 |
+
"showLess": "少なく表示",
|
| 13 |
+
"showMore": "もっと表示",
|
| 14 |
+
"generate": "生成",
|
| 15 |
+
"edit": "編集",
|
| 16 |
+
"editAgent": "エージェントを編集",
|
| 17 |
+
"search": "検索...",
|
| 18 |
+
"approve": "承認",
|
| 19 |
+
"reject": "拒否",
|
| 20 |
+
"saving": "保存中...",
|
| 21 |
+
"optional": "オプション",
|
| 22 |
+
"deleting": "削除中...",
|
| 23 |
+
"run": "実行",
|
| 24 |
+
"description": "説明",
|
| 25 |
+
"defaultValue": "デフォルト値",
|
| 26 |
+
"empty": "空",
|
| 27 |
+
"required": "必須",
|
| 28 |
+
"options": "オプション",
|
| 29 |
+
"status": "ステータス",
|
| 30 |
+
"result": "結果",
|
| 31 |
+
"startedAt": "開始時刻",
|
| 32 |
+
"duration": "所要時間",
|
| 33 |
+
"addOption": "オプションを追加",
|
| 34 |
+
"tool": "ツール",
|
| 35 |
+
"selectTool": "ツールを選択...",
|
| 36 |
+
"noResults": "結果がありません。",
|
| 37 |
+
"generateInputWithAI": "AIで入力を生成",
|
| 38 |
+
"generatingInputWithAI": "AIで入力を生成中...",
|
| 39 |
+
"inputGeneratedSuccessfully": "入力が正常に生成されました",
|
| 40 |
+
"failedToGenerateInput": "入力の生成に失敗しました",
|
| 41 |
+
"createWithExample": "例で作成",
|
| 42 |
+
"resultsFound": "{count}件の結果が見つかりました",
|
| 43 |
+
"youAreAnExpertIn": "あなたは{role}の専門家です",
|
| 44 |
+
"sharedBy": "{userName}さんが共有"
|
| 45 |
+
},
|
| 46 |
+
"Auth": {
|
| 47 |
+
"SignIn": {
|
| 48 |
+
"title": "おかえりなさい",
|
| 49 |
+
"description": "アカウントにサインインして続行",
|
| 50 |
+
"oauthClientIdNotSet": "{provider}のクライアントIDが設定されていません",
|
| 51 |
+
"noAccount": "アカウントをお持ちでない方は",
|
| 52 |
+
"signUp": "サインアップ",
|
| 53 |
+
"signIn": "サインイン",
|
| 54 |
+
"orContinueWith": "または次で続行"
|
| 55 |
+
},
|
| 56 |
+
"SignUp": {
|
| 57 |
+
"title": "アカウントを作成",
|
| 58 |
+
"signIn": "サインイン",
|
| 59 |
+
"description": "アカウントにサインアップ",
|
| 60 |
+
"step1": "メールアドレスを入力して、私たちとの旅を始めましょう",
|
| 61 |
+
"step2": "チャット時にこの名前を使用します",
|
| 62 |
+
"step3": "アカウントを保護するための強力なパスワードを作成してください",
|
| 63 |
+
"signUp": "サインアップ",
|
| 64 |
+
"invalidEmail": "無効なメールアドレス",
|
| 65 |
+
"emailAlreadyExists": "メールアドレスが既に存在します",
|
| 66 |
+
"nameRequired": "名前が必要です",
|
| 67 |
+
"passwordRequired": "パスワードが必要です",
|
| 68 |
+
"createAccount": "アカウントを作成"
|
| 69 |
+
},
|
| 70 |
+
"Intro": {
|
| 71 |
+
"description": "better-chatbot へようこそ。AIを活用した会話ツールを体験するためにサインインしてください。"
|
| 72 |
+
}
|
| 73 |
+
},
|
| 74 |
+
"Chat": {
|
| 75 |
+
"Error": "チャットエラー",
|
| 76 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "このメッセージは保存されませんでした。もう一度チャットをお試しください。",
|
| 77 |
+
"uploadImage": "ファイルをアップロード",
|
| 78 |
+
"generateImage": "画像を生成",
|
| 79 |
+
"imageUploadedSuccessfully": "画像が正常にアップロードされました",
|
| 80 |
+
"pleaseUploadImageFile": "画像ファイルをアップロードしてください",
|
| 81 |
+
"imageSizeMustBeLessThan10MB": "画像サイズは10MB未満である必要があります",
|
| 82 |
+
"failedToUploadImage": "画像のアップロードに失敗しました",
|
| 83 |
+
"imageUploadFailedUsingBase64": "画像のアップロードに失敗しました。Base64エンコーディングを使用して送信します。",
|
| 84 |
+
"Greeting": {
|
| 85 |
+
"goodMorning": "おはようございます、{name}さん",
|
| 86 |
+
"goodAfternoon": "こんにちは、{name}さん",
|
| 87 |
+
"goodEvening": "こんばんは、{name}さん",
|
| 88 |
+
"niceToSeeYouAgain": "またお会いできて嬉しいです、{name}さん",
|
| 89 |
+
"whatAreYouWorkingOnToday": "今日は何に取り組んでいますか、{name}さん?",
|
| 90 |
+
"letMeKnowWhenYoureReadyToBegin": "準備ができたら教えてください。",
|
| 91 |
+
"whatAreYourThoughtsToday": "今日はどんなことを考えていますか?",
|
| 92 |
+
"whereWouldYouLikeToStart": "どこから始めたいですか?",
|
| 93 |
+
"whatAreYouThinking": "何を考えていますか、{name}さん?"
|
| 94 |
+
},
|
| 95 |
+
"TemporaryChat": {
|
| 96 |
+
"toggleTemporaryChat": "一時チャットの切り替え",
|
| 97 |
+
"temporaryChat": "一時チャット",
|
| 98 |
+
"resetChat": "チャットをリセット",
|
| 99 |
+
"thisChatWontBeSaved": "このチャットは保存されません。",
|
| 100 |
+
"feelFreeToAskAnythingTemporarily": "何でもお気軽に一時的にお尋ねください",
|
| 101 |
+
"temporaryChatInstructions": "一時チャットの指示",
|
| 102 |
+
"temporaryChatInstructionsPlaceholder": "こちらに指示を入力してください",
|
| 103 |
+
"temporaryChatInstructionsDescription": "一時チャットの��示を設定できます。これは一時チャットのシステムプロンプトとして使用されます。"
|
| 104 |
+
},
|
| 105 |
+
"placeholder": "何でも聞くか @mention してください",
|
| 106 |
+
"Tool": {
|
| 107 |
+
"webSearching": "ウェブを検索中...",
|
| 108 |
+
"searchedTheWeb": "ウェブを検索しました",
|
| 109 |
+
"toolModeDescription": "ツールの使用方法を選択:\n• 自動: AIがツールの使用を自動で決定\n• 手動: ツール使用前に許可を求める\n• なし: すべてのツールを無効化",
|
| 110 |
+
"toolsSetupDescription": "チャットボットが使用できるツールを選択してください。\nチャットボットは選択されたツールを自分の判断で使用します。\n\n@mention を使って特定のツールの使用を強制することもできます。",
|
| 111 |
+
"selectToolMode": "ツールモードを選択",
|
| 112 |
+
"autoToolModeDescription": "あなたに尋ねることなく、ツールをいつ使用するかを決定します",
|
| 113 |
+
"manualToolModeDescription": "ツールを使用する前にあなたの許可を求めます",
|
| 114 |
+
"noneToolModeDescription": "ツールを使用しません。@mentionは引き続き利用可能です。",
|
| 115 |
+
"toolsSetup": "ツール設定",
|
| 116 |
+
"preset": "プリセット",
|
| 117 |
+
"toolPresets": "ツールプリセット",
|
| 118 |
+
"saveAsPreset": "プリセットとして保存",
|
| 119 |
+
"saveAsPresetDescription": "現在のツール設定をプリセットとして保存します。",
|
| 120 |
+
"noPresetsAvailableYet": "まだ利用可能なプリセットがありません",
|
| 121 |
+
"presetNameCannotBeEmpty": "プリセット名を空にすることはできません",
|
| 122 |
+
"presetNameAlreadyExists": "プリセット名が既に存在します",
|
| 123 |
+
"presetSaved": "プリセットが保存されました",
|
| 124 |
+
"clickSaveAsPresetToGetStarted": "開始するには「プリセットとして保存」をクリックしてください。",
|
| 125 |
+
"searchOptions": "検索オプション",
|
| 126 |
+
"searchOptionsDescription": "検索結果の最大数、検索日時など、チャットボットに検索オプションを渡すことができます。",
|
| 127 |
+
"defaultToolKit": {
|
| 128 |
+
"visualization": "データ可視化",
|
| 129 |
+
"webSearch": "ウェブを検索"
|
| 130 |
+
},
|
| 131 |
+
"agent": "エージェント",
|
| 132 |
+
"mention": "メンション",
|
| 133 |
+
"tools": "ツール",
|
| 134 |
+
"tooManyToolsSelected": "選択されているツールが多すぎます。128個未満を選択してください",
|
| 135 |
+
"presetNamePlaceholder": "プリセット名",
|
| 136 |
+
"noMcpServersDetected": "MCPサーバーが検出されませんでした。",
|
| 137 |
+
"addServer": "サーバーを追加",
|
| 138 |
+
"error": "エラー",
|
| 139 |
+
"authorizationRequired": "認証が必要です",
|
| 140 |
+
"clickToAuthorize": "このMCPサーバーを認証してツールにアクセスするには、ここをクリックしてください。",
|
| 141 |
+
"auto": "自動",
|
| 142 |
+
"manual": "手動",
|
| 143 |
+
"none": "なし",
|
| 144 |
+
"mentionOnly": "@メンションのみ",
|
| 145 |
+
"noToolsAvailable": "利用可能なツールがありません"
|
| 146 |
+
},
|
| 147 |
+
"VoiceChat": {
|
| 148 |
+
"title": "音声チャットモード",
|
| 149 |
+
"compactDisplayMode": "コンパクト表示モード",
|
| 150 |
+
"conversationDisplayMode": "会話表示モード",
|
| 151 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "音声チャットを閉じて、もう一度お試しください。",
|
| 152 |
+
"startConversation": "会話を開始",
|
| 153 |
+
"closeMic": "マイクを閉じる",
|
| 154 |
+
"openMic": "マイクを開く",
|
| 155 |
+
"endConversation": "会話を終了",
|
| 156 |
+
"toggleVoiceChat": "音声チャットの切り替え",
|
| 157 |
+
"readyWhenYouAreJustStartTalking": "準備ができました。話しかけてください。",
|
| 158 |
+
"yourMicIsOff": "マイクがオフになっています。",
|
| 159 |
+
"preparing": "準備中...",
|
| 160 |
+
"startVoiceChat": "音声チャットを開始しますか?"
|
| 161 |
+
},
|
| 162 |
+
"Thread": {
|
| 163 |
+
"chat": "チャット",
|
| 164 |
+
|
| 165 |
+
"renameChat": "名前を変更",
|
| 166 |
+
"deleteChat": "チャットを削除",
|
| 167 |
+
"deleteUnarchivedChats": "アーカイブされていないチャットをすべて削除",
|
| 168 |
+
"confirmDeleteUnarchivedChats": "アーカイブされていないすべてのチャットを削除してもよろしいですか?",
|
| 169 |
+
"thisActionCannotBeUndone": "この操作は元に戻すことができません。",
|
| 170 |
+
"unarchivedChatsDeleted": "アーカイブされていないチャットが削除されました",
|
| 171 |
+
"failedToDeleteUnarchivedChats": "アーカイブされていないチャットの削除に失敗しました",
|
| 172 |
+
"failedToDeleteThread": "スレッドの削除に失敗しました",
|
| 173 |
+
"threadDeleted": "スレッドが削除されました",
|
| 174 |
+
"failedToUpdateThread": "スレッドの更新に失敗しました",
|
| 175 |
+
"titleRequired": "タイトルが必要です",
|
| 176 |
+
"threadUpdated": "スレッドが更新されました",
|
| 177 |
+
"areYouSureYouWantToDeleteThisChatThread": "このチャット��レッドを削除してもよろしいですか?",
|
| 178 |
+
"sharePublicLink": "公開リンクを共有",
|
| 179 |
+
"sharePublicLinkDescription": "共有後に追加されるすべてのメッセージは非公開に保たれます。",
|
| 180 |
+
"creatingLink": "リンクを作成中...",
|
| 181 |
+
"createLink": "リンクを作成",
|
| 182 |
+
"linkCopied": "リンクがコピーされました"
|
| 183 |
+
},
|
| 184 |
+
|
| 185 |
+
"ChatPreferences": {
|
| 186 |
+
"title": "チャット設定",
|
| 187 |
+
"whatShouldWeCallYou": "何とお呼びすればよろしいですか?",
|
| 188 |
+
"botName": "アシスタント名",
|
| 189 |
+
"whatBestDescribesYourWork": "あなたの仕事を最もよく表すものは何ですか?",
|
| 190 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "回答時に考慮すべき個人的な好みは何ですか?",
|
| 191 |
+
"responseStyleExample1": "例:説明は簡潔で要点を押さえたものにしてください",
|
| 192 |
+
"responseStyleExample2": "例:新しい概念を学ぶとき、類推が特に役立ちます",
|
| 193 |
+
"responseStyleExample3": "例:詳細な回答をする前に明確化の質問をしてください",
|
| 194 |
+
"responseStyleExample4": "例:私は主にPythonでプログラミングしています(プログラミング初心者ではありません)",
|
| 195 |
+
"professionExample1": "例:ソフトウェアエンジニア",
|
| 196 |
+
"professionExample2": "例:プロダクトマネージャー",
|
| 197 |
+
"professionExample3": "例:マーケティングマネージャー",
|
| 198 |
+
"professionExample4": "例:セールスマネージャー",
|
| 199 |
+
"professionExample5": "例:ビジネスアナリスト",
|
| 200 |
+
"preferencesSaved": "設定が保存されました",
|
| 201 |
+
"failedToSavePreferences": "設定の保存に失敗しました",
|
| 202 |
+
"userInstructions": "ユーザー指示",
|
| 203 |
+
"userInstructionsDescription": "自己紹介をして、よりパーソナライズされた回答を受け取りましょう。",
|
| 204 |
+
"mcpInstructions": "MCP 指示",
|
| 205 |
+
"mcpInstructionsDescription": "MCP サーバーの指示をカスタマイズします。",
|
| 206 |
+
"userSettings": "ユーザー設定"
|
| 207 |
+
}
|
| 208 |
+
},
|
| 209 |
+
"Layout": {
|
| 210 |
+
"toggleSidebar": "サイドバーの切り替え",
|
| 211 |
+
"newChat": "新しいチャット",
|
| 212 |
+
"mcpConfiguration": "MCP設定",
|
| 213 |
+
"agents": "エージェント",
|
| 214 |
+
"newAgent": "新しいエージェント",
|
| 215 |
+
"createAgent": "エージェントを作成",
|
| 216 |
+
"createYourOwnAgent": "独自の機能と個性を持つ専門AIエージェントを作成してみましょう",
|
| 217 |
+
"whatIsAgent": "エージェントとは何ですか?",
|
| 218 |
+
"agentDescription": "エージェントは、特定の役割、指示、ツールでカスタマイズできる専門的なAIアシスタントで、様々なタスクをサポートします。",
|
| 219 |
+
"specializedAIAssistant": "専門AIアシスタント",
|
| 220 |
+
"specializedAIAssistantDescription": "各エージェントは特定の役割、個性、専門分野でカスタマイズでき、あなた固有のニーズに焦点を当てたサポートを提供します。",
|
| 221 |
+
"customInstructions": "カスタム指示",
|
| 222 |
+
"customInstructionsDescription": "詳細なシステムプロンプトと行動ガイドラインを定義して、エージェントの応答と相互作用の方法を形作ることができます。",
|
| 223 |
+
"toolIntegration": "ツール統合",
|
| 224 |
+
"toolIntegrationDescription": "エージェントをMCPサーバー、ワークフロー、その他のツールに接続して、会話を超えた機能を拡張できます。",
|
| 225 |
+
"agentExamples": "エージェントの例",
|
| 226 |
+
"businessAssistant": "ビジネスアシスタント",
|
| 227 |
+
"businessAssistantDescription": "ビジネス分析、レポート生成、プロフェッショナルなコミュニケーションに特化しています。",
|
| 228 |
+
"creativeWriter": "クリエイティブライター",
|
| 229 |
+
"creativeWriterDescription": "ストーリーテリング、コンテンツ制作、創造的なブレインストーミングに焦点を当てています。",
|
| 230 |
+
"technicalExpert": "技術専門家",
|
| 231 |
+
"technicalExpertDescription": "開発ツールとコーディングの専門知識を備えた技術的なタスクのためのエージェントです。",
|
| 232 |
+
"createFirstAgentToStart": "最初のエージェントを作成して始めましょう!",
|
| 233 |
+
"today": "今日",
|
| 234 |
+
"yesterday": "昨日",
|
| 235 |
+
"lastWeek": "過去7日間",
|
| 236 |
+
"older": "それ以前",
|
| 237 |
+
"recentChats": "最近のチャット",
|
| 238 |
+
"deleteAllChats": "すべてのチャットを削除",
|
| 239 |
+
"deleteUnarchivedChats": "アーカイブされていないチャットを削除",
|
| 240 |
+
"noConversationsYet": "まだ会話がありません",
|
| 241 |
+
"deletingAllChats": "すべてのスレッドを削除中...",
|
| 242 |
+
"deletingUnarchivedChats": "アーカイブされていないスレッドを削除中...",
|
| 243 |
+
"allChatsDeleted": "すべてのスレッドが削除されました",
|
| 244 |
+
"unarchivedChatsDeleted": "アーカイブされていないスレッド���削除されました",
|
| 245 |
+
"failedToDeleteAllChats": "すべてのスレッドの削除に失敗しました",
|
| 246 |
+
"failedToDeleteUnarchivedChats": "アーカイブされていないスレッドの削除に失敗しました",
|
| 247 |
+
"chatPreferences": "チャット設定",
|
| 248 |
+
"keyboardShortcuts": "キーボードショートカット",
|
| 249 |
+
"theme": "テーマ",
|
| 250 |
+
"signOut": "サインアウト",
|
| 251 |
+
"language": "言語",
|
| 252 |
+
"showAllChats": "すべてのチャットを表示",
|
| 253 |
+
"showLessChats": "少なく表示",
|
| 254 |
+
"reportAnIssue": "問題を報告",
|
| 255 |
+
"joinCommunity": "コミュニティに参加",
|
| 256 |
+
"workflow": "ワークフロー",
|
| 257 |
+
"userSettings": "ユーザー設定"
|
| 258 |
+
},
|
| 259 |
+
"Archive": {
|
| 260 |
+
"title": "アーカイブ",
|
| 261 |
+
"addArchive": "アーカイブを追加",
|
| 262 |
+
"archiveName": "アーカイブ名",
|
| 263 |
+
"archiveDescription": "アーカイブの説明",
|
| 264 |
+
"archiveDescriptionPlaceholder": "アーカイブはチャット履歴を保存するスペースです。",
|
| 265 |
+
"noArchives": "アーカイブがありません",
|
| 266 |
+
"createFirstArchive": "最初のアーカイブを作成してください",
|
| 267 |
+
"archiveCreated": "アーカイブが作成されました",
|
| 268 |
+
"archiveUpdated": "アーカイブが更新されました",
|
| 269 |
+
"archiveDeleted": "アーカイブが削除されました",
|
| 270 |
+
"failedToCreateArchive": "アーカイブの作成に失敗しました",
|
| 271 |
+
"failedToUpdateArchive": "アーカイブの更新に失敗しました",
|
| 272 |
+
"failedToDeleteArchive": "アーカイブの削除に失敗しました",
|
| 273 |
+
"editArchive": "アーカイブ編集",
|
| 274 |
+
"editArchiveDescription": "アーカイブ情報を編集します",
|
| 275 |
+
"deleteArchive": "アーカイブ削除",
|
| 276 |
+
"confirmDeleteArchive": "本当にこのアーカイブを削除しますか?",
|
| 277 |
+
"deleteArchiveDescription": "このアーカイブとすべてのアイテムが完全に削除されます。この操作は元に戻せません。",
|
| 278 |
+
"addToArchive": "アーカイブに追加",
|
| 279 |
+
"removeFromArchive": "アーカイブから削除",
|
| 280 |
+
"itemAddedToArchive": "アイテムがアーカイブに追加されました",
|
| 281 |
+
"itemRemovedFromArchive": "アイテムがアーカイブから削除されました"
|
| 282 |
+
},
|
| 283 |
+
"Agent": {
|
| 284 |
+
"title": "エージェント",
|
| 285 |
+
"generatingAgent": "エージェント生成中...",
|
| 286 |
+
"agentNameAndIconLabel": "エージェントに名前とアイコンを付けてください。",
|
| 287 |
+
"agentDescriptionLabel": "このエージェントの用途についての簡単な説明を追加してください。",
|
| 288 |
+
"agentDescriptionPlaceholder": "これはエージェントに関する説明であり、重要ではありません。",
|
| 289 |
+
"agentSettingsDescription": "ここからは、エージェントに影響を与える可能性のある設定です。",
|
| 290 |
+
"thisAgentIs": "このエージェントは",
|
| 291 |
+
"expertIn": "の専門家です。",
|
| 292 |
+
"agentRolePlaceholder": "株式分析",
|
| 293 |
+
"agentInstructionsLabel": "このエージェントの役割、性格、指針、知識などを自由に書いてください。",
|
| 294 |
+
"agentInstructionsPlaceholder": "このエージェントは株式分析をサポートします。ウェブ検索ツールを活用して株式情報を取得します...",
|
| 295 |
+
"agentToolsLabel": "このエージェントが使用できるツールを追加してください。",
|
| 296 |
+
"loadingTools": "ツールを読み込み中です...",
|
| 297 |
+
"addTools": "ツールを追加してください。",
|
| 298 |
+
"generateAgentGreeting": "こんにちは!あなた専用のエージェントを作成するお手伝いをします。何を作りたいですか?",
|
| 299 |
+
"generateAgentDetailedGreeting": "こんにちは!あなた専用のエージェントを作成するお手伝いをします。何を作りたいですか?簡潔に書いても詳しく書いても構いません。",
|
| 300 |
+
"inputPromptHere": "ここにプロンプトを入力してください...",
|
| 301 |
+
"agentNamePlaceholder": "better-agent",
|
| 302 |
+
"myAgents": "マイエージェント",
|
| 303 |
+
"sharedAgents": "共有エージェント",
|
| 304 |
+
"noAgents": "エージェントがありません",
|
| 305 |
+
"createFirst": "最初のエージェントを作成して開始",
|
| 306 |
+
"noSharedAgents": "共有エージェントがありません",
|
| 307 |
+
"noSharedAgentsDescription": "ブックマーク可能な公開エージェントがありません",
|
| 308 |
+
"noDescription": "説明が提供されていません",
|
| 309 |
+
"bookmarkAdded": "エージェントをブックマークしました",
|
| 310 |
+
"bookmarkRemoved": "ブックマークを削除しました",
|
| 311 |
+
"bookmarkedAgent": "ブックマークしたエージェント",
|
| 312 |
+
"addBookmark": "エージェントをブックマーク",
|
| 313 |
+
"removeBookmark": "ブックマークを削除",
|
| 314 |
+
"visibilityUpdated": "公開設定を更新しました",
|
| 315 |
+
"deleted": "エージェントを削除しました",
|
| 316 |
+
"deleteConfirm": "このエージェントを削除してもよろしいですか?",
|
| 317 |
+
"makePrivate": "非公��にする",
|
| 318 |
+
"makeReadonly": "読み取り専用にする",
|
| 319 |
+
"makePublic": "公開する",
|
| 320 |
+
"visibility": "公開設定",
|
| 321 |
+
"private": "非公開",
|
| 322 |
+
"readOnly": "読み取り専用",
|
| 323 |
+
"public": "公開",
|
| 324 |
+
"privateDescription": "あなただけがこのエージェントを表示、編集、使用できます。",
|
| 325 |
+
"readOnlyDescription": "他の人もツールとして表示・使用できますが、編集はあなただけができます。",
|
| 326 |
+
"publicDescription": "誰でもこのエージェントをツールとして表示、編集、使用できます。"
|
| 327 |
+
},
|
| 328 |
+
"KeyboardShortcuts": {
|
| 329 |
+
"title": "キーボードショートカット",
|
| 330 |
+
"newChat": "新しいチャット",
|
| 331 |
+
"toggleTemporaryChat": "一時チャットの切り替え",
|
| 332 |
+
"toggleSidebar": "サイドバーの切り替え",
|
| 333 |
+
"toolMode": "ツールモード",
|
| 334 |
+
"lastMessageCopy": "最後のメッセージをコピー",
|
| 335 |
+
"openChatPreferences": "チャット設定を開く",
|
| 336 |
+
"deleteThread": "チャットを削除",
|
| 337 |
+
"openShortcutsPopup": "ショートカットポップアップを開く",
|
| 338 |
+
"toggleVoiceChat": "音声チャットの切り替え"
|
| 339 |
+
},
|
| 340 |
+
"MCP": {
|
| 341 |
+
"marketplace": "マーケットプレイス",
|
| 342 |
+
"addMcpServer": "サーバーを追加",
|
| 343 |
+
"configureYourMcpServerConnectionSettings": "MCPサーバー接続設定を構成してください",
|
| 344 |
+
"mcpConfiguration": "MCP設定",
|
| 345 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "名前は英数字(A-Z、a-z、0-9)とハイフン(-)のみを含む必要があります",
|
| 346 |
+
"nameIsRequired": "名前が必要です",
|
| 347 |
+
"configurationSavedSuccessfully": "設定が正常に保存されました",
|
| 348 |
+
"enterMcpServerName": "MCPサーバー名を入力してください",
|
| 349 |
+
"saveConfiguration": "設定を保存",
|
| 350 |
+
"toolsTest": "ツールテスト",
|
| 351 |
+
"refresh": "リフレッシュ",
|
| 352 |
+
"delete": "削除",
|
| 353 |
+
"edit": "編集",
|
| 354 |
+
"configuration": "設定",
|
| 355 |
+
"availableTools": "利用可能なツール",
|
| 356 |
+
"noToolsAvailable": "利用可能なツールがありません",
|
| 357 |
+
"overviewTitle": "最初のサーバーに接続",
|
| 358 |
+
"overviewDescription": "強力なAI統合を解放するためにMCPサーバーを追加してください",
|
| 359 |
+
"searchTools": "ツールを検索",
|
| 360 |
+
"detail": "詳細",
|
| 361 |
+
"noSchemaPropertiesAvailable": "利用可能なスキーマプロパティがありません",
|
| 362 |
+
"createInputWithAI": "AIで入力を作成",
|
| 363 |
+
"generateExampleInputJSON": "例の入力JSONを生成",
|
| 364 |
+
"enterPromptToGenerateExampleInputJSON": "選択したツールの例の入力JSONを生成するためのプロンプトを入力してください。",
|
| 365 |
+
"callTool": "ツールを呼び出す",
|
| 366 |
+
"customInstructions": "カスタム指示",
|
| 367 |
+
"serverCustomInstructionsPlaceholder": "このサーバーのツールが利用可能な場合、これらの行がシステムプロンプトに追加されます。",
|
| 368 |
+
"nameAlreadyExists": "名前が既に存在します",
|
| 369 |
+
"additionalInstructions": "ツールカスタマイゼーション指示",
|
| 370 |
+
"inputSchema": "入力スキーマ",
|
| 371 |
+
"toolCustomizationInstructions": "ツールカスタマイゼーション指示は、ツールが利用可能な場合にシステムプロンプトに追加されます。\n例)メールは常にexample@example.comの形式で入力してください。",
|
| 372 |
+
"mcpServerCustomization": "MCPサーバーカスタマイゼーション",
|
| 373 |
+
"mcpServerCustomizationDescription": "MCPサーバーカスタマイゼーション指示は、MCPサーバーが利用可能な場合にシステムプロンプトに追加されます。",
|
| 374 |
+
"toolCustomizationInstructionsPlaceholder": "ツールカスタマイゼーション指示は利用できません。",
|
| 375 |
+
"mcpServerCustomizationPlaceholder": "例:入力値がメールの場合、常にexample@example.comの形式でメールを入力してください。",
|
| 376 |
+
"noInstructions": "なし"
|
| 377 |
+
},
|
| 378 |
+
"Error": {},
|
| 379 |
+
"Info": {
|
| 380 |
+
"mcpAddingDisabled": "管理者によりMCPサーバーの追加が無効化されています。",
|
| 381 |
+
"vercelSyncDelay": "Vercel上で動作中\n\nMCP変更の同期には10-15秒かかる場合があります。サーバーの追加、編集、または削除後に変更が即座に表示されない場合は、しばらくお待ちください。"
|
| 382 |
+
},
|
| 383 |
+
"Workflow": {
|
| 384 |
+
"title": "ワークフロー",
|
| 385 |
+
"createWorkflow": "ワークフローを作成",
|
| 386 |
+
"draft": "下書き",
|
| 387 |
+
"publish": "公開",
|
| 388 |
+
"createWorkflowDescription": "チャットボットの強力なツールとしてワークフローを作成します。",
|
| 389 |
+
"workflowDescription": "これらは会話中にトリガーして複雑なタスクを自動化できます。",
|
| 390 |
+
"nameAndIcon": "名前とアイコン",
|
| 391 |
+
"workflowNamePlaceholder": "チャットボットはこれをツール名として認識します",
|
| 392 |
+
"description": "説明",
|
| 393 |
+
"descriptionPlaceholder": "チャットボットはこれを���ールの説明として見ます",
|
| 394 |
+
"inputNodeCannotBeDeleted": "入力ノードは削除できません",
|
| 395 |
+
"autoSaveDescription": "10秒ごとに自動保存されます",
|
| 396 |
+
"draftDescription": "現在は下書き状態です。\n\n公開をクリックしてチャットボットで利用可能にします\n(ただし編集できなくなります)。",
|
| 397 |
+
"publishedDescription": "現在公開されており、チャットボットで利用可能です。\n\n下書きをクリックして編集可能にします\n(ただしチャットボットで利用できなくなります)。",
|
| 398 |
+
"private": "プライベート",
|
| 399 |
+
"readonly": "読み取り専用",
|
| 400 |
+
"public": "公開",
|
| 401 |
+
"privateDescription": "このワークフローを表示、編集、ツールとして使用できるのはあなただけです。",
|
| 402 |
+
"readonlyDescription": "他の人は表示してツールとして使用できますが、編集できるのはあなただけです。",
|
| 403 |
+
"publicDescription": "誰でもこのワークフローを表示、編集、ツールとして使用できます。",
|
| 404 |
+
"visibilityDescription": "このワークフローにアクセスして変更できる人を制御します",
|
| 405 |
+
"nodeDescriptionPlaceholder": "ノードの説明...",
|
| 406 |
+
"nextNode": "次のノード",
|
| 407 |
+
"nextNodeDescription": "このワークフローに次のノードを追加します。",
|
| 408 |
+
"addNextNode": "次のノードを追加",
|
| 409 |
+
"inputFields": "入力フィールド",
|
| 410 |
+
"addInputField": "入力フィールドを追加",
|
| 411 |
+
"inputFieldsDescription": "このワークフローのパラメータスキーマを定義します。\n\nチャットボットがこれをツールとして使用する際、\nこのスキーマに従って値を提供します。",
|
| 412 |
+
"fieldEditor": "フィールドエディター",
|
| 413 |
+
"variableName": "変数名",
|
| 414 |
+
"variableNamePlaceholder": "変数名を入力...",
|
| 415 |
+
"fieldDescriptionPlaceholder": "フィールドの説明を入力...",
|
| 416 |
+
"defaultValuePlaceholder": "デフォルトの{type}値を入力...",
|
| 417 |
+
"selectOptionPlaceholder": "オプションを選択...",
|
| 418 |
+
"unlink": "ノードのリンクを解除",
|
| 419 |
+
"elseIfDescription": "条件が満たされない場合、実行するロジックを定義します。",
|
| 420 |
+
"elseDescription": "条件が満たされない場合、実行するロジックを定義します。",
|
| 421 |
+
"addCondition": "条件を追加",
|
| 422 |
+
"noVariablesFound": "変数が見つかりません",
|
| 423 |
+
"outputVariables": "出力変数",
|
| 424 |
+
"outputVariablesDescription": "ワークフローから出力される変数です。",
|
| 425 |
+
"addOutputVariable": "出力変数を追加",
|
| 426 |
+
"outputSchema": "出力スキーマ",
|
| 427 |
+
"addMessage": "メッセージを追加",
|
| 428 |
+
"messagesDescription": "LLM処理を通じてデータを生成します。\n\n'/'を使用して前のノードのデータを入力として言及・参照してください。\n\n構造化出力を有効にすると、データの変換、フォーマット、検証に最適です。",
|
| 429 |
+
"descriptionAndSchema": "説明とスキーマ",
|
| 430 |
+
"noDescriptionAndSchema": "説明とスキーマがありません",
|
| 431 |
+
"toolDescription": "LLMがツールパラメータを生成するために必要な情報を提供します。\n\n'/'を使用して前のノードのデータを言及してください。",
|
| 432 |
+
"generateInputWithAIDescription": "ワークフローの入力を生成するプロンプトを書いてください",
|
| 433 |
+
"example": {
|
| 434 |
+
"babyResearch": "ベビーリサーチ",
|
| 435 |
+
"getWeather": "天気取得"
|
| 436 |
+
},
|
| 437 |
+
"selectVariable": "変数を選択",
|
| 438 |
+
"structuredOutput": "構造化出力",
|
| 439 |
+
"structuredOutputDescription": "定義されたスキーマでJSONオブジェクトとしてレスポンスを生成",
|
| 440 |
+
"outputSchemaEditor": "出力スキーマエディター",
|
| 441 |
+
"addField": "フィールドを追加",
|
| 442 |
+
"saveSchema": "スキーマを保存",
|
| 443 |
+
"generateSchemaWithAI": "AIでスキーマを生成",
|
| 444 |
+
"describeOutputDataRequest": "このノードが出力すべき内容を表すサンプルJSONデータを提供してください\n\n例: {eg}",
|
| 445 |
+
"generatingJsonSchemaWithAI": "AIでJSONスキーマを生成中...",
|
| 446 |
+
"jsonSchemaGeneratedSuccessfully": "JSONスキーマが正常に生成されました!",
|
| 447 |
+
"failedToGenerateSchema": "スキーマの生成に失敗しました",
|
| 448 |
+
"jsonSchemaEditorDescription": "AI支援による直接的なJSONスキーマ編集。複雑なネストした構造と配列をサポートします。",
|
| 449 |
+
"template": "テンプレート",
|
| 450 |
+
"templateDescription": "テンプレート文書を生成します。\n\n'/'を使用して他のノードの出力値を参照・使用してください。",
|
| 451 |
+
"kindsDescription": {
|
| 452 |
+
"input": "チャットボットがこのワークフローをツールとして使用する際に提供する入力パラメータを定義します。\n\nツール実行のためのデータ構造と検証ルールを指定し��す。",
|
| 453 |
+
"output": "ワークフロー実行の最終結果を収集して返します。\n\n複数のノードからのデータを最終ツールレスポンスに結合します。",
|
| 454 |
+
"llm": "AIモデルを使用してテキストや構造化データを生成します。\n\n'/'メンションで前のノード出力を参照してコンテキスト認識レスポンスを作成します。\n\n構造化出力を使用してデータの変換、フォーマット、検証を行う - 単なるテキスト生成ではありません。",
|
| 455 |
+
"tool": "MCPツールや外部サービスを実行します。\n\nメッセージに指示を書けば、LLMがコンテキストから必要なツールパラメータを生成します。",
|
| 456 |
+
"note": "ワークフローロジックを整理するためのドキュメントとコメントを追加します。\n\nチームメンバーが複雑なワークフロープロセスを理解するのに役立ちます。",
|
| 457 |
+
"code": "前のノードデータにアクセスできるカスタムコードスクリプトを実行します。\n\nワークフロー内でJavaScript、Python、その他の言語を実行します(近日公開)。",
|
| 458 |
+
"http": "HTTPリクエストを通じて外部APIやWebサービスからデータを取得します。\n\nREST API、Webhook、サードパーティサービスと統合します。",
|
| 459 |
+
"template": "前のノードのデータとテキストを組み合わせて動的文書を作成します。\n\n変数置換を使用してメール、レポート、フォーマットされたコンテンツを生成します。",
|
| 460 |
+
"condition": "データ評価に基づいてワークフローを分岐する条件ロジックを追加します。\n\n異なるシナリオやデータ条件を処理するif-elseロジックを作成します。"
|
| 461 |
+
},
|
| 462 |
+
"greeting": {
|
| 463 |
+
"buildAutomationTitle": "ノード接続による自動化構築",
|
| 464 |
+
"buildAutomationDescription": "様々なノードを接続して複雑なタスクを自動化します。各ノードは特定の機能を担当し、データが順次流れて処理されます。",
|
| 465 |
+
"chatbotToolTitle": "チャットボットツールとして活用",
|
| 466 |
+
"chatbotToolDescription": "ワークフローの主な目的は、チャットボットの会話でツールとして使用することです。反復的なタスクをワークフローに変換して、チャット中に簡単に実行できます。",
|
| 467 |
+
"parameterBasedTitle": "️ パラメータベースの開始",
|
| 468 |
+
"parameterBasedDescription": "入力ノードはトリガーではなく、パラメータ構造を定義します。チャットボットがこのワークフローをツールとして呼び出すときに必要なデータ形式を指定します。",
|
| 469 |
+
"exampleTitle": "使用例",
|
| 470 |
+
"exampleDescription": "「メール作成 → 翻訳 → 送信」ワークフローを作成しておけば、チャットボットの会話で「@メール_ワークフロー」で簡単に実行できます。",
|
| 471 |
+
"availableNodesTitle": "利用可能なノード",
|
| 472 |
+
"upcomingNodesTitle": "近日公開予定のノード",
|
| 473 |
+
"ctaMessage": "今すぐワークフローを作成してチャットボットの機能を拡張しましょう!",
|
| 474 |
+
"soonMessage": "近日公開予定です。"
|
| 475 |
+
},
|
| 476 |
+
"arrangeNodes": "自動レイアウト",
|
| 477 |
+
"nodesArranged": "レイアウトが正常に適用されました",
|
| 478 |
+
"visibilityUpdated": "公開設定が正常に更新されました"
|
| 479 |
+
},
|
| 480 |
+
"User": {
|
| 481 |
+
"Profile": {
|
| 482 |
+
"common": {
|
| 483 |
+
"uploadPhoto": "写真をアップロード",
|
| 484 |
+
"chooseDefault": "デフォルトを選択",
|
| 485 |
+
"useEmoji": "絵文字を使用",
|
| 486 |
+
"generateWithAI": "AIで生成",
|
| 487 |
+
"changeProfilePhoto": "プロフィール写真を変更",
|
| 488 |
+
"selectDefaultAvatar": "デフォルトアバターを選択",
|
| 489 |
+
"selectDefaultAvatarDescription": "以下のデフォルトアバターから1つを選択してください",
|
| 490 |
+
"chooseEmojiAvatar": "絵文字アバターを選択",
|
| 491 |
+
"chooseEmojiAvatarDescription": "プロフィール写真として使用する絵文字を選択してください",
|
| 492 |
+
"generateAvatarWithAI": "AIでアバターを生成",
|
| 493 |
+
"generateAvatarWithAIDescription": "理想的なプロフィール写真を説明してAIに作成させましょう",
|
| 494 |
+
"aiProvider": "AIプロバイダー",
|
| 495 |
+
"describeYourAvatar": "アバターを説明",
|
| 496 |
+
"avatarPromptPlaceholder": "例:ジブリスタジオスタイルのかわいい子犬",
|
| 497 |
+
"generating": "生成中...",
|
| 498 |
+
"regenerate": "再生成",
|
| 499 |
+
"useThisAvatar": "このアバターを使用",
|
| 500 |
+
"profilePhotoUpdatedSuccessfully": "プロフィール写真が正常に更新されました",
|
| 501 |
+
"failedToUpdateProfilePhoto": "プロフィール写真の更新に失敗しました",
|
| 502 |
+
"pleaseEnterPrompt": "説明を入力してください",
|
| 503 |
+
"imageGeneratedSuccessfully": "画像が正常に生成されました!",
|
| 504 |
+
"failedToGenerateImage": "画像の生成に失敗しました",
|
| 505 |
+
"failedToSaveImage": "画像の保存に失敗しました",
|
| 506 |
+
"pleaseUploadValidImage": "有効な画像をアップロードしてください(JPEG、PNG、またはWebP)",
|
| 507 |
+
"imageSizeMustBeLessThan": "画像サイズは5MB未満である必要があります",
|
| 508 |
+
"select": "選択"
|
| 509 |
+
}
|
| 510 |
+
}
|
| 511 |
+
}
|
| 512 |
+
}
|
messages/ko.json
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "취소",
|
| 4 |
+
"update": "업데이트",
|
| 5 |
+
"continue": "계속",
|
| 6 |
+
"success": "성공",
|
| 7 |
+
"delete": "삭제",
|
| 8 |
+
"save": "저장",
|
| 9 |
+
"back": "뒤로",
|
| 10 |
+
"next": "다음",
|
| 11 |
+
"create": "생성",
|
| 12 |
+
"showLess": "적게 보기",
|
| 13 |
+
"showMore": "더 보기",
|
| 14 |
+
"generate": "생성",
|
| 15 |
+
"edit": "수정",
|
| 16 |
+
"editAgent": "에이전트 편집",
|
| 17 |
+
"search": "검색...",
|
| 18 |
+
"approve": "승인",
|
| 19 |
+
"reject": "거절",
|
| 20 |
+
"saving": "저장 중...",
|
| 21 |
+
"optional": "선택사항",
|
| 22 |
+
"deleting": "삭제 중...",
|
| 23 |
+
"run": "실행",
|
| 24 |
+
"description": "설명",
|
| 25 |
+
"defaultValue": "기본값",
|
| 26 |
+
"empty": "비어있음",
|
| 27 |
+
"required": "필수",
|
| 28 |
+
"options": "옵션",
|
| 29 |
+
"status": "상태",
|
| 30 |
+
"result": "결과",
|
| 31 |
+
"startedAt": "시작 시간",
|
| 32 |
+
"duration": "소요 시간",
|
| 33 |
+
"addOption": "옵션 추가",
|
| 34 |
+
"tool": "도구",
|
| 35 |
+
"selectTool": "도구 선택...",
|
| 36 |
+
"noResults": "결과가 없습니다.",
|
| 37 |
+
"generateInputWithAI": "AI로 입력 생성",
|
| 38 |
+
"generatingInputWithAI": "AI로 입력 생성 중...",
|
| 39 |
+
"inputGeneratedSuccessfully": "입력이 성공적으로 생성되었습니다",
|
| 40 |
+
"failedToGenerateInput": "입력 생성에 실패했습니다",
|
| 41 |
+
"createWithExample": "예제로 생성",
|
| 42 |
+
"generateWithAI": "AI로 생성",
|
| 43 |
+
"resultsFound": "{count}개의 결과 찾음",
|
| 44 |
+
"youAreAnExpertIn": "당신은 {role} 전문가입니다",
|
| 45 |
+
"sharedBy": "{userName}님이 공유함"
|
| 46 |
+
},
|
| 47 |
+
"Auth": {
|
| 48 |
+
"SignIn": {
|
| 49 |
+
"title": "환영합니다",
|
| 50 |
+
"description": "계정에 로그인하여 계속합니다",
|
| 51 |
+
"oauthClientIdNotSet": "{provider} client ID가 설정되지 않았습니다",
|
| 52 |
+
"noAccount": "계정이 없습니까?",
|
| 53 |
+
"signUp": "회원가입",
|
| 54 |
+
"signIn": "로그인",
|
| 55 |
+
"orContinueWith": "다른 계정으로 계속하기"
|
| 56 |
+
},
|
| 57 |
+
"SignUp": {
|
| 58 |
+
"title": "회원가입",
|
| 59 |
+
"signIn": "로그인",
|
| 60 |
+
"description": "계정에 회원가입하여 계속합니다",
|
| 61 |
+
"step1": "우리와 함께 여정을 시작하기 위해 이메일 주소를 입력하세요",
|
| 62 |
+
"step2": "우리와 대화할 때 이 이름을 사용할 거예요",
|
| 63 |
+
"step3": "강력한 비밀번호를 만들어 계정을 보호하세요",
|
| 64 |
+
"signUp": "회원가입",
|
| 65 |
+
"invalidEmail": "이메일 주소가 유효하지 않습니다",
|
| 66 |
+
"emailAlreadyExists": "이메일이 이미 존재합니다",
|
| 67 |
+
"nameRequired": "이름이 필요합니다",
|
| 68 |
+
"passwordRequired": "비밀번호가 필요합니다",
|
| 69 |
+
"createAccount": "계정 생성"
|
| 70 |
+
},
|
| 71 |
+
"Intro": {
|
| 72 |
+
"description": "better-chatbot에 오신 것을 환영합니다. 우리의 AI 기반 대화 도구를 경험하세요."
|
| 73 |
+
}
|
| 74 |
+
},
|
| 75 |
+
"Chat": {
|
| 76 |
+
"Error": "채팅 오류",
|
| 77 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "이 메시지는 저장되지 않았습니다. 다시 시도해주세요.",
|
| 78 |
+
"uploadImage": "파일 업로드",
|
| 79 |
+
"generateImage": "이미지 만들기",
|
| 80 |
+
"imageUploadedSuccessfully": "이미지가 성공적으로 업로드되었습니다",
|
| 81 |
+
"pleaseUploadImageFile": "이미지 파일을 업로드해주세요",
|
| 82 |
+
"imageSizeMustBeLessThan10MB": "이미지 크기는 10MB 미만이어야 합니다",
|
| 83 |
+
"failedToUploadImage": "이미지 업로드에 실패했습니다",
|
| 84 |
+
"imageUploadFailedUsingBase64": "이미지 업로드에 실패했습니다. Base64 인코딩을 사용하여 전송합니다.",
|
| 85 |
+
"Greeting": {
|
| 86 |
+
"goodMorning": "{name}님 좋은 아침입니다",
|
| 87 |
+
"goodAfternoon": "{name}님 좋은 오후입니다",
|
| 88 |
+
"goodEvening": "{name}님 좋은 저녁입니다",
|
| 89 |
+
"niceToSeeYouAgain": "{name}님, 또 보니 반가워요.",
|
| 90 |
+
"whatAreYouWorkingOnToday": "{name}! 오늘 무엇을 하고 있어요?",
|
| 91 |
+
"letMeKnowWhenYoureReadyToBegin": "준비가 되면 알려주세요.",
|
| 92 |
+
"whatAreYourThoughtsToday": "오늘 좋은 아이디어가 있나요?",
|
| 93 |
+
"whereWouldYouLikeToStart": "어디서부터 시작할까요?",
|
| 94 |
+
"whatAreYouThinking": "{name}님, 무엇을 생각하고 있어요?"
|
| 95 |
+
},
|
| 96 |
+
"TemporaryChat": {
|
| 97 |
+
"toggleTemporaryChat": "임시 채팅 토글",
|
| 98 |
+
"temporaryChat": "임시 채팅",
|
| 99 |
+
"resetChat": "채팅 초기화",
|
| 100 |
+
"thisChatWontBeSaved": "이 채팅은 저장되지 않습니다.",
|
| 101 |
+
"feelFreeToAskAnythingTemporarily": "임시로 무엇이든 물어보세요",
|
| 102 |
+
"temporaryChatInstructions": "임시 채팅 지침",
|
| 103 |
+
"temporaryChatInstructionsPlaceholder": "지침을 입력하세요",
|
| 104 |
+
"temporaryChatInstructionsDescription": "임시 채팅에 대한 지침을 설정할 수 있습니다. 이것은 임시 채팅에 대한 시스템 프롬프트로 사용됩니다."
|
| 105 |
+
},
|
| 106 |
+
"placeholder": "아무거나 물어보거나 @mention 하세요",
|
| 107 |
+
"Tool": {
|
| 108 |
+
"webSearching": "웹에서 찾아보는 중...",
|
| 109 |
+
"searchedTheWeb": "참고한 웹 사이트",
|
| 110 |
+
"toolModeDescription": "도구 사용 방식을 선택하세요:\n• 자동: AI가 도구 사용 여부를 자동으로 결정\n• 수동: 도구 사용 전 권한 요청\n• 사용 안함: 모든 도구 비활성화",
|
| 111 |
+
"toolsSetupDescription": "chatbot이 사용할 수 있는 도구를 선택하세요.\n선택된 도구를 스스로 판단하여 사용하게 됩니다.\n\n@mention을 하여 직접 특정 도구 사용을 강제 할 수 도 있습니다.",
|
| 112 |
+
"selectToolMode": "도구 사용 모드",
|
| 113 |
+
"autoToolModeDescription": "도구 사용 여부를 자동으로 결정합니다",
|
| 114 |
+
"manualToolModeDescription": "도구 사용 여부를 물어봅니다",
|
| 115 |
+
"noneToolModeDescription": "도구를 사용하지 않습니다. @mention은 여전히 가능합니다.",
|
| 116 |
+
"toolsSetup": "도구 설정",
|
| 117 |
+
"preset": "프리셋",
|
| 118 |
+
"toolPresets": "도구 프리셋",
|
| 119 |
+
"saveAsPreset": "프리셋으로 저장",
|
| 120 |
+
"saveAsPresetDescription": "현재 도구 설정을 프리셋으로 저장합니다.",
|
| 121 |
+
"noPresetsAvailableYet": "프리셋이 없습니다",
|
| 122 |
+
"presetNameCannotBeEmpty": "프리셋 이름을 입력해주세요",
|
| 123 |
+
"presetNameAlreadyExists": "이미 존재하는 프리셋 이름입니다",
|
| 124 |
+
"presetSaved": "프리셋이 저장되었습니다",
|
| 125 |
+
"clickSaveAsPresetToGetStarted": "프리셋으로 저장하여 시작합니다.",
|
| 126 |
+
"searchOptions": "검색 옵션",
|
| 127 |
+
"searchOptionsDescription": "검색 결과의 최대 개수, 검색 날짜 등의 검색 옵션을 챗봇에 전달할 수 있습니다.",
|
| 128 |
+
"defaultToolKit": {
|
| 129 |
+
"visualization": "데이터 시각화",
|
| 130 |
+
"webSearch": "웹 검색"
|
| 131 |
+
},
|
| 132 |
+
"agent": "에이전트",
|
| 133 |
+
"mention": "멘션",
|
| 134 |
+
"tools": "도구",
|
| 135 |
+
"tooManyToolsSelected": "너무 많은 도구가 선택되었습니다. 128개 미만으로 선택해주세요",
|
| 136 |
+
"presetNamePlaceholder": "프리셋 이름",
|
| 137 |
+
"noMcpServersDetected": "MCP 서버가 감지되지 않았습니다.",
|
| 138 |
+
"addServer": "서버 추가",
|
| 139 |
+
"error": "오류",
|
| 140 |
+
"authorizationRequired": "인증 필요",
|
| 141 |
+
"clickToAuthorize": "이 MCP 서버에 접근하려면 여기를 클릭하여 인증하세요.",
|
| 142 |
+
"auto": "자동",
|
| 143 |
+
"manual": "수동",
|
| 144 |
+
"none": "없음",
|
| 145 |
+
"mentionOnly": "@멘션만",
|
| 146 |
+
"noToolsAvailable": "사용 가능한 도구가 없습니다"
|
| 147 |
+
},
|
| 148 |
+
"VoiceChat": {
|
| 149 |
+
"title": "음성 채팅 모드",
|
| 150 |
+
"compactDisplayMode": "간략한 모드",
|
| 151 |
+
"conversationDisplayMode": "대화 모드",
|
| 152 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "음성 채팅을 닫고 다시 시도해주세요.",
|
| 153 |
+
"endConversation": "대화 종료",
|
| 154 |
+
"toggleVoiceChat": "음성 채팅 토글",
|
| 155 |
+
"startConversation": "대화 시작",
|
| 156 |
+
"closeMic": "마이크 닫기",
|
| 157 |
+
"openMic": "마이크 열기",
|
| 158 |
+
"readyWhenYouAreJustStartTalking": "준비됐어요. 언제든 이야기해 주세요",
|
| 159 |
+
"yourMicIsOff": "마이크를 꺼두셨어요.",
|
| 160 |
+
"preparing": "준비중이에요...",
|
| 161 |
+
"startVoiceChat": "대화를 시작해볼까요?"
|
| 162 |
+
},
|
| 163 |
+
"Thread": {
|
| 164 |
+
"chat": "채팅",
|
| 165 |
+
|
| 166 |
+
"renameChat": "채팅 이름 변경",
|
| 167 |
+
"deleteChat": "채팅 삭제",
|
| 168 |
+
"deleteUnarchivedChats": "아카이브되지 않은 채팅 모두 삭제",
|
| 169 |
+
"confirmDeleteUnarchivedChats": "아카이브되지 않은 모든 채팅을 삭제하시겠습니까?",
|
| 170 |
+
"thisActionCannotBeUndone": "이 작업은 되돌릴 수 없습니다.",
|
| 171 |
+
"unarchivedChatsDeleted": "아카이브되지 않은 채팅들이 삭제되었습니다",
|
| 172 |
+
"failedToDeleteUnarchivedChats": "아카이브되지 않은 채팅 삭제 실패",
|
| 173 |
+
"failedToDeleteThread": "채팅 삭제 실패",
|
| 174 |
+
"threadDeleted": "채팅이 삭제되었습니다",
|
| 175 |
+
"failedToUpdateThread": "채팅 업데이트 실패",
|
| 176 |
+
"titleRequired": "제목이 필요합니다",
|
| 177 |
+
"threadUpdated": "채팅이 업데이트되었습니다",
|
| 178 |
+
"areYouSureYouWantToDeleteThisChatThread": "이 채팅을 삭제하시겠습니까?",
|
| 179 |
+
"sharePublicLink": "공개 링크 공유",
|
| 180 |
+
"sharePublicLinkDescription": "공유 후 추가되는 모든 메시지는 비공개로 유지됩니다.",
|
| 181 |
+
"creatingLink": "링크 생성 중...",
|
| 182 |
+
"createLink": "링크 만들기",
|
| 183 |
+
"linkCopied": "링크가 복사되었습니다"
|
| 184 |
+
},
|
| 185 |
+
|
| 186 |
+
"ChatPreferences": {
|
| 187 |
+
"title": "채팅 환경설정",
|
| 188 |
+
"whatShouldWeCallYou": "뭐라고 불러드릴까요?",
|
| 189 |
+
"botName": "어시스턴트 이름",
|
| 190 |
+
"whatBestDescribesYourWork": "어떤 직업을 갖고 계신가요?",
|
| 191 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "원하시는 응답 스타일을 말씀해주세요",
|
| 192 |
+
"responseStyleExample1": "예) 설명을 간결하게 유지하고 중요한 점만 강조하세요",
|
| 193 |
+
"responseStyleExample2": "예) 새로운 개념을 배울 때, 비유가 특히 도움이 됩니다",
|
| 194 |
+
"responseStyleExample3": "예) 자세한 답변을 제시하기 전에 질���을 통해 명확하게 하세요",
|
| 195 |
+
"responseStyleExample4": "예) 나는 주로 Python으로 코딩하며 (코딩 초보가 아님을) 기억하세요",
|
| 196 |
+
"professionExample1": "예) 소프트웨어 엔지니어",
|
| 197 |
+
"professionExample2": "예) 제품 매니저",
|
| 198 |
+
"professionExample3": "예) 마케팅 매니저",
|
| 199 |
+
"professionExample4": "예) 판매 매니저",
|
| 200 |
+
"professionExample5": "예) 비즈니스 분석가",
|
| 201 |
+
"preferencesSaved": "환경설정이 저장되었습니다",
|
| 202 |
+
"failedToSavePreferences": "환경설정 저장 실패",
|
| 203 |
+
"userInstructions": "사용자 지침",
|
| 204 |
+
"userInstructionsDescription": "자기소개를 하고 보다 내게 맞춰진 응답을 받으세요.",
|
| 205 |
+
"mcpInstructions": "MCP 지침사항",
|
| 206 |
+
"mcpInstructionsDescription": "MCP 서버 지침을 설정하세요.",
|
| 207 |
+
"myExports": "내 공유 목록",
|
| 208 |
+
"myExportsDescription": "공유한 채팅 내용을 관리하고 정리하세요.",
|
| 209 |
+
"noExportsYet": "아직 공유한 채팅이 없습니다",
|
| 210 |
+
"exportHint": "채팅 스레드를 공유하여 첫 번째 export를 생성하세요.",
|
| 211 |
+
"exported": "공유됨",
|
| 212 |
+
"expires": "만료",
|
| 213 |
+
"messages": "메시지",
|
| 214 |
+
"comments": "댓글",
|
| 215 |
+
"copyLink": "링크 복사",
|
| 216 |
+
"openInNewTab": "새 탭에서 열기",
|
| 217 |
+
"linkCopied": "링크가 클립보드에 복사되었습니다",
|
| 218 |
+
"confirmDeleteExport": "이 공유를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
|
| 219 |
+
"exportDeleted": "공유가 성공적으로 삭제되었습니다",
|
| 220 |
+
"failedToDeleteExport": "공유 삭제에 실패했습니다",
|
| 221 |
+
"userSettings": "사용자 설정"
|
| 222 |
+
}
|
| 223 |
+
},
|
| 224 |
+
"Layout": {
|
| 225 |
+
"workflow": "워크플로우",
|
| 226 |
+
"toggleSidebar": "사이드바 토글",
|
| 227 |
+
"newChat": "새 채팅",
|
| 228 |
+
"mcpConfiguration": "MCP 설정",
|
| 229 |
+
"agents": "에이전트",
|
| 230 |
+
"newAgent": "새 에이전트",
|
| 231 |
+
"createAgent": "에이전트 생성",
|
| 232 |
+
"createYourOwnAgent": "특별한 기능과 성격을 가진 당신만의 전문 AI 에이전트를 만들어보세요",
|
| 233 |
+
"whatIsAgent": "에이전트란 무엇인가요?",
|
| 234 |
+
"agentDescription": "에이전트는 특정 역할, 지시사항, 도구로 맞춤 설정할 수 있는 전문 AI 어시스턴트로, 다양한 작업을 도와줍니다.",
|
| 235 |
+
"specializedAIAssistant": "전문 AI 어시스턴트",
|
| 236 |
+
"specializedAIAssistantDescription": "각 에이전트는 특정 역할, 성격, 전문 분야로 맞춤 설정하여 고유한 요구사항에 맞는 집중적인 지원을 제공할 수 있습니다.",
|
| 237 |
+
"customInstructions": "맞춤 지시사항",
|
| 238 |
+
"customInstructionsDescription": "상세한 시스템 프롬프트와 행동 지침을 정의하여 에이전트가 응답하고 상호작용하는 방식을 조정할 수 있습니다.",
|
| 239 |
+
"toolIntegration": "도구 통합",
|
| 240 |
+
"toolIntegrationDescription": "에이전트를 MCP 서버, 워크플로우 및 기타 도구에 연결하여 대화를 넘어선 기능을 확장할 수 있습니다.",
|
| 241 |
+
"agentExamples": "에이전트 예시",
|
| 242 |
+
"businessAssistant": "비즈니스 어시스턴트",
|
| 243 |
+
"businessAssistantDescription": "비즈니스 분석, 보고서 생성, 전문적인 커뮤니케이션에 특화되어 있습니다.",
|
| 244 |
+
"creativeWriter": "창작 작가",
|
| 245 |
+
"creativeWriterDescription": "스토리텔링, 콘텐츠 제작, 창의적 브레인스토밍에 집중합니다.",
|
| 246 |
+
"technicalExpert": "기술 전문가",
|
| 247 |
+
"technicalExpertDescription": "개발 도구와 코딩 전문성을 갖춘 기술적 작업을 위한 에이전트입니다.",
|
| 248 |
+
"createFirstAgentToStart": "첫 번째 에이전트를 만들어 시작해보세요!",
|
| 249 |
+
"today": "오늘",
|
| 250 |
+
"yesterday": "어제",
|
| 251 |
+
"lastWeek": "지난 7일",
|
| 252 |
+
"older": "이전",
|
| 253 |
+
"recentChats": "최근 채팅",
|
| 254 |
+
"deleteAllChats": "모든 채팅 삭제",
|
| 255 |
+
"deleteUnarchivedChats": "아카이브되지 않은 채팅 삭제",
|
| 256 |
+
"noConversationsYet": "아직 대화가 없습니다",
|
| 257 |
+
"deletingAllChats": "모든 채팅을 삭제하는 중...",
|
| 258 |
+
"deletingUnarchivedChats": "아카이브되지 않은 채팅을 삭제하는 중...",
|
| 259 |
+
"allChatsDeleted": "모든 채팅이 삭제되었습니다",
|
| 260 |
+
"unarchivedChatsDeleted": "아카이브되지 않은 채팅들이 삭제되었습니다",
|
| 261 |
+
"failedToDeleteAllChats": "채팅 삭제 실패",
|
| 262 |
+
"failedToDeleteUnarchivedChats": "아카이브되지 않은 채팅 삭제 실패",
|
| 263 |
+
"chatPreferences": "채팅 환경설정",
|
| 264 |
+
"keyboardShortcuts": "키보드 단축키",
|
| 265 |
+
"theme": "테마",
|
| 266 |
+
"signOut": "로그아웃",
|
| 267 |
+
"language": "언어",
|
| 268 |
+
"showAllChats": "모든 채팅",
|
| 269 |
+
"showLessChats": "간략히 보기",
|
| 270 |
+
"reportAnIssue": "도움 받기",
|
| 271 |
+
"joinCommunity": "커뮤니티 가입",
|
| 272 |
+
"userSettings": "사용자 설정"
|
| 273 |
+
},
|
| 274 |
+
"Archive": {
|
| 275 |
+
"title": "아카이브",
|
| 276 |
+
"addArchive": "아카이브 추가",
|
| 277 |
+
"archiveName": "아카이브 이름",
|
| 278 |
+
"archiveDescription": "아카이브 설명",
|
| 279 |
+
"archiveDescriptionPlaceholder": "아카이브는 채팅 내역을 저장하는 공간입니다.",
|
| 280 |
+
"noArchives": "아카이브가 없습니다",
|
| 281 |
+
"createFirstArchive": "첫 번째 아카이브를 만들어보세요",
|
| 282 |
+
"archiveCreated": "아카이브가 생성되었습니다",
|
| 283 |
+
"archiveUpdated": "아카이브가 업데이트되었습니다",
|
| 284 |
+
"archiveDeleted": "아카이브가 삭제되었습니다",
|
| 285 |
+
"failedToCreateArchive": "아카이브 생성 실패",
|
| 286 |
+
"failedToUpdateArchive": "아카이브 업데이트 실패",
|
| 287 |
+
"failedToDeleteArchive": "아카이브 삭제 실패",
|
| 288 |
+
"editArchive": "아카이브 수정",
|
| 289 |
+
"editArchiveDescription": "아카이브 정보를 수정합니다",
|
| 290 |
+
"deleteArchive": "아카이브 삭제",
|
| 291 |
+
"confirmDeleteArchive": "정말로 이 아카이브를 삭제하시겠습니까?",
|
| 292 |
+
"deleteArchiveDescription": "아카이브와 모든 아이템이 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다.",
|
| 293 |
+
"addToArchive": "아카이브에 추가",
|
| 294 |
+
"removeFromArchive": "아카이브에서 제거",
|
| 295 |
+
"itemAddedToArchive": "아이템이 아카이브에 추가되었습니다",
|
| 296 |
+
"itemRemovedFromArchive": "아이템이 아카이브에서 제거되었습니다"
|
| 297 |
+
},
|
| 298 |
+
"Agent": {
|
| 299 |
+
"title": "에이전트",
|
| 300 |
+
"generatingAgent": "에이전트 생성 중...",
|
| 301 |
+
"agentNameAndIconLabel": "에이전트에게 이름과 아이콘을 붙여주세요.",
|
| 302 |
+
"agentDescriptionLabel": "이 에이전트의 용도에 대한 짧은 설명을 추가해주세요.",
|
| 303 |
+
"agentDescriptionPlaceholder": "이 내용은 에이전트에 대한 설명일 뿐, 중요하지 않아요.",
|
| 304 |
+
"agentSettingsDescription": "여기부터는 에이전트에게 영향을 줄 수 있는 설정입니다.",
|
| 305 |
+
"thisAgentIs": "이 에이전트는",
|
| 306 |
+
"expertIn": "에 대한 전문가 입니다.",
|
| 307 |
+
"agentRolePlaceholder": "주식 분석",
|
| 308 |
+
"agentInstructionsLabel": "이 에이전트의 역할, 성격, 지침, 지식등 편하게 작성해주세요.",
|
| 309 |
+
"agentInstructionsPlaceholder": "이 에이전트는 주식 분석을 도와줍니다. 웹검색 도구를 활용하여 주식 정보를 얻어옵니다...",
|
| 310 |
+
"agentToolsLabel": "이 에이전트가 사용할 수 있는 도구를 추가해주세요.",
|
| 311 |
+
"loadingTools": "도구를 불러오는 중입니다...",
|
| 312 |
+
"addTools": "도구를 추가해주세요.",
|
| 313 |
+
"generateAgentGreeting": "안녕하세요! 당신만의 에이전트를 만드는 걸 도와드릴게요. 무엇을 만들고 싶으신가요?",
|
| 314 |
+
"generateAgentDetailedGreeting": "안녕하세요! 당신만의 에이전트를 만드는 걸 도와드릴게요. 무엇을 만들고 싶으신가요? 간단하게 작성하셔도 좋고, 자세하게 작성하셔도 좋아요.",
|
| 315 |
+
"inputPromptHere": "여기에 프롬프트를 입력하세요...",
|
| 316 |
+
"agentNamePlaceholder": "better-agent",
|
| 317 |
+
"myAgents": "내 에이전트",
|
| 318 |
+
"sharedAgents": "공유된 에이전트",
|
| 319 |
+
"noAgents": "에이전트가 없습니다",
|
| 320 |
+
"createFirst": "첫 번째 에이전트를 생성해 시작하세요",
|
| 321 |
+
"noSharedAgents": "공유된 에이전트가 없습니다",
|
| 322 |
+
"noSharedAgentsDescription": "북마크할 수 있는 공개 에이전트가 없습니다",
|
| 323 |
+
"noDescription": "설명이 제공되지 않았습니다",
|
| 324 |
+
"bookmarkAdded": "에이전트가 북마크되었습니다",
|
| 325 |
+
"bookmarkRemoved": "북마크가 제거되었습니다",
|
| 326 |
+
"bookmarkedAgent": "북마크된 에이전트",
|
| 327 |
+
"addBookmark": "에이전트 북마크",
|
| 328 |
+
"removeBookmark": "북마크 제거",
|
| 329 |
+
"visibilityUpdated": "가시성이 업데이트되었습니다",
|
| 330 |
+
"deleted": "에이전트가 삭제되었습니다",
|
| 331 |
+
"deleteConfirm": "이 에이전트를 삭제하시겠습니까?",
|
| 332 |
+
"makePrivate": "비공개로 설정",
|
| 333 |
+
"makeReadonly": "읽기 전용으로 설정",
|
| 334 |
+
"makePublic": "공개로 설정",
|
| 335 |
+
"visibility": "가시성",
|
| 336 |
+
"private": "비공개",
|
| 337 |
+
"readOnly": "읽기 전용",
|
| 338 |
+
"public": "공개",
|
| 339 |
+
"privateDescription": "나만 이 에이전트를 보고, 편집하고, 사용할 수 있습니다.",
|
| 340 |
+
"readOnlyDescription": "다른 사람들이 도구로 보고 사용할 수 있지만, 편집은 나만 할 수 있습니다.",
|
| 341 |
+
"publicDescription": "누구나 이 에이전트를 보고, 편집하고, 도구로 사용할 수 있습니다."
|
| 342 |
+
},
|
| 343 |
+
"KeyboardShortcuts": {
|
| 344 |
+
"title": "키보드 단축키",
|
| 345 |
+
"newChat": "새 채팅",
|
| 346 |
+
"toggleTemporaryChat": "임시 채팅 토글",
|
| 347 |
+
"toggleSidebar": "사이드바 토글",
|
| 348 |
+
"toolMode": "도구 사용 모드",
|
| 349 |
+
"lastMessageCopy": "마지막 메시지 복사",
|
| 350 |
+
"openChatPreferences": "채팅 환경설정 열기",
|
| 351 |
+
"deleteThread": "채팅 삭제",
|
| 352 |
+
"openShortcutsPopup": "단축키 팝업 열기",
|
| 353 |
+
"toggleVoiceChat": "음성 채팅 토글"
|
| 354 |
+
},
|
| 355 |
+
"MCP": {
|
| 356 |
+
"marketplace": "마켓플레이스",
|
| 357 |
+
"addMcpServer": "서버 추가",
|
| 358 |
+
"configureYourMcpServerConnectionSettings": "MCP 서버 연결 설정을 구성하세요",
|
| 359 |
+
"mcpConfiguration": "MCP 설정",
|
| 360 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "서버 이름은 영문자와 숫자, 하이픈(-)만 포함할 수 있습니다",
|
| 361 |
+
"nameIsRequired": "이름이 필요합니다",
|
| 362 |
+
"configurationSavedSuccessfully": "설정이 저장되었습니다",
|
| 363 |
+
"enterMcpServerName": "MCP 서버 이름을 입력하세요",
|
| 364 |
+
"saveConfiguration": "설정 저장",
|
| 365 |
+
"toolsTest": "도구 테스트",
|
| 366 |
+
"refresh": "새로고침",
|
| 367 |
+
"delete": "삭제",
|
| 368 |
+
"edit": "수정",
|
| 369 |
+
"configuration": "설정",
|
| 370 |
+
"availableTools": "사용 가능한 도구",
|
| 371 |
+
"noToolsAvailable": "사용 가능한 도구가 없습니다",
|
| 372 |
+
"overviewTitle": "첫 번째 서버 연결",
|
| 373 |
+
"overviewDescription": "강력한 AI 통합을 위해 MCP 서버를 추가하세요.",
|
| 374 |
+
"searchTools": "도구 검색",
|
| 375 |
+
"detail": "상세 보기",
|
| 376 |
+
"noSchemaPropertiesAvailable": "속성이 없습니다",
|
| 377 |
+
"createInputWithAI": "AI로 입력 생성",
|
| 378 |
+
"generateExampleInputJSON": "예제 입력 JSON 생성",
|
| 379 |
+
"enterPromptToGenerateExampleInputJSON": "선택한 도구에 대한 예제 입력 JSON을 생성하기 위한 프롬프트를 입력하세요.",
|
| 380 |
+
"callTool": "도구 호출",
|
| 381 |
+
"customInstructions": "사용자 정의 지침",
|
| 382 |
+
"serverCustomInstructionsPlaceholder": "이 서버의 도구를 사용할 수 있을 때마다 이 내용이 시스템 프롬프트에 추가됩니다.",
|
| 383 |
+
"nameAlreadyExists": "이미 존재하는 이름입니다",
|
| 384 |
+
"additionalInstructions": "도구 사용자 지정 지침",
|
| 385 |
+
"inputSchema": "입력 스키마",
|
| 386 |
+
"toolCustomizationInstructions": "도구 사용자 지정 지침은 도구를 사용할 때 시스템 프롬프트에 추가됩니다.\n예) 항상 이메일은 example@example.com 형식으로 입력해주세요.",
|
| 387 |
+
"mcpServerCustomization": "MCP 서버 지침 설정",
|
| 388 |
+
"mcpServerCustomizationDescription": "MCP 서버 사용자 지정 지침은 MCP서버를 사용할 때 시스템 프롬프트에 추가됩니다.",
|
| 389 |
+
"toolCustomizationInstructionsPlaceholder": "도구 사용자 지정 지침이 없습니다.",
|
| 390 |
+
"mcpServerCustomizationPlaceholder": "예) 이 MCP 서버의 툴중에 입력값이 email인 경우 항상 example@example.com 형식으로 입력해주세요.",
|
| 391 |
+
"noInstructions": "없음"
|
| 392 |
+
},
|
| 393 |
+
"Error": {},
|
| 394 |
+
"Info": {
|
| 395 |
+
"mcpAddingDisabled": "관리자에 의해 MCP 서버 추가가 비활성화되었습니다.",
|
| 396 |
+
"vercelSyncDelay": "Vercel에서 실행 중\n\nMCP 변경사항은 동기화에 10-15초 정도 소요될 수 있습니다. 서버 추가, 편집 또는 삭제 후 변경사항이 즉시 보이지 않으면 잠시 기다려주세요."
|
| 397 |
+
},
|
| 398 |
+
"Workflow": {
|
| 399 |
+
"title": "워크플로우",
|
| 400 |
+
"createWorkflow": "워크플로우 생성",
|
| 401 |
+
"draft": "초안",
|
| 402 |
+
"publish": "게시",
|
| 403 |
+
"createWorkflowDescription": "챗봇을 위한 강력한 도구로 워크플로우를 생성하세요.",
|
| 404 |
+
"workflowDescription": "대화 중에 복잡한 작업을 자동화하기 위해 트리거할 수 있습니다.",
|
| 405 |
+
"nameAndIcon": "이름과 아이콘",
|
| 406 |
+
"workflowNamePlaceholder": "챗봇이 이를 도구 이름으로 인식합니다",
|
| 407 |
+
"description": "설명",
|
| 408 |
+
"descriptionPlaceholder": "챗봇이 이를 도구 설명으로 봅니다",
|
| 409 |
+
"inputNodeCannotBeDeleted": "입력 노드는 삭제할 수 없습니다",
|
| 410 |
+
"autoSaveDescription": "10초마다 자동 저장됩니다",
|
| 411 |
+
"draftDescription": "현재 초안 상태입니다.\n\n게시를 클릭하여 챗봇에서 사용 가능하게 하세요\n(하지만 더 이상 편집할 수 없습니다).",
|
| 412 |
+
"publishedDescription": "현재 게시됨 상태이며 챗봇에서 사용 가능합니다.\n\n초안을 클릭하여 편집 가능하게 하세요\n(하지만 챗봇에서 사용할 수 없습니다).",
|
| 413 |
+
"private": "비공개",
|
| 414 |
+
"readonly": "읽기 전용",
|
| 415 |
+
"public": "공개",
|
| 416 |
+
"privateDescription": "본인만 이 워크플로우를 보고, 편집하고, 도구로 사용할 수 있습니다.",
|
| 417 |
+
"readonlyDescription": "다른 사람들이 보고 도구로 사용할 수 있지만, 편집은 본인만 가능합니다.",
|
| 418 |
+
"publicDescription": "누구나 이 워크플로우를 보고, 편집하고, 도구로 사용할 수 있습니다.",
|
| 419 |
+
"visibilityDescription": "이 워크플로우에 액세스하고 수정할 수 있는 사람을 제어합니다",
|
| 420 |
+
"nodeDescriptionPlaceholder": "노드 설명...",
|
| 421 |
+
"nextNode": "다음 노드",
|
| 422 |
+
"nextNodeDescription": "이 워크플로우에 다음 노드를 추가합니다.",
|
| 423 |
+
"addNextNode": "다음 노드 추가",
|
| 424 |
+
"inputFields": "입력 필드",
|
| 425 |
+
"addInputField": "입력 필드 추가",
|
| 426 |
+
"inputFieldsDescription": "이 워크플로우의 매개변수 스키마를 정의합니다.\n\n챗봇이 이를 도구로 사용할 때,\n이 스키마에 따라 값을 제공합니다.",
|
| 427 |
+
"fieldEditor": "필드 편집기",
|
| 428 |
+
"variableName": "변수명",
|
| 429 |
+
"variableNamePlaceholder": "변수명을 입력하세요...",
|
| 430 |
+
"fieldDescriptionPlaceholder": "필드 설명을 입력하세요...",
|
| 431 |
+
"defaultValuePlaceholder": "기본 {type} 값을 입력하세요...",
|
| 432 |
+
"selectOptionPlaceholder": "옵션 선택...",
|
| 433 |
+
"unlink": "노드 연결 해제",
|
| 434 |
+
"elseIfDescription": "조건이 충족되지 않을 때 실행할 로직을 정의합니다.",
|
| 435 |
+
"elseDescription": "조건이 충족되지 않을 때 실행할 로직을 정의합니다.",
|
| 436 |
+
"addCondition": "조건 추가",
|
| 437 |
+
"noVariablesFound": "변수를 찾을 수 없습니다",
|
| 438 |
+
"outputVariables": "출력 변수",
|
| 439 |
+
"outputVariablesDescription": "워크플로우에서 출력되는 변수들입니다.",
|
| 440 |
+
"addOutputVariable": "출력 변수 추가",
|
| 441 |
+
"outputSchema": "출력 스키마",
|
| 442 |
+
"addMessage": "메시지 추가",
|
| 443 |
+
"messagesDescription": "LLM 처리를 통해 데이터를 생성합니다.\n\n'/'를 사용하여 이전 노드의 데이터를 입력으로 언급하고 참조하세요.\n\n구조화된 출력을 활성화하면 데이터 변환, 포맷팅, 검증에 완벽합니다.",
|
| 444 |
+
"descriptionAndSchema": "설명 및 스키마",
|
| 445 |
+
"noDescriptionAndSchema": "설명 및 스키마가 없습니다",
|
| 446 |
+
"toolDescription": "LLM이 도구 매개변수를 생성하는 데 필요한 정보를 제공합니다.\n\n'/'를 사용하여 이전 노드의 데이터를 언급하세요.",
|
| 447 |
+
"generateInputWithAIDescription": "워크플로우에 대한 입력을 생성하는 프롬프트를 작성하세요",
|
| 448 |
+
"example": {
|
| 449 |
+
"babyResearch": "베이비 리서치",
|
| 450 |
+
"getWeather": "날씨 조회"
|
| 451 |
+
},
|
| 452 |
+
"selectVariable": "변수 선택",
|
| 453 |
+
"structuredOutput": "구조화된 출력",
|
| 454 |
+
"structuredOutputDescription": "정의된 스키마를 가진 JSON 객체로 응답 생성",
|
| 455 |
+
"outputSchemaEditor": "출력 스키마 에디터",
|
| 456 |
+
"addField": "필드 추가",
|
| 457 |
+
"saveSchema": "스키마 저장",
|
| 458 |
+
"generateSchemaWithAI": "AI로 스키마 생성",
|
| 459 |
+
"describeOutputDataRequest": "이 노드가 출력해야 하는 것을 나타내는 예제 JSON 데이터를 제공하세요\n\n예제: {eg}",
|
| 460 |
+
"generatingJsonSchemaWithAI": "AI로 JSON 스키마 생성 중...",
|
| 461 |
+
"jsonSchemaGeneratedSuccessfully": "JSON 스키마가 성공적으로 생성되었습니다!",
|
| 462 |
+
"failedToGenerateSchema": "스키마 생성에 실패했습니다",
|
| 463 |
+
"jsonSchemaEditorDescription": "AI 지원으로 직접 JSON 스키마 편집. 복잡한 중첩 구조와 배열을 지원합니다.",
|
| 464 |
+
"template": "템플릿",
|
| 465 |
+
"templateDescription": "템플릿 문서를 생성합니다.\n\n'/'를 사용하여 다른 노드의 출력 값을 참조하고 사용하세요.",
|
| 466 |
+
"kindsDescription": {
|
| 467 |
+
"input": "챗봇이 이 워크플로우를 도구로 사용할 때 제공할 입력 매개변수를 정의합니다.\n\n도구 실행을 위한 데이터 구조와 검증 규칙을 지정합니다.",
|
| 468 |
+
"output": "워크플로우 실행의 최종 결과를 수집하고 반환합니다.\n\n여러 노드의 데이터를 최종 도구 응답으로 결합합니다.",
|
| 469 |
+
"llm": "AI 모델을 사용하여 텍스트나 구조화된 데이터를 생성합니다.\n\n'/' 멘션으로 이전 노드 출력을 참조하여 컨텍스트 인식 응답을 생성합니다.\n\n구조화된 출력을 사용하여 데이터 변환, 포맷팅, 검증 - 단순한 텍스트 생성이 아닙니다.",
|
| 470 |
+
"tool": "MCP 도구나 외부 서비스를 실행합니다.\n\n메시지에 지시사항을 작성하면 LLM이 컨텍스트에서 필요한 도구 매개변수를 생성합니다.",
|
| 471 |
+
"note": "워크플로우 로직을 정리하기 위한 문서와 주석을 추가합니다.\n\n팀원들이 복잡한 워크플로우 프로세스를 이해하는 데 도움을 줍니다.",
|
| 472 |
+
"code": "이전 노드 데이터에 접근할 수 있는 커스텀 코드 스크립트를 실행합니다.\n\n워크플로우 내에서 JavaScript, Python 또는 기타 언어를 실행합니다 (곧 출시).",
|
| 473 |
+
"http": "HTTP 요청을 통해 외부 API 및 웹 서비스에서 데이터를 가져옵니다.\n\nREST API, 웹훅 및 타사 서비스와 통합합니다.",
|
| 474 |
+
"template": "이전 노드의 데이터와 텍스트를 결합하여 동적 문서를 생성합니다.\n\n변수 치환을 사용하여 이메일, 보고서 또는 형식화된 콘텐츠를 생성합니다.",
|
| 475 |
+
"condition": "데이터 평가를 기반으로 워크플로우를 분기하는 조건부 로직을 추가합니다.\n\n다양한 시나리오와 데이터 조건을 처리하기 위한 if-else 로직을 생성합니다."
|
| 476 |
+
},
|
| 477 |
+
"greeting": {
|
| 478 |
+
"buildAutomationTitle": "노드 연결로 자동화 구축",
|
| 479 |
+
"buildAutomationDescription": "다양한 노드들을 연결하여 복잡한 작업을 자동화하세요. 각 노드는 특정 기능을 담당하며, 데이터가 순차적으로 흘러가며 처리됩니다.",
|
| 480 |
+
"chatbotToolTitle": "챗봇 도구로 활용",
|
| 481 |
+
"chatbotToolDescription": "워크플로우의 ���요 목적은 챗봇에서 도구로 사용하는 것입니다. 반복적인 작업을 워크플로우로 만들어 대화 중 간단히 실행할 수 있습니다.",
|
| 482 |
+
"parameterBasedTitle": "️ 매개변수 기반 시작",
|
| 483 |
+
"parameterBasedDescription": "Input 노드는 트리거가 아닌 매개변수 구조를 정의합니다. 챗봇이 이 워크플로우를 도구로 호출할 때 필요한 데이터 형식을 지정합니다.",
|
| 484 |
+
"exampleTitle": "사용 예시",
|
| 485 |
+
"exampleDescription": "\"이메일 작성 → 번역 → 전송\" 워크플로우를 만들어두면, 챗봇 대화에서 \"@이메일_워크플로우\"로 간편하게 실행할 수 있습니다.",
|
| 486 |
+
"availableNodesTitle": "사용 가능한 노드들",
|
| 487 |
+
"upcomingNodesTitle": "곧 출시될 노드",
|
| 488 |
+
"ctaMessage": "지금 바로 워크플로우를 만들어 챗봇의 능력을 확장해보세요!",
|
| 489 |
+
"soonMessage": "곧 제공될 예정입니다."
|
| 490 |
+
},
|
| 491 |
+
"arrangeNodes": "자동 레이아웃",
|
| 492 |
+
"nodesArranged": "레이아웃이 성공적으로 적용되었습니다",
|
| 493 |
+
"visibilityUpdated": "가시성이 성공적으로 업데이트되었습니다"
|
| 494 |
+
},
|
| 495 |
+
"User": {
|
| 496 |
+
"Profile": {
|
| 497 |
+
"common": {
|
| 498 |
+
"uploadPhoto": "사진 업로드",
|
| 499 |
+
"chooseDefault": "기본 이미지 선택",
|
| 500 |
+
"useEmoji": "이모지 사용",
|
| 501 |
+
"generateWithAI": "AI로 생성",
|
| 502 |
+
"changeProfilePhoto": "프로필 사진 변경",
|
| 503 |
+
"selectDefaultAvatar": "기본 아바타 선택",
|
| 504 |
+
"selectDefaultAvatarDescription": "아래의 기본 아바타 중 하나를 선택하세요",
|
| 505 |
+
"chooseEmojiAvatar": "이모지 아바타 선택",
|
| 506 |
+
"chooseEmojiAvatarDescription": "프로필 사진으로 사용할 이모지를 선택하세요",
|
| 507 |
+
"generateAvatarWithAI": "AI로 아바타 생성",
|
| 508 |
+
"generateAvatarWithAIDescription": "이상적인 프로필 사진을 설명하고 AI가 만들도록 하세요",
|
| 509 |
+
"aiProvider": "AI 제공자",
|
| 510 |
+
"describeYourAvatar": "아바타 설명",
|
| 511 |
+
"avatarPromptPlaceholder": "예: 지브리 스튜디오 스타일의 귀여운 강아지",
|
| 512 |
+
"generating": "생성 중...",
|
| 513 |
+
"regenerate": "다시 생성",
|
| 514 |
+
"useThisAvatar": "이 아바타 사용",
|
| 515 |
+
"profilePhotoUpdatedSuccessfully": "프로필 사진이 성공적으로 업데이트되었습니다",
|
| 516 |
+
"failedToUpdateProfilePhoto": "프로필 사진 업데이트에 실패했습니다",
|
| 517 |
+
"pleaseEnterPrompt": "프롬프트를 입력하세요",
|
| 518 |
+
"imageGeneratedSuccessfully": "이미지가 성공적으로 생성되었습니다!",
|
| 519 |
+
"failedToGenerateImage": "이미지 생성에 실패했습니다",
|
| 520 |
+
"failedToSaveImage": "이미지 저장에 실패했습니다",
|
| 521 |
+
"pleaseUploadValidImage": "유효한 이미지를 업로드하세요 (JPEG, PNG 또는 WebP)",
|
| 522 |
+
"imageSizeMustBeLessThan": "이미지 크기는 5MB 미만이어야 합니다",
|
| 523 |
+
"select": "선택"
|
| 524 |
+
}
|
| 525 |
+
}
|
| 526 |
+
}
|
| 527 |
+
}
|
messages/language.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Adding a New Language
|
| 2 |
+
|
| 3 |
+
To add a new language to the application, follow these simple steps:
|
| 4 |
+
|
| 5 |
+
1. Copy the `messages/en.json` file and rename it to match your language code (e.g., `fr.json` for French).
|
| 6 |
+
|
| 7 |
+
2. Translate all content in the file to your target language while maintaining the same JSON structure and keys.
|
| 8 |
+
|
| 9 |
+
3. Add your language to the `SUPPORTED_LOCALES` array in `src/lib/const.ts` file:
|
| 10 |
+
|
| 11 |
+
```typescript
|
| 12 |
+
export const SUPPORTED_LOCALES = [
|
| 13 |
+
{
|
| 14 |
+
code: "en",
|
| 15 |
+
name: "English 🇺🇸",
|
| 16 |
+
},
|
| 17 |
+
{
|
| 18 |
+
code: "ko",
|
| 19 |
+
name: "Korean 🇰🇷",
|
| 20 |
+
},
|
| 21 |
+
{
|
| 22 |
+
code: "your-language-code",
|
| 23 |
+
name: "Your Language Name 🏴",
|
| 24 |
+
},
|
| 25 |
+
];
|
| 26 |
+
```
|
| 27 |
+
|
| 28 |
+
The language will then be available in the language selector of the application.
|
messages/no.json
ADDED
|
@@ -0,0 +1,815 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "Avbryt",
|
| 4 |
+
"update": "Oppdater",
|
| 5 |
+
"continue": "Fortsett",
|
| 6 |
+
"success": "Vellykket",
|
| 7 |
+
"delete": "Slett",
|
| 8 |
+
"save": "Lagre",
|
| 9 |
+
"back": "Tilbake",
|
| 10 |
+
"next": "Neste",
|
| 11 |
+
"create": "Opprett",
|
| 12 |
+
"showLess": "Vis mindre",
|
| 13 |
+
"showMore": "Vis mer",
|
| 14 |
+
"generate": "Generer",
|
| 15 |
+
"edit": "Rediger",
|
| 16 |
+
"editAgent": "Rediger agent",
|
| 17 |
+
"search": "Søk...",
|
| 18 |
+
"approve": "Godkjenn",
|
| 19 |
+
"reject": "Avvis",
|
| 20 |
+
"saving": "Lagrer...",
|
| 21 |
+
"optional": "Valgfritt",
|
| 22 |
+
"deleting": "Sletter...",
|
| 23 |
+
"run": "Kjør",
|
| 24 |
+
"description": "Beskrivelse",
|
| 25 |
+
"defaultValue": "Standardverdi",
|
| 26 |
+
"empty": "Tom",
|
| 27 |
+
"required": "Påkrevd",
|
| 28 |
+
"options": "Alternativer",
|
| 29 |
+
"status": "Status",
|
| 30 |
+
"result": "Resultat",
|
| 31 |
+
"startedAt": "Startet",
|
| 32 |
+
"duration": "Varighet",
|
| 33 |
+
"addOption": "Legg til alternativ",
|
| 34 |
+
"tool": "Verktøy",
|
| 35 |
+
"selectTool": "Velg verktøy...",
|
| 36 |
+
"noResults": "Ingen resultater.",
|
| 37 |
+
"generateWithAI": "Generer med AI",
|
| 38 |
+
"generateInputWithAI": "Generer inndata med AI",
|
| 39 |
+
"generatingInputWithAI": "Genererer inndata med AI...",
|
| 40 |
+
"inputGeneratedSuccessfully": "Inndata generert",
|
| 41 |
+
"failedToGenerateInput": "Kunne ikke generere inndata",
|
| 42 |
+
"createWithExample": "Opprett med eksempel",
|
| 43 |
+
"resultsFound": "{count} resultater funnet",
|
| 44 |
+
"youAreAnExpertIn": "Du er en ekspert på {role}",
|
| 45 |
+
"sharedBy": "Delt av {userName}"
|
| 46 |
+
},
|
| 47 |
+
"Error": {},
|
| 48 |
+
"Info": {
|
| 49 |
+
"mcpAddingDisabled": "Administratoren har deaktivert muligheten til å legge til MCP-servere.",
|
| 50 |
+
"vercelSyncDelay": "Kjører på Vercel\n\nMCP-endringer kan ta 10-15 sekunder å synkronisere. Vent litt etter å ha lagt til, redigert eller slettet servere hvis endringene ikke vises umiddelbart."
|
| 51 |
+
},
|
| 52 |
+
"Workflow": {
|
| 53 |
+
"title": "Arbeidsflyt",
|
| 54 |
+
"whatIsWorkflow": "Hva er en arbeidsflyt?",
|
| 55 |
+
"myWorkflows": "Mine arbeidsflyter",
|
| 56 |
+
"sharedWorkflows": "Delte arbeidsflyter",
|
| 57 |
+
"availableWorkflows": "Tilgjengelige arbeidsflyter",
|
| 58 |
+
"noAvailableWorkflows": "Ingen arbeidsflyter tilgjengelig",
|
| 59 |
+
"noAvailableWorkflowsDescription": "Be administratoren din om å dele arbeidsflyter med deg",
|
| 60 |
+
"createWorkflow": "Opprett arbeidsflyt",
|
| 61 |
+
"draft": "Utkast",
|
| 62 |
+
"publish": "Publiser",
|
| 63 |
+
"createWorkflowDescription": "Opprett arbeidsflyter som kraftige verktøy for chatboten din.",
|
| 64 |
+
"workflowDescription": "Disse kan utløses under samtaler for å automatisere komplekse oppgaver.",
|
| 65 |
+
"nameAndIcon": "Navn og ikon",
|
| 66 |
+
"workflowNamePlaceholder": "Chatboten vil gjenkjenne dette som verktøynavn",
|
| 67 |
+
"description": "Beskrivelse",
|
| 68 |
+
"descriptionPlaceholder": "Chatboten vil se dette som verktøybeskrivelse",
|
| 69 |
+
"inputNodeCannotBeDeleted": "Startnode kan ikke slettes",
|
| 70 |
+
"autoSaveDescription": "Automatisk lagret hvert 10. sekund",
|
| 71 |
+
"draftDescription": "For øyeblikket et utkast.\n\nKlikk Publiser for å gjøre den tilgjengelig for chatboten\n(men ikke lenger redigerbar).",
|
| 72 |
+
"publishedDescription": "For øyeblikket publisert og tilgjengelig for chatboten.\n\nKlikk Utkast for å gjøre den redigerbar\n(men utilgjengelig for chatboten).",
|
| 73 |
+
"private": "Privat",
|
| 74 |
+
"readonly": "Skrivebeskyttet",
|
| 75 |
+
"public": "Offentlig",
|
| 76 |
+
"privateDescription": "Bare du kan se, redigere og bruke denne arbeidsflyten som verktøy.",
|
| 77 |
+
"readonlyDescription": "Andre kan se og bruke som verktøy, men bare du kan redigere.",
|
| 78 |
+
"publicDescription": "Alle kan se, redigere og bruke denne arbeidsflyten som verktøy.",
|
| 79 |
+
"visibilityDescription": "Kontroller hvem som kan få tilgang til og endre denne arbeidsflyten",
|
| 80 |
+
"nodeDescriptionPlaceholder": "nodebeskrivelse...",
|
| 81 |
+
"nextNode": "Neste node",
|
| 82 |
+
"nextNodeDescription": "Legg til en neste node i denne arbeidsflyten.",
|
| 83 |
+
"addNextNode": "Legg til neste node",
|
| 84 |
+
"inputFields": "Inndatafelt",
|
| 85 |
+
"addInputField": "Legg til inndatafelt",
|
| 86 |
+
"inputFieldsDescription": "Definer parameterskjemaet for denne arbeidsflyten.\n\nNår chatboten bruker dette som verktøy,\nvil den gi verdier i henhold til dette skjemaet.",
|
| 87 |
+
"fieldEditor": "Feltredigering",
|
| 88 |
+
"variableName": "Variabelnavn",
|
| 89 |
+
"variableNamePlaceholder": "Skriv inn variabelnavn...",
|
| 90 |
+
"fieldDescriptionPlaceholder": "Skriv inn feltbeskrivelse...",
|
| 91 |
+
"defaultValuePlaceholder": "Skriv inn standard {type}-verdi...",
|
| 92 |
+
"selectOptionPlaceholder": "Velg alternativ...",
|
| 93 |
+
"unlink": "Fjern kobling",
|
| 94 |
+
"elseIfDescription": "Hvis betingelsen ikke er oppfylt, defineres logikken som skal utføres.",
|
| 95 |
+
"elseDescription": "Hvis betingelsen ikke er oppfylt, defineres logikken som skal utføres.",
|
| 96 |
+
"addCondition": "Legg til betingelse",
|
| 97 |
+
"noVariablesFound": "Ingen variabler funnet",
|
| 98 |
+
"outputVariables": "Utdatavariabler",
|
| 99 |
+
"outputVariablesDescription": "Utdatavariabler er variablene som returneres fra arbeidsflyten.",
|
| 100 |
+
"addOutputVariable": "Legg til utdatavariabel",
|
| 101 |
+
"outputSchema": "Utdataskjema",
|
| 102 |
+
"addMessage": "Legg til melding",
|
| 103 |
+
"messagesDescription": "Generer data gjennom LLM-behandling.\n\nBruk '/' for å nevne og referere til data fra tidligere noder som inndata.\n\nMed strukturert utdata aktivert, perfekt for datatransformasjon, formatering og validering.",
|
| 104 |
+
"descriptionAndSchema": "Beskrivelse og skjema",
|
| 105 |
+
"noDescriptionAndSchema": "Ingen beskrivelse og skjema",
|
| 106 |
+
"toolDescription": "Gi informasjon som trengs for at LLM skal generere verktøyparametere.\n\nBruk '/' for å nevne data fra tidligere noder.",
|
| 107 |
+
"generateInputWithAIDescription": "Skriv en ledetekst for å generere inndata for arbeidsflyten",
|
| 108 |
+
"selectVariable": "Velg variabel",
|
| 109 |
+
"structuredOutput": "Strukturert utdata",
|
| 110 |
+
"structuredOutputDescription": "Generer svar som JSON-objekt med definert skjema",
|
| 111 |
+
"outputSchemaEditor": "Redigering av utdataskjema",
|
| 112 |
+
"addField": "Legg til felt",
|
| 113 |
+
"saveSchema": "Lagre skjema",
|
| 114 |
+
"generateSchemaWithAI": "Generer skjema med AI",
|
| 115 |
+
"describeOutputDataRequest": "Gi eksempel-JSON-data som representerer hva denne noden skal returnere\n\nEksempel: {eg}",
|
| 116 |
+
"generatingJsonSchemaWithAI": "Genererer JSON-skjema med AI...",
|
| 117 |
+
"jsonSchemaGeneratedSuccessfully": "JSON-skjema generert!",
|
| 118 |
+
"failedToGenerateSchema": "Kunne ikke generere skjema",
|
| 119 |
+
"jsonSchemaEditorDescription": "Direkte JSON-skjemaredigering med AI-assistanse. Støtter komplekse nestede strukturer og arrays.",
|
| 120 |
+
"template": "Mal",
|
| 121 |
+
"templateDescription": "Generer maldokumenter.\n\nBruk '/' for å referere til og bruke utdataverdier fra andre noder.",
|
| 122 |
+
"greeting": {
|
| 123 |
+
"buildAutomationTitle": "Automatiser ved å koble sammen noder",
|
| 124 |
+
"buildAutomationDescription": "Koble sammen ulike noder for å automatisere komplekse oppgaver. Hver node håndterer spesifikke funksjoner, og data flyter sekvensielt for behandling.",
|
| 125 |
+
"chatbotToolTitle": "Bruk som chatbot-verktøy",
|
| 126 |
+
"chatbotToolDescription": "Hovedformålet med arbeidsflyter er å bruke dem som verktøy i chatbot-samtaler. Gjør repeterende oppgaver om til arbeidsflyter slik at de kan kjøres enkelt direkte i samtalen.",
|
| 127 |
+
"parameterBasedTitle": "Parameterbasert start",
|
| 128 |
+
"parameterBasedDescription": "Startnoder definerer parameterstrukturer, ikke utløsere. De spesifiserer dataformatet som trengs når chatboten kaller denne arbeidsflyten som verktøy.",
|
| 129 |
+
"exampleTitle": "Brukseksempel",
|
| 130 |
+
"exampleDescription": "Opprett en «E-postskriving → Oversettelse → Send»-arbeidsflyt, og utfør den enkelt i chatbot-samtaler med «@email_workflow».",
|
| 131 |
+
"availableNodesTitle": "Tilgjengelige noder",
|
| 132 |
+
"upcomingNodesTitle": "Kommende noder",
|
| 133 |
+
"ctaMessage": "Begynn å opprette arbeidsflyter nå for å utvide chatbotens muligheter!",
|
| 134 |
+
"soonMessage": "Kommer snart."
|
| 135 |
+
},
|
| 136 |
+
"example": {
|
| 137 |
+
"babyResearch": "Baby research",
|
| 138 |
+
"getWeather": "Sjekk været"
|
| 139 |
+
},
|
| 140 |
+
"kindsDescription": {
|
| 141 |
+
"input": "Definer inndataparametere som chatboten vil gi når den bruker denne arbeidsflyten som verktøy.\n\nSpesifiser datastrukturen og valideringsreglene for verktøykjøring.",
|
| 142 |
+
"output": "Samle inn og returner de endelige resultatene fra arbeidsflytkjøringen din.\n\nKombiner data fra flere noder til det endelige verktøysvaret.",
|
| 143 |
+
"llm": "Generer tekst eller strukturerte data ved hjelp av AI-modeller.\n\nReferer til tidligere nodeutdata med '/'-nevninger for å skape kontekstbevisste svar.\n\nBruk strukturert utdata for å transformere, formatere og validere data - ikke bare for tekstgenerering.",
|
| 144 |
+
"tool": "Utfør MCP-verktøy eller eksterne tjenester.\n\nSkriv instruksjoner i meldinger, og LLM vil generere de nødvendige verktøyparametrene fra konteksten din.",
|
| 145 |
+
"note": "Legg til dokumentasjon og kommentarer for å organisere arbeidsflytlogikken din.\n\nHjelp teammedlemmer med å forstå komplekse arbeidsflytprosesser.",
|
| 146 |
+
"code": "Utfør egendefinerte kodeskript med tilgang til data fra tidligere noder.\n\nKjør JavaScript, Python eller andre språk i arbeidsflyten din (kommer snart).",
|
| 147 |
+
"http": "Hent data fra eksterne APIer og webtjenester via HTTP-forespørsler.\n\nIntegrer med REST-APIer, webhooks og tredjepartstjenester.",
|
| 148 |
+
"template": "Opprett dynamiske dokumenter ved å kombinere tekst med data fra tidligere noder.\n\nGenerer e-poster, rapporter eller formatert innhold ved hjelp av variabelsubstitusjon.",
|
| 149 |
+
"condition": "Legg til betinget logikk for å forgrene arbeidsflyten din basert på dataevaluering.\n\nOpprett hvis-ellers-logikk for å håndtere ulike scenarier og databetingelser."
|
| 150 |
+
},
|
| 151 |
+
"structuredOutputSwitchConfirm": "Du har for øyeblikket strukturert utdata aktivert.\nHva vil du gjøre?",
|
| 152 |
+
"structuredOutputSwitchConfirmOk": "Rediger strukturert utdata",
|
| 153 |
+
"structuredOutputSwitchConfirmCancel": "Bytt til tekstutdata",
|
| 154 |
+
"noTools": "Ingen publiserte arbeidsflyter tilgjengelig.\nOpprett arbeidsflyter for å bygge egendefinerte verktøy.",
|
| 155 |
+
"arrangeNodes": "Automatisk layout",
|
| 156 |
+
"nodesArranged": "Layout anvendt",
|
| 157 |
+
"visibilityUpdated": "Synlighet oppdatert"
|
| 158 |
+
},
|
| 159 |
+
"Auth": {
|
| 160 |
+
"SignIn": {
|
| 161 |
+
"title": "Velkommen tilbake",
|
| 162 |
+
"description": "Logg inn for å fortsette til kontoen din",
|
| 163 |
+
"oauthClientIdNotSet": "{provider} klient-ID er ikke satt",
|
| 164 |
+
"noAccount": "Har du ikke en konto? ",
|
| 165 |
+
"signUp": "Registrer deg",
|
| 166 |
+
"signIn": "Logg inn",
|
| 167 |
+
"orContinueWith": "ELLER FORTSETT MED"
|
| 168 |
+
},
|
| 169 |
+
"SignUp": {
|
| 170 |
+
"title": "Opprett en konto",
|
| 171 |
+
"titleAdmin": "Opprett en administratorkonto",
|
| 172 |
+
"signIn": "Logg inn",
|
| 173 |
+
"email": "E-post",
|
| 174 |
+
"description": "Registrer deg for kontoen din",
|
| 175 |
+
"signUpDescription": "Start reisen din med oss",
|
| 176 |
+
"signUpDescriptionAdmin": "Velkommen, første bruker! Du vil bli administrator for systemet.",
|
| 177 |
+
"signUpInstructionsEmailOnly": "Registrer deg for kontoen din via e-postadressen din",
|
| 178 |
+
"signUpInstructionsEmailAndSocial": "Klikk på «E-post» eller bruk en leverandør for å registrere deg",
|
| 179 |
+
"signUpSocialOnly": "Bruk en leverandør for å registrere deg",
|
| 180 |
+
"step1": "Start reisen din med oss ved å skrive inn e-postadressen din",
|
| 181 |
+
"step2": "Jeg bruker dette navnet når vi chatter",
|
| 182 |
+
"step3": "Opprett et sterkt passord for å sikre kontoen din",
|
| 183 |
+
"signUp": "Registrer deg",
|
| 184 |
+
"invalidEmail": "Ugyldig e-postadresse",
|
| 185 |
+
"emailAlreadyExists": "E-postadressen finnes allerede",
|
| 186 |
+
"nameRequired": "Navn er påkrevd",
|
| 187 |
+
"passwordRequired": "Passord er påkrevd",
|
| 188 |
+
"createAccount": "Opprett konto"
|
| 189 |
+
},
|
| 190 |
+
"Intro": {
|
| 191 |
+
"description": "Velkommen til better-chatbot. Logg inn for å oppleve våre AI-drevne samtaleverktøy."
|
| 192 |
+
}
|
| 193 |
+
},
|
| 194 |
+
"Chat": {
|
| 195 |
+
"Error": "Chatfeil",
|
| 196 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "Denne meldingen ble ikke lagret. Prøv chatten på nytt.",
|
| 197 |
+
"uploadImage": "Last opp fil",
|
| 198 |
+
"generateImage": "Generer bilde",
|
| 199 |
+
"imageUploadedSuccessfully": "Bilde lastet opp",
|
| 200 |
+
"pleaseUploadImageFile": "Vennligst last opp en bildefil",
|
| 201 |
+
"imageSizeMustBeLessThan10MB": "Bildestørrelsen må være under 10 MB",
|
| 202 |
+
"failedToUploadImage": "Kunne ikke laste opp bilde",
|
| 203 |
+
"imageUploadFailedUsingBase64": "Bildeopplasting mislyktes. Bruker base64-koding som reserve.",
|
| 204 |
+
"Greeting": {
|
| 205 |
+
"goodMorning": "God morgen, {name}",
|
| 206 |
+
"goodAfternoon": "God dag, {name}",
|
| 207 |
+
"goodEvening": "God kveld, {name}",
|
| 208 |
+
"niceToSeeYouAgain": "Hyggelig å se deg igjen, {name}",
|
| 209 |
+
"whatAreYouWorkingOnToday": "Hva jobber du med i dag, {name}?",
|
| 210 |
+
"letMeKnowWhenYoureReadyToBegin": "Gi meg beskjed når du er klar til å begynne.",
|
| 211 |
+
"whatAreYourThoughtsToday": "Hva tenker du på i dag?",
|
| 212 |
+
"whereWouldYouLikeToStart": "Hvor vil du begynne?",
|
| 213 |
+
"whatAreYouThinking": "Hva tenker du på, {name}?"
|
| 214 |
+
},
|
| 215 |
+
"TemporaryChat": {
|
| 216 |
+
"toggleTemporaryChat": "Åpne midlertidig chat",
|
| 217 |
+
"temporaryChat": "Midlertidig chat",
|
| 218 |
+
"resetChat": "Tilbakestill chat",
|
| 219 |
+
"thisChatWontBeSaved": "Denne chatten blir ikke lagret.",
|
| 220 |
+
"feelFreeToAskAnythingTemporarily": "Spør om hva som helst midlertidig",
|
| 221 |
+
"temporaryChatInstructions": "Instruksjoner for midlertidig chat",
|
| 222 |
+
"temporaryChatInstructionsPlaceholder": "Skriv inn instruksjonene dine her",
|
| 223 |
+
"temporaryChatInstructionsDescription": "Du kan sette instruksjoner for den midlertidige chatten. Dette vil bli brukt som systemledetekst for den midlertidige chatten."
|
| 224 |
+
},
|
| 225 |
+
"placeholder": "Spør om hva som helst eller @nevn",
|
| 226 |
+
"Tool": {
|
| 227 |
+
"webSearching": "Søker på nettet...",
|
| 228 |
+
"searchedTheWeb": "Søkte på nettet",
|
| 229 |
+
"toolsSetupDescription": "Velg verktøy som chatboten kan bruke.\nChatboten vil bruke valgte verktøy basert på egen vurdering.\n\nDu kan også tvinge bruk av spesifikke verktøy gjennom @nevning.",
|
| 230 |
+
"selectToolMode": "Velg en verktøymodus",
|
| 231 |
+
"autoToolModeDescription": "Bestemmer når verktøy skal brukes uten å spørre deg",
|
| 232 |
+
"manualToolModeDescription": "Ber om tillatelse før bruk av verktøy",
|
| 233 |
+
"noneToolModeDescription": "Ikke bruk verktøy. @nevning er fortsatt tilgjengelig.",
|
| 234 |
+
"toolsSetup": "Verktøyoppsett",
|
| 235 |
+
"preset": "Mal",
|
| 236 |
+
"toolPresets": "Verktøymal",
|
| 237 |
+
"saveAsPreset": "Lagre som mal",
|
| 238 |
+
"saveAsPresetDescription": "Lagre gjeldende verktøykonfigurasjon som en mal.",
|
| 239 |
+
"noPresetsAvailableYet": "Ingen maler tilgjengelig ennå",
|
| 240 |
+
"presetNameCannotBeEmpty": "Navn på mal kan ikke være tomt",
|
| 241 |
+
"presetNameAlreadyExists": "Malen finnes allerede",
|
| 242 |
+
"presetSaved": "Mal lagret",
|
| 243 |
+
"clickSaveAsPresetToGetStarted": "Klikk Lagre som mal for å komme i gang.",
|
| 244 |
+
"searchOptions": "Søkealternativer",
|
| 245 |
+
"searchOptionsDescription": "Du kan sende søkealternativer til chatboten, som maksimalt antall søkeresultater, søkedato osv.",
|
| 246 |
+
"defaultToolKit": {
|
| 247 |
+
"visualization": "Datavisualisering",
|
| 248 |
+
"webSearch": "Søk på nettet",
|
| 249 |
+
"http": "HTTP-forespørsel",
|
| 250 |
+
"code": "Kodekjøring"
|
| 251 |
+
},
|
| 252 |
+
"agent": "Agent",
|
| 253 |
+
"mention": "Nevning",
|
| 254 |
+
"tools": "Verktøy",
|
| 255 |
+
"tooManyToolsSelected": "For mange verktøy valgt, vennligst velg færre enn 128 verktøy",
|
| 256 |
+
"presetNamePlaceholder": "Navn",
|
| 257 |
+
"noMcpServersDetected": "Fant ingen MCP-servere.",
|
| 258 |
+
"addServer": "Legg til en server",
|
| 259 |
+
"error": "feil",
|
| 260 |
+
"authorizationRequired": "Autorisasjon kreves",
|
| 261 |
+
"clickToAuthorize": "Klikk her for å autorisere denne MCP-serveren og få tilgang til verktøyene.",
|
| 262 |
+
"auto": "Auto",
|
| 263 |
+
"manual": "Manuell",
|
| 264 |
+
"none": "Ingen",
|
| 265 |
+
"mentionOnly": "kun @nevning",
|
| 266 |
+
"noToolsAvailable": "Ingen verktøy tilgjengelig"
|
| 267 |
+
},
|
| 268 |
+
"VoiceChat": {
|
| 269 |
+
"title": "Talechat-modus",
|
| 270 |
+
"compactDisplayMode": "Kompakt visningsmodus",
|
| 271 |
+
"conversationDisplayMode": "Samtalevisningsmodus",
|
| 272 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "Vennligst lukk talechatten og prøv igjen.",
|
| 273 |
+
"startConversation": "Start samtale",
|
| 274 |
+
"closeMic": "Slå av mikrofon",
|
| 275 |
+
"openMic": "Slå på mikrofon",
|
| 276 |
+
"endConversation": "Avslutt samtale",
|
| 277 |
+
"toggleVoiceChat": "Åpne talechat",
|
| 278 |
+
"readyWhenYouAreJustStartTalking": "Klar når du er – bare begynn å snakke.",
|
| 279 |
+
"yourMicIsOff": "Mikrofonen din er av.",
|
| 280 |
+
"preparing": "Forbereder...",
|
| 281 |
+
"startVoiceChat": "Starte talechat?"
|
| 282 |
+
},
|
| 283 |
+
"Thread": {
|
| 284 |
+
"chat": "Chat",
|
| 285 |
+
"renameChat": "Gi nytt navn",
|
| 286 |
+
"exportChat": "Del lenke",
|
| 287 |
+
"deleteChat": "Slett chat",
|
| 288 |
+
"deleteUnarchivedChats": "Slett alle uarkiverte chatter",
|
| 289 |
+
"confirmDeleteUnarchivedChats": "Er du sikker på at du vil slette alle uarkiverte chatter?",
|
| 290 |
+
"thisActionCannotBeUndone": "Denne handlingen kan ikke angres.",
|
| 291 |
+
"unarchivedChatsDeleted": "Uarkiverte chatter er slettet",
|
| 292 |
+
"failedToDeleteUnarchivedChats": "Kunne ikke slette uarkiverte chatter",
|
| 293 |
+
"failedToDeleteThread": "Kunne ikke slette chat",
|
| 294 |
+
"threadDeleted": "Chat slettet",
|
| 295 |
+
"failedToUpdateThread": "Kunne ikke oppdatere chat",
|
| 296 |
+
"titleRequired": "Tittel er påkrevd",
|
| 297 |
+
"threadUpdated": "Chat oppdatert",
|
| 298 |
+
"areYouSureYouWantToDeleteThisChatThread": "Er du sikker på at du vil slette denne chatten?",
|
| 299 |
+
"sharePublicLink": "Del offentlig lenke",
|
| 300 |
+
"sharePublicLinkDescription": "Alle meldinger lagt til etter deling forblir private.",
|
| 301 |
+
"creatingLink": "Oppretter lenke...",
|
| 302 |
+
"createLink": "Opprett lenke",
|
| 303 |
+
"linkCopied": "Lenke kopiert"
|
| 304 |
+
},
|
| 305 |
+
"ChatPreferences": {
|
| 306 |
+
"title": "Chatpreferanser",
|
| 307 |
+
"whatShouldWeCallYou": "Hva skal vi kalle deg?",
|
| 308 |
+
"botName": "Assistentnavn",
|
| 309 |
+
"whatBestDescribesYourWork": "Hva beskriver arbeidet ditt best?",
|
| 310 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "Hvilke personlige preferanser bør tas hensyn til i svarene?",
|
| 311 |
+
"responseStyleExample1": "f.eks. hold forklaringer korte og konsise",
|
| 312 |
+
"responseStyleExample2": "f.eks. når jeg lærer nye konsepter, synes jeg analogier er spesielt nyttige",
|
| 313 |
+
"responseStyleExample3": "f.eks. still oppklarende spørsmål før du gir detaljerte svar",
|
| 314 |
+
"responseStyleExample4": "f.eks. husk at jeg primært koder i Python (ikke en nybegynner)",
|
| 315 |
+
"professionExample1": "f.eks. programvareutvikler",
|
| 316 |
+
"professionExample2": "f.eks. produktleder",
|
| 317 |
+
"professionExample3": "f.eks. markedsføringsleder",
|
| 318 |
+
"professionExample4": "f.eks. salgsleder",
|
| 319 |
+
"professionExample5": "f.eks. forretningsanalytiker",
|
| 320 |
+
"preferencesSaved": "Preferanser lagret",
|
| 321 |
+
"failedToSavePreferences": "Kunne ikke lagre preferanser",
|
| 322 |
+
"userInstructions": "Brukerinstruksjoner",
|
| 323 |
+
"userInstructionsDescription": "Introduser deg selv og få et mer personlig svar.",
|
| 324 |
+
"mcpInstructions": "MCP-instruksjoner",
|
| 325 |
+
"mcpInstructionsDescription": "Tilpass MCP-serverinstruksjonene.",
|
| 326 |
+
"userSettings": "Brukerinnstillinger",
|
| 327 |
+
"myExports": "Mine eksporterte chatter",
|
| 328 |
+
"myExportsDescription": "Administrer og organiser dine delte chateksporter.",
|
| 329 |
+
"noExportsYet": "Ingen eksporter ennå",
|
| 330 |
+
"exportHint": "Del en chat for å opprette din første eksport.",
|
| 331 |
+
"exported": "Eksportert",
|
| 332 |
+
"expires": "Utløper",
|
| 333 |
+
"messages": "meldinger",
|
| 334 |
+
"comments": "kommentarer",
|
| 335 |
+
"copyLink": "Kopier lenke",
|
| 336 |
+
"openInNewTab": "Åpne i ny fane",
|
| 337 |
+
"linkCopied": "Lenke kopiert til utklippstavlen",
|
| 338 |
+
"confirmDeleteExport": "Er du sikker på at du vil slette denne eksporten? Denne handlingen kan ikke angres.",
|
| 339 |
+
"exportDeleted": "Eksport slettet",
|
| 340 |
+
"failedToDeleteExport": "Kunne ikke slette eksport"
|
| 341 |
+
}
|
| 342 |
+
},
|
| 343 |
+
"Layout": {
|
| 344 |
+
"workflow": "Arbeidsflyt",
|
| 345 |
+
"admin": "Admin",
|
| 346 |
+
"users": "Brukere",
|
| 347 |
+
"toggleSidebar": "Åpne sidefelt",
|
| 348 |
+
"newChat": "Ny chat",
|
| 349 |
+
"mcpConfiguration": "MCP konfigurasjon",
|
| 350 |
+
"agents": "Agenter",
|
| 351 |
+
"newAgent": "Opprett agent",
|
| 352 |
+
"createAgent": "Opprett en agent",
|
| 353 |
+
"createYourOwnAgent": "Opprett din egen spesialiserte AI-agent med unike funksjoner og personlighet",
|
| 354 |
+
"createYourOwnAgentOrSelectShared": "Opprett din egen spesialiserte AI-agent eller velg fra delte agenter på Agenter-siden",
|
| 355 |
+
"availableAgents": "Tilgjengelige agenter",
|
| 356 |
+
"noAgentsAvailable": "Ingen agenter tilgjengelig",
|
| 357 |
+
"browseAgentsToBookmark": "Bla gjennom tilgjengelige agenter for å bokmerke favorittene dine",
|
| 358 |
+
"askAdminToShareAgents": "Ingen agenter tilgjengelig ennå. Be administratoren din om å dele agenter med deg",
|
| 359 |
+
"whatIsAgent": "Hva er en agent?",
|
| 360 |
+
"agentDescription": "Agenter er spesialiserte AI-assistenter som kan tilpasses med spesifikke roller, instruksjoner og verktøy for å hjelpe deg med ulike oppgaver.",
|
| 361 |
+
"specializedAIAssistant": "Spesialisert AI-assistent",
|
| 362 |
+
"specializedAIAssistantDescription": "Hver agent kan tilpasses med spesifikke roller, personligheter og ekspertiseområder for å gi fokusert hjelp for dine unike behov.",
|
| 363 |
+
"customInstructions": "Egendefinerte instruksjoner",
|
| 364 |
+
"customInstructionsDescription": "Definer detaljerte systemledetekster og atferdsretningslinjer for å forme hvordan agenten din svarer og samhandler med deg.",
|
| 365 |
+
"toolIntegration": "Verktøyintegrasjon",
|
| 366 |
+
"toolIntegrationDescription": "Koble agentene dine til MCP-servere, arbeidsflyter og andre verktøy for å utvide mulighetene deres utover samtale.",
|
| 367 |
+
"agentExamples": "Agenteksempler",
|
| 368 |
+
"businessAssistant": "Forretningsassistent",
|
| 369 |
+
"businessAssistantDescription": "Spesialisert i forretningsanalyse, rapportgenerering og profesjonell kommunikasjon.",
|
| 370 |
+
"creativeWriter": "Kreativ skribent",
|
| 371 |
+
"creativeWriterDescription": "Fokusert på historiefortelling, innholdsproduksjon og kreativ idémyldring.",
|
| 372 |
+
"technicalExpert": "Teknisk ekspert",
|
| 373 |
+
"technicalExpertDescription": "Utstyrt med utviklingsverktøy og kodekompetanse for tekniske oppgaver.",
|
| 374 |
+
"createFirstAgentToStart": "Opprett din første agent for å komme i gang!",
|
| 375 |
+
"today": "I dag",
|
| 376 |
+
"yesterday": "I går",
|
| 377 |
+
"lastWeek": "Siste 7 dager",
|
| 378 |
+
"older": "Eldre",
|
| 379 |
+
"recentChats": "Nylige chatter",
|
| 380 |
+
"deleteAllChats": "Slett alle chatter",
|
| 381 |
+
"deleteUnarchivedChats": "Slett uarkiverte chatter",
|
| 382 |
+
"noConversationsYet": "Ingen chatter enda",
|
| 383 |
+
"deletingAllChats": "Sletter alle chatter...",
|
| 384 |
+
"deletingUnarchivedChats": "Sletter uarkiverte chatter...",
|
| 385 |
+
"allChatsDeleted": "Alle chatter slettet",
|
| 386 |
+
"unarchivedChatsDeleted": "Uarkiverte chatter slettet",
|
| 387 |
+
"failedToDeleteAllChats": "Kunne ikke slette alle chatter",
|
| 388 |
+
"failedToDeleteUnarchivedChats": "Kunne ikke slette uarkiverte chatter",
|
| 389 |
+
"chatPreferences": "Chatpreferanser",
|
| 390 |
+
"keyboardShortcuts": "Tastatursnarveier",
|
| 391 |
+
"theme": "Tema",
|
| 392 |
+
"signOut": "Logg ut",
|
| 393 |
+
"language": "Språk",
|
| 394 |
+
"showAllChats": "Vis alle chatter",
|
| 395 |
+
"showLessChats": "Vis færre",
|
| 396 |
+
"reportAnIssue": "Rapporter et problem",
|
| 397 |
+
"joinCommunity": "Bli med i fellesskapet",
|
| 398 |
+
"userSettings": "Brukerinnstillinger"
|
| 399 |
+
},
|
| 400 |
+
"Archive": {
|
| 401 |
+
"title": "Arkiv",
|
| 402 |
+
"addArchive": "Legg til arkiv",
|
| 403 |
+
"archiveName": "Arkivnavn",
|
| 404 |
+
"archiveDescription": "Arkivbeskrivelse",
|
| 405 |
+
"archiveDescriptionPlaceholder": "Arkiver er steder for å lagre chathistorikk.",
|
| 406 |
+
"noArchives": "Ingen arkiver",
|
| 407 |
+
"createFirstArchive": "Opprett ditt første arkiv",
|
| 408 |
+
"archiveCreated": "Arkiv opprettet",
|
| 409 |
+
"archiveUpdated": "Arkiv oppdatert",
|
| 410 |
+
"archiveDeleted": "Arkiv slettet",
|
| 411 |
+
"failedToCreateArchive": "Kunne ikke opprette arkiv",
|
| 412 |
+
"failedToUpdateArchive": "Kunne ikke oppdatere arkiv",
|
| 413 |
+
"failedToDeleteArchive": "Kunne ikke slette arkiv",
|
| 414 |
+
"editArchive": "Rediger arkiv",
|
| 415 |
+
"editArchiveDescription": "Rediger arkivinformasjon",
|
| 416 |
+
"deleteArchive": "Slett arkiv",
|
| 417 |
+
"confirmDeleteArchive": "Er du sikker på at du vil slette dette arkivet?",
|
| 418 |
+
"deleteArchiveDescription": "Dette arkivet og alle elementene i det vil bli permanent slettet. Denne handlingen kan ikke angres.",
|
| 419 |
+
"addToArchive": "Legg til i arkiv",
|
| 420 |
+
"removeFromArchive": "Fjern fra arkiv",
|
| 421 |
+
"itemAddedToArchive": "Element lagt til i arkiv",
|
| 422 |
+
"itemRemovedFromArchive": "Element fjernet fra arkiv"
|
| 423 |
+
},
|
| 424 |
+
"Agent": {
|
| 425 |
+
"title": "Agent",
|
| 426 |
+
"newAgent": "Opprett agent",
|
| 427 |
+
"generatingAgent": "Genererer agent...",
|
| 428 |
+
"agentNameAndIconLabel": "Gi agenten din et navn og ikon.",
|
| 429 |
+
"agentDescriptionLabel": "Legg til en kort beskrivelse av hva denne agenten gjør.",
|
| 430 |
+
"agentDescriptionPlaceholder": "Dette er bare en beskrivelse av agenten. Den er ikke påkrevd.",
|
| 431 |
+
"agentSettingsDescription": "Herfra er dette innstillinger som kan påvirke agenten.",
|
| 432 |
+
"thisAgentIs": "Denne agenten er en ekspert på",
|
| 433 |
+
"expertIn": "",
|
| 434 |
+
"agentRolePlaceholder": "aksjeanalyse",
|
| 435 |
+
"agentInstructionsLabel": "Skriv gjerne agentens rolle, personlighet, retningslinjer, kunnskap osv.",
|
| 436 |
+
"agentInstructionsPlaceholder": "Denne agenten hjelper med aksjeanalyse. Den bruker nettsøkverktøy for å hente aksjeinformasjon...",
|
| 437 |
+
"agentToolsLabel": "Legg til verktøy som denne agenten kan bruke.",
|
| 438 |
+
"loadingTools": "Laster verktøy...",
|
| 439 |
+
"addTools": "Vennligst legg til verktøy.",
|
| 440 |
+
"generateAgentGreeting": "Hei! Jeg hjelper deg med å opprette din egen agent. Hva vil du lage?",
|
| 441 |
+
"generateAgentDetailedGreeting": "Hei! Jeg hjelper deg med å opprette din egen agent. Hva vil du lage? Du kan skrive kort eller detaljert.",
|
| 442 |
+
"inputPromptHere": "skriv ledetekst her...",
|
| 443 |
+
"agentNamePlaceholder": "bedre-agent",
|
| 444 |
+
"myAgents": "Mine agenter",
|
| 445 |
+
"bookmarkedAgents": "Bokmerkede agenter",
|
| 446 |
+
"sharedAgents": "Delte agenter",
|
| 447 |
+
"availableAgents": "Tilgjengelige agenter",
|
| 448 |
+
"noAgents": "Ingen agenter ennå",
|
| 449 |
+
"createFirst": "Opprett din første agent for å komme i gang",
|
| 450 |
+
"noSharedAgents": "Ingen delte agenter",
|
| 451 |
+
"noSharedAgentsDescription": "Ingen offentlige agenter er tilgjengelige for bokmerking",
|
| 452 |
+
"noAvailableAgents": "Ingen tilgjengelige agenter",
|
| 453 |
+
"noAvailableAgentsDescription": "Be administratoren din om å dele agenter med deg",
|
| 454 |
+
"noDescription": "Ingen beskrivelse gitt",
|
| 455 |
+
"bookmarkAdded": "Agent bokmerket",
|
| 456 |
+
"bookmarkRemoved": "Bokmerke fjernet",
|
| 457 |
+
"bookmarkedAgent": "Bokmerket agent",
|
| 458 |
+
"addBookmark": "Bokmerk agent",
|
| 459 |
+
"removeBookmark": "Fjern bokmerke",
|
| 460 |
+
"visibilityUpdated": "Synlighet oppdatert",
|
| 461 |
+
"deleted": "Agent slettet",
|
| 462 |
+
"created": "Agent opprettet",
|
| 463 |
+
"updated": "Agent oppdatert",
|
| 464 |
+
"deleteConfirm": "Er du sikker på at du vil slette denne agenten?",
|
| 465 |
+
"makePrivate": "Gjør privat",
|
| 466 |
+
"makeReadonly": "Gjør skrivebeskyttet",
|
| 467 |
+
"makePublic": "Gjør offentlig",
|
| 468 |
+
"visibility": "Synlighet",
|
| 469 |
+
"private": "Privat",
|
| 470 |
+
"readOnly": "Skrivebeskyttet",
|
| 471 |
+
"public": "Offentlig",
|
| 472 |
+
"privateDescription": "Bare du kan se, redigere og bruke denne agenten.",
|
| 473 |
+
"readOnlyDescription": "Andre kan se og bruke som verktøy, men bare du kan redigere.",
|
| 474 |
+
"publicDescription": "Alle kan se, redigere og bruke denne agenten som verktøy."
|
| 475 |
+
},
|
| 476 |
+
"KeyboardShortcuts": {
|
| 477 |
+
"title": "Tastatursnarveier",
|
| 478 |
+
"newChat": "Ny chat",
|
| 479 |
+
"toggleTemporaryChat": "Åpne midlertidig chat",
|
| 480 |
+
"toggleSidebar": "Åpne sidefelt",
|
| 481 |
+
"toolMode": "Verktøymodus",
|
| 482 |
+
"lastMessageCopy": "Kopier siste melding",
|
| 483 |
+
"openChatPreferences": "Åpne chatpreferanser",
|
| 484 |
+
"deleteThread": "Slett chat",
|
| 485 |
+
"openShortcutsPopup": "Åpne snarveier-popup",
|
| 486 |
+
"toggleVoiceChat": "Åpne talechat"
|
| 487 |
+
},
|
| 488 |
+
"User": {
|
| 489 |
+
"Profile": {
|
| 490 |
+
"admin": {
|
| 491 |
+
"pageTitle": "Brukeradministrasjon",
|
| 492 |
+
"pageDescription": "Administrer brukerkontoer og tillatelser",
|
| 493 |
+
"sectionTitle": "Brukerinformasjon",
|
| 494 |
+
"sectionDescription": "Oppdater brukerdetaljer og administrer kontoen deres",
|
| 495 |
+
"roles": "Roller",
|
| 496 |
+
"changeRole": "Endre rolle",
|
| 497 |
+
"accountStatus": "Kontostatus",
|
| 498 |
+
"updatePassword": "Tilbakestill passord",
|
| 499 |
+
"saveChanges": "Lagre endringer",
|
| 500 |
+
"deleteUser": "Slett bruker",
|
| 501 |
+
"dangerZoneDescription": "Irreversible handlinger for denne brukerkontoen",
|
| 502 |
+
"updateSuccess": "Brukerdetaljer oppdatert",
|
| 503 |
+
"updateError": "Kunne ikke oppdatere brukerdetaljer",
|
| 504 |
+
"cannotModifyOwnRole": "Du kan ikke endre din egen rolle",
|
| 505 |
+
"emailCannotBeModifiedSSO": "E-post kan ikke endres for SSO-brukere",
|
| 506 |
+
"userDetailDescription": "Administrer brukerinformasjon, tillatelser og kontoinnstillinger",
|
| 507 |
+
"accessCardDescription": "Administrer brukertillatelser, kontostatus og sikkerhetsinnstillinger",
|
| 508 |
+
"userDetailsCardDescription": "Oppdater brukerinformasjon og vis kontodetaljer",
|
| 509 |
+
"aiModelUsageFor": "AI-modellbruk for {period}",
|
| 510 |
+
"noAiActivityDescription": "Denne brukeren har ikke samhandlet med AI-modeller de siste 30 dagene.",
|
| 511 |
+
"usageStatsWillAppear": "Bruksstatistikk vil vises her når de begynner å chatte med AI-assistenter.",
|
| 512 |
+
"emailCannotBeModifiedOAuth": "E-post kan ikke endres for OAuth-brukere",
|
| 513 |
+
"deleteUserPermanently": "Fjern denne brukeren og alle tilknyttede data permanent",
|
| 514 |
+
"userBannedDescription": "Brukeren er for øyeblikket utestengt fra applikasjonen",
|
| 515 |
+
"clickToChangeUserRole": "Klikk for å endre brukerrolle",
|
| 516 |
+
"userHasPassword": "Brukeren har et passord satt",
|
| 517 |
+
"userOAuthOnly": "Brukeren logger kun inn med OAuth",
|
| 518 |
+
"clickToEdit": "Klikk for å redigere {field}",
|
| 519 |
+
"changeUserPassword": "Dette vil endre brukerens passord.",
|
| 520 |
+
"viewUserSessionsAndAccess": "Vis brukerøkter og tilgang",
|
| 521 |
+
"deleteUserTitle": "Slett brukerkonto",
|
| 522 |
+
"deleteUserDescription": "Du er i ferd med å permanent slette {name}s konto. Denne handlingen kan ikke angres.",
|
| 523 |
+
"actionWillPermanently": "Denne handlingen vil permanent:",
|
| 524 |
+
"deleteAllUserData": "Slette alle brukerdata og samtaler",
|
| 525 |
+
"removeAllFiles": "Fjerne alle tilknyttede filer og preferanser",
|
| 526 |
+
"revokeAllAccess": "Oppheve alle tilgangstillatelser",
|
| 527 |
+
"cannotBeUndone": "Kan ikke angres eller gjenopprettes",
|
| 528 |
+
"typeNameToConfirm": "Vennligst skriv inn brukerens navn for å bekrefte: {name}",
|
| 529 |
+
"typeToConfirm": "Skriv «{name}» for å bekrefte",
|
| 530 |
+
"roleUpdatedSuccessfully": "Rolle oppdatert",
|
| 531 |
+
"failedToUpdateRole": "Kunne ikke oppdatere rolle",
|
| 532 |
+
"changeUserRoles": "Endre brukerrolle",
|
| 533 |
+
"selectRolesFor": "Velg roller for {name}",
|
| 534 |
+
"banUser": "Utesteng bruker",
|
| 535 |
+
"unbanUser": "Opphev utestengning",
|
| 536 |
+
"banning": "Utestenger...",
|
| 537 |
+
"unbanning": "Opphever utestengning...",
|
| 538 |
+
"banUserConfirmation": "Er du sikker på at du vil utestenge {name}? De vil miste tilgang til applikasjonen.",
|
| 539 |
+
"unbanUserConfirmation": "Er du sikker på at du vil oppheve utestengningen for {name}? De vil få tilbake tilgang til applikasjonen.",
|
| 540 |
+
"clickToBanUser": "Klikk for å utestenge bruker",
|
| 541 |
+
"clickToUnbanUser": "Klikk for å oppheve utestengning",
|
| 542 |
+
"failedToUpdateUserStatus": "Kunne ikke oppdatere brukerstatus",
|
| 543 |
+
"updatePasswordTitle": "Oppdater brukerpassord",
|
| 544 |
+
"passwordUpdatedSuccessfully": "Brukerpassord oppdatert",
|
| 545 |
+
"failedToUpdatePassword": "Kunne ikke oppdatere brukerpassord",
|
| 546 |
+
"newPasswordPlaceholder": "Nytt passord for bruker",
|
| 547 |
+
"currentPassword": "Nåværende passord",
|
| 548 |
+
"confirmPassword": "Bekreft nytt passord",
|
| 549 |
+
"updatePasswordButton": "Oppdater passord",
|
| 550 |
+
"updateRole": "Oppdater rolle",
|
| 551 |
+
"userDeletedSuccessfully": "Bruker slettet",
|
| 552 |
+
"failedToDeleteUser": "Kunne ikke slette bruker"
|
| 553 |
+
},
|
| 554 |
+
"user": {
|
| 555 |
+
"pageTitle": "Min profil",
|
| 556 |
+
"pageDescription": "Administrer kontoinnstillingene dine",
|
| 557 |
+
"sectionTitle": "Profilinformasjon",
|
| 558 |
+
"sectionDescription": "Oppdater din personlige informasjon",
|
| 559 |
+
"roles": "Mine roller",
|
| 560 |
+
"changeRole": "Be om rolleendring",
|
| 561 |
+
"accountStatus": "Min kontostatus",
|
| 562 |
+
"updatePassword": "Endre passord",
|
| 563 |
+
"saveChanges": "Lagre profil",
|
| 564 |
+
"deleteUser": "Slett min konto",
|
| 565 |
+
"dangerZoneDescription": "Permanente handlinger for kontoen din",
|
| 566 |
+
"updateSuccess": "Profilen din er oppdatert",
|
| 567 |
+
"updateError": "Kunne ikke oppdatere profilen din",
|
| 568 |
+
"cannotModifyOwnRole": "Kontakt en administrator for å endre rollen din",
|
| 569 |
+
"emailCannotBeModifiedSSO": "E-posten din administreres av SSO-leverandøren din",
|
| 570 |
+
"userDetailDescription": "Administrer din informasjon, tillatelser og kontoinnstillinger",
|
| 571 |
+
"accessCardDescription": "Administrer dine tillatelser, kontostatus og sikkerhetsinnstillinger",
|
| 572 |
+
"userDetailsCardDescription": "Oppdater din informasjon og vis kontodetaljer",
|
| 573 |
+
"aiModelUsageFor": "Din AI-modellbruk for {period}",
|
| 574 |
+
"noAiActivityDescription": "Du har ikke samhandlet med AI-modeller de siste 30 dagene.",
|
| 575 |
+
"usageStatsWillAppear": "Bruksstatistikk vil vises her når du begynner å chatte med AI-assistenter.",
|
| 576 |
+
"emailCannotBeModifiedOAuth": "E-posten din kan ikke endres for OAuth-kontoer",
|
| 577 |
+
"deleteUserPermanently": "Fjern kontoen din og alle tilknyttede data permanent",
|
| 578 |
+
"userBannedDescription": "Kontoen din er for øyeblikket utestengt fra applikasjonen",
|
| 579 |
+
"clickToChangeUserRole": "Kontakt en administrator for å endre rollen din",
|
| 580 |
+
"userHasPassword": "Du har et passord satt",
|
| 581 |
+
"userOAuthOnly": "Du logger kun inn med OAuth",
|
| 582 |
+
"clickToEdit": "Klikk for å redigere {field}",
|
| 583 |
+
"changeUserPassword": "Dette vil endre passordet ditt.",
|
| 584 |
+
"viewUserSessionsAndAccess": "Vis dine økter og tilgang",
|
| 585 |
+
"deleteUserTitle": "Slett min konto",
|
| 586 |
+
"deleteUserDescription": "Du er i ferd med å permanent slette kontoen din. Denne handlingen kan ikke angres.",
|
| 587 |
+
"actionWillPermanently": "Denne handlingen vil permanent:",
|
| 588 |
+
"deleteAllUserData": "Slette alle dine data og samtaler",
|
| 589 |
+
"removeAllFiles": "Fjerne alle dine tilknyttede filer og preferanser",
|
| 590 |
+
"revokeAllAccess": "Oppheve alle dine tilgangstillatelser",
|
| 591 |
+
"cannotBeUndone": "Kan ikke angres eller gjenopprettes",
|
| 592 |
+
"typeNameToConfirm": "Vennligst skriv inn navnet ditt for å bekrefte: {name}",
|
| 593 |
+
"typeToConfirm": "Skriv «{name}» for å bekrefte",
|
| 594 |
+
"roleUpdatedSuccessfully": "Rollen din er oppdatert",
|
| 595 |
+
"failedToUpdateRole": "Kunne ikke oppdatere rollen din",
|
| 596 |
+
"changeUserRoles": "Be om rolleendring",
|
| 597 |
+
"selectRolesFor": "Velg din nye rolle",
|
| 598 |
+
"banUser": "Utesteng min konto",
|
| 599 |
+
"unbanUser": "Opphev utestengning av min konto",
|
| 600 |
+
"banning": "Utestenger...",
|
| 601 |
+
"unbanning": "Opphever utestengning...",
|
| 602 |
+
"banUserConfirmation": "Er du sikker på at du vil utestenge kontoen din? Du vil miste tilgang til applikasjonen.",
|
| 603 |
+
"unbanUserConfirmation": "Er du sikker på at du vil oppheve utestengningen av kontoen din? Du vil få tilbake tilgang til applikasjonen.",
|
| 604 |
+
"clickToBanUser": "Klikk for å utestenge kontoen din",
|
| 605 |
+
"clickToUnbanUser": "Klikk for å oppheve utestengning av kontoen din",
|
| 606 |
+
"failedToUpdateUserStatus": "Kunne ikke oppdatere kontostatusen din",
|
| 607 |
+
"updatePasswordTitle": "Endre mitt passord",
|
| 608 |
+
"passwordUpdatedSuccessfully": "Passordet ditt er oppdatert",
|
| 609 |
+
"failedToUpdatePassword": "Kunne ikke oppdatere passordet ditt",
|
| 610 |
+
"newPasswordPlaceholder": "Nytt passord",
|
| 611 |
+
"currentPassword": "Nåværende passord",
|
| 612 |
+
"confirmPassword": "Bekreft nytt passord",
|
| 613 |
+
"updatePasswordButton": "Endre passord",
|
| 614 |
+
"updateRole": "Oppdater rolle",
|
| 615 |
+
"userDeletedSuccessfully": "Bruker slettet",
|
| 616 |
+
"failedToDeleteUser": "Kunne ikke slette bruker"
|
| 617 |
+
},
|
| 618 |
+
"common": {
|
| 619 |
+
"details": "Detaljer",
|
| 620 |
+
"statistics": "Statistikk",
|
| 621 |
+
"dangerZone": "Faresone",
|
| 622 |
+
"joined": "Ble med",
|
| 623 |
+
"lastUpdated": "Sist oppdatert",
|
| 624 |
+
"active": "Aktiv",
|
| 625 |
+
"banned": "Utestengt",
|
| 626 |
+
"name": "Navn",
|
| 627 |
+
"email": "E-post",
|
| 628 |
+
"required": "Påkrevd",
|
| 629 |
+
"you": "Deg",
|
| 630 |
+
"saving": "Lagrer...",
|
| 631 |
+
"accessAndAccount": "Tilgang og konto",
|
| 632 |
+
"editRoles": "Rediger roller",
|
| 633 |
+
"security": "Sikkerhet",
|
| 634 |
+
"passwordManagement": "Passordadministrasjon",
|
| 635 |
+
"userDetailsCardTitle": "Brukerdetaljer",
|
| 636 |
+
"usageStatistics": "Bruksstatistikk",
|
| 637 |
+
"noAiActivityYet": "Ingen AI-aktivitet ennå",
|
| 638 |
+
"totalTokens": "Totalt antall tokens",
|
| 639 |
+
"models": "Modeller",
|
| 640 |
+
"messages": "Meldinger",
|
| 641 |
+
"topModelsByTokenUsage": "Toppmodeller etter tokenbruk",
|
| 642 |
+
"conversations": "Samtaler",
|
| 643 |
+
"avgTokensPerMessage": "Gj.sn. tokens/melding",
|
| 644 |
+
"topModel": "Toppmodell",
|
| 645 |
+
"summary": "Sammendrag",
|
| 646 |
+
"tokensAcross": "{tokens} tokens på tvers av {count} modell{count, plural, =1 {} other {er}} i {period}.",
|
| 647 |
+
"mostActive": "Mest aktiv: {model} ({tokens} tokens).",
|
| 648 |
+
"summaryPrefix": "📊 Sammendrag: ",
|
| 649 |
+
"uploadPhoto": "Last opp bilde",
|
| 650 |
+
"chooseDefault": "Velg standard",
|
| 651 |
+
"useEmoji": "Bruk emoji",
|
| 652 |
+
"generateWithAI": "Generer med AI",
|
| 653 |
+
"changeProfilePhoto": "Endre profilbilde",
|
| 654 |
+
"selectDefaultAvatar": "Velg standardavatar",
|
| 655 |
+
"selectDefaultAvatarDescription": "Velg en av standardavaterene nedenfor",
|
| 656 |
+
"chooseEmojiAvatar": "Velg emoji-avatar",
|
| 657 |
+
"chooseEmojiAvatarDescription": "Velg en emoji som profilbilde",
|
| 658 |
+
"generateAvatarWithAI": "Generer avatar med AI",
|
| 659 |
+
"generateAvatarWithAIDescription": "Beskriv ditt ideelle profilbilde og la AI lage det",
|
| 660 |
+
"aiProvider": "AI-leverandør",
|
| 661 |
+
"describeYourAvatar": "Beskriv avataren din",
|
| 662 |
+
"avatarPromptPlaceholder": "f.eks. en søt valp i Studio Ghibli-stil",
|
| 663 |
+
"generating": "Genererer...",
|
| 664 |
+
"regenerate": "Generer på nytt",
|
| 665 |
+
"useThisAvatar": "Bruk denne avataren",
|
| 666 |
+
"profilePhotoUpdatedSuccessfully": "Profilbilde oppdatert",
|
| 667 |
+
"failedToUpdateProfilePhoto": "Kunne ikke oppdatere profilbilde",
|
| 668 |
+
"pleaseEnterPrompt": "Vennligst skriv inn en ledetekst",
|
| 669 |
+
"imageGeneratedSuccessfully": "Bilde generert!",
|
| 670 |
+
"failedToGenerateImage": "Kunne ikke generere bilde",
|
| 671 |
+
"failedToSaveImage": "Kunne ikke lagre bilde",
|
| 672 |
+
"pleaseUploadValidImage": "Vennligst last opp et gyldig bilde (JPEG, PNG eller WebP)",
|
| 673 |
+
"imageSizeMustBeLessThan": "Bildestørrelsen må være under 5 MB",
|
| 674 |
+
"select": "Velg",
|
| 675 |
+
"msgs": "mld.",
|
| 676 |
+
"unknown": "Ukjent",
|
| 677 |
+
"passwordUpdatedSuccessfully": "Passord oppdatert",
|
| 678 |
+
"failedToUpdatePassword": "Kunne ikke oppdatere passord",
|
| 679 |
+
"confirmPassword": "Bekreft passord",
|
| 680 |
+
"failedToUpdateUserStatus": "Kunne ikke oppdatere brukerstatus",
|
| 681 |
+
"clickToBanUser": "Klikk for å utestenge bruker",
|
| 682 |
+
"clickToUnbanUser": "Klikk for å oppheve utestengning",
|
| 683 |
+
"banUser": "Utesteng bruker",
|
| 684 |
+
"unbanUser": "Opphev utestengning",
|
| 685 |
+
"banUserConfirmation": "Er du sikker på at du vil utestenge {name}? Dette vil hindre dem fra å få tilgang til applikasjonen.",
|
| 686 |
+
"unbanUserConfirmation": "Er du sikker på at du vil oppheve utestengningen for {name}? De vil få tilbake tilgang til applikasjonen.",
|
| 687 |
+
"banning": "Utestenger...",
|
| 688 |
+
"unbanning": "Opphever utestengning...",
|
| 689 |
+
"areYouSure": "Er du sikker?",
|
| 690 |
+
"changeUserPassword": "Dette vil endre brukerens passord.",
|
| 691 |
+
"currentPassword": "Nåværende passord",
|
| 692 |
+
"newPasswordPlaceholder": "Nytt passord (8-20 tegn, stor bokstav, liten bokstav, tall, spesialtegn)",
|
| 693 |
+
"updatePasswordButton": "Oppdater passord",
|
| 694 |
+
"activeSessions": "Aktive økter",
|
| 695 |
+
"viewUserSessionsAndAccess": "Vis brukerøkter og tilgang",
|
| 696 |
+
"deleteUserDescription": "Du er i ferd med å permanent slette kontoen din. Denne handlingen kan ikke angres.",
|
| 697 |
+
"noActiveSessions": "Ingen aktive økter",
|
| 698 |
+
"created": "Opprettet",
|
| 699 |
+
"expires": "Utløper",
|
| 700 |
+
"ipAddress": "IP-adresse",
|
| 701 |
+
"userAgent": "User agent",
|
| 702 |
+
"notAvailable": "Ikke tilgjengelig",
|
| 703 |
+
"userNotFound": "Bruker ikke funnet",
|
| 704 |
+
"userDetailsUpdatedSuccessfully": "Brukerdetaljer oppdatert",
|
| 705 |
+
"failedToUpdateUserDetails": "Kunne ikke oppdatere brukerdetaljer",
|
| 706 |
+
"userHasNoPasswordAccount": "Brukeren har ingen passordbasert konto",
|
| 707 |
+
"cannotBanUnbanYourself": "Du kan ikke utestenge/oppheve utestengning av deg selv",
|
| 708 |
+
"userBannedSuccessfully": "Bruker utestengt",
|
| 709 |
+
"userUnbannedSuccessfully": "Utestengning opphevet",
|
| 710 |
+
"bannedByAdmin": "Utestengt av administrator",
|
| 711 |
+
"unknownError": "Ukjent feil",
|
| 712 |
+
"userDeletedSuccessfully": "Bruker slettet",
|
| 713 |
+
"failedToDeleteUser": "Kunne ikke slette bruker"
|
| 714 |
+
}
|
| 715 |
+
}
|
| 716 |
+
},
|
| 717 |
+
"Admin": {
|
| 718 |
+
"title": "Admin",
|
| 719 |
+
"Sidebar": {
|
| 720 |
+
"users": "Brukere",
|
| 721 |
+
"toggleSidebar": "Åpne sidefelt",
|
| 722 |
+
"adminPanel": "Adminpanel",
|
| 723 |
+
"backToApp": "Tilbake til appen"
|
| 724 |
+
},
|
| 725 |
+
"Users": {
|
| 726 |
+
"title": "Brukere",
|
| 727 |
+
"allUsers": "Alle brukere",
|
| 728 |
+
"viewAndManageUsers": "Vis og administrer brukerkontoer",
|
| 729 |
+
"searchPlaceholder": "Søk etter navn eller e-post...",
|
| 730 |
+
"clear": "Tøm",
|
| 731 |
+
"noUsersFound": "Ingen brukere funnet",
|
| 732 |
+
"youBadge": "Du",
|
| 733 |
+
"totalCount": "{count} bruker{count, plural, =1 {} other {e}} totalt",
|
| 734 |
+
"user": "Bruker",
|
| 735 |
+
"role": "Rolle",
|
| 736 |
+
"status": "Status",
|
| 737 |
+
"joined": "Ble med",
|
| 738 |
+
"backToUsers": "Tilbake til brukere"
|
| 739 |
+
},
|
| 740 |
+
"UserDelete": {
|
| 741 |
+
"title": "Slett brukerkonto",
|
| 742 |
+
"description": "Du er i ferd med å permanent slette {name}s konto. Denne handlingen kan ikke angres.",
|
| 743 |
+
"actionWillPermanently": "Denne handlingen vil permanent:",
|
| 744 |
+
"deleteAllUserData": "Slette alle brukerdata og samtaler",
|
| 745 |
+
"removeAllFiles": "Fjerne alle tilknyttede filer og preferanser",
|
| 746 |
+
"revokeAllAccess": "Oppheve alle tilgangstillatelser",
|
| 747 |
+
"cannotBeUndone": "Kan ikke angres eller gjenopprettes",
|
| 748 |
+
"typeNameToConfirm": "Vennligst skriv inn brukerens navn for å bekrefte: {name}",
|
| 749 |
+
"typeToConfirm": "Skriv «{name}» for å bekrefte",
|
| 750 |
+
"userDeletedSuccessfully": "Bruker slettet",
|
| 751 |
+
"failedToDeleteUser": "Kunne ikke slette bruker"
|
| 752 |
+
},
|
| 753 |
+
"UserRoles": {
|
| 754 |
+
"changeUserRoles": "Endre brukerroller",
|
| 755 |
+
"selectRolesFor": "Velg roller for {name}. For øyeblikket kan brukere bare ha én rolle.",
|
| 756 |
+
"updateRole": "Oppdater rolle",
|
| 757 |
+
"roleUpdatedSuccessfully": "Rolle oppdatert",
|
| 758 |
+
"failedToUpdateRole": "Kunne ikke oppdatere rolle",
|
| 759 |
+
"cannotUpdateOwnRole": "Du kan ikke oppdatere din egen rolle",
|
| 760 |
+
"roleUpdatedSuccessfullyTo": "Brukerrolle oppdatert til {role}"
|
| 761 |
+
}
|
| 762 |
+
},
|
| 763 |
+
"MCP": {
|
| 764 |
+
"marketplace": "Markedsplass",
|
| 765 |
+
"addMcpServer": "Legg til server",
|
| 766 |
+
"configureYourMcpServerConnectionSettings": "Konfigurer MCP-serverens tilkoblingsinnstillinger",
|
| 767 |
+
"mcpConfiguration": "MCP konfigurasjon",
|
| 768 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "Navnet kan bare inneholde alfanumeriske tegn (A-Z, a-z, 0-9) og bindestreker (-)",
|
| 769 |
+
"nameIsRequired": "Navn er påkrevd",
|
| 770 |
+
"configurationSavedSuccessfully": "Konfigurasjon lagret",
|
| 771 |
+
"enterMcpServerName": "Skriv inn MCP-servernavn",
|
| 772 |
+
"saveConfiguration": "Lagre konfigurasjon",
|
| 773 |
+
"toolsTest": "Verktøytest",
|
| 774 |
+
"refresh": "Oppdater",
|
| 775 |
+
"delete": "Slett",
|
| 776 |
+
"edit": "Rediger",
|
| 777 |
+
"configuration": "Konfigurasjon",
|
| 778 |
+
"availableTools": "Tilgjengelige verktøy",
|
| 779 |
+
"noToolsAvailable": "Ingen verktøy tilgjengelig",
|
| 780 |
+
"overviewTitle": "Koble til din første server",
|
| 781 |
+
"overviewDescription": "Legg til MCP-servere for å låse opp kraftige AI-integrasjoner",
|
| 782 |
+
"mcpServers": "MCP-servere",
|
| 783 |
+
"availableMcpServers": "Tilgjengelige MCP-servere",
|
| 784 |
+
"noMcpServersAvailable": "Ingen MCP-servere tilgjengelig",
|
| 785 |
+
"noMcpServersAvailableDescription": "Be administratoren din om å konfigurere MCP-servere for deg",
|
| 786 |
+
"myMcpServers": "Mine MCP-servere",
|
| 787 |
+
"featuredMcpServers": "Utvalgte MCP-servere",
|
| 788 |
+
"searchTools": "Søk etter verktøy",
|
| 789 |
+
"detail": "Detaljer",
|
| 790 |
+
"noSchemaPropertiesAvailable": "Ingen skjemaegenskaper tilgjengelig",
|
| 791 |
+
"createInputWithAI": "Opprett inndata med AI",
|
| 792 |
+
"generateExampleInputJSON": "Generer eksempel-JSON for inndata",
|
| 793 |
+
"enterPromptToGenerateExampleInputJSON": "Skriv inn en ledetekst for å generere eksempel-JSON for inndata for det valgte verktøyet.",
|
| 794 |
+
"callTool": "Kall verktøy",
|
| 795 |
+
"customInstructions": "Egendefinerte instruksjoner",
|
| 796 |
+
"serverCustomInstructionsPlaceholder": "Disse linjene vil bli lagt til AI-systemledeteksten når et verktøy fra denne serveren er tilgjengelig.",
|
| 797 |
+
"nameAlreadyExists": "Navnet finnes allerede",
|
| 798 |
+
"additionalInstructions": "Verktøytilpasningsinstruksjoner",
|
| 799 |
+
"inputSchema": "Inndataskjema",
|
| 800 |
+
"toolCustomizationInstructions": "Verktøytilpasningsinstruksjoner vil bli lagt til systemledeteksten når verktøyet er tilgjengelig.\neksempel) Skriv alltid inn e-posten i formatet eksempel@eksempel.com.",
|
| 801 |
+
"mcpServerCustomization": "MCP-tilpasning",
|
| 802 |
+
"mcpServerCustomizationDescription": "MCP-servertilpasningsinstruksjoner vil bli lagt til systemledeteksten når MCP-serveren er tilgjengelig.",
|
| 803 |
+
"toolCustomizationInstructionsPlaceholder": "Verktøytilpasningsinstruksjoner er ikke tilgjengelig.",
|
| 804 |
+
"mcpServerCustomizationPlaceholder": "f.eks. hvis inndataverdien er e-post, skriv alltid inn e-posten i formatet eksempel@eksempel.com.",
|
| 805 |
+
"private": "Privat",
|
| 806 |
+
"privateDescription": "Bare du kan bruke denne MCP-serveren",
|
| 807 |
+
"readonly": "Skrivebeskyttet",
|
| 808 |
+
"readonlyDescription": "Andre kan se, men ikke endre denne MCP-serveren",
|
| 809 |
+
"public": "Offentlig",
|
| 810 |
+
"publicDescription": "Offentlig for alle brukere",
|
| 811 |
+
"featured": "Fremhevet",
|
| 812 |
+
"featuredDescription": "Fremhevet for alle brukere",
|
| 813 |
+
"noInstructions": "Ingen"
|
| 814 |
+
}
|
| 815 |
+
}
|
messages/zh.json
ADDED
|
@@ -0,0 +1,512 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"Common": {
|
| 3 |
+
"cancel": "取消",
|
| 4 |
+
"update": "更新",
|
| 5 |
+
"continue": "继续",
|
| 6 |
+
"success": "成功",
|
| 7 |
+
"delete": "删除",
|
| 8 |
+
"save": "保存",
|
| 9 |
+
"back": "返回",
|
| 10 |
+
"next": "下一步",
|
| 11 |
+
"create": "创建",
|
| 12 |
+
"showLess": "显示更少",
|
| 13 |
+
"showMore": "显示更多",
|
| 14 |
+
"generate": "生成",
|
| 15 |
+
"edit": "编辑",
|
| 16 |
+
"editAgent": "编辑智能体",
|
| 17 |
+
"search": "搜索...",
|
| 18 |
+
"approve": "批准",
|
| 19 |
+
"reject": "拒绝",
|
| 20 |
+
"saving": "保存中...",
|
| 21 |
+
"optional": "可选",
|
| 22 |
+
"deleting": "删除中...",
|
| 23 |
+
"run": "运行",
|
| 24 |
+
"description": "描述",
|
| 25 |
+
"defaultValue": "默认值",
|
| 26 |
+
"empty": "空",
|
| 27 |
+
"required": "必需",
|
| 28 |
+
"options": "选项",
|
| 29 |
+
"status": "状态",
|
| 30 |
+
"result": "结果",
|
| 31 |
+
"startedAt": "开始时间",
|
| 32 |
+
"duration": "持续时间",
|
| 33 |
+
"addOption": "添加选项",
|
| 34 |
+
"tool": "工具",
|
| 35 |
+
"selectTool": "选择工具...",
|
| 36 |
+
"noResults": "无结果。",
|
| 37 |
+
"generateInputWithAI": "用 AI 生成输入",
|
| 38 |
+
"generatingInputWithAI": "正在用 AI 生成输入...",
|
| 39 |
+
"inputGeneratedSuccessfully": "输入生成成功",
|
| 40 |
+
"failedToGenerateInput": "输入生成失败",
|
| 41 |
+
"createWithExample": "用示例创建",
|
| 42 |
+
"generateWithAI": "用 AI 生成",
|
| 43 |
+
"resultsFound": "找到 {count} 个结果",
|
| 44 |
+
"youAreAnExpertIn": "您是{role}专家",
|
| 45 |
+
"sharedBy": "{userName} 分享"
|
| 46 |
+
},
|
| 47 |
+
"Auth": {
|
| 48 |
+
"SignIn": {
|
| 49 |
+
"title": "欢迎回来",
|
| 50 |
+
"description": "登录您的账户以继续",
|
| 51 |
+
"oauthClientIdNotSet": "{provider} 客户端 ID 未设置",
|
| 52 |
+
"noAccount": "没有账户?",
|
| 53 |
+
"signUp": "注册",
|
| 54 |
+
"signIn": "登录",
|
| 55 |
+
"orContinueWith": "或继续使用"
|
| 56 |
+
},
|
| 57 |
+
"SignUp": {
|
| 58 |
+
"title": "创建账户",
|
| 59 |
+
"signIn": "登录",
|
| 60 |
+
"description": "注册您的账户",
|
| 61 |
+
"step1": "通过输入您的邮箱地址开始您的旅程",
|
| 62 |
+
"step2": "我会在聊天时使用这个名字",
|
| 63 |
+
"step3": "创建一个强密码来保护您的账户",
|
| 64 |
+
"signUp": "注册",
|
| 65 |
+
"invalidEmail": "无效的邮箱地址",
|
| 66 |
+
"emailAlreadyExists": "邮箱已存在",
|
| 67 |
+
"nameRequired": "姓名是必需的",
|
| 68 |
+
"passwordRequired": "密码是必需的",
|
| 69 |
+
"createAccount": "创建账户"
|
| 70 |
+
},
|
| 71 |
+
"Intro": {
|
| 72 |
+
"description": "欢迎来到 MCP 聊天机器人。登录以体验我们的 AI 驱动的对话工具。"
|
| 73 |
+
}
|
| 74 |
+
},
|
| 75 |
+
"Chat": {
|
| 76 |
+
"Error": "聊天错误",
|
| 77 |
+
"thisMessageWasNotSavedPleaseTryTheChatAgain": "此消息未保存。请重试聊天。",
|
| 78 |
+
"uploadImage": "上传文件",
|
| 79 |
+
"generateImage": "生成图片",
|
| 80 |
+
"imageUploadedSuccessfully": "图片上传成功",
|
| 81 |
+
"pleaseUploadImageFile": "请上传图片文件",
|
| 82 |
+
"imageSizeMustBeLessThan10MB": "图片大小必须小于10MB",
|
| 83 |
+
"failedToUploadImage": "上传图片失败",
|
| 84 |
+
"imageUploadFailedUsingBase64": "图片上传失败。使用Base64编码发送。",
|
| 85 |
+
"Greeting": {
|
| 86 |
+
"goodMorning": "早上好,{name}",
|
| 87 |
+
"goodAfternoon": "下午好,{name}",
|
| 88 |
+
"goodEvening": "晚上好,{name}",
|
| 89 |
+
"niceToSeeYouAgain": "很高兴再次见到您,{name}",
|
| 90 |
+
"whatAreYouWorkingOnToday": "您今天在做什么,{name}?",
|
| 91 |
+
"letMeKnowWhenYoureReadyToBegin": "准备好开始时请告诉我。",
|
| 92 |
+
"whatAreYourThoughtsToday": "您今天有什么想法?",
|
| 93 |
+
"whereWouldYouLikeToStart": "您想从哪里开始?",
|
| 94 |
+
"whatAreYouThinking": "您在想什么,{name}?"
|
| 95 |
+
},
|
| 96 |
+
"TemporaryChat": {
|
| 97 |
+
"toggleTemporaryChat": "切换临时聊天",
|
| 98 |
+
"temporaryChat": "临时聊天",
|
| 99 |
+
"resetChat": "重置聊天",
|
| 100 |
+
"thisChatWontBeSaved": "此聊天不会被保存。",
|
| 101 |
+
"feelFreeToAskAnythingTemporarily": "请随时临时询问任何问题",
|
| 102 |
+
"temporaryChatInstructions": "临时聊天说明",
|
| 103 |
+
"temporaryChatInstructionsPlaceholder": "在此输入您的说明",
|
| 104 |
+
"temporaryChatInstructionsDescription": "您可以为临时聊天设置说明。这将用作临时聊天的系统提示。"
|
| 105 |
+
},
|
| 106 |
+
"placeholder": "询问任何问题或 @mention",
|
| 107 |
+
"Tool": {
|
| 108 |
+
"webSearching": "正在搜索网络...",
|
| 109 |
+
"searchedTheWeb": "搜索网络",
|
| 110 |
+
"toolModeDescription": "选择工具使用方式:\n• 自动: AI 自动决定何时使用工具\n• 手动: 使用工具前询问许可\n• 无: 禁用所有工具",
|
| 111 |
+
"toolsSetupDescription": "选择聊天机器人可以使用的工具。\n聊天机器人将根据自己的判断使用选定的工具。\n\n您也可以通过 @mention 强制使用特定工具。",
|
| 112 |
+
"selectToolMode": "选择工具模式",
|
| 113 |
+
"autoToolModeDescription": "自动决定何时使用工具,无需询问您",
|
| 114 |
+
"manualToolModeDescription": "在使用任何工具前询问您的许可",
|
| 115 |
+
"noneToolModeDescription": "不使用工具。@mention仍然可用。",
|
| 116 |
+
"toolsSetup": "工具设置",
|
| 117 |
+
"preset": "预设",
|
| 118 |
+
"toolPresets": "工具预设",
|
| 119 |
+
"saveAsPreset": "保存为预设",
|
| 120 |
+
"saveAsPresetDescription": "将当前工具配置保存为预设。",
|
| 121 |
+
"noPresetsAvailableYet": "暂无可用预设",
|
| 122 |
+
"presetNameCannotBeEmpty": "预设名称不能为空",
|
| 123 |
+
"presetNameAlreadyExists": "预设名称已存在",
|
| 124 |
+
"presetSaved": "预设已保存",
|
| 125 |
+
"clickSaveAsPresetToGetStarted": "点击保存为预设开始。",
|
| 126 |
+
"searchOptions": "搜索选项",
|
| 127 |
+
"searchOptionsDescription": "您可以向聊天机器人传递搜索选项,例如搜索结果的最大数量、搜索日期等。",
|
| 128 |
+
"defaultToolKit": {
|
| 129 |
+
"visualization": "数据可视化",
|
| 130 |
+
"webSearch": "网页搜寻"
|
| 131 |
+
},
|
| 132 |
+
"agent": "智能体",
|
| 133 |
+
"mention": "提及",
|
| 134 |
+
"tools": "工具",
|
| 135 |
+
"tooManyToolsSelected": "选择的工具过多,请选择少于128个工具",
|
| 136 |
+
"presetNamePlaceholder": "预设名称",
|
| 137 |
+
"noMcpServersDetected": "未检测到MCP服务器。",
|
| 138 |
+
"addServer": "添加服务器",
|
| 139 |
+
"error": "错误",
|
| 140 |
+
"authorizationRequired": "需要授权",
|
| 141 |
+
"clickToAuthorize": "点击此处授权此MCP服务器并访问其工具。",
|
| 142 |
+
"auto": "自动",
|
| 143 |
+
"manual": "手动",
|
| 144 |
+
"none": "无",
|
| 145 |
+
"mentionOnly": "仅@提及",
|
| 146 |
+
"noToolsAvailable": "无可用工具"
|
| 147 |
+
},
|
| 148 |
+
"VoiceChat": {
|
| 149 |
+
"title": "语音聊天模式",
|
| 150 |
+
"compactDisplayMode": "紧凑显示模式",
|
| 151 |
+
"conversationDisplayMode": "对话显示模式",
|
| 152 |
+
"pleaseCloseTheVoiceChatAndTryAgain": "请关闭语音聊天并重试。",
|
| 153 |
+
"startConversation": "开始对话",
|
| 154 |
+
"closeMic": "关闭麦克风",
|
| 155 |
+
"openMic": "打开麦克风",
|
| 156 |
+
"endConversation": "结束对话",
|
| 157 |
+
"toggleVoiceChat": "切换语音聊天",
|
| 158 |
+
"readyWhenYouAreJustStartTalking": "准备就绪—请开始说话。",
|
| 159 |
+
"yourMicIsOff": "您的麦克风已关闭。",
|
| 160 |
+
"preparing": "准备中...",
|
| 161 |
+
"startVoiceChat": "开始语音聊天?"
|
| 162 |
+
},
|
| 163 |
+
"Thread": {
|
| 164 |
+
"chat": "聊天",
|
| 165 |
+
"renameChat": "重命名",
|
| 166 |
+
"deleteChat": "删除聊天",
|
| 167 |
+
"deleteUnarchivedChats": "删除所有未归档的聊天",
|
| 168 |
+
"confirmDeleteUnarchivedChats": "您确定要删除所有未归档的聊天吗?",
|
| 169 |
+
"thisActionCannotBeUndone": "此操作无法撤销。",
|
| 170 |
+
"unarchivedChatsDeleted": "未归档的聊天已删除",
|
| 171 |
+
"failedToDeleteUnarchivedChats": "删除未归档聊天失败",
|
| 172 |
+
"failedToDeleteThread": "删除线程失败",
|
| 173 |
+
"threadDeleted": "线程已删除",
|
| 174 |
+
"failedToUpdateThread": "更新线程失败",
|
| 175 |
+
"titleRequired": "标题是必需的",
|
| 176 |
+
"threadUpdated": "线程已更新",
|
| 177 |
+
"areYouSureYouWantToDeleteThisChatThread": "您确定要删除此聊天线程吗?",
|
| 178 |
+
"sharePublicLink": "分享公开链接",
|
| 179 |
+
"sharePublicLinkDescription": "分享后添加的所有消息将保持私有。",
|
| 180 |
+
"creatingLink": "正在创建链接...",
|
| 181 |
+
"createLink": "创建链接",
|
| 182 |
+
"linkCopied": "链接已复制"
|
| 183 |
+
},
|
| 184 |
+
"ChatPreferences": {
|
| 185 |
+
"title": "聊天偏好",
|
| 186 |
+
"whatShouldWeCallYou": "我们应该怎么称呼您?",
|
| 187 |
+
"botName": "助手名称",
|
| 188 |
+
"whatBestDescribesYourWork": "什么最能描述您的工作?",
|
| 189 |
+
"whatPersonalPreferencesShouldBeTakenIntoAccountInResponses": "在回应中应该考虑哪些个人偏好?",
|
| 190 |
+
"responseStyleExample1": "例如:保持解释简洁而切题",
|
| 191 |
+
"responseStyleExample2": "例如:学习新概念时,我发现类比特别有用",
|
| 192 |
+
"responseStyleExample3": "例如:在给出详细答案前先询问澄清问题",
|
| 193 |
+
"responseStyleExample4": "例如:记住我主要用 Python 编程(不是编程初学者)",
|
| 194 |
+
"professionExample1": "例如:软件工程师",
|
| 195 |
+
"professionExample2": "例如:产品经理",
|
| 196 |
+
"professionExample3": "例如:营销经理",
|
| 197 |
+
"professionExample4": "例如:销售经理",
|
| 198 |
+
"professionExample5": "例如:业务分析师",
|
| 199 |
+
"preferencesSaved": "偏好已保存",
|
| 200 |
+
"failedToSavePreferences": "保存偏好失败",
|
| 201 |
+
"userInstructions": "用户说明",
|
| 202 |
+
"userInstructionsDescription": "介绍自己并获得更个性化的回应。",
|
| 203 |
+
"mcpInstructions": "MCP 说明",
|
| 204 |
+
"mcpInstructionsDescription": "自定义 MCP 服务器说明。",
|
| 205 |
+
"userSettings": "用户设置"
|
| 206 |
+
}
|
| 207 |
+
},
|
| 208 |
+
"Layout": {
|
| 209 |
+
"toggleSidebar": "切换侧边栏",
|
| 210 |
+
"newChat": "新聊天",
|
| 211 |
+
"mcpConfiguration": "MCP 配置",
|
| 212 |
+
"agents": "智能体",
|
| 213 |
+
"newAgent": "新智能体",
|
| 214 |
+
"createAgent": "创建智能体",
|
| 215 |
+
"createYourOwnAgent": "创建具有独特功能和个性的专业AI智能体",
|
| 216 |
+
"whatIsAgent": "什么是智能体?",
|
| 217 |
+
"agentDescription": "智能体是可以根据特定角色、指令和工具进行定制的专业AI助手,帮助您完成各种任务。",
|
| 218 |
+
"specializedAIAssistant": "专业AI助手",
|
| 219 |
+
"specializedAIAssistantDescription": "每个智能体都可以根据特定角色、个性和专业领域进行定制,为您的独特需求提���专注的协助。",
|
| 220 |
+
"customInstructions": "自定义指令",
|
| 221 |
+
"customInstructionsDescription": "定义详细的系统提示和行为准则,塑造智能体的响应和交互方式。",
|
| 222 |
+
"toolIntegration": "工具集成",
|
| 223 |
+
"toolIntegrationDescription": "将您的智能体连接到MCP服务器、工作流程和其他工具,扩展其超越对话的能力。",
|
| 224 |
+
"agentExamples": "智能体示例",
|
| 225 |
+
"businessAssistant": "商务助手",
|
| 226 |
+
"businessAssistantDescription": "专门从事商业分析、报告生成和专业沟通。",
|
| 227 |
+
"creativeWriter": "创意写手",
|
| 228 |
+
"creativeWriterDescription": "专注于故事讲述、内容创作和创意头脑风暴。",
|
| 229 |
+
"technicalExpert": "技术专家",
|
| 230 |
+
"technicalExpertDescription": "配备开发工具和编码专业知识的技术任务智能体。",
|
| 231 |
+
"createFirstAgentToStart": "创建您的第一个智能体开始吧!",
|
| 232 |
+
"today": "今天",
|
| 233 |
+
"yesterday": "昨天",
|
| 234 |
+
"lastWeek": "最近 7 天",
|
| 235 |
+
"older": "更早",
|
| 236 |
+
"recentChats": "最近聊天",
|
| 237 |
+
"deleteAllChats": "删除所有聊天",
|
| 238 |
+
"deleteUnarchivedChats": "删除未归档聊天",
|
| 239 |
+
"noConversationsYet": "暂无对话",
|
| 240 |
+
"deletingAllChats": "正在删除所有线程...",
|
| 241 |
+
"deletingUnarchivedChats": "正在删除未归档线程...",
|
| 242 |
+
"allChatsDeleted": "所有线程已删除",
|
| 243 |
+
"unarchivedChatsDeleted": "未归档线程已删除",
|
| 244 |
+
"failedToDeleteAllChats": "删除所有线程失败",
|
| 245 |
+
"failedToDeleteUnarchivedChats": "删除未归档线程失败",
|
| 246 |
+
"chatPreferences": "聊天偏好",
|
| 247 |
+
"keyboardShortcuts": "键盘快捷键",
|
| 248 |
+
"theme": "主题",
|
| 249 |
+
"signOut": "登出",
|
| 250 |
+
"language": "语言",
|
| 251 |
+
"showAllChats": "查看所有聊天",
|
| 252 |
+
"showLessChats": "显示更少",
|
| 253 |
+
"reportAnIssue": "报告问题",
|
| 254 |
+
"joinCommunity": "加入社区",
|
| 255 |
+
"workflow": "工作流",
|
| 256 |
+
"userSettings": "用户设置"
|
| 257 |
+
},
|
| 258 |
+
"Archive": {
|
| 259 |
+
"title": "归档",
|
| 260 |
+
"addArchive": "添加归档",
|
| 261 |
+
"archiveName": "归档名称",
|
| 262 |
+
"archiveDescription": "归档描述",
|
| 263 |
+
"archiveDescriptionPlaceholder": "归档是存储聊天记录的空间。",
|
| 264 |
+
"noArchives": "没有归档",
|
| 265 |
+
"createFirstArchive": "创建您的第一个归档",
|
| 266 |
+
"archiveCreated": "归档已创建",
|
| 267 |
+
"archiveUpdated": "归档已更新",
|
| 268 |
+
"archiveDeleted": "归档已删除",
|
| 269 |
+
"failedToCreateArchive": "创建归档失败",
|
| 270 |
+
"failedToUpdateArchive": "更新归档失败",
|
| 271 |
+
"failedToDeleteArchive": "删除归档失败",
|
| 272 |
+
"editArchive": "编辑归档",
|
| 273 |
+
"editArchiveDescription": "编辑归档信息",
|
| 274 |
+
"deleteArchive": "删除归档",
|
| 275 |
+
"confirmDeleteArchive": "您确定要删除这个归档吗?",
|
| 276 |
+
"deleteArchiveDescription": "此归档及其所有项目将被永久删除。此操作无法撤销。",
|
| 277 |
+
"addToArchive": "添加到归档",
|
| 278 |
+
"removeFromArchive": "从归档中移除",
|
| 279 |
+
"itemAddedToArchive": "项目已添加到归档",
|
| 280 |
+
"itemRemovedFromArchive": "项目已从归档中移除"
|
| 281 |
+
},
|
| 282 |
+
"Agent": {
|
| 283 |
+
"title": "智能体",
|
| 284 |
+
"newAgent": "新智能体",
|
| 285 |
+
"generatingAgent": "正在生成智能体...",
|
| 286 |
+
"agentNameAndIconLabel": "为您的智能体设置名称和图标。",
|
| 287 |
+
"agentDescriptionLabel": "添加此智能体用途的简短描述。",
|
| 288 |
+
"agentDescriptionPlaceholder": "这只是对智能体的描述,并不重要。",
|
| 289 |
+
"agentSettingsDescription": "以下是可能影响智能体的设置。",
|
| 290 |
+
"thisAgentIs": "此智能体是",
|
| 291 |
+
"expertIn": "专家。",
|
| 292 |
+
"agentRolePlaceholder": "股票分析",
|
| 293 |
+
"agentInstructionsLabel": "请自由描述此智能体的角色、性格、指导原则、知识等。",
|
| 294 |
+
"agentInstructionsPlaceholder": "此智能体帮助进行股票分析。它使用网络搜索工具来获取股票信息...",
|
| 295 |
+
"agentToolsLabel": "添加此智能体可以使用的工具。",
|
| 296 |
+
"loadingTools": "正在加载工具...",
|
| 297 |
+
"addTools": "请添加工具。",
|
| 298 |
+
"generateAgentGreeting": "您好!我将帮助您创建您自己的智能体。您想创建什么?",
|
| 299 |
+
"generateAgentDetailedGreeting": "您好!我将帮助您创建您自己的智能体。您想创建什么?您可以简要描述或详细描述。",
|
| 300 |
+
"inputPromptHere": "在此输入提示词...",
|
| 301 |
+
"agentNamePlaceholder": "better-agent",
|
| 302 |
+
"myAgents": "我的智能体",
|
| 303 |
+
"sharedAgents": "共享智能体",
|
| 304 |
+
"noAgents": "还没有智能体",
|
| 305 |
+
"createFirst": "创建您的第一个智能体开始使用",
|
| 306 |
+
"noSharedAgents": "没有共享智能体",
|
| 307 |
+
"noSharedAgentsDescription": "没有可书签的公共智能体",
|
| 308 |
+
"noDescription": "未提供描述",
|
| 309 |
+
"bookmarkAdded": "智能体已加入书签",
|
| 310 |
+
"bookmarkRemoved": "书签已移除",
|
| 311 |
+
"bookmarkedAgent": "已收藏的智能体",
|
| 312 |
+
"addBookmark": "收藏智能体",
|
| 313 |
+
"removeBookmark": "移除书签",
|
| 314 |
+
"visibilityUpdated": "可见性已更新",
|
| 315 |
+
"deleted": "智能体已删除",
|
| 316 |
+
"deleteConfirm": "您确定要删除此智能体吗?",
|
| 317 |
+
"makePrivate": "设为私有",
|
| 318 |
+
"makeReadonly": "设为只读",
|
| 319 |
+
"makePublic": "设为公开",
|
| 320 |
+
"visibility": "可见性",
|
| 321 |
+
"private": "私有",
|
| 322 |
+
"readOnly": "只读",
|
| 323 |
+
"public": "公开",
|
| 324 |
+
"privateDescription": "只有您可以查看、编辑和使用此智能体。",
|
| 325 |
+
"readOnlyDescription": "其他人可以查看并作为工具使用,但只有您可以编辑。",
|
| 326 |
+
"publicDescription": "任何人都可以查看、编辑并将此智能体用作工具。"
|
| 327 |
+
},
|
| 328 |
+
"KeyboardShortcuts": {
|
| 329 |
+
"title": "键盘快捷键",
|
| 330 |
+
"newChat": "新聊天",
|
| 331 |
+
"toggleTemporaryChat": "切换临时聊天",
|
| 332 |
+
"toggleSidebar": "切换侧边栏",
|
| 333 |
+
"toolMode": "工具模式",
|
| 334 |
+
"lastMessageCopy": "复制最后一条消息",
|
| 335 |
+
"openChatPreferences": "打开聊天偏好",
|
| 336 |
+
"deleteThread": "删除聊天",
|
| 337 |
+
"openShortcutsPopup": "打开快捷键弹窗",
|
| 338 |
+
"toggleVoiceChat": "切换语音聊天"
|
| 339 |
+
},
|
| 340 |
+
"MCP": {
|
| 341 |
+
"marketplace": "市场",
|
| 342 |
+
"addMcpServer": "添加服务器",
|
| 343 |
+
"configureYourMcpServerConnectionSettings": "配置您的 MCP 服务器连接设置",
|
| 344 |
+
"mcpConfiguration": "MCP 配置",
|
| 345 |
+
"nameMustContainOnlyAlphanumericCharactersAndHyphens": "名称只能包含字母数字字符 (A-Z, a-z, 0-9) 和连字符 (-)",
|
| 346 |
+
"nameIsRequired": "名称是必需的",
|
| 347 |
+
"configurationSavedSuccessfully": "配置保存成功",
|
| 348 |
+
"enterMcpServerName": "输入 MCP 服务器名称",
|
| 349 |
+
"saveConfiguration": "保存配置",
|
| 350 |
+
"toolsTest": "工具测试",
|
| 351 |
+
"refresh": "刷新",
|
| 352 |
+
"delete": "删除",
|
| 353 |
+
"edit": "编辑",
|
| 354 |
+
"configuration": "配置",
|
| 355 |
+
"availableTools": "可用工具",
|
| 356 |
+
"noToolsAvailable": "无可用工具",
|
| 357 |
+
"overviewTitle": "连接您的第一个服务器",
|
| 358 |
+
"overviewDescription": "添加 MCP 服务器以解锁强大的 AI 集成",
|
| 359 |
+
"searchTools": "搜索工具",
|
| 360 |
+
"detail": "详情",
|
| 361 |
+
"noSchemaPropertiesAvailable": "无可用架构属性",
|
| 362 |
+
"createInputWithAI": "用 AI 创建输入",
|
| 363 |
+
"generateExampleInputJSON": "生成示例输入 JSON",
|
| 364 |
+
"enterPromptToGenerateExampleInputJSON": "输入提示为所选工具生成示例输入 JSON。",
|
| 365 |
+
"callTool": "调用工具",
|
| 366 |
+
"customInstructions": "自定义指令",
|
| 367 |
+
"serverCustomInstructionsPlaceholder": "当该服务器的任何工具可用时,这些内容将被添加到系统提示中。",
|
| 368 |
+
"nameAlreadyExists": "名称已存在",
|
| 369 |
+
"additionalInstructions": "工具自定义指令",
|
| 370 |
+
"inputSchema": "输入架构",
|
| 371 |
+
"toolCustomizationInstructions": "工具自定义指令将在工具可用时添加到系统提示中。\n示例)始终以 example@example.com 格式输入电子邮件。",
|
| 372 |
+
"mcpServerCustomization": "MCP 服务器自定义",
|
| 373 |
+
"mcpServerCustomizationDescription": "MCP 服务器自定义指令将在 MCP 服务器可用时添加到系统提示中。",
|
| 374 |
+
"toolCustomizationInstructionsPlaceholder": "工具自定义指令不可用。",
|
| 375 |
+
"mcpServerCustomizationPlaceholder": "例如:如果输入值是电子邮件,始终以 example@example.com 格式输入电子邮件。",
|
| 376 |
+
"noInstructions": "无"
|
| 377 |
+
},
|
| 378 |
+
"Error": {},
|
| 379 |
+
"Info": {
|
| 380 |
+
"mcpAddingDisabled": "管理员已禁用MCP服务器添加功能。",
|
| 381 |
+
"vercelSyncDelay": "在Vercel上运行\n\nMCP更改同步可能需要10-15秒。如果添加、编辑或删除服务器后更改未立即显示,请稍等片刻。"
|
| 382 |
+
},
|
| 383 |
+
"Workflow": {
|
| 384 |
+
"title": "工作流",
|
| 385 |
+
"createWorkflow": "创建工作流",
|
| 386 |
+
"draft": "草稿",
|
| 387 |
+
"publish": "发布",
|
| 388 |
+
"createWorkflowDescription": "为您的聊天机器人创建强大的工具工作流。",
|
| 389 |
+
"workflowDescription": "这些可以在对话中触发以自动化复杂任务。",
|
| 390 |
+
"nameAndIcon": "名称和图标",
|
| 391 |
+
"workflowNamePlaceholder": "聊天机器人将识别此为工具名称",
|
| 392 |
+
"description": "描述",
|
| 393 |
+
"descriptionPlaceholder": "聊天机器人将看到此作为工具描述",
|
| 394 |
+
"inputNodeCannotBeDeleted": "输入节点无法删除",
|
| 395 |
+
"autoSaveDescription": "每10秒自动保存",
|
| 396 |
+
"draftDescription": "当前处于草稿状态。\n\n点击发布使其对聊天机器人可用\n(但不再可编辑)。",
|
| 397 |
+
"publishedDescription": "当前已发布并对聊天机器人可用。\n\n点击草稿使其可编辑\n(但对聊天机器人不可用)。",
|
| 398 |
+
"private": "私有",
|
| 399 |
+
"readonly": "只读",
|
| 400 |
+
"public": "公开",
|
| 401 |
+
"privateDescription": "只有您可以查看、编辑和使用此工作流作为工具。",
|
| 402 |
+
"readonlyDescription": "其他人可以查看和用作工具,但只有您可以编辑。",
|
| 403 |
+
"publicDescription": "任何人都可以查看、编辑和使用此工作流作为工具。",
|
| 404 |
+
"visibilityDescription": "控制谁可以访问和修改此工作流",
|
| 405 |
+
"nodeDescriptionPlaceholder": "节点描述...",
|
| 406 |
+
"nextNode": "下一个节点",
|
| 407 |
+
"nextNodeDescription": "为此工作流添加下一个节点。",
|
| 408 |
+
"addNextNode": "添加下一个节点",
|
| 409 |
+
"inputFields": "输入字段",
|
| 410 |
+
"addInputField": "添加输入字段",
|
| 411 |
+
"inputFieldsDescription": "定义此工作流的参数架构。\n\n当聊天机器人使用此作为工具时,\n它将根据此架构提供值。",
|
| 412 |
+
"fieldEditor": "字段编辑器",
|
| 413 |
+
"variableName": "变量名",
|
| 414 |
+
"variableNamePlaceholder": "输入变量名...",
|
| 415 |
+
"fieldDescriptionPlaceholder": "输入字段描述...",
|
| 416 |
+
"defaultValuePlaceholder": "输入默认 {type} 值...",
|
| 417 |
+
"selectOptionPlaceholder": "选择选项...",
|
| 418 |
+
"unlink": "取消链接节点",
|
| 419 |
+
"elseIfDescription": "如果条件不满足,定义要执行的逻辑。",
|
| 420 |
+
"elseDescription": "如果条件不满足,定义要执行的逻辑。",
|
| 421 |
+
"addCondition": "添加条件",
|
| 422 |
+
"noVariablesFound": "未找到变量",
|
| 423 |
+
"outputVariables": "输出变量",
|
| 424 |
+
"outputVariablesDescription": "从工作流输出的变量。",
|
| 425 |
+
"addOutputVariable": "添加输出变量",
|
| 426 |
+
"outputSchema": "输出架构",
|
| 427 |
+
"addMessage": "添加消息",
|
| 428 |
+
"messagesDescription": "通过 LLM 处理生成数据。\n\n使用 '/' 提及和引用前一个节点的数据作为输入。\n\n启用结构化输出时,非常适合数据转换、格式化和验证。",
|
| 429 |
+
"descriptionAndSchema": "描述和架构",
|
| 430 |
+
"noDescriptionAndSchema": "无描述和架构",
|
| 431 |
+
"toolDescription": "提供 LLM 生成工具参数所需的信息。\n\n使用 '/' 提及前一个节点的数据。",
|
| 432 |
+
"generateInputWithAIDescription": "编写提示为工作流生成输入",
|
| 433 |
+
"example": {
|
| 434 |
+
"babyResearch": "婴儿研究",
|
| 435 |
+
"getWeather": "获取天气"
|
| 436 |
+
},
|
| 437 |
+
"selectVariable": "选择变量",
|
| 438 |
+
"structuredOutput": "结构化输出",
|
| 439 |
+
"structuredOutputDescription": "使用定义的模式生成 JSON 对象响应",
|
| 440 |
+
"outputSchemaEditor": "输出模式编辑器",
|
| 441 |
+
"addField": "添加字段",
|
| 442 |
+
"saveSchema": "保存模式",
|
| 443 |
+
"generateSchemaWithAI": "用 AI 生成模式",
|
| 444 |
+
"describeOutputDataRequest": "提供代表此节点应输出内容的示例 JSON 数据\n\n示例: {eg}",
|
| 445 |
+
"generatingJsonSchemaWithAI": "正在用 AI 生成 JSON 模式...",
|
| 446 |
+
"jsonSchemaGeneratedSuccessfully": "JSON 模式生成成功!",
|
| 447 |
+
"failedToGenerateSchema": "模式生成失败",
|
| 448 |
+
"jsonSchemaEditorDescription": "在 AI 辅助下直接编辑 JSON 模式。支持复杂的嵌套结构和数组。",
|
| 449 |
+
"template": "模板",
|
| 450 |
+
"templateDescription": "生成模板文档。\n\n使用 '/' 引用和使用其他节点的输出值。",
|
| 451 |
+
"kindsDescription": {
|
| 452 |
+
"input": "定义聊天机器人将此工作流用作工具时提供的输入参数。\n\n指定工具执行的数据结构和验证规则。",
|
| 453 |
+
"output": "收集并返回工作流执行的最终结果。\n\n将多个节点的数据合并为最终工具响应。",
|
| 454 |
+
"llm": "使用 AI 模型生成文本或结构化数据。\n\n使用 '/' 提及引用前一个节点的输出,创建上下文感知的响应。\n\n使用结构化输出进行数据转换、格式化和验证 - 不仅仅是文本生成。",
|
| 455 |
+
"tool": "执行 MCP 工具或外部服务。\n\n在消息中写入指令,LLM 将从您的上下文生成所需的工具参数。",
|
| 456 |
+
"note": "添加文档和注释来组织您的工作流逻辑。\n\n帮助团队成员理解复杂的工作流过程。",
|
| 457 |
+
"code": "执行可访问前一个节点数据的自定义代码脚本。\n\n在工作流中运行 JavaScript、Python 或其他语言(即将推出)。",
|
| 458 |
+
"http": "通过 HTTP 请求从外部 API 和 Web 服务获取数据。\n\n与 REST API、webhook 和第三方服务集成。",
|
| 459 |
+
"template": "通过将文本与前一个节点的数据结合来创建动态文档。\n\n使用变量替换生成电子邮件、报告或格式化内容。",
|
| 460 |
+
"condition": "基于数据评估添加条件逻辑来分支您的工作流。\n\n创建 if-else 逻辑来处理不同的场景和数据条件。"
|
| 461 |
+
},
|
| 462 |
+
"greeting": {
|
| 463 |
+
"buildAutomationTitle": "通过连接节点构建自动化",
|
| 464 |
+
"buildAutomationDescription": "连接各种节点来自动化复杂任务。每个节点处理特定功能,数据按顺序流动处理。",
|
| 465 |
+
"chatbotToolTitle": "用作聊天机器人工具",
|
| 466 |
+
"chatbotToolDescription": "工作流的主要目的是在聊天机器人对话中用作工具。将重复性任务转换为工作流,在聊天中轻松执行。",
|
| 467 |
+
"parameterBasedTitle": "️ 基于参数的开始",
|
| 468 |
+
"parameterBasedDescription": "输入节点定义参数结构,而不是触发器。它们指定聊天机器人将此工作流用作工具时所需的数据格式。",
|
| 469 |
+
"exampleTitle": "使用示例",
|
| 470 |
+
"exampleDescription": "创建一个\"邮件编写 → 翻译 → 发送\"工作流,然后在聊天机器人对话中用\"@邮件_工作流\"轻松执行。",
|
| 471 |
+
"availableNodesTitle": "可用节点",
|
| 472 |
+
"upcomingNodesTitle": "即将推出的节点",
|
| 473 |
+
"ctaMessage": "现在就开始创建工作流来扩展您的聊天机器人能力!",
|
| 474 |
+
"soonMessage": "即将推出。"
|
| 475 |
+
},
|
| 476 |
+
"arrangeNodes": "自动布局",
|
| 477 |
+
"nodesArranged": "布局已成功应用",
|
| 478 |
+
"visibilityUpdated": "可见性已成功更新"
|
| 479 |
+
},
|
| 480 |
+
"User": {
|
| 481 |
+
"Profile": {
|
| 482 |
+
"common": {
|
| 483 |
+
"uploadPhoto": "上传照片",
|
| 484 |
+
"chooseDefault": "选择默认",
|
| 485 |
+
"useEmoji": "使用表情符号",
|
| 486 |
+
"generateWithAI": "使用AI生成",
|
| 487 |
+
"changeProfilePhoto": "更改个人资料照片",
|
| 488 |
+
"selectDefaultAvatar": "选择默认头像",
|
| 489 |
+
"selectDefaultAvatarDescription": "从下面选择一个默认头像",
|
| 490 |
+
"chooseEmojiAvatar": "选择表情头像",
|
| 491 |
+
"chooseEmojiAvatarDescription": "选择一个表情符号作为您的个人资料照片",
|
| 492 |
+
"generateAvatarWithAI": "使用AI生成头像",
|
| 493 |
+
"generateAvatarWithAIDescription": "描述您理想的个人资料照片,让AI为您创建",
|
| 494 |
+
"aiProvider": "AI提供商",
|
| 495 |
+
"describeYourAvatar": "描述您的头像",
|
| 496 |
+
"avatarPromptPlaceholder": "例如,吉卜力工作室风格的可爱小狗",
|
| 497 |
+
"generating": "生成中...",
|
| 498 |
+
"regenerate": "重新生成",
|
| 499 |
+
"useThisAvatar": "使用此头像",
|
| 500 |
+
"profilePhotoUpdatedSuccessfully": "个人资料照片已成功更新",
|
| 501 |
+
"failedToUpdateProfilePhoto": "更新个人资料照片失败",
|
| 502 |
+
"pleaseEnterPrompt": "请输入描述",
|
| 503 |
+
"imageGeneratedSuccessfully": "图像生成成功!",
|
| 504 |
+
"failedToGenerateImage": "图像生成失败",
|
| 505 |
+
"failedToSaveImage": "图像保存失败",
|
| 506 |
+
"pleaseUploadValidImage": "请上传有效的图像(JPEG、PNG或WebP)",
|
| 507 |
+
"imageSizeMustBeLessThan": "图像大小必须小于5MB",
|
| 508 |
+
"select": "选择"
|
| 509 |
+
}
|
| 510 |
+
}
|
| 511 |
+
}
|
| 512 |
+
}
|
next.config.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { NextConfig } from "next";
|
| 2 |
+
import createNextIntlPlugin from "next-intl/plugin";
|
| 3 |
+
|
| 4 |
+
const BUILD_OUTPUT = process.env.NEXT_STANDALONE_OUTPUT
|
| 5 |
+
? "standalone"
|
| 6 |
+
: undefined;
|
| 7 |
+
|
| 8 |
+
export default () => {
|
| 9 |
+
const nextConfig: NextConfig = {
|
| 10 |
+
output: BUILD_OUTPUT,
|
| 11 |
+
cleanDistDir: true,
|
| 12 |
+
devIndicators: {
|
| 13 |
+
position: "bottom-right",
|
| 14 |
+
},
|
| 15 |
+
env: {
|
| 16 |
+
NO_HTTPS: process.env.NO_HTTPS,
|
| 17 |
+
},
|
| 18 |
+
experimental: {
|
| 19 |
+
taint: true,
|
| 20 |
+
authInterrupts: true,
|
| 21 |
+
},
|
| 22 |
+
};
|
| 23 |
+
const withNextIntl = createNextIntlPlugin();
|
| 24 |
+
return withNextIntl(nextConfig);
|
| 25 |
+
};
|
package.json
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "better-chatbot",
|
| 3 |
+
"version": "1.26.0",
|
| 4 |
+
"private": true,
|
| 5 |
+
"author": "cgoinglove",
|
| 6 |
+
"license": "MIT",
|
| 7 |
+
"type": "module",
|
| 8 |
+
"scripts": {
|
| 9 |
+
"dev": "next dev",
|
| 10 |
+
"dev:turbopack": "next dev --turbopack",
|
| 11 |
+
"dev:https": "next dev --experimental-https",
|
| 12 |
+
"build": "next build",
|
| 13 |
+
"start": "next start",
|
| 14 |
+
"build:local": "cross-env NO_HTTPS='1' next build",
|
| 15 |
+
"test": "vitest run",
|
| 16 |
+
"test:watch": "vitest",
|
| 17 |
+
"test:e2e": "playwright test",
|
| 18 |
+
"test:e2e:ui": "playwright test --ui",
|
| 19 |
+
"test:e2e:seed": "dotenv -- tsx scripts/seed-test-users.ts",
|
| 20 |
+
"test:e2e:clean": "dotenv -- tsx scripts/cleanup-all-test-data.ts",
|
| 21 |
+
"lint": "biome lint",
|
| 22 |
+
"lint:fix": "biome lint --write --unsafe",
|
| 23 |
+
"format": "biome format --write",
|
| 24 |
+
"check-types": "tsc --noEmit",
|
| 25 |
+
"initial:env": "tsx scripts/initial-env.ts",
|
| 26 |
+
"openai-compatiable:init": "tsx scripts/init-openai-compatiable.ts",
|
| 27 |
+
"openai-compatiable:parse": "tsx scripts/parse-openai-compatiable.ts",
|
| 28 |
+
"postinstall": "tsx scripts/postinstall.ts",
|
| 29 |
+
"clean": "tsx scripts/clean.ts",
|
| 30 |
+
"clean:next": "tsx scripts/clean.ts .next",
|
| 31 |
+
"db:generate": "drizzle-kit generate",
|
| 32 |
+
"db:reset": "drizzle-kit drop && drizzle-kit push",
|
| 33 |
+
"db:push": "drizzle-kit push",
|
| 34 |
+
"db:studio": "drizzle-kit studio",
|
| 35 |
+
"db:migrate": "tsx scripts/db-migrate.ts",
|
| 36 |
+
"db:pull": "drizzle-kit pull",
|
| 37 |
+
"db:check": "drizzle-kit check",
|
| 38 |
+
"docker-compose:up": "docker-compose -f docker/compose.yml up -d --build",
|
| 39 |
+
"docker-compose:down": "docker-compose -f docker/compose.yml down",
|
| 40 |
+
"docker-compose:logs": "docker-compose -f docker/compose.yml logs -f",
|
| 41 |
+
"docker-compose:ps": "docker-compose -f docker/compose.yml ps",
|
| 42 |
+
"docker-compose:update": "git pull && docker-compose -f docker/compose.yml up -d --build",
|
| 43 |
+
"docker:pg": "docker run --name better-chatbot-pg -e POSTGRES_PASSWORD=your_password -e POSTGRES_USER=your_username -e POSTGRES_DB=your_database_name -p 5432:5432 -d postgres",
|
| 44 |
+
"docker:redis": "docker run --name better-chatbot-redis -p 6379:6379 -d redis:7-alpine",
|
| 45 |
+
"docker:app": "docker build -f docker/Dockerfile -t better-chatbot . && docker run -p 3000:3000 -e NO_HTTPS=1 better-chatbot",
|
| 46 |
+
"prepare": "husky",
|
| 47 |
+
"playwright:install": "playwright install",
|
| 48 |
+
"check": "pnpm lint:fix && pnpm check-types && pnpm test"
|
| 49 |
+
},
|
| 50 |
+
"dependencies": {
|
| 51 |
+
"@ai-sdk/anthropic": "^2.0.56",
|
| 52 |
+
"@ai-sdk/google": "^2.0.51",
|
| 53 |
+
"@ai-sdk/groq": "^2.0.33",
|
| 54 |
+
"@ai-sdk/openai": "^2.0.88",
|
| 55 |
+
"@ai-sdk/openai-compatible": "^1.0.29",
|
| 56 |
+
"@ai-sdk/react": "^2.0.118",
|
| 57 |
+
"@ai-sdk/xai": "^2.0.42",
|
| 58 |
+
"@aws-sdk/client-s3": "^3.958.0",
|
| 59 |
+
"@aws-sdk/s3-request-presigner": "^3.958.0",
|
| 60 |
+
"@google/genai": "^1.34.0",
|
| 61 |
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
| 62 |
+
"@openrouter/ai-sdk-provider": "^1.5.4",
|
| 63 |
+
"@radix-ui/react-accordion": "^1.2.12",
|
| 64 |
+
"@radix-ui/react-avatar": "^1.1.11",
|
| 65 |
+
"@radix-ui/react-checkbox": "^1.3.3",
|
| 66 |
+
"@radix-ui/react-context-menu": "^2.2.16",
|
| 67 |
+
"@radix-ui/react-dialog": "^1.1.15",
|
| 68 |
+
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
| 69 |
+
"@radix-ui/react-hover-card": "^1.1.15",
|
| 70 |
+
"@radix-ui/react-label": "^2.1.8",
|
| 71 |
+
"@radix-ui/react-popover": "^1.1.15",
|
| 72 |
+
"@radix-ui/react-radio-group": "^1.3.8",
|
| 73 |
+
"@radix-ui/react-scroll-area": "^1.2.10",
|
| 74 |
+
"@radix-ui/react-select": "^2.2.6",
|
| 75 |
+
"@radix-ui/react-separator": "^1.1.8",
|
| 76 |
+
"@radix-ui/react-slot": "^1.2.4",
|
| 77 |
+
"@radix-ui/react-switch": "^1.2.6",
|
| 78 |
+
"@radix-ui/react-tabs": "^1.1.13",
|
| 79 |
+
"@radix-ui/react-toggle": "^1.1.10",
|
| 80 |
+
"@radix-ui/react-tooltip": "^1.2.8",
|
| 81 |
+
"@tiptap/extension-mention": "^2.27.1",
|
| 82 |
+
"@tiptap/react": "^2.27.1",
|
| 83 |
+
"@tiptap/starter-kit": "^2.27.1",
|
| 84 |
+
"@tiptap/suggestion": "^2.27.1",
|
| 85 |
+
"@vercel/blob": "^2.0.0",
|
| 86 |
+
"@xyflow/react": "^12.10.0",
|
| 87 |
+
"ai": "^5.0.116",
|
| 88 |
+
"bcrypt-ts": "^7.1.0",
|
| 89 |
+
"better-auth": "^1.4.9",
|
| 90 |
+
"chokidar": "^4.0.3",
|
| 91 |
+
"class-variance-authority": "^0.7.1",
|
| 92 |
+
"clsx": "^2.1.1",
|
| 93 |
+
"cmdk": "^1.1.1",
|
| 94 |
+
"consola": "^3.4.2",
|
| 95 |
+
"date-fns": "^4.1.0",
|
| 96 |
+
"deepmerge": "^4.3.1",
|
| 97 |
+
"dotenv": "^16.6.1",
|
| 98 |
+
"drizzle-orm": "^0.41.0",
|
| 99 |
+
"emoji-picker-react": "^4.16.1",
|
| 100 |
+
"framer-motion": "^12.23.26",
|
| 101 |
+
"hast-util-to-jsx-runtime": "^2.3.6",
|
| 102 |
+
"ioredis": "^5.8.2",
|
| 103 |
+
"json-schema": "^0.4.0",
|
| 104 |
+
"katex": "^0.16.27",
|
| 105 |
+
"lucide-react": "^0.486.0",
|
| 106 |
+
"mermaid": "^11.12.2",
|
| 107 |
+
"nanoid": "^5.1.6",
|
| 108 |
+
"next": "16.1.6",
|
| 109 |
+
"next-intl": "^4.8.1",
|
| 110 |
+
"next-themes": "^0.4.6",
|
| 111 |
+
"ogl": "^1.0.11",
|
| 112 |
+
"ollama-ai-provider-v2": "^1.5.5",
|
| 113 |
+
"pg": "^8.16.3",
|
| 114 |
+
"react": "^19.2.4",
|
| 115 |
+
"react-dom": "^19.2.4",
|
| 116 |
+
"react-markdown": "^10.1.0",
|
| 117 |
+
"react-resizable-panels": "^2.1.9",
|
| 118 |
+
"recharts": "^2.15.4",
|
| 119 |
+
"rehype-katex": "^7.0.1",
|
| 120 |
+
"remark-gfm": "^4.0.1",
|
| 121 |
+
"remark-math": "^6.0.0",
|
| 122 |
+
"server-only": "^0.0.1",
|
| 123 |
+
"shiki": "^3.20.0",
|
| 124 |
+
"sonner": "^2.0.7",
|
| 125 |
+
"swr": "^2.3.8",
|
| 126 |
+
"tailwind-merge": "^3.4.0",
|
| 127 |
+
"ts-edge": "^1.0.4",
|
| 128 |
+
"ts-safe": "^0.0.5",
|
| 129 |
+
"tw-animate-css": "^1.4.0",
|
| 130 |
+
"undici": "^7.18.2",
|
| 131 |
+
"vaul": "^1.1.2",
|
| 132 |
+
"zod": "^4.2.1",
|
| 133 |
+
"zustand": "^5.0.9"
|
| 134 |
+
},
|
| 135 |
+
"devDependencies": {
|
| 136 |
+
"@better-auth-kit/seed": "^1.0.12",
|
| 137 |
+
"@biomejs/biome": "1.9.4",
|
| 138 |
+
"@playwright/test": "^1.57.0",
|
| 139 |
+
"@tailwindcss/postcss": "^4.1.18",
|
| 140 |
+
"@types/json-schema": "^7.0.15",
|
| 141 |
+
"@types/node": "^20.19.27",
|
| 142 |
+
"@types/pg": "^8.16.0",
|
| 143 |
+
"@types/react": "^19.2.7",
|
| 144 |
+
"@types/react-dom": "^19.2.3",
|
| 145 |
+
"cross-env": "^7.0.3",
|
| 146 |
+
"dotenv-cli": "^10.0.0",
|
| 147 |
+
"drizzle-kit": "^0.30.6",
|
| 148 |
+
"eslint": "^9.39.2",
|
| 149 |
+
"eslint-config-next": "15.3.0",
|
| 150 |
+
"husky": "^9.1.7",
|
| 151 |
+
"lint-staged": "^16.2.7",
|
| 152 |
+
"rimraf": "^6.1.2",
|
| 153 |
+
"tailwindcss": "^4.1.18",
|
| 154 |
+
"tsx": "^4.21.0",
|
| 155 |
+
"typescript": "^5.9.3",
|
| 156 |
+
"vite-tsconfig-paths": "^5.1.4",
|
| 157 |
+
"vitest": "^3.2.4"
|
| 158 |
+
},
|
| 159 |
+
"lint-staged": {
|
| 160 |
+
"*.{js,json,mjs,ts,yaml,tsx,css}": [
|
| 161 |
+
"pnpm format",
|
| 162 |
+
"pnpm lint:fix"
|
| 163 |
+
]
|
| 164 |
+
},
|
| 165 |
+
"packageManager": "pnpm@10.2.1",
|
| 166 |
+
"engines": {
|
| 167 |
+
"node": ">=18"
|
| 168 |
+
},
|
| 169 |
+
"pnpm": {
|
| 170 |
+
"onlyBuiltDependencies": [
|
| 171 |
+
"@biomejs/biome",
|
| 172 |
+
"@tailwindcss/oxide",
|
| 173 |
+
"esbuild",
|
| 174 |
+
"sharp",
|
| 175 |
+
"unrs-resolver"
|
| 176 |
+
]
|
| 177 |
+
}
|
| 178 |
+
}
|
playwright.config.ts
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { defineConfig, devices } from "@playwright/test";
|
| 2 |
+
import { config } from "dotenv";
|
| 3 |
+
|
| 4 |
+
// Load environment variables
|
| 5 |
+
if (process.env.CI) {
|
| 6 |
+
config({ path: ".env.test" });
|
| 7 |
+
} else {
|
| 8 |
+
config();
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
export default defineConfig({
|
| 12 |
+
testDir: "./tests",
|
| 13 |
+
timeout: 60 * 1000, // Increased timeout for agent operations
|
| 14 |
+
fullyParallel: true,
|
| 15 |
+
forbidOnly: !!process.env.CI,
|
| 16 |
+
retries: process.env.CI ? 2 : 0,
|
| 17 |
+
workers: process.env.CI ? 4 : 3,
|
| 18 |
+
// Removed maxFailures - let tests run to completion and fail properly
|
| 19 |
+
reporter: process.env.CI
|
| 20 |
+
? [
|
| 21 |
+
["html", { open: "never", outputFolder: "playwright-report" }],
|
| 22 |
+
["list"],
|
| 23 |
+
["json", { outputFile: "test-results/.last-run.json" }],
|
| 24 |
+
]
|
| 25 |
+
: [["html"], ["list"]],
|
| 26 |
+
use: {
|
| 27 |
+
baseURL: process.env.NEXT_PUBLIC_BASE_URL || "http://localhost:3000",
|
| 28 |
+
ignoreHTTPSErrors: true,
|
| 29 |
+
trace: "on-first-retry",
|
| 30 |
+
screenshot: "only-on-failure",
|
| 31 |
+
...devices["Desktop Chrome"],
|
| 32 |
+
},
|
| 33 |
+
|
| 34 |
+
globalSetup: "./tests/lifecycle/setup.global.ts",
|
| 35 |
+
globalTeardown: "./tests/lifecycle/teardown.global.ts",
|
| 36 |
+
|
| 37 |
+
projects: [
|
| 38 |
+
// Standard test setup - seeds users before running tests
|
| 39 |
+
{
|
| 40 |
+
name: "setup",
|
| 41 |
+
testMatch: /.*auth-states\.setup\.ts/,
|
| 42 |
+
},
|
| 43 |
+
|
| 44 |
+
{
|
| 45 |
+
name: "chromium",
|
| 46 |
+
use: {
|
| 47 |
+
...devices["Desktop Chrome"],
|
| 48 |
+
},
|
| 49 |
+
dependencies: ["setup"],
|
| 50 |
+
testMatch: /.*\.spec\.ts/,
|
| 51 |
+
testIgnore: [/.*\.setup\.ts/],
|
| 52 |
+
},
|
| 53 |
+
],
|
| 54 |
+
|
| 55 |
+
webServer: {
|
| 56 |
+
command: "pnpm start",
|
| 57 |
+
url: "http://localhost:3000",
|
| 58 |
+
reuseExistingServer: !process.env.CI,
|
| 59 |
+
timeout: 180 * 1000, // 3 minutes for build and start
|
| 60 |
+
stdout: "pipe",
|
| 61 |
+
stderr: "pipe",
|
| 62 |
+
},
|
| 63 |
+
});
|
pnpm-lock.yaml
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|