mirror of
https://github.com/Mintplex-Labs/anything-llm
synced 2026-04-25 17:15:37 +02:00
1.12.0 pg (#5329)
* fix: typo in contribution guidelines, update project metadata and pull_request_temp...md (#5010)
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* bump copyright year
resolves #5017
* feat: update light mode UI sidebar (#4996)
* implement light mode sidebar redesign
* Abstract hardcoded hex values into reusable css variables
* reorder ternary and apply bold font on hovered workspaces
* Remove double icon hack and use a state tracking whether workspace item is being hovered over for fill styles
* lint
* convert css variables and custom classes to default tailwind classes
* remove grab icon filling on hover logic
* revert css vars to original values
* remove light mode css vars | change bg of sidebar in light mode to right color | make icons correct color in light mode
* revert dark mode change
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix(frontend): fix event listener memory leak in useIsDisabled hook (#5027)
fix: optimize event listener management in useIsDisabled hook
* feat: dedicated dark theme option with system preference support (#5007)
* implement OS level theme switching and dark mode option
* simplify
* fix logo bug in login | place back useTheme comment
---------
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix cleanup pr workflow
* Implement new home page redesign (#4931)
* remove legacy home page components, update home page to new layout
* update PromptInput component styles to match new designs, make quick action buttons functional
* home page chat creates new thread in last used workspace
* fix slash commands and agent popup on home page
* disable llm workspace selector action in home page
* add drag and drop file support to home page
* fix behavior of drag and drop on home page
* handle pasting attachments in home page
* update empty state of workspace chat to use new ui
* update empty workspace ui to match home page design, fix flickering loading states
* convert quick action buttons to component, add to empty state ws chat
* fix hover state light mode in quick actions
* add suggested messages subcomponent to empty ws/thread
* adjust width, rounded edges of prompt input
* only show quick actions for admin/manager role
* fix hover states for quick actions and suggested messages component
* make upload document quick action trigger parsed document upload
* fix mic behavior in homepage, ws chat, ws thread chat
* fix margin between prompt input and quick actions
* Simplify message presets by removing heading input (#4915)
* Remove heading input from message presets, merge legacy headings on edit
* filter out empty messages from state after saving
* mark form as dirty on input change
* styling
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* convert SuggestedMessages to component, render SuggestedMessages in home page to target ws
* fix broken handleMessageChange reference
* add translations for QuickActions
* lint
* fix home page chat submission broken by PromptInput onChange removal
* fix prompt input remount race condition, home page suggested message flicker
* remove unused handleSendSuggestedMessage from ChatHistory
* add greeting text to main-page translations, remove defaults
* fix file deletion in parsed files menu on home page
* add virtual thread sidebar state and workspace indicator on home page
* show workspace llm selector on home page when workspace exists
* show home page for all user roles with rbac quick actions
* fix positioning of agent and slash command popups
* remove workspace indicator from home page, match empty state spacing
* Normalize translations for home page redesign (#4986)
* normalize translations
* update translations with DMR
* accidentally changed es translation
* normalize translations for main-page.greeting
* update translations with DMR
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* update translations
* create new workspace in native language
Cleanup workspace page from empty state handling
* update quick action show logic
* fix send button
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix: GitLab connector infinite loop and rate limit crash for large repos (#5021)
* Fix infinite loop and rate limit crashes
* simplify logic | add max-retries to fetchNextPage and fetchSingleFileContents
---------
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix: add password character validation to onboarding single-user setup (#5037)
* fix single user mode password bug
* share const
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Native Tool calling (#5071)
* checkpoint
* test MCP and flows
* add native tool call detection back to LMStudio
* add native tool call loops for Ollama
* Add ablity detection to DMR (regex parse)
* bedrock and generic openai with ENV flag
* deepseek native tool calling
* localAI native function
* groq support
* linting, add litellm and OR native tool calling via flag
* fix: resolve Gemini agent 400 error on tool call responses (#5054)
* add gtc__ prefix to tool call names in Gemini agent message formatting
* resolve Gemini agent 400 error on tool call responses
* add comments explaining geminis thought signatures
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix: prevent CMD/CTRL+Arrow scroll from overriding textarea cursor movement (#5053)
prevent CMD/CTRL+Arrow scroll from overriding textarea cursor movement
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* lint
* Normalize scraper runtimeargs for bulk-scraper (#5083)
resolves #5078
closes #5079
* resolve Ollama string strict num_ctx
resolves #5081
* Lemonade integration (#5077)
* lemonade integration
* lemonade embedder
* log
* load model
* readme updates
* update embedder privacy entry
* fix max tool call stack abort flow
* v1.11.1 Release tags (#5107)
bump tag
* 5112 or stream metrics and finish reason (#5117)
* update metric tracking for OR + fix finish_reason missing from transitive chunks
* linting + comments
closes #5113
resolves #5112
* Fix bug where `yarn setup:envs` fails if any .env file already exists. (#5116)
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix: show actionable error when LMStudio model listing fails or returns empty (#5131)
* fix: show actionable error when LMStudio model listing fails or returns empty
When the model listing request completes but returns no models (due to
connection failure, wrong URL, or server unreachable), the dropdown now
shows "No models found — check LMStudio is running and accessible"
instead of "--loading available models--", making it possible to
distinguish a failed request from one still in progress.
Affects both LLM and embedding provider selection components.
Closes recurring UX confusion reported in #3519, #1338, #3656.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* UI warning tooltip
---------
Co-authored-by: Morgan Giddings <morgan@MG-Mac-Studio.home.arpa>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Add automatic chat mode with native tool calling support (#5140)
Introduces a new automatic chat mode (now the default) that automatically invokes tools when the provider supports native tool calling. Conditionally shows/hides the @agent command based on whether native tooling is available.
- Add supportsNativeToolCalling() to AI providers (OpenAI, Anthropic, Azure always support; others opt-in via ENV)
- Update all locale translations with new mode descriptions
- Enhance translator to preserve Trans component tags
- Remove deprecated ability tags UI
* Revert "Add automatic chat mode with native tool calling support (#5140)"
- Need to support documents in agents
- Need to support images in agent mode
This reverts commit 4c69960dca.
* improve translation script
* patch attempt for GH cleanup tag
* workflow -wip
* fix type
* split cleanup
* vague GH worker error - try to resolve via repo-name
* Test dispatch workflow
* Remove test workflow
* native tool calling detection for novita
* fix sidebar and add translations to sidebar
* add translations
* Sidebar updates (#5154)
* fix sidebar and add translations to sidebar
* add translations
* Debug cleanup workflow
* Debug cleanup workflow
* Debug cleanup workflow
* Use ALLM_RW_PACKAGES for package cleanup
* Remove Google web-search Programmable SERP (#5156)
* refactor: refactor agent skills settings page to use i18n translation keys (#5146)
* refactor agent skills to read from translation keys instead of hardcoded strings
* add missing sql agent description key
* Remove fallbacks
* adjust translation
* swap to factor pattern
* normalize translations (#5147)
* normalize translations
* run translator job
* translations
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* chore: add ESLint to `/collector` (#5128)
* add eslint config to /collector
* prettier formatting
* fix unused
* fix undefined
* disable lines
* lockfile
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* chore: add ESLint to `/server` (#5126)
* add eslint config to server
* add break statements to switch case
* add support for browser globals and turn off empty catch blocks
* disable lines with useless try/catch wrappers
* format
* fix no-undef errors
* disbale lines violating no-unsafe-finally
* ignore syncStaticLists.mjs
* use proper null check for creatorId instead of unreachable nullish coalescing
* remove unneeded typescript eslint comment
* make no-unused-private-class-members a warning
* disable line for no-empty-objects
* add new lint script
* fix no-unused-vars violations
* make no-unsued-vars an error
---------
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Fix: Azure OpenAI model key collision (#5092)
* fix: Migrate AzureOpenAI model key from OPEN_MODEL_PREF to prevent the naming collision. No effort necessary from current users.
* test: add backwards compat tests for AzureOpenAI model key migration
* patch missing env example file
* linting
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* feat: Add tooltip for paperclip attach button when no files are parsed (#5139)
* fix broken tooltip
* fix tooltip not showing on homepage
* fix tooltip rendering behind input on homepage
---------
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
* fix: add missing /wiki to Confluence cloud citation URLs (#5167)
fix: add /wiki to Confluence cloud page URLs in citations
* Strip thinking from copy message outputs (#5179)
* linting & show descriptive error for bad `addtoWorkspace` request body
resolves #5172
* Add custom fetch to embedder for Ollama (#5180)
Refactor ollama timeout to be shared. Add custom fetch to embedder for ollama as well
* chore: add script to detect and prune unused translation keys (#5141)
* add script to prune dead translation keys
* add support for dynamic translation keys
* improve performance of script
* fix dynamic t() detection and add keyboard shortcut keys to allowlist
* rename scripts
* change commands
---------
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* chore: add ESLint CI workflow (#5160)
add lint CI GitHub Action
* patch plural keys
* add ToS for brevity
* Remove `use_mlock` from Ollama to solve `WARN` logs in ollama 0.17
resolves #5182
* Implement v2 chat layout designs (#5074)
* New chat history layout with chat bubbles (#4985)
* new chat history layout, remove message alignment setting
* remove orphaned chat alignment hook and MessageDirection
* remove workspace profile picture setting and fetch
* clean up unnecessary changes
* add light mode colors to chat ui and main page backgrounds
* update chat message and action icon colors for light mode
* update thinking and agent ui, layout, sizing
* update user message uploaded images ui
* update thought, agent containers to use new colors
* add truncatable content with gradient to user chat messages
* fix citations margin
* implement new edit message UI with save and submit actions
* add translations for TruncatableContent subcomponent
* remove unused props
* fix text colors for default mode chats, agent, thoughts container
* Normalize translations for new chat history layout (#5022)
* normalize translations
* update translations with DMR
* lint
* fix mismatched home container colors
* fix: add password character validation to onboarding single-user setup (#5037)
* fix single user mode password bug
* share const
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Native Tool calling (#5071)
* checkpoint
* test MCP and flows
* add native tool call detection back to LMStudio
* add native tool call loops for Ollama
* Add ablity detection to DMR (regex parse)
* bedrock and generic openai with ENV flag
* deepseek native tool calling
* localAI native function
* groq support
* linting, add litellm and OR native tool calling via flag
* fix: resolve Gemini agent 400 error on tool call responses (#5054)
* add gtc__ prefix to tool call names in Gemini agent message formatting
* resolve Gemini agent 400 error on tool call responses
* add comments explaining geminis thought signatures
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* fix: prevent CMD/CTRL+Arrow scroll from overriding textarea cursor movement (#5053)
prevent CMD/CTRL+Arrow scroll from overriding textarea cursor movement
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* linting, assistant speaker spacing and order, copy/edit order
---------
Co-authored-by: Marcello Fitton <106866560+angelplusultra@users.noreply.github.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Implement new citations UI (#5038)
* new chat history layout, remove message alignment setting
* remove orphaned chat alignment hook and MessageDirection
* remove workspace profile picture setting and fetch
* clean up unnecessary changes
* add light mode colors to chat ui and main page backgrounds
* update chat message and action icon colors for light mode
* update thinking and agent ui, layout, sizing
* update user message uploaded images ui
* update thought, agent containers to use new colors
* add truncatable content with gradient to user chat messages
* fix citations margin
* implement new edit message UI with save and submit actions
* add translations for TruncatableContent subcomponent
* remove unused props
* fix text colors for default mode chats, agent, thoughts container
* Normalize translations for new chat history layout (#5022)
* normalize translations
* update translations with DMR
* lint
* fix mismatched home container colors
* implement new citations ui with sources sidebar
* bottom sheet for mobile citations
* convert mobile citations bottom sheet to new modal design
* add score, border separators for mobile citations modal
* push down sources sidebar in password/multiuser mode
* fix animation gap, simplify sources sidebar by splitting state to persist data on animation
* add english translations
* fix spacing from citations sidebar when user has auth
* Normalize translations for new citation UI (#5087)
* normalize translations
* update translations using DMR
* fix pluralize to use i18n native solution
change reset to immediate clear
fix spacing for TTS when showing or not to not have space
* proper pluralize
* hide metrics on mobile, fix last message padding on mobile
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* New prompt input ui/tools menu (#5070)
* wip new prompt input ui/tools menu
* fix colors for prompt input
* redesign workspace llm selector, extract text size + model picker to components
* refactor ToolsMenu component
* fix colors/refactor WorkspaceModelPicker
* fix spacing in ws model picker, change order of tools menu tabs
* fix slash commands showing /reset instead of /exit during active agent session
* refactor ToolsMenu to be much simpler
* cleanup, fix behavior of setupup provider in WorkspaceModelPicker
* simplify AgentSkillsTab toggle logic
* add english translations for new components
* remove legacy slash command/agent popups, add ToolsMenu keyboard nav
* fix spacing of workspace model picker text
* fix SourcesSidebar and TextSizeMenu positioning after merge
* fix keyboard nav in ToolsMenu when clicking on tools button to open
* typo
* only auto pop up tools menu when prompt input is empty with /
* fix z index for tools menu on citation
* fix behavior of / in prompt input
* move global window agent session state to module level variable
* fix prompt input not clearing on /reset
* missing translations
* revert translating slash command
* fix STT auto-submit not working on home page
* Normalize translations for new prompt input/tools menu UI (#5130)
* normalize translations
* update translations using DMR script
* normalize translations
* update translations using DMR script
* remove slash_exit
* fix skills.js import after merge
* fix tooltip z-index rendering behind citations
* patch translation prune script to not remove special cases
* updates to tools input
* factory translations
* use safeJsonParse in clearPromptInputDraft
* normalize translations
* disable agent skill toggles during active agent sessions + show tooltip on disabled
* normalize translations
* handle enter key behavior when tools menu is open
* fix unfocusable modal for slash command edit/new
* fix sending prompt when editing/creating slash commands
* hide/show agent skills in tools menu based on role
* container borders for dark/light mode compliance to designs
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* update how tooltip works for agent menu
* update prompt input to show agent button with CTA in agent panel for user clarify
update agent session start prompt button in input
* translations
* translations + move regex for slash commands to constants
* fix open sidebar ux
* fix tools menu to always open to slash commands, dismiss auto pop up
* fix sidebar open/close button overlapping with ws model picker
---------
Co-authored-by: Sean Hatfield <seanhatfield5@gmail.com>
Co-authored-by: Marcello Fitton <106866560+angelplusultra@users.noreply.github.com>
* patch slashcommand popup to be usePortal
* Improve zh_TW Traditional Chinese locale
* Improve zh_TW Traditional Chinese locale (#5187)
* lint
* fix schema not persisting in DB connector
* Improve build times for tests and lint (#5193)
* test build skip
* reset file
* Support Agent stream metric reporting (#5197)
* Report citations for Agent call stacks (#5199)
* sanitize promptReply Output
* Add FileRow Indentation on Documents Picker (#5201)
* Fix SQL injection in SQL Agent plugin via parameterized queries
Replace string concatenation with parameterized queries in all database
connectors to prevent SQL injection through LLM-generated table names.
Changes:
- PostgreSQL: Use $1, $2 placeholders with pg client parameterization
- MySQL: Use ? placeholders with mysql2 execute() prepared statements
- MSSQL: Use @p0 placeholders with request.input() parameterization
- Update handlers to support parameterized query objects
- Add formatQueryForDisplay() for logging parameterized queries
Security: Mitigates potential SQL injection when LLM passes unsanitized
user input as table_name parameter to getTableSchemaSql/getTablesSql.
GHSA-jwjx-mw2p-5wc7
* Align Manager API access with frontend access
GHSA-wfq3-65gm-3g2p
* Enforce user suspension check on browser extension API key path
Previously, suspended users could continue using browser extension
endpoints if they had created an API key before suspension. The normal
JWT session path blocked suspended users, but the browser extension
middleware did not.
Changes:
- Add suspension and user existence checks to validBrowserExtensionApiKey
- Delete browser extension API keys when a user is deleted
- Add deleteAllForUser method to BrowserExtensionApiKey model
GHSA-7754-8jcc-2rg3
* Fix potential Zip Slip path traversal in community plugin import
Validate all ZIP entries before extraction in importCommunityItemFromUrl()
to prevent path traversal attacks (CWE-22). Malicious ZIP entries with
paths like "../../" could write files outside the intended plugin folder.
Requires admin privileges and explicit opt-in to unverified hub downloads.
GHSA-rh66-4w74-cf4m
* Remove `WelcomeMessages` from app - no longer used (#5206)
* remove `WelcomeMessages` from app - no longer user
* update erronous alert message
* fix job collision ref
* fix jobs - remove dev job
* Fix potential IDOR vulnerability in workspace parsed files endpoints
Add ownership validation to prevent users from deleting or embedding
parsed files that don't belong to them. Previously, the delete and
embed endpoints only validated authentication but not resource ownership,
allowing users to delete attached files for users within workspaces they are also a member of.
Changes:
- Delete endpoint now filters by userId and workspaceId
- Embed endpoint validates file belongs to user and workspace (redundant)
- delete() returns false when no matching records found (returns 403)
- Added JSDoc comments for clarity
GHSA-p5rf-8p88-979c
* add user id to chat feedback
update JSDOC on middleware for typedef
GHSA-2qmm-82f7-8qj5
* feat: Add document count indicators to workspace document management modal (#5207)
* add document counts to non-embedded and embedded documents
* Update logic to not count search filtered documents
* refactor how count is done and rendered
* translations
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* feat(agents): Add Perplexity Search API as web search provider (#5210)
* feat(agents): Add Perplexity Search API as web search provider
Adds Perplexity as a search provider for the agent web-browsing plugin,
using the Perplexity Search API (POST /search) which returns raw ranked
web results — distinct from the existing Perplexity LLM integration.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* chore: replace docs.perplexity.ai with console.perplexity.ai
* chore: replace docs.perplexity.ai with console.perplexity.ai
---------
Co-authored-by: kesku <kesku@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* bump version tag 1.11.2
* update exa search provider description (#5225)
* update exa search provider description
Co-Authored-By: ishan <ishan@exa.ai>
* update exa search provider description
Co-Authored-By: ishan <ishan@exa.ai>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: ishan <ishan@exa.ai>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Automatic mode for workspace (Agent mode default) (#5143)
* Add automatic chat mode with native tool calling support
Introduces a new automatic chat mode (now the default) that automatically invokes tools when the provider supports native tool calling. Conditionally shows/hides the @agent command based on whether native tooling is available.
- Add supportsNativeToolCalling() to AI providers (OpenAI, Anthropic, Azure always support; others opt-in via ENV)
- Update all locale translations with new mode descriptions
- Enhance translator to preserve Trans component tags
- Remove deprecated ability tags UI
* rebase translations
* WIP on image attachments. Supports initial image attachment + subsequent attachments
* persist images
* Image attachments and updates for providers
* desktop pre-change
* always show command on failure
* add back gemini streaming detection
* move provider native tooling flag to Provider func
* whoops - forgot to delete
* strip "@agent" from prompts to prevent weird replies
* translations for automatic-mode (#5145)
* translations for automatic-mode
* rebase
* translations
* lint
* fix dead translations
* change default for now to chat mode just for rollout
* remove pfp for workspace
* passthrough workspace for showAgentCommand detection and rendering
* Agent API automatic mode support
* ephemeral attachments passthrough
* support reading of pinned documents in agent context
* MCP tool manager (#5230)
* MCP tool manager
* Mcp tool manager i18 (#5231)
i18n translations for MCP manager changes
connect #5230
* fix bad i18n key
* Intelligent Skill Selection (#5236)
* Beta Intelligent Tooling
todo: Agent Skill banner warning when tool # is high or % of content window?
* forgot files
* add UI controls and maxToolCallStack setting
* update docs link
* ISS i18n (#5237)
i18n
* README updates (#5238)
* README updates
* Update README.md
* Update README.md
* remove unused images
* updates
* copy updates
* fix(collector): infer file extension from Content-Type for URLs without explicit extensions (#5252)
* fix(collector): infer file extension from Content-Type for URLs without explicit extensions
When downloading files from URLs like https://arxiv.org/pdf/2307.10265,
the path has no recognizable file extension. The downloaded file gets
saved without an extension (or with a nonsensical one like .10265),
causing processSingleFile to reject it with 'File extension .10265
not supported for parsing'.
Fix: after downloading, check if the filename has a supported file
extension. If not, inspect the response Content-Type header and map
it to the correct extension using the existing ACCEPTED_MIMES table.
For example, a response with Content-Type: application/pdf will cause
the file to be saved with a .pdf extension, allowing it to be processed
correctly.
Fixes #4513
* small refactor
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* feat: add Lithuanian locale and register in resources (#5243)
* feat: add Lithuanian locale and register in resources
* sync
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Telegram bot connector (#5190)
* wip telegram bot connector
* encrypt bot token, reorg telegram bot modules, secure pairing codes
* offload telegram chat to background worker, add @agent support with chart png rendering, reconnect ui
* refactor telegram bot settings page into subcomponents
* response.locals for mum, telemetry for connecting to telegram
* simplify telegram command registration
* improve telegram bot ux: rework switch/history/resume commands
* add voice, photo, and TTS support to telegram bot with long message handling
* lint
* rename external_connectors to external_communication_connectors, add voice response mode, persist chat workspace/thread selection
* lint
* fix telegram bot connect/disconnect bugs, kill telegram bot on multiuser mode enable
* add english translations
* fix qr code in light mode
* repatch migration
* WIP checkpoint
* pipeline overhaul for using response obj
* format functions
* fix comment block
* remove conditional dumpENV + lint
* remove .end() from sendStatus calls
* patch broken streaming where streaming only first chunk
* refactor
* use Ephemeral handler now
* show metrics and citations in real GUI
* bugfixes
* prevent MuM persistence, UI cleanup, styling for status
* add new workspace flow in UI
Add thread chat count
fix 69 byte payload callback limit bug
* handle pagination for workspaces, threads, and models
* modularize commands and navigation
* add /proof support for citation recall
* handle backlog message spam
* support abort of response streams
* code cleanup
* spam prevention
* fix translations, update voice typing indicator, fix token bug
* frontend refactor, update tips on /status and voice response improvements
* collapse agent though blocks
* support images
* Fix mime issues with audio from other devices
* fix config issue post server stop
* persist image on agentic chats
* 5189 i18n (#5245)
* i18n translations
connect #5189
* prune translations
* fix errors
* fix translation gaps
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Add User-Agent header for Anthropic API calls (#5174)
* Add User-Agent header for Anthropic API calls
Passes User-Agent: AnythingLLM/{version} to the Anthropic SDK
so Anthropic can identify traffic from AnythingLLM.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* remove test, simplify header default
* unset change to spread
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* add Dynamic `max_tokens` retreival for Anthropic models (#5255)
* fix Firefox LaTeX rendering (#5258)
* fix pruned translations
* whitelist valid dynamic translation
* add ask to run prompt for tool calls (demo) (#5261)
* add ask to run prompt for tools
* border-none on buttons
* translations
* linting
* i18n (#5263)
* extend approve/deny requests to telegram
* break up handler
* Refactor onboarding welcome screen to v2 design (#5262)
* refactor onboarding home page to v2 design
* fixc typography and buttons
* refactor useTheme to return isLight variable | call useTheme from inside SVG component | apply light mode background gradient | polish styles to match designs
* add welcome i18n
* simplify isLight variable
* add new welcome translation key to locales
* delete unused images
* move OnboardingLogoSVG into module | compute isLight directly in component
* add type button | add border-none | add hover state
* update hook with doc
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* Filesystem Agent Skill overhaul (#5260)
* wip
* collector parse fixes
* refactor for class and also operation for reading
* add skill management panel
* management panel + lint
* management panel + lint
* Hide skill in non-docker context
* add ask-prompt for edit tool calls
* fix dep
* fix execa pkg (unused in codebase)
* simplify search with ripgrep only and build deps
* Fs skill i18n (#5264)
i18n
* add copy file support
* fix translations
* fix es translation entry
* feat : auto-select newly uploaded docs/URLs in my documents list (#5222)
* auto-select newly uploaded docs/URLs in My Documents list
* fix: improve auto-select reliability and fix debounce/selection bugs
- Add missing `await` on fetchKeys in handleSendLink so loading state
and auto-select timing work correctly
- Use functional update for setSelectedItems to merge with existing
selections instead of replacing them
- Stabilize debounced fetchKeys with useRef so rapid uploads actually
debounce instead of creating independent timers per render
- Rename shadowed local variables (availableDocs -> filteredAvailableDocs)
for clarity
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* remove legacy cost estimate for embedding
* feat: add missing Lemonade LLM provider env vars to .env.example (#5275)
add llm provider lemonade env vars to .env.example
* fix openapi spec
* feat: add optional API key support for Lemonade provider (#5281)
* add API key param to Lemonade LLM Provider and Embedding Provider
* add LEMONADE_LLM_API_KEY to .env.example
* add api key to aibitat provider
* fix api key from being sent to frontend
* fix tooltip id
* add null fallback for `apiKey`
* remove console log
* add missing api keys
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* File creation agent skills (#5280)
* Powerpoint File Creation (#5278)
* wip
* download card
* UI for downloading
* move to fs system with endpoint to pull files
* refactor UI
* final-pass
* remove save-file-browser skill and refactor
* remove fileDownload event
* reset
* reset file
* reset timeout
* persist toggle
* Txt creation (#5279)
* wip
* download card
* UI for downloading
* move to fs system with endpoint to pull files
* refactor UI
* final-pass
* remove save-file-browser skill and refactor
* remove fileDownload event
* reset
* reset file
* reset timeout
* wip
* persist toggle
* add arbitrary text creation file
* Add PDF document generation with markdown formatting (#5283)
add support for branding in bottom right corner
refactor core utils and frontend rendering
* Xlsx document creation (#5284)
add Excel doc & sheet creation
* Basic docx creation (#5285)
* Basic docx creation
* add test theme support + styling and title pages
* simplify skill selection
* handle TG attachments
* send documents over tg
* lazy import
* pin deps
* fix lock
* i18n for file creation (#5286)
i18n for file-creation
connect #5280
* theme overhaul
* Add PPTX subagent for better results
* forgot files
* Add PPTX subagent for better results (#5287)
* Add PPTX subagent for better results
* forgot files
* make sub-agent use proper tool calling if it can and better UI hints
* add batching Intelligent Tool Selector for performance and scoring
* Automatic mode is now default
* show links in /proof on TG
* Redesign Telegram bot settings UI (#5306)
* redesign telegram bot settings ui/refactor ui components
* fix positioning of user row
* move ConnectedBotCard to subcomponent
* fix redirect
* remove redundant guard
---------
Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
* remove log
* Fix chat UI event listener bloat (#5323)
* version bump
* translations
---------
Co-authored-by: Dipanshu Rawat <dv451197@gmail.com>
Co-authored-by: Marcello Fitton <106866560+angelplusultra@users.noreply.github.com>
Co-authored-by: shatfield4 <seanhatfield5@gmail.com>
Co-authored-by: Brian Pursley <bpursley@cinlogic.com>
Co-authored-by: Morgan <morgan@scifoundry.com>
Co-authored-by: Morgan Giddings <morgan@MG-Mac-Studio.home.arpa>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Ryan <RALaBarge@users.noreply.github.com>
Co-authored-by: Maxwell Calkin <101308415+MaxwellCalkin@users.noreply.github.com>
Co-authored-by: Peter Dave Hello <hsu@peterdavehello.org>
Co-authored-by: Peter Dave Hello <3691490+PeterDaveHello@users.noreply.github.com>
Co-authored-by: Kesku <62210496+kesku@users.noreply.github.com>
Co-authored-by: kesku <kesku@users.noreply.github.com>
Co-authored-by: Ishan Goswami <ishangoswami315@gmail.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: ishan <ishan@exa.ai>
Co-authored-by: Yitong Li <yitongli0814@gmail.com>
Co-authored-by: arvydev <55648027+arvydev@users.noreply.github.com>
Co-authored-by: Mike Lambert <mlambert@gmail.com>
Co-authored-by: Neha Prasad <neh6a683@gmail.com>
This commit is contained in:
@@ -63,7 +63,7 @@ jobs:
|
||||
${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
|
||||
tags: |
|
||||
type=raw,value=pg
|
||||
type=raw,value=pg-1.11.2
|
||||
type=raw,value=pg-1.12.0
|
||||
|
||||
- name: Build and push multi-platform Docker image
|
||||
uses: docker/build-push-action@v6
|
||||
|
||||
33
README.md
33
README.md
@@ -36,9 +36,9 @@
|
||||
👉 AnythingLLM for desktop (Mac, Windows, & Linux)! <a href="https://anythingllm.com/download" target="_blank"> Download Now</a>
|
||||
</p>
|
||||
|
||||
A full-stack application that enables you to turn any document, resource, or piece of content into context that any LLM can use as a reference during chatting. This application allows you to pick and choose which LLM or Vector Database you want to use as well as supporting multi-user management and permissions.
|
||||
Chat with your docs. Automate complex workflows with AI Agents. Hyper-configurable, multi-user ready, battle-tested—and runs locally by default with zero setup friction.
|
||||
|
||||

|
||||

|
||||
|
||||
<details>
|
||||
<summary><kbd>Watch the demo!</kbd></summary>
|
||||
@@ -49,26 +49,27 @@ A full-stack application that enables you to turn any document, resource, or pie
|
||||
|
||||
### Product Overview
|
||||
|
||||
AnythingLLM is a full-stack application where you can use commercial off-the-shelf LLMs or popular open source LLMs and vectorDB solutions to build a private ChatGPT with no compromises that you can run locally as well as host remotely and be able to chat intelligently with any documents you provide it.
|
||||
AnythingLLM is the all-in-one AI application that lets you build a private, fully-featured ChatGPT—without compromises. Connect your favorite local or cloud LLM, ingest your documents, and start chatting in minutes. Out of the box you get built-in agents, multi-user support, vector databases, and document pipelines — no extra configuration required.
|
||||
|
||||
AnythingLLM divides your documents into objects called `workspaces`. A Workspace functions a lot like a thread, but with the addition of containerization of your documents. Workspaces can share documents, but they do not talk to each other so you can keep your context for each workspace clean.
|
||||
AnythingLLM supports multiple users as well where you can control the access and experience per user without compromising the security or privacy of the instance or your intellectual property.
|
||||
|
||||
## Cool features of AnythingLLM
|
||||
|
||||
- 🆕 [**Full MCP-compatibility**](https://docs.anythingllm.com/mcp-compatibility/overview)
|
||||
- 🆕 [**No-code AI Agent builder**](https://docs.anythingllm.com/agent-flows/overview)
|
||||
- 🖼️ **Multi-modal support (both closed and open-source LLMs!)**
|
||||
- [Intelligent Skill Selection](https://docs.anythingllm.com/agent/intelligent-tool-selection) Enable **unlimited** tools for your models while reducing token usage by up to 80% per query
|
||||
- [**No-code AI Agent builder**](https://docs.anythingllm.com/agent-flows/overview)
|
||||
- [**Full MCP-compatibility**](https://docs.anythingllm.com/mcp-compatibility/overview)
|
||||
- **Multi-modal support (both closed and open-source LLMs!)**
|
||||
- [**Custom AI Agents**](https://docs.anythingllm.com/agent/custom/introduction)
|
||||
- 👤 Multi-user instance support and permissioning _Docker version only_
|
||||
- 🦾 Agents inside your workspace (browse the web, etc)
|
||||
- 💬 [Custom Embeddable Chat widget for your website](https://github.com/Mintplex-Labs/anythingllm-embed/blob/main/README.md) _Docker version only_
|
||||
- 📖 Multiple document type support (PDF, TXT, DOCX, etc)
|
||||
- Simple chat UI with Drag-n-Drop functionality and clear citations.
|
||||
- 100% Cloud deployment ready.
|
||||
- Intuitive chat UI with drag-and-drop uploads and source citations.
|
||||
- Production-ready for any cloud deployment.
|
||||
- Works with all popular [closed and open-source LLM providers](#supported-llms-embedder-models-speech-models-and-vector-databases).
|
||||
- Built-in cost & time-saving measures for managing very large documents compared to any other chat UI.
|
||||
- Built-in optimizations for large document sets—lower costs and faster responses than other chat UIs.
|
||||
- Full Developer API for custom integrations!
|
||||
- Much more...install and find out!
|
||||
- ...and much more—install in minutes and see for yourself.
|
||||
|
||||
### Supported LLMs, Embedder Models, Speech models, and Vector Databases
|
||||
|
||||
@@ -184,16 +185,6 @@ Mintplex Labs & the community maintain a number of deployment methods, scripts,
|
||||
|
||||
[Learn about documents](./server/storage/documents/DOCUMENTS.md)
|
||||
|
||||
[Learn about vector caching](./server/storage/vector-cache/VECTOR_CACHE.md)
|
||||
|
||||
## External Apps & Integrations
|
||||
|
||||
_These are apps that are not maintained by Mintplex Labs, but are compatible with AnythingLLM. A listing here is not an endorsement._
|
||||
|
||||
- [Midori AI Subsystem Manager](https://io.midori-ai.xyz/subsystem/anythingllm/) - A streamlined and efficient way to deploy AI systems using Docker container technology.
|
||||
- [Coolify](https://coolify.io/docs/services/anythingllm/) - Deploy AnythingLLM with a single click.
|
||||
- [GPTLocalhost for Microsoft Word](https://gptlocalhost.com/demo/) - A local Word Add-in for you to use AnythingLLM in Microsoft Word.
|
||||
|
||||
## Telemetry & Privacy
|
||||
|
||||
AnythingLLM by Mintplex Labs Inc contains a telemetry feature that collects anonymous usage information.
|
||||
|
||||
@@ -58,7 +58,7 @@ Notes:
|
||||
```yaml
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
tag: "1.11.2"
|
||||
tag: "1.12.0"
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
@@ -104,7 +104,7 @@ helm install my-anythingllm ./anythingllm -f values-secret.yaml
|
||||
| fullnameOverride | string | `""` | |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | |
|
||||
| image.repository | string | `"mintplexlabs/anythingllm"` | |
|
||||
| image.tag | string | `"1.11.2"` | |
|
||||
| image.tag | string | `"1.12.0"` | |
|
||||
| imagePullSecrets | list | `[]` | |
|
||||
| ingress.annotations | object | `{}` | |
|
||||
| ingress.className | string | `""` | |
|
||||
|
||||
@@ -69,7 +69,7 @@ Notes:
|
||||
```yaml
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
tag: "1.11.2"
|
||||
tag: "1.12.0"
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
|
||||
@@ -8,7 +8,7 @@ initContainers: []
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "1.11.2"
|
||||
tag: "1.12.0"
|
||||
|
||||
imagePullSecrets: []
|
||||
nameOverride: ""
|
||||
|
||||
96
collector/__tests__/utils/downloadURIToFile/index.test.js
Normal file
96
collector/__tests__/utils/downloadURIToFile/index.test.js
Normal file
@@ -0,0 +1,96 @@
|
||||
const path = require("path");
|
||||
const { SUPPORTED_FILETYPE_CONVERTERS } = require("../../../utils/constants");
|
||||
const { mimeToExtension } = require("../../../utils/downloadURIToFile");
|
||||
|
||||
/**
|
||||
* Simulates the filename-building logic from downloadURIToFile
|
||||
* to verify extension inference works correctly.
|
||||
*/
|
||||
function buildFilenameWithExtension(sluggedFilename, contentType) {
|
||||
const existingExt = path.extname(sluggedFilename).toLowerCase();
|
||||
if (!SUPPORTED_FILETYPE_CONVERTERS.hasOwnProperty(existingExt)) {
|
||||
const mimeType = contentType?.toLowerCase()?.split(";")[0]?.trim();
|
||||
const inferredExt = mimeToExtension(mimeType);
|
||||
if (inferredExt) {
|
||||
return sluggedFilename + inferredExt;
|
||||
}
|
||||
}
|
||||
return sluggedFilename;
|
||||
}
|
||||
|
||||
describe("mimeToExtension", () => {
|
||||
test("returns null for invalid or unknown input", () => {
|
||||
expect(mimeToExtension(null)).toBeNull();
|
||||
expect(mimeToExtension(undefined)).toBeNull();
|
||||
expect(mimeToExtension("application/octet-stream")).toBeNull();
|
||||
});
|
||||
|
||||
test("returns first extension from ACCEPTED_MIMES for known types", () => {
|
||||
expect(mimeToExtension("application/pdf")).toBe(".pdf");
|
||||
});
|
||||
});
|
||||
|
||||
describe("buildFilenameWithExtension", () => {
|
||||
test("appends .pdf when URL path has no recognized extension (arxiv case)", () => {
|
||||
// Simulates: https://arxiv.org/pdf/2307.10265
|
||||
// slugify produces something like "arxiv.org-pdf-230710265"
|
||||
const filename = "arxiv.org-pdf-230710265";
|
||||
const result = buildFilenameWithExtension(filename, "application/pdf");
|
||||
expect(result).toBe("arxiv.org-pdf-230710265.pdf");
|
||||
});
|
||||
|
||||
test("appends .pdf when URL has numeric-looking extension", () => {
|
||||
// path.extname("arxiv.org-pdf-2307.10265") => ".10265" which is not in SUPPORTED_FILETYPE_CONVERTERS
|
||||
const filename = "arxiv.org-pdf-2307.10265";
|
||||
const result = buildFilenameWithExtension(
|
||||
filename,
|
||||
"application/pdf; charset=utf-8"
|
||||
);
|
||||
expect(result).toBe("arxiv.org-pdf-2307.10265.pdf");
|
||||
});
|
||||
|
||||
test("does NOT append extension when file already has a supported extension", () => {
|
||||
const filename = "example.com-document.pdf";
|
||||
const result = buildFilenameWithExtension(filename, "application/pdf");
|
||||
expect(result).toBe("example.com-document.pdf");
|
||||
});
|
||||
|
||||
test("does NOT append extension when file has .txt extension", () => {
|
||||
const filename = "example.com-readme.txt";
|
||||
const result = buildFilenameWithExtension(filename, "text/plain");
|
||||
expect(result).toBe("example.com-readme.txt");
|
||||
});
|
||||
|
||||
test("does not append extension for unknown content type", () => {
|
||||
const filename = "example.com-binary-blob";
|
||||
const result = buildFilenameWithExtension(
|
||||
filename,
|
||||
"application/octet-stream"
|
||||
);
|
||||
expect(result).toBe("example.com-binary-blob");
|
||||
});
|
||||
|
||||
test("does not append extension when content type is null", () => {
|
||||
const filename = "example.com-unknown";
|
||||
const result = buildFilenameWithExtension(filename, null);
|
||||
expect(result).toBe("example.com-unknown");
|
||||
});
|
||||
|
||||
test("appends .docx for word document MIME type", () => {
|
||||
const filename = "sharepoint.com-documents-report";
|
||||
const result = buildFilenameWithExtension(
|
||||
filename,
|
||||
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||
);
|
||||
expect(result).toBe("sharepoint.com-documents-report.docx");
|
||||
});
|
||||
|
||||
test("handles content type with charset parameter correctly", () => {
|
||||
const filename = "api.example.com-export-data";
|
||||
const result = buildFilenameWithExtension(
|
||||
filename,
|
||||
"text/csv; charset=utf-8"
|
||||
);
|
||||
expect(result).toBe("api.example.com-export-data.csv");
|
||||
});
|
||||
});
|
||||
@@ -86,6 +86,7 @@ app.post(
|
||||
} = await processSingleFile(targetFilename, {
|
||||
...options,
|
||||
parseOnly: true,
|
||||
absolutePath: options.absolutePath || null,
|
||||
});
|
||||
response
|
||||
.status(200)
|
||||
|
||||
@@ -5,6 +5,16 @@ const { downloadURIToFile } = require("../../utils/downloadURIToFile");
|
||||
const { ACCEPTED_MIMES } = require("../../utils/constants");
|
||||
const { validYoutubeVideoUrl } = require("../../utils/url");
|
||||
|
||||
/**
|
||||
* Parse a Content-Type header value and return the MIME type without charset or other parameters.
|
||||
* @param {string|null} contentTypeHeader - The raw Content-Type header value
|
||||
* @returns {string|null} - The MIME type (e.g., "application/pdf") or null
|
||||
*/
|
||||
function parseContentType(contentTypeHeader) {
|
||||
if (!contentTypeHeader) return null;
|
||||
return contentTypeHeader.toLowerCase().split(";")[0].trim() || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the content type of a resource
|
||||
* - Sends a HEAD request to the URL and returns the Content-Type header with a 5 second timeout
|
||||
@@ -34,8 +44,9 @@ async function getContentTypeFromURL(url) {
|
||||
contentType: null,
|
||||
};
|
||||
|
||||
const contentType = res.headers.get("Content-Type")?.toLowerCase();
|
||||
const contentTypeWithoutCharset = contentType?.split(";")[0].trim();
|
||||
const contentTypeWithoutCharset = parseContentType(
|
||||
res.headers.get("Content-Type")
|
||||
);
|
||||
if (!contentTypeWithoutCharset)
|
||||
return {
|
||||
success: false,
|
||||
@@ -171,6 +182,7 @@ async function processAsFile({ uri, saveAsDocument = true }) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
parseContentType,
|
||||
returnResult,
|
||||
getContentTypeFromURL,
|
||||
determineContentType,
|
||||
|
||||
@@ -32,7 +32,7 @@ async function asAudio({
|
||||
|
||||
if (!!error) {
|
||||
console.error(`Error encountered for parsing of ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: error,
|
||||
@@ -42,7 +42,7 @@ async function asAudio({
|
||||
|
||||
if (!content?.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -69,7 +69,7 @@ async function asAudio({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(
|
||||
`[SUCCESS]: ${filename} transcribed, converted & ready for embedding.\n`
|
||||
);
|
||||
|
||||
@@ -27,7 +27,7 @@ async function asDocX({
|
||||
|
||||
if (!pageContent.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -55,7 +55,7 @@ async function asDocX({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ async function asEPub({
|
||||
|
||||
if (!content?.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -53,7 +53,7 @@ async function asEPub({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ async function asImage({
|
||||
|
||||
if (!content?.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -48,7 +48,7 @@ async function asImage({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ async function asMbox({
|
||||
|
||||
if (!mails.length) {
|
||||
console.error(`Resulting mail items was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No mail items found in ${filename}.`,
|
||||
@@ -73,7 +73,7 @@ async function asMbox({
|
||||
documents.push(document);
|
||||
}
|
||||
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(
|
||||
`[SUCCESS]: ${filename} messages converted & ready for embedding.\n`
|
||||
);
|
||||
|
||||
@@ -24,7 +24,7 @@ async function asOfficeMime({
|
||||
|
||||
if (!content.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -51,7 +51,7 @@ async function asOfficeMime({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ async function asPdf({
|
||||
|
||||
if (!pageContent.length) {
|
||||
console.error(`[asPDF] Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -78,7 +78,7 @@ async function asPdf({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ async function asTxt({
|
||||
|
||||
if (!content?.length) {
|
||||
console.error(`Resulting text content was empty for ${filename}.`);
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `No text content found in ${filename}.`,
|
||||
@@ -51,7 +51,7 @@ async function asTxt({
|
||||
filename: `${slugify(filename)}-${data.id}`,
|
||||
options: { parseOnly: options.parseOnly },
|
||||
});
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
console.log(`[SUCCESS]: ${filename} converted & ready for embedding.\n`);
|
||||
return { success: true, reason: null, documents: [document] };
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ async function asXlsx({
|
||||
documents: [],
|
||||
};
|
||||
} finally {
|
||||
trashFile(fullFilePath);
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
}
|
||||
|
||||
if (documents.length === 0) {
|
||||
|
||||
@@ -17,15 +17,21 @@ const RESERVED_FILES = ["__HOTDIR__.md"];
|
||||
* @param {string} targetFilename - The filename to process
|
||||
* @param {Object} options - The options for the file processing
|
||||
* @param {boolean} options.parseOnly - If true, the file will not be saved as a document even when `writeToServerDocuments` is called in the handler. Must be explicitly set to true to use.
|
||||
* @param {string} options.absolutePath - If provided, use this absolute path instead of resolving relative to WATCH_DIRECTORY. For internal use only.
|
||||
* @param {Object} metadata - The metadata for the file processing
|
||||
* @returns {Promise<{success: boolean, reason: string, documents: Object[]}>} - The documents from the file processing
|
||||
*/
|
||||
async function processSingleFile(targetFilename, options = {}, metadata = {}) {
|
||||
const fullFilePath = path.resolve(
|
||||
WATCH_DIRECTORY,
|
||||
normalizePath(targetFilename)
|
||||
const fullFilePath = normalizePath(
|
||||
options.absolutePath || path.resolve(WATCH_DIRECTORY, targetFilename)
|
||||
);
|
||||
if (!isWithin(path.resolve(WATCH_DIRECTORY), fullFilePath))
|
||||
|
||||
// If absolute path is not provided, check if the file is within the watch directory
|
||||
// to prevent unauthorized paths from being processed.
|
||||
if (
|
||||
!options.absolutePath &&
|
||||
!isWithin(path.resolve(WATCH_DIRECTORY), fullFilePath)
|
||||
)
|
||||
return {
|
||||
success: false,
|
||||
reason: "Filename is a not a valid path to process.",
|
||||
@@ -38,6 +44,7 @@ async function processSingleFile(targetFilename, options = {}, metadata = {}) {
|
||||
reason: "Filename is a reserved filename and cannot be processed.",
|
||||
documents: [],
|
||||
};
|
||||
|
||||
if (!fs.existsSync(fullFilePath))
|
||||
return {
|
||||
success: false,
|
||||
@@ -62,7 +69,8 @@ async function processSingleFile(targetFilename, options = {}, metadata = {}) {
|
||||
);
|
||||
processFileAs = ".txt";
|
||||
} else {
|
||||
trashFile(fullFilePath);
|
||||
// If absolute path is provided, do NOT trash the file since it is a user provided path.
|
||||
if (!options.absolutePath) trashFile(fullFilePath);
|
||||
return {
|
||||
success: false,
|
||||
reason: `File extension ${fileExtension} not supported for parsing and cannot be assumed as text file type.`,
|
||||
|
||||
@@ -27,6 +27,11 @@ const ACCEPTED_MIMES = {
|
||||
|
||||
"audio/wav": [".wav"],
|
||||
"audio/mpeg": [".mp3"],
|
||||
"audio/ogg": [".ogg", ".oga"],
|
||||
"audio/opus": [".opus"],
|
||||
"audio/mp4": [".m4a"],
|
||||
"audio/x-m4a": [".m4a"],
|
||||
"audio/webm": [".webm"],
|
||||
|
||||
"video/mp4": [".mp4"],
|
||||
"video/mpeg": [".mpeg"],
|
||||
@@ -68,6 +73,11 @@ const SUPPORTED_FILETYPE_CONVERTERS = {
|
||||
".wav": "./convert/asAudio.js",
|
||||
".mp4": "./convert/asAudio.js",
|
||||
".mpeg": "./convert/asAudio.js",
|
||||
".ogg": "./convert/asAudio.js",
|
||||
".oga": "./convert/asAudio.js",
|
||||
".opus": "./convert/asAudio.js",
|
||||
".m4a": "./convert/asAudio.js",
|
||||
".webm": "./convert/asAudio.js",
|
||||
|
||||
".png": "./convert/asImage.js",
|
||||
".jpg": "./convert/asImage.js",
|
||||
|
||||
@@ -1,10 +1,26 @@
|
||||
const { WATCH_DIRECTORY } = require("../constants");
|
||||
const { WATCH_DIRECTORY, ACCEPTED_MIMES } = require("../constants");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const { pipeline } = require("stream/promises");
|
||||
const { validURL } = require("../url");
|
||||
const { default: slugify } = require("slugify");
|
||||
|
||||
// Add a custom slugify extension for slashing to handle URLs with paths.
|
||||
slugify.extend({ "/": "-" });
|
||||
|
||||
/**
|
||||
* Maps a MIME type to the preferred file extension using ACCEPTED_MIMES.
|
||||
* Returns null if the MIME type is not recognized or if there are no possible extensions.
|
||||
* @param {string} mimeType - The MIME type to resolve (e.g., "application/pdf")
|
||||
* @returns {string|null} - The file extension (e.g., ".pdf") or null
|
||||
*/
|
||||
function mimeToExtension(mimeType) {
|
||||
if (!mimeType || !ACCEPTED_MIMES.hasOwnProperty(mimeType)) return null;
|
||||
const possibleExtensions = ACCEPTED_MIMES[mimeType] ?? [];
|
||||
if (possibleExtensions.length === 0) return null;
|
||||
return possibleExtensions[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Download a file to the hotdir
|
||||
* @param {string} url - The URL of the file to download
|
||||
@@ -33,10 +49,29 @@ async function downloadURIToFile(url, maxTimeout = 10_000) {
|
||||
.finally(() => clearTimeout(timeout));
|
||||
|
||||
const urlObj = new URL(url);
|
||||
const filename = `${urlObj.hostname}-${slugify(
|
||||
urlObj.pathname.replace(/\//g, "-"),
|
||||
{ lower: true }
|
||||
)}`;
|
||||
const sluggedPath = slugify(urlObj.pathname, { lower: true });
|
||||
let filename = `${urlObj.hostname}-${sluggedPath}`;
|
||||
|
||||
const existingExt = path.extname(filename).toLowerCase();
|
||||
const { SUPPORTED_FILETYPE_CONVERTERS } = require("../constants");
|
||||
|
||||
// If the filename does not already have a supported file extension,
|
||||
// try to infer one from the response Content-Type header.
|
||||
// This handles URLs like https://arxiv.org/pdf/2307.10265 where the
|
||||
// path has no explicit extension but the server responds with
|
||||
// Content-Type: application/pdf.
|
||||
if (!SUPPORTED_FILETYPE_CONVERTERS.hasOwnProperty(existingExt)) {
|
||||
const { parseContentType } = require("../../processLink/helpers");
|
||||
const contentType = parseContentType(res.headers.get("Content-Type"));
|
||||
const inferredExt = mimeToExtension(contentType);
|
||||
if (inferredExt) {
|
||||
console.log(
|
||||
`[Collector] URL path has no recognized extension. Inferred ${inferredExt} from Content-Type: ${contentType}`
|
||||
);
|
||||
filename += inferredExt;
|
||||
}
|
||||
}
|
||||
|
||||
const localFilePath = path.join(WATCH_DIRECTORY, filename);
|
||||
const writeStream = fs.createWriteStream(localFilePath);
|
||||
await pipeline(res.body, writeStream);
|
||||
@@ -51,4 +86,5 @@ async function downloadURIToFile(url, maxTimeout = 10_000) {
|
||||
|
||||
module.exports = {
|
||||
downloadURIToFile,
|
||||
mimeToExtension,
|
||||
};
|
||||
|
||||
@@ -433,4 +433,15 @@ GID='1000'
|
||||
# Allow native tool calling for specific providers.
|
||||
# This can VASTLY improve performance and speed of agent calls.
|
||||
# Check code for supported providers who can be enabled here via this flag
|
||||
# PROVIDER_SUPPORTS_NATIVE_TOOL_CALLING="generic-openai,bedrock,localai,groq,litellm,openrouter"
|
||||
# PROVIDER_SUPPORTS_NATIVE_TOOL_CALLING="generic-openai,bedrock,localai,groq,litellm,openrouter"
|
||||
|
||||
# (optional) Maximum number of tools an agent can chain for a single response.
|
||||
# This prevents some lower-end models from infinite recursive tool calls.
|
||||
# AGENT_MAX_TOOL_CALLS=10
|
||||
|
||||
# Enable agent tool reranking to reduce token usage by selecting only the most relevant tools
|
||||
# for each query. Uses the native embedding reranker to score tools against the user's prompt.
|
||||
# Set to "true" to enable. This can reduce token costs by 80% when you have
|
||||
# many tools/MCP servers enabled.
|
||||
# AGENT_SKILL_RERANKER_ENABLED="true"
|
||||
# AGENT_SKILL_RERANKER_TOP_N=15 # (optional) Number of top tools to keep after reranking (default: 15)
|
||||
|
||||
@@ -171,7 +171,7 @@ COPY --chown=anythingllm:anythingllm --from=frontend-build /app/frontend/dist /a
|
||||
# Setup the environment
|
||||
ENV NODE_ENV=production
|
||||
ENV ANYTHING_LLM_RUNTIME=docker
|
||||
ENV DEPLOYMENT_VERSION=1.11.2
|
||||
ENV DEPLOYMENT_VERSION=1.12.0
|
||||
|
||||
# Setup the healthcheck
|
||||
HEALTHCHECK --interval=1m --timeout=10s --start-period=1m \
|
||||
|
||||
@@ -62,6 +62,31 @@ export default function LemonadeEmbeddingOptions({ settings }) {
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col w-60">
|
||||
<div
|
||||
data-tooltip-place="top"
|
||||
data-tooltip-id="lemonade-embedding-api-key"
|
||||
className="flex gap-x-1 items-center mb-3"
|
||||
>
|
||||
<label className="text-white text-sm font-semibold block">
|
||||
API Key (optional)
|
||||
</label>
|
||||
<Info
|
||||
size={16}
|
||||
className="text-theme-text-secondary cursor-pointer"
|
||||
/>
|
||||
<Tooltip id="lemonade-embedding-api-key">
|
||||
The API key for your Lemonade instance
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="password"
|
||||
name="LemonadeLLMApiKey"
|
||||
defaultValue={settings?.LemonadeLLMApiKey ? "*".repeat(20) : ""}
|
||||
className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex justify-start mt-4">
|
||||
<button
|
||||
|
||||
@@ -159,6 +159,43 @@ export default function LemonadeOptions({ settings }) {
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col w-60">
|
||||
<div className="flex items-center gap-1 mb-3">
|
||||
<label className="text-white text-sm font-semibold block">
|
||||
API Key (optional)
|
||||
</label>
|
||||
<Tooltip
|
||||
id="lemonade-api-key"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
delayHide={800}
|
||||
clickable={true}
|
||||
className="tooltip !text-xs !opacity-100 z-99"
|
||||
style={{
|
||||
maxWidth: "350px",
|
||||
whiteSpace: "normal",
|
||||
wordWrap: "break-word",
|
||||
}}
|
||||
>
|
||||
The API key for your Lemonade server
|
||||
</Tooltip>
|
||||
<div
|
||||
className="text-theme-text-secondary cursor-pointer hover:bg-theme-bg-primary flex items-center justify-center rounded-full"
|
||||
data-tooltip-id="lemonade-api-key"
|
||||
data-tooltip-place="top"
|
||||
data-tooltip-delay-hide={800}
|
||||
>
|
||||
<Info size={18} className="text-theme-text-secondary" />
|
||||
</div>
|
||||
</div>
|
||||
<input
|
||||
type="password"
|
||||
name="LemonadeLLMApiKey"
|
||||
defaultValue={settings?.LemonadeLLMApiKey ? "*".repeat(20) : ""}
|
||||
className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-full p-2.5"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
<LemonadeModelSelection
|
||||
selectedModelId={selectedModelId}
|
||||
setSelectedModelId={setSelectedModelId}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { CloudArrowUp } from "@phosphor-icons/react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import showToast from "../../../../../utils/toast";
|
||||
import System from "../../../../../models/system";
|
||||
@@ -34,7 +34,7 @@ export default function UploadFile({
|
||||
if (!response.ok) {
|
||||
showToast(`Error uploading link: ${data.error}`, "error");
|
||||
} else {
|
||||
fetchKeys(true);
|
||||
await fetchKeys(true, { autoSelectNew: true });
|
||||
showToast("Link uploaded successfully", "success");
|
||||
formEl.reset();
|
||||
}
|
||||
@@ -42,11 +42,12 @@ export default function UploadFile({
|
||||
setFetchingUrl(false);
|
||||
};
|
||||
|
||||
// Queue all fetchKeys calls through the same debouncer to prevent spamming the server.
|
||||
// either a success or error will trigger a fetchKeys call so the UI is not stuck loading.
|
||||
const debouncedFetchKeys = debounce(() => fetchKeys(true), 1000);
|
||||
const handleUploadSuccess = () => debouncedFetchKeys();
|
||||
const handleUploadError = () => debouncedFetchKeys();
|
||||
const debouncedFetchKeysRef = useRef(
|
||||
debounce((fn, opts) => fn(true, opts), 1000)
|
||||
);
|
||||
const handleUploadSuccess = () =>
|
||||
debouncedFetchKeysRef.current(fetchKeys, { autoSelectNew: true });
|
||||
const handleUploadError = () => debouncedFetchKeysRef.current(fetchKeys, {});
|
||||
|
||||
const onDrop = async (acceptedFiles, rejections) => {
|
||||
const newAccepted = acceptedFiles.map((file) => {
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import PreLoader from "@/components/Preloader";
|
||||
import { dollarFormat } from "@/utils/numbers";
|
||||
import WorkspaceFileRow from "./WorkspaceFileRow";
|
||||
import { memo, useEffect, useState } from "react";
|
||||
import ModalWrapper from "@/components/ModalWrapper";
|
||||
@@ -23,7 +22,6 @@ function WorkspaceDirectory({
|
||||
fetchKeys,
|
||||
hasChanges,
|
||||
saveChanges,
|
||||
embeddingCosts,
|
||||
movedItems,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
@@ -232,22 +230,7 @@ function WorkspaceDirectory({
|
||||
</div>
|
||||
</div>
|
||||
{hasChanges && (
|
||||
<div className="flex items-center justify-between py-6">
|
||||
<div className="text-white/80">
|
||||
<p className="text-sm font-semibold">
|
||||
{embeddingCosts === 0
|
||||
? ""
|
||||
: `Estimated Cost: ${
|
||||
embeddingCosts < 0.01
|
||||
? `< $0.01`
|
||||
: dollarFormat(embeddingCosts)
|
||||
}`}
|
||||
</p>
|
||||
<p className="mt-2 text-xs italic" hidden={embeddingCosts === 0}>
|
||||
{t("connectors.directory.costs")}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center justify-end py-6">
|
||||
<button
|
||||
onClick={(e) => handleSaveChanges(e)}
|
||||
className="border border-slate-200 px-5 py-2.5 rounded-lg text-white text-sm items-center flex gap-x-2 hover:bg-slate-200 hover:text-slate-800 focus:ring-gray-800"
|
||||
|
||||
@@ -1,21 +1,12 @@
|
||||
import { ArrowsDownUp } from "@phosphor-icons/react";
|
||||
import { useEffect, useState } from "react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import Workspace from "../../../../models/workspace";
|
||||
import System from "../../../../models/system";
|
||||
import showToast from "../../../../utils/toast";
|
||||
import Directory from "./Directory";
|
||||
import WorkspaceDirectory from "./WorkspaceDirectory";
|
||||
|
||||
// OpenAI Cost per token
|
||||
// ref: https://openai.com/pricing#:~:text=%C2%A0/%201K%20tokens-,Embedding%20models,-Build%20advanced%20search
|
||||
|
||||
const MODEL_COSTS = {
|
||||
"text-embedding-ada-002": 0.0000001, // $0.0001 / 1K tokens
|
||||
"text-embedding-3-small": 0.00000002, // $0.00002 / 1K tokens
|
||||
"text-embedding-3-large": 0.00000013, // $0.00013 / 1K tokens
|
||||
};
|
||||
|
||||
export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
export default function DocumentSettings({ workspace }) {
|
||||
const [highlightWorkspace, setHighlightWorkspace] = useState(false);
|
||||
const [availableDocs, setAvailableDocs] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
@@ -23,10 +14,24 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
const [selectedItems, setSelectedItems] = useState({});
|
||||
const [hasChanges, setHasChanges] = useState(false);
|
||||
const [movedItems, setMovedItems] = useState([]);
|
||||
const [embeddingsCost, setEmbeddingsCost] = useState(0);
|
||||
const [loadingMessage, setLoadingMessage] = useState("");
|
||||
const availableDocsRef = useRef([]);
|
||||
|
||||
useEffect(() => {
|
||||
availableDocsRef.current = availableDocs;
|
||||
}, [availableDocs]);
|
||||
|
||||
async function fetchKeys(refetchWorkspace = false, options = {}) {
|
||||
const { autoSelectNew = false } = options;
|
||||
const previousIds = new Set();
|
||||
if (autoSelectNew && availableDocsRef.current?.items) {
|
||||
for (const folder of availableDocsRef.current.items) {
|
||||
for (const file of folder.items ?? []) {
|
||||
if (file?.id) previousIds.add(file.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchKeys(refetchWorkspace = false) {
|
||||
setLoading(true);
|
||||
const localFiles = await System.localFiles();
|
||||
const currentWorkspace = refetchWorkspace
|
||||
@@ -37,7 +42,7 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
currentWorkspace.documents.map((doc) => doc.docpath) || [];
|
||||
|
||||
// Documents that are not in the workspace
|
||||
const availableDocs = {
|
||||
const filteredAvailableDocs = {
|
||||
...localFiles,
|
||||
items: localFiles.items.map((folder) => {
|
||||
if (folder.items && folder.type === "folder") {
|
||||
@@ -56,7 +61,7 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
};
|
||||
|
||||
// Documents that are already in the workspace
|
||||
const workspaceDocs = {
|
||||
const filteredWorkspaceDocs = {
|
||||
...localFiles,
|
||||
items: localFiles.items.map((folder) => {
|
||||
if (folder.items && folder.type === "folder") {
|
||||
@@ -74,8 +79,23 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
}),
|
||||
};
|
||||
|
||||
setAvailableDocs(availableDocs);
|
||||
setWorkspaceDocs(workspaceDocs);
|
||||
setAvailableDocs(filteredAvailableDocs);
|
||||
setWorkspaceDocs(filteredWorkspaceDocs);
|
||||
|
||||
if (autoSelectNew) {
|
||||
const newSelected = {};
|
||||
for (const folder of filteredAvailableDocs.items ?? []) {
|
||||
for (const file of folder.items ?? []) {
|
||||
if (file?.id && !previousIds.has(file.id)) {
|
||||
newSelected[file.id] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Object.keys(newSelected).length > 0) {
|
||||
setSelectedItems((prev) => ({ ...prev, ...newSelected }));
|
||||
}
|
||||
}
|
||||
|
||||
setLoading(false);
|
||||
}
|
||||
|
||||
@@ -134,25 +154,6 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
}
|
||||
}
|
||||
|
||||
let totalTokenCount = 0;
|
||||
newMovedItems.forEach((item) => {
|
||||
const { cached, token_count_estimate } = item;
|
||||
if (!cached) {
|
||||
totalTokenCount += token_count_estimate;
|
||||
}
|
||||
});
|
||||
|
||||
// Do not do cost estimation unless the embedding engine is OpenAi.
|
||||
if (systemSettings?.EmbeddingEngine === "openai") {
|
||||
const COST_PER_TOKEN =
|
||||
MODEL_COSTS[
|
||||
systemSettings?.EmbeddingModelPref || "text-embedding-ada-002"
|
||||
];
|
||||
|
||||
const dollarAmount = (totalTokenCount / 1000) * COST_PER_TOKEN;
|
||||
setEmbeddingsCost(dollarAmount);
|
||||
}
|
||||
|
||||
setMovedItems([...movedItems, ...newMovedItems]);
|
||||
|
||||
let newAvailableDocs = JSON.parse(JSON.stringify(availableDocs));
|
||||
@@ -222,7 +223,6 @@ export default function DocumentSettings({ workspace, systemSettings }) {
|
||||
fetchKeys={fetchKeys}
|
||||
hasChanges={hasChanges}
|
||||
saveChanges={updateWorkspace}
|
||||
embeddingCosts={embeddingsCost}
|
||||
movedItems={movedItems}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -102,7 +102,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
|
||||
)}
|
||||
|
||||
{selectedTab === "documents" ? (
|
||||
<DocumentSettings workspace={workspace} systemSettings={settings} />
|
||||
<DocumentSettings workspace={workspace} />
|
||||
) : (
|
||||
<DataConnectors workspace={workspace} systemSettings={settings} />
|
||||
)}
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
PencilSimpleLine,
|
||||
Nut,
|
||||
Toolbox,
|
||||
Plugs,
|
||||
} from "@phosphor-icons/react";
|
||||
import AgentIcon from "@/media/animations/agent-static.png";
|
||||
import CommunityHubIcon from "@/media/illustrations/community-hub.png";
|
||||
@@ -363,6 +364,19 @@ const SidebarOptions = ({ user = null, t }) => (
|
||||
},
|
||||
]}
|
||||
/>
|
||||
<Option
|
||||
btnText={t("settings.channels")}
|
||||
icon={<Plugs className="h-5 w-5 flex-shrink-0" />}
|
||||
user={user}
|
||||
childOptions={[
|
||||
{
|
||||
btnText: t("settings.available-channels.telegram"),
|
||||
href: paths.settings.telegram(),
|
||||
flex: true,
|
||||
hidden: !!user,
|
||||
},
|
||||
]}
|
||||
/>
|
||||
<Option
|
||||
btnText={t("settings.tools")}
|
||||
icon={<Toolbox className="h-5 w-5 flex-shrink-0" />}
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
import { memo, useState } from "react";
|
||||
import { saveAs } from "file-saver";
|
||||
import { DownloadSimple, CircleNotch } from "@phosphor-icons/react";
|
||||
import { humanFileSize } from "@/utils/numbers";
|
||||
import StorageFiles from "@/models/files";
|
||||
|
||||
/**
|
||||
* @param {{content: {filename: string, storageFilename?: string, fileSize?: number}}} props
|
||||
*/
|
||||
function FileDownloadCard({ props }) {
|
||||
const { filename, storageFilename, fileSize } = props.content || {};
|
||||
const { badge, badgeBg, badgeText, fileType } = getFileDisplayInfo(filename);
|
||||
const [downloading, setDownloading] = useState(false);
|
||||
|
||||
const handleDownload = async () => {
|
||||
if (downloading) return;
|
||||
if (!storageFilename) return;
|
||||
|
||||
setDownloading(true);
|
||||
try {
|
||||
const blob = await StorageFiles.download(storageFilename);
|
||||
if (!blob) throw new Error("Failed to download file");
|
||||
saveAs(blob, filename || storageFilename);
|
||||
} catch {
|
||||
console.error("Failed to download file");
|
||||
} finally {
|
||||
setDownloading(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex justify-center w-full my-2">
|
||||
<div className="w-full max-w-[750px] mr-4">
|
||||
<div className="flex items-center justify-between bg-zinc-800 light:bg-slate-100 light:border light:border-slate-200/50 rounded-xl px-2 py-1">
|
||||
<div className="flex items-center gap-x-3 min-w-0">
|
||||
<div
|
||||
className={`${badgeBg} ${badgeText} rounded-lg flex items-center justify-center flex-shrink-0 h-[48px] w-[48px] text-xs font-bold`}
|
||||
>
|
||||
{badge}
|
||||
</div>
|
||||
<div className="flex flex-col min-w-0">
|
||||
<p className="text-white light:text-slate-900 text-sm font-medium truncate leading-snug">
|
||||
{filename || "Unknown file"}
|
||||
</p>
|
||||
<p className="text-zinc-400 light:text-slate-500 text-xs leading-snug">
|
||||
{humanFileSize(fileSize, true, 1)}
|
||||
{fileSize && fileType ? " · " : ""}
|
||||
{fileType}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleDownload}
|
||||
disabled={downloading}
|
||||
className="flex items-center gap-x-2 px-4 py-2 rounded-lg border border-zinc-600 light:border-theme-sidebar-border hover:bg-zinc-700 light:hover:bg-theme-bg-secondary transition-colors text-white light:text-theme-text-primary text-sm font-medium flex-shrink-0 ml-4 disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{downloading ? (
|
||||
<CircleNotch size={16} weight="bold" className="animate-spin" />
|
||||
) : (
|
||||
<DownloadSimple size={16} weight="bold" />
|
||||
)}
|
||||
<span>{downloading ? "Downloading..." : "Download"}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get display info for a file based on its extension
|
||||
* @param {string} filename
|
||||
* @returns {{badge: string, badgeBg: string, badgeText: string, fileType: string}}
|
||||
*/
|
||||
function getFileDisplayInfo(filename) {
|
||||
const extension = filename?.split(".")?.pop()?.toLowerCase() ?? "txt";
|
||||
switch (extension) {
|
||||
case "pptx":
|
||||
case "ppt":
|
||||
return {
|
||||
badge: "PPT",
|
||||
badgeBg: "bg-orange-100",
|
||||
badgeText: "text-orange-700",
|
||||
fileType: "PowerPoint",
|
||||
};
|
||||
case "pdf":
|
||||
return {
|
||||
badge: "PDF",
|
||||
badgeBg: "bg-red-100",
|
||||
badgeText: "text-red-700",
|
||||
fileType: "PDF Document",
|
||||
};
|
||||
case "doc":
|
||||
case "docx":
|
||||
return {
|
||||
badge: "DOC",
|
||||
badgeBg: "bg-blue-100",
|
||||
badgeText: "text-blue-700",
|
||||
fileType: "Word Document",
|
||||
};
|
||||
case "xls":
|
||||
case "xlsx":
|
||||
return {
|
||||
badge: "XLS",
|
||||
badgeBg: "bg-green-100",
|
||||
badgeText: "text-green-700",
|
||||
fileType: "Spreadsheet",
|
||||
};
|
||||
case "csv":
|
||||
return {
|
||||
badge: "CSV",
|
||||
badgeBg: "bg-green-100",
|
||||
badgeText: "text-green-700",
|
||||
fileType: "Spreadsheet",
|
||||
};
|
||||
default:
|
||||
return {
|
||||
badge: extension.toUpperCase().slice(0, 4),
|
||||
badgeBg: "bg-slate-200",
|
||||
badgeText: "text-slate-700",
|
||||
fileType: "File",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export default memo(FileDownloadCard);
|
||||
@@ -22,6 +22,7 @@ function ActionMenu({ chatId, forkThread, isEditing, role }) {
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!open) return;
|
||||
const handleClickOutside = (event) => {
|
||||
if (menuRef.current && !menuRef.current.contains(event.target)) {
|
||||
setOpen(false);
|
||||
@@ -32,7 +33,7 @@ function ActionMenu({ chatId, forkThread, isEditing, role }) {
|
||||
return () => {
|
||||
document.removeEventListener("mousedown", handleClickOutside);
|
||||
};
|
||||
}, []);
|
||||
}, [open]);
|
||||
|
||||
if (!chatId || isEditing || role === "user") return null;
|
||||
|
||||
|
||||
@@ -1,40 +1,31 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { useState, useEffect, useRef } from "react";
|
||||
import { Trash } from "@phosphor-icons/react";
|
||||
import Workspace from "@/models/workspace";
|
||||
|
||||
const DELETE_EVENT = "delete-message";
|
||||
import {
|
||||
useMessageActionsContext,
|
||||
DELETE_EVENT,
|
||||
} from "@/components/WorkspaceChat/ChatContainer/ChatHistory/MessageActionsContext";
|
||||
|
||||
export function useWatchDeleteMessage({ chatId = null, role = "user" }) {
|
||||
const [isDeleted, setIsDeleted] = useState(false);
|
||||
const context = useMessageActionsContext();
|
||||
const [completeDelete, setCompleteDelete] = useState(false);
|
||||
const deleteCalled = useRef(false);
|
||||
const isDeleted = context?.isDeleted(chatId) ?? false;
|
||||
|
||||
useEffect(() => {
|
||||
function listenForEvent() {
|
||||
if (!chatId) return;
|
||||
window.addEventListener(DELETE_EVENT, onDeleteEvent);
|
||||
if (isDeleted && !deleteCalled.current) {
|
||||
deleteCalled.current = true;
|
||||
if (role === "assistant") {
|
||||
Workspace.deleteChat(chatId);
|
||||
}
|
||||
}
|
||||
listenForEvent();
|
||||
return () => {
|
||||
window.removeEventListener(DELETE_EVENT, onDeleteEvent);
|
||||
};
|
||||
}, [chatId]);
|
||||
}, [isDeleted, chatId, role]);
|
||||
|
||||
function onEndAnimation() {
|
||||
if (!isDeleted) return;
|
||||
setCompleteDelete(true);
|
||||
}
|
||||
|
||||
async function onDeleteEvent(e) {
|
||||
if (e.detail.chatId === chatId) {
|
||||
setIsDeleted(true);
|
||||
// Do this to prevent double-emission of the PUT/DELETE api call
|
||||
// because then there will be a race condition and it will make an error log for nothing
|
||||
// as one call will complete and the other will fail.
|
||||
if (role === "assistant") await Workspace.deleteChat(chatId);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return { isDeleted, completeDelete, onEndAnimation };
|
||||
}
|
||||
|
||||
|
||||
@@ -1,33 +1,16 @@
|
||||
import { Info, Pencil } from "@phosphor-icons/react";
|
||||
import { useState, useEffect, useRef } from "react";
|
||||
import { useRef, useEffect } from "react";
|
||||
import Appearance from "@/models/appearance";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
const EDIT_EVENT = "toggle-message-edit";
|
||||
import {
|
||||
useMessageActionsContext,
|
||||
EDIT_EVENT,
|
||||
} from "@/components/WorkspaceChat/ChatContainer/ChatHistory/MessageActionsContext";
|
||||
|
||||
export function useEditMessage({ chatId, role }) {
|
||||
const [isEditing, setIsEditing] = useState(false);
|
||||
|
||||
function onEditEvent(e) {
|
||||
if (e.detail.chatId !== chatId || e.detail.role !== role) {
|
||||
setIsEditing(false);
|
||||
return false;
|
||||
}
|
||||
setIsEditing((prev) => !prev);
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
function listenForEdits() {
|
||||
if (!chatId || !role) return;
|
||||
window.addEventListener(EDIT_EVENT, onEditEvent);
|
||||
}
|
||||
listenForEdits();
|
||||
return () => {
|
||||
window.removeEventListener(EDIT_EVENT, onEditEvent);
|
||||
};
|
||||
}, [chatId, role]);
|
||||
|
||||
return { isEditing, setIsEditing };
|
||||
const context = useMessageActionsContext();
|
||||
const isEditing = context?.isEditing(chatId, role) ?? false;
|
||||
return { isEditing };
|
||||
}
|
||||
|
||||
export function EditMessageAction({ chatId = null, role, isEditing }) {
|
||||
@@ -53,7 +36,7 @@ export function EditMessageAction({ chatId = null, role, isEditing }) {
|
||||
? t("chat_window.edit_prompt")
|
||||
: t("chat_window.edit_response")
|
||||
} `}
|
||||
className="border-none text-zinc-300 light:text-slate-500"
|
||||
className="border-none text-zinc-300 light:text-slate-500 px-0"
|
||||
aria-label={`Edit ${role === "user" ? t("chat_window.edit_prompt") : t("chat_window.edit_response")}`}
|
||||
>
|
||||
<Pencil size={21} className="mb-1" />
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
import { memo } from "react";
|
||||
import FileDownloadCard from "../../FileDownloadCard";
|
||||
|
||||
function HistoricalOutputs({ outputs = [] }) {
|
||||
if (!outputs || outputs.length === 0) return null;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-2 mt-4">
|
||||
{outputs.map((output, index) => (
|
||||
<FileDownloadCard
|
||||
key={`${output.type}-${index}`}
|
||||
props={{ content: output.payload }}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(HistoricalOutputs);
|
||||
@@ -18,6 +18,7 @@ import paths from "@/utils/paths";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
import { chatQueryRefusalResponse } from "@/utils/chat";
|
||||
import HistoricalOutputs from "./HistoricalOutputs";
|
||||
|
||||
const HistoricalMessage = ({
|
||||
uuid = v4(),
|
||||
@@ -34,6 +35,7 @@ const HistoricalMessage = ({
|
||||
saveEditedMessage,
|
||||
forkThread,
|
||||
metrics = {},
|
||||
outputs = [],
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const { isEditing } = useEditMessage({ chatId, role });
|
||||
@@ -156,6 +158,7 @@ const HistoricalMessage = ({
|
||||
</Link>
|
||||
)}
|
||||
<ChatAttachments attachments={attachments} />
|
||||
<HistoricalOutputs outputs={outputs} />
|
||||
</div>
|
||||
)}
|
||||
<div className="flex items-start md:items-center gap-x-1">
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
import {
|
||||
createContext,
|
||||
useContext,
|
||||
useState,
|
||||
useEffect,
|
||||
useCallback,
|
||||
} from "react";
|
||||
|
||||
const EDIT_EVENT = "toggle-message-edit";
|
||||
const DELETE_EVENT = "delete-message";
|
||||
|
||||
const MessageActionsContext = createContext(null);
|
||||
|
||||
/**
|
||||
* Provider that centralizes edit/delete event listeners for all messages.
|
||||
* Instead of each message registering its own window listener (O(n) listeners),
|
||||
* this provider registers just 2 listeners total and dispatches to messages via context.
|
||||
*/
|
||||
export function MessageActionsProvider({ children }) {
|
||||
const [editingMessage, setEditingMessage] = useState(null);
|
||||
const [deletedMessages, setDeletedMessages] = useState(new Set());
|
||||
|
||||
useEffect(() => {
|
||||
function handleEditEvent(e) {
|
||||
const { chatId, role } = e.detail;
|
||||
if (!chatId || !role) return;
|
||||
|
||||
setEditingMessage((prev) => {
|
||||
if (prev?.chatId === chatId && prev?.role === role) {
|
||||
return null;
|
||||
}
|
||||
return { chatId, role };
|
||||
});
|
||||
}
|
||||
|
||||
function handleDeleteEvent(e) {
|
||||
const { chatId } = e.detail;
|
||||
if (!chatId) return;
|
||||
|
||||
setDeletedMessages((prev) => {
|
||||
const next = new Set(prev);
|
||||
next.add(chatId);
|
||||
return next;
|
||||
});
|
||||
}
|
||||
|
||||
window.addEventListener(EDIT_EVENT, handleEditEvent);
|
||||
window.addEventListener(DELETE_EVENT, handleDeleteEvent);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener(EDIT_EVENT, handleEditEvent);
|
||||
window.removeEventListener(DELETE_EVENT, handleDeleteEvent);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const isEditing = useCallback(
|
||||
(chatId, role) => {
|
||||
return editingMessage?.chatId === chatId && editingMessage?.role === role;
|
||||
},
|
||||
[editingMessage]
|
||||
);
|
||||
|
||||
const isDeleted = useCallback(
|
||||
(chatId) => {
|
||||
return deletedMessages.has(chatId);
|
||||
},
|
||||
[deletedMessages]
|
||||
);
|
||||
|
||||
const clearEditing = useCallback(() => {
|
||||
setEditingMessage(null);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<MessageActionsContext.Provider
|
||||
value={{ editingMessage, isEditing, isDeleted, clearEditing }}
|
||||
>
|
||||
{children}
|
||||
</MessageActionsContext.Provider>
|
||||
);
|
||||
}
|
||||
|
||||
export function useMessageActionsContext() {
|
||||
return useContext(MessageActionsContext);
|
||||
}
|
||||
|
||||
export { EDIT_EVENT, DELETE_EVENT };
|
||||
@@ -0,0 +1,243 @@
|
||||
import React, { useState, useEffect, useRef } from "react";
|
||||
import { CaretDown, Check, X, Hammer } from "@phosphor-icons/react";
|
||||
import AgentSkillWhitelist from "@/models/agentSkillWhitelist";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function ToolApprovalRequest({
|
||||
requestId,
|
||||
skillName,
|
||||
payload = {},
|
||||
description = null,
|
||||
timeoutMs = null,
|
||||
websocket,
|
||||
onResponse,
|
||||
}) {
|
||||
const [isExpanded, setIsExpanded] = useState(false);
|
||||
const [responded, setResponded] = useState(false);
|
||||
const [approved, setApproved] = useState(null);
|
||||
const [alwaysAllow, setAlwaysAllow] = useState(false);
|
||||
const [timeRemaining, setTimeRemaining] = useState(timeoutMs);
|
||||
const startTimeRef = useRef(null);
|
||||
const hasPayload = payload && Object.keys(payload).length > 0;
|
||||
|
||||
useEffect(() => {
|
||||
if (!timeoutMs || responded) return;
|
||||
if (startTimeRef.current === null) {
|
||||
startTimeRef.current = Date.now();
|
||||
}
|
||||
|
||||
const intervalId = setInterval(() => {
|
||||
const elapsed = Date.now() - startTimeRef.current;
|
||||
const remaining = Math.max(0, timeoutMs - elapsed);
|
||||
setTimeRemaining(remaining);
|
||||
|
||||
if (remaining <= 0) {
|
||||
clearInterval(intervalId);
|
||||
handleTimeout();
|
||||
}
|
||||
}, 50);
|
||||
|
||||
return () => clearInterval(intervalId);
|
||||
}, [timeoutMs, responded]);
|
||||
|
||||
function handleTimeout() {
|
||||
if (responded) return;
|
||||
setResponded(true);
|
||||
setApproved(false);
|
||||
onResponse?.(false);
|
||||
}
|
||||
|
||||
async function handleResponse(isApproved) {
|
||||
if (responded) return;
|
||||
|
||||
setResponded(true);
|
||||
setApproved(isApproved);
|
||||
|
||||
// If user approved and checked "Always allow", add to whitelist
|
||||
if (isApproved && alwaysAllow) {
|
||||
await AgentSkillWhitelist.addToWhitelist(skillName);
|
||||
}
|
||||
|
||||
if (websocket && websocket.readyState === WebSocket.OPEN) {
|
||||
websocket.send(
|
||||
JSON.stringify({
|
||||
type: "toolApprovalResponse",
|
||||
requestId,
|
||||
approved: isApproved,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
onResponse?.(isApproved);
|
||||
}
|
||||
|
||||
const progressPercent = timeoutMs ? (timeRemaining / timeoutMs) * 100 : 0;
|
||||
|
||||
return (
|
||||
<div className="flex justify-center w-full my-1 pr-4">
|
||||
<div className="w-full flex flex-col">
|
||||
<div className="w-full">
|
||||
<div
|
||||
style={{
|
||||
transition: "all 0.1s ease-in-out",
|
||||
borderRadius: "16px",
|
||||
}}
|
||||
className="relative bg-zinc-800 light:bg-slate-100 p-4 pb-2 flex flex-col gap-y-1 overflow-hidden"
|
||||
>
|
||||
<ToolApprovalHeader
|
||||
skillName={skillName}
|
||||
hasPayload={hasPayload}
|
||||
isExpanded={isExpanded}
|
||||
setIsExpanded={setIsExpanded}
|
||||
/>
|
||||
<div className="flex flex-col gap-y-1">
|
||||
{description && (
|
||||
<span className="text-white/60 light:text-slate-700 font-medium font-mono text-xs">
|
||||
{description}
|
||||
</span>
|
||||
)}
|
||||
<ToolApprovalPayload payload={payload} isExpanded={isExpanded} />
|
||||
<ToolApprovalResponseOption
|
||||
approved={approved}
|
||||
skillName={skillName}
|
||||
alwaysAllow={alwaysAllow}
|
||||
setAlwaysAllow={setAlwaysAllow}
|
||||
onApprove={() => handleResponse(true)}
|
||||
onReject={() => handleResponse(false)}
|
||||
/>
|
||||
<ToolApprovalResponseMessage approved={approved} />
|
||||
</div>
|
||||
{timeoutMs && !responded && (
|
||||
<div className="absolute bottom-0 left-0 right-0 h-1 bg-zinc-700 light:bg-slate-300">
|
||||
<div
|
||||
className="h-full bg-sky-500 light:bg-sky-600 transition-none"
|
||||
style={{ width: `${progressPercent}%` }}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ToolApprovalHeader({
|
||||
skillName,
|
||||
hasPayload,
|
||||
isExpanded,
|
||||
setIsExpanded,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<div className="flex w-full items-center justify-between">
|
||||
<div className="flex items-center gap-2">
|
||||
<Hammer size={16} />
|
||||
<div className="text-white/80 light:text-slate-900 font-medium text-sm flex gap-x-1">
|
||||
{t("chat_window.agent_invocation.model_wants_to_call")}
|
||||
<span className="font-semibold text-sky-400 light:text-sky-600">
|
||||
{skillName}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
{hasPayload && (
|
||||
<button
|
||||
onClick={() => setIsExpanded(!isExpanded)}
|
||||
className="absolute top-4 right-4 border-none"
|
||||
aria-label={isExpanded ? "Hide details" : "Show details"}
|
||||
>
|
||||
<CaretDown
|
||||
className={`w-4 h-4 transform transition-transform duration-200 ${isExpanded ? "rotate-180" : ""}`}
|
||||
/>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ToolApprovalPayload({ payload, isExpanded }) {
|
||||
const hasPayload = payload && Object.keys(payload).length > 0;
|
||||
if (!hasPayload || !isExpanded) return null;
|
||||
|
||||
function formatPayload(data) {
|
||||
if (typeof data === "string") return data;
|
||||
try {
|
||||
return JSON.stringify(data, null, 2);
|
||||
} catch {
|
||||
return String(data);
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="p-3 bg-zinc-900/50 light:bg-slate-200/50 rounded-lg overflow-x-auto">
|
||||
<pre className="text-xs text-zinc-300 light:text-slate-700 font-mono whitespace-pre-wrap break-words">
|
||||
{formatPayload(payload)}
|
||||
</pre>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ToolApprovalResponseOption({
|
||||
approved,
|
||||
skillName,
|
||||
alwaysAllow,
|
||||
setAlwaysAllow,
|
||||
onApprove,
|
||||
onReject,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
if (approved !== null) return null;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-2 mt-1 pb-2">
|
||||
<div className="flex gap-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={onApprove}
|
||||
className="border-none transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
|
||||
>
|
||||
{t("chat_window.agent_invocation.approve")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={onReject}
|
||||
className="border-none text-white light:text-slate-900 text-sm font-medium w-[70px] h-9 rounded-lg hover:bg-white/5 light:hover:bg-slate-300"
|
||||
>
|
||||
{t("chat_window.agent_invocation.reject")}
|
||||
</button>
|
||||
</div>
|
||||
<label className="flex items-center gap-2 cursor-pointer text-white/60 light:text-slate-600 text-xs hover:text-white/80 light:hover:text-slate-800 transition-colors">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={alwaysAllow}
|
||||
onChange={(e) => setAlwaysAllow(e.target.checked)}
|
||||
className="w-3.5 h-3.5 rounded border-white/20 bg-transparent cursor-pointer"
|
||||
/>
|
||||
<span>
|
||||
{t("chat_window.agent_invocation.always_allow", { skillName })}
|
||||
</span>
|
||||
</label>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ToolApprovalResponseMessage({ approved }) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
if (approved === null) return null;
|
||||
if (approved === false) {
|
||||
return (
|
||||
<div className="flex items-center gap-1 text-sm font-medium text-red-400 light:text-red-500">
|
||||
<X size={16} weight="bold" />
|
||||
<span>{t("chat_window.agent_invocation.tool_call_was_rejected")}</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-1 text-sm font-medium text-green-400 light:text-green-500">
|
||||
<Check size={16} weight="bold" />
|
||||
<span>{t("chat_window.agent_invocation.tool_call_was_approved")}</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -9,6 +9,8 @@ import {
|
||||
import HistoricalMessage from "./HistoricalMessage";
|
||||
import PromptReply from "./PromptReply";
|
||||
import StatusResponse from "./StatusResponse";
|
||||
import ToolApprovalRequest from "./ToolApprovalRequest";
|
||||
import FileDownloadCard from "./FileDownloadCard";
|
||||
import { useManageWorkspaceModal } from "../../../Modals/ManageWorkspace";
|
||||
import ManageWorkspace from "../../../Modals/ManageWorkspace";
|
||||
import { ArrowDown } from "@phosphor-icons/react";
|
||||
@@ -21,6 +23,7 @@ import Appearance from "@/models/appearance";
|
||||
import useTextSize from "@/hooks/useTextSize";
|
||||
import useChatHistoryScrollHandle from "@/hooks/useChatHistoryScrollHandle";
|
||||
import { ThoughtExpansionProvider } from "./ThoughtContainer";
|
||||
import { MessageActionsProvider } from "./MessageActionsContext";
|
||||
|
||||
export default forwardRef(function (
|
||||
{
|
||||
@@ -29,6 +32,7 @@ export default forwardRef(function (
|
||||
sendCommand,
|
||||
updateHistory,
|
||||
regenerateAssistantMessage,
|
||||
websocket = null,
|
||||
},
|
||||
ref
|
||||
) {
|
||||
@@ -179,6 +183,7 @@ export default forwardRef(function (
|
||||
regenerateAssistantMessage,
|
||||
saveEditedMessage,
|
||||
forkThread,
|
||||
websocket,
|
||||
}),
|
||||
[
|
||||
workspace,
|
||||
@@ -186,6 +191,7 @@ export default forwardRef(function (
|
||||
regenerateAssistantMessage,
|
||||
saveEditedMessage,
|
||||
forkThread,
|
||||
websocket,
|
||||
]
|
||||
);
|
||||
const lastMessageInfo = useMemo(() => getLastMessageInfo(history), [history]);
|
||||
@@ -204,41 +210,43 @@ export default forwardRef(function (
|
||||
);
|
||||
|
||||
return (
|
||||
<ThoughtExpansionProvider>
|
||||
<div
|
||||
className={`markdown text-white/80 light:text-theme-text-primary font-light ${textSizeClass} h-full md:h-[83%] pb-[100px] pt-6 md:pt-0 md:pb-20 md:mx-0 overflow-y-scroll flex flex-col items-center justify-start ${showScrollbar ? "show-scrollbar" : "no-scroll"}`}
|
||||
id="chat-history"
|
||||
ref={chatHistoryRef}
|
||||
onScroll={handleScroll}
|
||||
>
|
||||
<div className="w-full max-w-[750px]">
|
||||
{compiledHistory.map((item, index) =>
|
||||
Array.isArray(item) ? renderStatusResponse(item, index) : item
|
||||
<MessageActionsProvider>
|
||||
<ThoughtExpansionProvider>
|
||||
<div
|
||||
className={`markdown text-white/80 light:text-theme-text-primary font-light ${textSizeClass} h-full md:h-[83%] pb-[100px] pt-6 md:pt-0 md:pb-20 md:mx-0 overflow-y-scroll flex flex-col items-center justify-start ${showScrollbar ? "show-scrollbar" : "no-scroll"}`}
|
||||
id="chat-history"
|
||||
ref={chatHistoryRef}
|
||||
onScroll={handleScroll}
|
||||
>
|
||||
<div className="w-full max-w-[750px]">
|
||||
{compiledHistory.map((item, index) =>
|
||||
Array.isArray(item) ? renderStatusResponse(item, index) : item
|
||||
)}
|
||||
</div>
|
||||
{showing && (
|
||||
<ManageWorkspace
|
||||
hideModal={hideModal}
|
||||
providedSlug={workspace.slug}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
{showing && (
|
||||
<ManageWorkspace
|
||||
hideModal={hideModal}
|
||||
providedSlug={workspace.slug}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
{!isAtBottom && (
|
||||
<div className="absolute bottom-40 right-10 z-50 cursor-pointer animate-pulse">
|
||||
<div className="flex flex-col items-center">
|
||||
<div
|
||||
className="p-1 rounded-full border border-white/10 bg-white/10 hover:bg-white/20 hover:text-white"
|
||||
onClick={() => {
|
||||
scrollToBottom(isStreaming ? false : true);
|
||||
setIsUserScrolling(false);
|
||||
}}
|
||||
>
|
||||
<ArrowDown weight="bold" className="text-white/60 w-5 h-5" />
|
||||
{!isAtBottom && (
|
||||
<div className="absolute bottom-40 right-10 z-50 cursor-pointer animate-pulse">
|
||||
<div className="flex flex-col items-center">
|
||||
<div
|
||||
className="p-1 rounded-full border border-white/10 bg-white/10 hover:bg-white/20 hover:text-white"
|
||||
onClick={() => {
|
||||
scrollToBottom(isStreaming ? false : true);
|
||||
setIsUserScrolling(false);
|
||||
}}
|
||||
>
|
||||
<ArrowDown weight="bold" className="text-white/60 w-5 h-5" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</ThoughtExpansionProvider>
|
||||
)}
|
||||
</ThoughtExpansionProvider>
|
||||
</MessageActionsProvider>
|
||||
);
|
||||
});
|
||||
|
||||
@@ -262,6 +270,7 @@ const getLastMessageInfo = (history) => {
|
||||
* @param {Function} param0.regenerateAssistantMessage - The function to regenerate the assistant message.
|
||||
* @param {Function} param0.saveEditedMessage - The function to save the edited message.
|
||||
* @param {Function} param0.forkThread - The function to fork the thread.
|
||||
* @param {WebSocket} param0.websocket - The active websocket connection for agent communication.
|
||||
* @returns {Array} The compiled history of messages.
|
||||
*/
|
||||
function buildMessages({
|
||||
@@ -270,6 +279,7 @@ function buildMessages({
|
||||
regenerateAssistantMessage,
|
||||
saveEditedMessage,
|
||||
forkThread,
|
||||
websocket,
|
||||
}) {
|
||||
return history.reduce((acc, props, index) => {
|
||||
const isLastBotReply =
|
||||
@@ -284,8 +294,25 @@ function buildMessages({
|
||||
return acc;
|
||||
}
|
||||
|
||||
if (props.type === "toolApprovalRequest") {
|
||||
acc.push(
|
||||
<ToolApprovalRequest
|
||||
key={`tool-approval-${props.requestId}`}
|
||||
requestId={props.requestId}
|
||||
skillName={props.skillName}
|
||||
payload={props.payload}
|
||||
description={props.description}
|
||||
timeoutMs={props.timeoutMs}
|
||||
websocket={websocket}
|
||||
/>
|
||||
);
|
||||
return acc;
|
||||
}
|
||||
|
||||
if (props.type === "rechartVisualize" && !!props.content) {
|
||||
acc.push(<Chartable key={props.uuid} props={props} />);
|
||||
} else if (props.type === "fileDownloadCard" && !!props.content) {
|
||||
acc.push(<FileDownloadCard key={props.uuid} props={props} />);
|
||||
} else if (isLastBotReply && props.animate) {
|
||||
acc.push(
|
||||
<PromptReply
|
||||
@@ -316,6 +343,7 @@ function buildMessages({
|
||||
saveEditedMessage={saveEditedMessage}
|
||||
forkThread={forkThread}
|
||||
metrics={props.metrics}
|
||||
outputs={props.outputs}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -34,14 +34,6 @@ export default function AvailableAgentsButton({ showing, setShowAgents }) {
|
||||
);
|
||||
}
|
||||
|
||||
function AbilityTag({ text }) {
|
||||
return (
|
||||
<div className="px-2 bg-theme-action-menu-item-hover text-theme-text-secondary text-xs w-fit rounded-sm">
|
||||
<p>{text}</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export function AvailableAgents({
|
||||
showing,
|
||||
setShowing,
|
||||
@@ -109,26 +101,6 @@ export function AvailableAgents({
|
||||
<b>{t("chat_window.at_agent")}</b>
|
||||
{t("chat_window.default_agent_description")}
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2 mt-2">
|
||||
<AbilityTag text="rag-search" />
|
||||
<AbilityTag text="web-scraping" />
|
||||
<AbilityTag text="web-browsing" />
|
||||
<AbilityTag text="save-file-to-browser" />
|
||||
<AbilityTag text="list-documents" />
|
||||
<AbilityTag text="summarize-document" />
|
||||
<AbilityTag text="chart-generation" />
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
disabled={true}
|
||||
className="w-full rounded-xl flex flex-col justify-start group"
|
||||
>
|
||||
<div className="w-full flex-col text-center flex pointer-events-none">
|
||||
<div className="text-theme-text-secondary text-xs italic">
|
||||
{t("chat_window.custom_agents_coming_soon")}
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
import paths from "@/utils/paths";
|
||||
import Admin from "@/models/admin";
|
||||
import System from "@/models/system";
|
||||
import AgentPlugins from "@/models/experimental/agentPlugins";
|
||||
import AgentFlows from "@/models/agentFlows";
|
||||
import {
|
||||
@@ -17,16 +18,23 @@ import { useIsAgentSessionActive } from "@/utils/chat/agent";
|
||||
export default function AgentSkillsTab({
|
||||
highlightedIndex = -1,
|
||||
registerItemCount,
|
||||
workspace,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const { showAgentCommand = true } = workspace ?? {};
|
||||
const agentSessionActive = useIsAgentSessionActive();
|
||||
const defaultSkills = getDefaultSkills(t);
|
||||
const configurableSkills = getConfigurableSkills(t);
|
||||
const [fileSystemAgentAvailable, setFileSystemAgentAvailable] =
|
||||
useState(false);
|
||||
const configurableSkills = getConfigurableSkills(t, {
|
||||
fileSystemAgentAvailable,
|
||||
});
|
||||
const [disabledDefaults, setDisabledDefaults] = useState([]);
|
||||
const [enabledConfigurable, setEnabledConfigurable] = useState([]);
|
||||
const [importedSkills, setImportedSkills] = useState([]);
|
||||
const [flows, setFlows] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const showAgentCmdActivationAlert = showAgentCommand && !agentSessionActive;
|
||||
|
||||
useEffect(() => {
|
||||
fetchSkillSettings();
|
||||
@@ -34,13 +42,14 @@ export default function AgentSkillsTab({
|
||||
|
||||
async function fetchSkillSettings() {
|
||||
try {
|
||||
const [prefs, flowsRes] = await Promise.all([
|
||||
const [prefs, flowsRes, fsAgentAvailable] = await Promise.all([
|
||||
Admin.systemPreferencesByFields([
|
||||
"disabled_agent_skills",
|
||||
"default_agent_skills",
|
||||
"imported_agent_skills",
|
||||
]),
|
||||
AgentFlows.listFlows(),
|
||||
System.isFileSystemAgentAvailable(),
|
||||
]);
|
||||
|
||||
if (prefs?.settings) {
|
||||
@@ -49,6 +58,7 @@ export default function AgentSkillsTab({
|
||||
setImportedSkills(prefs.settings.imported_agent_skills ?? []);
|
||||
}
|
||||
if (flowsRes?.flows) setFlows(flowsRes.flows);
|
||||
setFileSystemAgentAvailable(fsAgentAvailable);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
} finally {
|
||||
@@ -147,7 +157,7 @@ export default function AgentSkillsTab({
|
||||
|
||||
return (
|
||||
<>
|
||||
{!agentSessionActive && (
|
||||
{showAgentCmdActivationAlert && (
|
||||
<p className="text-xs text-theme-text-secondary text-center py-1">
|
||||
{t("chat_window.use_agent_session_to_use_tools")}
|
||||
</p>
|
||||
|
||||
@@ -29,6 +29,7 @@ function getTabs(t, user) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Workspace} props.workspace - the workspace object
|
||||
* @param {boolean} props.showing
|
||||
* @param {function} props.setShowing
|
||||
* @param {function} props.sendCommand
|
||||
@@ -36,6 +37,7 @@ function getTabs(t, user) {
|
||||
* @param {boolean} [props.centered] - when true, popup opens below the input
|
||||
*/
|
||||
export default function ToolsMenu({
|
||||
workspace,
|
||||
showing,
|
||||
setShowing,
|
||||
sendCommand,
|
||||
@@ -147,6 +149,7 @@ export default function ToolsMenu({
|
||||
promptRef={promptRef}
|
||||
highlightedIndex={highlightedIndex}
|
||||
registerItemCount={registerItemCount}
|
||||
workspace={workspace}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -24,6 +24,7 @@ export const PROMPT_INPUT_EVENT = "set_prompt_input";
|
||||
const MAX_EDIT_STACK_SIZE = 100;
|
||||
|
||||
/**
|
||||
* @param {Workspace} props.workspace - workspace object
|
||||
* @param {function} props.submit - form submit handler
|
||||
* @param {boolean} props.isStreaming - disables input while streaming response
|
||||
* @param {function} props.sendCommand - handler for slash commands and agent mentions
|
||||
@@ -33,6 +34,7 @@ const MAX_EDIT_STACK_SIZE = 100;
|
||||
* @param {string} [props.threadSlug] - thread slug for home page context
|
||||
*/
|
||||
export default function PromptInput({
|
||||
workspace = {},
|
||||
submit,
|
||||
isStreaming,
|
||||
sendCommand,
|
||||
@@ -42,6 +44,7 @@ export default function PromptInput({
|
||||
threadSlug = null,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const { showAgentCommand = true } = workspace ?? {};
|
||||
const { isDisabled } = useIsDisabled();
|
||||
const agentSessionActive = useIsAgentSessionActive();
|
||||
const [promptInput, setPromptInput] = useState("");
|
||||
@@ -329,6 +332,7 @@ export default function PromptInput({
|
||||
>
|
||||
<div className="relative w-[95vw] md:w-[750px]">
|
||||
<ToolsMenu
|
||||
workspace={workspace}
|
||||
showing={showTools}
|
||||
setShowing={setShowTools}
|
||||
sendCommand={sendCommand}
|
||||
@@ -371,7 +375,7 @@ export default function PromptInput({
|
||||
sendCommand={sendCommand}
|
||||
promptInput={promptInput}
|
||||
textareaRef={textareaRef}
|
||||
visible={!agentSessionActive}
|
||||
visible={!agentSessionActive & showAgentCommand}
|
||||
/>
|
||||
</div>
|
||||
<ToolsButton
|
||||
|
||||
@@ -231,11 +231,13 @@ export default function ChatContainer({ workspace, knownHistory = [] }) {
|
||||
// Override hook for new messages to now go to agents until the connection closes
|
||||
if (!!websocket) {
|
||||
if (!promptMessage || !promptMessage?.userMessage) return false;
|
||||
const attachments = promptMessage?.attachments ?? parseAttachments();
|
||||
window.dispatchEvent(new CustomEvent(CLEAR_ATTACHMENTS_EVENT));
|
||||
websocket.send(
|
||||
JSON.stringify({
|
||||
type: "awaitingFeedback",
|
||||
feedback: promptMessage?.userMessage,
|
||||
attachments,
|
||||
})
|
||||
);
|
||||
return;
|
||||
@@ -374,6 +376,7 @@ export default function ChatContainer({ workspace, knownHistory = [] }) {
|
||||
{t("main-page.greeting")}
|
||||
</h1>
|
||||
<PromptInput
|
||||
workspace={workspace}
|
||||
submit={handleSubmit}
|
||||
isStreaming={loadingResponse}
|
||||
sendCommand={sendCommand}
|
||||
@@ -425,9 +428,11 @@ export default function ChatContainer({ workspace, knownHistory = [] }) {
|
||||
sendCommand={sendCommand}
|
||||
updateHistory={setChatHistory}
|
||||
regenerateAssistantMessage={regenerateAssistantMessage}
|
||||
websocket={websocket}
|
||||
/>
|
||||
</MetricsProvider>
|
||||
<PromptInput
|
||||
workspace={workspace}
|
||||
submit={handleSubmit}
|
||||
isStreaming={loadingResponse}
|
||||
sendCommand={sendCommand}
|
||||
|
||||
@@ -161,3 +161,50 @@ function TextContent({ label, description, labelStyles = {}, hint }) {
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple toggle switch that doesn't use label/input to avoid focus-scroll issues
|
||||
*/
|
||||
export function SimpleToggleSwitch({
|
||||
className,
|
||||
enabled,
|
||||
onChange,
|
||||
disabled = false,
|
||||
size = "sm",
|
||||
}) {
|
||||
return (
|
||||
<div
|
||||
role="switch"
|
||||
aria-checked={enabled}
|
||||
tabIndex={0}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
onChange(!enabled);
|
||||
}}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === "Enter" || e.key === " ") {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
onChange(!enabled);
|
||||
}
|
||||
}}
|
||||
className={`
|
||||
relative shrink-0 cursor-pointer rounded-full ${disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"}
|
||||
${size === "sm" ? "h-[12px] w-[20px]" : size === "md" ? "h-[16px] w-[28px]" : "h-[19px] w-[36px]"}
|
||||
transition-colors duration-200
|
||||
${enabled ? "bg-green-400" : "bg-zinc-500"}
|
||||
${className}
|
||||
`}
|
||||
>
|
||||
<div
|
||||
className={`
|
||||
absolute top-[2px] left-[2px]
|
||||
${size === "sm" ? "h-[8px] w-[8px]" : size === "md" ? "h-[12px] w-[12px]" : "h-[15px] w-[15px]"}
|
||||
rounded-full bg-white
|
||||
transition-transform duration-200
|
||||
${enabled ? "translate-x-full" : "translate-x-0"}
|
||||
`}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ export default function useScrollActiveItemIntoView({
|
||||
|
||||
useEffect(() => {
|
||||
if (isActive) {
|
||||
ref.current.scrollIntoView({
|
||||
ref.current?.scrollIntoView({
|
||||
behavior,
|
||||
block,
|
||||
});
|
||||
|
||||
@@ -7,10 +7,22 @@ const availableThemes = {
|
||||
dark: "Dark",
|
||||
};
|
||||
|
||||
/**
|
||||
* @typedef {'system' | 'light' | 'dark'} ThemeOption
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} UseThemeResult
|
||||
* @property {ThemeOption} theme - The current theme preference stored in localStorage.
|
||||
* @property {(newTheme: ThemeOption) => void} setTheme - Sets the theme preference.
|
||||
* @property {{system: string, light: string, dark: string}} availableThemes - Map of theme keys to display names.
|
||||
* @property {boolean} isLight - Whether the resolved theme is light (explicitly or via system preference).
|
||||
*/
|
||||
|
||||
/**
|
||||
* Determines the current theme of the application.
|
||||
* "system" follows the OS preference, "light" and "dark" force that mode.
|
||||
* @returns {{theme: ('system' | 'light' | 'dark'), setTheme: function, availableThemes: object}}
|
||||
* @returns {UseThemeResult}
|
||||
*/
|
||||
export function useTheme() {
|
||||
const [theme, _setTheme] = useState(() => {
|
||||
@@ -59,11 +71,16 @@ export function useTheme() {
|
||||
/**
|
||||
* Sets the theme of the application and runs any
|
||||
* other necessary side effects
|
||||
* @param {string} newTheme The new theme to set
|
||||
* @param {ThemeOption} newTheme The new theme to set
|
||||
*/
|
||||
function setTheme(newTheme) {
|
||||
_setTheme(newTheme);
|
||||
}
|
||||
|
||||
return { theme, setTheme, availableThemes };
|
||||
return {
|
||||
theme,
|
||||
setTheme,
|
||||
availableThemes,
|
||||
isLight: resolvedTheme === "light",
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1040,13 +1040,14 @@ does not extend the close button beyond the viewport. */
|
||||
}
|
||||
}
|
||||
|
||||
/* Math/Katex formatting to prevent duplication of content on screen */
|
||||
.katex-html[aria-hidden="true"] {
|
||||
display: none;
|
||||
/* KaTeX overrides - base CSS imported via markdown-katex.js plugin */
|
||||
.katex-display {
|
||||
margin: 0 !important;
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.katex-mathml {
|
||||
font-size: 20px;
|
||||
.katex-display > .katex {
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
.rti--container {
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "مرحبا في",
|
||||
getStarted: "بسم الله",
|
||||
welcome: "أهلاً وسهلاً",
|
||||
},
|
||||
llm: {
|
||||
title: "إعدادات نموذج التعلم العميق المفضّلة",
|
||||
@@ -50,7 +50,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "اسم مساحة العمل",
|
||||
user: "مستعمِل",
|
||||
selection: "اختيار النموذج",
|
||||
saving: "حفظ...",
|
||||
save: "حفظ التغييرات",
|
||||
@@ -62,6 +61,11 @@ const TRANSLATIONS = {
|
||||
search: "بحث",
|
||||
username_requirements:
|
||||
"يجب أن يتكون اسم المستخدم من 2 إلى 32 حرفًا، ويبدأ بحرف صغير، ويحتوي فقط على حروف وأرقام وعلامات التسطير والنقاط.",
|
||||
on: "على",
|
||||
none: "لا",
|
||||
stopped: "توقف",
|
||||
loading: "تحميل",
|
||||
refresh: "استعيد/جدد",
|
||||
},
|
||||
settings: {
|
||||
title: "إعدادات المثيل",
|
||||
@@ -99,6 +103,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "حسابك",
|
||||
"import-item": "استيراد العنصر",
|
||||
},
|
||||
channels: "القنوات",
|
||||
"available-channels": {
|
||||
telegram: "تليجرام",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -175,15 +183,18 @@ const TRANSLATIONS = {
|
||||
title: "وضع المحادثة",
|
||||
chat: {
|
||||
title: "المحادثة",
|
||||
"desc-start": "سيقدم إجابات حسب المعرفة العامة لنموذج التعلم العميق",
|
||||
and: "and",
|
||||
"desc-end": "المستند الذي تم العثور عليه حسب السياق.",
|
||||
description:
|
||||
'سيوفر إجابات بناءً على المعرفة العامة للنموذج اللغوي الكبير، بالإضافة إلى سياق المستند المتاح. ستحتاج إلى استخدام الأمر "@agent" لاستخدام الأدوات.',
|
||||
},
|
||||
query: {
|
||||
title: "استعلام",
|
||||
"desc-start": "سوف تقدم الإجابات",
|
||||
only: "فقط",
|
||||
"desc-end": "إذا وجد المستند في السياق",
|
||||
description:
|
||||
'سيوفر الإجابات <b>فقط</b> إذا تم العثور على سياق الوثيقة. <br />ستحتاج إلى استخدام الأمر "@agent" لاستخدام الأدوات.',
|
||||
},
|
||||
automatic: {
|
||||
title: "سيارة",
|
||||
description:
|
||||
'سيتم استخدام الأدوات تلقائيًا إذا كان النموذج والمزود يدعمان استدعاء الأدوات الأصلية. إذا لم يتم دعم الأدوات الأصلية، فسيتعين عليك استخدام الأمر "@agent" لاستخدام الأدوات.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -296,11 +307,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"تمكين الوكيل الافتراضي لإنشاء أنواع مختلفة من المخططات من البيانات المقدمة أو المعطاة في المحادثة.",
|
||||
},
|
||||
save: {
|
||||
title: "إنشاء الملفات وحفظها في المتصفح",
|
||||
description:
|
||||
"تمكين الوكيل الافتراضي من إنشاء الملفات والكتابة عليها وحفظها و تنزيلها في متصفحك.",
|
||||
},
|
||||
web: {
|
||||
title: "البحث والتصفح المباشر على الويب",
|
||||
description:
|
||||
@@ -313,6 +319,140 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"افتراضيًا، يتم تفعيل هذه الميزة، ولكن يمكنك تعطيلها إذا لم ترغب في أن تكون متاحة للممثل.",
|
||||
filesystem: {
|
||||
title: "الوصول إلى نظام الملفات",
|
||||
description:
|
||||
"السماح لمسؤولك بقراءة وكتابة الملفات والبحث عنها وإدارتها داخل مجلد محدد. يدعم تعديل الملفات وتصفح المجلدات والبحث عن المحتوى.",
|
||||
learnMore: "تعرف على المزيد حول كيفية استخدام هذه المهارة.",
|
||||
configuration: "التكوين",
|
||||
readActions: "اقرأ الإجراءات",
|
||||
writeActions: "الإجراءات",
|
||||
warning:
|
||||
"الوصول إلى نظام الملفات يمكن أن يكون خطيرًا، لأنه يمكنه تعديل أو حذف الملفات. يرجى الرجوع إلى الوثائق <link> قبل تمكينه.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "اقرأ الملف",
|
||||
description:
|
||||
"قراءة محتويات الملفات (النصوص، الشيفرة، ملفات PDF، الصور، إلخ).",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "قراءة ملفات متعددة",
|
||||
description: "اقرأ ملفات متعددة في وقت واحد.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "قائمة الاتجاهات",
|
||||
description: "اعرض قائمة الملفات والمجلدات الموجودة في مجلد معين.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "البحث عن الملفات",
|
||||
description: "ابحث عن الملفات حسب الاسم أو محتواها.",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "الحصول على معلومات الملف",
|
||||
description: "احصل على بيانات وصف تفصيلية حول الملفات.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "تحرير الملف",
|
||||
description:
|
||||
"قم بإجراء التعديلات على ملفات النصوص بناءً على الأسطر.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "إنشاء مجلد",
|
||||
description: "إنشاء مجلدات جديدة",
|
||||
},
|
||||
"move-file": {
|
||||
title: "تحريك/إعادة تسمية الملف",
|
||||
description: "انقل أو غير أسماء الملفات والمجلدات.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "نسخ الملف",
|
||||
description: "نسخ الملفات والمجلدات",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "إنشاء ملف نصي",
|
||||
description:
|
||||
"إنشاء ملفات نصية جديدة أو استبدال الملفات النصية الموجودة.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "إنشاء المستندات",
|
||||
description:
|
||||
"اسمح لمسؤولك بإنشاء ملفات بتنسيقات ثنائية مثل عروض PowerPoint وجداول Excel ووثائق Word وملفات PDF. يمكن تنزيل الملفات مباشرة من نافذة الدردشة.",
|
||||
configuration: "أنواع المستندات المتاحة",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "ملفات النصوص",
|
||||
description:
|
||||
"إنشاء ملفات نصية تحتوي على أي محتوى وتنسيق (مثل .txt، .md، .json، .csv، إلخ).",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "عروض تقديمية باستخدام برنامج باوربوينت",
|
||||
description:
|
||||
"إنشاء عروض تقديمية جديدة باستخدام برنامج باوربوينت، تتضمن الشرائح والعناوين والنقاط.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "ملفات PDF",
|
||||
description:
|
||||
"إنشاء مستندات PDF من ملفات Markdown أو النصوص البسيطة مع تنسيق أساسي.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "جداول بيانات في برنامج إكسل",
|
||||
description:
|
||||
"إنشاء مستندات Excel للبيانات الجدولية مع الأوراق والتصميم.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "ملفات مستندات مايكروسوفت",
|
||||
description: "إنشاء مستندات Word مع تنسيق وتصميم أساسي.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "خوادم نظام MCP",
|
||||
"loading-from-config": "تحميل خوادم MCP من ملف التكوين",
|
||||
"learn-more": "اعرف المزيد عن خوادم MCP.",
|
||||
"no-servers-found": "لم يتم العثور على أي خوادم MCP.",
|
||||
"tool-warning":
|
||||
"لتحقيق أفضل أداء، ضع في اعتبارك تعطيل الأدوات غير الضرورية للحفاظ على السياق.",
|
||||
"stop-server": "أوقف خادم MCP",
|
||||
"start-server": "ابدأ خادم MCP",
|
||||
"delete-server": "حذف خادم MCP",
|
||||
"tool-count-warning":
|
||||
"يحتوي هذا خادم MCP على <b> أدوات مُفعّلة</b> والتي ستستهلك السياق في كل محادثة. <br /> ضع في اعتبارك تعطيل الأدوات غير المرغوب فيها لتوفير السياق.",
|
||||
"startup-command": "أمر البدء",
|
||||
command: "الأمر",
|
||||
arguments: "حجج",
|
||||
"not-running-warning":
|
||||
"هذا الخادم الخاص بـ MCP غير قيد التشغيل - قد يكون متوقفًا أو يواجه مشكلة عند التشغيل.",
|
||||
"tool-call-arguments": "وسائط استدعاء الدالة",
|
||||
"tools-enabled": "الأدوات مفعّلة",
|
||||
},
|
||||
settings: {
|
||||
title: "إعدادات مهارات الوكيل",
|
||||
"max-tool-calls": {
|
||||
title: "الحد الأقصى لعدد طلبات الأدوات في الاستجابة.",
|
||||
description:
|
||||
"أقصى عدد من الأدوات التي يمكن للممثل (الوكيل) ربطها لإنشاء استجابة واحدة. وهذا يمنع استدعاءات الأدوات غير المنضبطة والحلقات اللانهائية.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "اختيار المهارات الذكية",
|
||||
"beta-badge": "بيتا",
|
||||
description:
|
||||
"تمكين استخدام أدوات غير محدودة وتقليل استخدام رموز القطع بنسبة تصل إلى 80٪ لكل استعلام - يقوم AnythingLLM تلقائيًا باختيار المهارات المناسبة لكل طلب.",
|
||||
"max-tools": {
|
||||
title: "أدوات ماكس",
|
||||
description:
|
||||
"الحد الأقصى لعدد الأدوات التي يمكن اختيارها لكل استعلام. ونوصي بتعيين هذه القيمة على قيم أعلى بالنسبة للنماذج ذات السياق الأكبر.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "موصل SQL",
|
||||
description:
|
||||
"اسمح لمسؤولك بالاستفادة من SQL للإجابة على أسئلتك من خلال الاتصال بمقدمي قواعد البيانات المختلفة.",
|
||||
},
|
||||
default_skill:
|
||||
"افتراضيًا، يتم تفعيل هذه الميزة، ولكن يمكنك تعطيلها إذا لم ترغب في أن تكون متاحة للممثل.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -588,7 +728,6 @@ const TRANSLATIONS = {
|
||||
select_all: "حدد الكل",
|
||||
deselect_all: "إلغاء التحديد الكل",
|
||||
remove_selected: "حذف المحدد",
|
||||
costs: "*تكلفة ثابتة لإنشاء التمثيلات",
|
||||
save_embed: "حفظ و تضمين",
|
||||
"total-documents_one": "{{count}}",
|
||||
"total-documents_other": "{{count}} المستندات",
|
||||
@@ -687,7 +826,6 @@ const TRANSLATIONS = {
|
||||
see_less: "اقرأ المزيد",
|
||||
see_more: "عرض المزيد",
|
||||
tools: "الأدوات",
|
||||
browse: "تصفح",
|
||||
text_size_label: "حجم النص",
|
||||
select_model: "اختر الطراز",
|
||||
sources: "مصادر",
|
||||
@@ -700,7 +838,6 @@ const TRANSLATIONS = {
|
||||
edit: "تحرير",
|
||||
publish: "نشر",
|
||||
stop_generating: "توقف عن إنشاء رد",
|
||||
pause_tts_speech_message: "توقف عن قراءة النص بصوت مسجل.",
|
||||
slash_commands: "أوامر مختصرة",
|
||||
agent_skills: "مهارات الوكيل",
|
||||
manage_agent_skills: "إدارة مهارات الوكلاء",
|
||||
@@ -709,6 +846,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "ابدأ جلسة الممثل",
|
||||
use_agent_session_to_use_tools:
|
||||
"يمكنك استخدام الأدوات المتاحة في الدردشة عن طريق بدء جلسة مع ممثل خدمة العملاء باستخدام الرمز '@agent' في بداية رسالتك.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "النموذج يرغب في الاتصال.",
|
||||
approve: "الموافقة",
|
||||
reject: "رفض",
|
||||
always_allow: "تأكد دائمًا من {{skillName}}",
|
||||
tool_call_was_approved: "تمت الموافقة على طلب الحصول على الأدوات.",
|
||||
tool_call_was_rejected: "تم رفض طلب الاتصال بالأداة.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "تحرير الحساب",
|
||||
@@ -951,6 +1096,82 @@ const TRANSLATIONS = {
|
||||
"لا تم التخصيص لأي مساحة عمل.\nيرجى الاتصال بمدير المثيل لطلب الوصول إلى مساحة عمل.",
|
||||
goToWorkspace: 'الذهاب إلى "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "روبوت تيليجرام",
|
||||
description:
|
||||
"قم بتوصيل مثيل AnyLLM الخاص بك بـ Telegram، حتى تتمكن من الدردشة مع مساحات العمل الخاصة بك من أي جهاز.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "الخطوة الأولى: إنشاء روبوت Telegram الخاص بك.",
|
||||
description:
|
||||
"افتح حساب @BotFather على تطبيق تيليجرام، وأرسل الرسالة `/newbot` إلى حساب @BotFather، واتبع التعليمات، وانسخ رمز API.",
|
||||
"open-botfather": "ابدأ محادثة مع BotFather",
|
||||
"instruction-1": "1. افتح الرابط أو قم بمسح رمز QR.",
|
||||
"instruction-2":
|
||||
"2. أرسل <code>/newbot</code> إلى <code>@BotFather</code>",
|
||||
"instruction-3": "3. اختر اسمًا واسم مستخدم لروبوتك.",
|
||||
"instruction-4": "4. انسخ رمز واجهة برمجة التطبيقات الذي تتلقاه.",
|
||||
},
|
||||
step2: {
|
||||
title: "الخطوة الثانية: قم بتوصيل روبوتك.",
|
||||
description:
|
||||
"الصق رمز API الذي تلقيته من @BotFather، ثم اختر مساحة عمل افتراضية لجهازك التابع للروبوت للدردشة فيها.",
|
||||
"bot-token": "رمز الرمز (Token)",
|
||||
"default-workspace": "مساحة العمل الافتراضية",
|
||||
"no-workspace": "لا توجد مساحات عمل متاحة. سيتم إنشاء مساحة عمل جديدة.",
|
||||
connecting: "التحميل...",
|
||||
"connect-bot": "روبوت الاتصال",
|
||||
},
|
||||
security: {
|
||||
title: "إعدادات الأمان الموصى بها",
|
||||
description:
|
||||
'لزيادة الأمان، قم بتكوين هذه الإعدادات في حساب "@BotFather".',
|
||||
"disable-groups": "– منع إضافة الروبوتات إلى المجموعات",
|
||||
"disable-inline": "– منع استخدام الروبوت في عمليات البحث المباشرة.",
|
||||
"obscure-username":
|
||||
"استخدم اسم مستخدم روبوت غير تقليدي لتقليل فرص اكتشافه.",
|
||||
},
|
||||
"toast-enter-token": "الرجاء إدخال رمز البوت.",
|
||||
"toast-connect-failed": "فشل الاتصال بالروبوت.",
|
||||
},
|
||||
connected: {
|
||||
status: "متصل",
|
||||
"status-disconnected":
|
||||
"غير متصل — قد يكون الرمز منتهي الصلاحية أو غير صالح",
|
||||
"placeholder-token": "ألصق رمز البوت الجديد...",
|
||||
reconnect: "إعادة الاتصال",
|
||||
workspace: "مساحة العمل",
|
||||
"bot-link": "رابط الروبوت",
|
||||
"voice-response": "رد صوتي",
|
||||
disconnecting: "قطع الاتصال...",
|
||||
disconnect: "افصل",
|
||||
"voice-text-only": "النص فقط",
|
||||
"voice-mirror": "مرآة (يرد الصوت عند إرسال المستخدم له)",
|
||||
"voice-always": "يرجى تضمين تسجيل صوتي (إرسال تسجيل صوتي مع كل رد).",
|
||||
"toast-disconnect-failed": "فشل فصل الوحدة الآلية.",
|
||||
"toast-reconnect-failed": "فشل إعادة الاتصال بالروبوت.",
|
||||
"toast-voice-failed": "فشلت عملية تحديث وضع الصوت.",
|
||||
"toast-approve-failed": "فشل في الموافقة على المستخدم.",
|
||||
"toast-deny-failed": "فشل في رفض طلب المستخدم.",
|
||||
"toast-revoke-failed": "فشل إلغاء صلاحية المستخدم.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "معلق على الموافقة",
|
||||
"pending-description":
|
||||
"المستخدمون في انتظار التحقق. قارن رمز المطابقة المعروض هنا بالرمز المعروض في محادثتهم على تطبيق Telegram.",
|
||||
"approved-title": "المستخدمون المعتمدون",
|
||||
"approved-description":
|
||||
"المستخدمون الذين تم منحهم الإذن للتواصل مع روبوتك.",
|
||||
user: "المستخدم",
|
||||
"pairing-code": "رمز التوفيق",
|
||||
"no-pending": "لا توجد طلبات معلقة.",
|
||||
"no-approved": "لا يوجد مستخدمون معتمدون.",
|
||||
unknown: "غير معروف",
|
||||
approve: "الموافقة",
|
||||
deny: "رفض",
|
||||
revoke: "إلغاء",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Vítejte v",
|
||||
getStarted: "Začít",
|
||||
welcome: "Vítejte",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferovaný LLM",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Název pracovního prostoru",
|
||||
user: "Uživatel",
|
||||
selection: "Výběr modelu",
|
||||
saving: "Ukládání...",
|
||||
save: "Uložit změny",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Hledat",
|
||||
username_requirements:
|
||||
"Uživatelské jméno musí mít 2–32 znaků, začínat malým písmenem a obsahovat pouze malá písmena, číslice, podtržítka, pomlčky a tečky.",
|
||||
on: "Na",
|
||||
none: "Žádné",
|
||||
stopped: "Zastaveno",
|
||||
loading: "Načítání",
|
||||
refresh: "Obnovit",
|
||||
},
|
||||
home: {
|
||||
welcome: "Vítejte",
|
||||
@@ -108,6 +112,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Váš účet",
|
||||
"import-item": "Importovat položku",
|
||||
},
|
||||
channels: "Kanály",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -191,15 +199,18 @@ const TRANSLATIONS = {
|
||||
title: "Režim chatu",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "bude poskytovat odpovědi s obecnými znalostmi LLM",
|
||||
and: "a",
|
||||
"desc-end": "kontext dokumentu, který je nalezen.",
|
||||
description:
|
||||
"bude poskytovat odpovědi založené na obecných znalostech LLM a kontextu dokumentu, který je k dispozici. Budete muset použít příkaz `@agent` pro použití nástrojů.",
|
||||
},
|
||||
query: {
|
||||
title: "Dotaz",
|
||||
"desc-start": "bude poskytovat odpovědi",
|
||||
only: "pouze",
|
||||
"desc-end": "pokud je nalezen kontext dokumentu.",
|
||||
description:
|
||||
"budou poskytovat odpovědi <b>pouze__, pokud je nalezen kontext dokumentu.</b>Budete muset použít příkaz @agent pro použití nástrojů.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Auto",
|
||||
description:
|
||||
"automaticky použije nástroje, pokud to podporují model a poskytovatel. <br />Pokud není podporováno nativní volání nástrojů, budete muset použít příkaz `@agent` pro použití nástrojů.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -312,11 +323,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Umožněte výchozímu agentovi generovat různé typy grafů z dat poskytnutých nebo uvedených v chatu.",
|
||||
},
|
||||
save: {
|
||||
title: "Generovat a ukládat soubory",
|
||||
description:
|
||||
"Umožněte výchozímu agentovi generovat a zapisovat do souborů, které lze uložit do počítače.",
|
||||
},
|
||||
web: {
|
||||
title: "Živé webové vyhledávání a prohlížení",
|
||||
description:
|
||||
@@ -329,6 +335,141 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Výchozí nastavení je, že tato schopnost je aktivní, ale můžete ji vypnout, pokud nechcete, aby ji mohl využít zástupce.",
|
||||
filesystem: {
|
||||
title: "Přístup k souborovému systému",
|
||||
description:
|
||||
"Umožněte svému zástupci, aby četl, zapisoval, vyhledával a spravoval soubory v určeném adresáři. Podporuje úpravu souborů, navigaci v adresářích a vyhledávání obsahu.",
|
||||
learnMore: "Zjistěte více o tom, jak tuto dovednost používat.",
|
||||
configuration: "Konfigurace",
|
||||
readActions: "Činnosti",
|
||||
writeActions: "Akce",
|
||||
warning:
|
||||
"Přístup k souborovému systému může být nebezpečný, protože může upravovat nebo mazat soubory. Před zapnutím funkce prosím nahlédněte do dokumentace <link>dokumentace</link>.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Otevřít soubor",
|
||||
description:
|
||||
"Přečtěte obsah souborů (text, kód, PDF, obrázky atd.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Přečtěte více souborů",
|
||||
description: "Přečtěte více souborů najednou",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Seznam adres",
|
||||
description: "Zobraz seznam souborů a adresářů v daném adresáři.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Hledat soubory",
|
||||
description: "Vyhledejte soubory podle názvu nebo obsahu",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Získejte informace o souboru",
|
||||
description: "Získejte podrobné metadatumy o souborech.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Upravit soubor",
|
||||
description:
|
||||
"Proveďte úpravy v textových souborech na základě řádků.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Vytvořit adresář",
|
||||
description: "Vytvořte nové adresáře",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Přejmenovat/přesunout soubor",
|
||||
description: "Přesun nebo přejmenování souborů a adresářů",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Zkopírovat soubor",
|
||||
description: "Zkopírujte soubory a adresáře",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Vytvořte soubor s textem",
|
||||
description:
|
||||
"Vytvořte nové textové soubory nebo přepsáním existujících textových souborů.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Vytváření dokumentů",
|
||||
description:
|
||||
"Umožněte svému zástupci vytvářet soubory ve formátech jako PowerPoint prezentace, tabulky v Excelu, dokumenty ve formátu Word a soubory ve formátu PDF. Soubory lze stahovat přímo z chatu.",
|
||||
configuration: "Dostupné typy dokumentů",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Soubory v textovém formátu",
|
||||
description:
|
||||
"Vytvořte textové soubory s libovolným obsahem a příponou (např. .txt, .md, .json, .csv atd.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Prezentace v PowerPointu",
|
||||
description:
|
||||
"Vytvořte nové prezentace v programu PowerPoint, včetně slidů, nadpisů a odrážek.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Dokumenty ve formátu PDF",
|
||||
description:
|
||||
"Vytvořte PDF dokumenty z Markdownu nebo jednoduchého textu s základním formátováním.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Tabulky v programu Excel",
|
||||
description:
|
||||
"Vytvořte tabulkové dokumenty v programu Excel, které budou obsahovat listy a stylování.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Dokumenty ve formátu Word",
|
||||
description:
|
||||
"Vytvořte dokumenty ve formátu Word s základním formátováním a stylováním.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servery společnosti MCP",
|
||||
"loading-from-config": "Načítání serverů MCP z konfiguračního souboru",
|
||||
"learn-more": "Zjistěte více o serverech MCP.",
|
||||
"no-servers-found": "Nebyl nalezen žádný server pro správu MCP.",
|
||||
"tool-warning":
|
||||
"Pro optimální výkon zvažte vypnutí nepoužívaných nástrojů, abyste ušetřili zdroje.",
|
||||
"stop-server": "Zastavte server MCP",
|
||||
"start-server": "Spustit server MCP",
|
||||
"delete-server": "Odstranit server MCP",
|
||||
"tool-count-warning":
|
||||
"Tento server pro správu chatů má povolené nástroje <b>{{count}}, které spotřebovávají kontext v každém chatu. </b> Zvažte vypnutí nepotřebných nástrojů, abyste ušetřili kontext.",
|
||||
"startup-command": "Příkaz pro spuštění",
|
||||
command: "Příkaz",
|
||||
arguments: "Argumenty",
|
||||
"not-running-warning":
|
||||
"Tento server pro správu MCP není aktivní – buď byl vypnut, nebo se při spuštění vyskytuje chyba.",
|
||||
"tool-call-arguments": "Argumenty pro volání nástroje",
|
||||
"tools-enabled": "nástroje jsou aktivovány",
|
||||
},
|
||||
settings: {
|
||||
title: "Nastavení dovedností agenta",
|
||||
"max-tool-calls": {
|
||||
title: "Maximální počet volání nástrojů na jednu odpověď",
|
||||
description:
|
||||
"Maximální počet nástrojů, které může agent spouštět v řetězci za účelem generování jedné odpovědi. To zabraňuje nekontrolovanému spouštění nástrojů a vytváření nekonečných smyček.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Inteligentní výběr dovedností",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
"Umožněte použití libovolného počtu nástrojů a snížit využití tokenů až o 80 % pro každou dotaz — AnythingLLM automaticky vybírá vhodné dovednosti pro každou žádost.",
|
||||
"max-tools": {
|
||||
title: "Nástroje Max",
|
||||
description:
|
||||
"Maximální počet nástrojů, které lze vybrat pro každou dotaz. Doporučujeme nastavit tuto hodnotu na vyšší, pro modely s větším kontextem.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Připojení k databázi SQL",
|
||||
description:
|
||||
"Umožněte svému agentovi, aby mohl využívat SQL k zodpovězení vašich otázek, a to prostřednictvím připojení k různým poskytovatelům databází.",
|
||||
},
|
||||
default_skill:
|
||||
"Výchozí nastavení je, že tato schopnost je aktivní, ale můžete ji vypnout, pokud nechcete, aby ji mohl využít zástupce.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -726,7 +867,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Vybrat vše",
|
||||
deselect_all: "Zrušit výběr všeho",
|
||||
remove_selected: "Odebrat vybrané",
|
||||
costs: "*Jednorázové náklady pro embeddingy",
|
||||
save_embed: "Uložit a vložit",
|
||||
"total-documents_one": "{{count}} dokument",
|
||||
"total-documents_other": "{{count}} dokumenty",
|
||||
@@ -816,7 +956,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Zobrazit méně",
|
||||
see_more: "Více",
|
||||
tools: "Nářadí",
|
||||
browse: "Prohlédněte si",
|
||||
text_size_label: "Velikost písma",
|
||||
select_model: "Vyberte model",
|
||||
sources: "Zdroje",
|
||||
@@ -829,8 +968,6 @@ const TRANSLATIONS = {
|
||||
edit: "Upravit",
|
||||
publish: "Publikovat",
|
||||
stop_generating: "Zastavte generování odpovědi",
|
||||
pause_tts_speech_message:
|
||||
"Zastavte čtení textu pomocí syntetické řeči z tohoto zprávy.",
|
||||
slash_commands: "Příkazy v řádku",
|
||||
agent_skills: "Dovednosti agenta",
|
||||
manage_agent_skills: "Řízení dovedností agentů",
|
||||
@@ -839,6 +976,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Spustit relaci s agentem",
|
||||
use_agent_session_to_use_tools:
|
||||
"Můžete využít nástroje v chatu spuštěním sezení s agentem pomocí příkazu '@agent' na začátku vašeho vstupu.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Model chce zavolat",
|
||||
approve: "Schválit",
|
||||
reject: "Zamítnout",
|
||||
always_allow: "Vždy dbejte na to, aby {{skillName}}",
|
||||
tool_call_was_approved: "Žádost o použití nástroje byla schválena.",
|
||||
tool_call_was_rejected: "Žádost o použití nástroje byla zamítnuta.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Upravit účet",
|
||||
@@ -966,6 +1111,86 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot pro Telegram",
|
||||
description:
|
||||
"Propojte svůj instance AnythingLLM s aplikací Telegram, abyste mohli komunikovat se svými pracovními prostory odkudkoli.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Krok 1: Vytvořte svého Telegramového robota",
|
||||
description:
|
||||
"Otevřete aplikaci @BotFather na Telegramu, odešlete příkaz `/newbot` na adresu <code>@BotFather</code>, postupujte podle pokynů a zkopírujte API token.",
|
||||
"open-botfather": "Spusťte BotFather",
|
||||
"instruction-1": "1. Otevřete odkaz nebo naskenujte QR kód",
|
||||
"instruction-2":
|
||||
"2. Pošlete <code>/newbot</code> na adresu <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Vyberte jméno a uživatelské jméno pro svého robota.",
|
||||
"instruction-4": "4. Zkopírujte API token, který obdržíte.",
|
||||
},
|
||||
step2: {
|
||||
title: "Krok 2: Připojte svého robota",
|
||||
description:
|
||||
"Vložte API token, který jste obdrželi od účtu @BotFather, a vyberte výchozí pracovní prostor, se kterým bude váš bot komunikovat.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Výchozí pracovní prostor",
|
||||
"no-workspace":
|
||||
"Nejsou k dispozici žádné pracovní prostory. Bude vytvořeno nové.",
|
||||
connecting: "Připojování...",
|
||||
"connect-bot": "Bot pro připojení",
|
||||
},
|
||||
security: {
|
||||
title: "Doporučené bezpečnostní nastavení",
|
||||
description:
|
||||
"Pro zvýšení bezpečnosti, nakonfigurujte tyto nastavení v účtu @BotFather.",
|
||||
"disable-groups": "— Zabránit přidávání bot do skupin",
|
||||
"disable-inline":
|
||||
"— Zabraňte použití robota při vyhledávání v reálném čase.",
|
||||
"obscure-username":
|
||||
"Použijte neobvyklé uživatelské jméno pro robota, abyste snížili jeho snadnou identifikovatelnost.",
|
||||
},
|
||||
"toast-enter-token": "Prosím, zadejte token pro robota.",
|
||||
"toast-connect-failed": "Nedaří se připojit k botovi.",
|
||||
},
|
||||
connected: {
|
||||
status: "Spojené",
|
||||
"status-disconnected": "Neaktivní – token může být prošlý nebo neplatný",
|
||||
"placeholder-token": "Vložte nový token pro robota...",
|
||||
reconnect: "Znovu se spojit",
|
||||
workspace: "Pracovní prostor",
|
||||
"bot-link": "Odkaz na robota",
|
||||
"voice-response": "Reakce na hlasový vstup",
|
||||
disconnecting: "Odpojování...",
|
||||
disconnect: "Odpojit",
|
||||
"voice-text-only": "Pouze text",
|
||||
"voice-mirror":
|
||||
"Zrcadlo (odpovězte hlasem, když uživatel pošle hlasovou zprávu)",
|
||||
"voice-always":
|
||||
"Vždy uveďte zvukový záznam (odesílejte zvukový záznam ke každé odpovědi)",
|
||||
"toast-disconnect-failed": "Nepodařilo se odpojit automat.",
|
||||
"toast-reconnect-failed": "Nedaří se znovu navázat spojení s botem.",
|
||||
"toast-voice-failed": "Nepodařilo se aktualizovat hlasový režim.",
|
||||
"toast-approve-failed": "Neúspěšné schválení uživatele.",
|
||||
"toast-deny-failed": "Nezucceededo v odmítnutí uživatele.",
|
||||
"toast-revoke-failed": "Nezdařilo se zrušit uživatelskou účet.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Čeká na schválení",
|
||||
"pending-description":
|
||||
"Uživatelé, kteří čekají na ověření. Porovnejte kód pro spárování, který je zde uveden, s tím, který je zobrazen v jejich chatu na Telegramu.",
|
||||
"approved-title": "Schválení uživatelů",
|
||||
"approved-description":
|
||||
"Uživatelé, kteří byli schváleni pro komunikaci s vaším botem.",
|
||||
user: "Uživatel",
|
||||
"pairing-code": "Kód pro párování",
|
||||
"no-pending": "Žádné čekající požadavky",
|
||||
"no-approved": "Žádní registrovaní uživatelé",
|
||||
unknown: "Neznámé",
|
||||
approve: "Schválit",
|
||||
deny: "Odmítnout",
|
||||
revoke: "Zrušit",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Velkommen til",
|
||||
getStarted: "Kom godt i gang",
|
||||
welcome: "Velkommen",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM-præference",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Navn på arbejdsområder",
|
||||
user: "Bruger",
|
||||
selection: "Modelvalg",
|
||||
saving: "Gemmer...",
|
||||
save: "Gem ændringer",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Søg",
|
||||
username_requirements:
|
||||
"Brugernavnet skal bestå af 2-32 tegn, starte med et lille bogstav, og kun indeholde små bogstaver, tal, understregninger, bindestreger og punktummer.",
|
||||
on: "Om",
|
||||
none: "Ingen",
|
||||
stopped: "Stoppet",
|
||||
loading: "Indlæsning",
|
||||
refresh: "Opfrisk",
|
||||
},
|
||||
settings: {
|
||||
title: "Instansindstillinger",
|
||||
@@ -102,6 +106,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Dit konti",
|
||||
"import-item": "Importeret vare",
|
||||
},
|
||||
channels: "Kanaler",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -177,15 +185,18 @@ const TRANSLATIONS = {
|
||||
title: "Chat-tilstand",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "vil give svar baseret på LLM'ens generelle viden",
|
||||
and: "og",
|
||||
"desc-end": "dokumentkontekst der findes.",
|
||||
description:
|
||||
'vil levere svar baseret på LLM\'s generelle viden og den relevante dokumentkontekst.<br />Du skal bruge kommandoen "@agent" for at bruge værktøjerne.',
|
||||
},
|
||||
query: {
|
||||
title: "Forespørgsel",
|
||||
"desc-start": "vil give svar",
|
||||
only: "kun",
|
||||
"desc-end": "hvis dokumentkontekst findes.",
|
||||
description:
|
||||
"vil kun give svar <b>hvis konteksten i dokumentet er fundet.</b>Du skal bruge kommandoen @agent for at bruge værktøjerne.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Bil",
|
||||
description:
|
||||
'vil automatisk bruge værktøjer, hvis modellen og udbyderen understøtter native værktøjsanrop. <br />Hvis native værktøjsanrop ikke understøttes, skal du bruge kommandoen "@agent" for at bruge værktøjer.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -300,11 +311,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Gør det muligt for standardagenten at generere forskellige typer diagrammer fra data, der leveres eller gives i chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Generer og gem filer i browseren",
|
||||
description:
|
||||
"Gør det muligt for standardagenten at generere og skrive til filer, der gemmes og kan downloades i din browser.",
|
||||
},
|
||||
web: {
|
||||
title: "Live web-søgning og browsing",
|
||||
description:
|
||||
@@ -317,6 +323,140 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Som standard er denne funktion aktiveret, men du kan deaktivere den, hvis du ikke ønsker, at den skal være tilgængelig for agenten.",
|
||||
filesystem: {
|
||||
title: "Adgang til filsystem",
|
||||
description:
|
||||
"Giv din agent mulighed for at læse, skrive, søge og administrere filer inden for en bestemt mappe. Understøtter filredigering, mappe navigation og indholds søgning.",
|
||||
learnMore: "Lær mere om, hvordan du kan bruge denne færdighed",
|
||||
configuration: "Konfiguration",
|
||||
readActions: "Læs handlinger",
|
||||
writeActions: "Skriv handlinger",
|
||||
warning:
|
||||
"Adgang til filsystemet kan være farligt, da det kan ændre eller slette filer. Se venligst <link>dokumentationen</link> før du aktiverer denne funktion.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Åbn fil",
|
||||
description:
|
||||
"Læs indholdet af filer (tekst, kode, PDF-filer, billeder osv.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Læs flere filer",
|
||||
description: "Læs flere filer samtidigt",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Telefonkatalog",
|
||||
description: "Vis filer og mapper i en mappe",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Søg efter filer",
|
||||
description: "Søg efter filer efter navn eller indhold",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Få filinformation",
|
||||
description: "Få detaljerede metadata om filer",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Rediger fil",
|
||||
description: "Rediger tekstfiler baseret på linjer",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Opret mappe",
|
||||
description: "Opret nye mapper",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Flyt/Omdøb fil",
|
||||
description: "Flyt eller omdøb filer og mapper",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Kopier fil",
|
||||
description: "Kopier filer og mapper",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Opret tekstfil",
|
||||
description:
|
||||
"Opret nye tekstfiler eller overskriv eksisterende tekstfiler.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Dokumentoprettelse",
|
||||
description:
|
||||
"Giv din agent mulighed for at oprette binære dokumentformater som PowerPoint-præsentationer, Excel-regneark, Word-dokumenter og PDF-filer. Filerne kan downloades direkte fra chatvinduet.",
|
||||
configuration: "Tilgængelige dokumenttyper",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Tekstfiler",
|
||||
description:
|
||||
"Opret tekstfiler med enhver indhold og filtype (.txt, .md, .json, .csv osv.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint-præsentationer",
|
||||
description:
|
||||
"Opret nye PowerPoint-præsentationer med slides, overskrifter og punktlister.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF-dokumenter",
|
||||
description:
|
||||
"Opret PDF-dokumenter fra Markdown eller almindelig tekst med grundlæggende formatering.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel-regneark",
|
||||
description:
|
||||
"Opret Excel-dokumenter med tabellerede data, inklusive ark og formatering.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Ord-dokumenter",
|
||||
description:
|
||||
"Opret Word-dokumenter med grundlæggende formatering og stil.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-servere",
|
||||
"loading-from-config": "Indlæsning af MCP-servere fra konfigurationsfil",
|
||||
"learn-more": "Lær mere om MCP-servere.",
|
||||
"no-servers-found": "Ingen MCP-servere fundet",
|
||||
"tool-warning":
|
||||
"For den bedste ydeevne, overvej at deaktivere unødvendige værktøjer for at bevare konteksten.",
|
||||
"stop-server": "Afbryd MCP-serveren",
|
||||
"start-server": "Start MCP-serveren",
|
||||
"delete-server": "Slet MCP-serveren",
|
||||
"tool-count-warning":
|
||||
"Denne MCP-server har <b>aktiverede</b>værktøjer, som vil forbruge kontekst i hvert chat-session.<br />Overvej at deaktivere uønskede værktøjer for at spare på konteksten.",
|
||||
"startup-command": "Startkommando",
|
||||
command: "Instruktion",
|
||||
arguments: "Argumenter",
|
||||
"not-running-warning":
|
||||
"Denne MCP-server kører ikke – den kan være stoppet, eller den kan opleve fejl ved opstart.",
|
||||
"tool-call-arguments": "Argumenter til værktøjsopkald",
|
||||
"tools-enabled": "værktøjer er aktiveret",
|
||||
},
|
||||
settings: {
|
||||
title: "Indstillinger for agenters færdigheder",
|
||||
"max-tool-calls": {
|
||||
title: "Maksimalt antal anmodninger pr. svar",
|
||||
description:
|
||||
"Det maksimale antal værktøjer, en agent kan kæde sammen for at generere et enkelt svar. Dette forhindrer, at værktøjer kaldes unødvendigt, og undgår uendelige løkker.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Intelligent valg af færdigheder",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
"Aktiver ubegrænsede værktøjer og reducer brugen af cut-tokens med op til 80 % pr. forespørgsel – AnythingLLM vælger automatisk de relevante færdigheder til hver forespørgsel.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Det maksimale antal værktøjer, der kan vælges for hver forespørgsel. Vi anbefaler at indstille dette til højere værdier for større modeller med mere kontekst.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL-forbindelse",
|
||||
description:
|
||||
"Giv din agent mulighed for at bruge SQL til at besvare dine spørgsmål ved at oprette forbindelse til forskellige SQL-databaseleverandører.",
|
||||
},
|
||||
default_skill:
|
||||
"Som standard er denne funktion aktiveret, men du kan deaktivere den, hvis du ikke ønsker, at den skal være tilgængelig for agenten.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -595,7 +735,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Vælg alle",
|
||||
deselect_all: "Fravælg alle",
|
||||
remove_selected: "Fjern valgte",
|
||||
costs: "*Engangsomkostning for indlejringer",
|
||||
save_embed: "Gem og indlejr",
|
||||
"total-documents_one": "{{count}} dokument",
|
||||
"total-documents_other": "{{count}} dokumenter",
|
||||
@@ -701,7 +840,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Se mindre",
|
||||
see_more: "Se flere",
|
||||
tools: "Værktøj",
|
||||
browse: "Gennemse",
|
||||
text_size_label: "Tekststørrelse",
|
||||
select_model: "Vælg model",
|
||||
sources: "Kilder",
|
||||
@@ -714,7 +852,6 @@ const TRANSLATIONS = {
|
||||
edit: "Rediger",
|
||||
publish: "Udgive",
|
||||
stop_generating: "Stop med at generere svar",
|
||||
pause_tts_speech_message: "Pause TTS-læsningen af beskeden",
|
||||
slash_commands: "Kommandoer",
|
||||
agent_skills: "Agenters kompetencer",
|
||||
manage_agent_skills: "Administrer agenters kompetencer",
|
||||
@@ -723,6 +860,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Start Agent-session",
|
||||
use_agent_session_to_use_tools:
|
||||
"Du kan bruge værktøjer i chat ved at starte en agent-session med '@agent' i starten af din forespørgsel.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Modellen ønsker at ringe",
|
||||
approve: "Godkend",
|
||||
reject: "Afvise",
|
||||
always_allow: "Sørg altid for, at {{skillName}} er tilgængeligt.",
|
||||
tool_call_was_approved:
|
||||
"Anmodningen om at bruge værktøjet blev godkendt.",
|
||||
tool_call_was_rejected: "Anmodningen om at bruge værktøjet blev afvist.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Rediger konto",
|
||||
@@ -973,6 +1119,86 @@ const TRANSLATIONS = {
|
||||
"Du er ikke tildelt til nogen arbejdsområder.\nKontakt din administrator for at anmode om adgang til et arbejdsområde.",
|
||||
goToWorkspace: 'Gå til "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram-bot",
|
||||
description:
|
||||
"Forbind dit AnythingLLM-instans med Telegram, så du kan kommunikere med dine arbejdsområder fra enhver enhed.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Trin 1: Opret din Telegram-bot",
|
||||
description:
|
||||
"Åbn @BotFather i Telegram, send `/newbot` til <code>@BotFather</code>, følg instruktionerne, og kopier API-tokenet.",
|
||||
"open-botfather": "Åbn BotFather",
|
||||
"instruction-1": "1. Åbn linket eller scann QR-koden",
|
||||
"instruction-2":
|
||||
"2. Send <code>/newbot</code> til <code>@BotFather</code>",
|
||||
"instruction-3": "3. Vælg et navn og et brugernavn til din bot",
|
||||
"instruction-4": "4. Kopier API-tokenet, du modtager.",
|
||||
},
|
||||
step2: {
|
||||
title: "Trin 2: Forbind din bot",
|
||||
description:
|
||||
"Indsæt API-tokenet, du modtog fra @BotFather, og vælg et standard-arbejdsområde, hvor din bot kan kommunikere.",
|
||||
"bot-token": "Bot-token",
|
||||
"default-workspace": "Standardarbejdsområde",
|
||||
"no-workspace":
|
||||
"Ingen ledige arbejdsområder. Et nyt vil blive oprettet.",
|
||||
connecting: "Forbindes...",
|
||||
"connect-bot": "Connect Bot",
|
||||
},
|
||||
security: {
|
||||
title: "Anbefalede sikkerhedsindstillinger",
|
||||
description:
|
||||
"For yderligere sikkerhed, kan du konfigurere disse indstillinger via @BotFather.",
|
||||
"disable-groups": "— Forhindre tilføjelse af bots til grupper",
|
||||
"disable-inline":
|
||||
"— Forhindr brugen af bot i søgninger direkte i søgefeltet",
|
||||
"obscure-username":
|
||||
"Brug et brugernavn til en bot, der ikke er åbenlyst, for at reducere synligheden.",
|
||||
},
|
||||
"toast-enter-token": "Vær venligst opført et bot-token.",
|
||||
"toast-connect-failed": "Kunne ikke etablere forbindelse med botten.",
|
||||
},
|
||||
connected: {
|
||||
status: "Forbundet",
|
||||
"status-disconnected":
|
||||
"Afbrudt – tokenet kan være udløbet eller ugyldigt",
|
||||
"placeholder-token": "Indsæt nyt bot-token...",
|
||||
reconnect: "Genopslå",
|
||||
workspace: "Arbejdsområde",
|
||||
"bot-link": "Bot-link",
|
||||
"voice-response": "Stemmebesvarelse",
|
||||
disconnecting: "Afbryde...",
|
||||
disconnect: "Afbryde",
|
||||
"voice-text-only": "Kun tekst",
|
||||
"voice-mirror": "Spejl (svar med stemme, når brugeren sender en stemme)",
|
||||
"voice-always":
|
||||
"Sørg altid for at inkludere en lydbesked (send lyd sammen med hvert svar).",
|
||||
"toast-disconnect-failed": "Kunne ikke afbryde robotten.",
|
||||
"toast-reconnect-failed":
|
||||
"Kunne ikke genoprette forbindelsen med botten.",
|
||||
"toast-voice-failed": "Kunne ikke opdatere stemmemodus.",
|
||||
"toast-approve-failed": "Mislykkedes med at godkende bruger.",
|
||||
"toast-deny-failed": "Kunne ikke afvise brugeren.",
|
||||
"toast-revoke-failed": "Kunne ikke annullere brugerens adgang.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Afventer godkendelse",
|
||||
"pending-description":
|
||||
"Brugere, der venter på at blive verificeret. Sammenlign den kode, der vises her, med den, der vises i deres Telegram-chat.",
|
||||
"approved-title": "Godkendte brugere",
|
||||
"approved-description":
|
||||
"Brugere, der er blevet godkendt til at kommunikere med din bot.",
|
||||
user: "Bruger",
|
||||
"pairing-code": "Kombinationskode",
|
||||
"no-pending": "Ingen igangværende anmodninger",
|
||||
"no-approved": "Ingen godkendte brugere",
|
||||
unknown: "Ukendt",
|
||||
approve: "Godkend",
|
||||
deny: "Afvise",
|
||||
revoke: "Annullere",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Willkommen bei",
|
||||
getStarted: "Jetzt starten",
|
||||
welcome: "Herzlich willkommen",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM-Einstellung",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Namen der Workspaces",
|
||||
user: "Benutzer",
|
||||
selection: "Modellauswahl",
|
||||
saving: "Speichern...",
|
||||
save: "Änderungen speichern",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Suchen",
|
||||
username_requirements:
|
||||
"Der Benutzername muss 2-32 Zeichen lang sein, mit einem Kleinbuchstaben beginnen und darf nur Kleinbuchstaben, Zahlen, Unterstriche, Bindestriche und Punkte enthalten.",
|
||||
on: "Über",
|
||||
none: "Keine",
|
||||
stopped: "Gestoppt",
|
||||
loading: "Laden",
|
||||
refresh: "Erfrischen",
|
||||
},
|
||||
settings: {
|
||||
title: "Instanzeinstellungen",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Ihr Konto",
|
||||
"import-item": "Artikel importieren",
|
||||
},
|
||||
channels: "Kanäle",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -184,15 +192,18 @@ const TRANSLATIONS = {
|
||||
title: "Chat-Modus",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "wird Antworten mit dem allgemeinen Wissen des LLM",
|
||||
and: "und",
|
||||
"desc-end": "gefundenem Dokumentenkontext liefern.",
|
||||
description:
|
||||
"wird Antworten basierend auf dem allgemeinen Wissen des LLM und dem gegebenen Dokumentkontext liefern.<br />Um die Tools zu nutzen, müssen Sie den Befehl `@agent` verwenden.",
|
||||
},
|
||||
query: {
|
||||
title: "Abfrage",
|
||||
"desc-start": "wird Antworten",
|
||||
only: "nur",
|
||||
"desc-end": "liefern, wenn Dokumentenkontext gefunden wird.",
|
||||
description:
|
||||
'werden Antworten nur bei <b> und </b> bereitstellen, falls der Dokumentkontext gefunden wurde. Um die Tools zu nutzen, müssen Sie den Befehl "@agent" verwenden.',
|
||||
},
|
||||
automatic: {
|
||||
title: "Auto",
|
||||
description:
|
||||
"wird automatisch Werkzeuge verwenden, wenn das Modell und der Anbieter native Werkzeugaufrufe unterstützen. <br />Wenn native Werkzeugaufrufe nicht unterstützt werden, müssen Sie den Befehl `@agent` verwenden, um Werkzeuge zu nutzen.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -303,11 +314,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Aktivieren Sie den Standard-Agenten, um verschiedene Arten von Diagrammen aus bereitgestellten oder im Chat gegebenen Daten zu generieren.",
|
||||
},
|
||||
save: {
|
||||
title: "Dateien generieren & im Browser speichern",
|
||||
description:
|
||||
"Aktivieren Sie den Standard-Agenten, um Dateien zu generieren und zu schreiben, die gespeichert und in Ihrem Browser heruntergeladen werden können.",
|
||||
},
|
||||
web: {
|
||||
title: "Live-Websuche und -Browsing",
|
||||
description:
|
||||
@@ -320,9 +326,147 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Standardmäßig ist diese Funktion aktiviert, aber Sie können sie deaktivieren, wenn Sie nicht möchten, dass sie für den Agenten verfügbar ist.",
|
||||
filesystem: {
|
||||
title: "Zugriff auf das Dateisystem",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, Dateien innerhalb eines bestimmten Verzeichnisses zu lesen, zu schreiben, zu suchen und zu verwalten. Unterstützt die Bearbeitung von Dateien, die Navigation durch Verzeichnisse und die Suche nach Inhalten.",
|
||||
learnMore:
|
||||
"Erfahren Sie mehr darüber, wie Sie diese Fähigkeit effektiv einsetzen können.",
|
||||
configuration: "Konfiguration",
|
||||
readActions: "Lesen von Aktionen",
|
||||
writeActions: "Aktionen",
|
||||
warning:
|
||||
"Der Zugriff auf das Dateisystem kann gefährlich sein, da er Dateien ändern oder löschen kann. Bitte konsultieren Sie vor der Aktivierung die <link>Dokumentation</link>.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Datei öffnen/lesen",
|
||||
description:
|
||||
"Inhalte von Dateien (Text, Code, PDF, Bilder usw.) lesen",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Mehrere Dateien lesen",
|
||||
description: "Mehrere Dateien gleichzeitig lesen",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Verzeichnis",
|
||||
description: "Dateien und Verzeichnisse in einem Ordner auflisten",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Dateien suchen",
|
||||
description: "Dateien nach Name oder Inhalt suchen",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Dateieninformationen abrufen",
|
||||
description: "Erhalten Sie detaillierte Metadaten über Dateien.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Datei bearbeiten",
|
||||
description:
|
||||
"Führen Sie Änderungen in Textdateien zeilenweise durch.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Ordner erstellen",
|
||||
description: "Neue Verzeichnisse erstellen",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Datei verschieben/umbenennen",
|
||||
description:
|
||||
"Dateien und Verzeichnisse verschieben oder umbenennen.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Datei kopieren",
|
||||
description: "Dateien und Verzeichnisse kopieren",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Textdatei erstellen",
|
||||
description:
|
||||
"Erstellen Sie neue Textdateien oder überschreiben Sie vorhandene Textdateien.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Dokumentenerstellung",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, binäre Dokumentformate wie PowerPoint-Präsentationen, Excel-Tabellen, Word-Dokumente und PDFs zu erstellen. Die Dateien können direkt aus dem Chat-Fenster heruntergeladen werden.",
|
||||
configuration: "Verfügbare Dokumenttypen",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Textdateien",
|
||||
description:
|
||||
"Erstellen Sie Textdateien mit beliebigen Inhalten und Dateiendungen (.txt, .md, .json, .csv usw.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Präsentationen mit PowerPoint",
|
||||
description:
|
||||
"Erstellen Sie neue PowerPoint-Präsentationen mit Folien, Überschriften und Stichpunkten.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF-Dokumente",
|
||||
description:
|
||||
"Erstellen Sie PDF-Dokumente aus Markdown- oder reinen Textdateien mit grundlegender Formatierung.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel-Tabellen",
|
||||
description:
|
||||
"Erstellen Sie Excel-Dokumente für tabellarische Daten mit Tabellen und Formatierungen.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Word-Dokumente",
|
||||
description:
|
||||
"Erstellen Sie Word-Dokumente mit grundlegender Formatierung und Gestaltung.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"performance-warning":
|
||||
"Die Leistung von LLMs, die keine explizite Unterstützung für das Aufrufen von Tools bieten, hängt stark von den Fähigkeiten und der Genauigkeit des Modells ab. Einige Fähigkeiten können eingeschränkt oder nicht funktionsfähig sein.",
|
||||
mcp: {
|
||||
title: "MCP-Servern",
|
||||
"loading-from-config":
|
||||
"Laden von MCP-Servern aus einer Konfigurationsdatei",
|
||||
"learn-more": "Erfahren Sie mehr über MCP-Server.",
|
||||
"no-servers-found": "Keine MCP-Server gefunden",
|
||||
"tool-warning":
|
||||
"Für die beste Leistung sollten Sie unnötige Werkzeuge deaktivieren, um den Kontext zu schonen.",
|
||||
"stop-server": "MCP-Server stoppen",
|
||||
"start-server": "MCP-Server starten",
|
||||
"delete-server": "MCP-Server löschen",
|
||||
"tool-count-warning":
|
||||
"Dieser MCP-Server hat <b>{{count}} Tools aktiviert, </b> die Kontext verbrauchen werden, wenn eine Chat-Sitzung stattfindet. <br /> Erwägen Sie, unerwünschte Tools zu deaktivieren, um Kontext zu sparen.",
|
||||
"startup-command": "Startbefehl",
|
||||
command: "Befehl",
|
||||
arguments: "Argumente",
|
||||
"not-running-warning":
|
||||
"Dieser MCP-Server ist nicht aktiv – er kann gestoppt sein oder bei der Startsequenz einen Fehler aufweisen.",
|
||||
"tool-call-arguments": "Argumente für die Funktionsaufrufe",
|
||||
"tools-enabled": "Werkzeuge aktiviert",
|
||||
},
|
||||
settings: {
|
||||
title: "Einstellungen für Agenten-Fähigkeiten",
|
||||
"max-tool-calls": {
|
||||
title: "Maximale Anzahl an Tool-Anfragen pro Antwort",
|
||||
description:
|
||||
"Die maximale Anzahl an Werkzeugen, die ein Agent verketten kann, um eine einzelne Antwort zu generieren. Dies verhindert, dass Werkzeuge unkontrolliert aufgerufen werden und zu endlosen Schleifen führen.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Intelligente Auswahl von Fähigkeiten",
|
||||
"beta-badge": "Beta-Version",
|
||||
description:
|
||||
"Ermöglichen Sie die uneingeschränkte Nutzung von Werkzeugen und reduzieren Sie die Token-Nutzung pro Anfrage um bis zu 80 % – AnythingLLM wählt automatisch die passenden Fähigkeiten für jede Anfrage aus.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Die maximale Anzahl der auszuwählenden Werkzeuge für jede Abfrage. Wir empfehlen, diesen Wert für größere Modelle mit größerem Kontext auf einen höheren Wert einzustellen.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL-Verbindung",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, SQL zu nutzen, um Ihre Fragen zu beantworten, indem Sie eine Verbindung zu verschiedenen SQL-Datenbankanbietern herstellen.",
|
||||
},
|
||||
default_skill:
|
||||
"Standardmäßig ist diese Funktion aktiviert, aber Sie können sie deaktivieren, wenn Sie nicht möchten, dass sie für den Agenten verfügbar ist.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
title: "Workspace-Chats",
|
||||
@@ -703,7 +847,6 @@ const TRANSLATIONS = {
|
||||
deselect_all: "Auswahl abbrechen",
|
||||
no_docs: "Keine Dokumente vorhanden.",
|
||||
remove_selected: "Ausgewähltes entfernen",
|
||||
costs: "*Einmalige Kosten für das Einbetten",
|
||||
save_embed: "Speichern und Einbetten",
|
||||
"total-documents_one": "{{count}} Dokument",
|
||||
"total-documents_other": "{{count}} Dokumente",
|
||||
@@ -794,7 +937,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Weniger anzeigen",
|
||||
see_more: "Mehr anzeigen",
|
||||
tools: "Werkzeuge",
|
||||
browse: "Durchsuchen",
|
||||
text_size_label: "Schriftgröße",
|
||||
select_model: "Modell auswählen",
|
||||
sources: "Quellen",
|
||||
@@ -807,7 +949,6 @@ const TRANSLATIONS = {
|
||||
edit: "Bearbeiten",
|
||||
publish: "Veröffentlichen",
|
||||
stop_generating: "Stoppen Sie die Generierung von Antworten",
|
||||
pause_tts_speech_message: "Pause die Text-to-Speech-Funktion der Nachricht",
|
||||
slash_commands: "Befehlszeilen",
|
||||
agent_skills: "Fähigkeiten von Agenten",
|
||||
manage_agent_skills: "Verwalten Sie die Fähigkeiten von Agenten",
|
||||
@@ -816,6 +957,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Starte eine Agent-Sitzung",
|
||||
use_agent_session_to_use_tools:
|
||||
'Sie können Tools im Chat nutzen, indem Sie eine Agentensitzung mit "@agent" am Anfang Ihrer Anfrage starten.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Das Modell möchte anrufen.",
|
||||
approve: "Genehmigen",
|
||||
reject: "Ablehnen",
|
||||
always_allow: "Bitte stellen Sie immer {{skillName}} sicher.",
|
||||
tool_call_was_approved:
|
||||
"Die Genehmigung für die Bestellung der Werkzeuge wurde erteilt.",
|
||||
tool_call_was_rejected: "Die Anfrage nach dem Werkzeug wurde abgelehnt.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Account bearbeiten",
|
||||
@@ -976,6 +1126,93 @@ const TRANSLATIONS = {
|
||||
"Sie sind nicht zugewiesen zu einem Arbeitsbereich.\nBitte kontaktieren Sie Ihren Administrator, um Zugriff auf einen Arbeitsbereich zu erhalten.",
|
||||
goToWorkspace: 'Zurück zum Arbeitsbereich "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram-Bot",
|
||||
description:
|
||||
"Verbinden Sie Ihre AnyLLM-Instanz mit Telegram, damit Sie von jedem Gerät mit Ihren Arbeitsbereichen chatten können.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Schritt 1: Erstellen Sie Ihren Telegram-Bot",
|
||||
description:
|
||||
"Öffnen Sie @BotFather in Telegram, senden Sie <code>/newbot</code> an <code>@BotFather</code>, befolgen Sie die Anweisungen und kopieren Sie den API-Token.",
|
||||
"open-botfather": "Öffnen Sie BotFather",
|
||||
"instruction-1": "1. Öffnen Sie den Link oder scannen Sie den QR-Code",
|
||||
"instruction-2":
|
||||
"2. Senden Sie <code>/newbot</code> an <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Wählen Sie einen Namen und einen Benutzernamen für Ihren Bot aus.",
|
||||
"instruction-4": "4. Kopieren Sie den API-Token, den Sie erhalten.",
|
||||
},
|
||||
step2: {
|
||||
title: "Schritt 2: Verbinden Sie Ihren Bot",
|
||||
description:
|
||||
"Fügen Sie den API-Token ein, den Sie von @BotFather erhalten haben, und wählen Sie einen Standard-Arbeitsbereich für Ihren Bot aus, mit dem er kommunizieren soll.",
|
||||
"bot-token": "Bot-Token",
|
||||
"default-workspace": "Standardarbeitsbereich",
|
||||
"no-workspace":
|
||||
"Keine verfügbaren Arbeitsbereiche. Ein neuer Bereich wird erstellt.",
|
||||
connecting: "Verbinde...",
|
||||
"connect-bot": "Connect-Bot",
|
||||
},
|
||||
security: {
|
||||
title: "Empfohlene Sicherheitseinstellungen",
|
||||
description:
|
||||
"Für zusätzliche Sicherheit, konfigurieren Sie diese Einstellungen über @BotFather.",
|
||||
"disable-groups":
|
||||
"– Verhinderung der automatisierten Anmeldung von Bots in Gruppen",
|
||||
"disable-inline":
|
||||
"– Verhindern Sie die Verwendung von Bots in der Inline-Suche",
|
||||
"obscure-username":
|
||||
"Verwenden Sie einen Benutzernamen für den Bot, der nicht offensichtlich ist, um die Auffindbarkeit zu reduzieren.",
|
||||
},
|
||||
"toast-enter-token": "Bitte geben Sie einen Bot-Token ein.",
|
||||
"toast-connect-failed":
|
||||
"Verbindung zum Bot konnte nicht hergestellt werden.",
|
||||
},
|
||||
connected: {
|
||||
status: "Verbunden",
|
||||
"status-disconnected":
|
||||
"Abgekoppelt – Token möglicherweise abgelaufen oder ungültig",
|
||||
"placeholder-token": "Neuen Bot-Token einfügen...",
|
||||
reconnect: "Wiederherstellen",
|
||||
workspace: "Arbeitsbereich",
|
||||
"bot-link": "Link",
|
||||
"voice-response": "Sprachantwort",
|
||||
disconnecting: "Abmelden...",
|
||||
disconnect: "Abkoppeln",
|
||||
"voice-text-only": "Nur Text",
|
||||
"voice-mirror":
|
||||
"Echo (Antworten mit Sprache, wenn der Benutzer Sprache sendet)",
|
||||
"voice-always":
|
||||
"Bitte immer Sprachnachrichten senden (Audio mit jeder Antwort hinzufügen)",
|
||||
"toast-disconnect-failed":
|
||||
"Es konnte nicht erfolgreich die Verbindung zum Bot trennen.",
|
||||
"toast-reconnect-failed":
|
||||
"Verbindung zum Bot konnte nicht hergestellt werden.",
|
||||
"toast-voice-failed":
|
||||
"Fehlgeschlagen bei der Aktualisierung des Sprachmodus.",
|
||||
"toast-approve-failed": "Benutzer konnte nicht autorisiert werden.",
|
||||
"toast-deny-failed": "Nicht in der Lage, den Benutzer abzuweisen.",
|
||||
"toast-revoke-failed":
|
||||
"Fehlgeschlagener Versuch, das Benutzerkonto zu deaktivieren.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Warte auf Genehmigung",
|
||||
"pending-description":
|
||||
"Benutzer, die noch verifiziert werden müssen. Vergleichen Sie den hier angezeigten Pairing-Code mit dem, der in ihrem Telegram-Chat angezeigt wird.",
|
||||
"approved-title": "Benutzer mit Genehmigung",
|
||||
"approved-description":
|
||||
"Nutzer, denen die Erlaubnis erteilt wurde, mit Ihrem Bot zu kommunizieren.",
|
||||
user: "Benutzer",
|
||||
"pairing-code": "Paarcode",
|
||||
"no-pending": "Keine ausstehenden Anfragen",
|
||||
"no-approved": "Keine autorisierten Benutzer",
|
||||
unknown: "Unbekannt",
|
||||
approve: "Genehmigen",
|
||||
deny: "Leugnen",
|
||||
revoke: "Aufheben",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Welcome to",
|
||||
welcome: "Welcome",
|
||||
getStarted: "Get Started",
|
||||
},
|
||||
llm: {
|
||||
@@ -50,7 +50,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Workspace Name",
|
||||
user: "User",
|
||||
selection: "Model Selection",
|
||||
saving: "Saving...",
|
||||
save: "Save changes",
|
||||
@@ -59,9 +58,14 @@ const TRANSLATIONS = {
|
||||
optional: "Optional",
|
||||
yes: "Yes",
|
||||
no: "No",
|
||||
on: "On",
|
||||
none: "None",
|
||||
stopped: "Stopped",
|
||||
search: "Search",
|
||||
username_requirements:
|
||||
"Username must be 2-32 characters, start with a lowercase letter, and only contain lowercase letters, numbers, underscores, hyphens, and periods.",
|
||||
loading: "Loading",
|
||||
refresh: "Refresh",
|
||||
},
|
||||
home: {
|
||||
welcome: "Welcome",
|
||||
@@ -106,6 +110,10 @@ const TRANSLATIONS = {
|
||||
contact: "Contact Support",
|
||||
"browser-extension": "Browser Extension",
|
||||
"mobile-app": "AnythingLLM Mobile",
|
||||
channels: "Channels",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -188,17 +196,20 @@ const TRANSLATIONS = {
|
||||
},
|
||||
mode: {
|
||||
title: "Chat mode",
|
||||
automatic: {
|
||||
title: "Auto",
|
||||
description:
|
||||
"will automatically use tools if the model and provider support native tool calling.<br />If native tooling is not supported, you will need to use the @agent command to use tools.",
|
||||
},
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "will provide answers with the LLM's general knowledge",
|
||||
and: "and",
|
||||
"desc-end": "document context that is found.",
|
||||
description:
|
||||
"will provide answers with the LLM's general knowledge <b>and</b> document context that is found.<br />You will need to use the @agent command to use tools.",
|
||||
},
|
||||
query: {
|
||||
title: "Query",
|
||||
"desc-start": "will provide answers",
|
||||
only: "only",
|
||||
"desc-end": "if document context is found.",
|
||||
description:
|
||||
"will provide answers <b>only</b> if document context is found.<br />You will need to use the @agent command to use tools.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -311,11 +322,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Enable the default agent to generate various types of charts from data provided or given in chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Generate & save files",
|
||||
description:
|
||||
"Enable the default agent to generate and write to files that can be saved to your computer.",
|
||||
},
|
||||
web: {
|
||||
title: "Web Search",
|
||||
description:
|
||||
@@ -326,6 +332,140 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Enable your agent to be able to leverage SQL to answer you questions by connecting to various SQL database providers.",
|
||||
},
|
||||
filesystem: {
|
||||
title: "File System Access",
|
||||
description:
|
||||
"Enable your agent to read, write, search, and manage files within a designated directory. Supports file editing, directory navigation, and content search.",
|
||||
learnMore: "Learn more about this how to use this skill",
|
||||
configuration: "Configuration",
|
||||
readActions: "Read Actions",
|
||||
writeActions: "Write Actions",
|
||||
warning:
|
||||
"Filesystem access can be dangerous as it can modify or delete files. Please consult the <link>documentation</link> before enabling.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Read File",
|
||||
description:
|
||||
"Read contents of files (text, code, PDF, images, etc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Read Multiple Files",
|
||||
description: "Read multiple files at once",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "List Directory",
|
||||
description: "List files and directories in a folder",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Search Files",
|
||||
description: "Search for files by name or content",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Get File Info",
|
||||
description: "Get detailed metadata about files",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Write Text File",
|
||||
description:
|
||||
"Create new text files or overwrite existing text files",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Edit File",
|
||||
description: "Make line-based edits to text files",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Create Directory",
|
||||
description: "Create new directories",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copy File",
|
||||
description: "Copy files and directories",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Move/Rename File",
|
||||
description: "Move or rename files and directories",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Document Creation",
|
||||
description:
|
||||
"Enable your agent to create binary document formats like PowerPoint presentations, Excel spreadsheets, Word documents, and PDFs. Files can be downloaded directly from the chat window.",
|
||||
configuration: "Available Document Types",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Text Files",
|
||||
description:
|
||||
"Create text files with any content and extension (.txt, .md, .json, .csv, etc.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint Presentations",
|
||||
description:
|
||||
"Create new PowerPoint presentations with slides, titles, and bullet points",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF Documents",
|
||||
description:
|
||||
"Create PDF documents from markdown or plain text with basic styling",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel Spreadsheets",
|
||||
description:
|
||||
"Create Excel documents for tabular data with sheets and styling",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Word Documents",
|
||||
description:
|
||||
"Create Word documents with basic styling and formatting",
|
||||
},
|
||||
},
|
||||
},
|
||||
default_skill:
|
||||
"By default, this skill is enabled, but you can disable it if you don't want it to be available to the agent.",
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP Servers",
|
||||
"loading-from-config": "Loading MCP Servers from configuration file",
|
||||
"learn-more": "Learn more about MCP Servers.",
|
||||
"no-servers-found": "No MCP servers found",
|
||||
"tool-warning":
|
||||
"For the best performance, consider disabling unwanted tools to conserve context.",
|
||||
"tools-enabled": "tools enabled",
|
||||
"stop-server": "Stop MCP Server",
|
||||
"start-server": "Start MCP Server",
|
||||
"delete-server": "Delete MCP Server",
|
||||
"tool-count-warning":
|
||||
"This MCP server has <b>{{count}} tools enabled</b> that will consume context in every chat.<br />Consider disabling unwanted tools to conserve context.",
|
||||
"startup-command": "Startup Command",
|
||||
command: "Command",
|
||||
arguments: "Arguments",
|
||||
"not-running-warning":
|
||||
"This MCP server is not running - it may be stopped or experiencing an error on startup.",
|
||||
"tool-call-arguments": "Tool call arguments",
|
||||
},
|
||||
settings: {
|
||||
title: "Agent Skill Settings",
|
||||
"max-tool-calls": {
|
||||
title: "Max Tool Calls Per Response",
|
||||
description:
|
||||
"The maximum number of tools an agent can chain to generate a single response. This prevents runaway tool calls and infinite loops.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Intelligent Skill Selection",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
"Enable unlimited tools and cut token usage by up to 80% per query — AnythingLLM automatically selects the right skills for every prompt.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"The maximum number of tools to select for each query. We recommend setting this to higher values for larger context models.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL Connector",
|
||||
description:
|
||||
"Enable your agent to be able to leverage SQL to answer you questions by connecting to various SQL database providers.",
|
||||
},
|
||||
default_skill:
|
||||
"By default, this skill is enabled, but you can disable it if you don't want it to be available to the agent.",
|
||||
},
|
||||
@@ -536,6 +676,81 @@ const TRANSLATIONS = {
|
||||
at: "Sent At",
|
||||
},
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram Bot",
|
||||
description:
|
||||
"Connect your AnythingLLM instance to Telegram so you can chat with your workspaces from any device.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Step 1: Create your Telegram bot",
|
||||
description:
|
||||
"Open @BotFather in Telegram, send <code>/newbot</code> to <code>@BotFather</code>, follow the prompts, and copy the API token.",
|
||||
"open-botfather": "Open BotFather",
|
||||
"instruction-1": "1. Open the link or scan the QR code",
|
||||
"instruction-2":
|
||||
"2. Send <code>/newbot</code> to <code>@BotFather</code>",
|
||||
"instruction-3": "3. Choose a name and username for your bot",
|
||||
"instruction-4": "4. Copy the API token you receive",
|
||||
},
|
||||
step2: {
|
||||
title: "Step 2: Connect your bot",
|
||||
description:
|
||||
"Paste the API token you received from @BotFather to connect your bot.",
|
||||
"bot-token": "Bot Token",
|
||||
"default-workspace": "Default Workspace",
|
||||
"no-workspace": "No available workspaces. A new one will be created.",
|
||||
connecting: "Connecting...",
|
||||
"connect-bot": "Connect Bot",
|
||||
},
|
||||
security: {
|
||||
title: "Recommended Security Settings",
|
||||
description:
|
||||
"For additional security, configure these settings in @BotFather.",
|
||||
"disable-groups": "— Prevent adding bot to groups",
|
||||
"disable-inline": "— Prevent bot from being used in inline search",
|
||||
"obscure-username":
|
||||
"Use a non-obvious bot handle username to reduce discoverability",
|
||||
},
|
||||
"toast-enter-token": "Please enter a bot token.",
|
||||
"toast-connect-failed": "Failed to connect bot.",
|
||||
},
|
||||
connected: {
|
||||
status: "Connected",
|
||||
"status-disconnected": "Disconnected — token may be expired or invalid",
|
||||
"placeholder-token": "Paste new bot token...",
|
||||
reconnect: "Reconnect",
|
||||
workspace: "Workspace",
|
||||
"bot-link": "Bot Link",
|
||||
"voice-response": "Voice Response",
|
||||
disconnecting: "Disconnecting...",
|
||||
disconnect: "Disconnect",
|
||||
"voice-text-only": "Text only",
|
||||
"voice-mirror": "Mirror (reply with voice when user sends voice)",
|
||||
"voice-always": "Always voice (send audio with every reply)",
|
||||
"toast-disconnect-failed": "Failed to disconnect bot.",
|
||||
"toast-reconnect-failed": "Failed to reconnect bot.",
|
||||
"toast-voice-failed": "Failed to update voice mode.",
|
||||
"toast-approve-failed": "Failed to approve user.",
|
||||
"toast-deny-failed": "Failed to deny user.",
|
||||
"toast-revoke-failed": "Failed to revoke user.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Pending Approval",
|
||||
"pending-description":
|
||||
"Users waiting to be verified. Match the pairing code shown here with the one displayed in their Telegram chat.",
|
||||
"approved-title": "Approved Users",
|
||||
"approved-description":
|
||||
"Users who have been approved to chat with your bot.",
|
||||
user: "User",
|
||||
"pairing-code": "Pairing Code",
|
||||
"no-pending": "No pending requests",
|
||||
"no-approved": "No approved users",
|
||||
unknown: "Unknown",
|
||||
approve: "Approve",
|
||||
deny: "Deny",
|
||||
revoke: "Revoke",
|
||||
},
|
||||
},
|
||||
security: {
|
||||
title: "Security",
|
||||
multiuser: {
|
||||
@@ -729,7 +944,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Select All",
|
||||
deselect_all: "Deselect All",
|
||||
remove_selected: "Remove Selected",
|
||||
costs: "*One time cost for embeddings",
|
||||
save_embed: "Save and Embed",
|
||||
},
|
||||
upload: {
|
||||
@@ -787,7 +1001,6 @@ const TRANSLATIONS = {
|
||||
source_count_other: "{{count}} references",
|
||||
document: "Document",
|
||||
similarity_match: "match",
|
||||
pause_tts_speech_message: "Pause TTS speech of message",
|
||||
fork: "Fork",
|
||||
delete: "Delete",
|
||||
cancel: "Cancel",
|
||||
@@ -818,7 +1031,6 @@ const TRANSLATIONS = {
|
||||
normal: "Normal",
|
||||
large: "Large",
|
||||
tools: "Tools",
|
||||
browse: "Browse",
|
||||
text_size_label: "Text Size",
|
||||
select_model: "Select Model",
|
||||
slash_commands: "Slash Commands",
|
||||
@@ -839,6 +1051,14 @@ const TRANSLATIONS = {
|
||||
missing_credentials: "This provider is missing credentials!",
|
||||
missing_credentials_description: "Set up now",
|
||||
},
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Model wants to call",
|
||||
approve: "Approve",
|
||||
reject: "Reject",
|
||||
always_allow: "Always allow {{skillName}}",
|
||||
tool_call_was_approved: "Tool call was approved",
|
||||
tool_call_was_rejected: "Tool call was rejected",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Edit Account",
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Bienvenido a",
|
||||
getStarted: "Comenzar",
|
||||
welcome: "Bienvenido",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferencia de LLM",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Nombre de los espacios de trabajo",
|
||||
user: "Usuario",
|
||||
selection: "Selección de modelo",
|
||||
saving: "Guardando...",
|
||||
save: "Guardar cambios",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Buscar",
|
||||
username_requirements:
|
||||
"El nombre de usuario debe tener entre 2 y 32 caracteres, comenzar con una letra minúscula y solo contener letras minúsculas, números, guiones bajos, guiones y puntos.",
|
||||
on: "Sobre",
|
||||
none: "Ninguno",
|
||||
stopped: "Parado",
|
||||
loading: "Cargando",
|
||||
refresh: "Renovar; revitalizar",
|
||||
},
|
||||
settings: {
|
||||
title: "Ajustes de la instancia",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Su cuenta",
|
||||
"import-item": "Importar artículo",
|
||||
},
|
||||
channels: "Canales",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -185,16 +193,18 @@ const TRANSLATIONS = {
|
||||
title: "Modo de chat",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start":
|
||||
"proporcionará respuestas con el conocimiento general del LLM",
|
||||
and: "y",
|
||||
"desc-end": "el contexto del documento que se encuentre.",
|
||||
description:
|
||||
'proporcionará respuestas utilizando el conocimiento general del LLM y el contexto del documento encontrado.<br />Deberá utilizar el comando "@agent" para utilizar las herramientas.',
|
||||
},
|
||||
query: {
|
||||
title: "Consulta",
|
||||
"desc-start": "proporcionará respuestas",
|
||||
only: "solo",
|
||||
"desc-end": "si se encuentra contexto del documento.",
|
||||
description:
|
||||
'proporcionará respuestas <b>solo</b> si se encuentra el contexto del documento.<br />Deberá utilizar el comando "@agent" para utilizar las herramientas.',
|
||||
},
|
||||
automatic: {
|
||||
title: "Coche",
|
||||
description:
|
||||
'utilizará automáticamente las herramientas si el modelo y el proveedor admiten la llamada a herramientas nativas. Si no se admite la llamada a herramientas nativas, deberá utilizar el comando "@agent" para utilizar las herramientas.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -310,11 +320,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Habilita al agente predeterminado para generar varios tipos de gráficos a partir de datos proporcionados o dados en el chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Generar y guardar archivos en el navegador",
|
||||
description:
|
||||
"Habilita al agente predeterminado para generar y escribir en archivos que se guardan y se pueden descargar en tu navegador.",
|
||||
},
|
||||
web: {
|
||||
title: "Búsqueda y navegación web en vivo",
|
||||
description:
|
||||
@@ -327,6 +332,144 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Por defecto, esta función está activada, pero puede desactivarla si no desea que esté disponible para el agente.",
|
||||
filesystem: {
|
||||
title: "Acceso al sistema de archivos",
|
||||
description:
|
||||
"Permita que su agente pueda leer, escribir, buscar y administrar archivos dentro de un directorio específico. Soporta la edición de archivos, la navegación por directorios y la búsqueda de contenido.",
|
||||
learnMore: "Aprenda más sobre cómo utilizar esta habilidad.",
|
||||
configuration: "Configuración",
|
||||
readActions: "Leer acciones",
|
||||
writeActions: "Acciones a realizar",
|
||||
warning:
|
||||
"El acceso al sistema de archivos puede ser peligroso, ya que puede modificar o eliminar archivos. Consulte la <link>documentación</link> antes de habilitarlo.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Abrir archivo",
|
||||
description:
|
||||
"Leer el contenido de archivos (texto, código, archivos PDF, imágenes, etc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Leer varios archivos",
|
||||
description: "Leer varios archivos a la vez.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Directorio",
|
||||
description:
|
||||
"Enumera los archivos y directorios dentro de una carpeta.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Buscar archivos",
|
||||
description: "Busque archivos por nombre o contenido.",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Obtener información del archivo",
|
||||
description:
|
||||
"Obtenga información detallada sobre los metadatos de los archivos.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Editar archivo",
|
||||
description:
|
||||
"Realiza modificaciones basadas en líneas en archivos de texto.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Crear directorio",
|
||||
description: "Crear nuevas carpetas",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Mover/Cambiar el nombre del archivo",
|
||||
description: "Mover o renombrar archivos y directorios.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copiar archivo",
|
||||
description: "Copiar archivos y directorios",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Crear un archivo de texto",
|
||||
description:
|
||||
"Cree nuevos archivos de texto o sobrescriba archivos de texto existentes.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Creación de documentos",
|
||||
description:
|
||||
"Permita que su agente cree formatos de documentos binarios como presentaciones de PowerPoint, hojas de cálculo de Excel, documentos de Word y archivos PDF. Los archivos se pueden descargar directamente desde la ventana de chat.",
|
||||
configuration: "Tipos de documentos disponibles",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Archivos de texto",
|
||||
description:
|
||||
"Cree archivos de texto con cualquier contenido y extensión (por ejemplo, .txt, .md, .json, .csv, etc.).",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Presentaciones en PowerPoint",
|
||||
description:
|
||||
"Crea nuevas presentaciones de PowerPoint con diapositivas, títulos y viñetas.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Documentos en formato PDF",
|
||||
description:
|
||||
"Cree documentos PDF a partir de archivos Markdown o texto plano, con un estilo básico.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Hojas de cálculo de Excel",
|
||||
description:
|
||||
"Cree documentos de Excel para datos tabulares, con hojas y opciones de formato.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Documentos de Microsoft Word",
|
||||
description:
|
||||
"Crea documentos de Word con un estilo y formato básicos.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servidores MCP",
|
||||
"loading-from-config":
|
||||
"Cargar servidores MCP desde el archivo de configuración",
|
||||
"learn-more": "Aprenda más sobre los servidores MCP.",
|
||||
"no-servers-found": "No se encontraron servidores MCP.",
|
||||
"tool-warning":
|
||||
"Para obtener el mejor rendimiento, considere desactivar las herramientas innecesarias para conservar el contexto.",
|
||||
"stop-server": "Detener el servidor MCP",
|
||||
"start-server": "Iniciar el servidor MCP",
|
||||
"delete-server": "Eliminar el servidor MCP",
|
||||
"tool-count-warning":
|
||||
"Este servidor de MCP tiene <b> herramientas habilitadas</b> que consumirán contexto en cada conversación.<br /> Considere desactivar las herramientas no deseadas para ahorrar contexto.",
|
||||
"startup-command": "Comando inicial",
|
||||
command: "Órden",
|
||||
arguments: "Argumentos",
|
||||
"not-running-warning":
|
||||
"Este servidor de MCP no está funcionando; podría estar detenido o estar experimentando un error al iniciarse.",
|
||||
"tool-call-arguments": "Argumentos de llamada de función",
|
||||
"tools-enabled": "herramientas habilitadas",
|
||||
},
|
||||
settings: {
|
||||
title: "Configuración de habilidades del agente",
|
||||
"max-tool-calls": {
|
||||
title: "Número máximo de llamadas a funciones Max Tool por respuesta",
|
||||
description:
|
||||
"El número máximo de herramientas que un agente puede encadenar para generar una única respuesta. Esto evita que se realicen llamadas a herramientas de forma descontrolada y que se produzcan bucles infinitos.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Selección inteligente de habilidades",
|
||||
"beta-badge": "Versión preliminar",
|
||||
description:
|
||||
"Permite el uso ilimitado de herramientas y reduce el consumo de tokens hasta en un 80% por consulta: AnythingLLM selecciona automáticamente las habilidades adecuadas para cada solicitud.",
|
||||
"max-tools": {
|
||||
title: "Herramientas Max",
|
||||
description:
|
||||
"El número máximo de herramientas que se pueden seleccionar para cada consulta. Recomendamos establecer este valor en un número más alto para modelos con un contexto más amplio.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Conector SQL",
|
||||
description:
|
||||
"Permita que su agente pueda utilizar SQL para responder a sus preguntas, conectándose con diferentes proveedores de bases de datos SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Por defecto, esta función está activada, pero puede desactivarla si no desea que esté disponible para el agente.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -713,7 +856,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Seleccionar todo",
|
||||
deselect_all: "Deseleccionar todo",
|
||||
remove_selected: "Eliminar seleccionados",
|
||||
costs: "*Costo único por incrustaciones",
|
||||
save_embed: "Guardar e incrustar",
|
||||
"total-documents_one": "{{count}} documento",
|
||||
"total-documents_other": "{{count}} documentos",
|
||||
@@ -809,7 +951,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Ver menos",
|
||||
see_more: "Ver más",
|
||||
tools: "Herramientas",
|
||||
browse: "Explorar",
|
||||
text_size_label: "Tamaño del texto",
|
||||
select_model: "Seleccionar modelo",
|
||||
sources: "Fuentes",
|
||||
@@ -822,7 +963,6 @@ const TRANSLATIONS = {
|
||||
edit: "Editar",
|
||||
publish: "Publicar",
|
||||
stop_generating: "Dejar de generar respuestas",
|
||||
pause_tts_speech_message: "Pausa la lectura de voz del mensaje.",
|
||||
slash_commands: "Comandos abreviados",
|
||||
agent_skills: "Habilidades del agente",
|
||||
manage_agent_skills: "Gestionar las habilidades del agente.",
|
||||
@@ -831,6 +971,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Iniciar sesión como agente",
|
||||
use_agent_session_to_use_tools:
|
||||
"Puede utilizar las herramientas disponibles en el chat iniciando una sesión con un agente utilizando el prefijo '@agent' al principio de su mensaje.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "El modelo quiere llamar",
|
||||
approve: "Aprobar",
|
||||
reject: "Rechazar",
|
||||
always_allow: "Siempre asegúrese de que haya {{skillName}}",
|
||||
tool_call_was_approved: "La solicitud de herramientas ha sido aprobada.",
|
||||
tool_call_was_rejected: "La solicitud de herramienta fue rechazada.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Editar cuenta",
|
||||
@@ -991,6 +1139,88 @@ const TRANSLATIONS = {
|
||||
"Actualmente no estás asignado a ningún espacio de trabajo.\nPor favor, contacta a tu administrador para solicitar acceso a un espacio de trabajo.",
|
||||
goToWorkspace: 'Ir a "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot de Telegram",
|
||||
description:
|
||||
"Conecte su instancia de AnythingLLM a Telegram para poder conversar con sus espacios de trabajo desde cualquier dispositivo.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Paso 1: Crea tu bot de Telegram.",
|
||||
description:
|
||||
"Abra el bot @BotFather en Telegram, envíe /newbot al chat con <code>@BotFather, siga las instrucciones y copie el token de la API.",
|
||||
"open-botfather": "Iniciar BotFather",
|
||||
"instruction-1": "1. Abra el enlace o escanee el código QR.",
|
||||
"instruction-2":
|
||||
"2. Enviar <code>/newbot</code> a <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Elija un nombre y un nombre de usuario para su bot.",
|
||||
"instruction-4": "4. Copie el token de la API que reciba.",
|
||||
},
|
||||
step2: {
|
||||
title: "Paso 2: Conecte su bot.",
|
||||
description:
|
||||
"Copia el token de API que recibiste de @BotFather y selecciona un espacio de trabajo predeterminado para que tu bot pueda comunicarse.",
|
||||
"bot-token": "Token de Bot",
|
||||
"default-workspace": "Espacio de trabajo predeterminado",
|
||||
"no-workspace":
|
||||
"No hay espacios de trabajo disponibles. Se creará uno nuevo.",
|
||||
connecting: "Conectando...",
|
||||
"connect-bot": "Bot de conexión",
|
||||
},
|
||||
security: {
|
||||
title: "Configuraciones de seguridad recomendadas",
|
||||
description:
|
||||
"Para una mayor seguridad, configure estas opciones a través de @BotFather.",
|
||||
"disable-groups": "— Evitar que se añadan bots a los grupos",
|
||||
"disable-inline":
|
||||
"— Evitar que los bots se utilicen en búsquedas dentro de la página.",
|
||||
"obscure-username":
|
||||
"Utiliza un nombre de usuario para el bot que no sea obvio para reducir su visibilidad.",
|
||||
},
|
||||
"toast-enter-token": "Por favor, introduzca un token de bot.",
|
||||
"toast-connect-failed": "No se pudo establecer la conexión con el bot.",
|
||||
},
|
||||
connected: {
|
||||
status: "Conectado",
|
||||
"status-disconnected":
|
||||
"Desconectado — el token puede estar caducado o ser inválido.",
|
||||
"placeholder-token": "Pegar nuevo token de bot...",
|
||||
reconnect: "Restablecer la conexión",
|
||||
workspace: "Espacio de trabajo",
|
||||
"bot-link": "Enlace a bot",
|
||||
"voice-response": "Respuesta por voz",
|
||||
disconnecting: "Desconectando...",
|
||||
disconnect: "Desconectar",
|
||||
"voice-text-only": "Solo texto",
|
||||
"voice-mirror":
|
||||
"Espejo (responder con voz cuando el usuario envía una grabación de voz)",
|
||||
"voice-always":
|
||||
"Siempre incluir una grabación de voz (enviar audio con cada respuesta).",
|
||||
"toast-disconnect-failed": "No se pudo desconectar el robot.",
|
||||
"toast-reconnect-failed":
|
||||
"No se pudo restablecer la conexión con el bot.",
|
||||
"toast-voice-failed": "No se pudo actualizar el modo de voz.",
|
||||
"toast-approve-failed": "No se pudo aprobar el usuario.",
|
||||
"toast-deny-failed": "No se pudo negar la solicitud del usuario.",
|
||||
"toast-revoke-failed": "No se pudo revocar el acceso del usuario.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Sujeto a aprobación",
|
||||
"pending-description":
|
||||
"Usuarios que están esperando la verificación. Compara el código de emparejamiento que se muestra aquí con el que aparece en su conversación de Telegram.",
|
||||
"approved-title": "Usuarios autorizados",
|
||||
"approved-description":
|
||||
"Usuarios que han sido aprobados para comunicarse con tu bot.",
|
||||
user: "Usuario",
|
||||
"pairing-code": "Código de combinación",
|
||||
"no-pending": "No hay solicitudes pendientes.",
|
||||
"no-approved": "Usuarios no autorizados",
|
||||
unknown: "Desconocido",
|
||||
approve: "Aprobar",
|
||||
deny: "Negar",
|
||||
revoke: "Revocar",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Tere tulemast",
|
||||
getStarted: "Alusta",
|
||||
welcome: "Tere tulemast",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM-i eelistus",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Tööruumide nimi",
|
||||
user: "Kasutaja",
|
||||
selection: "Mudeli valik",
|
||||
saving: "Salvestan…",
|
||||
save: "Salvesta muudatused",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "otsing",
|
||||
username_requirements:
|
||||
"Kasutajanimi peab olema 2–32 tähemärki, algama väiketähega ning sisaldama ainult väiketähti, numbreid, alakriipse, sidekriipse ja punkte.",
|
||||
on: "On",
|
||||
none: "Ei",
|
||||
stopped: "Peatas",
|
||||
loading: "Laadimine",
|
||||
refresh: "Värskendada",
|
||||
},
|
||||
settings: {
|
||||
title: "Instantsi seaded",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Teie konto",
|
||||
"import-item": "Importeeritud toode",
|
||||
},
|
||||
channels: "Kaasavad",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -181,15 +189,18 @@ const TRANSLATIONS = {
|
||||
title: "Vestlusrežiim",
|
||||
chat: {
|
||||
title: "Vestlus",
|
||||
"desc-start": "annab vastuseid LLM-i üldteadmistest",
|
||||
and: "ja",
|
||||
"desc-end": "leitud dokumendikontekstist.",
|
||||
description:
|
||||
"teenab vastuseid, kasutades LLM-i üldist teadmist ja dokumenti konteksti, mis on leitav.<br /> Selleks peate kasutama @agent käsku, et kasutada erinevaid tööriime.",
|
||||
},
|
||||
query: {
|
||||
title: "Päring",
|
||||
"desc-start": "annab vastuseid",
|
||||
only: "ainult",
|
||||
"desc-end": "kui leitakse dokumendikontekst.",
|
||||
description:
|
||||
'teenib vastuseid <b> ainult__, kui dokumendi kontekst on leitav.</b> Vajate kasutama käitu "@agent", et kasutada tööriime.',
|
||||
},
|
||||
automatic: {
|
||||
title: "Automaailm",
|
||||
description:
|
||||
'kasutab automaatselt tööriistu, kui mudel ja pakkuja toetavad native töörieste kasutamist. <br />Kui native töörieste kasutamine ei toeta, peate kasutama käsku "@agent", et tööriiste kasutada.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -295,11 +306,6 @@ const TRANSLATIONS = {
|
||||
title: "Loo diagramme",
|
||||
description: "Lubab agendil luua erinevaid diagramme antud andmetest.",
|
||||
},
|
||||
save: {
|
||||
title: "Loo ja salvesta faile brauserisse",
|
||||
description:
|
||||
"Lubab agendil luua faile, mis salvestatakse ja allalaaditakse brauseris.",
|
||||
},
|
||||
web: {
|
||||
title: "Reaalajas veebihaku tugi",
|
||||
description:
|
||||
@@ -312,6 +318,140 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Vaikimisi on see funktsioon lubatud, kuid saate seda välja lülitada, kui ei soovi, et see oleks saadaval kaagentile.",
|
||||
filesystem: {
|
||||
title: "Failisüsteemi juurdepääs",
|
||||
description:
|
||||
"Lisage oma agentile võimalus lugeda, kirjutada, otsida ja hallata faili, mis asub kindlalt määratud kaustas. Toetab failide redakteerimist, kaustade navigeerimist ja sisu otsimist.",
|
||||
learnMore: "Lisateabe saamiseks, kuidas seda oskust kasutada",
|
||||
configuration: "Konfiguratsioon",
|
||||
readActions: "Leia toimingud",
|
||||
writeActions: "Toimingud",
|
||||
warning:
|
||||
"Failisüsteemi juurimine võib olla ohtlik, kuna see võib muuta või kustutada faile. Enne selle aktiveerimist, palun vaadake <link>dokumentatsiooni</link>.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Ava fail",
|
||||
description:
|
||||
"Leia failide sisu (tekst, kood, PDF-failid, pildid jne)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Lugege mitut faili",
|
||||
description: "Lugege mitut faili üheaegselt",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Loend",
|
||||
description: "Looge failide ja kaustade loend ühes kaustas",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Failide otsimine",
|
||||
description: "Leidke failid nime või sisu järgi",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Hankige faili teave",
|
||||
description: "Hankige üksikasjalik teavet failide kohta",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Faili redigeerimine",
|
||||
description: "Muuda teksti failide sisu rida- järgselt.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Loo kaust",
|
||||
description: "Loo uusi kahteid",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Faili liiguta/nime muuda",
|
||||
description: "Liigu või nime muuta failid ja kaardid",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Kopeeri fail",
|
||||
description: "Kopeeri failid ja kaardi",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Loo teksti fail",
|
||||
description:
|
||||
"Loo uusi teksti faili või asenda olemasolevaid teksti faile",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Dokumendi koostamine",
|
||||
description:
|
||||
"Laske oma esindajal luua binaarsed dokumendiformaadid, näiteks PowerPointi esitlused, Exceli lehed, Wordi dokumendid ja PDF-failid. Failid saab alla laadida otse vestlusaknast.",
|
||||
configuration: "Saadaval olevad dokumendi tüübid",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Tekstifailid",
|
||||
description:
|
||||
"Loo teksti failid, milles on mis tahes sisu ja laiendus (esimärkid .txt, .md, .json, .csv jne).",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPointi esitlused",
|
||||
description:
|
||||
"Loo uusi PowerPointi esitlusi, mis sisaldavad slaidide, pealkirjade ja punktide.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF-failid",
|
||||
description:
|
||||
"Loo PDF-failid Markdown- või tavaline tekstist, kasutades lihtsaid stiilid",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel-i lehed",
|
||||
description:
|
||||
"Loo Excel-failid, mis sisaldavad tabeli andmeid, lehtede ja stiilidega.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Microsoft Word-failid",
|
||||
description:
|
||||
"Loo Microsoft Wordi dokumende, kasutades põhise stiili ja vormistuse",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-serverid",
|
||||
"loading-from-config": "MCP-serverid laaditakse konfiguraadifailist",
|
||||
"learn-more": "Lisateabe saamiseks tutvuge MCP-serveridega.",
|
||||
"no-servers-found": "MCP-servereid ei leitud.",
|
||||
"tool-warning":
|
||||
"Parima tulemuse saavutamiseks, võtke kaalutluseks, et välja lülitada tarbetud vahendid, et säilitada kontekst.",
|
||||
"stop-server": "Lülitage MCP-server välja",
|
||||
"start-server": "Alusta MCP-serverit",
|
||||
"delete-server": "Kasuta MCP-serveri kustutamise funktsiooni",
|
||||
"tool-count-warning":
|
||||
"See MCP server on lubanud <b>_, mis tarbivad konteksti igas vestluses.</b> Selle asemel võid soovimatuid tööriistu välja lülitada, et säästa konteksti.",
|
||||
"startup-command": "Alustamine",
|
||||
command: "Juhendamine",
|
||||
arguments: "Argumentid",
|
||||
"not-running-warning":
|
||||
"See MCP-server ei tööta – see võib olla peatatud või alguses võib tekkida viga.",
|
||||
"tool-call-arguments": '"Tooli käivitamise argumentid"',
|
||||
"tools-enabled": "vahendid on lubatud",
|
||||
},
|
||||
settings: {
|
||||
title: "Agenti oskuste seaded",
|
||||
"max-tool-calls": {
|
||||
title: "Maximaalne töö-kõned vastuse kohta",
|
||||
description:
|
||||
"Максимаalne arv, mis agent võib ühendada, et genereerida ühe vastuse. See takistab liigse töö tegevuse ja lõpmatute ringide tekkimist.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Nutikad oskuste valiku meetodid",
|
||||
"beta-badge": "Beeta",
|
||||
description:
|
||||
"Lubage piiramatu hulga tööriistade kasutamist ning vähendage küsimuse kohta kasutatavate tokenide arv kuni 80% – AnythingLLM valib automaatselt iga küsimuse jaoks sobivad oskused.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Maksimaalne arv tööriistu, mida saab valida igale küsimusele. Soovitame seada see väärtus suuremate kontekstmudelite jaoks suuremaks.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL-i ühendus",
|
||||
description:
|
||||
"Tagage, et teie esindaja saaks kasutada SQL-i, et vastata teie küsimustele, ühendades erinevate SQL andmebaasiteenustega.",
|
||||
},
|
||||
default_skill:
|
||||
"Vaikimisi on see funktsioon lubatud, kuid saate seda välja lülitada, kui ei soovi, et see oleks saadaval kaagentile.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -673,7 +813,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Vali kõik",
|
||||
deselect_all: "Tühista valik",
|
||||
remove_selected: "Eemalda valitud",
|
||||
costs: "*Ühekordne embeddingu kulu",
|
||||
save_embed: "Salvesta ja põimi",
|
||||
"total-documents_one": "{{count}} dokument",
|
||||
"total-documents_other": "{{count}} dokumendid",
|
||||
@@ -760,7 +899,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Näita vähem",
|
||||
see_more: "Vaata rohkem",
|
||||
tools: "Vahendid",
|
||||
browse: "Sirva",
|
||||
text_size_label: "Teksti suurus",
|
||||
select_model: "Valige mudel",
|
||||
sources: "Allikasid",
|
||||
@@ -773,7 +911,6 @@ const TRANSLATIONS = {
|
||||
edit: "Redigeerimine",
|
||||
publish: "Avaldada",
|
||||
stop_generating: "Lõpeta vastuste genereerimine",
|
||||
pause_tts_speech_message: "Peata sõna-sünteesi (TTS) rääkimine sõnumis",
|
||||
slash_commands: "Lihtsasti kasutatavad käsud",
|
||||
agent_skills: "Agentide oskused",
|
||||
manage_agent_skills: "Halda agentide oskusi",
|
||||
@@ -782,6 +919,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Alusta agenti sessiooni",
|
||||
use_agent_session_to_use_tools:
|
||||
"Saate kasutada vahendeid vestluses, alustades agenti sessiooni, lisades käskile '@agent' sõna.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Mudel soovib helistada",
|
||||
approve: "Heakskiid",
|
||||
reject: "Hüvasti, keelan",
|
||||
always_allow: "Aeg-ajalt lubage {{skillName}}",
|
||||
tool_call_was_approved: "Vahendite tellimuse kinnitati.",
|
||||
tool_call_was_rejected: "Vahendite taotlus jäeti rahuldamata.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Muuda kontot",
|
||||
@@ -929,6 +1074,84 @@ const TRANSLATIONS = {
|
||||
"Sa ei ole täidetud ühtegi tööruumi.\nPäringu tööruumiks, palun pööra teie administraatorile.",
|
||||
goToWorkspace: 'Mine tööruumiks "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegrami bot",
|
||||
description:
|
||||
"Ühendage oma AnythingLLM instants Telegramiga, et saaksite vestleda oma tööruumidega igast seadmist.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "1. samm: Looge oma Telegrami bot",
|
||||
description:
|
||||
"Ava Telegramis konto @BotFather, saat <code>/newbot</code> aadressile <code>@BotFather</code>, järgige juhiseid ja kopeerige API-token.",
|
||||
"open-botfather": "Ava BotFather",
|
||||
"instruction-1": "1. Avage link või skannige QR-kood",
|
||||
"instruction-2":
|
||||
"2. Saada <code>/newbot</code> aadressile <code>@BotFather</code>",
|
||||
"instruction-3": "3. Valige oma botile nimi ja kasutajanimi.",
|
||||
"instruction-4": "4. Kopeerige API-token, mida teile antakse.",
|
||||
},
|
||||
step2: {
|
||||
title: "2. Samuti ühendage oma bot",
|
||||
description:
|
||||
"Kleepige API-token, mis teil on saanud kasutaja @BotFatherilt, ning valige oma botile vaikimõistmine.",
|
||||
"bot-token": "Bot token",
|
||||
"default-workspace": "Vaikimisi kasutatav tööruum",
|
||||
"no-workspace":
|
||||
"Praegu pole saadaval vaba töökohti. Ühe uue töökohtade loomine on plaanis.",
|
||||
connecting: "Ühendamine...",
|
||||
"connect-bot": "Ühendusrobott",
|
||||
},
|
||||
security: {
|
||||
title: "Soovitavad turvameetmed",
|
||||
description:
|
||||
"Lisaks turvalisusele, konfigureerige need seaded @BotFatheris.",
|
||||
"disable-groups": "— Ennetada, et botid ei lisataks gruppi",
|
||||
"disable-inline": "— Vältida, et bot kasutaks otsingut reaalajas.",
|
||||
"obscure-username":
|
||||
"Kasutage mitteolivaid kasutajanime, et vähendada avastamise võimalust.",
|
||||
},
|
||||
"toast-enter-token": "Palun sisestage bot'i token.",
|
||||
"toast-connect-failed": "Bot ei suutnud ühendust tehes.",
|
||||
},
|
||||
connected: {
|
||||
status: "Ühendatud",
|
||||
"status-disconnected":
|
||||
"Vabandus, toet – toet võib olla kehtimatuna või kehtima lõppenud",
|
||||
"placeholder-token": "Sisestage uus bot'i token...",
|
||||
reconnect: "Taastada ühendus",
|
||||
workspace: "Tööruum",
|
||||
"bot-link": "Bot link",
|
||||
"voice-response": "Häälreaktsioon",
|
||||
disconnecting: "Ühendus katkestatud...",
|
||||
disconnect: "Ühenduse katkestamine",
|
||||
"voice-text-only": "Tekst ainult",
|
||||
"voice-mirror":
|
||||
"Helisüsteem (vastake häältega, kui kasutaja kasutab helifunktsiooni)",
|
||||
"voice-always": "Alati lisage hääl (saada helifail koos iga vastusega)",
|
||||
"toast-disconnect-failed": "Impeer ei õnnestunud seadistada.",
|
||||
"toast-reconnect-failed": "Bot ei suutnud ühendust taastada.",
|
||||
"toast-voice-failed": "Ärkimõõtmeid ei õnnestunud uuendada.",
|
||||
"toast-approve-failed": "Kasutaja kinnitamise ebaõnnestumine.",
|
||||
"toast-deny-failed": "Ei suutnud kasutaja kohta infot väita.",
|
||||
"toast-revoke-failed": "Ebaõnnestuti kasutaja konto kustutamises.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Ootea faasis, ootamas heakskiitu",
|
||||
"pending-description":
|
||||
"Kasutajad, kes ootavad kinnitamist. Võrdige siin näidatud vastuvõtusümboli koos nende Telegrami vestluses näidatud sümboliga.",
|
||||
"approved-title": "Heakskiidud kasutajad",
|
||||
"approved-description":
|
||||
"Kasutajad, kellele on antud lubadus teie botiga vestelda.",
|
||||
user: "Kasutaja",
|
||||
"pairing-code": "Koosamis kood",
|
||||
"no-pending": "Hetkel pole ootamisel ühtegi taotlust",
|
||||
"no-approved": "Pole heakskiidud kasutajaid",
|
||||
unknown: "Tuntud pole",
|
||||
approve: "Heakskiid",
|
||||
deny: "Nõgata",
|
||||
revoke: "Tingimata",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -17,8 +17,8 @@ const TRANSLATIONS = {
|
||||
"ما را در ساخت مدل AnythingLLM متناسب با نیازهای شما یاری دهید. (این بخش اختیاری است)",
|
||||
},
|
||||
home: {
|
||||
title: "به",
|
||||
getStarted: "شروع کنید",
|
||||
welcome: "به شما خوش آمد میگوییم",
|
||||
},
|
||||
llm: {
|
||||
title: "ترجیحات مدلهای زبان بزرگ",
|
||||
@@ -53,7 +53,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "نام فضای کار",
|
||||
user: "کاربر",
|
||||
selection: "انتخاب مدل",
|
||||
saving: "در حال ذخیره...",
|
||||
save: "ذخیره تغییرات",
|
||||
@@ -65,6 +64,11 @@ const TRANSLATIONS = {
|
||||
search: "جستجو",
|
||||
username_requirements:
|
||||
"نام کاربری باید 2 تا 32 کاراکتر باشد، با حرف کوچک شروع شود و فقط شامل حروف کوچک، اعداد، زیرخط، خط تیره و نقطه باشد.",
|
||||
on: "در",
|
||||
none: "هیچ",
|
||||
stopped: "متوقف شده",
|
||||
loading: "بارگذاری",
|
||||
refresh: "تازهسازی کردن",
|
||||
},
|
||||
settings: {
|
||||
title: "تنظیمات سامانه",
|
||||
@@ -102,6 +106,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "حساب شما",
|
||||
"import-item": "وارد کردن کالا",
|
||||
},
|
||||
channels: "کانالها",
|
||||
"available-channels": {
|
||||
telegram: "تلگرام",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -176,15 +184,18 @@ const TRANSLATIONS = {
|
||||
title: "حالت گفتگو",
|
||||
chat: {
|
||||
title: "گفتگو",
|
||||
"desc-start": "پاسخها را با دانش عمومی LLM",
|
||||
and: "و",
|
||||
"desc-end": "محتوای اسناد یافت شده ارائه میدهد.",
|
||||
description:
|
||||
"با استفاده از دانش عمومی LLM و اطلاعات موجود در سند، پاسخها را ارائه میدهد. <b> و </b> برای استفاده از ابزارها، باید از دستور @agent استفاده کنید.",
|
||||
},
|
||||
query: {
|
||||
title: "پرسوجو",
|
||||
"desc-start": "پاسخها را",
|
||||
only: "فقط",
|
||||
"desc-end": "در صورت یافتن محتوای اسناد ارائه میدهد.",
|
||||
description:
|
||||
"پاسخها <b>فقط در صورت یافتن زمینه سند</b> ارائه خواهند شد.<br />برای استفاده از ابزارها، باید از دستور @agent استفاده کنید.",
|
||||
},
|
||||
automatic: {
|
||||
title: "خودرو",
|
||||
description:
|
||||
"به طور خودکار از ابزارهای موجود استفاده خواهد کرد، اگر مدل و ارائه دهنده از فراخوانی ابزار به صورت داخلی پشتیبانی کنند. <br />در صورتی که فراخوانی ابزار به صورت داخلی پشتیبانی نشود، برای استفاده از ابزارها باید از دستور @agent استفاده کنید.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -298,11 +309,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"به عامل پیشفرض امکان تولید انواع مختلف نمودار از دادههای ارائه شده یا داده شده در گفتگو را بدهید.",
|
||||
},
|
||||
save: {
|
||||
title: "تولید و ذخیره فایلها در مرورگر",
|
||||
description:
|
||||
"به عامل پیشفرض امکان تولید و نوشتن در فایلهایی که ذخیره میشوند و میتوانند در مرورگر شما دانلود شوند را بدهید.",
|
||||
},
|
||||
web: {
|
||||
title: "جستجو و مرور زنده وب",
|
||||
description:
|
||||
@@ -315,6 +321,139 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"به طور پیشفرض، این قابلیت فعال است، اما میتوانید آن را غیرفعال کنید اگر نمیخواهید این قابلیت برای نمایندگی در دسترس باشد.",
|
||||
filesystem: {
|
||||
title: "دسترسی به سیستم فایل",
|
||||
description:
|
||||
"به نماینده خود اجازه دهید تا فایلها را در یک پوشه مشخص، خوانده، نوشته، جستجو و مدیریت کند. این قابلیت شامل ویرایش فایلها، پیمایش در پوشهها و جستجوی محتوا است.",
|
||||
learnMore: "در مورد نحوه استفاده از این مهارت بیشتر بدانید.",
|
||||
configuration: "تنظیمات",
|
||||
readActions: "خواندن اقدامات",
|
||||
writeActions: "اقدامات",
|
||||
warning:
|
||||
"دسترسی به سیستم فایل میتواند خطرناک باشد، زیرا میتواند فایلها را تغییر دهد یا حذف کند. لطفاً قبل از فعالسازی، مستندات مربوطه را مطالعه کنید.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "خواندن فایل",
|
||||
description: "خواندن محتوای فایلها (متن، کد، PDF، تصاویر و غیره)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "خواندن چندین فایل",
|
||||
description: "خواندن چندین فایل به صورت همزمان",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "فهرست مخاطبین",
|
||||
description: "فایلها و پوشهها را در یک پوشه فهرست کنید.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "جستجو در فایلها",
|
||||
description: "جستجو بر اساس نام یا محتوای فایلها",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "اطلاعات فایل را دریافت کنید",
|
||||
description: "اطلاعات دقیق در مورد فایلها را دریافت کنید.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "ویرایش فایل",
|
||||
description: "امکان ویرایش متون از طریق ویرایش خط به خط",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "ایجاد پوشه",
|
||||
description: "ایجاد دایرکتوریهای جدید",
|
||||
},
|
||||
"move-file": {
|
||||
title: "انتقال/تغییر نام فایل",
|
||||
description: "فایلها و پوشهها را جابجا یا تغییر نام دهید.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "کپی فایل",
|
||||
description: "فایلها و دایرکتوریها را کپی کنید.",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "ایجاد یک فایل متنی",
|
||||
description:
|
||||
"ایجاد فایلهای متنی جدید یا جایگزینی فایلهای متنی موجود",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "ایجاد مستند",
|
||||
description:
|
||||
"به کارگزار خود اجازه دهید فرمتهای اسناد دودویی مانند ارائه پاورپوینت، صفحات گسترده اکسل، اسناد ورد و فایلهای PDF را ایجاد کند. کاربران میتوانند فایلها را مستقیماً از پنجره چت دانلود کنند.",
|
||||
configuration: "انواع اسناد موجود",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "فایلهای متنی",
|
||||
description:
|
||||
"ایجاد فایلهای متنی با هر نوع محتوا و پسوند (مانند .txt، .md، .json، .csv و غیره)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "ارائه های پاورپوینت",
|
||||
description:
|
||||
"ایجاد اسلایدها، عناوین و فهرستهای بولت برای ارائه پاورپوینتهای جدید",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "اسناد به فرمت PDF",
|
||||
description:
|
||||
"ایجاد اسناد PDF از متن ساده یا فرمتهای Markdown با استفاده از استایلهای پایه",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "برگه های اکسل",
|
||||
description:
|
||||
"ایجاد فایلهای اکسل حاوی دادههای جدولی با جداول و استایلهای مختلف",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "اسناد و فایلهای وورد",
|
||||
description:
|
||||
"ایجاد فایلهای Word با استفاده از قالببندی و استایلهای ساده",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "سرورهای MCP",
|
||||
"loading-from-config": "بارگذاری سرورهای MCP از طریق فایل پیکربندی",
|
||||
"learn-more": "در مورد سرورهای MCP اطلاعات بیشتری کسب کنید.",
|
||||
"no-servers-found": "هیچ سرور MCP یافت نشد.",
|
||||
"tool-warning":
|
||||
"برای به دست آوردن بهترین عملکرد، میتوانید ابزارهایی که نیاز ندارید را غیرفعال کنید تا از منابع و اطلاعات موجود بهرهبرداری بهتری داشته باشید.",
|
||||
"stop-server": "متوقف کردن سرور MCP",
|
||||
"start-server": "شروع سرور MCP",
|
||||
"delete-server": "حذف سرور MCP",
|
||||
"tool-count-warning":
|
||||
"این سرور MCP دارای ابزارهای <b> با قابلیت {{count}} است که در هر چت، از فضای مورد استفاده (context) بهره میبرند. </b> برای صرفهجویی در فضای مورد استفاده، توصیه میشود این ابزارهای غیرضروری را غیرفعال کنید.",
|
||||
"startup-command": "دستورالعمل اولیه",
|
||||
command: "دستورالعمل",
|
||||
arguments: "استدلالها، بحثها، دلایل",
|
||||
"not-running-warning":
|
||||
"این سرور MCP در حال اجرا نیست - ممکن است متوقف شده باشد یا در هنگام راهاندازی با مشکل مواجه شده باشد.",
|
||||
"tool-call-arguments": "آرگومانهای فراخوانی ابزار",
|
||||
"tools-enabled": "ابزارهای فعال",
|
||||
},
|
||||
settings: {
|
||||
title: "تنظیمات مهارتهای کارمند",
|
||||
"max-tool-calls": {
|
||||
title: "حداکثر تعداد درخواستهای ابزار در هر پاسخ",
|
||||
description:
|
||||
"حداکثر تعداد ابزارهایی که یک عامل میتواند برای تولید یک پاسخ واحد به آنها متصل کند. این کار از اجرای مکرر و بینهایت ابزارها جلوگیری میکند.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "انتخاب مهارتهای هوشمند",
|
||||
"beta-badge": "بتا",
|
||||
description:
|
||||
"امکان استفاده از ابزارهای نامحدود و کاهش مصرف توکن تا 80 درصد برای هر پرس و جو را فراهم کنید - AnythingLLM به طور خودکار بهترین مهارتها را برای هر پرس و جو انتخاب میکند.",
|
||||
"max-tools": {
|
||||
title: "ابزارهای مکس",
|
||||
description:
|
||||
"حداکثر تعداد ابزارهایی که میتوان برای هر پرس و جو انتخاب کرد. ما توصیه میکنیم که این مقدار را برای مدلهای با زمینه بزرگتر، به مقادیر بالاتر تنظیم کنید.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "اتصال دهنده SQL",
|
||||
description:
|
||||
"به اپراتور خود اجازه دهید تا با اتصال به ارائهدهندگان مختلف پایگاه داده SQL، از SQL برای پاسخگویی به سوالات شما استفاده کند.",
|
||||
},
|
||||
default_skill:
|
||||
"به طور پیشفرض، این قابلیت فعال است، اما میتوانید آن را غیرفعال کنید اگر نمیخواهید این قابلیت برای نمایندگی در دسترس باشد.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -592,7 +731,6 @@ const TRANSLATIONS = {
|
||||
select_all: "انتخاب همه",
|
||||
deselect_all: "انتخاب همه را لغو کنید",
|
||||
remove_selected: "حذف انتخابشده",
|
||||
costs: "*هزینه یکباره برای ایجاد مدلهای برداری",
|
||||
save_embed: "ذخیره و وارد کردن",
|
||||
"total-documents_one": "{{count}} سند",
|
||||
"total-documents_other": "{{count}} اسناد",
|
||||
@@ -696,7 +834,6 @@ const TRANSLATIONS = {
|
||||
see_less: "کمی بیشتر",
|
||||
see_more: "بیشتر",
|
||||
tools: "ابزارها",
|
||||
browse: "جستجو",
|
||||
text_size_label: "اندازه متن",
|
||||
select_model: "انتخاب مدل",
|
||||
sources: "منابع",
|
||||
@@ -709,7 +846,6 @@ const TRANSLATIONS = {
|
||||
edit: "ویرایش",
|
||||
publish: "انتشار",
|
||||
stop_generating: "متوقف کردن تولید پاسخ",
|
||||
pause_tts_speech_message: "مکث در پخش صدای متن",
|
||||
slash_commands: "دستورات کوتاهشده",
|
||||
agent_skills: "مهارتهای کارگزار",
|
||||
manage_agent_skills: "مدیریت مهارتهای نمایندگان",
|
||||
@@ -718,6 +854,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "شروع جلسه با نماینده",
|
||||
use_agent_session_to_use_tools:
|
||||
"شما میتوانید از ابزارهای موجود در چت با شروع یک جلسه با یک عامل از طریق استفاده از '@agent' در ابتدای پیام خود استفاده کنید.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "مدل میخواهد تماس بگیرد",
|
||||
approve: "تایید",
|
||||
reject: "رد",
|
||||
always_allow: "همیشه، {{skillName}} را در نظر بگیرید.",
|
||||
tool_call_was_approved: "درخواست برای تهیه ابزار تأیید شد.",
|
||||
tool_call_was_rejected: "درخواست استفاده از ابزار رد شد.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "ویرایش حساب",
|
||||
@@ -965,6 +1109,84 @@ const TRANSLATIONS = {
|
||||
"شما در حال حاضر به هیچ فضای کاری اختصاص نیافتهاید.\nلطفاً با مدیر خود تماس بگیرید تا دسترسی به یک فضای کار را درخواست کنید.",
|
||||
goToWorkspace: 'به فضای کار "{{workspace}}" بروید',
|
||||
},
|
||||
telegram: {
|
||||
title: "ربات تلگرام",
|
||||
description:
|
||||
"با اتصال نمونه AnythingLLM خود به تلگرام، میتوانید از هر دستگاهی با فضاهای کاری خود گفتگو کنید.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "مرحله ۱: ایجاد ربات Telegram خود",
|
||||
description:
|
||||
"اپلیکیشن @BotFather را در تلگرام باز کنید، دستور <code>/newbot</code> را برای <code>@BotFather</code> ارسال کنید، دستورالعملها را دنبال کنید و توکن API را کپی کنید.",
|
||||
"open-botfather": "شروع با ربات BotFather",
|
||||
"instruction-1": "1. لینک را باز کنید یا کد QR را اسکن کنید",
|
||||
"instruction-2":
|
||||
"2. پیام <code>/newbot را برای <code>@BotFather ارسال کنید.",
|
||||
"instruction-3": "3. یک نام و نام کاربری برای ربات خود انتخاب کنید.",
|
||||
"instruction-4": "4. توکنی که دریافت میکنید را کپی کنید.",
|
||||
},
|
||||
step2: {
|
||||
title: "مرحله دوم: اتصال ربات خود",
|
||||
description:
|
||||
"توکن API را که از @BotFather دریافت کردهاید، کپی کنید و یک فضای کاری پیشفرض را برای ربات خود انتخاب کنید تا بتواند با کاربران ارتباط برقرار کند.",
|
||||
"bot-token": "توکن ربات",
|
||||
"default-workspace": "فضای کاری پیشفرض",
|
||||
"no-workspace":
|
||||
"فضاهای کاری موجود نیست. یک فضای کاری جدید ایجاد خواهد شد.",
|
||||
connecting: "در حال اتصال...",
|
||||
"connect-bot": "اتصال ربات",
|
||||
},
|
||||
security: {
|
||||
title: "تنظیمات امنیتی پیشنهادی",
|
||||
description:
|
||||
"برای افزایش امنیت، این تنظیمات را در حساب @BotFather پیکربندی کنید.",
|
||||
"disable-groups": "— جلوگیری از اضافه کردن ربات به گروهها",
|
||||
"disable-inline":
|
||||
"— از استفاده رباتها در جستجوی درونصفحهای جلوگیری کنید.",
|
||||
"obscure-username":
|
||||
"از یک نام کاربری برای ربات که به راحتی قابل تشخیص نباشد، استفاده کنید تا میزان شناسایی آن را کاهش دهید.",
|
||||
},
|
||||
"toast-enter-token": "لطفاً یک توکن برای ربات وارد کنید.",
|
||||
"toast-connect-failed": "عدم امکان اتصال ربات.",
|
||||
},
|
||||
connected: {
|
||||
status: "اتصال یافته",
|
||||
"status-disconnected":
|
||||
"قطع شده – احتمال دارد توکن منقضی شده یا نامعتبر باشد",
|
||||
"placeholder-token": "وارد کردن توکن جدید برای ربات...",
|
||||
reconnect: "بازسازی ارتباط",
|
||||
workspace: "فضای کاری",
|
||||
"bot-link": "لینک ربات",
|
||||
"voice-response": "پاسخ صوتی",
|
||||
disconnecting: "قطع ارتباط...",
|
||||
disconnect: "قطع ارتباط",
|
||||
"voice-text-only": "فقط متن",
|
||||
"voice-mirror": "بازتاب (پاسخگویی با صدا هنگام ارسال صدا توسط کاربر)",
|
||||
"voice-always":
|
||||
"همیشه، حتماً، یک صدای صوتی (ارسال فایل صوتی همراه با هر پاسخ)",
|
||||
"toast-disconnect-failed": "عدم توانایی در قطع ارتباط با ربات.",
|
||||
"toast-reconnect-failed": "عدم امکان برقراری ارتباط مجدد با ربات.",
|
||||
"toast-voice-failed": "عدم امکان بهروزرسانی حالت صدا.",
|
||||
"toast-approve-failed": "عدم تایید کاربر.",
|
||||
"toast-deny-failed": "امکان رد درخواست کاربر وجود نداشت.",
|
||||
"toast-revoke-failed": "امکان لغو کردن حساب کاربری وجود نداشت.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "منتظر تایید",
|
||||
"pending-description":
|
||||
"کاربرانی که منتظر تایید هستند. کد تطبیقی که در اینجا نشان داده شده را با کد موجود در چت تلگرام خود مطابقت دهید.",
|
||||
"approved-title": "کاربران تایید شده",
|
||||
"approved-description": "کاربرانی که مجوز دارند با ربات شما گفتگو کنند.",
|
||||
user: "کاربر",
|
||||
"pairing-code": "کد جفتسازی",
|
||||
"no-pending": "هیچ درخواست در حال انجام وجود ندارد.",
|
||||
"no-approved": "کاربران تایید شده وجود ندارد",
|
||||
unknown: "نامشخص",
|
||||
approve: "تایید",
|
||||
deny: "رد",
|
||||
revoke: "اعلام لغو",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -10,7 +10,30 @@ import fs from "fs";
|
||||
import path from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import { resources } from "./resources.js";
|
||||
import DYNAMIC_KEY_ALLOWLIST from "./dynamicKeyAllowlist.js";
|
||||
|
||||
/**
|
||||
* @type {string[]}
|
||||
* Keys listed here are used dynamically (e.g. t(variable)) and should never
|
||||
* be flagged as unused or deleted by findUnusedTranslations.mjs.
|
||||
* When you add a dynamic t() call, add the affected key(s) here so the
|
||||
* pruning script knows they are intentionally referenced at runtime.
|
||||
*/
|
||||
const DYNAMIC_KEY_ALLOWLIST = [
|
||||
"keyboard-shortcuts.shortcuts.settings",
|
||||
"keyboard-shortcuts.shortcuts.home",
|
||||
"keyboard-shortcuts.shortcuts.workspaces",
|
||||
"keyboard-shortcuts.shortcuts.apiKeys",
|
||||
"keyboard-shortcuts.shortcuts.llmPreferences",
|
||||
"keyboard-shortcuts.shortcuts.chatSettings",
|
||||
"keyboard-shortcuts.shortcuts.help",
|
||||
"keyboard-shortcuts.shortcuts.showLLMSelector",
|
||||
"keyboard-shortcuts.shortcuts.workspaceSettings",
|
||||
|
||||
// Used for chat mode descriptions
|
||||
"chat.mode.automatic.description",
|
||||
"chat.mode.chat.description",
|
||||
"chat.mode.query.description",
|
||||
];
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const FRONTEND_SRC = path.resolve(__dirname, "..");
|
||||
@@ -54,12 +77,14 @@ function collectFiles(dir, results = []) {
|
||||
const sourceFiles = collectFiles(FRONTEND_SRC);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 3. Scan source files for t() references (literal and dynamic)
|
||||
// 3. Scan source files for t() and i18nKey references (literal and dynamic)
|
||||
// ---------------------------------------------------------------------------
|
||||
const referencedKeys = new Set();
|
||||
const tCallRegex = /\bt\(\s*["'`]([^"'`]+)["'`]/g;
|
||||
const dynamicTCallRegex = /\bt\(\s*([a-zA-Z_$][a-zA-Z0-9_$.]*)\s*[,)]/g;
|
||||
const templateTCallRegex = /\bt\(\s*`([^`]*\$\{[^`]*)`\s*[,)]/g;
|
||||
const i18nKeyRegex = /i18nKey=["'`]([^"'`]+)["'`]/g;
|
||||
const i18nKeyJsxRegex = /i18nKey=\{["'`]([^"'`]+)["'`]\}/g;
|
||||
const dynamicUsages = [];
|
||||
|
||||
for (const file of sourceFiles) {
|
||||
@@ -70,6 +95,14 @@ for (const file of sourceFiles) {
|
||||
referencedKeys.add(match[1]);
|
||||
}
|
||||
|
||||
while ((match = i18nKeyRegex.exec(content)) !== null) {
|
||||
referencedKeys.add(match[1]);
|
||||
}
|
||||
|
||||
while ((match = i18nKeyJsxRegex.exec(content)) !== null) {
|
||||
referencedKeys.add(match[1]);
|
||||
}
|
||||
|
||||
while ((match = dynamicTCallRegex.exec(content)) !== null) {
|
||||
const arg = match[1];
|
||||
if (/^["'`]/.test(arg)) continue;
|
||||
|
||||
@@ -16,8 +16,8 @@ const TRANSLATIONS = {
|
||||
"Aidez-nous à améliorer AnythingLLM en répondant à quelques questions.",
|
||||
},
|
||||
home: {
|
||||
title: "Bienvenue",
|
||||
getStarted: "Commencer",
|
||||
welcome: "Bienvenue",
|
||||
},
|
||||
llm: {
|
||||
title: "Préférence LLM",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Nom des espaces de travail",
|
||||
user: "Utilisateur",
|
||||
selection: "Sélection du modèle",
|
||||
saving: "Enregistrement...",
|
||||
save: "Enregistrer les modifications",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "Rechercher",
|
||||
username_requirements:
|
||||
"Le nom d'utilisateur doit comporter entre 2 et 32 caractères, commencer par une lettre minuscule et ne contenir que des lettres minuscules, des chiffres, des tirets bas, des tirets et des points.",
|
||||
on: "Sur",
|
||||
none: "Aucun",
|
||||
stopped: "Arrêté",
|
||||
loading: "Chargement",
|
||||
refresh: "Rafraîchir",
|
||||
},
|
||||
settings: {
|
||||
title: "Paramètres de l'instance",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Votre compte",
|
||||
"import-item": "Importer",
|
||||
},
|
||||
channels: "Canaux",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -177,16 +185,18 @@ const TRANSLATIONS = {
|
||||
title: "Mode de chat",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start":
|
||||
"fournira des réponses avec les connaissances générales du LLM",
|
||||
and: "et",
|
||||
"desc-end": "le contexte du document trouvé.",
|
||||
description:
|
||||
'fournira des réponses en utilisant les connaissances générales de l\'LLM et le contexte du document, <b>et</b>. Vous devrez utiliser la commande "@agent" pour utiliser les outils.',
|
||||
},
|
||||
query: {
|
||||
title: "Requête",
|
||||
"desc-start": "fournira des réponses",
|
||||
only: "uniquement",
|
||||
"desc-end": "si un contexte de document est trouvé.",
|
||||
description:
|
||||
'fournira des réponses <b>uniquement</b> si le contexte du document est trouvé.<br />Vous devrez utiliser la commande "@agent" pour utiliser les outils.',
|
||||
},
|
||||
automatic: {
|
||||
title: "Voiture",
|
||||
description:
|
||||
"utilisera automatiquement les outils si le modèle et le fournisseur prennent en charge l'appel de fonctions natives. <br />Si l'utilisation de fonctions natives n'est pas prise en charge, vous devrez utiliser la commande \"@agent\" pour utiliser les outils.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -300,11 +310,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Activez l'agent par défaut pour générer différents types de graphiques à partir des données fournies ou données dans le chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Générer et sauvegarder des fichiers dans le navigateur",
|
||||
description:
|
||||
"Activez l'agent par défaut pour générer et écrire des fichiers qui peuvent être sauvegardés et téléchargés dans votre navigateur.",
|
||||
},
|
||||
web: {
|
||||
title: "Recherche web en direct et navigation",
|
||||
description:
|
||||
@@ -317,6 +322,144 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Par défaut, cette fonctionnalité est activée, mais vous pouvez la désactiver si vous ne souhaitez pas qu'elle soit disponible pour l'agent.",
|
||||
filesystem: {
|
||||
title: "Accès au système de fichiers",
|
||||
description:
|
||||
"Permettez à votre agent de lire, écrire, rechercher et gérer des fichiers dans un répertoire spécifié. Prend en charge la modification de fichiers, la navigation dans les répertoires et la recherche de contenu.",
|
||||
learnMore: "En savoir plus sur la manière d'utiliser cette compétence.",
|
||||
configuration: "Configuration",
|
||||
readActions: "Lire les actions",
|
||||
writeActions: "Actions à effectuer",
|
||||
warning:
|
||||
"L'accès au système de fichiers peut être dangereux, car il peut modifier ou supprimer des fichiers. Veuillez consulter la <link>documentation</link> avant de l'activer.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Ouvrir le fichier",
|
||||
description:
|
||||
"Lire le contenu des fichiers (texte, code, PDF, images, etc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Lire plusieurs fichiers",
|
||||
description: "Lire plusieurs fichiers simultanément.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Annuaire",
|
||||
description:
|
||||
"Énumérer les fichiers et les répertoires d'un dossier.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Rechercher des fichiers",
|
||||
description: "Rechercher des fichiers par nom ou par contenu",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Obtenir des informations sur le fichier",
|
||||
description: "Obtenez des métadonnées détaillées sur les fichiers.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Modifier le fichier",
|
||||
description:
|
||||
"Effectuez des modifications basées sur des lignes dans les fichiers de texte.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Créer un répertoire",
|
||||
description: "Créer de nouveaux répertoires",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Déplacer/Renommer le fichier",
|
||||
description:
|
||||
"Déplacez ou renommez des fichiers et des répertoires.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copier le fichier",
|
||||
description: "Copier des fichiers et des répertoires",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Créer un fichier texte",
|
||||
description:
|
||||
"Créer de nouveaux fichiers texte ou remplacer des fichiers texte existants.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Création de documents",
|
||||
description:
|
||||
"Permettez à votre agent de créer des documents au format binaire, tels que des présentations PowerPoint, des feuilles de calcul Excel, des documents Word et des fichiers PDF. Les fichiers peuvent être téléchargés directement depuis la fenêtre de chat.",
|
||||
configuration: "Types de documents disponibles",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Fichiers de texte",
|
||||
description:
|
||||
"Créez des fichiers texte avec n'importe quel contenu et extension (par exemple, .txt, .md, .json, .csv, etc.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Présentations PowerPoint",
|
||||
description:
|
||||
"Créez de nouvelles présentations PowerPoint avec des diapositives, des titres et des puces.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Documents au format PDF",
|
||||
description:
|
||||
"Créez des documents PDF à partir de fichiers Markdown ou de texte brut, avec un style de base.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Feuilles de calcul Excel",
|
||||
description:
|
||||
"Créez des documents Excel pour les données tabulaires, avec des feuilles et un style.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Documents au format Word",
|
||||
description:
|
||||
"Créez des documents Word avec un style et une mise en page de base.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Serveurs MCP",
|
||||
"loading-from-config":
|
||||
"Chargement des serveurs MCP à partir du fichier de configuration",
|
||||
"learn-more": "En savoir plus sur les serveurs MCP.",
|
||||
"no-servers-found": "Aucun serveur MCP n'a été trouvé.",
|
||||
"tool-warning":
|
||||
"Pour obtenir les meilleures performances, envisagez de désactiver les outils inutiles afin de préserver le contexte.",
|
||||
"stop-server": "Arrêter le serveur MCP",
|
||||
"start-server": "Démarrer le serveur MCP",
|
||||
"delete-server": "Supprimer le serveur MCP",
|
||||
"tool-count-warning":
|
||||
"Ce serveur MCP a <b> des outils {{count}} activés</b> qui consommeront du contexte dans chaque conversation.<br /> Envisagez de désactiver les outils inutiles pour préserver le contexte.",
|
||||
"startup-command": "Commande de démarrage",
|
||||
command: "Ordre",
|
||||
arguments: "Arguments",
|
||||
"not-running-warning":
|
||||
"Ce serveur MCP n'est pas en cours de fonctionnement ; il peut être arrêté ou rencontrer une erreur lors du démarrage.",
|
||||
"tool-call-arguments": "Arguments des appels de fonctions/outils",
|
||||
"tools-enabled": "outils activés",
|
||||
},
|
||||
settings: {
|
||||
title: "Paramètres des compétences des agents",
|
||||
"max-tool-calls": {
|
||||
title: "Nombre maximal de requêtes Max Tool par réponse",
|
||||
description:
|
||||
"Le nombre maximal d'outils qu'un agent peut utiliser en chaîne pour générer une seule réponse. Cela empêche les appels excessifs aux outils et les boucles infinies.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Sélection de compétences basée sur l'intelligence",
|
||||
"beta-badge": "Bêta",
|
||||
description:
|
||||
"Permettez l'utilisation illimitée d'outils et réduisez la consommation de jetons jusqu'à 80 % par requête – AnythingLLM sélectionne automatiquement les compétences appropriées pour chaque requête.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Le nombre maximal d'outils à sélectionner pour chaque requête. Nous recommandons de définir cette valeur sur une valeur plus élevée pour les modèles de contexte plus importants.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Connecteur SQL",
|
||||
description:
|
||||
"Permettez à votre agent d'utiliser SQL pour répondre à vos questions en lui fournissant un accès à divers fournisseurs de bases de données SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Par défaut, cette fonctionnalité est activée, mais vous pouvez la désactiver si vous ne souhaitez pas qu'elle soit disponible pour l'agent.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -594,7 +737,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Tout sélectionner",
|
||||
deselect_all: "Tout désélectionner",
|
||||
remove_selected: "Supprimer la sélection",
|
||||
costs: "Coûts",
|
||||
save_embed: "Sauvegarder et intégrer",
|
||||
"total-documents_one": "{{count}}",
|
||||
"total-documents_other": "{{count}} documents",
|
||||
@@ -700,7 +842,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Voir moins",
|
||||
see_more: "Voir plus",
|
||||
tools: "Outils",
|
||||
browse: "Parcourir",
|
||||
text_size_label: "Taille du texte",
|
||||
select_model: "Sélectionner le modèle",
|
||||
sources: "Sources",
|
||||
@@ -713,8 +854,6 @@ const TRANSLATIONS = {
|
||||
edit: "Modifier",
|
||||
publish: "Publier",
|
||||
stop_generating: "Arrêtez de générer des réponses",
|
||||
pause_tts_speech_message:
|
||||
"Mettre en pause la lecture de la voix synthétique du message",
|
||||
slash_commands: "Commandes abrégées",
|
||||
agent_skills: "Compétences des agents",
|
||||
manage_agent_skills: "Gérer les compétences des agents",
|
||||
@@ -723,6 +862,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Démarrer la session de l'agent",
|
||||
use_agent_session_to_use_tools:
|
||||
'Vous pouvez utiliser des outils via le chat en lançant une session avec un agent en utilisant le préfixe "@agent" au début de votre requête.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Le modèle souhaite passer un appel.",
|
||||
approve: "Approuver",
|
||||
reject: "Refuser",
|
||||
always_allow: "Il est toujours important de {{skillName}}",
|
||||
tool_call_was_approved: "La demande d'outils a été approuvée.",
|
||||
tool_call_was_rejected:
|
||||
"La demande d'utilisation de l'outil a été rejetée.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Modifier le compte",
|
||||
@@ -969,6 +1117,87 @@ const TRANSLATIONS = {
|
||||
"Vous n'êtes actuellement pas affecté à aucun espace de travail.\nPour accéder à un espace de travail, veuillez contacter votre administrateur.",
|
||||
goToWorkspace: 'Aller à "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot Telegram",
|
||||
description:
|
||||
"Connectez votre instance de AnythingLLM à Telegram afin de pouvoir communiquer avec vos espaces de travail depuis n'importe quel appareil.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Étape 1 : Créez votre bot Telegram",
|
||||
description:
|
||||
"Ouvrez @BotFather sur Telegram, envoyez `/newbot` à <code>@BotFather</code>, suivez les instructions, et copiez le jeton API.",
|
||||
"open-botfather": "Ouvrir BotFather",
|
||||
"instruction-1": "1. Ouvrez le lien ou numérisez le code QR.",
|
||||
"instruction-2":
|
||||
"2. Envoyer <code>/newbot</code> à <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Choisissez un nom et un nom d'utilisateur pour votre bot.",
|
||||
"instruction-4": "4. Copiez le jeton API que vous recevez.",
|
||||
},
|
||||
step2: {
|
||||
title: "Étape 2 : Connectez votre bot",
|
||||
description:
|
||||
"Collez le jeton API que vous avez reçu de @BotFather et sélectionnez un espace de travail par défaut pour que votre bot puisse communiquer.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Espace de travail par défaut",
|
||||
"no-workspace":
|
||||
"Il n'y a pas d'espaces de travail disponibles. Un nouvel espace sera créé.",
|
||||
connecting: "Connexion...",
|
||||
"connect-bot": "Bot de connexion",
|
||||
},
|
||||
security: {
|
||||
title: "Paramètres de sécurité recommandés",
|
||||
description:
|
||||
"Pour une sécurité supplémentaire, configurez ces paramètres via @BotFather.",
|
||||
"disable-groups": "— Empêcher l'ajout de bots aux groupes",
|
||||
"disable-inline":
|
||||
"— Empêcher l'utilisation de bots dans les recherches en ligne.",
|
||||
"obscure-username":
|
||||
"Utilisez un nom d'utilisateur de bot non évident pour réduire sa visibilité.",
|
||||
},
|
||||
"toast-enter-token": "Veuillez saisir un jeton de bot.",
|
||||
"toast-connect-failed": "Échec de la connexion du bot.",
|
||||
},
|
||||
connected: {
|
||||
status: "Connecté",
|
||||
"status-disconnected":
|
||||
"Non connecté – le jeton pourrait être expiré ou invalide.",
|
||||
"placeholder-token": "Coller le nouveau jeton de bot...",
|
||||
reconnect: "Reconnexion",
|
||||
workspace: "Espace de travail",
|
||||
"bot-link": "Lien vers le bot",
|
||||
"voice-response": "Réponse vocale",
|
||||
disconnecting: "Déconnexion...",
|
||||
disconnect: "Déconnecter",
|
||||
"voice-text-only": "Texte uniquement",
|
||||
"voice-mirror":
|
||||
"Écho (répondre par la voix lorsque l'utilisateur envoie une voix)",
|
||||
"voice-always":
|
||||
"Toujours inclure une voix (envoyer un enregistrement audio avec chaque réponse)",
|
||||
"toast-disconnect-failed": "Échec de la déconnexion du robot.",
|
||||
"toast-reconnect-failed": "Échec de la reconnexion du bot.",
|
||||
"toast-voice-failed": "Impossible de mettre à jour le mode vocal.",
|
||||
"toast-approve-failed": "Échec de la validation de l'utilisateur.",
|
||||
"toast-deny-failed": "Impossible de refuser l'accès à l'utilisateur.",
|
||||
"toast-revoke-failed": "Impossible de supprimer l'utilisateur.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "En attente d'approbation",
|
||||
"pending-description":
|
||||
"Utilisateurs en attente de vérification. Correspondez le code de correspondance affiché ici avec celui qui apparaît dans leur conversation Telegram.",
|
||||
"approved-title": "Utilisateurs autorisés",
|
||||
"approved-description":
|
||||
"Utilisateurs qui ont été autorisés à communiquer avec votre bot.",
|
||||
user: "Utilisateur",
|
||||
"pairing-code": "Code de correspondance",
|
||||
"no-pending": "Aucune demande en cours",
|
||||
"no-approved": "Aucun utilisateur autorisé",
|
||||
unknown: "Inconnu",
|
||||
approve: "Approuver",
|
||||
deny: "Rejeter",
|
||||
revoke: "Annuler",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "ברוכים הבאים ל",
|
||||
getStarted: "להתחלה",
|
||||
welcome: "ברוכים הבאים",
|
||||
},
|
||||
llm: {
|
||||
title: "העדפות מודל שפה (LLM)",
|
||||
@@ -49,7 +49,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "שם סביבת העבודה",
|
||||
user: "משתמש",
|
||||
selection: "בחירת מודל",
|
||||
saving: "שומר...",
|
||||
save: "שמור שינויים",
|
||||
@@ -61,6 +60,11 @@ const TRANSLATIONS = {
|
||||
search: "חיפוש",
|
||||
username_requirements:
|
||||
"שם המשתמש חייב להיות באורך 2-32 תווים, להתחיל באות קטנה ולהכיל רק אותיות קטנות, מספרים, קווים תחתונים, מקפים ונקודות.",
|
||||
on: "על",
|
||||
none: "אין",
|
||||
stopped: "עצר",
|
||||
loading: "טעינה",
|
||||
refresh: "רענן",
|
||||
},
|
||||
settings: {
|
||||
title: "הגדרות מופע",
|
||||
@@ -98,6 +102,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "החשבון שלך",
|
||||
"import-item": "ייבוא פריט",
|
||||
},
|
||||
channels: "ערוצים",
|
||||
"available-channels": {
|
||||
telegram: "טלגרם",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -179,15 +187,18 @@ const TRANSLATIONS = {
|
||||
title: "מצב צ'אט",
|
||||
chat: {
|
||||
title: "צ'אט",
|
||||
"desc-start": "יספק תשובות עם הידע הכללי של מודל השפה",
|
||||
and: "וכן",
|
||||
"desc-end": "מהקשר המסמכים שנמצא.",
|
||||
description:
|
||||
"יוכל לספק תשובות בהתבסס על הידע הכללי של ה-LLM ועל ההקשר הרלוונטי מהמסמכים. <b> ו-</b>\nתצטרכו להשתמש בפקודה @agent כדי להשתמש בכלי.",
|
||||
},
|
||||
query: {
|
||||
title: "שאילתה",
|
||||
"desc-start": "יספק תשובות",
|
||||
only: "רק",
|
||||
"desc-end": "אם נמצא הקשר במסמכים.",
|
||||
description:
|
||||
"יוענו עם תשובות <b>רק</b>במידה ויימצא הקשר של המסמך.<br />תצטרכו להשתמש בפקודה @agent כדי להשתמש בכלי.",
|
||||
},
|
||||
automatic: {
|
||||
title: "רכב",
|
||||
description:
|
||||
"התוכנה תשתמש באופן אוטומטי בכלים אם המודל והספק תומכים בהם. <br />אם אין תמיכה בכלים מקומיים, תצטרכו להשתמש בפקודה @agent כדי להשתמש בכלים.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -297,11 +308,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"אפשר לסוכן ברירת המחדל ליצור סוגים שונים של תרשימים מנתונים שסופקו או ניתנו בצ'אט.",
|
||||
},
|
||||
save: {
|
||||
title: "יצירה ושמירה של קבצים לדפדפן",
|
||||
description:
|
||||
"אפשר לסוכן ברירת המחדל ליצור ולכתוב לקבצים שנשמרים וניתנים להורדה בדפדפן שלך.",
|
||||
},
|
||||
web: {
|
||||
title: "חיפוש וגלישה באינטרנט בזמן אמת",
|
||||
description:
|
||||
@@ -314,6 +320,137 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"כברירת מחדל, הכישורים הזה מופעל, אך ניתן להשבית אותו אם אינכם רוצים שהוא יהיה זמין עבור הסוכן.",
|
||||
filesystem: {
|
||||
title: "גישה למערכת הקבצים",
|
||||
description:
|
||||
"אפשרו למתווך שלכם לקרוא, לכתוב, לחפש ולנהל קבצים בספריית מסוימת. תומך בעריכת קבצים, ניווט בספריות וחיפוש תוכן.",
|
||||
learnMore: "למידע נוסף על השימוש בכישרון זה",
|
||||
configuration: "הגדרות",
|
||||
readActions: "קריאת פעולות",
|
||||
writeActions: "פעולות",
|
||||
warning:
|
||||
"גישה למערכת הקבצים עלולה להיות מסוכנת, שכן היא עלולה לשנות או למחוק קבצים. אנא התייעצו עם ה<link>תיעוד</link> לפני הפעלתה.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "קרא קובץ",
|
||||
description: "קריאת תוכן קבצים (טקסט, קוד, PDF, תמונות וכו')",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "קריאת מספר קבצים",
|
||||
description: "קרא מספר קבצים בו זמנית.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "רשימת אנשי קשר",
|
||||
description: "רשימת קבצים וספריות בתיקייה",
|
||||
},
|
||||
"search-files": {
|
||||
title: "חיפוש קבצים",
|
||||
description: "חיפוש קבצים לפי שם או תוכן",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "קבל מידע על הקובץ",
|
||||
description: "קבל מידע מפורט על קבצים",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "ערוך קובץ",
|
||||
description: "בצעו עריכה של קבצי טקסט על בסיס שורות.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "יצירת תיקייה",
|
||||
description: "ליצור תיקיות חדשות",
|
||||
},
|
||||
"move-file": {
|
||||
title: "העתקה/שינוי שם של קובץ",
|
||||
description: "הזיזו או שנו את שמות הקבצים והתיקיות.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "העתק קובץ",
|
||||
description: "העתקת קבצים וספריות",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "יצירת קובץ טקסט",
|
||||
description: "יצירת קבצי טקסט חדשים או החלפת קבצי טקסט קיימים",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "יצירת מסמכים",
|
||||
description:
|
||||
"אפשרו למתווך שלכם ליצור פורמטים של מסמכים בינאריים, כמו מצגות של פאוורPoint, גיליונות אלקטרוניים של Excel, מסמכי Word ו-PDF. ניתן להוריד את הקבצים ישירות מהחלון של השיחה.",
|
||||
configuration: "סוגי המסמכים הזמינים",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "קבצי טקסט",
|
||||
description:
|
||||
"צרו קבצי טקסט עם כל תוכן ותוספת (כגון .txt, .md, .json, .csv וכו').",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "מצגות של פאוור פוינט",
|
||||
description:
|
||||
"צרו מצגות חדשות בפורמט PowerPoint, הכוללות שקופיות, כותרות ונקודות עיקריות.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "מסמכים בפורמט PDF",
|
||||
description:
|
||||
"יצירת מסמכים בפורמט PDF ממחרוזות markdown או טקסט פשוט, עם עיצוב בסיסי.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "גיליונות אקסל",
|
||||
description:
|
||||
"צור מסמכי Excel עבור נתונים טבלאיים, הכוללים גיליונות ועריכת עיצוב.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "מסמכים בפורמט Word",
|
||||
description: "צור מסמכים בפורמט Word עם עיצוב ועיצוב בסיסיים.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "שרתי MCP",
|
||||
"loading-from-config": "טעינת שרתי MCP מהקובץ בתצורה",
|
||||
"learn-more": "למידע נוסף על שרתי MCP.",
|
||||
"no-servers-found": "לא נמצאו שרתי MCP.",
|
||||
"tool-warning":
|
||||
"על מנת להשיג את הביצועים הטובים ביותר, שקלו לבטל כלים לא רצויים כדי לחסוך במשאבים.",
|
||||
"stop-server": "עצור את שרת ה-MCP",
|
||||
"start-server": "הפעל שרת MCP",
|
||||
"delete-server": "מחיקת שרת ה-MCP",
|
||||
"tool-count-warning":
|
||||
"שרת ה-MCP הזה כולל <b>כלי{{count}} שפעילים, אשר יצרוך מידע הקשר בכל צ'אט. </b> מומלץ לבטל את הכליות הלא רצויות כדי לחסוך במידע ההקשר.",
|
||||
"startup-command": "פקודת התחלה",
|
||||
command: "פקודה",
|
||||
arguments: "טיעונים",
|
||||
"not-running-warning":
|
||||
"שרת ה-MCP הזה אינו פועל – ייתכן שהוא מושבת או שהוא חווה תקלה בעת ההפעלה.",
|
||||
"tool-call-arguments": "ארגומנטים לפונקציות",
|
||||
"tools-enabled": "הכלים פעלו/היו זמינים",
|
||||
},
|
||||
settings: {
|
||||
title: "הגדרות מיומנויות של סוכן",
|
||||
"max-tool-calls": {
|
||||
title: 'מספר קריאות "Max Tool" לכל תגובה',
|
||||
description:
|
||||
"מספר הכלים המקסימלי שאгент יכול לקשור כדי ליצור תגובה אחת. זה מונע קריאות מרובות של כלים ומחזורים אינסופיים.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "בחירת מיומנויות בהתאם ליכולות",
|
||||
"beta-badge": "בטא",
|
||||
description:
|
||||
"אפשרו שימוש בלתי מוגבל בכלים וצמצום השימוש בטוקנים עד 80% לכל שאילתה – ה-AnythingLLM בוחר באופן אוטומטי את הכישורים המתאימים ביותר לכל בקשה.",
|
||||
"max-tools": {
|
||||
title: "כלים של מקס",
|
||||
description:
|
||||
"מספר המינימום של כלי העבודה שניתן לבחור עבור כל שאילתה. אנו ממליצים להגדיר ערך גבוה יותר עבור מודלים עם הקשר רחב יותר.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "חיבור SQL",
|
||||
description:
|
||||
"אפשרו לסוכן שלכם לנצל את SQL כדי לענות על שאלותיכם, על ידי חיבור למספר ספקי מסדי נתונים של SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"כברירת מחדל, הכישורים הזה מופעל, אך ניתן להשבית אותו אם אינכם רוצים שהוא יהיה זמין עבור הסוכן.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -677,7 +814,6 @@ const TRANSLATIONS = {
|
||||
select_all: "בחר הכל",
|
||||
deselect_all: "בטל בחירת הכל",
|
||||
remove_selected: "הסר נבחרים",
|
||||
costs: "*עלות חד פעמית להטמעות",
|
||||
save_embed: "שמור והטמע",
|
||||
"total-documents_one": "{{count}} מסמך",
|
||||
"total-documents_other": "מסמכים {{count}}",
|
||||
@@ -764,7 +900,6 @@ const TRANSLATIONS = {
|
||||
see_less: "ראה פחות",
|
||||
see_more: "לראות עוד",
|
||||
tools: "כלים",
|
||||
browse: "גלו",
|
||||
text_size_label: "גודל הטקסט",
|
||||
select_model: "בחר מודל",
|
||||
sources: "מקורות",
|
||||
@@ -777,8 +912,6 @@ const TRANSLATIONS = {
|
||||
edit: "עריכה",
|
||||
publish: "להוציא לאור",
|
||||
stop_generating: "הפסיקו ליצור תגובה",
|
||||
pause_tts_speech_message:
|
||||
"השהייה של קריאת טקסט באמצעות תוכנת TTS (Text-to-Speech)",
|
||||
slash_commands: "פקודות קיצור",
|
||||
agent_skills: "כישורים של סוכן",
|
||||
manage_agent_skills: "ניהול מיומנויות של סוכנים",
|
||||
@@ -787,6 +920,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "התחלת סשן עם סוכן",
|
||||
use_agent_session_to_use_tools:
|
||||
"ניתן להשתמש בכלי הדיון באמצעות פתיחת סשן עם נציג על ידי שימוש בסימן '@agent' בתחילת ההודעה.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "המודל רוצה להתקשר",
|
||||
approve: "אישור",
|
||||
reject: "דחייה",
|
||||
always_allow: "יש תמיד להקצות {{skillName}}",
|
||||
tool_call_was_approved: "הבקשה לקבלת הכלי אושרה.",
|
||||
tool_call_was_rejected: "בקשת השימוש בכלי נדחתה.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "ערוך חשבון",
|
||||
@@ -935,6 +1076,80 @@ const TRANSLATIONS = {
|
||||
"אינך מוקצה לכל סביבת עבודה.\nיש ליצור קשר עם המנהל שלך כדי לבקש גישה לסביבת עבודה.",
|
||||
goToWorkspace: 'עבור לסביבת עבודה "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "בוט של טלגרם",
|
||||
description:
|
||||
"חברו את ההתקנה של AnythingLLM ל-Telegram, כך שתוכלו לתקשר עם סביבות העבודה שלכם ממכשיר כלשהו.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "שלב 1: צרו את הבוט שלכם ב-Telegram",
|
||||
description:
|
||||
"פתח את <code> ב-Telegram, שלח </code> לכתובת <code>@BotFather, עקוב אחר ההוראות, והעתק את מזהה ה-API.",
|
||||
"open-botfather": "פתוח את BotFather",
|
||||
"instruction-1": "1. פתחו את הקישור או סרקו את קוד ה-QR",
|
||||
"instruction-2":
|
||||
"2. שלחו את <code>/newbot</code> לכתובת <code>@BotFather</code>",
|
||||
"instruction-3": "3. בחרו שם וכינוי משתמש עבור הבוט שלכם",
|
||||
"instruction-4": "4. העתק את מזהה ה-API שקיבלת.",
|
||||
},
|
||||
step2: {
|
||||
title: "שלב 2: חברו את הבוט שלכם",
|
||||
description:
|
||||
"הדבק את טוקן ה-API שקיבלת מחשבון @BotFather ובחר את חלל העבודה הראשי עבור הבוט שלך, כדי שיוכל לתקשר.",
|
||||
"bot-token": "טוקן בוט",
|
||||
"default-workspace": "סביבת עבודה ברירת מחדל",
|
||||
"no-workspace": "אין מקומות עבודה זמינים. ייקבע מקום עבודה חדש.",
|
||||
connecting: "חיבור...",
|
||||
"connect-bot": "צ'אטבוט",
|
||||
},
|
||||
security: {
|
||||
title: "הגדרות אבטחה מומלצות",
|
||||
description:
|
||||
"לנוחיות נוספת, יש לבצע את ההגדרות הללו דרך חשבון ה-@BotFather.",
|
||||
"disable-groups": "— למנוע הוספת רובוטים לקבוצות",
|
||||
"disable-inline": "– למנוע שימוש בבוט בחיפוש ישיר",
|
||||
"obscure-username":
|
||||
"השתמש בשם משתמש של בוט שאינו בולט, כדי להקטין את הסיכוי שהוא יימצא.",
|
||||
},
|
||||
"toast-enter-token": "אנא הזן את טוקן הבוט.",
|
||||
"toast-connect-failed": "לא הצליח להתחבר עם הבוט.",
|
||||
},
|
||||
connected: {
|
||||
status: "מחובר",
|
||||
"status-disconnected": "נתקע – הטוקן עשוי להיות פג או לא תקין",
|
||||
"placeholder-token": "הדבק את מפתח הבוט החדש...",
|
||||
reconnect: "שוב קשר",
|
||||
workspace: "חלל עבודה",
|
||||
"bot-link": "קישור לבוט",
|
||||
"voice-response": "תגובה קולית",
|
||||
disconnecting: "ניתוק...",
|
||||
disconnect: "ניתוק",
|
||||
"voice-text-only": "טקסט בלבד",
|
||||
"voice-mirror": "משקף (להגיב בקול כאשר המשתמש שולח קול)",
|
||||
"voice-always": "יש לציין תמיד (לשלוח קבצי אודיו עם כל תגובה)",
|
||||
"toast-disconnect-failed": "לא הצלחתי לבטל את פעולת הבוט.",
|
||||
"toast-reconnect-failed": "לא הצליח לשחזר את הבוט.",
|
||||
"toast-voice-failed": "לא הצליח לעדכן את מצב השמע.",
|
||||
"toast-approve-failed": "לא ניתן לאשר את המשתמש.",
|
||||
"toast-deny-failed": "לא הצליח לסרב לבקשה של המשתמש.",
|
||||
"toast-revoke-failed": "לא הצלחתי לבטל את החשבון של המשתמש.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "נמצא בהמתנה לאישור",
|
||||
"pending-description":
|
||||
"משתמשים הממתינים לאישור. יש להתאים את הקוד שמוצג כאן עם הקוד המוצג בשיחה שלהם ב-Telegram.",
|
||||
"approved-title": "משתמשים מורשים",
|
||||
"approved-description": "משתמשים שאושרו לנהל שיחה עם הבוט שלכם.",
|
||||
user: "משתמש",
|
||||
"pairing-code": "קוד התאמה",
|
||||
"no-pending": "אין בקשות בתהליך",
|
||||
"no-approved": "אין משתמשים מורשים",
|
||||
unknown: "לא ידוע",
|
||||
approve: "אישור",
|
||||
deny: "לדחות",
|
||||
revoke: "בטל",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -17,8 +17,8 @@ const TRANSLATIONS = {
|
||||
"Aiutaci a sviluppare AnythingLLM in base alle tue esigenze. Facoltativo.",
|
||||
},
|
||||
home: {
|
||||
title: "Benvenuti a",
|
||||
getStarted: "Inizia",
|
||||
welcome: "Benvenuti",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferenza per i modelli LLM",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Nome delle aree di lavoro",
|
||||
user: "Utente",
|
||||
selection: "Selezione del modello",
|
||||
saving: "Salvo...",
|
||||
save: "Salva modifiche",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Cerca",
|
||||
username_requirements:
|
||||
"Il nome utente deve essere compreso tra 2 e 32 caratteri, iniziare con una lettera minuscola e contenere solo lettere minuscole, numeri, trattini bassi, trattini e punti.",
|
||||
on: "Su",
|
||||
none: "Nessuno",
|
||||
stopped: "Arrestato",
|
||||
loading: "Caricamento",
|
||||
refresh: "Rinfresca",
|
||||
},
|
||||
settings: {
|
||||
title: "Impostazioni istanza",
|
||||
@@ -102,6 +106,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Il tuo account",
|
||||
"import-item": "Importa articolo",
|
||||
},
|
||||
channels: "Canali",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -178,15 +186,18 @@ const TRANSLATIONS = {
|
||||
title: "Modalità chat",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "fornirà risposte con la conoscenza generale dell'LLM",
|
||||
and: "e",
|
||||
"desc-end": "contesto documentale associato.",
|
||||
description:
|
||||
'fornirà risposte basate sulla conoscenza generale dell\'LLM e sul contesto del documento <b>e</b> trovato.<br />Per utilizzare gli strumenti, sarà necessario utilizzare il comando "@agent".',
|
||||
},
|
||||
query: {
|
||||
title: "Query",
|
||||
"desc-start": "fornirà risposte",
|
||||
only: "solo",
|
||||
"desc-end": "se sarà presente un contesto documentale",
|
||||
description:
|
||||
'fornirà risposte <b>solo</b> se il contesto del documento viene trovato.<br />Sarà necessario utilizzare il comando "@agent" per utilizzare gli strumenti.',
|
||||
},
|
||||
automatic: {
|
||||
title: "Auto",
|
||||
description:
|
||||
'utilizzerà automaticamente gli strumenti se il modello e il provider supportano la chiamata nativa agli strumenti. Se la chiamata nativa agli strumenti non è supportata, sarà necessario utilizzare il comando "@agent" per utilizzare gli strumenti.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -302,11 +313,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Consenti all'agente predefinito di generare vari tipi di grafici dai dati forniti o forniti nella chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Genera e salva file nel browser",
|
||||
description:
|
||||
"Abilita l'agente predefinito per generare e scrivere su file che possono essere salvati e scaricati nel tuo browser.",
|
||||
},
|
||||
web: {
|
||||
title: "Ricerca e navigazione web in tempo reale",
|
||||
description:
|
||||
@@ -319,6 +325,142 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Per impostazione predefinita, questa funzionalità è attiva, ma è possibile disabilitarla se non si desidera che sia disponibile per l'agente.",
|
||||
filesystem: {
|
||||
title: "Accesso al file system",
|
||||
description:
|
||||
"Permetti al tuo agente di leggere, scrivere, cercare e gestire file all'interno di una directory designata. Supporta la modifica dei file, la navigazione nelle directory e la ricerca di contenuti.",
|
||||
learnMore: "Scopri di più su come utilizzare questa competenza.",
|
||||
configuration: "Configurazione",
|
||||
readActions: "Leggi le azioni",
|
||||
writeActions: "Azioni da eseguire",
|
||||
warning:
|
||||
"L'accesso al file system può essere pericoloso, in quanto può modificare o eliminare file. Si prega di consultare la <link>documentazione</link> prima di abilitarlo.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Apri file",
|
||||
description:
|
||||
"Leggi il contenuto dei file (testo, codice, PDF, immagini, ecc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Leggi più file",
|
||||
description: "Apri e leggi più file contemporaneamente.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Elenco di contatti",
|
||||
description:
|
||||
"Elenca i file e le directory all'interno di una cartella.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Cerca file",
|
||||
description: "Cerca file per nome o contenuto",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Ottieni informazioni sul file",
|
||||
description: "Ottenere metadati dettagliati sui file.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Modifica file",
|
||||
description: "Applica modifiche basate su righe ai file di testo.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Creare una directory",
|
||||
description: "Creare nuove directory",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Sposta/Rinomina file",
|
||||
description: "Spostare o rinominare file e directory.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copia file",
|
||||
description: "Copia file e directory",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Crea un file di testo",
|
||||
description:
|
||||
"Creare nuovi file di testo o sovrascrivere file di testo esistenti.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Creazione di documenti",
|
||||
description:
|
||||
"Permetti al tuo agente di creare file in formati binari come presentazioni PowerPoint, fogli di calcolo Excel, documenti Word e file PDF. I file possono essere scaricati direttamente dalla finestra di chat.",
|
||||
configuration: "Tipi di documenti disponibili",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "File di testo",
|
||||
description:
|
||||
"Creare file di testo con qualsiasi contenuto ed estensione (ad esempio, .txt, .md, .json, .csv, ecc.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Presentazioni PowerPoint",
|
||||
description:
|
||||
"Crea nuove presentazioni PowerPoint con diapositive, titoli e punti elenco.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Documenti in formato PDF",
|
||||
description:
|
||||
"Creare documenti PDF da file Markdown o testo semplice, con un'applicazione di formattazione di base.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Fogli di calcolo Excel",
|
||||
description:
|
||||
"Crea documenti Excel per dati tabulari, con fogli e stili.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Documenti in formato Word",
|
||||
description:
|
||||
"Creare documenti Word con un'impaginazione e formattazione di base.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Server MCP",
|
||||
"loading-from-config":
|
||||
"Caricamento dei server MCP da file di configurazione",
|
||||
"learn-more": "Scopri di più sui server MCP.",
|
||||
"no-servers-found": "Nessun server MCP trovato.",
|
||||
"tool-warning":
|
||||
"Per ottenere le migliori prestazioni, si consiglia di disattivare gli strumenti non necessari per preservare il contesto.",
|
||||
"stop-server": "Arrestare il server MCP",
|
||||
"start-server": "Avvia il server MCP",
|
||||
"delete-server": "Elimina il server MCP",
|
||||
"tool-count-warning":
|
||||
"Questo server MCP ha <b> alcune funzionalità abilitate</b> che consumano contesto in ogni chat.<br /> Considera di disabilitare le funzionalità indesiderate per preservare il contesto.",
|
||||
"startup-command": "Comando di avvio",
|
||||
command: "Ordine",
|
||||
arguments: "Argomentazioni",
|
||||
"not-running-warning":
|
||||
"Questo server MCP non è attivo; potrebbe essere stato interrotto o potrebbe essere in fase di avvio con errori.",
|
||||
"tool-call-arguments": "Argomenti delle chiamate di funzioni",
|
||||
"tools-enabled": "strumenti abilitati",
|
||||
},
|
||||
settings: {
|
||||
title: "Impostazioni delle competenze dell'agente",
|
||||
"max-tool-calls": {
|
||||
title: "Numero massimo di chiamate a funzioni Max Tool per risposta",
|
||||
description:
|
||||
"Il numero massimo di strumenti che un agente può concatenare per generare una singola risposta. Questo previene chiamate eccessive agli strumenti e cicli infiniti.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Selezione intelligente delle competenze",
|
||||
"beta-badge": "Versione beta",
|
||||
description:
|
||||
"Abilita l'uso illimitato degli strumenti e riduci l'utilizzo dei token fino all'80% per ogni query — AnythingLLM seleziona automaticamente le competenze più appropriate per ogni richiesta.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Il numero massimo di strumenti da selezionare per ogni query. Si raccomanda di impostare questo valore su un valore più elevato per i modelli con un contesto più ampio.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Connettore SQL",
|
||||
description:
|
||||
"Permetti al tuo agente di utilizzare SQL per rispondere alle tue domande, collegandosi a diversi fornitori di database SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Per impostazione predefinita, questa funzionalità è attiva, ma è possibile disabilitarla se non si desidera che sia disponibile per l'agente.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -598,7 +740,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Seleziona tutto",
|
||||
deselect_all: "Deselect All",
|
||||
remove_selected: "Elimina gli elementi selezionati",
|
||||
costs: "*Costo una tantum per le embedding",
|
||||
save_embed: "Salva e incorpora",
|
||||
"total-documents_one": "{{count}} documento",
|
||||
"total-documents_other": "{{count}} documenti",
|
||||
@@ -708,7 +849,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Visualizza meno",
|
||||
see_more: "Visualizza altro",
|
||||
tools: "Strumenti",
|
||||
browse: "Naviga",
|
||||
text_size_label: "Dimensione del testo",
|
||||
select_model: "Seleziona il modello",
|
||||
sources: "Fonti",
|
||||
@@ -721,8 +861,6 @@ const TRANSLATIONS = {
|
||||
edit: "Modifica",
|
||||
publish: "Pubblicare",
|
||||
stop_generating: "Interrompi la generazione della risposta",
|
||||
pause_tts_speech_message:
|
||||
"Mettere in pausa la lettura vocale del messaggio",
|
||||
slash_commands: "Comandi abbreviati",
|
||||
agent_skills: "Competenze dell'agente",
|
||||
manage_agent_skills: "Gestire le competenze degli agenti",
|
||||
@@ -731,6 +869,16 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Avvia sessione agente",
|
||||
use_agent_session_to_use_tools:
|
||||
'È possibile utilizzare gli strumenti disponibili tramite chat avviando una sessione con un agente utilizzando il prefisso "@agent" all\'inizio del messaggio.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Il modello desidera effettuare una chiamata.",
|
||||
approve: "Approvato",
|
||||
reject: "Rifiutare",
|
||||
always_allow: "Assicurarsi sempre di avere {{skillName}}",
|
||||
tool_call_was_approved:
|
||||
"La richiesta di fornitura di strumenti è stata approvata.",
|
||||
tool_call_was_rejected:
|
||||
"La richiesta di accesso all'attrezzatura è stata rifiutata.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Modifica account",
|
||||
@@ -993,6 +1141,87 @@ const TRANSLATIONS = {
|
||||
"Non sei assegnato a nessuno spazio di lavoro.\nContatta il tuo amministratore per richiedere l'accesso a uno spazio di lavoro.",
|
||||
goToWorkspace: 'Vai allo spazio di lavoro "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot per Telegram",
|
||||
description:
|
||||
"Collega la tua istanza di AnythingLLM a Telegram in modo da poter chattare con i tuoi spazi di lavoro da qualsiasi dispositivo.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Passo 1: Crea il tuo bot Telegram",
|
||||
description:
|
||||
"Apri il bot @BotFather su Telegram, invia `/newbot` a @BotFather, segui le istruzioni e copia il token API.",
|
||||
"open-botfather": "Avvia BotFather",
|
||||
"instruction-1": "1. Apri il link o scansiona il codice QR",
|
||||
"instruction-2":
|
||||
"2. Invia <code>/newbot</code> a <code>@BotFather</code>",
|
||||
"instruction-3": "3. Scegli un nome e un nome utente per il tuo bot.",
|
||||
"instruction-4": "4. Copiare il token API che riceverete",
|
||||
},
|
||||
step2: {
|
||||
title: "Passo 2: Collegare il tuo bot",
|
||||
description:
|
||||
"Incolla il token API che hai ricevuto da @BotFather e seleziona uno spazio di lavoro predefinito per il tuo bot, in modo che possa comunicare.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Spazio di lavoro predefinito",
|
||||
"no-workspace":
|
||||
"Non sono disponibili spazi di lavoro. Ne verrà creato uno nuovo.",
|
||||
connecting: "Connessione...",
|
||||
"connect-bot": "Bot di connessione",
|
||||
},
|
||||
security: {
|
||||
title: "Impostazioni di sicurezza consigliate",
|
||||
description:
|
||||
"Per una maggiore sicurezza, configurare queste impostazioni tramite @BotFather.",
|
||||
"disable-groups": "— Impedire l'aggiunta di bot ai gruppi",
|
||||
"disable-inline": "— Impedire l'uso di bot nelle ricerche inline",
|
||||
"obscure-username":
|
||||
"Utilizza un nome utente per il bot che non sia ovvio, per ridurre la sua visibilità.",
|
||||
},
|
||||
"toast-enter-token": "Si prega di inserire un token per il bot.",
|
||||
"toast-connect-failed":
|
||||
"Impossibile stabilire la connessione con il bot.",
|
||||
},
|
||||
connected: {
|
||||
status: "Collegato",
|
||||
"status-disconnected":
|
||||
"Non connesso – il token potrebbe essere scaduto o non valido",
|
||||
"placeholder-token": "Incolla il nuovo token del bot...",
|
||||
reconnect: "Riconnettersi",
|
||||
workspace: "Spazio di lavoro",
|
||||
"bot-link": "Link al bot",
|
||||
"voice-response": "Risposta vocale",
|
||||
disconnecting: "Disconnessione...",
|
||||
disconnect: "Disconnetti",
|
||||
"voice-text-only": "Testo solo",
|
||||
"voice-mirror":
|
||||
"Specchio (risposta vocale quando l'utente invia un messaggio vocale)",
|
||||
"voice-always":
|
||||
"Invia sempre un messaggio vocale (registra un audio con ogni risposta).",
|
||||
"toast-disconnect-failed": "Impossibile disconnettere il bot.",
|
||||
"toast-reconnect-failed":
|
||||
"Impossibile ristabilire la connessione con il bot.",
|
||||
"toast-voice-failed": "Impossibile aggiornare la modalità vocale.",
|
||||
"toast-approve-failed": "Impossibile approvare l'utente.",
|
||||
"toast-deny-failed": "Impossibile negare l'accesso all'utente.",
|
||||
"toast-revoke-failed": "Impossibile revocare l'accesso dell'utente.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "In attesa di approvazione",
|
||||
"pending-description":
|
||||
"Utenti in attesa di verifica. Confrontare il codice di abbinamento visualizzato qui con quello visualizzato nella loro chat di Telegram.",
|
||||
"approved-title": "Utenti approvati",
|
||||
"approved-description":
|
||||
"Utenti che sono stati approvati per chattare con il vostro bot.",
|
||||
user: "Utente",
|
||||
"pairing-code": "Codice di abbinamento",
|
||||
"no-pending": "Non ci sono richieste in sospeso.",
|
||||
"no-approved": "Nessun utente autorizzato",
|
||||
unknown: "Sconosciuto",
|
||||
approve: "Approvare",
|
||||
deny: "Negare",
|
||||
revoke: "Annullare",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "ようこそ",
|
||||
getStarted: "はじめる",
|
||||
welcome: "ようこそ",
|
||||
},
|
||||
llm: {
|
||||
title: "LLMの設定",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "ワークスペース名",
|
||||
user: "ユーザー",
|
||||
selection: "モデル選択",
|
||||
saving: "保存中...",
|
||||
save: "変更を保存",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "検索",
|
||||
username_requirements:
|
||||
"ユーザー名は2〜32文字で、小文字で始まり、小文字、数字、アンダースコア、ハイフン、ピリオドのみを含む必要があります。",
|
||||
on: "~について",
|
||||
none: "なし",
|
||||
stopped: "停止",
|
||||
loading: "読み込み中",
|
||||
refresh: "リフレッシュ",
|
||||
},
|
||||
settings: {
|
||||
title: "インスタンス設定",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "あなたのアカウント",
|
||||
"import-item": "輸入品",
|
||||
},
|
||||
channels: "チャンネル",
|
||||
"available-channels": {
|
||||
telegram: "テレグラム",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -175,15 +183,18 @@ const TRANSLATIONS = {
|
||||
title: "チャットモード",
|
||||
chat: {
|
||||
title: "チャット",
|
||||
"desc-start": "LLMの一般知識で回答します",
|
||||
and: "および",
|
||||
"desc-end": "見つかったドキュメントコンテキストを使用します。",
|
||||
description:
|
||||
"LLMの一般的な知識と、関連するドキュメントの文脈に基づいて、回答を提供します。ツールを使用するには、`@agent`コマンドを使用する必要があります。",
|
||||
},
|
||||
query: {
|
||||
title: "クエリ",
|
||||
"desc-start": "回答を提供します",
|
||||
only: "のみ",
|
||||
"desc-end": "ドキュメントコンテキストが見つかった場合のみ。",
|
||||
description:
|
||||
"必要な情報が見つかった場合にのみ、回答を提供します。ツールを使用するには、`@agent`コマンドを使用する必要があります。",
|
||||
},
|
||||
automatic: {
|
||||
title: "自動車",
|
||||
description:
|
||||
"ネイティブなツール呼び出しをサポートしている場合、モデルとプロバイダーが自動的にツールを使用します。ネイティブなツール呼び出しがサポートされていない場合は、@agentコマンドを使用してツールを使用する必要があります。",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -294,11 +305,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"デフォルトエージェントがチャットやデータからさまざまなチャートを作成できるようにします。",
|
||||
},
|
||||
save: {
|
||||
title: "ファイルの生成と保存",
|
||||
description:
|
||||
"デフォルトエージェントがファイルを生成し、ブラウザからダウンロードできるようにします。",
|
||||
},
|
||||
web: {
|
||||
title: "ウェブ検索と閲覧",
|
||||
description:
|
||||
@@ -311,6 +317,139 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"デフォルトでは、この機能は有効になっていますが、エージェントに利用させたくない場合は、無効にすることができます。",
|
||||
filesystem: {
|
||||
title: "ファイルシステムのアクセス",
|
||||
description:
|
||||
"エージェントが、指定されたディレクトリ内のファイルを読む、書き、検索、および管理できるようにします。ファイル編集、ディレクトリのナビゲーション、およびコンテンツ検索をサポートします。",
|
||||
learnMore: "このスキルの使い方について、さらに詳しく知る",
|
||||
configuration: "設定",
|
||||
readActions: "行動",
|
||||
writeActions: "行動",
|
||||
warning:
|
||||
"ファイルシステムへのアクセスは危険であり、ファイルの内容を変更または削除する可能性があります。設定する前に、必ず<link>のドキュメント</link>を参照してください。",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "ファイルを開く",
|
||||
description:
|
||||
"ファイル(テキスト、コード、PDF、画像など)の内容を読み込む。",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "複数のファイルを読み込む",
|
||||
description: "複数のファイルを同時に読み込む",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "ディレクトリ一覧",
|
||||
description: "フォルダ内のファイルとディレクトリの一覧を表示する",
|
||||
},
|
||||
"search-files": {
|
||||
title: "ファイル検索",
|
||||
description: "ファイル名または内容で検索する",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "ファイルの情報を取得する",
|
||||
description: "ファイルに関する詳細なメタデータを取得する",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "ファイル編集",
|
||||
description: "テキストファイルの行単位での編集を行う",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "ディレクトリを作成する",
|
||||
description: "新しいディレクトリを作成する",
|
||||
},
|
||||
"move-file": {
|
||||
title: "ファイル/ファイル名の変更",
|
||||
description: "ファイルやディレクトリを移動または名前を変更する",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "ファイルのコピー",
|
||||
description: "ファイルとディレクトリをコピーする",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "テキストファイルを作成する",
|
||||
description:
|
||||
"新しいテキストファイルを作成するか、既存のテキストファイルを上書きする。",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "ドキュメント作成",
|
||||
description:
|
||||
"エージェントが、パワーポイント、Excel、Word、PDFなどのバイナリ形式のドキュメントを作成できるようにします。ファイルはチャットウィンドウから直接ダウンロードできます。",
|
||||
configuration: "利用可能なドキュメントの種類",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "テキストファイル",
|
||||
description:
|
||||
".txt、.md、.json、.csvなどの拡張子を持つ、任意のコンテンツのテキストファイルを作成する。",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "パワーポイント形式のプレゼンテーション",
|
||||
description:
|
||||
"スライド、タイトル、箇条書きを含む、新しいPowerPointプレゼンテーションを作成する。",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDFドキュメント",
|
||||
description:
|
||||
"マークダウンまたはプレーンテキストから、基本的な書式設定を使用してPDFドキュメントを作成する。",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "エクセル スプレッドシート",
|
||||
description:
|
||||
"表形式のデータをスプレッドシート形式で作成し、シートとスタイルを設定する。",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Wordドキュメント",
|
||||
description: "基本的なスタイルと書式でWordドキュメントを作成する",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP サーバー",
|
||||
"loading-from-config": "構成ファイルからMCPサーバーを読み込む",
|
||||
"learn-more": "MCP サーバーに関する詳細情報を入手してください。",
|
||||
"no-servers-found": "MCP サーバーは見つかりませんでした",
|
||||
"tool-warning":
|
||||
"最高のパフォーマンスを得るためには、不要なツールを無効にして、コンテキストを維持することを検討してください。",
|
||||
"stop-server": "MCP サーバーの停止",
|
||||
"start-server": "MCP サーバーを開始する",
|
||||
"delete-server": "MCP サーバーを削除",
|
||||
"tool-count-warning":
|
||||
"このMCPサーバーには、<b>のツールが有効になっており、これらはチャットのコンテキストを消費します</b>。コンテキストを節約するために、不要なツールを無効にすることを検討してください。",
|
||||
"startup-command": "起動コマンド",
|
||||
command: "指示",
|
||||
arguments: "議論",
|
||||
"not-running-warning":
|
||||
"このMCPサーバーは稼働していません。停止しているか、起動時にエラーが発生している可能性があります。",
|
||||
"tool-call-arguments": "ツール呼び出しの引数",
|
||||
"tools-enabled": "ツールが有効化されました",
|
||||
},
|
||||
settings: {
|
||||
title: "エージェントのスキル設定",
|
||||
"max-tool-calls": {
|
||||
title: "1回の応答で実行できる最大ツール数",
|
||||
description:
|
||||
"エージェントが単一の応答を生成するために使用できるツールの一意な最大数。これにより、ツール呼び出しの過剰や無限ループを防ぐことができます。",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "知的なスキル選択",
|
||||
"beta-badge": "ベータ版",
|
||||
description:
|
||||
"クエリごとに、無制限のツールを使用し、トークン使用量を最大80%削減できます。AnythingLLMは、各プロンプトに対して最適なスキルを自動的に選択します。",
|
||||
"max-tools": {
|
||||
title: "マックスツールズ",
|
||||
description:
|
||||
"各クエリで選択できるツール数の上限。大規模なコンテキストモデルを使用する場合は、この値をより高い値に設定することをお勧めします。",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQLコネクタ",
|
||||
description:
|
||||
"エージェントが、さまざまなSQLデータベースプロバイダーに接続することで、SQLを活用してお客様からの質問に回答できるようにする。",
|
||||
},
|
||||
default_skill:
|
||||
"デフォルトでは、この機能は有効になっていますが、エージェントに利用させたくない場合は、無効にすることができます。",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -584,7 +723,6 @@ const TRANSLATIONS = {
|
||||
select_all: "すべて選択",
|
||||
deselect_all: "すべて選択解除",
|
||||
remove_selected: "選択したものを削除",
|
||||
costs: "※埋め込みには一度だけ費用がかかります",
|
||||
save_embed: "保存して埋め込む",
|
||||
"total-documents_one": "{{count}} のドキュメント",
|
||||
"total-documents_other": "{{count}} に関する書類",
|
||||
@@ -689,7 +827,6 @@ const TRANSLATIONS = {
|
||||
see_less: "詳細を見る",
|
||||
see_more: "詳細を見る",
|
||||
tools: "道具",
|
||||
browse: "閲覧",
|
||||
text_size_label: "文字サイズ",
|
||||
select_model: "モデルを選択",
|
||||
sources: "出典",
|
||||
@@ -702,7 +839,6 @@ const TRANSLATIONS = {
|
||||
edit: "編集",
|
||||
publish: "出版",
|
||||
stop_generating: "応答の生成を停止する",
|
||||
pause_tts_speech_message: "メッセージのテキスト読み上げ機能を一時停止する",
|
||||
slash_commands: "スラッシュコマンド",
|
||||
agent_skills: "エージェントのスキル",
|
||||
manage_agent_skills: "エージェントのスキル管理",
|
||||
@@ -711,6 +847,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "エージェントセッションを開始",
|
||||
use_agent_session_to_use_tools:
|
||||
"チャットでツールを使用するには、プロンプトの冒頭に'@agent'を使用してエージェントセッションを開始してください。",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "モデルは電話をかけたい。",
|
||||
approve: "承認",
|
||||
reject: "拒否",
|
||||
always_allow: "常に、{{skillName}}を確保してください。",
|
||||
tool_call_was_approved: "ツールの使用許可が承認されました",
|
||||
tool_call_was_rejected: "ツール呼び出しは拒否されました",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "アカウントを編集",
|
||||
@@ -970,6 +1114,83 @@ const TRANSLATIONS = {
|
||||
"現在、あなたはどのワークスペースにも割り当てられていません。\nワークスペースへのアクセスを要求するには、管理者にお問い合わせください。",
|
||||
goToWorkspace: 'ワークスペースに移動 "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "テレグラムボット",
|
||||
description:
|
||||
"AnyLLM のインスタンスを Telegram に接続することで、あらゆるデバイスからワークスペースとのチャットが可能になります。",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "ステップ1:Telegramボットを作成する",
|
||||
description:
|
||||
"Telegramの@BotFatherを開き、「/newbot」と入力して<code>@BotFather</code>に送信します。指示に従い、APIトークンをコピーしてください。",
|
||||
"open-botfather": "BotFather を起動する",
|
||||
"instruction-1": "1. リンクを開くか、QRコードをスキャンする",
|
||||
"instruction-2":
|
||||
"2. 「<code>」/「newbot」を「</code>」で、「<code>」@「BotFather」に送信してください。",
|
||||
"instruction-3": "3. 独自の名前とユーザー名をボットに設定してください",
|
||||
"instruction-4": "4. 受け取ったAPIトークンをコピーしてください",
|
||||
},
|
||||
step2: {
|
||||
title: "ステップ2:ボットとの接続",
|
||||
description:
|
||||
"@BotFatherから受け取ったAPIトークンを貼り付け、ボットとのチャットに使用するデフォルトのワークスペースを選択してください。",
|
||||
"bot-token": "ボット トークン",
|
||||
"default-workspace": "デフォルトのワークスペース",
|
||||
"no-workspace":
|
||||
"利用可能な作業スペースがありません。新しい作業スペースが作成されます。",
|
||||
connecting: "接続中...",
|
||||
"connect-bot": "コネクトボット",
|
||||
},
|
||||
security: {
|
||||
title: "推奨されるセキュリティ設定",
|
||||
description:
|
||||
"追加のセキュリティのため、@BotFatherでこれらの設定を設定してください。",
|
||||
"disable-groups": "— グループへのボットの追加を防止",
|
||||
"disable-inline": "— インライン検索でのボットの使用を防止",
|
||||
"obscure-username":
|
||||
"目立たないユーザー名をbotに使用することで、発見されにくくする。",
|
||||
},
|
||||
"toast-enter-token": "ボットのトークンを入力してください。",
|
||||
"toast-connect-failed": "ボットとの接続に失敗しました。",
|
||||
},
|
||||
connected: {
|
||||
status: "接続されている",
|
||||
"status-disconnected":
|
||||
"通信エラー - トークンが無効または期限切れになっている可能性があります",
|
||||
"placeholder-token": "新しいボットのトークンを貼り付け...",
|
||||
reconnect: "再接続",
|
||||
workspace: "作業スペース",
|
||||
"bot-link": "ボットへのリンク",
|
||||
"voice-response": "音声応答",
|
||||
disconnecting: "接続を解除...",
|
||||
disconnect: "接続を解除する",
|
||||
"voice-text-only": "テキストのみ",
|
||||
"voice-mirror": "(ユーザーが音声で送信した場合、音声で返信)",
|
||||
"voice-always": "常に音声メッセージ(返信ごとに音声データを送信)",
|
||||
"toast-disconnect-failed": "ボットとの接続を解除できませんでした。",
|
||||
"toast-reconnect-failed": "ボットとの再接続に失敗しました。",
|
||||
"toast-voice-failed": "音声モードの更新に失敗しました。",
|
||||
"toast-approve-failed": "ユーザーの承認に失敗しました。",
|
||||
"toast-deny-failed": "ユーザーからの拒否を拒否できませんでした。",
|
||||
"toast-revoke-failed": "ユーザーの権限停止に失敗。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "承認待ち",
|
||||
"pending-description":
|
||||
"本人情報の確認待ちのユーザー。ここに表示されているペアリングコードを、彼らがTelegramで表示しているコードと照合してください。",
|
||||
"approved-title": "承認されたユーザー",
|
||||
"approved-description":
|
||||
"あなたのボットとのチャットを許可されたユーザー。",
|
||||
user: "利用者",
|
||||
"pairing-code": "組み合わせコード",
|
||||
"no-pending": "処理中のリクエストはありません",
|
||||
"no-approved": "承認されたユーザーはいません",
|
||||
unknown: "不明",
|
||||
approve: "承認",
|
||||
deny: "否定",
|
||||
revoke: "無効化する",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "방문을 환영합니다",
|
||||
getStarted: "시작하기",
|
||||
welcome: "환영합니다",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM 기본 설정",
|
||||
@@ -50,7 +50,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "워크스페이스 이름",
|
||||
user: "사용자",
|
||||
selection: "모델 선택",
|
||||
saving: "저장 중...",
|
||||
save: "저장",
|
||||
@@ -62,6 +61,11 @@ const TRANSLATIONS = {
|
||||
search: "검색",
|
||||
username_requirements:
|
||||
"사용자 이름은 2-32자여야 하고, 소문자로 시작해야 하며, 소문자, 숫자, 밑줄, 하이픈, 마침표만 포함할 수 있습니다.",
|
||||
on: "~에 대해",
|
||||
none: "없음",
|
||||
stopped: "멈춤",
|
||||
loading: "로딩 중",
|
||||
refresh: "새롭게",
|
||||
},
|
||||
settings: {
|
||||
title: "인스턴스 설정",
|
||||
@@ -99,6 +103,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "당신의 계정",
|
||||
"import-item": "수입 품목",
|
||||
},
|
||||
channels: "채널",
|
||||
"available-channels": {
|
||||
telegram: "텔레그램",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -180,15 +188,18 @@ const TRANSLATIONS = {
|
||||
title: "채팅 모드",
|
||||
chat: {
|
||||
title: "채팅",
|
||||
"desc-start": "문서 내용을 찾습니다.",
|
||||
and: "그리고",
|
||||
"desc-end": "LLM의 일반 지식을 같이 사용하여 답변을 제공합니다",
|
||||
description:
|
||||
"LLM의 일반적인 지식과 문서 컨텍스트를 활용하여 답변을 제공합니다. 도구를 사용하려면 @agent 명령을 사용해야 합니다.",
|
||||
},
|
||||
query: {
|
||||
title: "쿼리",
|
||||
"desc-start": "문서 컨텍스트를 찾을 ",
|
||||
only: "때만",
|
||||
"desc-end": "답변을 제공합니다.",
|
||||
description:
|
||||
"문서의 맥락이 발견되면 답변만 제공합니다.<b>필요한 경우, @agent 명령어를 사용하여 도구를 사용해야 합니다.</b>",
|
||||
},
|
||||
automatic: {
|
||||
title: "자동",
|
||||
description:
|
||||
"모델과 제공업체가 네이티브 도구 호출을 지원하는 경우, 자동으로 도구를 사용합니다. <br />네이티브 도구 호출이 지원되지 않는 경우, 도구를 사용하려면 @agent 명령을 사용해야 합니다.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -298,11 +309,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"기본 에이전트가 채팅에서 제공된 데이터를 이용하여 다양한 유형의 차트를 생성할 수 있도록 합니다.",
|
||||
},
|
||||
save: {
|
||||
title: "브라우저에서 파일 생성과 저장",
|
||||
description:
|
||||
"기본 에이전트가 브라우저에서 파일을 생성하고 다운로드할 수 있도록 합니다.",
|
||||
},
|
||||
web: {
|
||||
title: "실시간 웹 검색 및 탐색",
|
||||
description:
|
||||
@@ -315,6 +321,140 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"기본적으로 이 기능은 활성화되어 있지만, 에이전트에게 이 기능을 사용하지 않도록 설정할 수도 있습니다.",
|
||||
filesystem: {
|
||||
title: "파일 시스템 접근",
|
||||
description:
|
||||
"제 에이전트가 지정된 디렉토리 내에서 파일을 읽고, 쓰고, 검색하고, 관리할 수 있도록 합니다. 파일 편집, 디렉토리 탐색, 콘텐츠 검색을 지원합니다.",
|
||||
learnMore: "이 기술을 사용하는 방법에 대해 자세히 알아보세요.",
|
||||
configuration: "구성",
|
||||
readActions: "실행 내용 보기",
|
||||
writeActions: "실행 내용",
|
||||
warning:
|
||||
"파일 시스템 접근은 위험할 수 있습니다. 왜냐하면 파일 내용을 변경하거나 삭제할 수 있기 때문입니다. 사용하기 전에 반드시 <link>문서</link>를 참조하십시오.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "파일 읽기",
|
||||
description:
|
||||
"파일(텍스트, 코드, PDF, 이미지 등)의 내용을 읽습니다.",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "여러 파일을 읽기",
|
||||
description: "여러 파일을 한 번에 읽기",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "디렉토리 목록",
|
||||
description: "폴더 내의 파일 및 디렉터리 목록 보기",
|
||||
},
|
||||
"search-files": {
|
||||
title: "파일 검색",
|
||||
description: "이름 또는 내용으로 파일을 검색",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "파일 정보 확인",
|
||||
description: "파일에 대한 자세한 메타데이터를 얻으세요.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "파일 편집",
|
||||
description: "텍스트 파일에 줄 단위로 편집",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "디렉토리 생성",
|
||||
description: "새로운 디렉토리를 생성합니다.",
|
||||
},
|
||||
"move-file": {
|
||||
title: "파일 이동/이름 변경",
|
||||
description: "파일 및 폴더를 이동하거나 이름을 변경합니다.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "파일 복사",
|
||||
description: "파일 및 디렉터리를 복사",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "텍스트 파일 작성",
|
||||
description:
|
||||
"새로운 텍스트 파일을 생성하거나 기존 텍스트 파일을 덮어쓰기",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "문서 생성",
|
||||
description:
|
||||
"에이전트가 파워포인트 프레젠테이션, 엑셀 스프레드시트, 워드 문서, PDF 등 이진 파일 형식의 문서를 생성할 수 있도록 지원합니다. 파일은 채팅 창에서 직접 다운로드할 수 있습니다.",
|
||||
configuration: "사용 가능한 문서 유형",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "텍스트 파일",
|
||||
description:
|
||||
"원하는 내용과 확장자(.txt, .md, .json, .csv 등)를 사용하여 텍스트 파일을 생성합니다.",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "파워포인트 프레젠테이션",
|
||||
description:
|
||||
"슬라이드, 제목, 마크다운 등을 포함하여 새로운 파워포인트 프레젠테이션을 만드세요.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF 문서",
|
||||
description:
|
||||
"기본 스타일을 적용하여 마크다운 또는 일반 텍스트에서 PDF 문서를 생성합니다.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "엑셀 스프레드시트",
|
||||
description:
|
||||
"표와 스타일을 포함한 표 형태의 데이터를 위한 엑셀 문서를 만드세요.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "워드 문서",
|
||||
description:
|
||||
"기본적인 스타일과 서식을 사용하여 워드 문서를 만드세요.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 서버",
|
||||
"loading-from-config": "구성 파일에서 MCP 서버 로드",
|
||||
"learn-more": "MCP 서버에 대해 더 자세히 알아보세요.",
|
||||
"no-servers-found": "MCP 서버를 찾을 수 없습니다.",
|
||||
"tool-warning":
|
||||
"최상의 성능을 위해, 불필요한 도구를 비활성화하여 컨텍스트를 보존하는 것을 고려해 보세요.",
|
||||
"stop-server": "MCP 서버 중단",
|
||||
"start-server": "MCP 서버 시작",
|
||||
"delete-server": "MCP 서버 삭제",
|
||||
"tool-count-warning":
|
||||
"이 MCP 서버에는 <b>에 설정된 {{count}} 도구가 있으며, 이는 모든 채팅에서 컨텍스트를 소비합니다. </b> 불필요한 도구를 비활성화하여 컨텍스트를 절약하는 것을 고려해 보세요.",
|
||||
"startup-command": "시작 명령어",
|
||||
command: "명령",
|
||||
arguments: "논쟁",
|
||||
"not-running-warning":
|
||||
"이 MCP 서버는 현재 실행 상태가 아닙니다. 중단되었거나, 시작 시 오류가 발생했을 수 있습니다.",
|
||||
"tool-call-arguments": "툴 호출 인자",
|
||||
"tools-enabled": "도구 사용 기능 활성화",
|
||||
},
|
||||
settings: {
|
||||
title: "에이전트 스킬 설정",
|
||||
"max-tool-calls": {
|
||||
title: "응답당 최대 툴 호출 횟수",
|
||||
description:
|
||||
"에이전트가 단일 응답을 생성하기 위해 사용할 수 있는 최대 툴의 개수입니다. 이를 통해 불필요한 툴 호출과 무한 루프를 방지합니다.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "지능형 기술 선택",
|
||||
"beta-badge": "베타",
|
||||
description:
|
||||
"쿼리당 무제한의 도구 사용 및 컷 토큰 사용량을 최대 80%까지 줄일 수 있습니다 – AnythingLLM은 모든 프롬프트에 적합한 기술을 자동으로 선택합니다.",
|
||||
"max-tools": {
|
||||
title: "맥스 툴스",
|
||||
description:
|
||||
"각 쿼리에 사용할 수 있는 최대 도구 수입니다. 큰 컨텍스트 모델의 경우, 이 값을 더 높은 값으로 설정하는 것을 권장합니다.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL 연결기",
|
||||
description:
|
||||
"여러 SQL 데이터베이스 제공업체에 연결하여 에이전트가 SQL을 활용하여 질문에 답변할 수 있도록 지원합니다.",
|
||||
},
|
||||
default_skill:
|
||||
"기본적으로 이 기능은 활성화되어 있지만, 에이전트에게 이 기능을 사용하지 않도록 설정할 수도 있습니다.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -685,7 +825,6 @@ const TRANSLATIONS = {
|
||||
select_all: "전체 선택",
|
||||
deselect_all: "전체 선택 해제",
|
||||
remove_selected: "선택 항목 삭제",
|
||||
costs: "*임베딩 1회 비용",
|
||||
save_embed: "저장 및 임베딩",
|
||||
"total-documents_one": "{{count}} 문서",
|
||||
"total-documents_other": "{{count}} 관련 문서",
|
||||
@@ -774,7 +913,6 @@ const TRANSLATIONS = {
|
||||
see_less: "더 보기",
|
||||
see_more: "더 보기",
|
||||
tools: "도구",
|
||||
browse: "검색",
|
||||
text_size_label: "글자 크기",
|
||||
select_model: "모델 선택",
|
||||
sources: "출처",
|
||||
@@ -787,7 +925,6 @@ const TRANSLATIONS = {
|
||||
edit: "수정",
|
||||
publish: "출판",
|
||||
stop_generating: "응답 생성 중단",
|
||||
pause_tts_speech_message: "메시지의 텍스트 음성 변환(TTS) 기능을 일시 중지",
|
||||
slash_commands: "슬래시 명령어",
|
||||
agent_skills: "에이전트의 역량",
|
||||
manage_agent_skills: "에이전트 역량 관리",
|
||||
@@ -796,6 +933,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "에이전트 세션 시작",
|
||||
use_agent_session_to_use_tools:
|
||||
"채팅에서 도구를 사용하려면, 프롬프트의 시작 부분에 '@agent'을 사용하여 에이전트 세션을 시작할 수 있습니다.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "모델이 통화하고 싶어",
|
||||
approve: "승인",
|
||||
reject: "거부",
|
||||
always_allow: "항상 {{skillName}}을 허용",
|
||||
tool_call_was_approved: "도구 사용 승인",
|
||||
tool_call_was_rejected: "도구 호출이 거부되었습니다.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "계정 정보 수정",
|
||||
@@ -948,6 +1093,82 @@ const TRANSLATIONS = {
|
||||
"현재 워크스페이스에 할당되지 않았습니다.\n워크스페이스에 대한 접근을 요청하려면 관리자에게 문의하세요.",
|
||||
goToWorkspace: '워크스페이스로 이동 "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "텔레그램 봇",
|
||||
description:
|
||||
"AnyLLM 인스턴스를 Telegram과 연결하여, 어떤 기기에서든 워크스페이스와 채팅할 수 있도록 합니다.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "1단계: 텔레그램 봇을 만드세요",
|
||||
description:
|
||||
"텔레그램에서 @BotFather를 열고, <code>/newbot</code>를 <code>@BotFather</code>에게 보내고, 안내에 따라 진행하여 API 토큰을 복사합니다.",
|
||||
"open-botfather": "BotFather 시작",
|
||||
"instruction-1": "1. 링크를 열거나 QR 코드를 스캔",
|
||||
"instruction-2":
|
||||
"2. <code>/newbot</code>를 <code>@BotFather</code>에게 전송",
|
||||
"instruction-3": "3. 봇의 이름과 사용자 이름을 선택하세요.",
|
||||
"instruction-4": "4. 받은 API 토큰을 복사합니다.",
|
||||
},
|
||||
step2: {
|
||||
title: "2단계: 봇을 연결합니다.",
|
||||
description:
|
||||
"@BotFather로부터 받은 API 토큰을 복사하여, 봇이 채팅할 기본 워크스페이스를 선택하세요.",
|
||||
"bot-token": "봇 토큰",
|
||||
"default-workspace": "기본 워크스페이스",
|
||||
"no-workspace":
|
||||
"사용 가능한 작업 공간이 없습니다. 새로운 작업 공간이 생성될 것입니다.",
|
||||
connecting: "연결 중...",
|
||||
"connect-bot": "연결 봇",
|
||||
},
|
||||
security: {
|
||||
title: "권장 보안 설정",
|
||||
description:
|
||||
"추가적인 보안을 위해, @BotFather에서 다음 설정을 구성해 주세요.",
|
||||
"disable-groups": "— 그룹에 봇 추가 방지",
|
||||
"disable-inline": "— 인라인 검색에서 봇 사용을 방지",
|
||||
"obscure-username":
|
||||
"자명한 봇 사용자 이름을 피하고, 발견 가능성을 줄이기 위해",
|
||||
},
|
||||
"toast-enter-token": "봇 토큰을 입력해 주세요.",
|
||||
"toast-connect-failed": "봇 연결에 실패했습니다.",
|
||||
},
|
||||
connected: {
|
||||
status: "연결된",
|
||||
"status-disconnected":
|
||||
"연결되지 않음 – 토큰이 만료되었거나 유효하지 않을 수 있습니다",
|
||||
"placeholder-token": "새로운 봇 토큰을 붙여넣으세요...",
|
||||
reconnect: "재 연결",
|
||||
workspace: "업무 공간",
|
||||
"bot-link": "봇 링크",
|
||||
"voice-response": "음성 응답",
|
||||
disconnecting: "연결 해제 중...",
|
||||
disconnect: "연결 해제",
|
||||
"voice-text-only": "텍스트만",
|
||||
"voice-mirror": "(사용자가 음성으로 응답하면, 음성으로 답변)",
|
||||
"voice-always": "항상 음성 메시지 (답변과 함께 오디오 전송)",
|
||||
"toast-disconnect-failed": "봇과의 연결을 해제하는 데 실패했습니다.",
|
||||
"toast-reconnect-failed": "봇과의 연결에 실패했습니다.",
|
||||
"toast-voice-failed": "음성 모드 업데이트에 실패했습니다.",
|
||||
"toast-approve-failed": "사용자 승인에 실패했습니다.",
|
||||
"toast-deny-failed": "사용자에게 거부 권한을 부여하지 못함.",
|
||||
"toast-revoke-failed": "사용자 계정 삭제에 실패했습니다.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "승인 대기 중",
|
||||
"pending-description":
|
||||
"승인 대기 중인 사용자. 여기 표시된 매칭 코드를 자신의 Telegram 채팅에서 표시된 코드로 일치시켜 주세요.",
|
||||
"approved-title": "승인된 사용자",
|
||||
"approved-description": "당신의 봇과 대화할 수 있도록 승인된 사용자.",
|
||||
user: "사용자",
|
||||
"pairing-code": "코드 매칭",
|
||||
"no-pending": "처리 중인 요청이 없습니다.",
|
||||
"no-approved": "승인된 사용자가 없습니다",
|
||||
unknown: "알 수 없음",
|
||||
approve: "승인",
|
||||
deny: "부인",
|
||||
revoke: "취소",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
1199
frontend/src/locales/lt/common.js
Normal file
1199
frontend/src/locales/lt/common.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Laipni lūgti",
|
||||
getStarted: "Sākt darbu",
|
||||
welcome: "Laipni lūdzam",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM preferences",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Darba telpas nosaukums",
|
||||
user: "Lietotājs",
|
||||
selection: "Modeļa izvēle",
|
||||
saving: "Saglabā...",
|
||||
save: "Saglabāt izmaiņas",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "Meklēšana",
|
||||
username_requirements:
|
||||
"Lietotājvārdam jābūt 2–32 rakstzīmju garam, jāsākas ar mazo burtu un jāsatur tikai mazie burti, cipari, apakšsvītras, domuzīmes un punkti.",
|
||||
on: "Par",
|
||||
none: "Nav",
|
||||
stopped: "Apstājās",
|
||||
loading: "Ielāde",
|
||||
refresh: "Atjaunot",
|
||||
},
|
||||
settings: {
|
||||
title: "Instances iestatījumi",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Jūsu konts",
|
||||
"import-item": "Importētā prece",
|
||||
},
|
||||
channels: "Kanāli",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -183,15 +191,18 @@ const TRANSLATIONS = {
|
||||
title: "Sarunas režīms",
|
||||
chat: {
|
||||
title: "Saruna",
|
||||
"desc-start": "sniegs atbildes ar LLM vispārējām zināšanām",
|
||||
and: "un",
|
||||
"desc-end": "dokumentu kontekstu, kas tiek atrasts.",
|
||||
description:
|
||||
'sniedz atbildes, izmantojot LLM vispārīgo zināšanu <b> un </b> dokumenta kontekstu, kas ir pieejams. Lai izmantotu rīkus, jums jāizmantojat komandu "@agent".',
|
||||
},
|
||||
query: {
|
||||
title: "Vaicājums",
|
||||
"desc-start": "sniegs atbildes",
|
||||
only: "tikai",
|
||||
"desc-end": "ja tiek atrasts dokumentu konteksts.",
|
||||
description:
|
||||
'sniedz atbildes <b>tikai__, </b>ja dokumenta konteksts ir atrasts.<br />Lai izmantotu rīkus, jums būs jāizmanto komanda "@agent".',
|
||||
},
|
||||
automatic: {
|
||||
title: "Automobiļs",
|
||||
description:
|
||||
'automātiski izmantos rīkus, ja modelis un sniedzējs atbalsta vietējo rīku izmantošanu. <br />Ja vietējā rīku izmantošana nav atbalstīta, jums būs jāizmantojat "@agent" komandu, lai izmantotu rīkus.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -303,11 +314,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Iespējot noklusējuma aģentam ģenerēt dažāda veida diagrammas no sarunā sniegtajiem vai dotajiem datiem.",
|
||||
},
|
||||
save: {
|
||||
title: "Ģenerēt un saglabāt failus pārlūkā",
|
||||
description:
|
||||
"Iespējot noklusējuma aģentam ģenerēt un rakstīt failus, kas saglabājas un var tikt lejupielādēti jūsu pārlūkā.",
|
||||
},
|
||||
web: {
|
||||
title: "Tiešsaistes tīmekļa meklēšana un pārlūkošana",
|
||||
description:
|
||||
@@ -320,6 +326,142 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Par iestatījumu, šī spēja ir aktivizēta, taču jūs varat to izslēgt, ja nevēlaties, lai tā būtu pieejama aģentam.",
|
||||
filesystem: {
|
||||
title: "Failu sistēmas piekļuves tiesības",
|
||||
description:
|
||||
"Iespējiet, lai jūsu pārstāvis varētu lasīt, rakstīt, meklēt un pārvaldīt failus noteiktā direktorijā. Atbalsta failu rediģēšanu, direktoriju navigāciju un satura meklēšanu.",
|
||||
learnMore: "Uzziniet vairāk par to, kā izmantot šo prasmi",
|
||||
configuration: "Konfigurācija",
|
||||
readActions: "Lasīt",
|
||||
writeActions: "Rīcības",
|
||||
warning:
|
||||
"Pieejums failu sistēmai var būt bīstams, jo tas var mainīt vai dzēst failus. Lūdzu, konsultējieties ar <link>dokumentāciju</link> pirms aktivizēšanas.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Atvērt failu",
|
||||
description:
|
||||
"Izlasiet failu saturu (tekstus, kodu, PDF failus, attēlus utt.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Izlasīt vairākus failus",
|
||||
description: "Lasi vairākus failus vienlaikus.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Saraksta direktorijs",
|
||||
description:
|
||||
"Izveidot failu un direktoru sarakstu ievietotajā mapē",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Meklēt failus",
|
||||
description: "Meklē failus pēc nosaukuma vai satura",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Iegūst faila informāciju",
|
||||
description: "Iesaļojiet detalizētus failu metadatus",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Rediģēt failu",
|
||||
description:
|
||||
"Veiciet teksta failu rediģēšanu, izmantojot rindu bāzes metodi.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Izveidot direktoriju",
|
||||
description: "Izveidot jaunas direktorijas",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Pārvietot/Vārdēt failu",
|
||||
description: "Vāc vai pārdzen failus un direktorijus",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Kopēt failu",
|
||||
description: "Kopēt failus un direktorus",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Izveidot teksta failu",
|
||||
description:
|
||||
"Izveidot jaunas teksta failus vai pārrakstīt esošos teksta failus.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Dokumentu izveide",
|
||||
description:
|
||||
"Ļauj savam pārstāvim izveidot binārus dokumentu formātus, piemēram, PowerPoint prezentācijas, Excel tabulas, Word dokumentus un PDF failus. Failus var lejupielādēt tieši no čata.",
|
||||
configuration: "Pieejamās dokumentu veidas",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Teksta faili",
|
||||
description:
|
||||
"Izveidot teksta failus ar jebkuru saturu un izplejumu (.txt, .md, .json, .csv utt.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint prezentācijas",
|
||||
description:
|
||||
"Izveidot jaunas PowerPoint prezentācijas ar slaidiem, nosaukumiem un punktiem.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF dokumenti",
|
||||
description:
|
||||
"Izveidot PDF dokumentus no Markdown vai vienkāršas teksta, izmantojot pamata formāciju.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel tabulas",
|
||||
description:
|
||||
"Izveidot Excel dokumentus ar tabulas datiem, kas ietver lapas un stila iespējas.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Vārdu dokumenti",
|
||||
description:
|
||||
"Izveidot Word dokumentus ar pamata stils un formātēšanu",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP serveri",
|
||||
"loading-from-config": "Ielādot MCP serverus no konfigūrācijas faila",
|
||||
"learn-more": "Uzziniet vairāk par MCP serveriem.",
|
||||
"no-servers-found": "Neizdevās atrast kādus MCP serverus.",
|
||||
"tool-warning":
|
||||
"Lai nodrošinātu optimālu darbību, apsveriet iespēju atspēlot nevajadzīgus rīkus, lai saglabātu kontekstu.",
|
||||
"stop-server": "Aizvert MCP serveri",
|
||||
"start-server": "Sākt MCP serveri",
|
||||
"delete-server": "Dzēst MCP serveri",
|
||||
"tool-count-warning":
|
||||
"Šis MCP servers ir aktivizētas <b> instrumenti, kas izmantos kontekstu katrā sarunā.</b> Iespējams, ir labāk deaktivizēt nevēlamus instrumentus, lai saglabātu kontekstu.",
|
||||
"startup-command": "Sākuma komanda",
|
||||
command: "Instrukcijas",
|
||||
arguments: "Pamatatpersonas",
|
||||
"not-running-warning":
|
||||
"Šis MCP servers darbojas – iespējams, tas ir izslēgts vai piedzīvo kļūdu, kad tiek ieslēgts.",
|
||||
"tool-call-arguments": "Parametri, kas tiek nosūtīti rīkam",
|
||||
"tools-enabled": "rīki atļauti",
|
||||
},
|
||||
settings: {
|
||||
title: "Aģenta spēju iestatījumi",
|
||||
"max-tool-calls": {
|
||||
title: "Maksimālais rēķinu skaits vienam atbildē",
|
||||
description:
|
||||
"Maksimālais rīku skaits, ko aģents var apvienot, lai ģenerētu vienu atbildi. Tas novērina neierobežotu rīku izmantošanu un beidzoties.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Izglītības un prasmu izvēle, kas balstota uz spējām",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
'Ievērojiet neierobežotu rīku un "cut token" izmantošanas samazinājumu līdz 80% uz katru pieprasījumu – AnythingLLM automātiski izvēlas piemērotākās prasmes katram pieprasījumam.',
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Maksimālais rīku skaits, kas var tikt izvēlts katrai meklēšanai. Mēs iesakām iestatīt šo vērtību, lai iegūtu lielāku kontekstu modelus.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL savienotājs",
|
||||
description:
|
||||
"Ļauj savam pārstāvim izmantot SQL, lai atbildētu uz jūsu jautājumiem, savienojoties ar dažādiem SQL datubāzes sniedzējiem.",
|
||||
},
|
||||
default_skill:
|
||||
"Par iestatījumu, šī spēja ir aktivizēta, taču jūs varat to izslēgt, ja nevēlaties, lai tā būtu pieejama aģentam.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -698,7 +840,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Atlasīt visu",
|
||||
deselect_all: "Atcelt visu atlasi",
|
||||
remove_selected: "Noņemt atlasītos",
|
||||
costs: "*Vienreizējas izmaksas iegulšanai",
|
||||
save_embed: "Saglabāt un iegult",
|
||||
"total-documents_one": "{{count}} dokumenta",
|
||||
"total-documents_other": "{{count}} dokumenti",
|
||||
@@ -793,7 +934,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Skatīt mazāk",
|
||||
see_more: "Skatīt vairāk",
|
||||
tools: "Rīki",
|
||||
browse: "Izpētiet",
|
||||
text_size_label: "Teksta izmērs",
|
||||
select_model: "Izvēlieties modeli",
|
||||
sources: "Avotus",
|
||||
@@ -806,8 +946,6 @@ const TRANSLATIONS = {
|
||||
edit: "Rediģēt",
|
||||
publish: "Publicēt",
|
||||
stop_generating: "Atsauciet atbildes ģenerēšanu",
|
||||
pause_tts_speech_message:
|
||||
"Pārtrauciet TTS (teksta-izrunas) žēstā vēstījuma izrunu.",
|
||||
slash_commands: "Īs termini komandās",
|
||||
agent_skills: "Aģenta prasmes",
|
||||
manage_agent_skills: "Iesaista aģenta prasmes",
|
||||
@@ -816,6 +954,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Sākt aģenta sesiju",
|
||||
use_agent_session_to_use_tools:
|
||||
'Jūs varat izmantot rīkus čatā, sākot aģenta sesiju, ievietojot "@agent" jūsu iniciālajā tekstā.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Modeļa vēlējas izrunāt",
|
||||
approve: "Aizmaksā, apstiprināts",
|
||||
reject: "Atgrūst",
|
||||
always_allow: "Vienmēr nodrošiniet {{skillName}}",
|
||||
tool_call_was_approved: "Instrumentu pieprasījums tika apstiprināts.",
|
||||
tool_call_was_rejected:
|
||||
"Pieprasījums par instrumenta izmantošanu tika atgrūstīts.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Rediģēt kontu",
|
||||
@@ -973,6 +1120,86 @@ const TRANSLATIONS = {
|
||||
"Jūs nav piešķirts nevienai darba vietai.\nLūdzu, sazinieties ar savu administratoru, lai pieprasītu piekļuvi darba vietai.",
|
||||
goToWorkspace: 'Pāriet uz darba vietu "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram bot",
|
||||
description:
|
||||
"Iespējiet savu AnythingLLM instanci, lai varētu tikt savienots ar Telegram, un tāpēc varēsat runāt ar saviem darba grupām no jebkura ierīces.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "1. darbība: Izveidot savu Telegram botu",
|
||||
description:
|
||||
"Atveriet `@BotFather` Telegramā, nosūtiet `/newbot` un ievietojiet to adresē <code>@BotFather</code>, sekojiet norādījumiem un kopējiet API atslēgu.",
|
||||
"open-botfather": "Atvērt BotFather",
|
||||
"instruction-1": "1. Atveriet saiti vai skenējiet QR kodu",
|
||||
"instruction-2":
|
||||
"2. Nosūtiet <code>/newbot</code> uz <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Izvēlieties nosaukumu un lietotājvārdu savam botam",
|
||||
"instruction-4": "4. Kopējiet API atslēgu, ko saņemat",
|
||||
},
|
||||
step2: {
|
||||
title: "2. darbība: Pievienojiet savu botu",
|
||||
description:
|
||||
"Ievietojiet API atslēgu, ko saņēsit no @BotFather, un izvēlieties nokārtotā darba telpu, kuras jūsu bots varēs veikt sazi.",
|
||||
"bot-token": "Bots tokens",
|
||||
"default-workspace": "Pamatojas darba videne",
|
||||
"no-workspace": "Nav pieejamas darba vietas. Tiks izveidota jauna.",
|
||||
connecting: "Savienojums...",
|
||||
"connect-bot": "Saistītais bot",
|
||||
},
|
||||
security: {
|
||||
title: "Ieteicamās drošības iestatījumi",
|
||||
description:
|
||||
"Lai nodrošinātu papildu drošību, konfigurējiet šos iestatījumus, izmantojot @BotFather.",
|
||||
"disable-groups": "— Novērst, lai boti tiktu pievienoti grupām",
|
||||
"disable-inline":
|
||||
"— Novērst, lai bots tiktu izmantoti tiešajā meklēšanā.",
|
||||
"obscure-username":
|
||||
"Izmantojiet neparādu botu lietotāju vārdu, lai samazinātu atklājamo iespēju.",
|
||||
},
|
||||
"toast-enter-token": "Lūdzu, ievadiet bot tokenu.",
|
||||
"toast-connect-failed": "Neizdevās pievienot botu.",
|
||||
},
|
||||
connected: {
|
||||
status: "Saistīts",
|
||||
"status-disconnected":
|
||||
"Atvienots — tokens var būt nolaidēts vai nederīgs",
|
||||
"placeholder-token": "Ievietojiet jaunu bot tokenu...",
|
||||
reconnect: "Atjaunot sazi",
|
||||
workspace: "Darba telpa",
|
||||
"bot-link": "Bots saite",
|
||||
"voice-response": "Balss atbildes",
|
||||
disconnecting: "Atvienojot...",
|
||||
disconnect: "Izslēgt",
|
||||
"voice-text-only": "Tikai teksts",
|
||||
"voice-mirror":
|
||||
"Atspoguļošana (atbildēt ar balsi, kad lietotājs nosauc balsi)",
|
||||
"voice-always":
|
||||
"Vienmēr pievienojiet audio (sūtiet audio ar katru atbildi).",
|
||||
"toast-disconnect-failed": "Neizdevās izslēgt botu.",
|
||||
"toast-reconnect-failed": "Neizdevās atjaunot saikni ar botu.",
|
||||
"toast-voice-failed": "Neizdevās atjaunināt balsī noteiktās režimas.",
|
||||
"toast-approve-failed": "Nespēja apstiprināt lietotāju.",
|
||||
"toast-deny-failed": "Nespēja atspējot lietotāju.",
|
||||
"toast-revoke-failed": "Neizdevās atcelt lietotāja tiesības.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Atkarībā no apstākļiem",
|
||||
"pending-description":
|
||||
"Izmantotāji, kas gaida apstiprinājumu. Salīdziniet šeit norādīto koda numuru ar to, kas redzams viņu Telegram sarunā.",
|
||||
"approved-title": "Atļautie lietotāji",
|
||||
"approved-description":
|
||||
"Izmantotāji, kuriem ir atļauts veikt saziņai ar jūsu botu.",
|
||||
user: "Izmantotājs",
|
||||
"pairing-code": "Kopējā koda numura kombinācija",
|
||||
"no-pending": "Neizpildīti pieprasījumi",
|
||||
"no-approved": "No apstiprinātiem lietotājiem",
|
||||
unknown: "Nezināms",
|
||||
approve: "Aptver",
|
||||
deny: "Atbrīsties; atgrūst",
|
||||
revoke: "Atcel",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -17,8 +17,8 @@ const TRANSLATIONS = {
|
||||
"Help ons AnythingLLM af te stemmen op jouw behoeften. (Optioneel)",
|
||||
},
|
||||
home: {
|
||||
title: "Welkom bij",
|
||||
getStarted: "Aan de slag",
|
||||
welcome: "Welkom",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM-voorkeuren",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Werkruimten Naam",
|
||||
user: "Gebruiker",
|
||||
selection: "Model Selectie",
|
||||
saving: "Opslaan...",
|
||||
save: "Wijzigingen opslaan",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Zoeken",
|
||||
username_requirements:
|
||||
"De gebruikersnaam moet 2-32 tekens bevatten, beginnen met een kleine letter en mag alleen kleine letters, cijfers, underscores, koppeltekens en punten bevatten.",
|
||||
on: "Over",
|
||||
none: "Geen",
|
||||
stopped: "Gestopt",
|
||||
loading: "Laad",
|
||||
refresh: "Verfrissen",
|
||||
},
|
||||
settings: {
|
||||
title: "Instelling Instanties",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Uw account",
|
||||
"import-item": "Importeren",
|
||||
},
|
||||
channels: "Kanaal",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -176,15 +184,18 @@ const TRANSLATIONS = {
|
||||
title: "Chatmodus",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "zal antwoorden geven met de algemene kennis van de LLM",
|
||||
and: "en",
|
||||
"desc-end": "documentcontext die wordt gevonden.",
|
||||
description:
|
||||
"zal antwoorden genereren met behulp van de algemene kennis van het LLM en de context uit het document <b>en</b>. <br />Om tools te gebruiken, moet u het commando `@agent` gebruiken.",
|
||||
},
|
||||
query: {
|
||||
title: "Query",
|
||||
"desc-start": "zal antwoorden geven",
|
||||
only: "alleen",
|
||||
"desc-end": "als documentcontext wordt gevonden.",
|
||||
description:
|
||||
"zal alleen antwoorden <b>als de context van het document wordt gevonden.</b>U moet het commando @agent gebruiken om de tools te gebruiken.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Auto",
|
||||
description:
|
||||
"zal automatisch tools gebruiken als het model en de provider native tool-aanroepen ondersteunen. <br />Als native tooling niet wordt ondersteund, moet u de `@agent`-commando gebruiken om tools te gebruiken.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -298,11 +309,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Sta de standaardagent toe om verschillende soorten grafieken te genereren uit verstrekte of in de chat gegeven gegevens.",
|
||||
},
|
||||
save: {
|
||||
title: "Genereren & opslaan van bestanden naar browser",
|
||||
description:
|
||||
"Sta de standaardagent toe om te genereren en te schrijven naar bestanden die worden opgeslagen en kunnen worden gedownload in je browser.",
|
||||
},
|
||||
web: {
|
||||
title: "Live web zoeken en browsen",
|
||||
description:
|
||||
@@ -315,6 +321,141 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Standaard is deze functie ingeschakeld, maar u kunt deze uitschakelen als u niet wilt dat de agent er gebruik van kan maken.",
|
||||
filesystem: {
|
||||
title: "Toegang tot het bestandssysteem",
|
||||
description:
|
||||
"Geef uw agent de mogelijkheid om bestanden te lezen, te schrijven, te zoeken en te beheren binnen een aangewezen map. Ondersteunt het bewerken van bestanden, het navigeren door mappen en het zoeken naar inhoud.",
|
||||
learnMore:
|
||||
"Meer informatie over hoe u deze vaardigheid kunt toepassen.",
|
||||
configuration: "Configuratie",
|
||||
readActions: "Lees acties",
|
||||
writeActions: "Schrijf acties",
|
||||
warning:
|
||||
"Toegang tot het bestandssysteem kan gevaarlijk zijn, omdat het bestanden kan wijzigen of verwijderen. Raadpleeg de <link>documentatie</link> voordat u dit activeert.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Bestand openen",
|
||||
description:
|
||||
"Lees de inhoud van bestanden (tekst, code, PDF, afbeeldingen, enz.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Lees meerdere bestanden",
|
||||
description: "Lees meerdere bestanden tegelijkertijd.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Lijst met contactgegevens",
|
||||
description:
|
||||
"Maak een lijst van bestanden en mappen binnen een map.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Bestanden zoeken",
|
||||
description: "Zoek naar bestanden op naam of inhoud",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Fijlsinformatie bekijken",
|
||||
description: "Verkrijg gedetailleerde metadata over bestanden.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Bestand bewerken",
|
||||
description: "Voer wijzigingen uit op tekstbestanden, per regel.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Maak een directory",
|
||||
description: "Maak nieuwe mappen aan",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Verplaats/Hernoem bestand",
|
||||
description: "Verplaats of wijzig de naam van bestanden en mappen.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Kopieer bestand",
|
||||
description: "Kopieer bestanden en mappen",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Maak een tekstbestand",
|
||||
description:
|
||||
"Maak nieuwe tekstbestanden aan of vervang bestaande tekstbestanden.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Documentcreatie",
|
||||
description:
|
||||
"Laat uw agent documenten in binair formaat aanmaken, zoals PowerPoint-presentaties, Excel-tabellen, Word-documenten en PDF-bestanden. Bestanden kunnen direct worden gedownload vanuit het chatvenster.",
|
||||
configuration: "Beschikbare documenttypen",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Tekstbestanden",
|
||||
description:
|
||||
"Maak tekstbestanden met elk gewenst inhoud en bestandsextensie (bijvoorbeeld .txt, .md, .json, .csv, enz.).",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Presentaties met PowerPoint",
|
||||
description:
|
||||
"Maak nieuwe PowerPoint-presentaties met dia's, titels en opsommingstekens.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF-documenten",
|
||||
description:
|
||||
"Maak PDF-documenten aan vanuit Markdown of gewone tekst, met basisstijling.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel-tabellen",
|
||||
description:
|
||||
"Maak Excel-documenten voor tabelgegevens, met tabbladen en opmaak.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Word-documenten",
|
||||
description: "Maak Word-documenten met basisstijlen en -opmaak.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-servers",
|
||||
"loading-from-config": "MCP-servers laden vanuit een configuratiebestand",
|
||||
"learn-more": "Meer informatie over MCP-servers.",
|
||||
"no-servers-found": "Geen MCP-servers gevonden.",
|
||||
"tool-warning":
|
||||
"Om de beste prestaties te garanderen, overweeg dan om ongewenste tools uit te schakelen om de context te behouden.",
|
||||
"stop-server": "Stoppen met de MCP-server",
|
||||
"start-server": "Start de MCP-server",
|
||||
"delete-server": "Verwijder de MCP-server",
|
||||
"tool-count-warning":
|
||||
"Deze MCP-server heeft <b> bepaalde tools ingeschakeld</b> die context gebruiken in elke chat. <br /> Overweeg om ongewenste tools uit te schakelen om context te besparen.",
|
||||
"startup-command": "Startcommando",
|
||||
command: "Instructie",
|
||||
arguments: "Argumenten",
|
||||
"not-running-warning":
|
||||
"Deze MCP-server is niet actief – deze kan zijn uitgeschakeld of een fout ervaren tijdens het opstarten.",
|
||||
"tool-call-arguments": "Argumenten voor het aanroepen van een tool",
|
||||
"tools-enabled": "hulpmiddelen zijn geactiveerd",
|
||||
},
|
||||
settings: {
|
||||
title: "Instellingen voor vaardigheden van agenten",
|
||||
"max-tool-calls": {
|
||||
title: "Maximaal aantal tool-aanroepen per antwoord",
|
||||
description:
|
||||
"Het maximale aantal tools dat een agent kan gebruiken om een enkele reactie te genereren. Dit voorkomt dat tools onbeperkt worden aangeroepen en dat er oneindige loops ontstaan.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Intelligente selectie van vaardigheden",
|
||||
"beta-badge": "Betaling",
|
||||
description:
|
||||
'Maak gebruik van een onbeperkt aantal tools en verminder het gebruik van "cut tokens" met tot wel 80% per query – AnythingLLM selecteert automatisch de juiste vaardigheden voor elke vraag.',
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Het maximale aantal tools dat kan worden geselecteerd voor elke query. Wij raden aan om deze waarde hoger in te stellen voor modellen met een grotere context.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL-connector",
|
||||
description:
|
||||
"Maak het mogelijk voor uw agent om SQL te gebruiken om uw vragen te beantwoorden, door verbinding te maken met verschillende SQL-databaseproviders.",
|
||||
},
|
||||
default_skill:
|
||||
"Standaard is deze functie ingeschakeld, maar u kunt deze uitschakelen als u niet wilt dat de agent er gebruik van kan maken.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -594,7 +735,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Alles selecteren",
|
||||
deselect_all: "Alles deselecteren",
|
||||
remove_selected: "Verwijderen Geselecteerd",
|
||||
costs: "*Eenmalige kosten voor embedden",
|
||||
save_embed: "Opslaan en embedden",
|
||||
"total-documents_one": "{{count}} document",
|
||||
"total-documents_other": "{{count}} documenten",
|
||||
@@ -697,7 +837,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Minder zien",
|
||||
see_more: "Meer zien",
|
||||
tools: "Gereedschap",
|
||||
browse: "Bladeren",
|
||||
text_size_label: "Lettergrootte",
|
||||
select_model: "Kies het model",
|
||||
sources: "Bronnen",
|
||||
@@ -710,7 +849,6 @@ const TRANSLATIONS = {
|
||||
edit: "Bewerk",
|
||||
publish: "Publiceren",
|
||||
stop_generating: "Stoppen met het genereren van antwoorden",
|
||||
pause_tts_speech_message: "Pauzeer de spraak van de tekstberichten.",
|
||||
slash_commands: "Korte commando's",
|
||||
agent_skills: "Vaardigheden van agenten",
|
||||
manage_agent_skills: "Beheer van de vaardigheden van de agent",
|
||||
@@ -719,6 +857,16 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Start Agent Sessie",
|
||||
use_agent_session_to_use_tools:
|
||||
'U kunt tools in de chat gebruiken door een sessie met een agent te starten, beginnend met "@agent" aan het begin van uw bericht.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "De klant wil een gesprek plannen.",
|
||||
approve: "Goedkeuren",
|
||||
reject: "Afgewijzen",
|
||||
always_allow: "Zorg er altijd voor dat {{skillName}} aanwezig is.",
|
||||
tool_call_was_approved:
|
||||
"De aanvraag voor het gereedschap is goedgekeurd.",
|
||||
tool_call_was_rejected:
|
||||
"De aanvraag om het gereedschap te gebruiken is afgewezen.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Account bewerken",
|
||||
@@ -973,6 +1121,88 @@ const TRANSLATIONS = {
|
||||
"Je bent nog niet toegewezen aan een werkruimte.\nNeem contact op met je beheerder om toegang te vragen tot een werkruimte.",
|
||||
goToWorkspace: 'Ga naar de werkruimte "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram Bot",
|
||||
description:
|
||||
"Verbind uw AnythingLLM-instantie met Telegram, zodat u vanuit elk apparaat kunt communiceren met uw werkruimtes.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Stap 1: Maak je Telegram-bot",
|
||||
description:
|
||||
"Open het @BotFather-kanaal in Telegram, stuur `/newbot` naar @BotFather, volg de instructies en kopieer het API-token.",
|
||||
"open-botfather": "Open BotFather",
|
||||
"instruction-1": "1. Open het link of scan de QR-code",
|
||||
"instruction-2":
|
||||
"2. Stuur <code>/newbot</code> naar <code>@BotFather</code>",
|
||||
"instruction-3": "3. Kies een naam en gebruikersnaam voor je bot",
|
||||
"instruction-4": "4. Kopieer de API-token die je ontvangt",
|
||||
},
|
||||
step2: {
|
||||
title: "Stap 2: Verbind uw bot",
|
||||
description:
|
||||
"Plak de API-token die je van @BotFather hebt ontvangen en selecteer een standaard werkruimte voor je bot om mee te communiceren.",
|
||||
"bot-token": "Bot-token",
|
||||
"default-workspace": "Standaard werkruimte",
|
||||
"no-workspace":
|
||||
"Er zijn geen beschikbare werkplekken. Een nieuwe zal worden aangemaakt.",
|
||||
connecting: "Verbinding wordt gemaakt...",
|
||||
"connect-bot": "Connect Bot",
|
||||
},
|
||||
security: {
|
||||
title: "Aanbevolen beveiligingsinstellingen",
|
||||
description:
|
||||
"Voor extra beveiliging, configureer deze instellingen via @BotFather.",
|
||||
"disable-groups": "— Voorkom het toevoegen van bots aan groepen",
|
||||
"disable-inline":
|
||||
"— Voorkom dat de bot wordt gebruikt in inline zoekopdrachten",
|
||||
"obscure-username":
|
||||
"Gebruik een bot-username dat niet direct herkenbaar is, om de vindbaarheid te verminderen.",
|
||||
},
|
||||
"toast-enter-token": "Voer alstublieft een bot-token in.",
|
||||
"toast-connect-failed": "Verbinding met de bot is mislukt.",
|
||||
},
|
||||
connected: {
|
||||
status: "Verbonden",
|
||||
"status-disconnected":
|
||||
"Niet verbonden – het token kan verlopen zijn of ongeldig",
|
||||
"placeholder-token": "Plak het nieuwe bot-token...",
|
||||
reconnect: "Herstellen van de verbinding",
|
||||
workspace: "Werkplek",
|
||||
"bot-link": "Bot-link",
|
||||
"voice-response": "Spraakherkenning",
|
||||
disconnecting: "Verbinding verbreken...",
|
||||
disconnect: "Aansluiting verbreiden",
|
||||
"voice-text-only": "Alleen tekst",
|
||||
"voice-mirror":
|
||||
"Spiegel (antwoord met spraak wanneer de gebruiker spraak verzendt)",
|
||||
"voice-always":
|
||||
"Zorg ervoor dat er altijd een audio-opname (een geluidsfragment) bij de reactie wordt toegevoegd.",
|
||||
"toast-disconnect-failed":
|
||||
"Het was niet mogelijk om de robot los te koppelen.",
|
||||
"toast-reconnect-failed": "Fout bij het opnieuw verbinden van de bot.",
|
||||
"toast-voice-failed": "Niet mogelijk om de spraakmodus bij te werken.",
|
||||
"toast-approve-failed": "Fout bij goedkeuren van gebruiker.",
|
||||
"toast-deny-failed": "Niet in staat om gebruiker te weigeren.",
|
||||
"toast-revoke-failed":
|
||||
"Fout bij het intrekken van het gebruikersaccount.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Afhankelijk van goedkeuring",
|
||||
"pending-description":
|
||||
"Gebruikers die nog geverifieerd moeten worden. Vergelijk de code die hier wordt getoond met de code die in hun Telegram-chat wordt weergegeven.",
|
||||
"approved-title": "Goedgekeurde gebruikers",
|
||||
"approved-description":
|
||||
"Gebruikers die zijn goedgekeurd om met uw bot te communiceren.",
|
||||
user: "Gebruiker",
|
||||
"pairing-code": "Code voor het koppelen",
|
||||
"no-pending": "Er zijn geen lopende verzoeken.",
|
||||
"no-approved": "Geen goedgekeurde gebruikers",
|
||||
unknown: "Onbekend",
|
||||
approve: "Goedkeuren",
|
||||
deny: "Afgewijzen",
|
||||
revoke: "Intrekken",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Witamy w",
|
||||
getStarted: "Rozpocznij",
|
||||
welcome: "Witaj",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferencje modeli językowych",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Nazwa obszaru roboczego",
|
||||
user: "Użytkownik",
|
||||
selection: "Wybór modelu",
|
||||
saving: "Zapisywanie...",
|
||||
save: "Zapisz zmiany",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Wyszukaj",
|
||||
username_requirements:
|
||||
"Nazwa użytkownika musi mieć od 2 do 32 znaków, zaczynać się małą literą i zawierać tylko małe litery, cyfry, podkreślenia, myślniki i kropki.",
|
||||
on: "Na",
|
||||
none: "Brak",
|
||||
stopped: "Zatrzymano",
|
||||
loading: "Ładowanie",
|
||||
refresh: "Odświeżyć",
|
||||
},
|
||||
settings: {
|
||||
title: "Ustawienia instancji",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Twój profil",
|
||||
"import-item": "Importuj element",
|
||||
},
|
||||
channels: "Kanały",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -183,16 +191,18 @@ const TRANSLATIONS = {
|
||||
title: "Tryb czatu",
|
||||
chat: {
|
||||
title: "Czat",
|
||||
"desc-start": "dostarczy odpowiedzi na podstawie wiedzy ogólnej LLM",
|
||||
and: "oraz",
|
||||
"desc-end": " znalezionym kontekście (dokumenty, źródła danych)",
|
||||
description:
|
||||
"zapewni odpowiedzi oparte na ogólnym zasobie wiedzy LLM i kontekście dokumentu, który zostanie znaleziony. <br />Będziesz musiał użyć polecenia `@agent`, aby korzystać z narzędzi.",
|
||||
},
|
||||
query: {
|
||||
title: "Zapytanie (wyszukiwanie)",
|
||||
"desc-start": "dostarczy odpowiedzi",
|
||||
only: "tylko",
|
||||
"desc-end":
|
||||
"na podstawie znalezionego kontekstu (dokumenty, źródła danych) - w przeciwnym razie odmówi odpowiedzi.",
|
||||
description:
|
||||
"będzie dostarczać odpowiedzi <b>tylko</b>, jeśli zostanie zidentyfikowany kontekst dokumentu.<br />Będziesz musiał użyć komendy @agent, aby korzystać z narzędzi.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Samochód",
|
||||
description:
|
||||
"automatycznie będzie korzystać z narzędzi, jeśli model i dostawca obsługują natywne wywoływanie narzędzi. <br />Jeśli natywne wywoływanie narzędzi nie jest obsługiwane, konieczne będzie użycie komendy `@agent` w celu korzystania z narzędzi.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -305,11 +315,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Pozwól domyślnemu agentowi generować różne typy wykresów na podstawie danych dostarczonych lub podanych na czacie.",
|
||||
},
|
||||
save: {
|
||||
title: "Generowanie i zapisywanie plików w przeglądarce",
|
||||
description:
|
||||
"Pozwól domyślnemu agentowi generować i zapisywać pliki, które można zapisać i pobrać w przeglądarce.",
|
||||
},
|
||||
web: {
|
||||
title: "Wyszukiwanie i przeglądanie stron internetowych na żywo",
|
||||
description:
|
||||
@@ -322,6 +327,142 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Domyślnie, ta umiejętność jest włączona, ale można ją wyłączyć, jeśli nie chcemy, aby była dostępna dla agenta.",
|
||||
filesystem: {
|
||||
title: "Dostęp do systemu plików",
|
||||
description:
|
||||
"Pozwól swoim agentom na odczytywanie, zapisywanie, wyszukiwanie i zarządzanie plikami w określonym katalogu. Obsługuje edycję plików, nawigację po katalogach oraz wyszukiwanie zawartości.",
|
||||
learnMore:
|
||||
"Dowiedz się więcej na temat tego, jak wykorzystać tę umiejętność.",
|
||||
configuration: "Konfiguracja",
|
||||
readActions: "Czytać akcje",
|
||||
writeActions: "Działania",
|
||||
warning:
|
||||
"Dostęp do systemu plików może być niebezpieczny, ponieważ może modyfikować lub usuwać pliki. Prosimy o zapoznanie się z dokumentacją <link> przed włączeniem tej funkcji.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Otwórz plik",
|
||||
description:
|
||||
"Otwórz i przeczytaj zawartość plików (tekst, kod, pliki PDF, obrazy itp.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Odczytaj wiele plików",
|
||||
description: "Otwórz i przetwórz wiele plików jednocześnie.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Lista kontaktów",
|
||||
description: "Wyświetl pliki i katalogi w określonym folderze.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Wyszukaj pliki",
|
||||
description: "Wyszukaj pliki według nazwy lub zawartości",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Pobierz informacje o pliku",
|
||||
description: "Uzyskaj szczegółowe metadane dotyczące plików.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Edytuj plik",
|
||||
description:
|
||||
"Wprowadzaj zmiany w plikach tekstowych, działając w oparciu o linie.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Utwórz katalog",
|
||||
description: "Utwórz nowe katalogi",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Przenieś/Przekształć nazwę pliku",
|
||||
description: "Przenieś lub zmień nazwę plików i katalogów",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Skopiuj plik",
|
||||
description: "Kopiuj pliki i katalogi",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Utwórz plik tekstowy",
|
||||
description:
|
||||
"Utwórz nowe pliki tekstowe lub nadpisz istniejące pliki tekstowe.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Tworzenie dokumentów",
|
||||
description:
|
||||
"Pozwól swojemu agentowi tworzyć pliki w formatach binarnych, takich jak prezentacje PowerPoint, arkusze kalkulacyjne Excel, dokumenty Word i pliki PDF. Pliki można pobrać bezpośrednio z okna czatu.",
|
||||
configuration: "Dostępne typy dokumentów",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Pliki tekstowe",
|
||||
description:
|
||||
"Utwórz pliki tekstowe z dowolnym zawartością i rozszerzeniem (np. .txt, .md, .json, .csv).",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Prezentacje w formacie PowerPoint",
|
||||
description:
|
||||
"Stwórz nowe prezentacje w formacie PowerPoint, zawierające slajdy, nagłówki i punkty.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Dokumenty w formacie PDF",
|
||||
description:
|
||||
"Tworzenie dokumentów PDF z plików w formacie Markdown lub zwykłego tekstu, z podstawowymi możliwościami stylizacji.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Arkusze kalkulacyjne w programie Excel",
|
||||
description:
|
||||
"Stwórz arkusze kalkulacyjne w programie Excel, zawierające dane w formie tabel, z różnymi arkuszami i stylami.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Dokumenty w formacie Word",
|
||||
description:
|
||||
"Stwórz dokumenty Word z podstawowymi stylami i formatowaniem.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Serwery MCP",
|
||||
"loading-from-config": "Ładowanie serwerów MCP z pliku konfiguracyjnego",
|
||||
"learn-more": "Dowiedz się więcej o serwerach MCP.",
|
||||
"no-servers-found": "Nie znaleziono serwerów MCP.",
|
||||
"tool-warning":
|
||||
"Aby uzyskać najlepsze wyniki, rozważ wyłączenie niepotrzebnych narzędzi, aby zminimalizować zakłócenia.",
|
||||
"stop-server": "Zatrzymaj serwer MCP",
|
||||
"start-server": "Uruchom serwer MCP",
|
||||
"delete-server": "Usuń serwer MCP",
|
||||
"tool-count-warning":
|
||||
"Ten serwer MCP ma włączone <b> narzędzia, które będą zużywać kontekst w każdej rozmowie.</b> Rozważ wyłączenie niepotrzebnych narzędzi, aby oszczędzać kontekst.",
|
||||
"startup-command": "Polecenie uruchamiające",
|
||||
command: "Rozkaz",
|
||||
arguments: "Argumenty",
|
||||
"not-running-warning":
|
||||
"Ten serwer MCP nie działa – może być zatrzymany lub może występować w nim błąd podczas uruchamiania.",
|
||||
"tool-call-arguments": "Argumenty wywoływania funkcji",
|
||||
"tools-enabled": "narzędzia są aktywne",
|
||||
},
|
||||
settings: {
|
||||
title: "Ustawienia umiejętności agenta",
|
||||
"max-tool-calls": {
|
||||
title: "Maksymalna liczba żądań narzędzi na odpowiedź",
|
||||
description:
|
||||
"Maksymalna liczba narzędzi, które agent może łączyć, aby wygenerować pojedynczą odpowiedź. Zapobiega to niekontrolowanemu wywoływaniu narzędzi i tworzeniu nieskończonych pętli.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Inteligentny wybór umiejętności",
|
||||
"beta-badge": "Wersja beta",
|
||||
description:
|
||||
"Umożliwia korzystanie z nieograniczonej liczby narzędzi oraz redukcję zużycia tokenów o do 80% na każde zapytanie – EverythingLLM automatycznie wybiera odpowiednie umiejętności dla każdego zapytania.",
|
||||
"max-tools": {
|
||||
title: "Narzędzia Max",
|
||||
description:
|
||||
"Maksymalna liczba narzędzi, które można wybrać dla każdego zapytania. Zalecamy ustawienie tej wartości na wyższe poziomy dla modeli o większym kontekście.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Połączenie z bazą danych SQL",
|
||||
description:
|
||||
"Umożliw agentowi korzystanie z języka SQL, aby odpowiadał na Twoje pytania, poprzez połączenie z różnymi dostawcami baz danych SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Domyślnie, ta umiejętność jest włączona, ale można ją wyłączyć, jeśli nie chcemy, aby była dostępna dla agenta.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -700,7 +841,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Wybierz wszystko",
|
||||
deselect_all: "Odznacz wszystko",
|
||||
remove_selected: "Usuń wybrane",
|
||||
costs: "*Jednorazowy koszt dodania danych",
|
||||
save_embed: "Zapisz",
|
||||
"total-documents_one": "{{count}} dokument",
|
||||
"total-documents_other": "{{count}} dokumenty",
|
||||
@@ -791,7 +931,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Zobacz mniej",
|
||||
see_more: "Zobacz więcej",
|
||||
tools: "Narzędzia",
|
||||
browse: "Przeglądaj",
|
||||
text_size_label: "Rozmiar czcionki",
|
||||
select_model: "Wybierz model",
|
||||
sources: "Źródła",
|
||||
@@ -804,7 +943,6 @@ const TRANSLATIONS = {
|
||||
edit: "Edytuj",
|
||||
publish: "Opublikować",
|
||||
stop_generating: "Przestań generować odpowiedź",
|
||||
pause_tts_speech_message: "Wstrzymać odtwarzanie mowy z wiadomości",
|
||||
slash_commands: "Polecenia skrótowe",
|
||||
agent_skills: "Umiejętności agenta",
|
||||
manage_agent_skills: "Zarządzanie umiejętnościami agentów",
|
||||
@@ -813,6 +951,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Rozpocznij sesję dla agenta",
|
||||
use_agent_session_to_use_tools:
|
||||
"Możesz korzystać z narzędzi w czacie, inicjując sesję z agentem, wpisując '@agent' na początku swojego zapytania.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Model chce zadzwonić",
|
||||
approve: "Zaakceptować",
|
||||
reject: "Odrzucić",
|
||||
always_allow: "Zawsze należy uwzględnić {{skillName}}",
|
||||
tool_call_was_approved:
|
||||
"Zgłoszenie dotyczące narzędzia zostało zatwierdzone.",
|
||||
tool_call_was_rejected: "Żądanie użycia narzędzia zostało odrzucone.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Edytuj konto",
|
||||
@@ -970,6 +1117,87 @@ const TRANSLATIONS = {
|
||||
"Nie jesteś przypisany do żadnego obszaru roboczego.\nSkontaktuj się z administratorem, aby poprosić o dostęp do obszaru roboczego.",
|
||||
goToWorkspace: 'Przejdź do obszaru roboczego "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot na Telegramie",
|
||||
description:
|
||||
"Połącz swoją instancję AnythingLLM z Telegramem, aby móc rozmawiać z przestrzeniami roboczymi z dowolnego urządzenia.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Krok 1: Utwórz swojego bota w Telegramie",
|
||||
description:
|
||||
"Otwórz aplikację @BotFather w Telegramie, wyślij wiadomość <code>/newbot</code> do <code>@BotFather</code>, postępuj zgodnie z instrukcjami i skopiuj token API.",
|
||||
"open-botfather": "Otwórz BotFather",
|
||||
"instruction-1": "1. Otwórz link lub zeskanuj kod QR",
|
||||
"instruction-2":
|
||||
"2. Wyślij <code>/newbot</code> na adres <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Wybierz nazwę i nazwę użytkownika dla swojego robota.",
|
||||
"instruction-4": "4. Skopiuj token API, który otrzymasz.",
|
||||
},
|
||||
step2: {
|
||||
title: "Krok 2: Połącz swojego robota",
|
||||
description:
|
||||
"Wklej token API, który otrzymałeś od @BotFather, i wybierz domyślny przestrzeń roboczą, z której Twój bot będzie mógł komunikować się.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Domyślne miejsce pracy",
|
||||
"no-workspace":
|
||||
"Brak dostępnych miejsc pracy. Nowe zostanie utworzone.",
|
||||
connecting: "Połączenie...",
|
||||
"connect-bot": "Bot łączący",
|
||||
},
|
||||
security: {
|
||||
title: "Zalecane ustawienia bezpieczeństwa",
|
||||
description:
|
||||
"W celu zwiększenia bezpieczeństwa, skonfiguruj te ustawienia w kanale @BotFather.",
|
||||
"disable-groups": "— Zapobiegaj dodawaniu botów do grup",
|
||||
"disable-inline":
|
||||
"— Zapobieg użyciu robota w wyszukiwaniach w czasie rzeczywistym.",
|
||||
"obscure-username":
|
||||
"Użyj nietypowej nazwy użytkownika dla bota, aby zmniejszyć jego widoczność.",
|
||||
},
|
||||
"toast-enter-token": "Prosimy o wprowadzenie tokena dla bota.",
|
||||
"toast-connect-failed": "Nie udało się nawiązać połączenia z botem.",
|
||||
},
|
||||
connected: {
|
||||
status: "Połączony",
|
||||
"status-disconnected":
|
||||
"Brak połączenia – token może być nieprawidłowy lub wygasł",
|
||||
"placeholder-token": "Wklej nowy token dla bota...",
|
||||
reconnect: "Ponowne połączenie",
|
||||
workspace: "Przestrzeń robocza",
|
||||
"bot-link": "Link do bota",
|
||||
"voice-response": "Reakcja na głos",
|
||||
disconnecting: "Odłączanie...",
|
||||
disconnect: "Odłączyć",
|
||||
"voice-text-only": "Tylko tekst",
|
||||
"voice-mirror":
|
||||
"Odbiór (odpowiedź za pomocą głosu, gdy użytkownik wysyła głos)",
|
||||
"voice-always":
|
||||
"Zawsze dołączaj nagranie (wysyłaj dźwięk wraz z każdą odpowiedzią)",
|
||||
"toast-disconnect-failed": "Nie udało się odłączyć bota.",
|
||||
"toast-reconnect-failed": "Nie udało się nawiązać połączenia z botem.",
|
||||
"toast-voice-failed": "Nie udało się zaktualizować trybu głosu.",
|
||||
"toast-approve-failed": "Nie udało się zatwierdzić użytkownika.",
|
||||
"toast-deny-failed": "Nie udało się odrzucić żądania użytkownika.",
|
||||
"toast-revoke-failed": "Nie udało się odwołać konta użytkownika.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Czekając na zatwierdzenie",
|
||||
"pending-description":
|
||||
"Użytkownicy, którzy czekają na weryfikację. Dopasuj kod parowania, który znajduje się tutaj, z tym, który widnieje w ich rozmowie na Telegramie.",
|
||||
"approved-title": "Użytkownicy, którym przyznano uprawnienia",
|
||||
"approved-description":
|
||||
"Użytkownicy, którzy zostali zatwierdzeni do rozmowy z Twoim botem.",
|
||||
user: "Użytkownik",
|
||||
"pairing-code": "Kod dopasowania",
|
||||
"no-pending": "Brak oczekujących żądań",
|
||||
"no-approved": "Brak zatwierdzonych użytkowników",
|
||||
unknown: "Nieznany",
|
||||
approve: "Zaakceptować",
|
||||
deny: "Odrzucać",
|
||||
revoke: "Odstrzegać",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Bem-vindo ao",
|
||||
getStarted: "Começar",
|
||||
welcome: "Bem-vindo",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferência de LLM",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Nome do Workspace",
|
||||
user: "Usuário",
|
||||
selection: "Seleção de Modelo",
|
||||
saving: "Salvando...",
|
||||
save: "Salvar alterações",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "Pesquisar",
|
||||
username_requirements:
|
||||
"O nome de usuário deve ter de 2 a 32 caracteres, começar com uma letra minúscula e conter apenas letras minúsculas, números, sublinhados, hífens e pontos.",
|
||||
on: "Sobre",
|
||||
none: "Nenhum",
|
||||
stopped: "Parado",
|
||||
loading: "Carregando",
|
||||
refresh: "Atualizar",
|
||||
},
|
||||
settings: {
|
||||
title: "Configurações da Instância",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Sua Conta",
|
||||
"import-item": "Importar Item",
|
||||
},
|
||||
channels: "Canais",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -183,15 +191,18 @@ const TRANSLATIONS = {
|
||||
title: "Modo de Chat",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start": "fornecerá respostas com conhecimento geral do LLM",
|
||||
and: "e",
|
||||
"desc-end": "contexto dos documentos encontrados.",
|
||||
description:
|
||||
'fornecerá respostas com base no conhecimento geral do LLM e no contexto do documento encontrado.<br />Você precisará usar o comando "@agent" para utilizar as ferramentas.',
|
||||
},
|
||||
query: {
|
||||
title: "Consulta",
|
||||
"desc-start": "fornecerá respostas",
|
||||
only: "apenas",
|
||||
"desc-end": "se contexto for encontrado nos documentos.",
|
||||
description:
|
||||
"fornecerá respostas <b>apenas</b>, caso o contexto do documento seja encontrado.<br />Você precisará usar o comando @agent para utilizar as ferramentas.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Automóvel",
|
||||
description:
|
||||
'usará automaticamente as ferramentas, caso o modelo e o provedor suportem a chamada de ferramentas nativas.<br />Se a chamada de ferramentas nativas não for suportada, você precisará usar o comando "@agent" para utilizar as ferramentas.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -303,10 +314,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Permite ao agente padrão gerar diversos tipos de gráficos a partir de dados armazenados ou informados no chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Gerar & salvar arquivos",
|
||||
description: "Permite ao agente gerar e salvar arquivos no navegador.",
|
||||
},
|
||||
web: {
|
||||
title: "Busca na web",
|
||||
description:
|
||||
@@ -319,6 +326,142 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Por padrão, essa habilidade está ativada, mas você pode desativá-la se não quiser que ela esteja disponível para o agente.",
|
||||
filesystem: {
|
||||
title: "Acesso ao Sistema de Arquivos",
|
||||
description:
|
||||
"Permita que seu agente leia, grave, procure e gerencie arquivos dentro de um diretório específico. Suporta a edição de arquivos, a navegação em diretórios e a pesquisa de conteúdo.",
|
||||
learnMore: "Saiba mais sobre como utilizar esta habilidade.",
|
||||
configuration: "Configuração",
|
||||
readActions: "Ler ações",
|
||||
writeActions: "Ações a serem executadas",
|
||||
warning:
|
||||
"O acesso ao sistema de arquivos pode ser perigoso, pois pode modificar ou excluir arquivos. Por favor, consulte a <link>documentação</link> antes de habilitar.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Abrir arquivo",
|
||||
description:
|
||||
"Ler o conteúdo de arquivos (texto, código, PDF, imagens, etc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Ler Vários Arquivos",
|
||||
description: "Leia vários arquivos simultaneamente.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Lista de diretórios",
|
||||
description: "Liste os arquivos e diretórios em uma pasta.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Pesquisar arquivos",
|
||||
description: "Pesquise arquivos por nome ou conteúdo.",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Obter informações do arquivo",
|
||||
description: "Obtenha metadados detalhados sobre os arquivos.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Editar arquivo",
|
||||
description:
|
||||
"Realize edições baseadas em linhas em arquivos de texto.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Criar Diretório",
|
||||
description: "Criar novas pastas/diretórios",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Mover/Renomear arquivo",
|
||||
description: "Mova ou renomeie arquivos e diretórios.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copiar arquivo",
|
||||
description: "Copie arquivos e diretórios",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Criar um arquivo de texto",
|
||||
description:
|
||||
"Crie novos arquivos de texto ou sobrescreva arquivos de texto existentes.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Criação de documentos",
|
||||
description:
|
||||
"Permita que seu agente crie formatos de documentos binários, como apresentações do PowerPoint, planilhas do Excel, documentos do Word e arquivos PDF. Os arquivos podem ser baixados diretamente da janela de chat.",
|
||||
configuration: "Tipos de documentos disponíveis",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Arquivos de texto",
|
||||
description:
|
||||
"Crie arquivos de texto com qualquer conteúdo e extensão (por exemplo, .txt, .md, .json, .csv, etc.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Apresentações em PowerPoint",
|
||||
description:
|
||||
"Crie novas apresentações do PowerPoint com slides, títulos e marcadores.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Documentos em formato PDF",
|
||||
description:
|
||||
"Crie documentos em PDF a partir de arquivos Markdown ou texto simples, com formatação básica.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Planilhas do Excel",
|
||||
description:
|
||||
"Crie documentos do Excel para dados tabulares, incluindo planilhas e estilos.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Documentos do tipo Word",
|
||||
description:
|
||||
"Crie documentos do Word com formatação e estilo básicos.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servidores MCP",
|
||||
"loading-from-config":
|
||||
"Carregar servidores MCP a partir do arquivo de configuração",
|
||||
"learn-more": "Saiba mais sobre os servidores MCP.",
|
||||
"no-servers-found": "Nenhum servidor MCP encontrado.",
|
||||
"tool-warning":
|
||||
"Para obter o melhor desempenho, considere desativar as ferramentas desnecessárias para preservar o contexto.",
|
||||
"stop-server": "Pare o servidor MCP",
|
||||
"start-server": "Iniciar o servidor MCP",
|
||||
"delete-server": "Excluir o servidor MCP",
|
||||
"tool-count-warning":
|
||||
"Este servidor MCP tem as seguintes ferramentas habilitadas: {{count}}, que consumirão contexto em cada conversa.</b> Considere desativar as ferramentas indesejadas para economizar contexto.",
|
||||
"startup-command": "Comando de inicialização",
|
||||
command: "Ordem",
|
||||
arguments: "Argumentos",
|
||||
"not-running-warning":
|
||||
"Este servidor MCP não está em funcionamento – pode estar parado ou estar apresentando um erro durante a inicialização.",
|
||||
"tool-call-arguments": "Argumentos de chamada de ferramenta",
|
||||
"tools-enabled": "ferramentas ativadas",
|
||||
},
|
||||
settings: {
|
||||
title: "Configurações de Habilidades do Agente",
|
||||
"max-tool-calls": {
|
||||
title: "Número máximo de chamadas de ferramenta por resposta",
|
||||
description:
|
||||
"O número máximo de ferramentas que um agente pode encadear para gerar uma única resposta. Isso evita chamadas excessivas de ferramentas e loops infinitos.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Seleção Inteligente de Habilidades",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
"Permita o uso ilimitado de ferramentas e reduza o consumo de tokens em até 80% por consulta — O AnythingLLM seleciona automaticamente as habilidades mais adequadas para cada solicitação.",
|
||||
"max-tools": {
|
||||
title: "Ferramentas Max",
|
||||
description:
|
||||
"O número máximo de ferramentas que podem ser selecionadas para cada consulta. Recomendamos definir este valor para modelos com contextos maiores.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Conector SQL",
|
||||
description:
|
||||
"Permita que seu agente utilize o SQL para responder às suas perguntas, conectando-se a diversos provedores de bancos de dados SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Por padrão, essa habilidade está ativada, mas você pode desativá-la se não quiser que ela esteja disponível para o agente.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -683,7 +826,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Selecionar Tudo",
|
||||
deselect_all: "Desmarcar Tudo",
|
||||
remove_selected: "Remover Selecionados",
|
||||
costs: "*Custo único para vínculos",
|
||||
save_embed: "Salvar e Inserir",
|
||||
"total-documents_one": "{{count}} documento",
|
||||
"total-documents_other": "{{count}} documentos",
|
||||
@@ -773,7 +915,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Ver menos",
|
||||
see_more: "Ver mais",
|
||||
tools: "Ferramentas",
|
||||
browse: "Navegar",
|
||||
text_size_label: "Tamanho do texto",
|
||||
select_model: "Selecione o modelo",
|
||||
sources: "Fontes",
|
||||
@@ -786,7 +927,6 @@ const TRANSLATIONS = {
|
||||
edit: "Editar",
|
||||
publish: "Publicar",
|
||||
stop_generating: "Pare de gerar respostas",
|
||||
pause_tts_speech_message: "Pausar a leitura de voz da mensagem",
|
||||
slash_commands: "Comandos Rápidos",
|
||||
agent_skills: "Habilidades do Agente",
|
||||
manage_agent_skills: "Gerenciar as habilidades dos agentes",
|
||||
@@ -795,6 +935,16 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Iniciar Sessão de Agente",
|
||||
use_agent_session_to_use_tools:
|
||||
'Você pode utilizar as ferramentas disponíveis no chat iniciando uma sessão com um agente, adicionando "@agent" no início da sua mensagem.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "O modelo deseja fazer uma ligação.",
|
||||
approve: "Aprovar",
|
||||
reject: "Rejeitar",
|
||||
always_allow:
|
||||
"Certifique-se sempre de que {{skillName}} esteja disponível.",
|
||||
tool_call_was_approved: "A solicitação de ferramentas foi aprovada.",
|
||||
tool_call_was_rejected:
|
||||
"A solicitação de acesso à ferramenta foi rejeitada.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Editar conta",
|
||||
@@ -944,6 +1094,86 @@ const TRANSLATIONS = {
|
||||
"Você ainda não está atribuído a nenhum espaço de trabalho.\nEntre em contato com seu administrador para solicitar acesso a um espaço de trabalho.",
|
||||
goToWorkspace: 'Ir para o espaço de trabalho "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot do Telegram",
|
||||
description:
|
||||
"Conecte sua instância do AnythingLLM ao Telegram para que possa conversar com seus espaços de trabalho a partir de qualquer dispositivo.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Passo 1: Crie seu bot do Telegram",
|
||||
description:
|
||||
"Abra o @BotFather no Telegram, envie /newbot</code> para <code>@BotFather</code>, siga as instruções e copie o token da API.",
|
||||
"open-botfather": "Iniciar o BotFather",
|
||||
"instruction-1": "1. Abra o link ou escaneie o código QR.",
|
||||
"instruction-2":
|
||||
"2. Envie <code>/newbot</code> para <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Escolha um nome e um nome de usuário para o seu bot.",
|
||||
"instruction-4": "4. Copie o token da API que você receber.",
|
||||
},
|
||||
step2: {
|
||||
title: "Passo 2: Conecte seu bot",
|
||||
description:
|
||||
"Cole o token da API que recebeu do @BotFather e selecione um espaço de trabalho padrão para que seu bot possa conversar.",
|
||||
"bot-token": "Token do Bot",
|
||||
"default-workspace": "Espaço de Trabalho Padrão",
|
||||
"no-workspace":
|
||||
"Não há espaços de trabalho disponíveis. Um novo será criado.",
|
||||
connecting: "Conectando...",
|
||||
"connect-bot": "Bot de Conexão",
|
||||
},
|
||||
security: {
|
||||
title: "Configurações de segurança recomendadas",
|
||||
description:
|
||||
"Para maior segurança, configure estas opções no @BotFather.",
|
||||
"disable-groups": "— Impedir a adição de bots a grupos",
|
||||
"disable-inline": "— Impedir que o bot seja usado na pesquisa inline.",
|
||||
"obscure-username":
|
||||
"Utilize um nome de usuário de bot menos óbvio para reduzir a sua visibilidade.",
|
||||
},
|
||||
"toast-enter-token": "Por favor, insira um token de bot.",
|
||||
"toast-connect-failed": "Falhou a conexão com o bot.",
|
||||
},
|
||||
connected: {
|
||||
status: "Conectado",
|
||||
"status-disconnected":
|
||||
"Desconectado — o token pode ter expirado ou ser inválido",
|
||||
"placeholder-token": "Cole o novo token do bot...",
|
||||
reconnect: "Reconectar",
|
||||
workspace: "Espaço de trabalho",
|
||||
"bot-link": "Link do bot",
|
||||
"voice-response": "Resposta por voz",
|
||||
disconnecting: "Desconectando...",
|
||||
disconnect: "Desconectar",
|
||||
"voice-text-only": "Apenas texto",
|
||||
"voice-mirror":
|
||||
"Espelho (responder com voz quando o usuário enviar uma mensagem de voz)",
|
||||
"voice-always":
|
||||
"Sempre inclua uma gravação de áudio (envie um áudio com cada resposta).",
|
||||
"toast-disconnect-failed": "Falhou ao desconectar o bot.",
|
||||
"toast-reconnect-failed": "Falha ao tentar reconectar o bot.",
|
||||
"toast-voice-failed": "Falhou ao atualizar o modo de voz.",
|
||||
"toast-approve-failed": "Falhou ao aprovar o usuário.",
|
||||
"toast-deny-failed": "Não foi possível negar o acesso ao usuário.",
|
||||
"toast-revoke-failed": "Falhou ao revogar o acesso do usuário.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Aguardando Aprovação",
|
||||
"pending-description":
|
||||
"Usuários aguardando a verificação. Compare o código de pareamento exibido aqui com o que aparece em seu chat do Telegram.",
|
||||
"approved-title": "Usuários Aprovados",
|
||||
"approved-description":
|
||||
"Usuários que foram aprovados para conversar com o seu bot.",
|
||||
user: "Usuário",
|
||||
"pairing-code": "Código de emparelhamento",
|
||||
"no-pending": "Não há solicitações pendentes.",
|
||||
"no-approved": "Sem usuários autorizados",
|
||||
unknown: "Desconhecido",
|
||||
approve: "Aprovar",
|
||||
deny: "Negar",
|
||||
revoke: "Anular",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -37,6 +37,7 @@ import Lativian from "./lv/common.js";
|
||||
import Polish from "./pl/common.js";
|
||||
import Romanian from "./ro/common.js";
|
||||
import Czech from "./cs/common.js";
|
||||
import Lithuanian from "./lt/common.js";
|
||||
|
||||
export const defaultNS = "common";
|
||||
export const resources = {
|
||||
@@ -109,4 +110,7 @@ export const resources = {
|
||||
cs: {
|
||||
common: Czech,
|
||||
},
|
||||
lt: {
|
||||
common: Lithuanian,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Bine ai venit la",
|
||||
getStarted: "Începe",
|
||||
welcome: "Bine ați venit",
|
||||
},
|
||||
llm: {
|
||||
title: "Preferința LLM",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Numele spațiilor de lucru",
|
||||
user: "Utilizator",
|
||||
selection: "Selecția modelului",
|
||||
saving: "Se salvează...",
|
||||
save: "Salvează modificările",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Caută",
|
||||
username_requirements:
|
||||
"Numele de utilizator trebuie să aibă între 2 și 32 de caractere, să înceapă cu o literă mică și să conțină doar litere mici, cifre, liniuțe de subliniere, cratime și puncte.",
|
||||
on: "În",
|
||||
none: "Niciunul",
|
||||
stopped: "Oprit",
|
||||
loading: "Încărcare",
|
||||
refresh: "Reîmprospătează",
|
||||
},
|
||||
settings: {
|
||||
title: "Setările instanței",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Contul dumneavoastră",
|
||||
"import-item": "Importați articolul",
|
||||
},
|
||||
channels: "Canale",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -185,16 +193,18 @@ const TRANSLATIONS = {
|
||||
title: "Mod chat",
|
||||
chat: {
|
||||
title: "Chat",
|
||||
"desc-start":
|
||||
"oferă răspunsuri bazate pe cunoștințele generale ale LLM-ului",
|
||||
and: "și",
|
||||
"desc-end": "context document care este găsit.",
|
||||
description:
|
||||
'va oferi răspunsuri folosind cunoștințele generale ale LLM și contextul documentului, așa cum este disponibil.<br />Va trebui să utilizați comanda "@agent" pentru a utiliza instrumentele.',
|
||||
},
|
||||
query: {
|
||||
title: "Interogare",
|
||||
"desc-start": "oferă răspunsuri",
|
||||
only: "doar",
|
||||
"desc-end": "dacă contextul documentului este găsit.",
|
||||
description:
|
||||
"vor oferi răspunsuri doar dacă contextul documentului este identificat.<b>Veți avea nevoie să utilizați comanda @agent pentru a utiliza instrumentele.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Mașină",
|
||||
description:
|
||||
'va utiliza automat instrumentele, dacă modelul și furnizorul suportă apelarea nativă a instrumentelor.<br />Dacă apelarea nativă a instrumentelor nu este suportată, veți avea nevoie să utilizați comanda "@agent" pentru a utiliza instrumentele.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -446,7 +456,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Selectează tot",
|
||||
deselect_all: "Deselectează tot",
|
||||
remove_selected: "Elimină selectate",
|
||||
costs: "*Cost unic pentru embeddings",
|
||||
save_embed: "Salvează și încorporează",
|
||||
"total-documents_one": "{{count}}",
|
||||
"total-documents_other": "{{count}} documente",
|
||||
@@ -539,7 +548,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Vezi mai puțin",
|
||||
see_more: "Vezi mai multe",
|
||||
tools: "Unelte",
|
||||
browse: "Navigați",
|
||||
text_size_label: "Dimensiunea textului",
|
||||
select_model: "Selectați modelul",
|
||||
sources: "Surse",
|
||||
@@ -552,8 +560,6 @@ const TRANSLATIONS = {
|
||||
edit: "Editează",
|
||||
publish: "Publica",
|
||||
stop_generating: "Opriți generarea răspunsului",
|
||||
pause_tts_speech_message:
|
||||
"Pauză în redarea vocii prin Text-to-Speech (TTS) a mesajului.",
|
||||
slash_commands: "Comenzi scurte",
|
||||
agent_skills: "Abilități ale agentului",
|
||||
manage_agent_skills: "Gestionarea competențelor agenților",
|
||||
@@ -562,6 +568,15 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Începe sesiunea de agent",
|
||||
use_agent_session_to_use_tools:
|
||||
'Puteți utiliza instrumentele disponibile în chat, inițiind o sesiune cu un agent, începând mesajul cu "@agent".',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Persoana respectivă dorește să facă o telefonare.",
|
||||
approve: "Aprobă",
|
||||
reject: "Refuz",
|
||||
always_allow: "Asigurați-vă întotdeauna că {{skillName}}",
|
||||
tool_call_was_approved: "Cererea de achiziție a fost aprobată.",
|
||||
tool_call_was_rejected:
|
||||
"Cererea de utilizare a instrumentului a fost respinsă.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Editează contul",
|
||||
@@ -750,11 +765,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Permite agentului implicit să genereze diverse tipuri de grafice din datele furnizate sau date în chat.",
|
||||
},
|
||||
save: {
|
||||
title: "Generează & salvează fișiere în browser",
|
||||
description:
|
||||
"Permite agentului implicit să genereze și să scrie fișiere care se salvează și pot fi descărcate în browserul tău.",
|
||||
},
|
||||
web: {
|
||||
title: "Căutare și navigare web live",
|
||||
description:
|
||||
@@ -767,6 +777,143 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Implicit, această funcție este activată, dar puteți dezactiva-o dacă nu doriți ca agentul să o utilizeze.",
|
||||
filesystem: {
|
||||
title: "Acces la sistemul de fișiere",
|
||||
description:
|
||||
"Permite reprezentantului dumneavoastră să citească, să scrie, să caute și să gestioneze fișiere într-un director specific. Suportă editarea fișierelor, navigarea în director și căutarea conținutului.",
|
||||
learnMore:
|
||||
"Aflați mai multe despre cum să utilizați această abilitate.",
|
||||
configuration: "Configurare",
|
||||
readActions: "Cite",
|
||||
writeActions: "Acțiuni",
|
||||
warning:
|
||||
"Accesul la sistemul de fișiere poate fi periculos, deoarece poate modifica sau șterge fișiere. Vă rugăm să consultați documentația <link>înainte de a-l activa.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Citește fișierul",
|
||||
description:
|
||||
"Citează conținutul fișierelor (text, cod, PDF, imagini, etc.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Citește mai multe fișiere",
|
||||
description: "Citiți mai multe fișiere simultan",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Lista de contacte",
|
||||
description: "Enumeră fișierele și directoarele dintr-un folder",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Caută fișiere",
|
||||
description: "Căutați fișiere după nume sau conținut",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Obține informații despre fișier",
|
||||
description: "Obțineți metadate detaliate despre fișiere.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Modifică fișierul",
|
||||
description: "Realizați modificări pe linii în fișierele de text.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Creați o directoare",
|
||||
description: "Creați noi directoare",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Mută/Redenumirea fișierului",
|
||||
description: "Mută sau redenumește fișierele și directoarele.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Copiază fișier",
|
||||
description: "Copiați fișiere și directoare",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Creați un fișier de text",
|
||||
description:
|
||||
"Creați fișiere de text noi sau suprascrieți fișierele de text existente.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Crearea de documente",
|
||||
description:
|
||||
"Permite-ți agentului să creeze formate de documente binare, cum ar fi prezentări PowerPoint, fișe Excel, documente Word și fișiere PDF. Fișierele pot fi descărcate direct din fereastra de chat.",
|
||||
configuration: "Tipuri de documente disponibile",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Fișiere text",
|
||||
description:
|
||||
"Creați fișiere text cu orice conținut și extensie (de exemplu, .txt, .md, .json, .csv, etc.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Prezentări PowerPoint",
|
||||
description:
|
||||
"Creați prezentări noi în PowerPoint, cu diapozitive, titluri și puncte.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Documente în format PDF",
|
||||
description:
|
||||
"Creați documente PDF din fișiere Markdown sau text simplu, cu un stil de formatare de bază.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Fișe Excel",
|
||||
description:
|
||||
"Creați fișiere Excel pentru date tabulare, cu foi și stilizare.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Fișiere în format Word",
|
||||
description:
|
||||
"Creați documente Word cu un stil și formatare de bază.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servere MCP",
|
||||
"loading-from-config":
|
||||
"Încărcarea serverelor MCP din fișierul de configurare",
|
||||
"learn-more": "Aflați mai multe despre serverele MCP.",
|
||||
"no-servers-found": "Nu au fost găsite servere MCP.",
|
||||
"tool-warning":
|
||||
"Pentru cele mai bune rezultate, luați în considerare dezactivarea instrumentelor nedorite, pentru a economisi resurse.",
|
||||
"stop-server": "Închideți serverul MCP",
|
||||
"start-server": "Pornește serverul MCP",
|
||||
"delete-server": "Șterge serverul MCP",
|
||||
"tool-count-warning":
|
||||
"Acest server MCP are activate<b> instrumentele menționate</b>, care vor consuma context în fiecare sesiune de chat.<br />Luați în considerare dezactivarea instrumentelor nedorite pentru a economisi context.",
|
||||
"startup-command": "Comanda de pornire",
|
||||
command: "Ordine",
|
||||
arguments: "Argumente",
|
||||
"not-running-warning":
|
||||
"Acest server MCP nu este în funcționare – ar putea fi oprit sau ar putea întâmpina o eroare la pornire.",
|
||||
"tool-call-arguments": "Argumente pentru apelarea unei funcții",
|
||||
"tools-enabled": "instrumentele sunt activate",
|
||||
},
|
||||
settings: {
|
||||
title: "Setări pentru abilitățile agenților",
|
||||
"max-tool-calls": {
|
||||
title:
|
||||
"Numărul maxim de solicitări de instrument (Max Tool Calls Per Response)",
|
||||
description:
|
||||
"Numărul maxim de instrumente pe care un agent le poate utiliza în mod consecutiv pentru a genera un singur răspuns. Această funcție previne apelurile inutile ale instrumentelor și buclele infinite.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Selecție inteligentă a abilităților",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
"Permite utilizarea nelimitată a instrumentelor și reduce utilizarea token-urilor cu până la 80% pentru fiecare interogare – AnythingLLM selectează automat abilitățile potrivite pentru fiecare solicitare.",
|
||||
"max-tools": {
|
||||
title: "Max Tools",
|
||||
description:
|
||||
"Numărul maxim de instrumente care pot fi selectate pentru fiecare interogare. Recomandăm stabilirea acestui parametru la valori mai mari pentru modelele cu un context mai amplu.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Conector SQL",
|
||||
description:
|
||||
"Permite-ți agentului să utilizeze SQL pentru a răspunde la întrebările tale, conectându-se la diverși furnizori de baze de date SQL.",
|
||||
},
|
||||
default_skill:
|
||||
"Implicit, această funcție este activată, dar puteți dezactiva-o dacă nu doriți ca agentul să o utilizeze.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -973,6 +1120,88 @@ const TRANSLATIONS = {
|
||||
"Momentan nu te-ai atribuit la niciun spațiu de lucru.\nContactează-ți administratorul pentru a solicita acces la un spațiu de lucru.",
|
||||
goToWorkspace: 'Mai departe la spațiul de lucru "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot pentru Telegram",
|
||||
description:
|
||||
"Conectați instanța dumneavoastră AnythingLLM cu Telegram, astfel încât să puteți interacționa cu spațiile de lucru de pe orice dispozitiv.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Pasul 1: Creați botul dumneavoastră Telegram",
|
||||
description:
|
||||
"Deschide chatul cu @BotFather pe Telegram, trimite mesajul `/newbot` către <code>@BotFather</code>, urmează instrucțiunile și copiază token-ul API.",
|
||||
"open-botfather": "Deschide aplicația BotFather",
|
||||
"instruction-1": "1. Deschideți link-ul sau scanați codul QR",
|
||||
"instruction-2":
|
||||
"2. Trimite <code>/newbot</code> către <code>@BotFather</code>",
|
||||
"instruction-3":
|
||||
"3. Alege un nume și un nume de utilizator pentru botul tău.",
|
||||
"instruction-4": "4. Copiați token-ul API pe care îl primiți.",
|
||||
},
|
||||
step2: {
|
||||
title: "Pasul 2: Conectați-vă bot-ul",
|
||||
description:
|
||||
"Lipește token-ul API pe care l-ați primit de la @BotFather și selectați un spațiu de lucru implicit pentru ca botul dumneavoastră să poată interacționa.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Spațiu de lucru implicit",
|
||||
"no-workspace":
|
||||
"Nu există spații de lucru disponibile. Va fi creat unul nou.",
|
||||
connecting: "Conectare...",
|
||||
"connect-bot": "Conectare automată",
|
||||
},
|
||||
security: {
|
||||
title: "Recomandări privind setările de securitate",
|
||||
description:
|
||||
"Pentru o securitate suplimentară, configurați aceste setări în contul @BotFather.",
|
||||
"disable-groups": "— Preveniți adăugarea de bot-uri în grupuri",
|
||||
"disable-inline":
|
||||
"— Previne utilizarea bot-urilor în căutările directe",
|
||||
"obscure-username":
|
||||
"Utilizați un nume de utilizator pentru bot, care nu este evident, pentru a reduce vizibilitatea acestuia.",
|
||||
},
|
||||
"toast-enter-token": "Vă rugăm să introduceți un token pentru bot.",
|
||||
"toast-connect-failed": "Nu a reușit să se conecteze bot-ul.",
|
||||
},
|
||||
connected: {
|
||||
status: "Conectat",
|
||||
"status-disconnected":
|
||||
"Deconectat – token-ul poate fi expirat sau invalid",
|
||||
"placeholder-token": "Creați un nou token pentru bot...",
|
||||
reconnect: "Restabilește conexiunea",
|
||||
workspace: "Spațiu de lucru",
|
||||
"bot-link": "Link către bot",
|
||||
"voice-response": "Răspuns vocal",
|
||||
disconnecting: "Deconectare...",
|
||||
disconnect: "Dezactivează",
|
||||
"voice-text-only": "Doar text",
|
||||
"voice-mirror":
|
||||
"Reflectare (răspunde cu voce atunci când utilizatorul trimite înregistrare audio)",
|
||||
"voice-always":
|
||||
"Asigurați-vă întotdeauna că includeți un mesaj audio (trimiteți înregistrarea audio împreună cu fiecare răspuns).",
|
||||
"toast-disconnect-failed": "Nu s-a reușit deconectarea bot-ului.",
|
||||
"toast-reconnect-failed": "Nu a reușit să se reconecteze.",
|
||||
"toast-voice-failed": "Nu a reușit să actualizeze modul de voce.",
|
||||
"toast-approve-failed": "Nu a fost posibilă aprobarea utilizatorului.",
|
||||
"toast-deny-failed": "Nu a reușit să respingă cererea utilizatorului.",
|
||||
"toast-revoke-failed":
|
||||
"Nu a fost posibil să se anuleze contul utilizatorului.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Așteptare aprobare",
|
||||
"pending-description":
|
||||
"Utilizatorii care așteaptă să fie verificați. Potrivirea codului de asociere afișat aici cu cel afișat în chat-ul lor de pe Telegram.",
|
||||
"approved-title": "Utilizatori autorizați",
|
||||
"approved-description":
|
||||
"Utilizatorii care au fost autorizați să interacționeze cu botul dumneavoastră.",
|
||||
user: "Utilizator",
|
||||
"pairing-code": "Cod de asociere",
|
||||
"no-pending": "Nu există cereri în așteptare.",
|
||||
"no-approved": "Nu există utilizatori autorizați.",
|
||||
unknown: "Necunoscut",
|
||||
approve: "Aprobă",
|
||||
deny: "Negarea",
|
||||
revoke: "Anula",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "Добро пожаловать в",
|
||||
getStarted: "Начать",
|
||||
welcome: "Добро пожаловать",
|
||||
},
|
||||
llm: {
|
||||
title: "Предпочитаемые LLM",
|
||||
@@ -51,7 +51,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Имя рабочих пространств",
|
||||
user: "Пользователь",
|
||||
selection: "Выбор модели",
|
||||
saving: "Сохранение...",
|
||||
save: "Сохранить изменения",
|
||||
@@ -63,6 +62,11 @@ const TRANSLATIONS = {
|
||||
search: "Поиск",
|
||||
username_requirements:
|
||||
"Имя пользователя должно содержать от 2 до 32 символов, начинаться со строчной буквы и содержать только строчные буквы, цифры, символы подчёркивания, дефисы и точки.",
|
||||
on: "О",
|
||||
none: "Нет",
|
||||
stopped: "Остановлен",
|
||||
loading: "Загрузка",
|
||||
refresh: "Обновить",
|
||||
},
|
||||
settings: {
|
||||
title: "Настройки экземпляра",
|
||||
@@ -100,6 +104,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Ваш аккаунт",
|
||||
"import-item": "Импорт товара",
|
||||
},
|
||||
channels: "Каналы",
|
||||
"available-channels": {
|
||||
telegram: "Телеграм",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -176,15 +184,18 @@ const TRANSLATIONS = {
|
||||
title: "Режим чата",
|
||||
chat: {
|
||||
title: "Чат",
|
||||
"desc-start": "будет предоставлять ответы с общей информацией LLM",
|
||||
and: "и",
|
||||
"desc-end": "найденный контекст документов.",
|
||||
description:
|
||||
"предоставит ответы, используя общие знания LLM и контекст документа, который был предоставлен. Для использования инструментов необходимо использовать команду @agent.",
|
||||
},
|
||||
query: {
|
||||
title: "Запрос",
|
||||
"desc-start": "будет предоставлять ответы",
|
||||
only: "только",
|
||||
"desc-end": "если найден контекст документов.",
|
||||
description:
|
||||
"будет предоставлять ответы <b>только</b>, если будет найден контекст документа.<br />Для использования инструментов вам потребуется использовать команду @agent.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Авто",
|
||||
description:
|
||||
"автоматически будет использовать инструменты, если модель и поставщик поддерживают вызов инструментов напрямую. <br />Если прямой вызов инструментов не поддерживается, вам потребуется использовать команду `@agent` для использования инструментов.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -297,11 +308,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Включите возможность создания различных типов диаграмм из предоставленных данных или данных, указанных в чате.",
|
||||
},
|
||||
save: {
|
||||
title: "Создание и сохранение файлов в браузер",
|
||||
description:
|
||||
"Включите возможность создания и записи файлов, которые можно сохранить и загрузить в вашем браузере.",
|
||||
},
|
||||
web: {
|
||||
title: "Поиск в Интернете и просмотр в реальном времени",
|
||||
description:
|
||||
@@ -314,6 +320,141 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"По умолчанию, эта функция включена, но вы можете отключить ее, если не хотите, чтобы она была доступна для агента.",
|
||||
filesystem: {
|
||||
title: "Доступ к файловой системе",
|
||||
description:
|
||||
"Предоставьте вашему агенту возможность читать, создавать, искать и управлять файлами в определенной директории. Поддерживает редактирование файлов, навигацию по директориям и поиск содержимого.",
|
||||
learnMore: "Узнайте больше о том, как использовать этот навык.",
|
||||
configuration: "Настройка",
|
||||
readActions: "Прочитать действия",
|
||||
writeActions: "Определить действия",
|
||||
warning:
|
||||
"Доступ к файловой системе может быть опасным, так как он может изменять или удалять файлы. Пожалуйста, ознакомьтесь с <link>документацией</link> перед включением.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Открыть файл",
|
||||
description:
|
||||
"Прочитать содержимое файлов (текст, код, PDF, изображения и т.д.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Открыть несколько файлов",
|
||||
description: "Одновременно читать несколько файлов.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Список каталогов",
|
||||
description: "Перечислите файлы и каталоги в папке.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Поиск файлов",
|
||||
description: "Поиск файлов по имени или содержимому",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Получить информацию о файле",
|
||||
description: "Получите подробную информацию о метаданных файлов.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Редактировать файл",
|
||||
description:
|
||||
"Внесите изменения в текстовые файлы, работая построчно.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Создать папку",
|
||||
description: "Создать новые каталоги",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Переместить/Переименовать файл",
|
||||
description: "Переместите или переименуйте файлы и каталоги.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Скопировать файл",
|
||||
description: "Копировать файлы и каталоги",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Создать текстовый файл",
|
||||
description:
|
||||
"Создайте новые текстовые файлы или перезапишите существующие текстовые файлы.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Создание документа",
|
||||
description:
|
||||
"Предоставьте своему агенту возможность создавать файлы в двоичном формате, такие как презентации PowerPoint, электронные таблицы Excel, документы Word и PDF. Файлы можно загружать непосредственно из окна чата.",
|
||||
configuration: "Доступные типы документов",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Текстовые файлы",
|
||||
description:
|
||||
"Создавайте текстовые файлы с любым содержимым и расширением (.txt, .md, .json, .csv и т. д.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Презентации в формате PowerPoint",
|
||||
description:
|
||||
"Создайте новые презентации в формате PowerPoint, включая слайды, заголовки и списки с маркерами.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Документы в формате PDF",
|
||||
description:
|
||||
"Создавайте документы в формате PDF из Markdown или простого текста с использованием базового оформления.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Электронные таблицы в программе Excel",
|
||||
description:
|
||||
"Создайте документы Excel для табличных данных, включающие листы и оформление.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Документы в формате Word",
|
||||
description:
|
||||
"Создавайте документы в формате Word с использованием базовых стилей и форматирования.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Серверы MCP",
|
||||
"loading-from-config": "Загрузка серверов MCP из конфигурационного файла",
|
||||
"learn-more": "Узнайте больше о серверах MCP.",
|
||||
"no-servers-found": "Не найдено серверов MCP.",
|
||||
"tool-warning":
|
||||
"Для достижения наилучших результатов, рассмотрите возможность отключения неиспользуемых инструментов, чтобы сохранить контекст.",
|
||||
"stop-server": "Остановить сервер MCP",
|
||||
"start-server": "Запустить сервер MCP",
|
||||
"delete-server": "Удалить сервер MCP",
|
||||
"tool-count-warning":
|
||||
"Этот сервер MCP имеет включенные <b> инструменты, которые потребляют контекст в каждом чате.</b> Рассмотрите возможность отключения нежелательных инструментов для экономии контекста.",
|
||||
"startup-command": "Команда для запуска",
|
||||
command: "Приказ",
|
||||
arguments: "Аргументы",
|
||||
"not-running-warning":
|
||||
"Этот сервер MCP не работает – он может быть остановлен или возникла ошибка при запуске.",
|
||||
"tool-call-arguments": "Аргументы для вызова функции",
|
||||
"tools-enabled": "инструменты включены/активированы",
|
||||
},
|
||||
settings: {
|
||||
title: "Настройки навыков агента",
|
||||
"max-tool-calls": {
|
||||
title: "Максимальное количество запросов к инструменту в одном ответе",
|
||||
description:
|
||||
"Максимальное количество инструментов, которые агент может использовать последовательно для генерации одного ответа. Это предотвращает чрезмерное использование инструментов и бесконечные циклы.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Интеллектуальный выбор навыков",
|
||||
"beta-badge": "Бета-версия",
|
||||
description:
|
||||
"Позволяет использовать неограниченное количество инструментов и сократить использование токенов до 80% на запрос – AnythingLLM автоматически выбирает наиболее подходящие навыки для каждого запроса.",
|
||||
"max-tools": {
|
||||
title: "Инструменты Max",
|
||||
description:
|
||||
"Максимальное количество инструментов, которые можно выбрать для каждого запроса. Мы рекомендуем устанавливать это значение на более высокие значения для моделей с большим контекстом.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Драйвер для работы с базой данных SQL",
|
||||
description:
|
||||
"Позвольте вашему агенту использовать SQL для ответа на ваши вопросы, подключившись к различным провайдерам баз данных.",
|
||||
},
|
||||
default_skill:
|
||||
"По умолчанию, эта функция включена, но вы можете отключить ее, если не хотите, чтобы она была доступна для агента.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -592,7 +733,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Выбрать всё",
|
||||
deselect_all: "Снять выбор со всех",
|
||||
remove_selected: "Удалить выбранные",
|
||||
costs: "*Единоразовая стоимость за внедрение",
|
||||
save_embed: "Сохранить и внедрить",
|
||||
"total-documents_one": "{{count}} документ",
|
||||
"total-documents_other": "{{count}} документы",
|
||||
@@ -700,7 +840,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Показать меньше",
|
||||
see_more: "Узнать больше",
|
||||
tools: "Инструменты",
|
||||
browse: "Просматривать",
|
||||
text_size_label: "Размер текста",
|
||||
select_model: "Выберите модель",
|
||||
sources: "Источники",
|
||||
@@ -713,8 +852,6 @@ const TRANSLATIONS = {
|
||||
edit: "Редактировать",
|
||||
publish: "Опубликовать",
|
||||
stop_generating: "Прекратите генерацию ответа",
|
||||
pause_tts_speech_message:
|
||||
"Приостановить чтение текста с помощью синтезатора речи.",
|
||||
slash_commands: "Команды, введенные сокращенной формой",
|
||||
agent_skills: "Навыки агента",
|
||||
manage_agent_skills: "Управление навыками агентов",
|
||||
@@ -723,6 +860,16 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Начать сеанс для агента",
|
||||
use_agent_session_to_use_tools:
|
||||
"Вы можете использовать инструменты в чате, начав сеанс с агентом, добавив '@agent' в начало вашего сообщения.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Модель хочет позвонить",
|
||||
approve: "Одобрить",
|
||||
reject: "Отказ",
|
||||
always_allow: "Всегда оставляйте {{skillName}}",
|
||||
tool_call_was_approved:
|
||||
"Запрос на предоставление инструмента был одобрен.",
|
||||
tool_call_was_rejected:
|
||||
"Запрос на предоставление инструмента был отклонен.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Редактировать учётную запись",
|
||||
@@ -980,6 +1127,86 @@ const TRANSLATIONS = {
|
||||
"Вы не назначены ни к одной рабочей области.\nСвяжитесь с администратором, чтобы запросить доступ к рабочей области.",
|
||||
goToWorkspace: 'Перейти к рабочей области "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Бот для Telegram",
|
||||
description:
|
||||
"Подключите свою инстанцию AnythingLLM к Telegram, чтобы вы могли общаться со своими рабочими пространствами с любого устройства.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Шаг 1: Создайте своего Telegram-бота.",
|
||||
description:
|
||||
"Откройте чат с @BotFather в Telegram, отправьте команду `/newbot` в чат с <code>@BotFather</code>, следуйте инструкциям и скопируйте API-токен.",
|
||||
"open-botfather": "Запустить BotFather",
|
||||
"instruction-1": "1. Откройте ссылку или отсканируйте QR-код",
|
||||
"instruction-2":
|
||||
"2. Отправьте <code>/newbot</code> на адрес <code>@BotFather</code>",
|
||||
"instruction-3": "3. Выберите имя и имя пользователя для вашего бота.",
|
||||
"instruction-4": "4. Скопируйте API-токен, который вы получили.",
|
||||
},
|
||||
step2: {
|
||||
title: "Шаг 2: Подключите своего бота",
|
||||
description:
|
||||
"Вставьте API-токен, который вы получили от @BotFather, и выберите основной рабочий стол для вашего бота, чтобы он мог общаться.",
|
||||
"bot-token": "Токен бота",
|
||||
"default-workspace": "Основной рабочий стол",
|
||||
"no-workspace": "Недоступны рабочие места. Будет создано новое.",
|
||||
connecting: "Устанавливается соединение...",
|
||||
"connect-bot": "Bot Connect",
|
||||
},
|
||||
security: {
|
||||
title: "Рекомендуемые настройки безопасности",
|
||||
description:
|
||||
"Для дополнительной безопасности, настройте эти параметры в @BotFather.",
|
||||
"disable-groups": "— Предотвратить добавление ботов в группы",
|
||||
"disable-inline":
|
||||
"— Предотвратить использование бота в поиске по запросу",
|
||||
"obscure-username":
|
||||
"Используйте не очевидное имя пользователя для бота, чтобы уменьшить его видимость.",
|
||||
},
|
||||
"toast-enter-token": "Пожалуйста, введите токен для бота.",
|
||||
"toast-connect-failed": "Не удалось установить соединение с ботом.",
|
||||
},
|
||||
connected: {
|
||||
status: "Соединенный",
|
||||
"status-disconnected":
|
||||
"Отключено – токен может быть просроченным или недействительным",
|
||||
"placeholder-token": "Вставьте новый токен для бота...",
|
||||
reconnect: "Возобновить",
|
||||
workspace: "Рабочее пространство",
|
||||
"bot-link": "Ссылка на бота",
|
||||
"voice-response": "Ответ голосом",
|
||||
disconnecting: "Отключение...",
|
||||
disconnect: "Отключить",
|
||||
"voice-text-only": "Текст только",
|
||||
"voice-mirror":
|
||||
"Зеркало (отвечать голосом, когда пользователь отправляет голосовое сообщение)",
|
||||
"voice-always":
|
||||
"Всегда добавляйте голосовое сообщение (отправляйте аудио вместе с каждым ответом).",
|
||||
"toast-disconnect-failed": "Не удалось отключить бота.",
|
||||
"toast-reconnect-failed": "Не удалось восстановить соединение с ботом.",
|
||||
"toast-voice-failed": "Не удалось обновить режим голосового управления.",
|
||||
"toast-approve-failed":
|
||||
"Не удалось подтвердить учетную запись пользователя.",
|
||||
"toast-deny-failed": "Не удалось отклонить запрос пользователя.",
|
||||
"toast-revoke-failed": "Не удалось отменить действия пользователя.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Ожидается утверждение",
|
||||
"pending-description":
|
||||
"Пользователи, ожидающие подтверждения. Сравните код, указанный здесь, с кодом, отображаемым в их чате в Telegram.",
|
||||
"approved-title": "Утвержденные пользователи",
|
||||
"approved-description":
|
||||
"Пользователи, которым разрешено общаться с вашим ботом.",
|
||||
user: "Пользователь",
|
||||
"pairing-code": "Код сопоставления",
|
||||
"no-pending": "Отсутствуют незавершенные запросы.",
|
||||
"no-approved": "Нет зарегистрированных пользователей",
|
||||
unknown: "Неизвестно",
|
||||
approve: "Одобрить",
|
||||
deny: "Отрицать",
|
||||
revoke: "Отменить",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -17,8 +17,8 @@ const TRANSLATIONS = {
|
||||
"AnythingLLM'yi ihtiyaçlarınıza göre oluşturmamıza yardımcı olun. İsteğe bağlı.",
|
||||
},
|
||||
home: {
|
||||
title: "Hoş Geldiniz",
|
||||
getStarted: "Başla",
|
||||
welcome: "Hoş geldiniz",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM Tercihi",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Çalışma Alanları Adı",
|
||||
user: "Kullanıcı",
|
||||
selection: "Model Seçimi",
|
||||
saving: "Kaydediliyor...",
|
||||
save: "Değişiklikleri Kaydet",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Ara",
|
||||
username_requirements:
|
||||
"Kullanıcı adı 2-32 karakter uzunluğunda olmalı, küçük harfle başlamalı ve yalnızca küçük harfler, rakamlar, alt çizgiler, tireler ve noktalar içermelidir.",
|
||||
on: "On",
|
||||
none: "Yok",
|
||||
stopped: "Durdu",
|
||||
loading: "Yükleniyor",
|
||||
refresh: "Tazelemek",
|
||||
},
|
||||
settings: {
|
||||
title: "Instance Ayarları",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Hesabınız",
|
||||
"import-item": "İthal Edilen Ürün",
|
||||
},
|
||||
channels: "Kanalalar",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -176,15 +184,18 @@ const TRANSLATIONS = {
|
||||
title: "Sohbet Modu",
|
||||
chat: {
|
||||
title: "Sohbet",
|
||||
"desc-start": "LLM'nin genel bilgisiyle yanıtlar sunar",
|
||||
and: "ve",
|
||||
"desc-end": "bulunan belge bağlamını ekler.",
|
||||
description:
|
||||
'LLM\'nin genel bilgisi ve bulunan doküman bağlamıyla cevaplar sağlayacaktır. Araçları kullanmak için "@agent" komutunu kullanmanız gerekecektir.',
|
||||
},
|
||||
query: {
|
||||
title: "Sorgu",
|
||||
"desc-start": "yanıtları",
|
||||
only: "sadece",
|
||||
"desc-end": "belge bağlamı bulunduğunda sunar.",
|
||||
description:
|
||||
"yalnızca ilgili belgenin bağlamında yanıtlar sağlayacaktır.<b>Kullanılabilir araçları kullanmak için @agent komutunu kullanmanız gerekecektir.</b>",
|
||||
},
|
||||
automatic: {
|
||||
title: "Oto",
|
||||
description:
|
||||
"Model ve sağlayıcı tarafından desteklenen araçları otomatik olarak kullanacaktır. Eğer yerel araç çağırma desteklenmiyorsa, araçları kullanmak için @agent komutunu kullanmanız gerekecektir.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -297,11 +308,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Varsayılan ajanın, sağlanan veya sohbette yer alan verilere göre çeşitli grafik türleri oluşturmasına izin verin.",
|
||||
},
|
||||
save: {
|
||||
title: "Tarayıcıya dosya oluştur & kaydet",
|
||||
description:
|
||||
"Varsayılan ajanın, oluşturduğu dosyaları kaydetmesine ve tarayıcıda indirilebilir hale getirmesine izin verin.",
|
||||
},
|
||||
web: {
|
||||
title: "Canlı web araması ve gezinme",
|
||||
description:
|
||||
@@ -314,6 +320,142 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Varsayılan olarak bu özellik etkinleştirilmiştir, ancak ajanın kullanmasına izin vermek istemiyorsanız, bu özelliği devre dışı bırakabilirsiniz.",
|
||||
filesystem: {
|
||||
title: "Dosya Sistemi Erişimi",
|
||||
description:
|
||||
"Temsilcinizin, belirli bir klasör içindeki dosyaları okuma, yazma, arama ve yönetme yeteneğini etkinleştirin. Dosya düzenleme, klasör gezinme ve içerik arama özelliklerini destekler.",
|
||||
learnMore:
|
||||
"Bu beceriye nasıl başlanacağını ve nasıl kullanılacağını daha detaylı bir şekilde öğrenin.",
|
||||
configuration: "Yapılandırma",
|
||||
readActions: "Okunmuş Eylemler",
|
||||
writeActions: "Yapılacak İşler",
|
||||
warning:
|
||||
"Dosya sistemine erişim tehlikeli olabilir, çünkü dosyaları değiştirebilir veya silebilir. Bu özelliği etkinleştirmeden önce lütfen <link>belgelendirme</link>'i inceleyin.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Dosyayı aç",
|
||||
description:
|
||||
"Dosyalardaki içeriği okuyun (metin, kod, PDF, resimler vb.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Birden fazla dosyayı okuyun",
|
||||
description: "Birden fazla dosyayı aynı anda okuyun",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Yönerge Listesi",
|
||||
description: "Bir klasördeki dosyaları ve dizinleri listeleyin.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Dosyaları Arayın",
|
||||
description: "Dosyaları adlarına veya içeriğine göre arayın",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Dosya Hakkında Bilgi Al",
|
||||
description: "Dosyalara ilişkin ayrıntılı meta verileri elde edin.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Dosya Düzenle",
|
||||
description: "Metin dosyalarında satır bazlı değişiklikler yapın.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Klasör Oluştur",
|
||||
description: "Yeni klasörler oluşturun",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Dosya taşı/yeniden adlandır",
|
||||
description:
|
||||
"Dosyaları ve dizinleri taşıyın veya yeniden adlandırın.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Dosyayı Kopyala",
|
||||
description: "Dosyaları ve dizinleri kopyala",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Metin dosyası oluştur",
|
||||
description:
|
||||
"Yeni metin dosyaları oluşturun veya mevcut metin dosyalarını üzerine yazın.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Belge Oluşturma",
|
||||
description:
|
||||
"Temsilcinizin, PowerPoint sunumları, Excel tabloları, Word belgeleri ve PDF dosyaları gibi ikili belge formatları oluşturmasına olanak tanıyın. Dosyalar doğrudan sohbet penceresinden indirilebilir.",
|
||||
configuration: "Mevcut Belgeler Türleri",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Metin dosyaları",
|
||||
description:
|
||||
"Herhangi bir içerik ve uzantıyla (örneğin .txt, .md, .json, .csv vb.) metin dosyaları oluşturun.",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint sunumları",
|
||||
description:
|
||||
"Yeni PowerPoint sunumları oluşturun, slaytlar, başlıklar ve madde işaretleri ekleyin.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF belgeleri",
|
||||
description:
|
||||
"Temel stillerle markdown veya düz metinlerden PDF belgeleri oluşturun.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel elektronik tabloları",
|
||||
description:
|
||||
"Tablo formatındaki veriler için, sayfalar ve stil özellikleriyle Excel belgeleri oluşturun.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Kelime belgeleri",
|
||||
description:
|
||||
"Temel stil ve biçimlendirme ile Word belgeleri oluşturun.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP Sunucuları",
|
||||
"loading-from-config": "MCP sunarlarını yapılandırma dosyasından yükleme",
|
||||
"learn-more": "MCP sunucuları hakkında daha fazla bilgi edinin.",
|
||||
"no-servers-found": "Hiçbir MCP sunucusu bulunamadı.",
|
||||
"tool-warning":
|
||||
"En iyi performansı elde etmek için, gereksiz araçları devre dışı bırakarak bağlamı korumayı düşünebilirsiniz.",
|
||||
"stop-server": "MCP sunucusunu durdurun",
|
||||
"start-server": "MCP sunucusunu başlatın",
|
||||
"delete-server": "MCP sunucusunu sil",
|
||||
"tool-count-warning":
|
||||
"Bu MCP sunucusu, <b> özelliklerini etkinleştirmiş durumda ve bu özellikler her etkileşimde bağlamı tüketebilir. </b> Bağlamı korumak için istenmeyen özellikleri devre dışı bırakmayı düşünebilirsiniz.",
|
||||
"startup-command": "Başlangıç Komutu",
|
||||
command: "Emir",
|
||||
arguments: "Tartışmalar",
|
||||
"not-running-warning":
|
||||
"Bu MCP sunucusu çalışmıyor – olabilir ki durdurulmuş veya başlatma sırasında bir hata yaşıyor olabilir.",
|
||||
"tool-call-arguments": "Araç çağrı argümanları",
|
||||
"tools-enabled": "gerektiren araçlar etkinleştirildi",
|
||||
},
|
||||
settings: {
|
||||
title: "Ajant Yetenek Ayarları",
|
||||
"max-tool-calls": {
|
||||
title: "Her yanıt için maksimum araç çağrı sayısı",
|
||||
description:
|
||||
"Bir ajantın, tek bir yanıt oluşturmak için zincirlemesini kullanabileceği maksimum araç sayısı. Bu, araçların kontrolsüz bir şekilde çağrılmasını ve sonsuz döngülerin oluşmasını engeller.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Akıllı Becerilerin Seçimi",
|
||||
"beta-badge": "Beta",
|
||||
description:
|
||||
'Her sorgu için sınırsız araç kullanımı ve "cut token" kullanımını %80\'e kadar azaltma imkanı sunar — AnythingLLM, her talep için doğru becerileri otomatik olarak seçer.',
|
||||
"max-tools": {
|
||||
title: "Max Araçları",
|
||||
description:
|
||||
"Her sorgu için seçilebilecek maksimum araç sayısı. Daha büyük bağlam modelleri için bu değeri daha yüksek bir değere ayarlamayı öneririz.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL Bağlayıcı",
|
||||
description:
|
||||
"Temsilcinizin, çeşitli SQL veri tabanı sağlayıcılarına bağlanarak SQL'i kullanarak sorularınızı yanıtlamasına olanak tanıyın.",
|
||||
},
|
||||
default_skill:
|
||||
"Varsayılan olarak bu özellik etkinleştirilmiştir, ancak ajanın kullanmasına izin vermek istemiyorsanız, bu özelliği devre dışı bırakabilirsiniz.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -592,7 +734,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Tümünü Seç",
|
||||
deselect_all: "Tümünün Seçimini Kaldır",
|
||||
remove_selected: "Seçilenleri Kaldır",
|
||||
costs: "*Gömmeler için tek seferlik maliyet",
|
||||
save_embed: "Kaydet ve Göm",
|
||||
"total-documents_one": "{{count}} belgesi",
|
||||
"total-documents_other": "{{count}} belgeleri",
|
||||
@@ -695,7 +836,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Daha az",
|
||||
see_more: "Daha Fazla",
|
||||
tools: "Araçlar",
|
||||
browse: "Gezin",
|
||||
text_size_label: "Metin Boyutu",
|
||||
select_model: "Model Seçimi",
|
||||
sources: "Kaynaklar",
|
||||
@@ -708,7 +848,6 @@ const TRANSLATIONS = {
|
||||
edit: "Düzenle",
|
||||
publish: "Yayınla",
|
||||
stop_generating: "Yanıt üretmeyi durdurun",
|
||||
pause_tts_speech_message: "Mesajın metin okuma (TTS) özelliğini durdur",
|
||||
slash_commands: "Komut Satırı Komutları",
|
||||
agent_skills: "Ajansın Yetenekleri",
|
||||
manage_agent_skills: "Temsilcinin becerilerini yönetin",
|
||||
@@ -717,6 +856,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Temsilci Oturumu Başlat",
|
||||
use_agent_session_to_use_tools:
|
||||
'Çatınızdaki araçları kullanmak için, isteminizin başında "@agent" ile bir ajan oturumu başlatabilirsiniz.',
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Model, arama yapmak istiyor",
|
||||
approve: "Onayla",
|
||||
reject: "Reddet",
|
||||
always_allow: "Her zaman {{skillName}}'ı sağlayın.",
|
||||
tool_call_was_approved: "Araç talebi onaylandı.",
|
||||
tool_call_was_rejected: "Ara çağrısı reddedildi.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Hesabı Düzenle",
|
||||
@@ -966,6 +1113,85 @@ const TRANSLATIONS = {
|
||||
"Şu anda hiçbir çalışma alanına atanmamışsınız.\nBir çalışma alanına erişmek için yöneticinize başvurun.",
|
||||
goToWorkspace: 'Çalışma alanına git "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram Bot'u",
|
||||
description:
|
||||
"AnythingLLM örneğinizi Telegram ile bağlantılandırarak, herhangi bir cihazdan çalışma alanlarınızla sohbet edebilmelisiniz.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "1. Adım: Telegram botunuzu oluşturun",
|
||||
description:
|
||||
"Telegram uygulamasında @BotFather'ı açın, \"<code>/newbot</code>\" komutunu <code>@BotFather</code>'e gönderin, talimatları izleyin ve API anahtarını kopyalayın.",
|
||||
"open-botfather": "BotFather'ı aç",
|
||||
"instruction-1": "1. Bağlantıyı açın veya QR kodunu tarayın",
|
||||
"instruction-2":
|
||||
"2. <code>/newbot</code> adresine <code>@BotFather</code>'e gönderin.",
|
||||
"instruction-3": "3. Botunuz için bir isim ve kullanıcı adı seçin",
|
||||
"instruction-4": "4. Alınan API token'ı kopyalayın",
|
||||
},
|
||||
step2: {
|
||||
title: "Adım 2: Botunuzu bağlayın",
|
||||
description:
|
||||
"Aldığınız API token'ı (@BotFather) kopyalayın ve botunuzun iletişim kuracağı varsayılan çalışma alanını seçin.",
|
||||
"bot-token": "Bot Token",
|
||||
"default-workspace": "Varsayılan Çalışma Alanı",
|
||||
"no-workspace":
|
||||
"Mevcut çalışma alanları bulunmamaktadır. Yeni bir çalışma alanı oluşturulacaktır.",
|
||||
connecting: "Bağlantı kuruluyor...",
|
||||
"connect-bot": "Bağlantı Botu",
|
||||
},
|
||||
security: {
|
||||
title: "Önerilen Güvenlik Ayarları",
|
||||
description:
|
||||
"Ek güvenlik için, bu ayarları @BotFather üzerinden yapılandırın.",
|
||||
"disable-groups": "— Gruplara bot eklenmesini engelleme",
|
||||
"disable-inline":
|
||||
"— Bot'un, arama çubuklarında kullanılmasını engellemek",
|
||||
"obscure-username":
|
||||
"Daha az bilinen bir bot kullanıcı adı kullanarak görünürlüğünü azaltın.",
|
||||
},
|
||||
"toast-enter-token": "Lütfen bir bot belirteci girin.",
|
||||
"toast-connect-failed": "Bot ile bağlantı kurulamadı.",
|
||||
},
|
||||
connected: {
|
||||
status: "Bağlı",
|
||||
"status-disconnected":
|
||||
"Bağlantı kesildi — belirteç geçersiz veya süresi dolmuş olabilir",
|
||||
"placeholder-token": "Yeni bot token'ı yapıştırın...",
|
||||
reconnect: "Yeniden bağlantı kur",
|
||||
workspace: "Çalışma alanı",
|
||||
"bot-link": "Bot bağlantısı",
|
||||
"voice-response": "Sesle etkileşim",
|
||||
disconnecting: "Bağlantıyı kesiyorum...",
|
||||
disconnect: "Bağlantıyı kes",
|
||||
"voice-text-only": "Sadece metin",
|
||||
"voice-mirror":
|
||||
"Sesli yanıt (kullanıcı ses gönderdiğinde, sesli yanıtla cevaplayın)",
|
||||
"voice-always": "Her yanıtla birlikte sesli (sesli yanıt gönderme)",
|
||||
"toast-disconnect-failed": "Bot'u ayırmada başarısız.",
|
||||
"toast-reconnect-failed": "Bot yeniden bağlantı kuramadı.",
|
||||
"toast-voice-failed": "Ses modunu güncelleme başarısız oldu.",
|
||||
"toast-approve-failed": "Kullanıcıın onaylanması başarısız oldu.",
|
||||
"toast-deny-failed": "Kullanıcıyı reddetmeyi başaramadı.",
|
||||
"toast-revoke-failed": "Kullanıcıyı silme işlemi başarısız oldu.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Onay Bekliyor",
|
||||
"pending-description":
|
||||
"Doğrulama işlemi bekleyen kullanıcılar. Burada gösterilen eşleştirme kodunu, Telegram sohbetlerinde görüntülenen kodla karşılaştırın.",
|
||||
"approved-title": "Onaylanmış Kullanıcılar",
|
||||
"approved-description":
|
||||
"Botunuzla sohbet etmeye yetkili olan kullanıcılar.",
|
||||
user: "Kullanıcı",
|
||||
"pairing-code": "Eşleştirme Kodu",
|
||||
"no-pending": "Henüz tamamlanmamış herhangi bir istek bulunmamaktadır.",
|
||||
"no-approved": "Onaylanmış kullanıcı bulunmamaktadır",
|
||||
unknown: "Bilinmiyor",
|
||||
approve: "Onayla",
|
||||
deny: "İnkar",
|
||||
revoke: "İptal et",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -17,8 +17,8 @@ const TRANSLATIONS = {
|
||||
"Giúp chúng tôi xây dựng AnythingLLM phù hợp với nhu cầu của bạn. Tùy chọn.",
|
||||
},
|
||||
home: {
|
||||
title: "Chào mừng đến",
|
||||
getStarted: "Bắt đầu",
|
||||
welcome: "Chào mừng",
|
||||
},
|
||||
llm: {
|
||||
title: "Tùy chọn LLM",
|
||||
@@ -52,7 +52,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "Tên không gian làm việc",
|
||||
user: "Người dùng",
|
||||
selection: "Lựa chọn mô hình",
|
||||
saving: "Đang lưu...",
|
||||
save: "Lưu thay đổi",
|
||||
@@ -64,6 +63,11 @@ const TRANSLATIONS = {
|
||||
search: "Tìm kiếm",
|
||||
username_requirements:
|
||||
"Tên người dùng phải có 2-32 ký tự, bắt đầu bằng chữ cái thường và chỉ chứa chữ cái thường, số, dấu gạch dưới, dấu gạch ngang và dấu chấm.",
|
||||
on: "Về",
|
||||
none: "Không",
|
||||
stopped: "Dừng",
|
||||
loading: "Đang tải",
|
||||
refresh: "Tái tạo",
|
||||
},
|
||||
settings: {
|
||||
title: "Cài đặt hệ thống",
|
||||
@@ -101,6 +105,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "Tài khoản của bạn",
|
||||
"import-item": "Nhập hàng",
|
||||
},
|
||||
channels: "Kênh",
|
||||
"available-channels": {
|
||||
telegram: "Telegram",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -176,15 +184,18 @@ const TRANSLATIONS = {
|
||||
title: "Chế độ trò chuyện",
|
||||
chat: {
|
||||
title: "Trò chuyện",
|
||||
"desc-start": "sẽ cung cấp câu trả lời với kiến thức chung của LLM",
|
||||
and: "và",
|
||||
"desc-end": "ngữ cảnh tài liệu được tìm thấy.",
|
||||
description:
|
||||
"sẽ cung cấp câu trả lời dựa trên kiến thức chung của LLM và ngữ cảnh tài liệu được cung cấp.<br />Bạn sẽ cần sử dụng lệnh @agent để sử dụng các công cụ.",
|
||||
},
|
||||
query: {
|
||||
title: "Truy vấn",
|
||||
"desc-start": "sẽ cung cấp câu trả lời",
|
||||
only: "chỉ",
|
||||
"desc-end": "khi tìm thấy ngữ cảnh tài liệu.",
|
||||
description:
|
||||
"sẽ cung cấp câu trả lời <b>chỉ</b> nếu ngữ cảnh của tài liệu được tìm thấy.<br />Bạn sẽ cần sử dụng lệnh @agent để sử dụng các công cụ.",
|
||||
},
|
||||
automatic: {
|
||||
title: "Tự động",
|
||||
description:
|
||||
"sẽ tự động sử dụng các công cụ nếu mô hình và nhà cung cấp hỗ trợ gọi công cụ gốc. Nếu không hỗ trợ gọi công cụ gốc, bạn sẽ cần sử dụng lệnh `@agent` để sử dụng các công cụ.",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -296,11 +307,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Cho phép agent mặc định tạo các loại biểu đồ khác nhau từ dữ liệu được cung cấp hoặc đưa ra trong trò chuyện.",
|
||||
},
|
||||
save: {
|
||||
title: "Tạo & lưu tệp",
|
||||
description:
|
||||
"Cho phép agent mặc định tạo và ghi vào các tệp có thể lưu vào máy tính của bạn.",
|
||||
},
|
||||
web: {
|
||||
title: "Tìm kiếm web trực tiếp và duyệt web",
|
||||
description:
|
||||
@@ -313,6 +319,141 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"Theo mặc định, kỹ năng này được kích hoạt, nhưng bạn có thể tắt nó nếu không muốn nó được sử dụng bởi người đại diện.",
|
||||
filesystem: {
|
||||
title: "Quyền truy cập hệ thống tệp",
|
||||
description:
|
||||
"Cho phép đại lý của bạn đọc, ghi, tìm kiếm và quản lý các tệp tin trong một thư mục được chỉ định. Hỗ trợ chỉnh sửa tệp, điều hướng thư mục và tìm kiếm nội dung.",
|
||||
learnMore: "Tìm hiểu thêm về cách sử dụng kỹ năng này.",
|
||||
configuration: "Cấu hình",
|
||||
readActions: "Đọc hành động",
|
||||
writeActions: "Các hành động",
|
||||
warning:
|
||||
"Việc truy cập hệ thống tệp có thể gây nguy hiểm vì nó có thể sửa đổi hoặc xóa các tệp. Vui lòng tham khảo tài liệu <link> trước khi kích hoạt.",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "Đọc tệp",
|
||||
description:
|
||||
"Đọc nội dung của các tệp (văn bản, mã, PDF, hình ảnh, v.v.)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "Đọc nhiều tệp",
|
||||
description: "Đọc nhiều tệp tin cùng lúc.",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "Danh sách",
|
||||
description: "Liệt kê các tệp tin và thư mục trong một thư mục.",
|
||||
},
|
||||
"search-files": {
|
||||
title: "Tìm kiếm tệp",
|
||||
description: "Tìm kiếm các tệp theo tên hoặc nội dung",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "Lấy thông tin tệp",
|
||||
description: "Lấy thông tin chi tiết về các tệp tin.",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "Chỉnh sửa tệp",
|
||||
description:
|
||||
"Thực hiện chỉnh sửa dựa trên dòng trong các tệp văn bản.",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "Tạo thư mục",
|
||||
description: "Tạo thư mục mới",
|
||||
},
|
||||
"move-file": {
|
||||
title: "Di chuyển/Đổi tên tệp",
|
||||
description: "Di chuyển hoặc đổi tên các tệp và thư mục.",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "Sao chép tệp",
|
||||
description: "Sao chép các tệp tin và thư mục",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "Tạo tệp văn bản",
|
||||
description:
|
||||
"Tạo các tệp văn bản mới hoặc ghi đè các tệp văn bản hiện có.",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "Tạo tài liệu",
|
||||
description:
|
||||
"Cho phép đại lý của bạn tạo các định dạng tài liệu nhị phân như bài thuyết trình PowerPoint, bảng tính Excel, tài liệu Word và PDF. Các tệp có thể tải xuống trực tiếp từ cửa sổ trò chuyện.",
|
||||
configuration: "Các loại tài liệu có sẵn",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "Tệp văn bản",
|
||||
description:
|
||||
"Tạo các tệp văn bản với bất kỳ nội dung và định dạng nào (ví dụ: .txt, .md, .json, .csv, v.v.)",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "Bài trình bày bằng PowerPoint",
|
||||
description:
|
||||
"Tạo các bài trình chiếu PowerPoint mới với các slide, tiêu đề và dấu đầu dòng.",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "Tài liệu PDF",
|
||||
description:
|
||||
"Tạo tài liệu PDF từ Markdown hoặc văn bản thuần túy với các định dạng cơ bản.",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Bảng tính Excel",
|
||||
description:
|
||||
"Tạo các tài liệu Excel cho dữ liệu dạng bảng, bao gồm các sheet và định dạng.",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Tệp Word",
|
||||
description:
|
||||
"Tạo các tài liệu Word với định dạng và kiểu dáng cơ bản.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Máy chủ MCP",
|
||||
"loading-from-config": "Tải các máy chủ MCP từ tệp cấu hình",
|
||||
"learn-more": "Tìm hiểu thêm về máy chủ MCP.",
|
||||
"no-servers-found": "Không tìm thấy máy chủ MCP.",
|
||||
"tool-warning":
|
||||
"Để đạt hiệu suất tốt nhất, hãy cân nhắc việc tắt các công cụ không cần thiết để tiết kiệm tài nguyên.",
|
||||
"stop-server": "Tắt máy chủ MCP",
|
||||
"start-server": "Khởi động máy chủ MCP",
|
||||
"delete-server": "Xóa máy chủ MCP",
|
||||
"tool-count-warning":
|
||||
"Máy chủ MCP này có các công cụ <b> được kích hoạt, {{count}} và chúng sẽ tiêu thụ ngữ cảnh trong mọi cuộc trò chuyện.</b> Hãy cân nhắc việc tắt các công cụ không cần thiết để tiết kiệm ngữ cảnh.",
|
||||
"startup-command": "Lệnh khởi động",
|
||||
command: "Lệnh",
|
||||
arguments: "Luận điểm",
|
||||
"not-running-warning":
|
||||
"Máy chủ MCP này không hoạt động – có thể nó đã bị tắt hoặc đang gặp lỗi khi khởi động.",
|
||||
"tool-call-arguments": "Tham số khi gọi hàm/thao tác",
|
||||
"tools-enabled": "các công cụ đã được kích hoạt",
|
||||
},
|
||||
settings: {
|
||||
title: "Cài đặt kỹ năng của đại lý",
|
||||
"max-tool-calls": {
|
||||
title: "Số lượng lệnh gọi công cụ tối đa cho mỗi phản hồi",
|
||||
description:
|
||||
"Số lượng công cụ tối đa mà một người dùng có thể liên kết để tạo ra một phản hồi duy nhất. Điều này ngăn chặn việc gọi công cụ quá mức và tạo ra các vòng lặp vô hạn.",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "Lựa chọn kỹ năng thông minh",
|
||||
"beta-badge": "Phiên bản thử nghiệm",
|
||||
description:
|
||||
"Cho phép sử dụng không giới hạn các công cụ và giảm mức sử dụng token lên đến 80% cho mỗi truy vấn – AnythingLLM tự động chọn các kỹ năng phù hợp nhất cho mỗi yêu cầu.",
|
||||
"max-tools": {
|
||||
title: "Công cụ Max",
|
||||
description:
|
||||
"Số lượng công cụ tối đa có thể chọn cho mỗi truy vấn. Chúng tôi khuyến nghị đặt giá trị này thành các giá trị lớn hơn đối với các mô hình có ngữ cảnh lớn hơn.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "Kết nối SQL",
|
||||
description:
|
||||
"Cho phép đại lý của bạn sử dụng SQL để trả lời các câu hỏi của bạn bằng cách kết nối với nhiều nhà cung cấp cơ sở dữ liệu SQL khác nhau.",
|
||||
},
|
||||
default_skill:
|
||||
"Theo mặc định, kỹ năng này được kích hoạt, nhưng bạn có thể tắt nó nếu không muốn nó được sử dụng bởi người đại diện.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -589,7 +730,6 @@ const TRANSLATIONS = {
|
||||
select_all: "Chọn Tất cả",
|
||||
deselect_all: "Bỏ chọn Tất cả",
|
||||
remove_selected: "Xóa Đã chọn",
|
||||
costs: "*Chi phí một lần cho việc nhúng",
|
||||
save_embed: "Lưu và Nhúng",
|
||||
"total-documents_one": "{{count}}",
|
||||
"total-documents_other": "{{count}}",
|
||||
@@ -692,7 +832,6 @@ const TRANSLATIONS = {
|
||||
see_less: "Xem ít hơn",
|
||||
see_more: "Xem thêm",
|
||||
tools: "Dụng cụ",
|
||||
browse: "Duyệt",
|
||||
text_size_label: "Kích thước văn bản",
|
||||
select_model: "Chọn mẫu",
|
||||
sources: "Nguồn",
|
||||
@@ -705,7 +844,6 @@ const TRANSLATIONS = {
|
||||
edit: "Chỉnh sửa",
|
||||
publish: "Đăng tải",
|
||||
stop_generating: "Dừng tạo ra phản hồi",
|
||||
pause_tts_speech_message: "Tạm dừng phát giọng đọc của tin nhắn",
|
||||
slash_commands: "Lệnh tắt/bật",
|
||||
agent_skills: "Kỹ năng của đại lý",
|
||||
manage_agent_skills: "Quản lý kỹ năng của đại lý",
|
||||
@@ -714,6 +852,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "Bắt đầu phiên làm việc với đại lý",
|
||||
use_agent_session_to_use_tools:
|
||||
"Bạn có thể sử dụng các công cụ trong cuộc trò chuyện bằng cách bắt đầu một phiên với trợ lý bằng cách sử dụng '@agent' ở đầu yêu cầu của bạn.",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "Người mẫu muốn gọi",
|
||||
approve: "Chấp thuận",
|
||||
reject: "Từ chối",
|
||||
always_allow: "Luôn luôn đảm bảo {{skillName}}",
|
||||
tool_call_was_approved: "Đã được phê duyệt yêu cầu dụng cụ.",
|
||||
tool_call_was_rejected: "Yêu cầu gọi công cụ đã bị từ chối.",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "Chỉnh sửa Tài khoản",
|
||||
@@ -965,6 +1111,85 @@ const TRANSLATIONS = {
|
||||
"Bạn hiện không được giao việc nào.\nLiên hệ với quản trị viên của bạn để yêu cầu truy cập vào khu vực làm việc.",
|
||||
goToWorkspace: 'Chuyển đến khu vực làm việc "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Bot Telegram",
|
||||
description:
|
||||
"Kết nối phiên bản AnythingLLM của bạn với Telegram để bạn có thể trò chuyện với các không gian làm việc của mình từ bất kỳ thiết bị nào.",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "Bước 1: Tạo bot Telegram của bạn",
|
||||
description:
|
||||
"Mở ứng dụng @BotFather trên Telegram, gửi lệnh <code>/newbot</code> đến tài khoản <code>@BotFather</code>, làm theo hướng dẫn và sao chép mã API.",
|
||||
"open-botfather": "Mở BotFather",
|
||||
"instruction-1": "1. Mở liên kết hoặc quét mã QR",
|
||||
"instruction-2":
|
||||
"2. Gửi <code>/newbot</code> đến <code>@BotFather</code>",
|
||||
"instruction-3": "3. Chọn tên và tên người dùng cho bot của bạn",
|
||||
"instruction-4": "4. Sao chép mã API mà bạn nhận được",
|
||||
},
|
||||
step2: {
|
||||
title: "Bước 2: Kết nối bot của bạn",
|
||||
description:
|
||||
"Dán mã API mà bạn nhận được từ @BotFather và chọn không gian làm việc mặc định để bot của bạn có thể trò chuyện.",
|
||||
"bot-token": "Token Bot",
|
||||
"default-workspace": "Không gian làm việc mặc định",
|
||||
"no-workspace":
|
||||
"Không có không gian làm việc nào khả dụng. Một không gian mới sẽ được tạo ra.",
|
||||
connecting: "Kết nối...",
|
||||
"connect-bot": "Bot kết nối",
|
||||
},
|
||||
security: {
|
||||
title: "Các cài đặt bảo mật được khuyến nghị",
|
||||
description:
|
||||
"Để tăng cường bảo mật, hãy cấu hình các cài đặt này trên tài khoản @BotFather.",
|
||||
"disable-groups": "— Ngăn chặn việc thêm bot vào các nhóm",
|
||||
"disable-inline":
|
||||
"— Ngăn chặn việc sử dụng bot trong tìm kiếm trực tiếp.",
|
||||
"obscure-username":
|
||||
"Sử dụng tên người dùng bot không phổ biến để giảm khả năng được tìm thấy.",
|
||||
},
|
||||
"toast-enter-token": "Vui lòng nhập mã token cho bot.",
|
||||
"toast-connect-failed": "Không thể kết nối với trợ lý.",
|
||||
},
|
||||
connected: {
|
||||
status: "Kết nối",
|
||||
"status-disconnected":
|
||||
"Không kết nối — mã token có thể đã hết hạn hoặc không hợp lệ",
|
||||
"placeholder-token": "Dán mã token mới cho bot...",
|
||||
reconnect: "Khôi phục kết nối",
|
||||
workspace: "Không gian làm việc",
|
||||
"bot-link": "Liên kết Bot",
|
||||
"voice-response": "Phản hồi bằng giọng nói",
|
||||
disconnecting: "Ngắt kết nối...",
|
||||
disconnect: "Ngắt kết nối",
|
||||
"voice-text-only": "Chỉ nội dung",
|
||||
"voice-mirror": "Trả lời bằng giọng nói (khi người dùng gửi giọng nói)",
|
||||
"voice-always":
|
||||
"Luôn luôn có thể gửi phản hồi bằng giọng nói (gửi kèm âm thanh trong mỗi phản hồi).",
|
||||
"toast-disconnect-failed": "Không thể ngắt kết nối bot.",
|
||||
"toast-reconnect-failed": "Không thể kết nối lại với trình bot.",
|
||||
"toast-voice-failed": "Không thể cập nhật chế độ giọng nói.",
|
||||
"toast-approve-failed": "Không thể xác nhận tài khoản người dùng.",
|
||||
"toast-deny-failed": "Không thể từ chối yêu cầu của người dùng.",
|
||||
"toast-revoke-failed": "Không thể thu hồi quyền truy cập cho người dùng.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Chờ phê duyệt",
|
||||
"pending-description":
|
||||
"Người dùng đang chờ xác nhận. So sánh mã ghép đôi được hiển thị ở đây với mã hiển thị trong cuộc trò chuyện Telegram của họ.",
|
||||
"approved-title": "Người dùng đã được phê duyệt",
|
||||
"approved-description":
|
||||
"Người dùng đã được chấp thuận để trò chuyện với bot của bạn.",
|
||||
user: "Người dùng",
|
||||
"pairing-code": "Mã ghép",
|
||||
"no-pending": "Không có yêu cầu nào đang chờ xử lý.",
|
||||
"no-approved": "Không có người dùng được xác nhận",
|
||||
unknown: "Không xác định",
|
||||
approve: "Chấp thuận",
|
||||
deny: "Từ chối",
|
||||
revoke: "Thu hồi",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "欢迎使用",
|
||||
getStarted: "开始",
|
||||
welcome: "欢迎",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM 偏好",
|
||||
@@ -48,7 +48,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "工作区名称",
|
||||
user: "用户",
|
||||
selection: "模型选择",
|
||||
save: "保存更改",
|
||||
saving: "保存中...",
|
||||
@@ -60,6 +59,11 @@ const TRANSLATIONS = {
|
||||
search: "搜索",
|
||||
username_requirements:
|
||||
"用户名必须为 2-32 个字符,以小写字母开头,只能包含小写字母、数字、下划线、连字符和句点。",
|
||||
on: "关于",
|
||||
none: "没有",
|
||||
stopped: "停止",
|
||||
loading: "正在加载…",
|
||||
refresh: "重新开始;更新",
|
||||
},
|
||||
settings: {
|
||||
title: "设置",
|
||||
@@ -97,6 +101,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "您的账户",
|
||||
"import-item": "进口商品",
|
||||
},
|
||||
channels: "频道",
|
||||
"available-channels": {
|
||||
telegram: "电报",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -177,15 +185,18 @@ const TRANSLATIONS = {
|
||||
title: "聊天模式",
|
||||
chat: {
|
||||
title: "聊天",
|
||||
"desc-start": "将提供 LLM 的一般知识",
|
||||
and: "和",
|
||||
"desc-end": "找到的文档上下文的答案。",
|
||||
description:
|
||||
"将提供答案,利用LLM的通用知识和提供的文档内容<b>和</b>。您需要使用@agent命令来使用工具。",
|
||||
},
|
||||
query: {
|
||||
title: "查询",
|
||||
"desc-start": "将会提供答案",
|
||||
only: "仅当",
|
||||
"desc-end": "找到文档上下文时。",
|
||||
description:
|
||||
"将在找到文档上下文时,仅提供答案 <b>。您需要使用 @agent 命令来使用工具。",
|
||||
},
|
||||
automatic: {
|
||||
title: "自动",
|
||||
description:
|
||||
"如果模型和提供者都支持原生工具调用,则会自动使用这些工具。<br />如果不支持原生工具调用,您需要使用 `@agent` 命令来使用工具。",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -288,11 +299,6 @@ const TRANSLATIONS = {
|
||||
title: "生成图表",
|
||||
description: "使默认代理能够从提供的数据或聊天中生成各种类型的图表。",
|
||||
},
|
||||
save: {
|
||||
title: "生成并保存文件到浏览器",
|
||||
description:
|
||||
"使默认代理能够生成并写入文件,这些文件可以保存并在你的浏览器中下载。",
|
||||
},
|
||||
web: {
|
||||
title: "实时网络搜索和浏览",
|
||||
description:
|
||||
@@ -305,6 +311,134 @@ const TRANSLATIONS = {
|
||||
},
|
||||
default_skill:
|
||||
"默认情况下,这项技能已启用。但是,如果您不想让该技能被代理使用,您可以将其禁用。",
|
||||
filesystem: {
|
||||
title: "文件系统访问",
|
||||
description:
|
||||
"允许您的代理能够读取、写入、搜索和管理指定目录中的文件。 支持文件编辑、目录导航和内容搜索功能。",
|
||||
learnMore: "了解更多关于如何使用这项技能的信息。",
|
||||
configuration: "配置",
|
||||
readActions: "阅读操作",
|
||||
writeActions: "编写操作",
|
||||
warning:
|
||||
"访问文件系统可能存在风险,因为它可能修改或删除文件。在启用之前,请务必查阅<link>文档</link>。",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "读取文件",
|
||||
description: "读取文件内容(包括文本、代码、PDF、图像等)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "读取多个文件",
|
||||
description: "同时读取多个文件",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "目录",
|
||||
description: "列出文件夹中的文件和目录",
|
||||
},
|
||||
"search-files": {
|
||||
title: "搜索文件",
|
||||
description: "按文件名或内容搜索文件",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "获取文件信息",
|
||||
description: "获取有关文件的详细元数据",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "编辑文件",
|
||||
description: "对文本文件进行基于行的编辑。",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "创建目录",
|
||||
description: "创建新的目录",
|
||||
},
|
||||
"move-file": {
|
||||
title: "移动/重命名文件",
|
||||
description: "移动或重命名文件和目录",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "复制文件",
|
||||
description: "复制文件和目录",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "创建文本文件",
|
||||
description: "创建新的文本文件,或覆盖现有的文本文件。",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "文档创建",
|
||||
description:
|
||||
"允许您的代理创建二进制文档格式,例如PowerPoint演示文稿、Excel电子表格、Word文档和PDF文件。文件可以直接从聊天窗口下载。",
|
||||
configuration: "可用的文件类型",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "文本文件",
|
||||
description:
|
||||
"创建包含任何内容和扩展名的文本文件(如 .txt、.md、.json、.csv 等)。",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint 演示文稿",
|
||||
description: "创建新的幻灯片演示文稿,包括幻灯片、标题和项目符号。",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF 文档",
|
||||
description:
|
||||
"使用 Markdown 或纯文本,并进行基本的排版,创建 PDF 文档。",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel电子表格",
|
||||
description: "创建包含表格数据、工作表和样式的 Excel 文档。",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Word 文档",
|
||||
description: "创建包含基本样式和格式的 Word 文档",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 服务器",
|
||||
"loading-from-config": "从配置文件加载 MCP 服务器",
|
||||
"learn-more": "了解更多关于 MCP 服务器的信息。",
|
||||
"no-servers-found": "未找到任何 MCP 服务器",
|
||||
"tool-warning": "为了获得最佳性能,建议禁用不必要的工具,以节省上下文。",
|
||||
"stop-server": "停止 MCP 服务器",
|
||||
"start-server": "启动 MCP 服务器",
|
||||
"delete-server": "删除 MCP 服务器",
|
||||
"tool-count-warning":
|
||||
"这个 MCP 服务器启用了 <b> 工具,这些工具会在每次聊天中使用上下文信息。</b> 建议禁用不需要的工具,以节省上下文。<br />",
|
||||
"startup-command": "启动命令",
|
||||
command: "命令",
|
||||
arguments: "争论",
|
||||
"not-running-warning":
|
||||
"这个 MCP 服务器目前处于停止状态,可能是因为在启动时出现了错误或被手动停止。",
|
||||
"tool-call-arguments": "工具调用的参数",
|
||||
"tools-enabled": "工具已启用",
|
||||
},
|
||||
settings: {
|
||||
title: "代理技能设置",
|
||||
"max-tool-calls": {
|
||||
title: "每个回复的最大请求次数",
|
||||
description:
|
||||
"单个代理可以使用的最大工具数量,用于生成单个响应。 这样可以防止工具调用数量过多,从而避免无限循环。",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "智能技能选择",
|
||||
"beta-badge": "β 版本",
|
||||
description:
|
||||
"实现无限工具和按查询减少高达 80% 的 Token 使用量——AnythingLLM 能够自动选择最合适的技能,以应对每个提示。",
|
||||
"max-tools": {
|
||||
title: "麦克斯工具",
|
||||
description:
|
||||
"可以选取的工具的最大数量,用于每个查询。我们建议将此值设置为较高的值,以便在处理大型上下文模型时。",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL 连接器",
|
||||
description:
|
||||
"让您的代理能够利用 SQL 来回答您的问题,只需连接到各种 SQL 数据库提供商即可。",
|
||||
},
|
||||
default_skill:
|
||||
"默认情况下,这项技能已启用。但是,如果您不想让该技能被代理使用,您可以将其禁用。",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -641,7 +775,6 @@ const TRANSLATIONS = {
|
||||
select_all: "全选",
|
||||
deselect_all: "取消全选",
|
||||
remove_selected: "移除所选",
|
||||
costs: "*嵌入时一次性费用",
|
||||
save_embed: "保存并嵌入",
|
||||
"total-documents_one": "{{count}} 文件",
|
||||
"total-documents_other": "{{count}} 类型的文件",
|
||||
@@ -736,7 +869,6 @@ const TRANSLATIONS = {
|
||||
see_less: "查看更多",
|
||||
see_more: "查看更多",
|
||||
tools: "工具",
|
||||
browse: "浏览",
|
||||
text_size_label: "字体大小",
|
||||
select_model: "选择型号",
|
||||
sources: "来源",
|
||||
@@ -749,7 +881,6 @@ const TRANSLATIONS = {
|
||||
edit: "编辑",
|
||||
publish: "出版",
|
||||
stop_generating: "停止生成回复",
|
||||
pause_tts_speech_message: "暂停消息的语音合成(TTS)功能",
|
||||
slash_commands: "快捷命令",
|
||||
agent_skills: "代理人技能",
|
||||
manage_agent_skills: "管理代理人技能",
|
||||
@@ -758,6 +889,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "开始代理会",
|
||||
use_agent_session_to_use_tools:
|
||||
"您可以通过在提示词的开头使用'@agent'来启动与代理的聊天,从而使用聊天工具。",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "该型号希望进行通话。",
|
||||
approve: "批准",
|
||||
reject: "拒绝",
|
||||
always_allow: "请务必留出 {{skillName}}",
|
||||
tool_call_was_approved: "工具使用申请已获得批准。",
|
||||
tool_call_was_rejected: "请求获取工具已被拒绝。",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "编辑帐户",
|
||||
@@ -905,6 +1044,79 @@ const TRANSLATIONS = {
|
||||
"你目前还没有分配到任何工作区。\n请联系你的管理员请求访问一个工作区。",
|
||||
goToWorkspace: '前往 "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram 机器人",
|
||||
description:
|
||||
"将您的 AnythingLLM 实例与 Telegram 连接起来,这样您就可以从任何设备与您的工作空间进行聊天。",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "第一步:创建您的 Telegram 机器人",
|
||||
description:
|
||||
"打开 Telegram 上的 @BotFather,发送 `/newbot` 到 <code>@BotFather</code>,按照提示操作,并复制 API 令牌。",
|
||||
"open-botfather": "启动 BotFather",
|
||||
"instruction-1": "1. 打开链接或扫描二维码",
|
||||
"instruction-2":
|
||||
"2. 将 <code>/newbot</code> 发送给 <code>@BotFather</code>",
|
||||
"instruction-3": "3. 为您的机器人选择一个名称和用户名",
|
||||
"instruction-4": "4. 复制您收到的 API 令牌",
|
||||
},
|
||||
step2: {
|
||||
title: "步骤 2:连接您的机器人",
|
||||
description:
|
||||
"将您从 @BotFather 获得的 API 令牌粘贴到指定位置,并选择一个默认的工作区,以便您的机器人可以进行对话。",
|
||||
"bot-token": "机器人代币",
|
||||
"default-workspace": "默认工作区",
|
||||
"no-workspace": "目前没有可用的工作空间。将会创建一个新的工作空间。",
|
||||
connecting: "正在连接...",
|
||||
"connect-bot": "连接机器人",
|
||||
},
|
||||
security: {
|
||||
title: "推荐的安全设置",
|
||||
description: "为了进一步增强安全性,请在 @BotFather 中配置这些设置。",
|
||||
"disable-groups": "— 阻止机器人加入群组",
|
||||
"disable-inline": "— 阻止机器人被用于内联搜索",
|
||||
"obscure-username":
|
||||
"使用一个不显眼的机器人用户名,以降低其被发现的可能性。",
|
||||
},
|
||||
"toast-enter-token": "请您输入一个机器人令牌。",
|
||||
"toast-connect-failed": "未能连接机器人。",
|
||||
},
|
||||
connected: {
|
||||
status: "连接",
|
||||
"status-disconnected": "未连接—— 令牌可能已过期或无效",
|
||||
"placeholder-token": "粘贴新的机器人令牌...",
|
||||
reconnect: "重新连接",
|
||||
workspace: "工作空间",
|
||||
"bot-link": "机器人链接",
|
||||
"voice-response": "语音响应",
|
||||
disconnecting: "断开连接...",
|
||||
disconnect: "断开",
|
||||
"voice-text-only": "仅提供文字",
|
||||
"voice-mirror": "回声(当用户发送语音时,会以语音形式回复)",
|
||||
"voice-always": "请务必在回复中添加语音(发送音频)。",
|
||||
"toast-disconnect-failed": "未能成功断开机器人。",
|
||||
"toast-reconnect-failed": "机器人连接失败。",
|
||||
"toast-voice-failed": "无法更新语音模式。",
|
||||
"toast-approve-failed": "未能批准用户。",
|
||||
"toast-deny-failed": "未能拒绝用户请求。",
|
||||
"toast-revoke-failed": "未能撤销用户权限。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "待审批",
|
||||
"pending-description":
|
||||
"等待验证的用户。请将此处显示的配对代码与他们在 Telegram 聊天中显示的配对代码进行匹配。",
|
||||
"approved-title": "已批准的用户",
|
||||
"approved-description": "已获得批准,可以与您的机器人进行对话的用户。",
|
||||
user: "用户",
|
||||
"pairing-code": "配对代码",
|
||||
"no-pending": "目前没有待处理的请求",
|
||||
"no-approved": "未批准的用户",
|
||||
unknown: "未知",
|
||||
approve: "批准",
|
||||
deny: "否认",
|
||||
revoke: "撤销",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
const TRANSLATIONS = {
|
||||
onboarding: {
|
||||
home: {
|
||||
title: "歡迎使用",
|
||||
getStarted: "開始使用",
|
||||
welcome: "歡迎",
|
||||
},
|
||||
llm: {
|
||||
title: "LLM 偏好",
|
||||
@@ -48,7 +48,6 @@ const TRANSLATIONS = {
|
||||
},
|
||||
common: {
|
||||
"workspaces-name": "工作區名稱",
|
||||
user: "使用者",
|
||||
selection: "模型選擇",
|
||||
saving: "儲存中...",
|
||||
save: "儲存變更",
|
||||
@@ -60,6 +59,11 @@ const TRANSLATIONS = {
|
||||
search: "搜尋",
|
||||
username_requirements:
|
||||
"使用者名稱必須為 2-32 個字元,以小寫字母開頭,且只能包含小寫字母、數字、底線、連字號和句點。",
|
||||
on: "關於",
|
||||
none: "沒有",
|
||||
stopped: "停止",
|
||||
loading: "載入",
|
||||
refresh: "重新整理",
|
||||
},
|
||||
settings: {
|
||||
title: "系統設定",
|
||||
@@ -97,6 +101,10 @@ const TRANSLATIONS = {
|
||||
"your-account": "您的帳戶",
|
||||
"import-item": "匯入項目",
|
||||
},
|
||||
channels: "頻道",
|
||||
"available-channels": {
|
||||
telegram: "電訊",
|
||||
},
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
@@ -169,15 +177,18 @@ const TRANSLATIONS = {
|
||||
title: "對話模式",
|
||||
chat: {
|
||||
title: "對話",
|
||||
"desc-start": "會結合 LLM 的一般知識",
|
||||
and: "以及",
|
||||
"desc-end": "已找到的文件內容來回答。",
|
||||
description:
|
||||
"將提供答案,並利用 LLM 的通用知識和相關文件內容。您需要使用 @agent 命令來使用工具。",
|
||||
},
|
||||
query: {
|
||||
title: "查詢",
|
||||
"desc-start": "會",
|
||||
only: "只",
|
||||
"desc-end": "在找到文件內容時回答。",
|
||||
description:
|
||||
"將提供答案,但僅在確認文件內容時.<b>您需要使用 `@agent` 命令來使用工具。",
|
||||
},
|
||||
automatic: {
|
||||
title: "自動",
|
||||
description:
|
||||
"如果模型和供應商支援原生工具調用,則系統會自動使用這些工具。<br />如果原生工具調用不受支援,您需要使用 `@agent` 命令來使用工具。",
|
||||
},
|
||||
},
|
||||
history: {
|
||||
@@ -279,10 +290,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"讓預設智慧代理人能夠根據提供的資料或對話中給定的資料來產生各種圖表。",
|
||||
},
|
||||
save: {
|
||||
title: "產生並儲存檔案",
|
||||
description: "讓預設智慧代理人產生並寫入檔案,之後可儲存到電腦。",
|
||||
},
|
||||
web: {
|
||||
title: "網頁搜尋",
|
||||
description:
|
||||
@@ -294,6 +301,133 @@ const TRANSLATIONS = {
|
||||
"讓您的智慧代理人能夠利用 SQL 查詢來回答您的問題,只需連接到不同的 SQL 資料庫提供者即可。",
|
||||
},
|
||||
default_skill: "這項技能預設為啟用;若不希望智慧代理人使用,也可以停用。",
|
||||
filesystem: {
|
||||
title: "檔案系統存取",
|
||||
description:
|
||||
"允許您的代理程式在指定目錄中讀取、寫入、搜尋和管理檔案。支援檔案編輯、目錄導航和內容搜尋功能。",
|
||||
learnMore: "了解更多關於如何運用這項技能的資訊",
|
||||
configuration: "設定",
|
||||
readActions: "閱讀行動",
|
||||
writeActions: "撰寫動作",
|
||||
warning:
|
||||
"訪問檔案系統可能存在風險,因為它可能會修改或刪除檔案。在啟用之前,請務必查閱相關<link>文件</link>。",
|
||||
skills: {
|
||||
"read-text-file": {
|
||||
title: "開啟檔案",
|
||||
description: "閱讀檔案內容(包括文字、程式碼、PDF 文件、圖片等)",
|
||||
},
|
||||
"read-multiple-files": {
|
||||
title: "閱讀多個檔案",
|
||||
description: "同時讀取多個檔案",
|
||||
},
|
||||
"list-directory": {
|
||||
title: "名錄索引",
|
||||
description: "列出指定資料夾中的檔案和目錄",
|
||||
},
|
||||
"search-files": {
|
||||
title: "搜尋檔案",
|
||||
description: "按檔案名稱或內容來搜尋",
|
||||
},
|
||||
"get-file-info": {
|
||||
title: "取得檔案資訊",
|
||||
description: "獲取關於檔案的詳細元數據",
|
||||
},
|
||||
"edit-file": {
|
||||
title: "編輯檔案",
|
||||
description: "能夠對文字檔案進行行別編輯。",
|
||||
},
|
||||
"create-directory": {
|
||||
title: "建立資料夾",
|
||||
description: "建立新的資料夾",
|
||||
},
|
||||
"move-file": {
|
||||
title: "移動/更名檔案",
|
||||
description: "移動或更名檔案和資料夾",
|
||||
},
|
||||
"copy-file": {
|
||||
title: "複製檔案",
|
||||
description: "複製檔案和目錄",
|
||||
},
|
||||
"write-text-file": {
|
||||
title: "撰寫文字檔案",
|
||||
description: "建立新的文字檔,或覆蓋現有的文字檔。",
|
||||
},
|
||||
},
|
||||
},
|
||||
createFiles: {
|
||||
title: "文件建立",
|
||||
description:
|
||||
"允許您的代理創建二元文件格式,例如PowerPoint簡報、Excel電子表格、Word文件和PDF文件。 文件可以直接從聊天窗口下載。",
|
||||
configuration: "可用的文件類型",
|
||||
skills: {
|
||||
"create-text-file": {
|
||||
title: "文字檔",
|
||||
description:
|
||||
"能夠創建包含任何內容和檔案擴展名(例如:.txt、.md、.json、.csv 等)的文字檔案。",
|
||||
},
|
||||
"create-pptx": {
|
||||
title: "PowerPoint 簡報",
|
||||
description: "創建新的 PowerPoint 簡報,包含幻燈片、標題和要點",
|
||||
},
|
||||
"create-pdf": {
|
||||
title: "PDF 文件",
|
||||
description:
|
||||
"能夠從 Markdown 或純文字檔案中,使用基本的格式設定,創建 PDF 文件。",
|
||||
},
|
||||
"create-xlsx": {
|
||||
title: "Excel 試算表",
|
||||
description: "建立包含表格資料、工作表和樣式的 Excel 文件",
|
||||
},
|
||||
"create-docx": {
|
||||
title: "Word 格式的文件",
|
||||
description: "建立包含基本樣式和格式的 Word 文件",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 伺服器",
|
||||
"loading-from-config": "從設定檔中載入 MCP 伺服器",
|
||||
"learn-more": "了解更多關於 MCP 伺服器的資訊。",
|
||||
"no-servers-found": "未找到任何 MCP 伺服器",
|
||||
"tool-warning": "為了獲得最佳效能,建議關閉不必要的工具,以節省資源。",
|
||||
"stop-server": "停止 MCP 伺服器",
|
||||
"start-server": "啟動 MCP 伺服器",
|
||||
"delete-server": "刪除 MCP 伺服器",
|
||||
"tool-count-warning":
|
||||
"這個 MCP 伺服器已啟用 <b> 工具,這些工具會消耗聊天中的語境 </b>。建議停用不需要的工具,以節省語境。",
|
||||
"startup-command": "啟動指令",
|
||||
command: "指令",
|
||||
arguments: "辯論",
|
||||
"not-running-warning":
|
||||
"這個 MCP 伺服器目前處於停止狀態,可能是因為已停止運作,或是啟動時出現錯誤。",
|
||||
"tool-call-arguments": "工具呼叫的參數",
|
||||
"tools-enabled": "已啟用工具",
|
||||
},
|
||||
settings: {
|
||||
title: "代理人技能設定",
|
||||
"max-tool-calls": {
|
||||
title: "每次回應的最大工具呼叫次數",
|
||||
description:
|
||||
"這設定了代理可以串聯使用的最大工具數量,以確保每次回應只會呼叫有限的工具,並避免無限循環。",
|
||||
},
|
||||
"intelligent-skill-selection": {
|
||||
title: "智能技能選擇",
|
||||
"beta-badge": "β 版本",
|
||||
description:
|
||||
"啟用無限多個工具,並將每個查詢的 token 使用量最多降低 80% — AnythingLLM 能夠自動選擇最適合的技能,以處理每一個提示。",
|
||||
"max-tools": {
|
||||
title: "馬克斯工具",
|
||||
description:
|
||||
"可選取的工具的最大數量,適用於每個查詢。我們建議將此值設定為較高的值,以適用於較大的模型。",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL 連接器",
|
||||
description:
|
||||
"讓您的智慧代理人能夠利用 SQL 查詢來回答您的問題,只需連接到不同的 SQL 資料庫提供者即可。",
|
||||
},
|
||||
default_skill: "這項技能預設為啟用;若不希望智慧代理人使用,也可以停用。",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -551,7 +685,6 @@ const TRANSLATIONS = {
|
||||
select_all: "全選",
|
||||
deselect_all: "取消全選",
|
||||
remove_selected: "移除選擇的項目",
|
||||
costs: "*嵌入僅會計費一次",
|
||||
save_embed: "儲存並嵌入",
|
||||
"total-documents_one": "{{count}} 文件",
|
||||
"total-documents_other": "{{count}} 文件",
|
||||
@@ -646,7 +779,6 @@ const TRANSLATIONS = {
|
||||
see_less: "顯示較少",
|
||||
see_more: "查看更多",
|
||||
tools: "工具",
|
||||
browse: "瀏覽",
|
||||
text_size_label: "文字大小",
|
||||
select_model: "選擇模型",
|
||||
sources: "來源",
|
||||
@@ -659,7 +791,6 @@ const TRANSLATIONS = {
|
||||
edit: "編輯",
|
||||
publish: "發佈",
|
||||
stop_generating: "停止產生回應",
|
||||
pause_tts_speech_message: "暫停語音合成的訊息",
|
||||
slash_commands: "斜線指令",
|
||||
agent_skills: "智慧代理人技能",
|
||||
manage_agent_skills: "管理智慧代理人技能",
|
||||
@@ -668,6 +799,14 @@ const TRANSLATIONS = {
|
||||
start_agent_session: "開始智慧代理人工作階段",
|
||||
use_agent_session_to_use_tools:
|
||||
"若要在對話中使用工具,請在提示詞開頭加上 '@agent',即可開始智慧代理人工作階段。",
|
||||
agent_invocation: {
|
||||
model_wants_to_call: "模型想要撥打電話",
|
||||
approve: "批准",
|
||||
reject: "拒絕",
|
||||
always_allow: "請務必確保 {{skillName}}",
|
||||
tool_call_was_approved: "工具請求已獲得批准。",
|
||||
tool_call_was_rejected: "請求已遭拒絕",
|
||||
},
|
||||
},
|
||||
profile_settings: {
|
||||
edit_account: "編輯帳戶",
|
||||
@@ -898,6 +1037,79 @@ const TRANSLATIONS = {
|
||||
"您目前尚未被分配到任何工作區。\n請聯絡您的管理員以申請工作區的存取權限。",
|
||||
goToWorkspace: '前往 "{{workspace}}"',
|
||||
},
|
||||
telegram: {
|
||||
title: "Telegram 機器人",
|
||||
description:
|
||||
"將您的 AnythingLLM 實例連接到 Telegram,以便您可以在任何裝置上與您的工作空間進行對話。",
|
||||
setup: {
|
||||
step1: {
|
||||
title: "第一步:建立您的 Telegram 機器人",
|
||||
description:
|
||||
'在 Telegram 中開啟 @BotFather,將 "<code>/newbot" 訊息發送至 <code>@BotFather</code>,按照指示操作,並複製 API 令牌。',
|
||||
"open-botfather": "開啟 BotFather",
|
||||
"instruction-1": "1. 點擊連結或掃描 QR 碼",
|
||||
"instruction-2":
|
||||
"2. 將 <code>/newbot</code> 傳送至 <code>@BotFather</code>",
|
||||
"instruction-3": "3. 為您的機器人選擇一個名稱和使用者名稱。",
|
||||
"instruction-4": "4. 複製您收到的 API 令牌",
|
||||
},
|
||||
step2: {
|
||||
title: "步驟 2:連接您的機器人",
|
||||
description:
|
||||
"請將您從 @BotFather 處獲得的 API 令牌複製並貼上,然後選擇一個預設的工作空間,讓您的機器人與其對話。",
|
||||
"bot-token": "機器人代幣",
|
||||
"default-workspace": "預設工作空間",
|
||||
"no-workspace": "目前沒有可用的工作空間。將會創建一個新的工作空間。",
|
||||
connecting: "正在連接...",
|
||||
"connect-bot": "連線機器人",
|
||||
},
|
||||
security: {
|
||||
title: "建議的安全設定",
|
||||
description: "為了額外保障,請在 @BotFather 中設定這些選項。",
|
||||
"disable-groups": "— 阻止自動程式加入群組",
|
||||
"disable-inline": "— 阻止機器人被用於內嵌式搜尋",
|
||||
"obscure-username":
|
||||
"使用一個不顯眼的機器人帳號名稱,以降低被發現的機會。",
|
||||
},
|
||||
"toast-enter-token": "請輸入機器人憑證。",
|
||||
"toast-connect-failed": "無法連接機器人。",
|
||||
},
|
||||
connected: {
|
||||
status: "連接",
|
||||
"status-disconnected": "無法連接 — 可能是 token 已經過期或無效",
|
||||
"placeholder-token": "黏貼新的機器人代碼...",
|
||||
reconnect: "重新建立聯繫",
|
||||
workspace: "工作空間",
|
||||
"bot-link": "機器人連結",
|
||||
"voice-response": "語音回應",
|
||||
disconnecting: "斷線...",
|
||||
disconnect: "斷開連接",
|
||||
"voice-text-only": "僅提供文字",
|
||||
"voice-mirror": "語音回覆 (使用者發送語音時,系統會回覆語音)",
|
||||
"voice-always": "請務必在回覆中加入語音 (發送音訊)。",
|
||||
"toast-disconnect-failed": "未能成功斷開機器人。",
|
||||
"toast-reconnect-failed": "無法重新連線機器人。",
|
||||
"toast-voice-failed": "無法更新語音模式。",
|
||||
"toast-approve-failed": "無法驗證使用者。",
|
||||
"toast-deny-failed": "未能阻止使用者。",
|
||||
"toast-revoke-failed": "未能取消使用者權限。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "待審核",
|
||||
"pending-description":
|
||||
"等待驗證的使用者。請將這裡顯示的配對碼與他們在 Telegram 聊天中顯示的配對碼對齊。",
|
||||
"approved-title": "已授權的使用者",
|
||||
"approved-description": "已獲得批准,可以與您的機器人進行對話的使用者。",
|
||||
user: "使用者",
|
||||
"pairing-code": "編碼組合",
|
||||
"no-pending": "目前沒有待處理的請求",
|
||||
"no-approved": "目前沒有已授權的使用者",
|
||||
unknown: "未知的",
|
||||
approve: "批准",
|
||||
deny: "拒絕",
|
||||
revoke: "撤銷",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default TRANSLATIONS;
|
||||
|
||||
@@ -372,6 +372,15 @@ const router = createBrowserRouter([
|
||||
return { element: <ManagerRoute Component={MobileConnections} /> };
|
||||
},
|
||||
},
|
||||
{
|
||||
path: "/settings/external-connections/telegram",
|
||||
lazy: async () => {
|
||||
const { default: TelegramBotSettings } = await import(
|
||||
"@/pages/GeneralSettings/Connections/TelegramBot"
|
||||
);
|
||||
return { element: <AdminRoute Component={TelegramBotSettings} /> };
|
||||
},
|
||||
},
|
||||
// Catch-all route for 404s
|
||||
{
|
||||
path: "*",
|
||||
|
||||
BIN
frontend/src/media/agents/file-system.png
Normal file
BIN
frontend/src/media/agents/file-system.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 160 KiB |
21
frontend/src/models/agentSkillWhitelist.js
Normal file
21
frontend/src/models/agentSkillWhitelist.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders } from "@/utils/request";
|
||||
|
||||
const AgentSkillWhitelist = {
|
||||
/**
|
||||
* Add a skill to the whitelist
|
||||
* @param {string} skillName - The skill name to whitelist
|
||||
* @returns {Promise<{success: boolean, error?: string}>}
|
||||
*/
|
||||
addToWhitelist: async function (skillName) {
|
||||
return fetch(`${API_BASE}/agent-skills/whitelist/add`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ skillName }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => ({ success: false, error: e.message }));
|
||||
},
|
||||
};
|
||||
|
||||
export default AgentSkillWhitelist;
|
||||
26
frontend/src/models/files.js
Normal file
26
frontend/src/models/files.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders } from "@/utils/request";
|
||||
|
||||
const StorageFiles = {
|
||||
/**
|
||||
* Download a file from the server
|
||||
* @param {string} filename - The filename to download
|
||||
* @returns {Promise<Blob|null>}
|
||||
*/
|
||||
download: async function (storageFilename) {
|
||||
return await fetch(
|
||||
`${API_BASE}/agent-skills/generated-files/${encodeURIComponent(storageFilename)}`,
|
||||
{ headers: baseHeaders() }
|
||||
)
|
||||
.then((res) => {
|
||||
if (!res.ok) throw new Error("Failed to download file");
|
||||
return res.blob();
|
||||
})
|
||||
.catch((e) => {
|
||||
console.error("Download failed:", e);
|
||||
return null;
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default StorageFiles;
|
||||
@@ -71,6 +71,27 @@ const MCPServers = {
|
||||
error: e.message,
|
||||
}));
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle a tool's suppression status for an MCP server
|
||||
* @param {string} serverName - The name of the MCP server
|
||||
* @param {string} toolName - The name of the tool to toggle
|
||||
* @param {boolean} enabled - Whether the tool should be enabled (true) or suppressed (false)
|
||||
* @returns {Promise<{success: boolean, error: string | null, suppressedTools: string[]}>}
|
||||
*/
|
||||
toggleTool: async (serverName, toolName, enabled) => {
|
||||
return await fetch(`${API_BASE}/mcp-servers/toggle-tool`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ serverName, toolName, enabled }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => ({
|
||||
success: false,
|
||||
error: e.message,
|
||||
suppressedTools: [],
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export default MCPServers;
|
||||
|
||||
@@ -833,6 +833,36 @@ const System = {
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if the filesystem-agent skill is available.
|
||||
* The filesystem-agent skill is only available when running in a Docker container.
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
isFileSystemAgentAvailable: async function () {
|
||||
return fetch(`${API_BASE}/agent-skills/filesystem-agent/is-available`, {
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.then((res) => res?.available ?? false)
|
||||
.catch(() => false);
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if the create-files-agent skill is available.
|
||||
* The create-files-agent skill is only available when running in a Docker container.
|
||||
* @returns {Promise<boolean>}
|
||||
*/
|
||||
isCreateFilesAgentAvailable: async function () {
|
||||
return fetch(`${API_BASE}/agent-skills/create-files-agent/is-available`, {
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.then((res) => res?.available ?? false)
|
||||
.catch(() => false);
|
||||
},
|
||||
|
||||
experimentalFeatures: {
|
||||
liveSync: LiveDocumentSync,
|
||||
agentPlugins: AgentPlugins,
|
||||
|
||||
176
frontend/src/models/telegram.js
Normal file
176
frontend/src/models/telegram.js
Normal file
@@ -0,0 +1,176 @@
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders } from "@/utils/request";
|
||||
|
||||
const Telegram = {
|
||||
/**
|
||||
* Get the current Telegram bot configuration.
|
||||
* @returns {Promise<{config: object|null, error: string|null}>}
|
||||
*/
|
||||
getConfig: async function () {
|
||||
return await fetch(`${API_BASE}/telegram/config`, {
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { config: null, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Connect and start the Telegram bot with given token and workspace.
|
||||
* @param {string} botToken - The bot API token from BotFather.
|
||||
* @param {string} workspaceSlug - The default workspace slug.
|
||||
* @returns {Promise<{success: boolean, bot_username: string|null, error: string|null}>}
|
||||
*/
|
||||
connect: async function (botToken, workspaceSlug) {
|
||||
return await fetch(`${API_BASE}/telegram/connect`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({
|
||||
bot_token: botToken,
|
||||
default_workspace: workspaceSlug,
|
||||
}),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Disconnect and stop the Telegram bot.
|
||||
* @returns {Promise<{success: boolean, error: string|null}>}
|
||||
*/
|
||||
disconnect: async function () {
|
||||
return await fetch(`${API_BASE}/telegram/disconnect`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the current bot connection status.
|
||||
* @returns {Promise<{active: boolean, bot_username: string|null}>}
|
||||
*/
|
||||
status: async function () {
|
||||
return await fetch(`${API_BASE}/telegram/status`, {
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { active: false, bot_username: null };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get pending pairing requests.
|
||||
* @returns {Promise<{users: Array}>}
|
||||
*/
|
||||
getPendingUsers: async function () {
|
||||
return await fetch(`${API_BASE}/telegram/pending-users`, {
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { users: [] };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get approved users list.
|
||||
* @returns {Promise<{users: Array}>}
|
||||
*/
|
||||
getApprovedUsers: async function () {
|
||||
return await fetch(`${API_BASE}/telegram/approved-users`, {
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { users: [] };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Approve a pending user.
|
||||
* @param {string} chatId
|
||||
* @returns {Promise<{success: boolean, error: string|null}>}
|
||||
*/
|
||||
approveUser: async function (chatId) {
|
||||
return await fetch(`${API_BASE}/telegram/approve-user`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ chatId }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Deny a pending user.
|
||||
* @param {string} chatId
|
||||
* @returns {Promise<{success: boolean, error: string|null}>}
|
||||
*/
|
||||
denyUser: async function (chatId) {
|
||||
return await fetch(`${API_BASE}/telegram/deny-user`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ chatId }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Update the Telegram bot configuration.
|
||||
* @param {object} updates - Config fields to update (e.g. voice_response_mode).
|
||||
* @returns {Promise<{success: boolean, error: string|null}>}
|
||||
*/
|
||||
updateConfig: async function (updates) {
|
||||
return await fetch(`${API_BASE}/telegram/update-config`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify(updates),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Revoke an approved user.
|
||||
* @param {string} chatId
|
||||
* @returns {Promise<{success: boolean, error: string|null}>}
|
||||
*/
|
||||
revokeUser: async function (chatId) {
|
||||
return await fetch(`${API_BASE}/telegram/revoke-user`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ chatId }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default Telegram;
|
||||
@@ -569,6 +569,27 @@ const Workspace = {
|
||||
return response;
|
||||
},
|
||||
|
||||
/**
|
||||
* Checks if the agent command is available for a workspace
|
||||
* by checking if the workspace's agent provider supports native tool calling.
|
||||
*
|
||||
* This can be model specific or enabled via ENV flag.
|
||||
* @param {string} slug - workspace slug
|
||||
* @returns {Promise<{showAgentCommand: boolean}>}
|
||||
*/
|
||||
agentCommandAvailable: async function (slug = null) {
|
||||
if (!slug) return { showAgentCommand: true };
|
||||
return await fetch(
|
||||
`${API_BASE}/workspace/${slug}/is-agent-command-available`,
|
||||
{ headers: baseHeaders() }
|
||||
)
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { showAgentCommand: true };
|
||||
});
|
||||
},
|
||||
|
||||
threads: WorkspaceThread,
|
||||
};
|
||||
|
||||
|
||||
215
frontend/src/pages/Admin/Agents/AgentSkillSettings/index.jsx
Normal file
215
frontend/src/pages/Admin/Agents/AgentSkillSettings/index.jsx
Normal file
@@ -0,0 +1,215 @@
|
||||
import { useModal } from "@/hooks/useModal";
|
||||
import ModalWrapper from "@/components/ModalWrapper";
|
||||
import { CircleNotch, SlidersHorizontal, X } from "@phosphor-icons/react";
|
||||
import { useEffect, useMemo, useState } from "react";
|
||||
import Toggle from "@/components/lib/Toggle";
|
||||
import System from "@/models/system";
|
||||
import debounce from "lodash.debounce";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function AgentSkillSettings() {
|
||||
const { isOpen, openModal, closeModal } = useModal();
|
||||
return (
|
||||
<>
|
||||
<button
|
||||
type="button"
|
||||
onClick={openModal}
|
||||
className={`w-10 h-10 flex items-center justify-center light:border-black/10 light:border-solid border-none light:!border rounded-lg transition-colors outline-none bg-transparent hover:bg-theme-bg-secondary`}
|
||||
>
|
||||
<SlidersHorizontal size={24} className={`text-theme-text-secondary`} />
|
||||
</button>
|
||||
<AgentSkillSettingsModal isOpen={isOpen} closeModal={closeModal} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function AgentSkillSettingsModal({ isOpen, closeModal }) {
|
||||
const { t } = useTranslation();
|
||||
if (!isOpen) return null;
|
||||
|
||||
return (
|
||||
<ModalWrapper isOpen={isOpen}>
|
||||
<div className="w-[500px] bg-theme-bg-sidebar px-6 py-4 rounded-lg flex flex-col items-center justify-between relative shadow-lg border border-white/10">
|
||||
<div className="w-full flex items-center justify-between">
|
||||
<div className="text-white text-left font-medium text-lg">
|
||||
{t("agent.settings.title")}
|
||||
</div>
|
||||
<button
|
||||
onClick={closeModal}
|
||||
className="text-white opacity-60 hover:text-white hover:opacity-100 border-none outline-none"
|
||||
>
|
||||
<X size={20} />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col w-full">
|
||||
<div className="flex flex-col gap-y-5 w-full">
|
||||
<MaxToolCallStack />
|
||||
<div className="border-b border-white/10 h-[1px] w-full" />
|
||||
<AgentSkillReranker />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ModalWrapper>
|
||||
);
|
||||
}
|
||||
|
||||
function MaxToolCallStack() {
|
||||
const { t } = useTranslation();
|
||||
const [maxCallStack, setMaxCallStack] = useState(10);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
const debouncedUpdateMaxCallStack = useMemo(
|
||||
() =>
|
||||
debounce(async (newMaxCallStack) => {
|
||||
await System.updateSystem({
|
||||
AgentSkillMaxToolCalls: newMaxCallStack.toString(),
|
||||
});
|
||||
}, 800),
|
||||
[]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
System.keys()
|
||||
.then((res) => {
|
||||
setMaxCallStack(parseInt(res.AgentSkillMaxToolCalls));
|
||||
})
|
||||
.finally(() => {
|
||||
setLoading(false);
|
||||
});
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
return () => debouncedUpdateMaxCallStack.cancel();
|
||||
}, [debouncedUpdateMaxCallStack]);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2 mt-4">
|
||||
<div className="flex items-center gap-x-4 mt-2">
|
||||
<div className="flex flex-col gap-y-1 flex-1">
|
||||
<label className="block text-md font-medium text-white">
|
||||
{t("agent.settings.max-tool-calls.title")}
|
||||
</label>
|
||||
<p className="text-xs text-white/60">
|
||||
{t("agent.settings.max-tool-calls.description")}
|
||||
</p>
|
||||
</div>
|
||||
<input
|
||||
type="number"
|
||||
name="agentSkillMaxToolCalls"
|
||||
min={1}
|
||||
value={maxCallStack}
|
||||
disabled={loading}
|
||||
onChange={(e) => {
|
||||
if (e.target.value < 1) return;
|
||||
debouncedUpdateMaxCallStack(e.target.value);
|
||||
setMaxCallStack(parseInt(e.target.value));
|
||||
}}
|
||||
onWheel={(e) => e.target.blur()}
|
||||
className="border border-white/10 bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-[80px] p-2.5 text-center"
|
||||
placeholder="10"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function AgentSkillReranker() {
|
||||
const { t } = useTranslation();
|
||||
const [enabled, setEnabled] = useState(false);
|
||||
const [maxTools, setMaxTools] = useState(15);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
const debouncedUpdateMaxTools = useMemo(
|
||||
() =>
|
||||
debounce(async (newMaxToolsCount) => {
|
||||
await System.updateSystem({
|
||||
AgentSkillRerankerTopN: newMaxToolsCount.toString(),
|
||||
});
|
||||
}, 800),
|
||||
[]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
System.keys()
|
||||
.then((res) => {
|
||||
setEnabled(res.AgentSkillRerankerEnabled);
|
||||
setMaxTools(parseInt(res.AgentSkillRerankerTopN));
|
||||
})
|
||||
.finally(() => {
|
||||
setLoading(false);
|
||||
});
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
return () => debouncedUpdateMaxTools.cancel();
|
||||
}, [debouncedUpdateMaxTools]);
|
||||
|
||||
async function toggleEnabled(enabled) {
|
||||
setEnabled(enabled);
|
||||
await System.updateSystem({
|
||||
AgentSkillRerankerEnabled: String(enabled),
|
||||
});
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-4">
|
||||
<div className="flex items-center gap-x-1">
|
||||
<label className="block text-md font-medium text-white flex items-center gap-x-1">
|
||||
{t("agent.settings.intelligent-skill-selection.title")}{" "}
|
||||
<i className="ml-1 text-xs text-white pl-2 bg-blue-500/40 rounded-md px-2 py-0.5">
|
||||
{t("agent.settings.intelligent-skill-selection.beta-badge")}
|
||||
</i>
|
||||
</label>
|
||||
</div>
|
||||
<div className="flex items-center gap-x-4">
|
||||
<p className="text-xs text-white/60">
|
||||
{t("agent.settings.intelligent-skill-selection.description")}
|
||||
</p>
|
||||
{loading ? (
|
||||
<CircleNotch
|
||||
size={16}
|
||||
className="shrink-0 animate-spin text-theme-text-primary"
|
||||
/>
|
||||
) : (
|
||||
<Toggle
|
||||
size="lg"
|
||||
name="agentSkillRerankerEnabled"
|
||||
enabled={enabled}
|
||||
onChange={toggleEnabled}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
{enabled && (
|
||||
<div className="flex items-center gap-x-4">
|
||||
<div className="flex flex-col gap-y-1 flex-1">
|
||||
<label className="block text-md font-medium text-white">
|
||||
{t("agent.settings.intelligent-skill-selection.max-tools.title")}
|
||||
</label>
|
||||
<p className="text-xs text-white/60">
|
||||
{t(
|
||||
"agent.settings.intelligent-skill-selection.max-tools.description"
|
||||
)}
|
||||
</p>
|
||||
</div>
|
||||
<input
|
||||
type="number"
|
||||
name="agentSkillRerankerTopN"
|
||||
min={10}
|
||||
value={maxTools}
|
||||
onChange={(e) => {
|
||||
if (e.target.value < 10) return;
|
||||
debouncedUpdateMaxTools(e.target.value);
|
||||
setMaxTools(parseInt(e.target.value));
|
||||
}}
|
||||
onWheel={(e) => e.target.blur()}
|
||||
className="border border-white/10 bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg focus:outline-primary-button active:outline-primary-button outline-none block w-[80px] p-2.5 text-center"
|
||||
placeholder="15"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
187
frontend/src/pages/Admin/Agents/CreateFileSkillPanel/index.jsx
Normal file
187
frontend/src/pages/Admin/Agents/CreateFileSkillPanel/index.jsx
Normal file
@@ -0,0 +1,187 @@
|
||||
import React, { useEffect, useState, useRef } from "react";
|
||||
import Toggle, { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import {
|
||||
FilePpt,
|
||||
FileXls,
|
||||
FileDoc,
|
||||
FilePdf,
|
||||
FileText,
|
||||
CircleNotch,
|
||||
} from "@phosphor-icons/react";
|
||||
import Admin from "@/models/admin";
|
||||
|
||||
const getCreateFileSkills = (t) => [
|
||||
{
|
||||
name: "create-text-file",
|
||||
title: t("agent.skill.createFiles.skills.create-text-file.title"),
|
||||
description: t(
|
||||
"agent.skill.createFiles.skills.create-text-file.description"
|
||||
),
|
||||
icon: FileText,
|
||||
},
|
||||
{
|
||||
name: "create-pptx-presentation",
|
||||
title: t("agent.skill.createFiles.skills.create-pptx.title"),
|
||||
description: t("agent.skill.createFiles.skills.create-pptx.description"),
|
||||
icon: FilePpt,
|
||||
},
|
||||
{
|
||||
name: "create-pdf-file",
|
||||
title: t("agent.skill.createFiles.skills.create-pdf.title"),
|
||||
description: t("agent.skill.createFiles.skills.create-pdf.description"),
|
||||
icon: FilePdf,
|
||||
},
|
||||
{
|
||||
name: "create-excel-file",
|
||||
title: t("agent.skill.createFiles.skills.create-xlsx.title"),
|
||||
description: t("agent.skill.createFiles.skills.create-xlsx.description"),
|
||||
icon: FileXls,
|
||||
},
|
||||
{
|
||||
name: "create-docx-file",
|
||||
title: t("agent.skill.createFiles.skills.create-docx.title"),
|
||||
description: t("agent.skill.createFiles.skills.create-docx.description"),
|
||||
icon: FileDoc,
|
||||
},
|
||||
];
|
||||
|
||||
export default function CreateFileSkillPanel({
|
||||
title,
|
||||
skill,
|
||||
toggleSkill,
|
||||
enabled = false,
|
||||
disabled = false,
|
||||
image,
|
||||
icon,
|
||||
setHasChanges,
|
||||
hasChanges = false,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [disabledSkills, setDisabledSkills] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const prevHasChanges = useRef(hasChanges);
|
||||
const skills = getCreateFileSkills(t);
|
||||
|
||||
useEffect(() => {
|
||||
setLoading(true);
|
||||
Admin.systemPreferencesByFields(["disabled_create_files_skills"])
|
||||
.then((res) =>
|
||||
setDisabledSkills(res?.settings?.disabled_create_files_skills ?? [])
|
||||
)
|
||||
.catch(() => setDisabledSkills([]))
|
||||
.finally(() => setLoading(false));
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevHasChanges.current === true && hasChanges === false) {
|
||||
Admin.systemPreferencesByFields(["disabled_create_files_skills"])
|
||||
.then((res) =>
|
||||
setDisabledSkills(res?.settings?.disabled_create_files_skills ?? [])
|
||||
)
|
||||
.catch(() => {});
|
||||
}
|
||||
prevHasChanges.current = hasChanges;
|
||||
}, [hasChanges]);
|
||||
|
||||
function toggleFileSkill(skillName) {
|
||||
setHasChanges(true);
|
||||
setDisabledSkills((prev) =>
|
||||
prev.includes(skillName)
|
||||
? prev.filter((s) => s !== skillName)
|
||||
: [...prev, skillName]
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="p-2">
|
||||
<div className="flex flex-col gap-y-[18px] max-w-[500px]">
|
||||
<div className="flex w-full justify-between items-center">
|
||||
<div className="flex items-center gap-x-2">
|
||||
{icon &&
|
||||
React.createElement(icon, {
|
||||
size: 24,
|
||||
color: "var(--theme-text-primary)",
|
||||
weight: "bold",
|
||||
})}
|
||||
<label
|
||||
htmlFor="name"
|
||||
className="text-theme-text-primary text-md font-bold"
|
||||
>
|
||||
{title}
|
||||
</label>
|
||||
</div>
|
||||
<Toggle
|
||||
size="lg"
|
||||
enabled={enabled}
|
||||
disabled={disabled}
|
||||
onChange={() => toggleSkill(skill)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<img src={image} alt={title} className="w-full rounded-md" />
|
||||
<p className="text-theme-text-secondary text-opacity-60 text-xs font-medium">
|
||||
{t("agent.skill.createFiles.description")}
|
||||
</p>
|
||||
|
||||
{enabled && (
|
||||
<>
|
||||
<input
|
||||
name="system::disabled_create_files_skills"
|
||||
type="hidden"
|
||||
value={disabledSkills.join(",")}
|
||||
/>
|
||||
<div className="flex flex-col mt-2 gap-y-2">
|
||||
<p className="text-theme-text-primary font-semibold text-sm">
|
||||
{t("agent.skill.createFiles.configuration")}
|
||||
</p>
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-4">
|
||||
<CircleNotch
|
||||
size={24}
|
||||
className="animate-spin text-theme-text-primary"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{skills.map((fileSkill) => (
|
||||
<SkillRow
|
||||
key={fileSkill.name}
|
||||
skill={fileSkill}
|
||||
disabled={disabledSkills.includes(fileSkill.name)}
|
||||
onToggle={() => toggleFileSkill(fileSkill.name)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillRow({ skill, disabled, onToggle }) {
|
||||
const Icon = skill.icon;
|
||||
return (
|
||||
<div
|
||||
className={`flex items-center justify-between p-2 rounded-lg border ${
|
||||
disabled
|
||||
? "bg-theme-bg-secondary/30 border-theme-sidebar-border/30"
|
||||
: "bg-theme-bg-secondary/50 border-theme-sidebar-border/50"
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<Icon size={22} className="text-slate-100 shrink-0" />
|
||||
<div className="flex flex-col">
|
||||
<span className="text-sm font-medium text-slate-100">
|
||||
{skill.title}
|
||||
</span>
|
||||
<span className="text-xs text-slate-100/50">{skill.description}</span>
|
||||
</div>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
330
frontend/src/pages/Admin/Agents/FileSystemSkillPanel/index.jsx
Normal file
330
frontend/src/pages/Admin/Agents/FileSystemSkillPanel/index.jsx
Normal file
@@ -0,0 +1,330 @@
|
||||
import React, { useEffect, useState, useRef } from "react";
|
||||
import Toggle, { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { Link } from "react-router-dom";
|
||||
import { useTranslation, Trans } from "react-i18next";
|
||||
import {
|
||||
Warning,
|
||||
File,
|
||||
Files,
|
||||
PencilSimple,
|
||||
FloppyDisk,
|
||||
FolderPlus,
|
||||
FolderOpen,
|
||||
ArrowsLeftRight,
|
||||
MagnifyingGlass,
|
||||
Info,
|
||||
CircleNotch,
|
||||
Copy,
|
||||
} from "@phosphor-icons/react";
|
||||
import Admin from "@/models/admin";
|
||||
|
||||
const getFileSystemSubSkills = (t) => {
|
||||
return [
|
||||
{
|
||||
name: "filesystem-read-text-file",
|
||||
title: t("agent.skill.filesystem.skills.read-text-file.title"),
|
||||
description: t(
|
||||
"agent.skill.filesystem.skills.read-text-file.description"
|
||||
),
|
||||
icon: File,
|
||||
category: "read",
|
||||
},
|
||||
{
|
||||
name: "filesystem-read-multiple-files",
|
||||
title: t("agent.skill.filesystem.skills.read-multiple-files.title"),
|
||||
description: t(
|
||||
"agent.skill.filesystem.skills.read-multiple-files.description"
|
||||
),
|
||||
icon: Files,
|
||||
category: "read",
|
||||
},
|
||||
{
|
||||
name: "filesystem-list-directory",
|
||||
title: t("agent.skill.filesystem.skills.list-directory.title"),
|
||||
description: t(
|
||||
"agent.skill.filesystem.skills.list-directory.description"
|
||||
),
|
||||
icon: FolderOpen,
|
||||
category: "read",
|
||||
},
|
||||
{
|
||||
name: "filesystem-search-files",
|
||||
title: t("agent.skill.filesystem.skills.search-files.title"),
|
||||
description: t("agent.skill.filesystem.skills.search-files.description"),
|
||||
icon: MagnifyingGlass,
|
||||
category: "read",
|
||||
},
|
||||
{
|
||||
name: "filesystem-get-file-info",
|
||||
title: t("agent.skill.filesystem.skills.get-file-info.title"),
|
||||
description: t("agent.skill.filesystem.skills.get-file-info.description"),
|
||||
icon: Info,
|
||||
category: "read",
|
||||
},
|
||||
{
|
||||
name: "filesystem-write-text-file",
|
||||
title: t("agent.skill.filesystem.skills.write-text-file.title"),
|
||||
description: t(
|
||||
"agent.skill.filesystem.skills.write-text-file.description"
|
||||
),
|
||||
icon: FloppyDisk,
|
||||
category: "write",
|
||||
},
|
||||
{
|
||||
name: "filesystem-edit-file",
|
||||
title: t("agent.skill.filesystem.skills.edit-file.title"),
|
||||
description: t("agent.skill.filesystem.skills.edit-file.description"),
|
||||
icon: PencilSimple,
|
||||
category: "write",
|
||||
},
|
||||
{
|
||||
name: "filesystem-create-directory",
|
||||
title: t("agent.skill.filesystem.skills.create-directory.title"),
|
||||
description: t(
|
||||
"agent.skill.filesystem.skills.create-directory.description"
|
||||
),
|
||||
icon: FolderPlus,
|
||||
category: "write",
|
||||
},
|
||||
{
|
||||
name: "filesystem-copy-file",
|
||||
title: t("agent.skill.filesystem.skills.copy-file.title"),
|
||||
description: t("agent.skill.filesystem.skills.copy-file.description"),
|
||||
icon: Copy,
|
||||
category: "write",
|
||||
},
|
||||
{
|
||||
name: "filesystem-move-file",
|
||||
title: t("agent.skill.filesystem.skills.move-file.title"),
|
||||
description: t("agent.skill.filesystem.skills.move-file.description"),
|
||||
icon: ArrowsLeftRight,
|
||||
category: "write",
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
export default function FileSystemSkillPanel({
|
||||
title,
|
||||
skill,
|
||||
toggleSkill,
|
||||
enabled = false,
|
||||
disabled = false,
|
||||
image,
|
||||
icon,
|
||||
setHasChanges,
|
||||
hasChanges = false,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [disabledSubSkills, setDisabledSubSkills] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const prevHasChanges = useRef(hasChanges);
|
||||
const FILESYSTEM_SUB_SKILLS = getFileSystemSubSkills(t);
|
||||
|
||||
useEffect(() => {
|
||||
setLoading(true);
|
||||
Admin.systemPreferencesByFields(["disabled_filesystem_skills"])
|
||||
.then((res) =>
|
||||
setDisabledSubSkills(res?.settings?.disabled_filesystem_skills ?? [])
|
||||
)
|
||||
.catch(() => setDisabledSubSkills([]))
|
||||
.finally(() => setLoading(false));
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevHasChanges.current === true && hasChanges === false) {
|
||||
Admin.systemPreferencesByFields(["disabled_filesystem_skills"])
|
||||
.then((res) =>
|
||||
setDisabledSubSkills(res?.settings?.disabled_filesystem_skills ?? [])
|
||||
)
|
||||
.catch(() => {});
|
||||
}
|
||||
prevHasChanges.current = hasChanges;
|
||||
}, [hasChanges]);
|
||||
|
||||
function toggleSubSkill(subSkillName) {
|
||||
setHasChanges(true);
|
||||
setDisabledSubSkills((prev) => {
|
||||
if (prev.includes(subSkillName)) {
|
||||
return prev.filter((s) => s !== subSkillName);
|
||||
}
|
||||
return [...prev, subSkillName];
|
||||
});
|
||||
}
|
||||
const readSkills = FILESYSTEM_SUB_SKILLS.filter((s) => s.category === "read");
|
||||
const writeSkills = FILESYSTEM_SUB_SKILLS.filter(
|
||||
(s) => s.category === "write"
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="p-2">
|
||||
<div className="flex flex-col gap-y-[18px] max-w-[500px]">
|
||||
<div className="flex w-full justify-between items-center">
|
||||
<div className="flex items-center gap-x-2">
|
||||
{icon &&
|
||||
React.createElement(icon, {
|
||||
size: 24,
|
||||
color: "var(--theme-text-primary)",
|
||||
weight: "bold",
|
||||
})}
|
||||
<label
|
||||
htmlFor="name"
|
||||
className="text-theme-text-primary text-md font-bold"
|
||||
>
|
||||
{title}
|
||||
</label>
|
||||
</div>
|
||||
<Toggle
|
||||
size="lg"
|
||||
enabled={enabled}
|
||||
disabled={disabled}
|
||||
onChange={() => toggleSkill(skill)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<img src={image} alt={title} className="w-full rounded-md" />
|
||||
<WarningBanner />
|
||||
<div className="flex flex-col gap-y-1">
|
||||
<p className="text-theme-text-secondary text-opacity-60 text-xs font-medium">
|
||||
{t("agent.skill.filesystem.description")}
|
||||
</p>
|
||||
<Link
|
||||
to="/docs/guides/agent-skills/filesystem-agent"
|
||||
target="_blank"
|
||||
className="text-sky-400 hover:text-sky-500 text-xs font-medium underline"
|
||||
>
|
||||
{t("agent.skill.filesystem.learnMore")} →
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
{enabled && (
|
||||
<>
|
||||
<input
|
||||
name="system::disabled_filesystem_skills"
|
||||
type="hidden"
|
||||
value={disabledSubSkills.join(",")}
|
||||
/>
|
||||
<div className="flex flex-col mt-2 gap-y-4">
|
||||
<div className="flex justify-between items-center">
|
||||
<p className="text-theme-text-primary font-semibold text-sm">
|
||||
{t("agent.skill.filesystem.configuration")}
|
||||
</p>
|
||||
</div>
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-4">
|
||||
<CircleNotch
|
||||
size={24}
|
||||
className="animate-spin text-theme-text-primary"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-theme-text-secondary text-xs font-medium uppercase tracking-wide">
|
||||
{t("agent.skill.filesystem.readActions")}
|
||||
</p>
|
||||
<div className="flex flex-col gap-y-1">
|
||||
{readSkills.map((subSkill) => (
|
||||
<SubSkillRow
|
||||
key={subSkill.name}
|
||||
subSkill={subSkill}
|
||||
disabled={disabledSubSkills.includes(subSkill.name)}
|
||||
onToggle={() => toggleSubSkill(subSkill.name)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-theme-text-secondary text-xs font-medium uppercase tracking-wide flex items-center gap-x-1">
|
||||
<Warning
|
||||
size={12}
|
||||
className="text-orange-400"
|
||||
weight="fill"
|
||||
/>
|
||||
{t("agent.skill.filesystem.writeActions")}
|
||||
</p>
|
||||
<div className="flex flex-col gap-y-1">
|
||||
{writeSkills.map((subSkill) => (
|
||||
<SubSkillRow
|
||||
key={subSkill.name}
|
||||
subSkill={subSkill}
|
||||
disabled={disabledSubSkills.includes(subSkill.name)}
|
||||
onToggle={() => toggleSubSkill(subSkill.name)}
|
||||
isWriteOperation
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function WarningBanner() {
|
||||
return (
|
||||
<div className="flex items-start gap-x-2.5 p-2.5 bg-orange-800/20 light:bg-orange-800/10 text-orange-400 light:text-orange-600 border border-orange-400/30 rounded-lg items-center">
|
||||
<Warning size={20} className="flex-shrink-0 mt-0.5" weight="fill" />
|
||||
<p className="text-xs font-medium">
|
||||
<Trans
|
||||
i18nKey="agent.skill.filesystem.warning"
|
||||
components={{
|
||||
link: (
|
||||
<Link
|
||||
to="/docs/guides/agent-skills/filesystem-agent"
|
||||
target="_blank"
|
||||
className="underline hover:text-orange-300 light:hover:text-orange-700"
|
||||
/>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SubSkillRow({ subSkill, disabled, onToggle, isWriteOperation }) {
|
||||
const Icon = subSkill.icon;
|
||||
return (
|
||||
<div
|
||||
className={`flex items-center justify-between p-2 rounded-lg border ${
|
||||
disabled
|
||||
? "bg-theme-bg-secondary/30 border-theme-sidebar-border/30"
|
||||
: isWriteOperation
|
||||
? "bg-orange-900/10 border-orange-400/20 light:bg-orange-800/10 text-orange-400 light:text-orange-600"
|
||||
: "bg-theme-bg-secondary/50 border-theme-sidebar-border/50"
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<Icon
|
||||
size={16}
|
||||
className={
|
||||
disabled
|
||||
? "text-theme-text-secondary/50"
|
||||
: isWriteOperation
|
||||
? "text-orange-400"
|
||||
: "text-theme-text-primary"
|
||||
}
|
||||
weight="bold"
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<span
|
||||
className={`text-sm font-medium ${disabled ? "text-theme-text-secondary/50" : "text-theme-text-primary"}`}
|
||||
>
|
||||
{subSkill.title}
|
||||
</span>
|
||||
<span
|
||||
className={`text-xs ${disabled ? "text-theme-text-secondary/40" : "text-theme-text-secondary"}`}
|
||||
>
|
||||
{subSkill.description}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
import React, { useState, useEffect, useRef } from "react";
|
||||
import showToast from "@/utils/toast";
|
||||
import { CaretDown, Gear } from "@phosphor-icons/react";
|
||||
import { CaretDown, Gear, Warning } from "@phosphor-icons/react";
|
||||
import MCPLogo from "@/media/agents/mcp-logo.svg";
|
||||
import { titleCase } from "text-case";
|
||||
import truncate from "truncate";
|
||||
import MCPServers from "@/models/mcpServers";
|
||||
import pluralize from "pluralize";
|
||||
import { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { useTranslation, Trans } from "react-i18next";
|
||||
|
||||
function ManageServerMenu({ server, toggleServer, onDelete }) {
|
||||
const { t } = useTranslation();
|
||||
const [open, setOpen] = useState(false);
|
||||
const [running, setRunning] = useState(server.running);
|
||||
const menuRef = useRef(null);
|
||||
@@ -85,7 +86,9 @@ function ManageServerMenu({ server, toggleServer, onDelete }) {
|
||||
className="border-none flex items-center rounded-lg gap-x-2 hover:bg-theme-action-menu-item-hover py-1.5 px-2 transition-colors duration-200 w-full text-left"
|
||||
>
|
||||
<span className="text-sm">
|
||||
{running ? "Stop MCP Server" : "Start MCP Server"}
|
||||
{running
|
||||
? t("agent.mcp.stop-server")
|
||||
: t("agent.mcp.start-server")}
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
@@ -93,7 +96,7 @@ function ManageServerMenu({ server, toggleServer, onDelete }) {
|
||||
onClick={deleteServer}
|
||||
className="border-none flex items-center rounded-lg gap-x-2 hover:bg-theme-action-menu-item-hover py-1.5 px-2 transition-colors duration-200 w-full text-left"
|
||||
>
|
||||
<span className="text-sm">Delete MCP Server</span>
|
||||
<span className="text-sm">{t("agent.mcp.delete-server")}</span>
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
@@ -101,11 +104,26 @@ function ManageServerMenu({ server, toggleServer, onDelete }) {
|
||||
);
|
||||
}
|
||||
|
||||
export default function ServerPanel({ server, toggleServer, onDelete }) {
|
||||
export default function ServerPanel({
|
||||
server,
|
||||
toggleServer,
|
||||
onDelete,
|
||||
onToggleTool,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const suppressedTools = server.config?.anythingllm?.suppressedTools || [];
|
||||
const enabledToolCount = server.tools.filter(
|
||||
(tool) => !suppressedTools.includes(tool.name)
|
||||
).length;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="p-2">
|
||||
<div className="flex flex-col gap-y-[18px] max-w-[800px]">
|
||||
<ToolCountWarningBanner
|
||||
server={server}
|
||||
enabledToolCount={enabledToolCount}
|
||||
/>
|
||||
<div className="flex w-full justify-between">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<img src={MCPLogo} className="w-6 h-6 light:invert" />
|
||||
@@ -114,8 +132,8 @@ export default function ServerPanel({ server, toggleServer, onDelete }) {
|
||||
</label>
|
||||
{server.tools.length > 0 && (
|
||||
<p className="text-theme-text-secondary text-sm">
|
||||
{server.tools.length} {pluralize("tool", server.tools.length)}{" "}
|
||||
available
|
||||
{enabledToolCount}/{server.tools.length}{" "}
|
||||
{t("agent.mcp.tools-enabled")}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
@@ -128,25 +146,52 @@ export default function ServerPanel({ server, toggleServer, onDelete }) {
|
||||
</div>
|
||||
<RenderServerConfig config={server.config} />
|
||||
<RenderServerStatus server={server} />
|
||||
<RenderServerTools tools={server.tools} />
|
||||
<RenderServerTools
|
||||
serverName={server.name}
|
||||
tools={server.tools}
|
||||
suppressedTools={suppressedTools}
|
||||
onToggleTool={onToggleTool}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
function ToolCountWarningBanner({ server, enabledToolCount }) {
|
||||
if (server.tools.length <= 10) return null;
|
||||
if (enabledToolCount <= 10) return null;
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
|
||||
<Warning className="h-5 w-5 text-yellow-500 shrink-0" weight="fill" />
|
||||
<p className="text-yellow-500 text-sm">
|
||||
<Trans
|
||||
i18nKey={`agent.mcp.tool-count-warning`}
|
||||
values={{ count: enabledToolCount }}
|
||||
components={{ b: <b />, br: <br /> }}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function RenderServerConfig({ config = null }) {
|
||||
const { t } = useTranslation();
|
||||
if (!config) return null;
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-theme-text-primary text-sm">Startup Command</p>
|
||||
<p className="text-theme-text-primary text-sm">
|
||||
{t("agent.mcp.startup-command")}
|
||||
</p>
|
||||
<div className="bg-theme-bg-primary rounded-lg p-4">
|
||||
<p className="text-theme-text-secondary text-sm text-left">
|
||||
<span className="font-bold">Command:</span> {config.command}
|
||||
<span className="font-bold">{t("agent.mcp.command")}:</span>{" "}
|
||||
{config.command}
|
||||
</p>
|
||||
<p className="text-theme-text-secondary text-sm text-left">
|
||||
<span className="font-bold">Arguments:</span>{" "}
|
||||
{config.args ? config.args.join(" ") : "None"}
|
||||
<span className="font-bold">{t("agent.mcp.arguments")}:</span>{" "}
|
||||
{config.args ? config.args.join(" ") : t("common.none")}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -154,12 +199,12 @@ function RenderServerConfig({ config = null }) {
|
||||
}
|
||||
|
||||
function RenderServerStatus({ server }) {
|
||||
const { t } = useTranslation();
|
||||
if (server.running || !server.error) return null;
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-theme-text-primary text-sm">
|
||||
This MCP server is not running - it may be stopped or experiencing an
|
||||
error on startup.
|
||||
{t("agent.mcp.not-running-warning")}
|
||||
</p>
|
||||
<div className="bg-theme-bg-primary rounded-lg p-4">
|
||||
<p className="text-red-500 text-sm font-mono">{server.error}</p>
|
||||
@@ -168,41 +213,70 @@ function RenderServerStatus({ server }) {
|
||||
);
|
||||
}
|
||||
|
||||
function RenderServerTools({ tools = [] }) {
|
||||
function RenderServerTools({
|
||||
serverName,
|
||||
tools = [],
|
||||
suppressedTools = [],
|
||||
onToggleTool,
|
||||
}) {
|
||||
if (tools.length === 0) return null;
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{tools.map((tool) => (
|
||||
<ServerTool key={tool.name} tool={tool} />
|
||||
<ServerTool
|
||||
key={tool.name}
|
||||
serverName={serverName}
|
||||
tool={tool}
|
||||
enabled={!suppressedTools.includes(tool.name)}
|
||||
onToggle={onToggleTool}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ServerTool({ tool }) {
|
||||
function ServerTool({ serverName, tool, enabled, onToggle }) {
|
||||
const { t } = useTranslation();
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setOpen(!open)}
|
||||
className="flex flex-col gap-y-2 px-4 py-2 rounded-lg border border-theme-text-secondary"
|
||||
className={`flex flex-col gap-y-2 px-4 py-2 rounded-lg border ${
|
||||
enabled
|
||||
? "border-theme-text-secondary"
|
||||
: "border-theme-text-secondary/50 opacity-60"
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<p className="text-theme-text-primary font-mono font-bold text-sm">
|
||||
<div className="flex items-center gap-x-2 min-w-0 flex-1">
|
||||
<SimpleToggleSwitch
|
||||
size="md"
|
||||
enabled={enabled}
|
||||
onChange={(newEnabled) =>
|
||||
onToggle?.(serverName, tool.name, newEnabled)
|
||||
}
|
||||
/>
|
||||
<p className="text-theme-text-primary font-mono font-bold text-sm shrink-0">
|
||||
{tool.name}
|
||||
</p>
|
||||
{!open && (
|
||||
<p className="text-theme-text-secondary text-sm">
|
||||
{truncate(tool.description, 70)}
|
||||
<p className="text-theme-text-secondary text-sm truncate">
|
||||
{tool.description}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
<div className="border-none text-theme-text-secondary hover:text-cta-button">
|
||||
<CaretDown size={16} />
|
||||
<div className="flex items-center gap-x-3">
|
||||
<div
|
||||
className={`border-none text-theme-text-secondary hover:text-cta-button transition-transform duration-200 ${
|
||||
open ? "rotate-180" : ""
|
||||
}`}
|
||||
>
|
||||
<CaretDown size={16} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{open && (
|
||||
@@ -214,7 +288,7 @@ function ServerTool({ tool }) {
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-theme-text-primary text-sm text-left">
|
||||
Tool call arguments
|
||||
{t("agent.mcp.tool-call-arguments")}
|
||||
</p>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{Object.entries(tool.inputSchema?.properties || {}).map(
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { titleCase } from "text-case";
|
||||
import { BookOpenText, ArrowClockwise } from "@phosphor-icons/react";
|
||||
import { BookOpenText, ArrowClockwise, Warning } from "@phosphor-icons/react";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import MCPLogo from "@/media/agents/mcp-logo.svg";
|
||||
import MCPServers from "@/models/mcpServers";
|
||||
import showToast from "@/utils/toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export function MCPServerHeader({
|
||||
setMcpServers,
|
||||
setSelectedMcpServer,
|
||||
children,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [loadingMcpServers, setLoadingMcpServers] = useState(false);
|
||||
useEffect(() => {
|
||||
async function fetchMCPServers() {
|
||||
@@ -49,7 +52,7 @@ export function MCPServerHeader({
|
||||
<div className="text-theme-text-primary flex items-center justify-between gap-x-2 mt-4">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<img src={MCPLogo} className="w-6 h-6 light:invert" alt="MCP Logo" />
|
||||
<p className="text-lg font-medium">MCP Servers</p>
|
||||
<p className="text-lg font-medium">{t("agent.mcp.title")}</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-x-3">
|
||||
<a
|
||||
@@ -71,7 +74,9 @@ export function MCPServerHeader({
|
||||
className={loadingMcpServers ? "animate-spin" : ""}
|
||||
/>
|
||||
<p className="text-sm">
|
||||
{loadingMcpServers ? "Loading..." : "Refresh"}
|
||||
{loadingMcpServers
|
||||
? `${t("common.loading")}...`
|
||||
: t("common.refresh")}
|
||||
</p>
|
||||
</button>
|
||||
</div>
|
||||
@@ -87,17 +92,18 @@ export function MCPServersList({
|
||||
selectedServer,
|
||||
handleClick,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
if (isLoading) {
|
||||
return (
|
||||
<div className="text-theme-text-secondary text-center text-xs flex flex-col gap-y-2">
|
||||
<p>Loading MCP Servers from configuration file...</p>
|
||||
<p>{t("agent.mcp.loading-from-config")}...</p>
|
||||
<a
|
||||
href="https://docs.anythingllm.com/mcp-compatibility/overview"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-theme-text-secondary underline hover:text-cta-button"
|
||||
>
|
||||
Learn more about MCP Servers.
|
||||
{t("agent.mcp.learn-more")}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
@@ -106,14 +112,14 @@ export function MCPServersList({
|
||||
if (servers.length === 0) {
|
||||
return (
|
||||
<div className="text-theme-text-secondary text-center text-xs flex flex-col gap-y-2">
|
||||
<p>No MCP servers found</p>
|
||||
<p>{t("agent.mcp.no-servers-found")}</p>
|
||||
<a
|
||||
href="https://docs.anythingllm.com/mcp-compatibility/overview"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-theme-text-secondary underline hover:text-cta-button"
|
||||
>
|
||||
Learn more about MCP Servers.
|
||||
{t("agent.mcp.learn-more")}
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
@@ -122,33 +128,60 @@ export function MCPServersList({
|
||||
return (
|
||||
<div className="bg-theme-bg-secondary text-white rounded-xl w-full md:min-w-[360px]">
|
||||
{servers.map((server, index) => (
|
||||
<div
|
||||
<MCPServerItem
|
||||
key={server.name}
|
||||
className={`py-3 px-4 flex items-center justify-between ${
|
||||
index === 0 ? "rounded-t-xl" : ""
|
||||
} ${
|
||||
index === servers.length - 1
|
||||
? "rounded-b-xl"
|
||||
: "border-b border-white/10"
|
||||
} cursor-pointer transition-all duration-300 hover:bg-theme-bg-primary ${
|
||||
selectedServer?.name === server.name
|
||||
? "bg-white/10 light:bg-theme-bg-sidebar"
|
||||
: ""
|
||||
}`}
|
||||
onClick={() => handleClick?.(server)}
|
||||
>
|
||||
<div className="text-sm font-light">
|
||||
{titleCase(server.name.replace(/[_-]/g, " "))}
|
||||
</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<div
|
||||
className={`text-sm text-theme-text-secondary font-medium ${server.running ? "text-green-500" : "text-red-500"}`}
|
||||
>
|
||||
{server.running ? "On" : "Stopped"}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
server={server}
|
||||
isFirst={index === 0}
|
||||
isLast={index === servers.length - 1}
|
||||
isSelected={selectedServer?.name === server.name}
|
||||
handleClick={() => handleClick?.(server)}
|
||||
/>
|
||||
))}
|
||||
<Tooltip
|
||||
id="mcp-server-warning"
|
||||
place="bottom"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs"
|
||||
content={t("agent.mcp.tool-warning")}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function MCPServerItem({ server, isFirst, isLast, isSelected, handleClick }) {
|
||||
const { t } = useTranslation();
|
||||
const suppressedTools = server.config?.anythingllm?.suppressedTools || [];
|
||||
const enabledToolCount = server.tools.length - suppressedTools.length;
|
||||
const showWarning = enabledToolCount > 10;
|
||||
const running = server.running;
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`py-3 px-4 flex items-center justify-between ${
|
||||
isFirst ? "rounded-t-xl" : ""
|
||||
} ${
|
||||
isLast ? "rounded-b-xl" : "border-b border-white/10"
|
||||
} cursor-pointer transition-all duration-300 hover:bg-theme-bg-primary ${
|
||||
isSelected ? "bg-white/10 light:bg-theme-bg-sidebar" : ""
|
||||
}`}
|
||||
onClick={handleClick}
|
||||
>
|
||||
<div className="flex items-center gap-x-2 text-sm font-light">
|
||||
{showWarning && (
|
||||
<Warning
|
||||
data-tooltip-id="mcp-server-warning"
|
||||
className="h-4 w-4 text-yellow-500"
|
||||
/>
|
||||
)}
|
||||
{titleCase(server.name.replace(/[_-]/g, " "))}
|
||||
</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<div
|
||||
className={`text-sm text-theme-text-secondary font-medium ${running ? "text-green-500" : "text-red-500"}`}
|
||||
>
|
||||
{running ? t("common.on") : t("common.stopped")}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,15 @@ const SEARCH_PROVIDERS = [
|
||||
value: "exa-search",
|
||||
logo: ExaIcon,
|
||||
options: (settings) => <ExaSearchOptions settings={settings} />,
|
||||
description: "AI-powered search engine optimized for LLM use cases.",
|
||||
description:
|
||||
"One of the best web search APIs for AI agents with real-time results and full page contents.",
|
||||
},
|
||||
{
|
||||
name: "Perplexity Search",
|
||||
value: "perplexity-search",
|
||||
logo: PerplexitySearchIcon,
|
||||
options: (settings) => <PerplexitySearchOptions settings={settings} />,
|
||||
description: "AI-powered web search using the Perplexity Search API.",
|
||||
},
|
||||
{
|
||||
name: "Perplexity Search",
|
||||
|
||||
@@ -4,6 +4,7 @@ import Sidebar from "@/components/SettingsSidebar";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import Admin from "@/models/admin";
|
||||
import System from "@/models/system";
|
||||
import MCPServers from "@/models/mcpServers";
|
||||
import showToast from "@/utils/toast";
|
||||
import {
|
||||
CaretLeft,
|
||||
@@ -28,6 +29,13 @@ import ServerPanel from "./MCPServers/ServerPanel";
|
||||
import { Link } from "react-router-dom";
|
||||
import paths from "@/utils/paths";
|
||||
import AgentFlows from "@/models/agentFlows";
|
||||
import AgentSkillSettings from "./AgentSkillSettings";
|
||||
|
||||
const IGNORE_CHANGE_SETTINGS = [
|
||||
"agentSkillRerankerEnabled",
|
||||
"agentSkillRerankerTopN",
|
||||
"agentSkillMaxToolCalls",
|
||||
];
|
||||
|
||||
export default function AdminAgents() {
|
||||
const { t } = useTranslation();
|
||||
@@ -50,8 +58,16 @@ export default function AdminAgents() {
|
||||
const [mcpServers, setMcpServers] = useState([]);
|
||||
const [selectedMcpServer, setSelectedMcpServer] = useState(null);
|
||||
|
||||
const [fileSystemAgentAvailable, setFileSystemAgentAvailable] =
|
||||
useState(false);
|
||||
const [createFilesAgentAvailable, setCreateFilesAgentAvailable] =
|
||||
useState(false);
|
||||
|
||||
const defaultSkills = getDefaultSkills(t);
|
||||
const configurableSkills = getConfigurableSkills(t);
|
||||
const configurableSkills = getConfigurableSkills(t, {
|
||||
fileSystemAgentAvailable,
|
||||
createFilesAgentAvailable,
|
||||
});
|
||||
|
||||
// Alert user if they try to leave the page with unsaved changes
|
||||
useEffect(() => {
|
||||
@@ -69,15 +85,26 @@ export default function AdminAgents() {
|
||||
|
||||
useEffect(() => {
|
||||
async function fetchSettings() {
|
||||
const _settings = await System.keys();
|
||||
const _preferences = await Admin.systemPreferencesByFields([
|
||||
"disabled_agent_skills",
|
||||
"default_agent_skills",
|
||||
"imported_agent_skills",
|
||||
"active_agent_flows",
|
||||
const [
|
||||
_settings,
|
||||
_preferences,
|
||||
flowsRes,
|
||||
fsAgentAvailable,
|
||||
createFilesAvailable,
|
||||
] = await Promise.all([
|
||||
System.keys(),
|
||||
Admin.systemPreferencesByFields([
|
||||
"disabled_agent_skills",
|
||||
"default_agent_skills",
|
||||
"imported_agent_skills",
|
||||
"active_agent_flows",
|
||||
]),
|
||||
AgentFlows.listFlows(),
|
||||
System.isFileSystemAgentAvailable(),
|
||||
System.isCreateFilesAgentAvailable(),
|
||||
]);
|
||||
const { flows = [] } = await AgentFlows.listFlows();
|
||||
|
||||
const { flows = [] } = flowsRes;
|
||||
setSettings({ ..._settings, preferences: _preferences.settings } ?? {});
|
||||
setAgentSkills(_preferences.settings?.default_agent_skills ?? []);
|
||||
setDisabledAgentSkills(
|
||||
@@ -86,6 +113,8 @@ export default function AdminAgents() {
|
||||
setImportedSkills(_preferences.settings?.imported_agent_skills ?? []);
|
||||
setActiveFlowIds(_preferences.settings?.active_agent_flows ?? []);
|
||||
setAgentFlows(flows);
|
||||
setFileSystemAgentAvailable(fsAgentAvailable);
|
||||
setCreateFilesAgentAvailable(createFilesAvailable);
|
||||
setLoading(false);
|
||||
}
|
||||
fetchSettings();
|
||||
@@ -234,6 +263,49 @@ export default function AdminAgents() {
|
||||
);
|
||||
};
|
||||
|
||||
const handleMCPToolToggle = async (serverName, toolName, enabled) => {
|
||||
const { success, error, suppressedTools } = await MCPServers.toggleTool(
|
||||
serverName,
|
||||
toolName,
|
||||
enabled
|
||||
);
|
||||
|
||||
if (!success) {
|
||||
showToast(error || "Failed to toggle tool.", "error", { clear: true });
|
||||
return;
|
||||
}
|
||||
|
||||
setMcpServers((prev) =>
|
||||
prev.map((server) => {
|
||||
if (server.name !== serverName) return server;
|
||||
return {
|
||||
...server,
|
||||
config: {
|
||||
...server.config,
|
||||
anythingllm: {
|
||||
...server.config?.anythingllm,
|
||||
suppressedTools,
|
||||
},
|
||||
},
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
setSelectedMcpServer((prev) => {
|
||||
if (!prev || prev.name !== serverName) return prev;
|
||||
return {
|
||||
...prev,
|
||||
config: {
|
||||
...prev.config,
|
||||
anythingllm: {
|
||||
...prev.config?.anythingllm,
|
||||
suppressedTools,
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<div
|
||||
@@ -365,6 +437,7 @@ export default function AdminAgents() {
|
||||
server={selectedMcpServer}
|
||||
toggleServer={toggleMCP}
|
||||
onDelete={handleMCPServerDelete}
|
||||
onToggleTool={handleMCPToolToggle}
|
||||
/>
|
||||
) : selectedFlow ? (
|
||||
<FlowPanel
|
||||
@@ -438,9 +511,10 @@ export default function AdminAgents() {
|
||||
>
|
||||
<form
|
||||
onSubmit={handleSubmit}
|
||||
onChange={() =>
|
||||
!selectedSkill?.imported && !selectedFlow && setHasChanges(true)
|
||||
}
|
||||
onChange={(e) => {
|
||||
if (IGNORE_CHANGE_SETTINGS.includes(e.target.name)) return;
|
||||
if (!selectedSkill?.imported && !selectedFlow) setHasChanges(true);
|
||||
}}
|
||||
ref={formEl}
|
||||
className="flex-1 flex gap-x-6 p-4 mt-10"
|
||||
>
|
||||
@@ -463,11 +537,12 @@ export default function AdminAgents() {
|
||||
|
||||
{/* Skill settings nav - Make this section scrollable */}
|
||||
<div className="flex flex-col min-w-[360px] h-[calc(100vh-90px)]">
|
||||
<div className="flex-none mb-4">
|
||||
<div className="flex-none flex justify-between items-center mb-4">
|
||||
<div className="text-theme-text-primary flex items-center gap-x-2">
|
||||
<Robot size={24} />
|
||||
<p className="text-lg font-medium">Agent Skills</p>
|
||||
</div>
|
||||
<AgentSkillSettings />
|
||||
</div>
|
||||
|
||||
<div className="flex-1 overflow-y-auto pr-2 pb-4">
|
||||
@@ -557,6 +632,7 @@ export default function AdminAgents() {
|
||||
server={selectedMcpServer}
|
||||
toggleServer={toggleMCP}
|
||||
onDelete={handleMCPServerDelete}
|
||||
onToggleTool={handleMCPToolToggle}
|
||||
/>
|
||||
) : selectedFlow ? (
|
||||
<FlowPanel
|
||||
|
||||
@@ -2,18 +2,22 @@ import AgentWebSearchSelection from "./WebSearchSelection";
|
||||
import AgentSQLConnectorSelection from "./SQLConnectorSelection";
|
||||
import GenericSkillPanel from "./GenericSkillPanel";
|
||||
import DefaultSkillPanel from "./DefaultSkillPanel";
|
||||
import FileSystemSkillPanel from "./FileSystemSkillPanel";
|
||||
import CreateFileSkillPanel from "./CreateFileSkillPanel";
|
||||
import {
|
||||
Brain,
|
||||
File,
|
||||
Browser,
|
||||
ChartBar,
|
||||
FileMagnifyingGlass,
|
||||
FolderOpen,
|
||||
FilePlus,
|
||||
} from "@phosphor-icons/react";
|
||||
import RAGImage from "@/media/agents/rag-memory.png";
|
||||
import SummarizeImage from "@/media/agents/view-summarize.png";
|
||||
import ScrapeWebsitesImage from "@/media/agents/scrape-websites.png";
|
||||
import GenerateChartsImage from "@/media/agents/generate-charts.png";
|
||||
import GenerateSaveImages from "@/media/agents/generate-save-files.png";
|
||||
import FileSystemImage from "@/media/agents/file-system.png";
|
||||
|
||||
export const getDefaultSkills = (t) => ({
|
||||
"rag-memory": {
|
||||
@@ -42,15 +46,30 @@ export const getDefaultSkills = (t) => ({
|
||||
},
|
||||
});
|
||||
|
||||
export const getConfigurableSkills = (t) => ({
|
||||
"save-file-to-browser": {
|
||||
title: t("agent.skill.save.title"),
|
||||
description: t("agent.skill.save.description"),
|
||||
component: GenericSkillPanel,
|
||||
skill: "save-file-to-browser",
|
||||
icon: FileMagnifyingGlass,
|
||||
image: GenerateSaveImages,
|
||||
},
|
||||
export const getConfigurableSkills = (
|
||||
t,
|
||||
{ fileSystemAgentAvailable = true, createFilesAgentAvailable = true } = {}
|
||||
) => ({
|
||||
...(fileSystemAgentAvailable && {
|
||||
"filesystem-agent": {
|
||||
title: t("agent.skill.filesystem.title"),
|
||||
description: t("agent.skill.filesystem.description"),
|
||||
component: FileSystemSkillPanel,
|
||||
skill: "filesystem-agent",
|
||||
icon: FolderOpen,
|
||||
image: FileSystemImage,
|
||||
},
|
||||
}),
|
||||
...(createFilesAgentAvailable && {
|
||||
"create-files-agent": {
|
||||
title: t("agent.skill.createFiles.title"),
|
||||
description: t("agent.skill.createFiles.description"),
|
||||
component: CreateFileSkillPanel,
|
||||
skill: "create-files-agent",
|
||||
icon: FilePlus,
|
||||
image: GenerateSaveImages,
|
||||
},
|
||||
}),
|
||||
"create-chart": {
|
||||
title: t("agent.skill.generate.title"),
|
||||
description: t("agent.skill.generate.description"),
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import { TelegramLogo } from "@phosphor-icons/react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function ConnectedBotCard({ config }) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<div className="flex flex-col gap-y-[18px]">
|
||||
<p className="text-base font-semibold text-white light:text-slate-900">
|
||||
Connected Bot
|
||||
</p>
|
||||
<div className="flex items-start gap-x-1 border border-zinc-700 light:border-slate-200 rounded-xl p-3 w-[700px]">
|
||||
<div className="flex items-center justify-center w-9 h-9 rounded-full bg-[#00ADEC] shrink-0">
|
||||
<TelegramLogo className="h-5 w-5 !text-white" weight="fill" />
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-1 ml-1">
|
||||
<p className="text-sm font-semibold text-white light:text-slate-900">
|
||||
@{config.bot_username}
|
||||
</p>
|
||||
<p className="text-xs text-zinc-400 light:text-slate-600">
|
||||
{t("telegram.connected.status")}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
import { useState } from "react";
|
||||
import { CircleNotch } from "@phosphor-icons/react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import showToast from "@/utils/toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
export default function DetailsSection({ config, onDisconnected }) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<div className="flex flex-col gap-y-[18px]">
|
||||
<p className="text-base font-semibold text-white light:text-slate-900">
|
||||
Details
|
||||
</p>
|
||||
<div className="border border-zinc-700 light:border-slate-200 rounded-xl p-4 w-[700px]">
|
||||
<div className="flex flex-col gap-y-4 text-sm">
|
||||
<DetailRow
|
||||
label={t("telegram.connected.workspace")}
|
||||
value={config.default_workspace}
|
||||
/>
|
||||
<DetailRow label="Thread" value={config.active_thread_name} />
|
||||
<DetailRow label="Model" value={config.chat_model} />
|
||||
<DetailRow
|
||||
label={t("telegram.connected.bot-link")}
|
||||
value={
|
||||
<Link
|
||||
to={`https://t.me/${config.bot_username}`}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-blue-400 light:text-blue-500 underline"
|
||||
>
|
||||
t.me/{config.bot_username}
|
||||
</Link>
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<DisconnectButton onDisconnected={onDisconnected} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function DetailRow({ label, value }) {
|
||||
return (
|
||||
<div className="flex items-start justify-between">
|
||||
<span className="font-medium text-white light:text-slate-900">
|
||||
{label}
|
||||
</span>
|
||||
<span className="text-zinc-300 light:text-slate-700">{value}</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function DisconnectButton({ onDisconnected }) {
|
||||
const { t } = useTranslation();
|
||||
const [disconnecting, setDisconnecting] = useState(false);
|
||||
|
||||
async function handleDisconnect() {
|
||||
setDisconnecting(true);
|
||||
const res = await Telegram.disconnect();
|
||||
setDisconnecting(false);
|
||||
|
||||
if (!res.success) {
|
||||
showToast(
|
||||
res.error || t("telegram.connected.toast-disconnect-failed"),
|
||||
"error"
|
||||
);
|
||||
return;
|
||||
}
|
||||
onDisconnected();
|
||||
}
|
||||
|
||||
return (
|
||||
<button
|
||||
onClick={handleDisconnect}
|
||||
disabled={disconnecting}
|
||||
className="flex items-center justify-center gap-x-2 text-sm font-medium bg-zinc-50 light:bg-slate-900 text-zinc-950 light:text-white rounded-lg h-9 px-5 w-fit hover:opacity-90 transition-opacity duration-200 disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{disconnecting ? (
|
||||
<>
|
||||
<CircleNotch className="h-4 w-4 animate-spin" />
|
||||
{t("telegram.connected.disconnecting")}
|
||||
</>
|
||||
) : (
|
||||
t("telegram.connected.disconnect")
|
||||
)}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
import { useState } from "react";
|
||||
import {
|
||||
CircleNotch,
|
||||
Eye,
|
||||
EyeSlash,
|
||||
TelegramLogo,
|
||||
} from "@phosphor-icons/react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import showToast from "@/utils/toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function DisconnectedView({
|
||||
config,
|
||||
onReconnected,
|
||||
newToken,
|
||||
setNewToken,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [reconnecting, setReconnecting] = useState(false);
|
||||
const [showToken, setShowToken] = useState(false);
|
||||
const Icon = showToken ? Eye : EyeSlash;
|
||||
|
||||
async function handleReconnect(e) {
|
||||
e.preventDefault();
|
||||
if (!newToken.trim()) return;
|
||||
setReconnecting(true);
|
||||
const res = await Telegram.connect(
|
||||
newToken.trim(),
|
||||
config.default_workspace
|
||||
);
|
||||
setReconnecting(false);
|
||||
if (!res.success)
|
||||
return showToast(
|
||||
res.error || t("telegram.connected.toast-reconnect-failed"),
|
||||
"error"
|
||||
);
|
||||
|
||||
setNewToken("");
|
||||
const configRes = await Telegram.getConfig();
|
||||
onReconnected(configRes?.config);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-8 mt-8">
|
||||
<div className="flex flex-col gap-y-[18px]">
|
||||
<p className="text-base font-semibold text-white light:text-slate-900">
|
||||
Connected Bot
|
||||
</p>
|
||||
<div className="flex items-start gap-x-1 border border-red-500/30 light:border-red-300 rounded-xl p-3 w-[700px]">
|
||||
<div className="flex items-center justify-center w-9 h-9 rounded-full bg-red-500/20 shrink-0">
|
||||
<TelegramLogo
|
||||
className="h-5 w-5 text-red-400 light:text-red-500"
|
||||
weight="fill"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-1 ml-1">
|
||||
<p className="text-sm font-semibold text-white light:text-slate-900">
|
||||
@{config.bot_username}
|
||||
</p>
|
||||
<p className="text-xs text-red-400 light:text-red-500">
|
||||
{t("telegram.connected.status-disconnected")}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<form
|
||||
onSubmit={handleReconnect}
|
||||
className="flex items-end gap-x-2 w-[700px]"
|
||||
>
|
||||
<div className="bg-zinc-800 light:bg-white light:border light:border-slate-300 h-8 rounded-lg px-3.5 flex items-center gap-x-2 flex-1">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setShowToken(!showToken)}
|
||||
className="text-zinc-400 light:text-slate-500 hover:text-zinc-300 light:hover:text-slate-700 transition-colors shrink-0"
|
||||
>
|
||||
<Icon className="h-4 w-4" />
|
||||
</button>
|
||||
<input
|
||||
type={showToken ? "text" : "password"}
|
||||
value={newToken}
|
||||
onChange={(e) => setNewToken(e.target.value)}
|
||||
placeholder={t("telegram.connected.placeholder-token")}
|
||||
className="bg-transparent flex-1 text-sm text-white light:text-slate-900 placeholder:text-zinc-400 light:placeholder:text-slate-500 outline-none min-w-0"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
type="submit"
|
||||
disabled={reconnecting}
|
||||
className="flex items-center justify-center gap-x-1.5 text-sm font-medium bg-zinc-50 light:bg-slate-900 text-zinc-900 light:text-white rounded-lg h-8 px-5 hover:opacity-90 transition-opacity duration-200 disabled:opacity-50 disabled:cursor-not-allowed whitespace-nowrap"
|
||||
>
|
||||
{reconnecting ? (
|
||||
<CircleNotch className="h-4 w-4 animate-spin" />
|
||||
) : (
|
||||
t("telegram.connected.reconnect")
|
||||
)}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
This code is disabled for now - works fine, but I am not sure we want to enabled this feature.
|
||||
How many people really need a REPLY with voice mode? Even then, we should support on device TTS
|
||||
and more it out the frontend so people can do voice gen without having to pay for it.
|
||||
|
||||
When we do enabled this, we should uncomment this code and remove the disabled comment.
|
||||
|
||||
const getVoiceModeOptions = (t) => {
|
||||
return [
|
||||
{ value: "text_only", label: t("telegram.connected.voice-text-only") },
|
||||
{ value: "mirror", label: t("telegram.connected.voice-mirror") },
|
||||
{ value: "always_voice", label: t("telegram.connected.voice-always") },
|
||||
];
|
||||
};
|
||||
|
||||
function VoiceModeSelector({ config }) {
|
||||
const { t } = useTranslation();
|
||||
const [voiceMode, setVoiceMode] = useState(
|
||||
config.voice_response_mode || "text_only"
|
||||
);
|
||||
|
||||
async function handleVoiceModeChange(e) {
|
||||
const mode = e.target.value;
|
||||
setVoiceMode(mode);
|
||||
const res = await Telegram.updateConfig({ voice_response_mode: mode });
|
||||
if (!res.success) {
|
||||
showToast(
|
||||
res.error || t("telegram.connected.toast-voice-failed"),
|
||||
"error"
|
||||
);
|
||||
setVoiceMode(config.voice_response_mode || "text_only");
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex items-center justify-between">
|
||||
<span className="text-xs text-white">
|
||||
{t("telegram.connected.voice-response")}
|
||||
</span>
|
||||
<select
|
||||
value={voiceMode}
|
||||
onChange={handleVoiceModeChange}
|
||||
className="text-xs text-right bg-transparent text-white rounded-md px-2 py-1 outline-none max-w-[260px]"
|
||||
>
|
||||
{getVoiceModeOptions(t).map((opt) => (
|
||||
<option key={opt.value} value={opt.value}>
|
||||
{opt.label}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
*/
|
||||
@@ -0,0 +1,148 @@
|
||||
import { X, Check } from "@phosphor-icons/react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import showToast from "@/utils/toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function UsersSection({
|
||||
pendingUsers,
|
||||
approvedUsers,
|
||||
fetchUsers,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
|
||||
async function handleApprove(chatId) {
|
||||
const res = await Telegram.approveUser(chatId);
|
||||
if (!res.success) {
|
||||
showToast(
|
||||
res.error || t("telegram.connected.toast-approve-failed"),
|
||||
"error"
|
||||
);
|
||||
return;
|
||||
}
|
||||
fetchUsers();
|
||||
}
|
||||
|
||||
async function handleDeny(chatId) {
|
||||
const res = await Telegram.denyUser(chatId);
|
||||
if (!res.success) {
|
||||
showToast(
|
||||
res.error || t("telegram.connected.toast-deny-failed"),
|
||||
"error"
|
||||
);
|
||||
return;
|
||||
}
|
||||
fetchUsers();
|
||||
}
|
||||
|
||||
async function handleRevoke(chatId) {
|
||||
const res = await Telegram.revokeUser(chatId);
|
||||
if (!res.success) {
|
||||
showToast(
|
||||
res.error || t("telegram.connected.toast-revoke-failed"),
|
||||
"error"
|
||||
);
|
||||
return;
|
||||
}
|
||||
fetchUsers();
|
||||
}
|
||||
|
||||
const hasPending = pendingUsers.length > 0;
|
||||
const hasApproved = approvedUsers.length > 0;
|
||||
if (!hasPending && !hasApproved) return null;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-[18px] w-[700px]">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-base font-semibold text-white light:text-slate-900">
|
||||
Users
|
||||
</p>
|
||||
<p className="text-xs text-zinc-400 light:text-slate-600">
|
||||
{t("telegram.users.pending-description")}
|
||||
</p>
|
||||
</div>
|
||||
<div className="border-t border-zinc-700 light:border-slate-200" />
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{pendingUsers.map((user) => (
|
||||
<UserRow
|
||||
key={user.chatId || user}
|
||||
user={user}
|
||||
isPending
|
||||
onApprove={handleApprove}
|
||||
onDeny={handleDeny}
|
||||
/>
|
||||
))}
|
||||
{approvedUsers.map((user) => (
|
||||
<UserRow
|
||||
key={user.chatId || user}
|
||||
user={user}
|
||||
onRevoke={handleRevoke}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function UserRow({ user, isPending = false, onApprove, onDeny, onRevoke }) {
|
||||
const { t } = useTranslation();
|
||||
const chatId = typeof user === "string" ? user : user.chatId;
|
||||
const username = user.telegramUsername || user.username || null;
|
||||
const firstName = user.firstName || null;
|
||||
const displayName = username
|
||||
? `@${username}`
|
||||
: firstName || t("telegram.users.unknown");
|
||||
const initial = (username || firstName || "?")[0].toUpperCase();
|
||||
const code = user.code;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="flex items-center">
|
||||
<div className="flex items-center gap-x-3 flex-1 min-w-0">
|
||||
<div className="bg-zinc-800 light:bg-slate-300 size-8 rounded-full flex items-center justify-center shrink-0">
|
||||
<span className="text-sm font-semibold text-white light:text-slate-900">
|
||||
{initial}
|
||||
</span>
|
||||
</div>
|
||||
<span className="text-sm font-medium text-white light:text-slate-900 truncate">
|
||||
{displayName}
|
||||
</span>
|
||||
</div>
|
||||
<div className="w-[60px] flex items-center justify-center shrink-0 mr-36">
|
||||
{isPending && code && (
|
||||
<div className="bg-zinc-950 light:bg-slate-200 h-[26px] w-[60px] flex items-center justify-center rounded">
|
||||
<span className="text-sm text-white/80 light:text-slate-900 text-center">
|
||||
{code}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-center justify-end gap-x-3 w-[80px] shrink-0">
|
||||
{isPending ? (
|
||||
<>
|
||||
<button
|
||||
onClick={() => onDeny(chatId)}
|
||||
className="text-zinc-400 light:text-slate-400 hover:text-red-400 light:hover:text-red-500 transition-colors"
|
||||
>
|
||||
<X className="h-4 w-4" weight="bold" />
|
||||
</button>
|
||||
<button
|
||||
onClick={() => onApprove(chatId)}
|
||||
className="text-zinc-400 light:text-slate-400 hover:text-green-400 light:hover:text-green-500 transition-colors"
|
||||
>
|
||||
<Check className="h-4 w-4" weight="bold" />
|
||||
</button>
|
||||
</>
|
||||
) : (
|
||||
<button
|
||||
onClick={() => onRevoke(chatId)}
|
||||
className="text-sm text-white/80 light:text-slate-500 hover:text-white light:hover:text-slate-700 transition-colors"
|
||||
>
|
||||
Remove
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="border-t border-zinc-800 light:border-slate-200" />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
import { useEffect, useState, useCallback } from "react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import ConnectedBotCard from "./ConnectedBotCard";
|
||||
import DetailsSection from "./DetailsSection";
|
||||
import UsersSection from "./UsersSection";
|
||||
import DisconnectedView from "./DisconnectedView";
|
||||
|
||||
export default function ConnectedView({
|
||||
config,
|
||||
onDisconnected,
|
||||
onReconnected,
|
||||
}) {
|
||||
const connected = config.connected;
|
||||
const [newToken, setNewToken] = useState("");
|
||||
const [pendingUsers, setPendingUsers] = useState([]);
|
||||
const [approvedUsers, setApprovedUsers] = useState([]);
|
||||
|
||||
const fetchUsers = useCallback(async () => {
|
||||
const [pending, approved] = await Promise.all([
|
||||
Telegram.getPendingUsers(),
|
||||
Telegram.getApprovedUsers(),
|
||||
]);
|
||||
setPendingUsers(pending?.users || []);
|
||||
setApprovedUsers(approved?.users || []);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
fetchUsers();
|
||||
const interval = setInterval(fetchUsers, 5_000);
|
||||
return () => clearInterval(interval);
|
||||
}, [fetchUsers]);
|
||||
|
||||
if (!connected) {
|
||||
return (
|
||||
<DisconnectedView
|
||||
config={config}
|
||||
onReconnected={onReconnected}
|
||||
newToken={newToken}
|
||||
setNewToken={setNewToken}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-8 mt-8">
|
||||
<ConnectedBotCard config={config} />
|
||||
<DetailsSection config={config} onDisconnected={onDisconnected} />
|
||||
<UsersSection
|
||||
pendingUsers={pendingUsers}
|
||||
approvedUsers={approvedUsers}
|
||||
fetchUsers={fetchUsers}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import { QRCodeSVG } from "qrcode.react";
|
||||
import { TelegramLogo } from "@phosphor-icons/react";
|
||||
import Logo from "@/media/logo/anything-llm-infinity.png";
|
||||
import { Trans, useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
|
||||
const BOTFATHER_URL = "https://t.me/BotFather";
|
||||
|
||||
export default function CreateBotSection() {
|
||||
const { t } = useTranslation();
|
||||
const qrSize = 137;
|
||||
const logoSize = { width: 35, height: 22 };
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-8">
|
||||
<div className="flex flex-col gap-y-1">
|
||||
<p className="text-sm light:text-base font-semibold text-white light:text-slate-900">
|
||||
{t("telegram.setup.step1.title")}
|
||||
</p>
|
||||
<p className="text-xs text-zinc-400 light:text-slate-600 max-w-[600px]">
|
||||
<Trans
|
||||
i18nKey="telegram.setup.step1.description"
|
||||
components={{
|
||||
code: (
|
||||
<code className="bg-zinc-800 light:bg-slate-200 px-1 py-0.5 rounded text-white light:text-slate-900" />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-x-8">
|
||||
<div className="flex flex-col items-start gap-y-2">
|
||||
<div className="bg-zinc-700 light:bg-slate-200 rounded-2xl p-[18px]">
|
||||
<QRCodeSVG
|
||||
value={BOTFATHER_URL}
|
||||
size={qrSize}
|
||||
bgColor="transparent"
|
||||
fgColor="currentColor"
|
||||
className="text-white light:text-slate-900 light:[&_image]:invert"
|
||||
level="L"
|
||||
imageSettings={{
|
||||
src: Logo,
|
||||
x: qrSize / 2 - logoSize.width / 2,
|
||||
y: qrSize / 2 - logoSize.height / 2,
|
||||
height: logoSize.height,
|
||||
width: logoSize.width,
|
||||
excavate: true,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<Link
|
||||
to={BOTFATHER_URL}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="flex items-center justify-center gap-x-1.5 text-sm font-medium bg-zinc-50 light:bg-slate-900 text-zinc-900 light:text-white rounded-lg h-9 w-[172px] hover:opacity-90 transition-opacity duration-200"
|
||||
>
|
||||
<TelegramLogo className="h-5 w-5" weight="fill" />
|
||||
{t("telegram.setup.step1.open-botfather")}
|
||||
</Link>
|
||||
</div>
|
||||
<div className="flex flex-col text-sm text-white light:text-slate-900">
|
||||
<p className="leading-5">{t("telegram.setup.step1.instruction-1")}</p>
|
||||
<p className="leading-5">
|
||||
<Trans
|
||||
i18nKey="telegram.setup.step1.instruction-2"
|
||||
components={{
|
||||
code: (
|
||||
<code className="bg-zinc-800 light:bg-slate-200 px-1 py-0.5 rounded" />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
<p className="leading-5">{t("telegram.setup.step1.instruction-3")}</p>
|
||||
<p className="leading-5">{t("telegram.setup.step1.instruction-4")}</p>
|
||||
</div>
|
||||
</div>
|
||||
<SecurityTips />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SecurityTips() {
|
||||
const { t } = useTranslation();
|
||||
|
||||
return (
|
||||
<div className="border border-zinc-600 light:border-slate-400 rounded-xl p-[18px] max-w-[640px]">
|
||||
<p className="text-sm font-medium text-white light:text-slate-900 mb-1">
|
||||
{t("telegram.setup.security.title")}
|
||||
</p>
|
||||
<p className="text-sm text-zinc-400 light:text-slate-600 mb-2">
|
||||
{t("telegram.setup.security.description")}
|
||||
</p>
|
||||
<ul className="text-sm text-zinc-400 light:text-slate-600 list-disc list-inside space-y-0.5">
|
||||
<li>Disable Groups {t("telegram.setup.security.disable-groups")}</li>
|
||||
<li>Disable Inline {t("telegram.setup.security.disable-inline")}</li>
|
||||
<li>{t("telegram.setup.security.obscure-username")}</li>
|
||||
</ul>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import { useState } from "react";
|
||||
import {
|
||||
CircleNotch,
|
||||
Eye,
|
||||
EyeSlash,
|
||||
TelegramLogo,
|
||||
} from "@phosphor-icons/react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import showToast from "@/utils/toast";
|
||||
import CreateBotSection from "./CreateBotSection";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function SetupView({ onConnected }) {
|
||||
const { t } = useTranslation();
|
||||
const [botToken, setBotToken] = useState("");
|
||||
const [connecting, setConnecting] = useState(false);
|
||||
|
||||
async function handleConnect(e) {
|
||||
e.preventDefault();
|
||||
if (!botToken.trim())
|
||||
return showToast(t("telegram.setup.toast-enter-token"), "error");
|
||||
|
||||
setConnecting(true);
|
||||
const res = await Telegram.connect(botToken.trim());
|
||||
setConnecting(false);
|
||||
|
||||
if (!res.success) {
|
||||
showToast(res.error || t("telegram.setup.toast-connect-failed"), "error");
|
||||
return;
|
||||
}
|
||||
|
||||
const configRes = await Telegram.getConfig();
|
||||
onConnected(configRes?.config);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-8 mt-8">
|
||||
<CreateBotSection />
|
||||
<form onSubmit={handleConnect} className="flex flex-col gap-y-[18px]">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<p className="text-sm light:text-base font-semibold text-white light:text-slate-900">
|
||||
{t("telegram.setup.step2.title")}
|
||||
</p>
|
||||
<p className="text-xs text-zinc-400 light:text-slate-600 max-w-[700px]">
|
||||
{t("telegram.setup.step2.description")}
|
||||
</p>
|
||||
</div>
|
||||
<BotTokenInput botToken={botToken} setBotToken={setBotToken} />
|
||||
<button
|
||||
type="submit"
|
||||
disabled={connecting}
|
||||
className="flex items-center justify-center gap-x-1.5 text-sm font-medium bg-zinc-50 light:bg-slate-900 text-zinc-900 light:text-white rounded-lg h-9 px-5 w-fit hover:opacity-90 transition-opacity duration-200 disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
>
|
||||
{connecting ? (
|
||||
<>
|
||||
<CircleNotch className="h-4 w-4 animate-spin" />
|
||||
{t("telegram.setup.step2.connecting")}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<TelegramLogo className="h-5 w-5" weight="fill" />
|
||||
{t("telegram.setup.step2.connect-bot")}
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function BotTokenInput({ botToken, setBotToken }) {
|
||||
const { t } = useTranslation();
|
||||
const [showToken, setShowToken] = useState(false);
|
||||
const Icon = showToken ? Eye : EyeSlash;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-1.5 w-[320px]">
|
||||
<label className="text-sm font-medium text-zinc-200 light:text-slate-900">
|
||||
{t("telegram.setup.step2.bot-token")}
|
||||
</label>
|
||||
<div className="bg-zinc-800 light:bg-white light:border light:border-slate-300 h-8 rounded-lg px-3.5 flex items-center gap-x-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setShowToken(!showToken)}
|
||||
className="text-zinc-400 light:text-slate-500 hover:text-zinc-300 light:hover:text-slate-700 transition-colors shrink-0"
|
||||
>
|
||||
<Icon className="h-4 w-4" />
|
||||
</button>
|
||||
<input
|
||||
type={showToken ? "text" : "password"}
|
||||
value={botToken}
|
||||
onChange={(e) => setBotToken(e.target.value)}
|
||||
placeholder="123456:ABC-DEF123ghlkl-zyx57W2v"
|
||||
className="bg-transparent flex-1 text-sm text-white light:text-slate-900 placeholder:text-zinc-400 light:placeholder:text-slate-500 outline-none min-w-0"
|
||||
autoComplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import Sidebar from "@/components/SettingsSidebar";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import { CircleNotch } from "@phosphor-icons/react";
|
||||
import Telegram from "@/models/telegram";
|
||||
import ConnectedView from "./ConnectedView";
|
||||
import SetupView from "./SetupView";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import System from "@/models/system";
|
||||
import paths from "@/utils/paths";
|
||||
|
||||
export default function TelegramBotSettings() {
|
||||
const navigate = useNavigate();
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [config, setConfig] = useState(null);
|
||||
|
||||
useEffect(() => {
|
||||
async function fetchData() {
|
||||
const [isMultiUserMode, configRes] = await Promise.all([
|
||||
System.isMultiUserMode(),
|
||||
Telegram.getConfig(),
|
||||
]);
|
||||
|
||||
if (isMultiUserMode) navigate(paths.home());
|
||||
setConfig(configRes?.config || null);
|
||||
setLoading(false);
|
||||
}
|
||||
fetchData();
|
||||
}, []);
|
||||
|
||||
const handleConnected = (newConfig) => setConfig(newConfig);
|
||||
const handleDisconnected = () => setConfig(null);
|
||||
|
||||
if (loading) {
|
||||
return (
|
||||
<ConnectionsLayout>
|
||||
<div className="flex items-center justify-center h-full">
|
||||
<CircleNotch className="h-8 w-8 text-zinc-400 light:text-slate-400 animate-spin" />
|
||||
</div>
|
||||
</ConnectionsLayout>
|
||||
);
|
||||
}
|
||||
|
||||
const hasConfig = config?.active && config?.bot_username;
|
||||
if (!hasConfig) {
|
||||
return (
|
||||
<ConnectionsLayout fullPage={true}>
|
||||
<SetupView onConnected={handleConnected} />
|
||||
</ConnectionsLayout>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<ConnectionsLayout fullPage={true}>
|
||||
<ConnectedView
|
||||
config={config}
|
||||
onDisconnected={handleDisconnected}
|
||||
onReconnected={handleConnected}
|
||||
/>
|
||||
</ConnectionsLayout>
|
||||
);
|
||||
}
|
||||
|
||||
function ConnectionsLayout({ children, fullPage = false }) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<div className="w-screen h-screen overflow-hidden bg-zinc-950 light:bg-slate-50 flex md:mt-0 mt-6">
|
||||
<Sidebar />
|
||||
<div
|
||||
style={{ height: isMobile ? "100%" : "calc(100% - 32px)" }}
|
||||
className="relative md:ml-[2px] md:mr-[16px] md:my-[16px] md:rounded-2xl bg-zinc-900 light:bg-white light:border light:border-slate-300 w-full h-full overflow-y-scroll p-4 md:p-0"
|
||||
>
|
||||
{fullPage ? (
|
||||
<div className="flex flex-col w-full px-1 md:pl-6 md:pr-[50px] md:py-6 py-16">
|
||||
<div className="w-full flex flex-col gap-y-2 pb-6 border-b border-white/20 light:border-slate-300">
|
||||
<p className="text-lg font-semibold leading-7 text-white light:text-slate-900">
|
||||
{t("telegram.title")}
|
||||
</p>
|
||||
<p className="text-xs leading-4 text-zinc-400 light:text-slate-600 max-w-[700px]">
|
||||
{t("telegram.description")}
|
||||
</p>
|
||||
<a
|
||||
href={paths.docs("/channels/telegram")}
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
className="text-xs leading-4 text-white light:text-slate-900 underline w-fit"
|
||||
>
|
||||
View Documentation
|
||||
</a>
|
||||
</div>
|
||||
{children}
|
||||
</div>
|
||||
) : (
|
||||
children
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -64,11 +64,15 @@ export default function Home() {
|
||||
async function init() {
|
||||
const ws = await getTargetWorkspace();
|
||||
if (ws) {
|
||||
const [suggestedMessages, pfpUrl] = await Promise.all([
|
||||
const [suggestedMessages, { showAgentCommand }] = await Promise.all([
|
||||
Workspace.getSuggestedMessages(ws.slug),
|
||||
Workspace.fetchPfp(ws.slug),
|
||||
Workspace.agentCommandAvailable(ws.slug),
|
||||
]);
|
||||
setWorkspace({ ...ws, suggestedMessages, pfpUrl });
|
||||
setWorkspace({
|
||||
...ws,
|
||||
suggestedMessages,
|
||||
showAgentCommand,
|
||||
});
|
||||
}
|
||||
setWorkspaceLoading(false);
|
||||
}
|
||||
@@ -289,6 +293,7 @@ function HomeContent({ workspace, setWorkspace, threadSlug, setThreadSlug }) {
|
||||
{t("main-page.greeting")}
|
||||
</h1>
|
||||
<PromptInput
|
||||
workspace={workspace}
|
||||
submit={handleSubmit}
|
||||
isStreaming={loading}
|
||||
sendCommand={sendCommand}
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
import { useTheme } from "@/hooks/useTheme";
|
||||
|
||||
export function OnboardingLogoSVG() {
|
||||
const { isLight } = useTheme();
|
||||
return (
|
||||
<svg
|
||||
viewBox="0 0 818 514"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
className="w-full h-auto"
|
||||
>
|
||||
<g filter="url(#filter0_i_onboarding)">
|
||||
<path
|
||||
d="M817.643 77.9966V435.862C817.643 478.86 782.656 513.847 739.646 513.847H598.7C575.046 513.847 552.952 503.3 538.072 484.907L478.122 410.756C470.908 401.84 470.837 389.328 477.943 380.329L499.609 352.901C504.264 347.009 511.228 343.628 518.739 343.628C526.251 343.628 533.143 346.973 537.798 352.818L595.593 425.47C598.391 428.969 602.557 430.981 607.033 430.981H715.243C726.004 430.981 734.766 422.22 734.766 411.458V102.4C734.766 91.627 726.004 82.8773 715.243 82.8773H606.938C602.462 82.8773 598.295 84.8773 595.498 88.3771L279.643 484.479C264.75 503.145 242.525 513.847 218.657 513.847H77.9847C34.9866 513.847 0 478.86 0 435.862V77.9966C0 34.9866 34.9866 0 77.9847 0H219.681C243.716 0 266.036 10.8329 280.928 29.7249L338.426 103.115C345.437 112.019 345.425 124.435 338.39 133.328L316.57 160.898C311.927 166.767 304.963 170.147 297.463 170.147C289.964 170.147 283.059 166.802 278.405 160.957L220.764 88.3771C217.979 84.8773 213.812 82.8773 209.336 82.8773H102.388C91.627 82.8773 82.8654 91.627 82.8654 102.4V411.458C82.8654 422.22 91.627 430.981 102.388 430.981H209.289C213.765 430.981 217.931 428.969 220.717 425.482L536.727 29.3559C551.607 10.7019 573.832 0 597.7 0H739.646C782.656 0 817.643 34.9866 817.643 77.9966Z"
|
||||
fill="url(#paint0_linear_onboarding)"
|
||||
fillOpacity={isLight ? 0.5 : 0.28}
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter
|
||||
id="filter0_i_onboarding"
|
||||
x="0"
|
||||
y="0"
|
||||
width="817.643"
|
||||
height="525.847"
|
||||
filterUnits="userSpaceOnUse"
|
||||
colorInterpolationFilters="sRGB"
|
||||
>
|
||||
<feFlood floodOpacity="0" result="BackgroundImageFix" />
|
||||
<feBlend
|
||||
mode="normal"
|
||||
in="SourceGraphic"
|
||||
in2="BackgroundImageFix"
|
||||
result="shape"
|
||||
/>
|
||||
<feColorMatrix
|
||||
in="SourceAlpha"
|
||||
type="matrix"
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||
result="hardAlpha"
|
||||
/>
|
||||
<feOffset dy="12" />
|
||||
<feGaussianBlur stdDeviation="6" />
|
||||
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
|
||||
<feColorMatrix
|
||||
type="matrix"
|
||||
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0"
|
||||
/>
|
||||
<feBlend mode="normal" in2="shape" result="effect1_innerShadow" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
id="paint0_linear_onboarding"
|
||||
x1="15.9568"
|
||||
y1="-4.97115"
|
||||
x2="720.527"
|
||||
y2="514.346"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
{isLight ? (
|
||||
<>
|
||||
<stop stopColor="#B0BAC5" />
|
||||
<stop offset="0.538462" stopColor="#FFFFFF" stopOpacity="0.4" />
|
||||
<stop offset="1" stopColor="#A8B0BE" />
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<stop stopColor="#3C5769" />
|
||||
<stop
|
||||
offset="0.538462"
|
||||
stopColor="#9FA5C2"
|
||||
stopOpacity="0.253846"
|
||||
/>
|
||||
<stop offset="1" stopColor="#40435E" />
|
||||
</>
|
||||
)}
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,64 +1,56 @@
|
||||
import paths from "@/utils/paths";
|
||||
import LGroupImg from "./l_group.png";
|
||||
import RGroupImg from "./r_group.png";
|
||||
import LGroupImgLight from "./l_group-light.png";
|
||||
import RGroupImgLight from "./r_group-light.png";
|
||||
import AnythingLLMLogo from "@/media/logo/anything-llm.png";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { useTheme } from "@/hooks/useTheme";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import useRedirectToHomeOnOnboardingComplete from "@/hooks/useOnboardingComplete";
|
||||
|
||||
const IMG_SRCSET = {
|
||||
light: {
|
||||
l: LGroupImgLight,
|
||||
r: RGroupImgLight,
|
||||
},
|
||||
default: {
|
||||
l: LGroupImg,
|
||||
r: RGroupImg,
|
||||
},
|
||||
};
|
||||
import { OnboardingLogoSVG } from "./components/OnboardingLogoSVG";
|
||||
|
||||
export default function OnboardingHome() {
|
||||
const navigate = useNavigate();
|
||||
useRedirectToHomeOnOnboardingComplete();
|
||||
const { theme } = useTheme();
|
||||
const { t } = useTranslation();
|
||||
const srcSet = IMG_SRCSET?.[theme] || IMG_SRCSET.default;
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="relative w-screen h-screen flex overflow-hidden bg-theme-bg-primary">
|
||||
<div
|
||||
className="hidden md:block fixed bottom-10 left-10 w-[320px] h-[320px] bg-no-repeat bg-contain"
|
||||
style={{ backgroundImage: `url(${srcSet.l})` }}
|
||||
></div>
|
||||
<div className="relative w-screen h-screen flex flex-col overflow-hidden bg-zinc-950 light:bg-slate-50">
|
||||
{/* Dark mode background gradient */}
|
||||
<div
|
||||
className="absolute inset-0 light:hidden"
|
||||
style={{
|
||||
background:
|
||||
"radial-gradient(ellipse 160% 100% at 50% 0%, rgba(130, 152, 178, 0.45) 0%, rgba(60, 87, 105, 0.25) 45%, transparent 90%)",
|
||||
}}
|
||||
/>
|
||||
{/* Light mode background gradient */}
|
||||
<div
|
||||
className="absolute inset-0 hidden light:block"
|
||||
style={{
|
||||
background:
|
||||
"radial-gradient(ellipse 160% 100% at 50% 0%, rgba(176, 200, 224, 0.7) 0%, rgba(195, 213, 230, 0.45) 50%, transparent 90%)",
|
||||
}}
|
||||
/>
|
||||
|
||||
<div
|
||||
className="hidden md:block fixed top-10 right-10 w-[320px] h-[320px] bg-no-repeat bg-contain"
|
||||
style={{ backgroundImage: `url(${srcSet.r})` }}
|
||||
></div>
|
||||
|
||||
<div className="relative flex justify-center items-center m-auto">
|
||||
<div className="flex flex-col justify-center items-center">
|
||||
<p className="text-theme-text-primary font-thin text-[24px]">
|
||||
{t("onboarding.home.title")}
|
||||
</p>
|
||||
<img
|
||||
src={AnythingLLMLogo}
|
||||
alt="AnythingLLM"
|
||||
className="md:h-[50px] flex-shrink-0 max-w-[300px] light:invert"
|
||||
/>
|
||||
<button
|
||||
onClick={() => navigate(paths.onboarding.llmPreference())}
|
||||
className="border-[2px] border-theme-text-primary animate-pulse light:animate-none w-full md:max-w-[350px] md:min-w-[300px] text-center py-3 bg-theme-button-primary hover:bg-theme-bg-secondary text-theme-text-primary font-semibold text-sm my-10 rounded-md "
|
||||
>
|
||||
{t("onboarding.home.getStarted")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div className="relative z-10 flex justify-center pt-[58px]">
|
||||
<p className="text-white/80 light:text-slate-600 text-3xl font-semibold">
|
||||
AnythingLLM
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
|
||||
<div className="relative z-10 flex-1 flex flex-col items-center justify-center -mt-8">
|
||||
<div className="absolute flex items-center justify-center w-full px-4 md:px-0 md:max-w-[852px] md:w-[56%]">
|
||||
<OnboardingLogoSVG />
|
||||
</div>
|
||||
|
||||
<h1 className="relative font-medium text-white light:text-slate-700 text-[64px] md:text-[96px] lg:text-[160px] leading-none tracking-[-0.06em] select-none">
|
||||
{t("onboarding.home.welcome")}
|
||||
</h1>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => navigate(paths.onboarding.llmPreference())}
|
||||
className="relative border-none z-10 h-[36px] w-[300px] py-2.5 px-5 rounded-lg bg-slate-50 hover:bg-slate-300 font-medium text-sm mt-[42px] text-zinc-900 light:text-white light:bg-slate-900 light:hover:bg-slate-800 text-center flex justify-center items-center transition-colors duration-200"
|
||||
>
|
||||
{t("onboarding.home.getStarted")}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user