mirror of
https://github.com/Mintplex-Labs/anything-llm
synced 2026-04-25 17:15:37 +02:00
Pg 1.12.1 (#5485)
* 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 commit4c69960dca. * 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) * 1.12.0 release (#5331) * German translation fixes (#5319) * Fix German login welcome message * More German translation fixes --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * fix(lemonade): throw on embedding failures instead of returning empty (#5325) * fix(lemonade): throw on embedding failures instead of returning empty vectors * use class logger --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * Fix light mode docgen page (#5347) Fix light mode docgen * fix(agent-flows): keep flow menu visible in narrow windows (#5341) * fix(agent-flows): keep flow menu visible in narrow windows * fix(agent-flows): prevent gear menu text clipping Signed-off-by: suyua9 <1521777066@qq.com> --------- Signed-off-by: suyua9 <1521777066@qq.com> Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * Fix Agent Flow toggle state sync (#5348) * hide cluttered menus on small screens resolves #5055 closes #5132 * admin only flow-plugin path validation * Remove illegal chars for Windows on files (#5364) * add provider/embedder to bug report for clarity resolves #5363 * add provider/embedder to bug report for clarity resolves #5363 * Revert "Remove illegal chars for Windows on files (#5364)" This reverts commit8ed1d35ab3. * Reapply "Remove illegal chars for Windows on files (#5364)" This reverts commit869be87ef6. * feat: Document Embedding Status Events | Refactor Document Embedding to Job Queue and Forked Process (#5254) * implement native embedder job queue * persist embedding progress across renders * add development worker timeouts * change to static method * native reranker * remove useless return * lint * simplify * make embedding worker timeout value configurable by admin * add event emission for missing data * lint * remove onProgress callback argument * make rerank to rerankDirect * persists progress state across app reloads * remove chunk level progress reporting * remove unuse dvariable * make NATIVE_RERANKING_WORKER_TIMEOUT user configurable * remove dead code * scope embedding progress per-user and clear stale state on SSE reconnect * lint * revert vector databases and embedding engines to call their original methods * simplify rerank * simplify progress fetching by removing updateProgressFromApi * remove duplicate jsdoc * replace sessionStorage persistence with server-side history replay for embedding progress * fix old comment * fix: ignore premature SSE all_complete when embedding hasn't started yet The SSE connection opens before the embedding API call fires, so the server sees no buffered history and immediately sends all_complete. Firefox dispatches this eagerly enough that it closes the EventSource before real progress events arrive, causing the progress UI to clear and fall back to the loading spinner. Chrome's EventSource timing masks the race. Track slugs where startEmbedding was called but no real progress event has arrived yet via awaitingProgressRef. Ignore the first all_complete for those slugs and keep the connection open for the real events. * reduce duplication with progress emissions * remove dead code * refactor: streamline embedding progress handling Removed unnecessary tracking of slugs for premature all_complete events in the EmbeddingProgressProvider. Updated the server-side logic to avoid sending all_complete when no embedding is in progress, allowing the connection to remain open for real events. Adjusted the embedding initiation flow to ensure the server processes the job before the SSE connection opens, improving the reliability of progress updates. * fix stale comment * remove unused function * fix event emissions for document creation failure * refactor: move Reranking Worker Idle Timeout input to LanceDBOptions component Extracted the Reranking Worker Idle Timeout input from GeneralEmbeddingPreference and integrated it into the LanceDBOptions component. This change enhances modularity and maintains a cleaner structure for the settings interface. * lint * remove unused hadHistory vars * refactor workspace directory by hoisting component and converting into functions * moved EmbeddingProgressProvider to wrap Document Manager Modal * refactor embed progress SSE connection to use fetchEventSource instead of native EventSource API. * refactor message handlng into a function and reduce duplication * refactor: utilize writeResponseChunk for event emissions in document embedding progress SSE * refactor: explicit in-proc embedding and rerank methods that are called by workers instead of process.send checks * Abstract EmbeddingProgressBus and Worker Queue into modules * remove error and toast messages on embed process result * use safeJsonParse * add chunk-level progress events with per-document progress bar in UI * remove unused parameter * rename all worker timeout references to use ttl | remove ttl updating from UI * refactor: pass embedding context through job payload instead of global state * lint * add graceful shutdown for workers * apply figma styles * refactor embedding worker to use bree * use existing WorkerQueue class as the management layer for jobs * lint * revert all reranking worker changes back to master state Removes the reranking worker queue, rerankViaWorker/rerankInProcess renames, and NATIVE_RERANKING_WORKER_TTL config so this branch only contains the embedding worker job queue feature. * remove breeManaged flag — WorkerQueue always spawns via Bree * fix prompt embedding bug * have embedTextInput call embedChunksInProcess * add message field to `process.send()` * remove nullish check and error throw * remove bespoke graceful shutdown logix * add spawnWorker method and asbtract redudant flows into helper methods * remove unneeded comment * remove recomputation of TTL value * frontend cleanup and refactor * wip on backend refactor * backend overhaul * small lint * second pass * add logging, update endpoint * simple refactor * add reporting to all embedder providers * fix styles --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * Update Lemonade Integration to support v10.1.0 changes (#5378) Update Lemonade Integraion Fix ApiKey nullification check causing hard throw * Enable final tool call in MAX_STACK to run (#5381) * Fix streaming issue for LLM instruction blocks (#5382) * Fix Telegram thread being null, actually wait for disconnect to prevent conflict at runtime * Add retry handling to TG for transient failures (#5391) * Add retry handling to TG for transient failures * add async to promise * Migrate to org-maintained mdpdf for lang support (Hangul, Simplified Chinese, Kanji) (#5392) move to custom mdpdf for lang support (Hangul, Simplified Chinese) * Update TG Transient error code and unclosed tag handler * feat: adds name field to api keys (#5366) * feat: adds name field to api keys * remove extra toasts * prune and norm translations --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * Add automatic agent skill aproval via ENV Flag (#5405) * add autoapproval env flag * persist flag * GMail Agent Skill (#5400) * wip * remove label tech * ask to read attachments * update skills * Skill ready and tested * report dynamic citations and generic get mailbox util * norm translations * translations * remove dead code, remove connector in multiUser * simple refactor - dont ask for drafts * refactor filesize helper * norm translations, remove read_messages skill * Helm chart updates (#5410) * move strategy to deployment spec Signed-off-by: Busta Pipes <busta.pipes@gmail.com> * add optional httproute resource Signed-off-by: Busta Pipes <busta.pipes@gmail.com> --------- Signed-off-by: Busta Pipes <busta.pipes@gmail.com> Co-authored-by: Busta Pipes <busta.pipes@gmail.com> * feat: add Catalan translation (#5411) * Add Catalan translation * lint --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * fix: preserve Confluence context paths (#5415) * fix: preserve confluence context paths * lint and minor changes --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * Enable chatId reporting during agent sessions (#5407) * 5427 translations (#5429) * Outlook agent via Entra Application * translations * Revert "5427 translations (#5429)" This reverts commit4172751858. * Outlook agent via Entra Application (#5427) * Outlook agent via Entra Application * translations (#5437) * reorder skills for app integrations * Refactor Gmail Agent (#5439) * make DDG default web-search in UI (already is in backend!) * Google calendar skill (#5442) * Google Calendar Agent * forgot files * Translations (#5443) * Image lightbox for chat attachments (#5441) * add image lightbox for chat attachments * wrap lightbox image triggers in button elements * add images to dependency array * add jsdoc to ChatAttachments and remove filter * fix regenerate from system message connect #5407 * dedupe email items based on name * comment on outlook agent * Better citations for gmail, gcal, and outlook * bump TG edit to prevent edit spam for messages since edits count as a send event and too many will result in a 429 resolves #5447 * Merge commit from fork * better special citation styling * Add capability detection and streaming usage for Generic OpenAI provider (#5477) - Add ENV-configurable model capabilities (tools, reasoning, vision, imageGeneration) via PROVIDER_SUPPORTS_* environment variables - Add optional stream usage reporting via GENERIC_OPEN_AI_REPORT_USAGE - Fix streaming tool calls for providers that send null tool_call.id (e.g., mlx-server) by generating fallback UUIDs - Refactor supportsNativeToolCalling() to use centralized capabilities API * fix: omit temperature param for Bedrock Claude Opus 4.7 (#5472) * addconditionally pass temperature based on aws bedrock model id * move to config --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * fix: long-prompt bubble flicker & See More collapse on streaming/scroll (#5473) fix ui flickering and truncatable prompt expansion bug Co-authored-by: shatfield4 <seanhatfield5@gmail.com> Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * fix: surface readable error messages in web-scraping agent and ai-provider (#5476) * fix: surface readable error messages in web-scraping agent and ai-provider * simplify --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * update tool call response to always include convo ID for emails so they are not hallunicated * sync locales * ensure db schema * 1.12.1 release tags (#5483) * bump pg tag --------- Signed-off-by: suyua9 <1521777066@qq.com> Signed-off-by: Busta Pipes <busta.pipes@gmail.com> 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> Co-authored-by: S. Neuhaus <neuhaus@users.noreply.github.com> Co-authored-by: suyua9 <1521777066@qq.com> Co-authored-by: Guilherme Nogueira <guilherme.lopesn@gmail.com> Co-authored-by: Kurt <bustapipes@users.noreply.github.com> Co-authored-by: Busta Pipes <busta.pipes@gmail.com> Co-authored-by: Jordi Mas <jmas@softcatala.org> Co-authored-by: Asish Kumar <87874775+officialasishkumar@users.noreply.github.com> Co-authored-by: Akhil <133588800+Akhil373@users.noreply.github.com>
This commit is contained in:
18
.github/ISSUE_TEMPLATE/01_bug.yml
vendored
18
.github/ISSUE_TEMPLATE/01_bug.yml
vendored
@@ -40,3 +40,21 @@ body:
|
||||
quickly. This is not required, but it is helpful.
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: llm-provider
|
||||
attributes:
|
||||
label: LLM Provider & Model (if applicable)
|
||||
description: What LLM provider and model are you using? (e.g., OpenAI GPT-4, Anthropic, Ollama, etc.)
|
||||
placeholder: e.g., Ollama / qwen2.5-coder-32b-instruct
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
id: embedder-provider
|
||||
attributes:
|
||||
label: Embedder Provider & Model (if applicable)
|
||||
description: What embedding provider and model are you using? (e.g., OpenAI text-embedding-ada-002, Lemonade, etc.)
|
||||
placeholder: e.g., Lemonade / nomic-embed-text-v1-GGUF
|
||||
validations:
|
||||
required: false
|
||||
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
${{ steps.dockerhub.outputs.enabled == 'true' && 'mintplexlabs/anythingllm' || '' }}
|
||||
tags: |
|
||||
type=raw,value=pg
|
||||
type=raw,value=pg-1.12.0
|
||||
type=raw,value=pg-1.12.1
|
||||
|
||||
- name: Build and push multi-platform Docker image
|
||||
uses: docker/build-push-action@v6
|
||||
|
||||
@@ -58,7 +58,7 @@ Notes:
|
||||
```yaml
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
tag: "1.12.0"
|
||||
tag: "1.12.1"
|
||||
|
||||
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.12.0"` | |
|
||||
| image.tag | string | `"1.12.1"` | |
|
||||
| imagePullSecrets | list | `[]` | |
|
||||
| ingress.annotations | object | `{}` | |
|
||||
| ingress.className | string | `""` | |
|
||||
|
||||
@@ -69,7 +69,7 @@ Notes:
|
||||
```yaml
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
tag: "1.12.0"
|
||||
tag: "1.12.1"
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
|
||||
@@ -9,6 +9,10 @@ spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "anythingllm.selectorLabels" . | nindent 6 }}
|
||||
{{- with .Values.strategy }}
|
||||
strategy:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
@@ -32,10 +36,6 @@ spec:
|
||||
initContainers:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.strategy }}
|
||||
strategy:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
securityContext:
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
{{- if .Values.httpRoute.enabled -}}
|
||||
{{- $fullName := include "anythingllm.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
apiVersion: gateway.networking.k8s.io/v1
|
||||
kind: HTTPRoute
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
labels:
|
||||
{{- include "anythingllm.labels" . | nindent 4 }}
|
||||
{{- with .Values.httpRoute.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
parentRefs:
|
||||
{{- with .Values.httpRoute.parentRefs }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.httpRoute.hostnames }}
|
||||
hostnames:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.httpRoute.rules }}
|
||||
{{- with .matches }}
|
||||
- matches:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .filters }}
|
||||
filters:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
backendRefs:
|
||||
- name: {{ $fullName }}
|
||||
port: {{ $svcPort }}
|
||||
weight: 1
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -8,7 +8,7 @@ initContainers: []
|
||||
image:
|
||||
repository: mintplexlabs/anythingllm
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "1.12.0"
|
||||
tag: "1.12.1"
|
||||
|
||||
imagePullSecrets: []
|
||||
nameOverride: ""
|
||||
@@ -142,6 +142,44 @@ service:
|
||||
type: ClusterIP
|
||||
port: 3001
|
||||
|
||||
# -- Expose the service via gateway-api HTTPRoute
|
||||
# Requires Gateway API resources and suitable controller installed within the cluster
|
||||
# (see: https://gateway-api.sigs.k8s.io/guides/)
|
||||
httpRoute:
|
||||
# HTTPRoute enabled.
|
||||
enabled: false
|
||||
# HTTPRoute annotations.
|
||||
annotations: {}
|
||||
# Which Gateways this Route is attached to.
|
||||
parentRefs:
|
||||
- name: gateway
|
||||
sectionName: http
|
||||
# namespace: default
|
||||
# Hostnames matching HTTP header.
|
||||
hostnames:
|
||||
- chart-example.local
|
||||
# List of rules and filters applied.
|
||||
rules:
|
||||
- matches:
|
||||
- path:
|
||||
type: PathPrefix
|
||||
value: /headers
|
||||
# filters:
|
||||
# - type: RequestHeaderModifier
|
||||
# requestHeaderModifier:
|
||||
# set:
|
||||
# - name: My-Overwrite-Header
|
||||
# value: this-is-the-only-value
|
||||
# remove:
|
||||
# - User-Agent
|
||||
# - matches:
|
||||
# - path:
|
||||
# type: PathPrefix
|
||||
# value: /echo
|
||||
# headers:
|
||||
# - name: version
|
||||
# value: v2
|
||||
|
||||
ingress:
|
||||
enabled: false
|
||||
className: ""
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
/* eslint-env jest, node */
|
||||
process.env.STORAGE_DIR = "test-storage";
|
||||
|
||||
const { resolveConfluenceBaseUrl } = require("../../../../utils/extensions/Confluence");
|
||||
const {
|
||||
ConfluencePagesLoader,
|
||||
} = require("../../../../utils/extensions/Confluence/ConfluenceLoader");
|
||||
|
||||
describe("resolveConfluenceBaseUrl", () => {
|
||||
test("cloud: strips path and returns origin only", () => {
|
||||
expect(
|
||||
resolveConfluenceBaseUrl("https://example.atlassian.net/wiki/spaces/SP", true)
|
||||
).toBe("https://example.atlassian.net");
|
||||
});
|
||||
|
||||
test("self-hosted: preserves context path, strips trailing slash", () => {
|
||||
expect(
|
||||
resolveConfluenceBaseUrl("https://my.domain.com/confluence/", false)
|
||||
).toBe("https://my.domain.com/confluence");
|
||||
});
|
||||
|
||||
test("self-hosted: returns origin when no context path", () => {
|
||||
expect(
|
||||
resolveConfluenceBaseUrl("https://my.domain.com/", false)
|
||||
).toBe("https://my.domain.com");
|
||||
});
|
||||
});
|
||||
|
||||
describe("ConfluencePagesLoader", () => {
|
||||
afterEach(() => {
|
||||
jest.restoreAllMocks();
|
||||
});
|
||||
|
||||
describe("cloud mode", () => {
|
||||
test("API requests include /wiki prefix", async () => {
|
||||
const fetchMock = jest.spyOn(global, "fetch").mockResolvedValue({
|
||||
ok: true,
|
||||
json: jest.fn().mockResolvedValue({ size: 0, results: [] }),
|
||||
});
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl: resolveConfluenceBaseUrl("https://example.atlassian.net/wiki/spaces/SP", true),
|
||||
spaceKey: "SP",
|
||||
username: "user",
|
||||
accessToken: "token",
|
||||
cloud: true,
|
||||
});
|
||||
|
||||
await loader.fetchAllPagesInSpace();
|
||||
|
||||
expect(fetchMock).toHaveBeenCalledWith(
|
||||
"https://example.atlassian.net/wiki/rest/api/content?spaceKey=SP&limit=25&start=0&expand=body.storage,version",
|
||||
expect.any(Object)
|
||||
);
|
||||
});
|
||||
|
||||
test("page URLs include /wiki prefix", () => {
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl: resolveConfluenceBaseUrl("https://example.atlassian.net/wiki", true),
|
||||
spaceKey: "SP",
|
||||
username: "user",
|
||||
accessToken: "token",
|
||||
cloud: true,
|
||||
});
|
||||
|
||||
const document = loader.createDocumentFromPage({
|
||||
id: "123",
|
||||
status: "current",
|
||||
title: "Cloud page",
|
||||
type: "page",
|
||||
body: { storage: { value: "<p>Hello</p>" } },
|
||||
version: { number: 1, by: { displayName: "User" }, when: "2026-01-01T00:00:00.000Z" },
|
||||
});
|
||||
|
||||
expect(document.metadata.url).toBe(
|
||||
"https://example.atlassian.net/wiki/spaces/SP/pages/123"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("self-hosted mode", () => {
|
||||
test("API requests use context path without /wiki", async () => {
|
||||
const fetchMock = jest.spyOn(global, "fetch").mockResolvedValue({
|
||||
ok: true,
|
||||
json: jest.fn().mockResolvedValue({ size: 0, results: [] }),
|
||||
});
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl: resolveConfluenceBaseUrl("https://my.domain.com/confluence/", false),
|
||||
spaceKey: "SP",
|
||||
username: "user",
|
||||
accessToken: "token",
|
||||
cloud: false,
|
||||
});
|
||||
|
||||
await loader.fetchAllPagesInSpace();
|
||||
|
||||
expect(fetchMock).toHaveBeenCalledWith(
|
||||
"https://my.domain.com/confluence/rest/api/content?spaceKey=SP&limit=25&start=0&expand=body.storage,version",
|
||||
expect.any(Object)
|
||||
);
|
||||
});
|
||||
|
||||
test("page URLs use context path without /wiki", () => {
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl: resolveConfluenceBaseUrl("https://my.domain.com/confluence/", false),
|
||||
spaceKey: "SP",
|
||||
username: "user",
|
||||
accessToken: "token",
|
||||
cloud: false,
|
||||
});
|
||||
|
||||
const document = loader.createDocumentFromPage({
|
||||
id: "123",
|
||||
status: "current",
|
||||
title: "Self-hosted page",
|
||||
type: "page",
|
||||
body: { storage: { value: "<p>Hello</p>" } },
|
||||
version: { number: 1, by: { displayName: "User" }, when: "2026-01-01T00:00:00.000Z" },
|
||||
});
|
||||
|
||||
expect(document.metadata.url).toBe(
|
||||
"https://my.domain.com/confluence/spaces/SP/pages/123"
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "anything-llm-document-collector",
|
||||
"version": "1.11.1",
|
||||
"version": "1.12.1",
|
||||
"description": "Document collector server endpoints",
|
||||
"main": "index.js",
|
||||
"author": "Timothy Carambat (Mintplex Labs)",
|
||||
|
||||
@@ -46,10 +46,11 @@ async function loadConfluence(
|
||||
};
|
||||
}
|
||||
|
||||
const { origin, hostname } = new URL(baseUrl);
|
||||
console.log(`-- Working Confluence ${origin} --`);
|
||||
const normalizedBaseUrl = resolveConfluenceBaseUrl(baseUrl, cloud);
|
||||
const { hostname } = new URL(normalizedBaseUrl);
|
||||
console.log(`-- Working Confluence ${normalizedBaseUrl} --`);
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl: origin, // Use the origin to avoid issues with subdomains, ports, protocols, etc.
|
||||
baseUrl: normalizedBaseUrl,
|
||||
spaceKey,
|
||||
username,
|
||||
accessToken,
|
||||
@@ -98,13 +99,13 @@ async function loadConfluence(
|
||||
id: v4(),
|
||||
url: doc.metadata.url + ".page",
|
||||
title: doc.metadata.title || doc.metadata.source,
|
||||
docAuthor: origin,
|
||||
docAuthor: normalizedBaseUrl,
|
||||
description: doc.metadata.title,
|
||||
docSource: `${origin} Confluence`,
|
||||
docSource: `${normalizedBaseUrl} Confluence`,
|
||||
chunkSource: generateChunkSource(
|
||||
{
|
||||
doc,
|
||||
baseUrl: origin,
|
||||
baseUrl: normalizedBaseUrl,
|
||||
spaceKey,
|
||||
accessToken,
|
||||
username,
|
||||
@@ -182,8 +183,9 @@ async function fetchConfluencePage({
|
||||
}
|
||||
|
||||
console.log(`-- Working Confluence Page ${pageUrl} --`);
|
||||
const normalizedBaseUrl = resolveConfluenceBaseUrl(baseUrl, cloud);
|
||||
const loader = new ConfluencePagesLoader({
|
||||
baseUrl, // Should be the origin of the baseUrl
|
||||
baseUrl: normalizedBaseUrl,
|
||||
spaceKey,
|
||||
username,
|
||||
accessToken,
|
||||
@@ -243,6 +245,21 @@ function validBaseUrl(baseUrl) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the Confluence base URL, preserving context paths for self-hosted deployments.
|
||||
* @param {string} baseUrl
|
||||
* @param {boolean} cloud
|
||||
* @returns {string}
|
||||
*/
|
||||
function resolveConfluenceBaseUrl(baseUrl, cloud = true) {
|
||||
const url = new URL(baseUrl);
|
||||
// Cloud URLs use just the origin; self-hosted may have a context path like /confluence
|
||||
if (cloud) return url.origin;
|
||||
|
||||
const contextPath = url.pathname.replace(/\/+$/, "");
|
||||
return `${url.origin}${contextPath}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the full chunkSource for a specific Confluence page so that we can resync it later.
|
||||
* This data is encrypted into a single `payload` query param so we can replay credentials later
|
||||
@@ -271,4 +288,5 @@ function generateChunkSource(
|
||||
module.exports = {
|
||||
loadConfluence,
|
||||
fetchConfluencePage,
|
||||
resolveConfluenceBaseUrl,
|
||||
};
|
||||
|
||||
@@ -132,8 +132,9 @@ function writeToServerDocuments({
|
||||
|
||||
if (!fs.existsSync(destination))
|
||||
fs.mkdirSync(destination, { recursive: true });
|
||||
const safeFilename = sanitizeFileName(filename);
|
||||
const destinationFilePath = normalizePath(
|
||||
path.resolve(destination, filename) + ".json"
|
||||
path.resolve(destination, safeFilename) + ".json"
|
||||
);
|
||||
|
||||
fs.writeFileSync(destinationFilePath, JSON.stringify(data, null, 4), {
|
||||
@@ -210,10 +211,19 @@ function normalizePath(filepath = "") {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strips characters that are illegal in Windows filenames, including Unicode
|
||||
* quotation marks (U+201C, U+201D, etc.) that can get corrupted into ASCII
|
||||
* double-quotes during charset conversion in the upload pipeline.
|
||||
* @param {string} fileName - The filename to sanitize.
|
||||
* @returns {string} - The sanitized filename.
|
||||
*/
|
||||
function sanitizeFileName(fileName) {
|
||||
if (!fileName) return fileName;
|
||||
//eslint-disable-next-line
|
||||
return fileName.replace(/[<>:"\/\\|?*]/g, "");
|
||||
return fileName.replace(
|
||||
/[<>:"/\\|?*\u201C\u201D\u201E\u201F\u2018\u2019\u201A\u201B]/g,
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
|
||||
@@ -445,3 +445,7 @@ GID='1000'
|
||||
# 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)
|
||||
|
||||
# (optional) Comma-separated list of skills that are auto-approved.
|
||||
# This will allow the skill to be invoked without user interaction.
|
||||
# AGENT_AUTO_APPROVED_SKILLS=create-pdf-file,create-word-file
|
||||
|
||||
@@ -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.12.0
|
||||
ENV DEPLOYMENT_VERSION=1.12.1
|
||||
|
||||
# Setup the healthcheck
|
||||
HEALTHCHECK --interval=1m --timeout=10s --start-period=1m \
|
||||
|
||||
@@ -12,6 +12,7 @@ import { FullScreenLoader } from "./components/Preloader";
|
||||
import { ThemeProvider } from "./ThemeContext";
|
||||
import { PWAModeProvider } from "./PWAContext";
|
||||
import KeyboardShortcutsHelp from "@/components/KeyboardShortcutsHelp";
|
||||
import ImageLightbox from "@/components/ImageLightbox";
|
||||
import { ErrorBoundary } from "react-error-boundary";
|
||||
import ErrorBoundaryFallback from "./components/ErrorBoundaryFallback";
|
||||
|
||||
@@ -33,6 +34,7 @@ export default function App() {
|
||||
<Outlet />
|
||||
<ToastContainer />
|
||||
<KeyboardShortcutsHelp />
|
||||
<ImageLightbox />
|
||||
</I18nextProvider>
|
||||
</PfpProvider>
|
||||
</LogoProvider>
|
||||
|
||||
240
frontend/src/EmbeddingProgressContext.jsx
Normal file
240
frontend/src/EmbeddingProgressContext.jsx
Normal file
@@ -0,0 +1,240 @@
|
||||
import {
|
||||
createContext,
|
||||
useCallback,
|
||||
useContext,
|
||||
useEffect,
|
||||
useRef,
|
||||
useState,
|
||||
} from "react";
|
||||
import { fetchEventSource } from "@microsoft/fetch-event-source";
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders, safeJsonParse } from "@/utils/request";
|
||||
import Workspace from "@/models/workspace";
|
||||
|
||||
const EmbeddingProgressContext = createContext();
|
||||
|
||||
export function useEmbeddingProgress() {
|
||||
return useContext(EmbeddingProgressContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Workspace-specific hook that auto-connects SSE on mount and provides
|
||||
* a callback when progress is cleared (embedding complete + auto-clear timeout).
|
||||
* @param {string} slug - Workspace slug
|
||||
* @param {Object} options
|
||||
* @param {Function} [options.onProgressCleared] - Called when progress transitions from active to cleared
|
||||
*/
|
||||
export function useWorkspaceEmbeddingProgress(
|
||||
slug,
|
||||
{ onProgressCleared } = {}
|
||||
) {
|
||||
const { embeddingProgressMap, startEmbedding, connectSSE, removeQueuedFile } =
|
||||
useEmbeddingProgress();
|
||||
const embeddingProgress = embeddingProgressMap[slug] || null;
|
||||
|
||||
// Store callback in ref to avoid stale closures
|
||||
const onProgressClearedRef = useRef(onProgressCleared);
|
||||
useEffect(() => {
|
||||
onProgressClearedRef.current = onProgressCleared;
|
||||
}, [onProgressCleared]);
|
||||
|
||||
// Auto-connect SSE on mount to catch any active embedding job
|
||||
useEffect(() => {
|
||||
connectSSE(slug);
|
||||
}, [slug, connectSSE]);
|
||||
|
||||
// Detect when progress is cleared (non-null → null) and invoke callback
|
||||
const prevProgressRef = useRef(embeddingProgress);
|
||||
useEffect(() => {
|
||||
if (prevProgressRef.current && !embeddingProgress) {
|
||||
onProgressClearedRef.current?.();
|
||||
}
|
||||
prevProgressRef.current = embeddingProgress;
|
||||
}, [embeddingProgress]);
|
||||
|
||||
const removeQueued = useCallback(
|
||||
(filename) => removeQueuedFile(slug, filename),
|
||||
[slug, removeQueuedFile]
|
||||
);
|
||||
|
||||
return { embeddingProgress, startEmbedding, removeQueuedFile: removeQueued };
|
||||
}
|
||||
|
||||
const CLEANUP_DELAY_MS = 1_500;
|
||||
export function EmbeddingProgressProvider({ children }) {
|
||||
const [embeddingProgressMap, setEmbeddingProgressMap] = useState({});
|
||||
const abortControllersRef = useRef({});
|
||||
const cleanupTimeoutsRef = useRef({});
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
Object.values(abortControllersRef.current).forEach((ctrl) =>
|
||||
ctrl?.abort()
|
||||
);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const updateFileStatus = useCallback(
|
||||
(slug, filename, status) =>
|
||||
setEmbeddingProgressMap((prev) => ({
|
||||
...prev,
|
||||
[slug]: { ...prev[slug], [filename]: status },
|
||||
})),
|
||||
[]
|
||||
);
|
||||
|
||||
const handleMessage = useCallback(
|
||||
(slug, msg, ctrl) => {
|
||||
const data = safeJsonParse(msg.data);
|
||||
|
||||
switch (data.type) {
|
||||
case "batch_starting": {
|
||||
const initial = Object.fromEntries(
|
||||
(data.filenames || []).map((name) => [name, { status: "pending" }])
|
||||
);
|
||||
setEmbeddingProgressMap((prev) => ({
|
||||
...prev,
|
||||
[slug]: { ...initial, ...prev[slug] },
|
||||
}));
|
||||
break;
|
||||
}
|
||||
|
||||
case "doc_starting":
|
||||
updateFileStatus(slug, data.filename, {
|
||||
status: "embedding",
|
||||
chunksProcessed: 0,
|
||||
totalChunks: 0,
|
||||
});
|
||||
break;
|
||||
|
||||
case "chunk_progress":
|
||||
updateFileStatus(slug, data.filename, {
|
||||
status: "embedding",
|
||||
chunksProcessed: data.chunksProcessed,
|
||||
totalChunks: data.totalChunks,
|
||||
});
|
||||
break;
|
||||
|
||||
case "doc_complete":
|
||||
updateFileStatus(slug, data.filename, { status: "complete" });
|
||||
break;
|
||||
|
||||
case "doc_failed":
|
||||
updateFileStatus(slug, data.filename, {
|
||||
status: "failed",
|
||||
error: data.error || "Embedding failed",
|
||||
});
|
||||
break;
|
||||
|
||||
case "file_removed":
|
||||
setEmbeddingProgressMap((prev) => {
|
||||
const slugMap = { ...prev[slug] };
|
||||
delete slugMap[data.filename];
|
||||
if (Object.keys(slugMap).length === 0) {
|
||||
const { [slug]: _, ...rest } = prev;
|
||||
return rest;
|
||||
}
|
||||
return { ...prev, [slug]: slugMap };
|
||||
});
|
||||
break;
|
||||
|
||||
case "all_complete":
|
||||
// If there was an error, mark all pending or embedding files as failed
|
||||
// because something went wrong and we don't know the status of the files
|
||||
if (data.error) {
|
||||
setEmbeddingProgressMap((prev) => {
|
||||
const slugMap = { ...prev[slug] };
|
||||
for (const [filename, info] of Object.entries(slugMap)) {
|
||||
if (info.status === "pending" || info.status === "embedding") {
|
||||
slugMap[filename] = {
|
||||
status: "failed",
|
||||
error: data.error,
|
||||
};
|
||||
}
|
||||
}
|
||||
return { ...prev, [slug]: slugMap };
|
||||
});
|
||||
}
|
||||
ctrl.abort();
|
||||
delete abortControllersRef.current[slug];
|
||||
cleanupTimeoutsRef.current[slug] = setTimeout(() => {
|
||||
setEmbeddingProgressMap((prev) => {
|
||||
const { [slug]: _, ...rest } = prev;
|
||||
return rest;
|
||||
});
|
||||
delete cleanupTimeoutsRef.current[slug];
|
||||
}, CLEANUP_DELAY_MS);
|
||||
break;
|
||||
}
|
||||
},
|
||||
[updateFileStatus]
|
||||
);
|
||||
|
||||
/**
|
||||
* Open (or reconnect) an SSE connection for a given workspace slug.
|
||||
* Updates embeddingProgressMap in real time as events arrive.
|
||||
*/
|
||||
const connectSSE = useCallback(
|
||||
(slug) => {
|
||||
if (abortControllersRef.current[slug]) return;
|
||||
|
||||
const ctrl = new AbortController();
|
||||
abortControllersRef.current[slug] = ctrl;
|
||||
|
||||
fetchEventSource(`${API_BASE}/workspace/${slug}/embed-progress`, {
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
signal: ctrl.signal,
|
||||
openWhenHidden: true,
|
||||
onmessage: (msg) => handleMessage(slug, msg, ctrl),
|
||||
onclose: () => delete abortControllersRef.current[slug],
|
||||
onerror: () => {
|
||||
delete abortControllersRef.current[slug];
|
||||
throw new Error("SSE connection error");
|
||||
},
|
||||
}).catch(() => {});
|
||||
},
|
||||
[handleMessage]
|
||||
);
|
||||
|
||||
const startEmbedding = useCallback(
|
||||
(slug, filenames) => {
|
||||
abortControllersRef.current[slug]?.abort();
|
||||
delete abortControllersRef.current[slug];
|
||||
|
||||
if (cleanupTimeoutsRef.current[slug]) {
|
||||
clearTimeout(cleanupTimeoutsRef.current[slug]);
|
||||
delete cleanupTimeoutsRef.current[slug];
|
||||
}
|
||||
|
||||
const newEntries = Object.fromEntries(
|
||||
filenames.map((name) => [name, { status: "pending" }])
|
||||
);
|
||||
setEmbeddingProgressMap((prev) => ({
|
||||
...prev,
|
||||
[slug]: newEntries,
|
||||
}));
|
||||
|
||||
connectSSE(slug);
|
||||
},
|
||||
[connectSSE]
|
||||
);
|
||||
|
||||
const removeQueuedFile = useCallback(async (slug, filename) => {
|
||||
const { success } = await Workspace.removeQueuedEmbedding(slug, filename);
|
||||
return success;
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<EmbeddingProgressContext.Provider
|
||||
value={{
|
||||
embeddingProgressMap,
|
||||
startEmbedding,
|
||||
connectSSE,
|
||||
removeQueuedFile,
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</EmbeddingProgressContext.Provider>
|
||||
);
|
||||
}
|
||||
115
frontend/src/components/ImageLightbox/index.jsx
Normal file
115
frontend/src/components/ImageLightbox/index.jsx
Normal file
@@ -0,0 +1,115 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { createPortal } from "react-dom";
|
||||
import { X, CaretLeft, CaretRight } from "@phosphor-icons/react";
|
||||
|
||||
const OPEN_EVENT = "open-image-lightbox";
|
||||
|
||||
/**
|
||||
* Opens the image lightbox from anywhere in the app.
|
||||
* @param {{contentString: string, name: string}[]} images
|
||||
* @param {number} initialIndex
|
||||
*/
|
||||
export function openImageLightbox(images, initialIndex = 0) {
|
||||
window.dispatchEvent(
|
||||
new CustomEvent(OPEN_EVENT, { detail: { images, initialIndex } })
|
||||
);
|
||||
}
|
||||
|
||||
export default function ImageLightbox() {
|
||||
const [images, setImages] = useState(null);
|
||||
const [currentIndex, setCurrentIndex] = useState(0);
|
||||
|
||||
useEffect(() => {
|
||||
function handleOpen(e) {
|
||||
setImages(e.detail.images);
|
||||
setCurrentIndex(e.detail.initialIndex);
|
||||
}
|
||||
window.addEventListener(OPEN_EVENT, handleOpen);
|
||||
return () => window.removeEventListener(OPEN_EVENT, handleOpen);
|
||||
}, []);
|
||||
|
||||
function close() {
|
||||
setImages(null);
|
||||
}
|
||||
|
||||
function handlePrevious() {
|
||||
setCurrentIndex((prev) => (prev > 0 ? prev - 1 : images.length - 1));
|
||||
}
|
||||
|
||||
function handleNext() {
|
||||
setCurrentIndex((prev) => (prev < images.length - 1 ? prev + 1 : 0));
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!images) return;
|
||||
function handleKeyDown(e) {
|
||||
if (e.key === "Escape") close();
|
||||
else if (e.key === "ArrowLeft") handlePrevious();
|
||||
else if (e.key === "ArrowRight") handleNext();
|
||||
}
|
||||
window.addEventListener("keydown", handleKeyDown);
|
||||
return () => window.removeEventListener("keydown", handleKeyDown);
|
||||
}, [images]);
|
||||
|
||||
if (!images || images.length === 0) return null;
|
||||
const safeIndex = Math.min(currentIndex, images.length - 1);
|
||||
const currentImage = images[safeIndex];
|
||||
if (!currentImage) return null;
|
||||
|
||||
return createPortal(
|
||||
<div
|
||||
className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/90"
|
||||
onClick={close}
|
||||
>
|
||||
<button
|
||||
type="button"
|
||||
onClick={close}
|
||||
className="absolute top-4 right-4 p-2 text-white light:text-white hover:text-white/70 transition-colors rounded-full bg-white/10 hover:bg-white/20 border-none cursor-pointer"
|
||||
aria-label="Close lightbox"
|
||||
>
|
||||
<X size={24} weight="bold" />
|
||||
</button>
|
||||
|
||||
{images.length > 1 && (
|
||||
<>
|
||||
<button
|
||||
type="button"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
handlePrevious();
|
||||
}}
|
||||
className="absolute left-4 p-3 text-white light:text-white hover:text-white/70 transition-colors rounded-full bg-white/10 hover:bg-white/20 border-none cursor-pointer"
|
||||
aria-label="Previous image"
|
||||
>
|
||||
<CaretLeft size={24} weight="bold" />
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
handleNext();
|
||||
}}
|
||||
className="absolute right-4 p-3 text-white light:text-white hover:text-white/70 transition-colors rounded-full bg-white/10 hover:bg-white/20 border-none cursor-pointer"
|
||||
aria-label="Next image"
|
||||
>
|
||||
<CaretRight size={24} weight="bold" />
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
|
||||
<img
|
||||
src={currentImage.contentString}
|
||||
alt={currentImage.name || "attachment"}
|
||||
className="max-w-[90vw] max-h-[90vh] object-contain"
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
/>
|
||||
|
||||
{images.length > 1 && (
|
||||
<div className="absolute bottom-4 left-1/2 -translate-x-1/2 text-white/70 text-sm bg-black/50 px-3 py-1 rounded-full">
|
||||
{safeIndex + 1} / {images.length}
|
||||
</div>
|
||||
)}
|
||||
</div>,
|
||||
document.getElementById("root")
|
||||
);
|
||||
}
|
||||
@@ -106,7 +106,7 @@ export default function LemonadeOptions({ settings }) {
|
||||
type="url"
|
||||
name="LemonadeLLMBasePath"
|
||||
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"
|
||||
placeholder="http://localhost:8000"
|
||||
placeholder="http://localhost:13305"
|
||||
value={cleanBasePath(basePathValue.value)}
|
||||
required={true}
|
||||
autoComplete="off"
|
||||
@@ -150,7 +150,7 @@ export default function LemonadeOptions({ settings }) {
|
||||
type="number"
|
||||
name="LemonadeLLMModelTokenLimit"
|
||||
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"
|
||||
placeholder="4096"
|
||||
placeholder="8192"
|
||||
min={1}
|
||||
value={maxTokens}
|
||||
onChange={(e) => setMaxTokens(Number(e.target.value))}
|
||||
|
||||
@@ -2,7 +2,15 @@ import PreLoader from "@/components/Preloader";
|
||||
import WorkspaceFileRow from "./WorkspaceFileRow";
|
||||
import { memo, useEffect, useState } from "react";
|
||||
import ModalWrapper from "@/components/ModalWrapper";
|
||||
import { Eye, PushPin } from "@phosphor-icons/react";
|
||||
import {
|
||||
Eye,
|
||||
PushPin,
|
||||
CheckCircle,
|
||||
XCircle,
|
||||
CircleNotch,
|
||||
Clock,
|
||||
X,
|
||||
} from "@phosphor-icons/react";
|
||||
import { SEEN_DOC_PIN_ALERT, SEEN_WATCH_ALERT } from "@/utils/constants";
|
||||
import paths from "@/utils/paths";
|
||||
import { Link } from "react-router-dom";
|
||||
@@ -10,6 +18,8 @@ import Workspace from "@/models/workspace";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import { safeJsonParse } from "@/utils/request";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { middleTruncate } from "@/utils/directories";
|
||||
import { useEmbeddingProgress } from "@/EmbeddingProgressContext";
|
||||
|
||||
function WorkspaceDirectory({
|
||||
workspace,
|
||||
@@ -25,6 +35,8 @@ function WorkspaceDirectory({
|
||||
movedItems,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const { embeddingProgressMap, removeQueuedFile } = useEmbeddingProgress();
|
||||
const embeddingProgress = embeddingProgressMap[workspace.slug] || null;
|
||||
const [selectedItems, setSelectedItems] = useState({});
|
||||
const embeddedDocCount = (files?.items ?? []).reduce(
|
||||
(sum, folder) => sum + (folder.items?.length ?? 0),
|
||||
@@ -98,12 +110,6 @@ function WorkspaceDirectory({
|
||||
</h3>
|
||||
</div>
|
||||
<div className="relative w-[560px] h-[445px] bg-theme-settings-input-bg rounded-2xl mt-5 border border-theme-modal-border">
|
||||
<div className="text-white/80 text-xs grid grid-cols-12 py-2 px-3.5 border-b border-white/20 light:border-theme-modal-border bg-theme-settings-input-bg sticky top-0 z-10 rounded-t-2xl">
|
||||
<div className="col-span-10 flex items-center gap-x-[4px]">
|
||||
<div className="shrink-0 w-3 h-3" />
|
||||
<p className="ml-[7px] text-theme-text-primary">Name</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="w-full h-[calc(100%-40px)] flex items-center justify-center flex-col gap-y-5">
|
||||
<PreLoader />
|
||||
<p className="text-theme-text-primary text-sm font-semibold animate-pulse text-center w-1/3">
|
||||
@@ -115,6 +121,56 @@ function WorkspaceDirectory({
|
||||
);
|
||||
}
|
||||
|
||||
if (embeddingProgress) {
|
||||
return (
|
||||
<div className="px-8">
|
||||
<div className="flex items-center justify-start w-[560px]">
|
||||
<h3 className="text-white text-base font-bold ml-5">
|
||||
{workspace.name}
|
||||
</h3>
|
||||
</div>
|
||||
<div className="relative w-[560px] h-[445px] bg-theme-settings-input-bg rounded-2xl mt-5 border border-theme-modal-border">
|
||||
<div className="text-white/80 text-xs grid grid-cols-12 py-2 px-3.5 border-b border-white/20 light:border-theme-modal-border bg-theme-settings-input-bg sticky top-0 z-10 rounded-t-2xl">
|
||||
<div className="col-span-8 flex items-center gap-x-[4px]">
|
||||
<div className="shrink-0 w-3 h-3" />
|
||||
<p className="ml-[7px] text-theme-text-primary">Name</p>
|
||||
</div>
|
||||
<p className="col-span-4 text-right text-theme-text-primary pr-1">
|
||||
Status
|
||||
</p>
|
||||
</div>
|
||||
<div className="overflow-y-auto h-[calc(100%-40px)]">
|
||||
{Object.entries(embeddingProgress).map(([filename, fileStatus]) => (
|
||||
<EmbeddingFileRow
|
||||
key={filename}
|
||||
filename={filename}
|
||||
status={fileStatus}
|
||||
onRemove={
|
||||
fileStatus.status === "pending"
|
||||
? () => removeQueuedFile(workspace.slug, filename)
|
||||
: null
|
||||
}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
{hasChanges && movedItems.length > 0 && (
|
||||
<div className="flex items-center justify-between w-[560px] mt-3">
|
||||
<p className="text-theme-text-secondary text-sm">
|
||||
{movedItems.length} additional file(s) ready to embed
|
||||
</p>
|
||||
<button
|
||||
onClick={handleSaveChanges}
|
||||
className="border border-slate-200 px-5 py-1.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"
|
||||
>
|
||||
Add to queue
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="px-8">
|
||||
@@ -459,4 +515,121 @@ function WorkspaceDocumentTooltips() {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} filename
|
||||
*/
|
||||
const getDisplayName = (filename) => {
|
||||
const base = filename.split("/").pop() || filename;
|
||||
return base.replace(
|
||||
/-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}\.json$/,
|
||||
""
|
||||
);
|
||||
};
|
||||
|
||||
const STATUS_STYLES = {
|
||||
pending: {
|
||||
icon: (
|
||||
<Clock
|
||||
size={16}
|
||||
className="text-slate-100 light:text-slate-900/40 shrink-0"
|
||||
weight="regular"
|
||||
/>
|
||||
),
|
||||
textColor: "text-slate-100 light:text-slate-900/70",
|
||||
label: "Queued",
|
||||
},
|
||||
embedding: {
|
||||
icon: (
|
||||
<CircleNotch
|
||||
size={16}
|
||||
className="text-slate-100 light:text-slate-900/40 animate-spin shrink-0"
|
||||
weight="bold"
|
||||
/>
|
||||
),
|
||||
textColor: "text-slate-100 light:text-slate-900/70",
|
||||
label: "Embedding",
|
||||
},
|
||||
complete: {
|
||||
icon: (
|
||||
<CheckCircle
|
||||
size={16}
|
||||
className="text-green-400 light:text-green-600 shrink-0"
|
||||
weight="fill"
|
||||
/>
|
||||
),
|
||||
textColor: "text-green-400 light:text-green-600",
|
||||
label: "Complete",
|
||||
},
|
||||
failed: {
|
||||
icon: (
|
||||
<XCircle
|
||||
size={16}
|
||||
className="text-red-400 light:text-red-600 shrink-0"
|
||||
weight="fill"
|
||||
/>
|
||||
),
|
||||
textColor: "text-red-400 light:text-red-600",
|
||||
label: "Failed",
|
||||
},
|
||||
};
|
||||
|
||||
function EmbeddingFileRow({ filename, status: fileStatus, onRemove }) {
|
||||
const { status, chunksProcessed = 0, totalChunks = 0 } = fileStatus;
|
||||
const displayName = getDisplayName(filename);
|
||||
const isEmbedding = status === "embedding";
|
||||
const pct =
|
||||
isEmbedding && totalChunks > 0
|
||||
? Math.round((chunksProcessed / totalChunks) * 100)
|
||||
: 0;
|
||||
|
||||
return (
|
||||
<div className="text-slate-100 light:text-slate-900 text-xs grid grid-cols-12 py-2 pl-3.5 pr-3.5 h-[34px] items-center border-b border-white/5">
|
||||
<div className="col-span-7 flex items-center gap-x-2 overflow-hidden">
|
||||
{STATUS_STYLES[status]?.icon || STATUS_STYLES.pending.icon}
|
||||
<p
|
||||
className={`whitespace-nowrap overflow-hidden text-ellipsis ${
|
||||
status === "failed" ? "text-red-400" : ""
|
||||
}`}
|
||||
title={displayName}
|
||||
>
|
||||
{middleTruncate(displayName, 40)}
|
||||
</p>
|
||||
</div>
|
||||
<div className="col-span-5 flex justify-end items-center gap-x-2">
|
||||
{isEmbedding ? (
|
||||
<div className="flex items-center gap-x-2 w-full justify-end">
|
||||
<div className="w-20 h-[1.5px] bg-white/10 light:bg-sky-900/10 rounded-full overflow-hidden">
|
||||
<div
|
||||
className="h-full bg-white light:bg-sky-400 rounded-full transition-all duration-300"
|
||||
style={{ width: `${pct}%` }}
|
||||
/>
|
||||
</div>
|
||||
<p className="text-xs whitespace-nowrap w-8 text-right">{pct}%</p>
|
||||
</div>
|
||||
) : (
|
||||
<div className="flex items-center gap-x-2">
|
||||
<p
|
||||
className={`text-xs italic whitespace-nowrap flex gap-2 justify-center items-center ${STATUS_STYLES[status]?.textColor}`}
|
||||
>
|
||||
{STATUS_STYLES[status]?.label || "Queued"}
|
||||
</p>
|
||||
{onRemove && (
|
||||
<button
|
||||
onClick={onRemove}
|
||||
className="border-none hover:bg-white/10 light:hover:bg-sky-900/10 rounded p-0.5 transition-colors"
|
||||
title="Remove from queue"
|
||||
>
|
||||
<X
|
||||
size={14}
|
||||
className="text-slate-100 light:text-slate-900/40 hover:text-slate-100 light:hover:text-slate-900"
|
||||
/>
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
export default memo(WorkspaceDirectory);
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { ArrowsDownUp } from "@phosphor-icons/react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useEffect, useMemo, 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";
|
||||
import { useWorkspaceEmbeddingProgress } from "@/EmbeddingProgressContext";
|
||||
|
||||
export default function DocumentSettings({ workspace }) {
|
||||
const [highlightWorkspace, setHighlightWorkspace] = useState(false);
|
||||
@@ -21,6 +22,14 @@ export default function DocumentSettings({ workspace }) {
|
||||
availableDocsRef.current = availableDocs;
|
||||
}, [availableDocs]);
|
||||
|
||||
const fetchKeysRef = useRef(null);
|
||||
const { embeddingProgress, startEmbedding } = useWorkspaceEmbeddingProgress(
|
||||
workspace.slug,
|
||||
{
|
||||
onProgressCleared: () => fetchKeysRef.current?.(true),
|
||||
}
|
||||
);
|
||||
|
||||
async function fetchKeys(refetchWorkspace = false, options = {}) {
|
||||
const { autoSelectNew = false } = options;
|
||||
const previousIds = new Set();
|
||||
@@ -31,7 +40,6 @@ export default function DocumentSettings({ workspace }) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setLoading(true);
|
||||
const localFiles = await System.localFiles();
|
||||
const currentWorkspace = refetchWorkspace
|
||||
@@ -99,6 +107,10 @@ export default function DocumentSettings({ workspace }) {
|
||||
setLoading(false);
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
fetchKeysRef.current = fetchKeys;
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
fetchKeys(true);
|
||||
}, []);
|
||||
@@ -106,36 +118,35 @@ export default function DocumentSettings({ workspace }) {
|
||||
const updateWorkspace = async (e) => {
|
||||
e.preventDefault();
|
||||
setLoading(true);
|
||||
showToast("Updating workspace...", "info", { autoClose: false });
|
||||
setLoadingMessage("This may take a while for large documents");
|
||||
|
||||
const changesToSend = {
|
||||
adds: movedItems.map((item) => `${item.folderName}/${item.name}`),
|
||||
};
|
||||
const filenames = movedItems.map(
|
||||
(item) => `${item.folderName}/${item.name}`
|
||||
);
|
||||
const changesToSend = { adds: filenames };
|
||||
|
||||
setSelectedItems({});
|
||||
setHasChanges(false);
|
||||
setHighlightWorkspace(false);
|
||||
await Workspace.modifyEmbeddings(workspace.slug, changesToSend)
|
||||
.then((res) => {
|
||||
if (!!res.message) {
|
||||
showToast(`Error: ${res.message}`, "error", { clear: true });
|
||||
return;
|
||||
}
|
||||
showToast("Workspace updated successfully.", "success", {
|
||||
clear: true,
|
||||
});
|
||||
})
|
||||
.catch((error) => {
|
||||
showToast(`Workspace update failed: ${error}`, "error", {
|
||||
clear: true,
|
||||
});
|
||||
});
|
||||
|
||||
setMovedItems([]);
|
||||
await fetchKeys(true);
|
||||
// Fire the embed POST first so the server is already processing the job
|
||||
// by the time the SSE connection opens. This avoids the server sending
|
||||
// idle (no active job) before embedding has started.
|
||||
const embedPromise = Workspace.modifyEmbeddings(
|
||||
workspace.slug,
|
||||
changesToSend
|
||||
);
|
||||
startEmbedding(workspace.slug, filenames);
|
||||
|
||||
embedPromise.catch((error) => {
|
||||
showToast(`Workspace update failed: ${error}`, "error", {
|
||||
clear: true,
|
||||
});
|
||||
});
|
||||
|
||||
setLoading(false);
|
||||
setLoadingMessage("");
|
||||
setMovedItems([]);
|
||||
};
|
||||
|
||||
const moveSelectedItemsToWorkspace = () => {
|
||||
@@ -191,10 +202,29 @@ export default function DocumentSettings({ workspace }) {
|
||||
setSelectedItems({});
|
||||
};
|
||||
|
||||
const visibleAvailableDocs = useMemo(() => {
|
||||
const embeddingFilenames = new Set(Object.keys(embeddingProgress ?? {}));
|
||||
if (embeddingFilenames.size === 0) return availableDocs;
|
||||
return {
|
||||
...availableDocs,
|
||||
items: (availableDocs.items ?? []).map((folder) => {
|
||||
if (folder.items && folder.type === "folder") {
|
||||
return {
|
||||
...folder,
|
||||
items: folder.items.filter(
|
||||
(file) => !embeddingFilenames.has(`${folder.name}/${file.name}`)
|
||||
),
|
||||
};
|
||||
}
|
||||
return folder;
|
||||
}),
|
||||
};
|
||||
}, [availableDocs, embeddingProgress]);
|
||||
|
||||
return (
|
||||
<div className="flex upload-modal -mt-6 z-10 relative">
|
||||
<Directory
|
||||
files={availableDocs}
|
||||
files={visibleAvailableDocs}
|
||||
setFiles={setAvailableDocs}
|
||||
loading={loading}
|
||||
loadingMessage={loadingMessage}
|
||||
|
||||
@@ -4,11 +4,12 @@ import { useTranslation } from "react-i18next";
|
||||
import { useParams } from "react-router-dom";
|
||||
import Workspace from "../../../models/workspace";
|
||||
import System from "../../../models/system";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import { isMobileOnly } from "react-device-detect";
|
||||
import useUser from "../../../hooks/useUser";
|
||||
import DocumentSettings from "./Documents";
|
||||
import DataConnectors from "./DataConnectors";
|
||||
import ModalWrapper from "@/components/ModalWrapper";
|
||||
import { EmbeddingProgressProvider } from "@/EmbeddingProgressContext";
|
||||
|
||||
const noop = () => {};
|
||||
const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
|
||||
@@ -37,7 +38,7 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
|
||||
|
||||
if (!workspace) return null;
|
||||
|
||||
if (isMobile) {
|
||||
if (isMobileOnly) {
|
||||
return (
|
||||
<ModalWrapper isOpen={true}>
|
||||
<div className="w-full max-w-2xl bg-theme-bg-secondary rounded-lg shadow border-2 border-theme-modal-border overflow-hidden">
|
||||
@@ -102,7 +103,9 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
|
||||
)}
|
||||
|
||||
{selectedTab === "documents" ? (
|
||||
<DocumentSettings workspace={workspace} />
|
||||
<EmbeddingProgressProvider>
|
||||
<DocumentSettings workspace={workspace} />
|
||||
</EmbeddingProgressProvider>
|
||||
) : (
|
||||
<DataConnectors workspace={workspace} systemSettings={settings} />
|
||||
)}
|
||||
|
||||
@@ -31,6 +31,7 @@ import CustomCell from "./CustomCell.jsx";
|
||||
import Tooltip from "./CustomTooltip.jsx";
|
||||
import { safeJsonParse } from "@/utils/request.js";
|
||||
import renderMarkdown from "@/utils/chat/markdown.js";
|
||||
import DOMPurify from "dompurify";
|
||||
import { memo, useCallback, useState } from "react";
|
||||
import { saveAs } from "file-saver";
|
||||
import { useGenerateImage } from "recharts-to-png";
|
||||
@@ -394,7 +395,7 @@ export function Chartable({ props }) {
|
||||
<span
|
||||
className="flex flex-col gap-y-1 mt-2"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: renderMarkdown(content.caption),
|
||||
__html: DOMPurify.sanitize(renderMarkdown(content.caption)),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
@@ -413,7 +414,7 @@ export function Chartable({ props }) {
|
||||
<span
|
||||
className="flex flex-col gap-y-1 mt-2"
|
||||
dangerouslySetInnerHTML={{
|
||||
__html: renderMarkdown(content.caption),
|
||||
__html: DOMPurify.sanitize(renderMarkdown(content.caption)),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -12,6 +12,9 @@ import {
|
||||
LinkSimple,
|
||||
GitlabLogo,
|
||||
} from "@phosphor-icons/react";
|
||||
import GmailLogo from "@/pages/Admin/Agents/GMailSkillPanel/gmail.png";
|
||||
import GoogleCalendarLogo from "@/pages/Admin/Agents/GoogleCalendarSkillPanel/google-calendar.png";
|
||||
import OutlookLogo from "@/pages/Admin/Agents/OutlookSkillPanel/outlook.png";
|
||||
import { toPercentString } from "@/utils/numbers";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { useSourcesSidebar } from "../../SourcesSidebar";
|
||||
@@ -28,18 +31,37 @@ const CIRCLE_ICONS = {
|
||||
paperlessNgx: FileText,
|
||||
};
|
||||
|
||||
const CIRCLE_IMAGES = {
|
||||
gmailThread: GmailLogo,
|
||||
gmailAttachment: GmailLogo,
|
||||
googleCalendar: GoogleCalendarLogo,
|
||||
outlookThread: OutlookLogo,
|
||||
outlookAttachment: OutlookLogo,
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the custom image for a given type, or null if no custom image is available.
|
||||
* @param {string} type
|
||||
* @returns {string|null}
|
||||
*/
|
||||
export function getCustomImage(type) {
|
||||
return CIRCLE_IMAGES[type] ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a circle with a source type icon inside, or a favicon if URL is provided.
|
||||
* @param {"file"|"link"|"youtube"|"github"|"gitlab"|"confluence"|"drupalwiki"|"obsidian"|"paperlessNgx"} props.type
|
||||
* @param {number} [props.size] - Circle diameter in px
|
||||
* @param {number} [props.iconSize] - Icon size in px
|
||||
* @param {string} [props.url] - Optional URL to fetch favicon from
|
||||
* @param {string} [props.customImage] - Optional custom image to display
|
||||
*/
|
||||
export function SourceTypeCircle({
|
||||
type = "file",
|
||||
size = 22,
|
||||
iconSize = 12,
|
||||
url = null,
|
||||
customImage = null,
|
||||
}) {
|
||||
const Icon = CIRCLE_ICONS[type] || CIRCLE_ICONS.file;
|
||||
const [imgError, setImgError] = useState(false);
|
||||
@@ -60,7 +82,7 @@ export function SourceTypeCircle({
|
||||
|
||||
return (
|
||||
<div
|
||||
className="bg-white light:bg-slate-100 rounded-full flex items-center justify-center overflow-hidden"
|
||||
className={`${customImage ? "bg-transparent border-none" : "bg-white light:bg-slate-100 border-zinc-800 light:border-white rounded-full"} flex items-center justify-center overflow-hidden`}
|
||||
style={{ width: size, height: size }}
|
||||
>
|
||||
{faviconUrl && !imgError ? (
|
||||
@@ -71,6 +93,13 @@ export function SourceTypeCircle({
|
||||
className="object-cover"
|
||||
onError={() => setImgError(true)}
|
||||
/>
|
||||
) : customImage ? (
|
||||
<img
|
||||
src={customImage}
|
||||
alt={type}
|
||||
style={{ width: size, height: size }}
|
||||
className="object-contain bg-transparent"
|
||||
/>
|
||||
) : (
|
||||
<Icon size={iconSize} weight="bold" className="text-black" />
|
||||
)}
|
||||
@@ -133,10 +162,11 @@ export default function Citations({ sources = [] }) {
|
||||
>
|
||||
{visibleSources.map((source, idx) => {
|
||||
const info = parseChunkSource(source);
|
||||
const customImage = CIRCLE_IMAGES[info.icon];
|
||||
return (
|
||||
<div
|
||||
key={source.title || idx}
|
||||
className="absolute top-0 size-[22px] rounded-full border-2 border-zinc-800 light:border-white"
|
||||
className={`absolute top-0 size-[22px] rounded-full ${customImage ? "border-none" : "border-2 border-zinc-800 light:border-white"}`}
|
||||
style={{ left: `${idx * 17}px`, zIndex: 3 - idx }}
|
||||
>
|
||||
<SourceTypeCircle
|
||||
@@ -144,6 +174,7 @@ export default function Citations({ sources = [] }) {
|
||||
size={18}
|
||||
iconSize={10}
|
||||
url={info.href}
|
||||
customImage={customImage}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
@@ -262,6 +293,11 @@ const supportedSources = [
|
||||
"youtube://",
|
||||
"obsidian://",
|
||||
"paperless-ngx://",
|
||||
"gmail-thread://",
|
||||
"gmail-attachment://",
|
||||
"google-calendar://",
|
||||
"outlook-thread://",
|
||||
"outlook-attachment://",
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -342,6 +378,30 @@ export function parseChunkSource({ title = "", chunks = [] }) {
|
||||
icon = "paperlessNgx";
|
||||
break;
|
||||
|
||||
case "gmail-thread://":
|
||||
text = title;
|
||||
icon = "gmailThread";
|
||||
break;
|
||||
case "gmail-attachment://":
|
||||
text = title;
|
||||
icon = "gmailAttachment";
|
||||
break;
|
||||
|
||||
case "google-calendar://":
|
||||
text = title;
|
||||
icon = "googleCalendar";
|
||||
break;
|
||||
|
||||
case "outlook-thread://":
|
||||
text = title;
|
||||
icon = "outlookThread";
|
||||
break;
|
||||
|
||||
case "outlook-attachment://":
|
||||
text = title;
|
||||
icon = "outlookAttachment";
|
||||
break;
|
||||
|
||||
default:
|
||||
text = url.host + url.pathname;
|
||||
icon = "link";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import React, { memo, useEffect, useRef, useState } from "react";
|
||||
import React, { memo, useLayoutEffect, useRef, useState } from "react";
|
||||
import { Info, Warning } from "@phosphor-icons/react";
|
||||
import Actions from "./Actions";
|
||||
import renderMarkdown from "@/utils/chat/markdown";
|
||||
@@ -19,9 +19,10 @@ import { useTranslation } from "react-i18next";
|
||||
import { Link } from "react-router-dom";
|
||||
import { chatQueryRefusalResponse } from "@/utils/chat";
|
||||
import HistoricalOutputs from "./HistoricalOutputs";
|
||||
import { openImageLightbox } from "@/components/ImageLightbox";
|
||||
|
||||
const HistoricalMessage = ({
|
||||
uuid = v4(),
|
||||
uuid: uuidProp,
|
||||
message,
|
||||
role,
|
||||
workspace,
|
||||
@@ -37,6 +38,10 @@ const HistoricalMessage = ({
|
||||
metrics = {},
|
||||
outputs = [],
|
||||
}) => {
|
||||
// Freeze uuid on first render. User messages arrive without a uuid and this value
|
||||
// is used as the wrapper div's `key` — a default param fallback would regenerate
|
||||
// on every render and remount the subtree, wiping TruncatableContent state.
|
||||
const [uuid] = useState(() => uuidProp ?? v4());
|
||||
const { t } = useTranslation();
|
||||
const { isEditing } = useEditMessage({ chatId, role });
|
||||
const { isDeleted, completeDelete, onEndAnimation } = useWatchDeleteMessage({
|
||||
@@ -205,17 +210,27 @@ export default memo(
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Currently only renders image attachments as clickable thumbnails that open in the lightbox.
|
||||
* Other attachment types may be supported here in the future.
|
||||
*/
|
||||
function ChatAttachments({ attachments = [] }) {
|
||||
if (!attachments.length) return null;
|
||||
return (
|
||||
<div className="flex flex-wrap gap-4 mt-4">
|
||||
{attachments.map((item) => (
|
||||
<img
|
||||
alt={`Attachment: ${item.name}`}
|
||||
{attachments.map((item, index) => (
|
||||
<button
|
||||
type="button"
|
||||
key={item.name}
|
||||
src={item.contentString}
|
||||
className="w-[120px] h-[120px] object-cover rounded-lg"
|
||||
/>
|
||||
onClick={() => openImageLightbox(attachments, index)}
|
||||
className="p-0 border-none bg-transparent cursor-pointer hover:opacity-80 transition-opacity"
|
||||
>
|
||||
<img
|
||||
alt={`Attachment: ${item.name}`}
|
||||
src={item.contentString}
|
||||
className="w-[120px] h-[120px] object-cover rounded-lg"
|
||||
/>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
@@ -227,7 +242,9 @@ function TruncatableContent({ children }) {
|
||||
const [isOverflowing, setIsOverflowing] = useState(false);
|
||||
const { t } = useTranslation();
|
||||
|
||||
useEffect(() => {
|
||||
// useLayoutEffect (not useEffect) so collapse applies before paint — avoids a
|
||||
// one-frame flash of uncollapsed content on mount.
|
||||
useLayoutEffect(() => {
|
||||
if (contentRef.current) {
|
||||
setIsOverflowing(contentRef.current.scrollHeight > 250);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
X,
|
||||
} from "@phosphor-icons/react";
|
||||
import { REMOVE_ATTACHMENT_EVENT } from "../../DnDWrapper";
|
||||
import { openImageLightbox } from "@/components/ImageLightbox";
|
||||
|
||||
/**
|
||||
* @param {{attachments: import("../../DnDWrapper").Attachment[]}}
|
||||
@@ -18,10 +19,25 @@ import { REMOVE_ATTACHMENT_EVENT } from "../../DnDWrapper";
|
||||
*/
|
||||
export default function AttachmentManager({ attachments }) {
|
||||
if (attachments.length === 0) return null;
|
||||
|
||||
function handleImageClick(attachment) {
|
||||
const imageAttachments = attachments
|
||||
.filter((a) => a.type === "attachment" && a.contentString)
|
||||
.map((a) => ({ contentString: a.contentString, name: a.file.name }));
|
||||
const idx = imageAttachments.findIndex(
|
||||
(img) => img.name === attachment.file?.name
|
||||
);
|
||||
if (idx !== -1) openImageLightbox(imageAttachments, idx);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-wrap gap-2 mt-2 mb-4">
|
||||
{attachments.map((attachment) => (
|
||||
<AttachmentItem key={attachment.uid} attachment={attachment} />
|
||||
<AttachmentItem
|
||||
key={attachment.uid}
|
||||
attachment={attachment}
|
||||
onImageClick={() => handleImageClick(attachment)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
@@ -30,7 +46,7 @@ export default function AttachmentManager({ attachments }) {
|
||||
/**
|
||||
* @param {{attachment: import("../../DnDWrapper").Attachment}}
|
||||
*/
|
||||
function AttachmentItem({ attachment }) {
|
||||
function AttachmentItem({ attachment, onImageClick }) {
|
||||
const { uid, file, status, error, document, type, contentString } =
|
||||
attachment;
|
||||
const { iconBgColor, Icon } = displayFromFile(file);
|
||||
@@ -115,12 +131,18 @@ function AttachmentItem({ attachment }) {
|
||||
<X size={10} className="flex-shrink-0" />
|
||||
</button>
|
||||
</div>
|
||||
<img
|
||||
alt={`Preview of ${file.name}`}
|
||||
src={contentString}
|
||||
style={{ objectFit: "cover", objectPosition: "center" }}
|
||||
className={`${iconBgColor} w-[40px] h-[40px] rounded-lg flex items-center justify-center`}
|
||||
/>
|
||||
<button
|
||||
type="button"
|
||||
onClick={onImageClick}
|
||||
className="p-0 border-none bg-transparent cursor-pointer"
|
||||
>
|
||||
<img
|
||||
alt={`Preview of ${file.name}`}
|
||||
src={contentString}
|
||||
style={{ objectFit: "cover", objectPosition: "center" }}
|
||||
className={`${iconBgColor} w-[40px] h-[40px] rounded-lg flex items-center justify-center`}
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
import { parseChunkSource, SourceTypeCircle } from "../../ChatHistory/Citation";
|
||||
import {
|
||||
parseChunkSource,
|
||||
SourceTypeCircle,
|
||||
getCustomImage,
|
||||
} from "../../ChatHistory/Citation";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function SourceItem({ source, onClick }) {
|
||||
const { t } = useTranslation();
|
||||
const info = parseChunkSource(source);
|
||||
const subtitle = info.isUrl ? info.text : t("chat_window.document");
|
||||
const customImage = getCustomImage(info?.icon);
|
||||
const subtitle = info?.isUrl ? info?.text : t("chat_window.document");
|
||||
|
||||
return (
|
||||
<button
|
||||
@@ -18,6 +23,7 @@ export default function SourceItem({ source, onClick }) {
|
||||
size={16}
|
||||
iconSize={10}
|
||||
url={info.href}
|
||||
customImage={customImage}
|
||||
/>
|
||||
<p className="flex-1 font-medium text-sm text-white light:text-slate-900 leading-[15px] truncate">
|
||||
{source.title}
|
||||
|
||||
@@ -2,6 +2,7 @@ import { useState, useRef, useEffect, useMemo } from "react";
|
||||
import { SlidersHorizontal } from "@phosphor-icons/react";
|
||||
import useLoginMode from "@/hooks/useLoginMode";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { isMobile } from "react-device-detect";
|
||||
|
||||
function getTextSizes(t) {
|
||||
return [
|
||||
@@ -47,6 +48,7 @@ export default function TextSizeMenu() {
|
||||
// User icon is visible when login mode is active (single with password or multi-user)
|
||||
const hasUserIcon = mode !== null;
|
||||
|
||||
if (isMobile) return null;
|
||||
return (
|
||||
<div
|
||||
className={`absolute top-3 md:top-5 z-30 ${hasUserIcon ? "right-[55px] md:right-[67px]" : "right-4 md:right-6"}`}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { useParams } from "react-router-dom";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import useUser from "@/hooks/useUser";
|
||||
import { useModal } from "@/hooks/useModal";
|
||||
import LLMSelectorModal from "../PromptInput/LLMSelector/index";
|
||||
@@ -75,7 +76,7 @@ export default function WorkspaceModelPicker({ workspaceSlug = null }) {
|
||||
|
||||
// This feature is disabled for multi-user instances where the user is not an admin
|
||||
if (!!user && user.role !== "admin") return null;
|
||||
if (!slug) return null;
|
||||
if (!slug || isMobile) return null;
|
||||
|
||||
return (
|
||||
<>
|
||||
|
||||
@@ -407,6 +407,306 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "موصل Gmail",
|
||||
description:
|
||||
"اسمح لمسؤولك بالتفاعل مع Gmail - للبحث عن رسائل البريد الإلكتروني، وقراءة المحادثات، وكتابة المسودات، وإرسال رسائل البريد الإلكتروني، وإدارة صندوق الوارد الخاص بك. <a>اقرأ الوثائق</a>.",
|
||||
multiUserWarning:
|
||||
"لا تتوفر تكامل Gmail في الوضع متعدد المستخدمين لأسباب تتعلق بالأمان. يرجى تعطيل الوضع متعدد المستخدمين لاستخدام هذه الميزة.",
|
||||
configuration: "إعدادات Gmail",
|
||||
deploymentId: "رقم التوزيع",
|
||||
deploymentIdHelp:
|
||||
"معرّف النشر من تطبيق الويب الخاص بك في Google Apps Script",
|
||||
apiKey: "مفتاح واجهة برمجة التطبيقات",
|
||||
apiKeyHelp:
|
||||
"مفتاح واجهة برمجة التطبيقات (API) الذي قمت بتكوينه في تطبيق Google Apps Script الخاص بك.",
|
||||
configurationRequired:
|
||||
"يرجى تكوين مُعرّف النشر والمفتاح الخاص لواجهة برمجة التطبيقات لتمكين ميزات Gmail.",
|
||||
configured: "تم التكوين",
|
||||
searchSkills: "مهارات البحث...",
|
||||
noSkillsFound: "لا توجد مهارات تتطابق مع بحثك.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "البحث عن الرسائل وقراءتها",
|
||||
description:
|
||||
"ابحث و اقرأ رسائل البريد الإلكتروني من صندوق بريدك الوارد في Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "نماذج رسائل بريد إلكتروني",
|
||||
description: "إنشاء، وتحرير، وإدارة مسودات الرسائل الإلكترونية.",
|
||||
},
|
||||
send: {
|
||||
title: "إرسال واستقبال الرسائل الإلكترونية",
|
||||
description: "أرسل رسائل بريد إلكتروني واستجب للمناقشات على الفور.",
|
||||
},
|
||||
threads: {
|
||||
title: "إدارة سلاسل رسائل البريد الإلكتروني",
|
||||
description:
|
||||
'إدارة سلاسل رسائل البريد الإلكتروني: وضع علامة "قرأ/لم يقرأ"، والاحتفاظ بها، وحذفها.',
|
||||
},
|
||||
account: {
|
||||
title: "إحصائيات التكامل",
|
||||
description: "عرض إحصائيات صندوق البريد ومعلومات الحساب.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "البحث في رسائل البريد الإلكتروني",
|
||||
description:
|
||||
"ابحث في رسائل البريد الإلكتروني باستخدام صيغة استعلام Gmail.",
|
||||
},
|
||||
readThread: {
|
||||
title: "اقرأ الموضوع",
|
||||
description:
|
||||
"اقرأ سلسلة رسائل بريد إلكتروني كاملة من خلال معرف المستخدم (ID).",
|
||||
},
|
||||
createDraft: {
|
||||
title: "إنشاء مسودة",
|
||||
description: "إنشاء رسالة بريد إلكتروني جديدة.",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "إنشاء رد مقترح",
|
||||
description: "قم بإنشاء رد مقترح على موضوع قائم.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "تحديث المسودة",
|
||||
description: "تحديث رسالة بريد إلكتروني مسودة موجودة.",
|
||||
},
|
||||
getDraft: {
|
||||
title: "الحصول على النسخة الأولية",
|
||||
description: "استرجاع مسودة محددة باستخدام رقم التعريف.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "قائمة المسودات",
|
||||
description: "اعرض جميع رسائل البريد الإلكتروني المقترحة.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "حذف المسودة",
|
||||
description: "حذف رسالة بريد إلكتروني مسودة.",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "إرسال مسودة",
|
||||
description: "أرسل نسخة من رسالة بريد إلكتروني موجودة.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "إرسال بريد إلكتروني",
|
||||
description: "أرسل بريدًا إلكترونيًا على الفور.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "الرد على الموضوع",
|
||||
description: "الرد على سلسلة رسائل البريد الإلكتروني على الفور.",
|
||||
},
|
||||
markRead: {
|
||||
title: "مارك ريد",
|
||||
description: "ضع علامة على الموضوع بأنه تمت قراءته.",
|
||||
},
|
||||
markUnread: {
|
||||
title: 'وضع علامة "لم يقرأ"',
|
||||
description: 'ضع علامة على الموضوع ليكون "غير مقروء".',
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "إرسال إلى سلة المهملات",
|
||||
description: "نقل موضوع إلى سلة المهملات",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "أرشيف",
|
||||
description: "أرشفة الموضوع",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "انتقل إلى صندوق الوارد",
|
||||
description: "انقل موضوعًا إلى صندوق الوارد",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "إحصائيات صندوق البريد",
|
||||
description:
|
||||
"احصل على عدد الرسائل غير المقروء وإحصائيات صندوق البريد.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "الوصول إلى صندوق الوارد",
|
||||
description:
|
||||
"طريقة مبسطة للحصول على رسائل البريد الإلكتروني الواردة من حساب Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "ملحق Outlook",
|
||||
description:
|
||||
"اسمح لمتخصصك بالتفاعل مع Microsoft Outlook - للبحث عن رسائل البريد الإلكتروني، وقراءة المحادثات، وكتابة المسودات، وإرسال رسائل البريد الإلكتروني، وإدارة صندوق الوارد الخاص بك باستخدام واجهة برمجة التطبيقات Microsoft Graph. <a>اقرأ الوثائق</a>.",
|
||||
multiUserWarning:
|
||||
'لا تتوفر تكامل "Outlook" في الوضع متعدد المستخدمين لأسباب تتعلق بالأمان. يرجى تعطيل الوضع متعدد المستخدمين لاستخدام هذه الميزة.',
|
||||
configuration: "تكوين برنامج Outlook",
|
||||
authType: "نوع الحساب",
|
||||
authTypeHelp:
|
||||
'اختر أنواع حسابات مايكروسوفت التي يمكنها التحقق من الهوية. "جميع الحسابات" تدعم كل من الحسابات الشخصية وحسابات العمل/المدرسة. "فقط الحسابات الشخصية" يقتصر على حسابات مايكروسوفت الشخصية فقط. "فقط الحسابات التنظيمية" يقتصر على حسابات العمل/المدرسة من مستأجر Azure AD محدد.',
|
||||
authTypeCommon: "جميع الحسابات (الشخصية والعمل/التعليم)",
|
||||
authTypeConsumers: "حسابات Microsoft الشخصية فقط",
|
||||
authTypeOrganization: "حسابات المنظمات فقط (يتطلب معرفة المستأجر).",
|
||||
clientId: "رقم تعريف العميل (المتقدم)",
|
||||
clientIdHelp: "معرّف التطبيق (العميل) من تسجيل تطبيقك في Azure AD.",
|
||||
tenantId: "معرّف (المستأجر)",
|
||||
tenantIdHelp:
|
||||
"معرّف المستأجر (Tenant ID) من تسجيل تطبيق Azure AD الخاص بك. مطلوب فقط للتحقق من الهوية داخل المؤسسة فقط.",
|
||||
clientSecret: "كلمة المرور الخاصة بالعميل",
|
||||
clientSecretHelp: "قيمة سرية للعميل من تسجيل تطبيق Azure AD الخاص بك",
|
||||
configurationRequired:
|
||||
"يرجى تكوين معرف العميل ومعرف العميل السري لتمكين ميزات Outlook.",
|
||||
authRequired:
|
||||
"احفظ بيانات اعتمادك أولاً، ثم قم بتسجيل الدخول باستخدام Microsoft لإكمال الإعداد.",
|
||||
authenticateWithMicrosoft: "التحقق باستخدام مايكروسوفت",
|
||||
authenticated:
|
||||
"تم التحقق من صحة تسجيل الدخول بنجاح باستخدام Microsoft Outlook.",
|
||||
revokeAccess: "إلغاء الوصول",
|
||||
configured: "تم التكوين",
|
||||
searchSkills: "مهارات البحث...",
|
||||
noSkillsFound: "لا توجد مهارات تطابق بحثك.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "البحث عن الرسائل وقراءتها",
|
||||
description:
|
||||
"ابحث و اقرأ رسائل البريد الإلكتروني من صندوق الوارد الخاص بك في Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "نماذج رسائل بريد إلكتروني",
|
||||
description: "إنشاء، وتحرير، وإدارة مسودات الرسائل الإلكترونية.",
|
||||
},
|
||||
send: {
|
||||
title: "إرسال رسائل بريد إلكتروني",
|
||||
description:
|
||||
"أرسل رسائل بريد إلكتروني جديدة أو رد على الرسائل على الفور.",
|
||||
},
|
||||
account: {
|
||||
title: "إحصائيات التكامل",
|
||||
description: "عرض إحصائيات صندوق البريد ومعلومات الحساب.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "الوصول إلى صندوق الوارد",
|
||||
description:
|
||||
"احصل على رسائل البريد الإلكتروني الأخيرة من صندوق الوارد في Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "البحث في رسائل البريد الإلكتروني",
|
||||
description:
|
||||
"ابحث في رسائل البريد الإلكتروني باستخدام تركيب جمل البحث الخاص بـ Microsoft.",
|
||||
},
|
||||
readThread: {
|
||||
title: "اقرأ المحادثة",
|
||||
description: "اقرأ سلسلة كاملة من رسائل البريد الإلكتروني.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "إنشاء مسودة",
|
||||
description:
|
||||
"إنشاء رسالة بريد إلكتروني جديدة أو رد مقترح على رسالة موجودة.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "تحديث المسودة",
|
||||
description: "تحديث رسالة بريد إلكتروني مُعدة مسبقًا",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "قائمة مسودات",
|
||||
description: "اعرض جميع رسائل البريد الإلكتروني قيد الإنشاء.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "حذف المسودة",
|
||||
description: "حذف رسالة بريد إلكتروني مسودة",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "إرسال مسودة",
|
||||
description: "أرسل نسخة من رسالة بريد إلكتروني موجودة.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "إرسال بريد إلكتروني",
|
||||
description:
|
||||
"أرسل بريدًا إلكترونيًا جديدًا أو رد على رسالة موجودة على الفور.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "إحصائيات صندوق البريد",
|
||||
description: "احصل على عدد المجلدات وإحصائيات صندوق البريد.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "موصل تقويم جوجل",
|
||||
description:
|
||||
"اسمح لمسؤولك بالتفاعل مع تقويم جوجل - عرض التقوائم، والحصول على الأحداث، وإنشاء وتحديث الأحداث، وإدارة الردود. <a>اقرأ الوثائق</a>.",
|
||||
multiUserWarning:
|
||||
"لا تتوفر تكامل تقويم Google في الوضع متعدد المستخدمين لأسباب تتعلق بالسلامة. يرجى تعطيل الوضع متعدد المستخدمين لاستخدام هذه الميزة.",
|
||||
configuration: "تكوين تقويم جوجل",
|
||||
deploymentId: "معرّف التوزيع",
|
||||
deploymentIdHelp:
|
||||
"معرّف النشر من تطبيق الويب الخاص بك في Google Apps Script",
|
||||
apiKey: "مفتاح واجهة برمجة التطبيقات",
|
||||
apiKeyHelp:
|
||||
"مفتاح واجهة برمجة التطبيقات (API) الذي قمت بتكوينه في تطبيق Google Apps Script الخاص بك.",
|
||||
configurationRequired:
|
||||
"يرجى تكوين معرف النشر والمفتاح الخاص للبرنامج، وذلك لتفعيل ميزات تقويم جوجل.",
|
||||
configured: "تم التكوين",
|
||||
searchSkills: "مهارات البحث...",
|
||||
noSkillsFound: "لا توجد مهارات تطابق بحثك.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "تقويمات",
|
||||
description: "عرض وإدارة تقويمات Google الخاصة بك.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "قراءة الأحداث",
|
||||
description: "عرض والبحث عن الأحداث في التقويم",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "إنشاء وتحديث الفعاليات",
|
||||
description: "إنشاء فعاليات جديدة وتعديل الفعاليات الموجودة.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "إدارة الردود",
|
||||
description: "حدد حالة استجابتك للأحداث.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "قوائم التقويمات",
|
||||
description: "اذكر جميع التقاويم التي تملكها أو أنت مشترك فيها.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "احصل على تفاصيل التقويم",
|
||||
description: "احصل على معلومات تفصيلية حول تقويم معين.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "احصل على تفاصيل الحدث",
|
||||
description: "احصل على معلومات تفصيلية حول حدث معين.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "احصل على قائمة بالأحداث لهذا اليوم",
|
||||
description: "احصل على جميع الفعاليات المجدولة ليوم محدد.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "الحصول على الأحداث (نطاق زمني)",
|
||||
description: "احصل على الأحداث ضمن نطاق تاريخي محدد",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "اطلع على الفعاليات القادمة",
|
||||
description:
|
||||
"احصل على فعاليات اليوم، أو هذا الأسبوع، أو هذا الشهر باستخدام كلمات مفتاحية بسيطة.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "إضافة حدث بسرعة",
|
||||
description:
|
||||
'إنشاء حدث من خلال اللغة الطبيعية (على سبيل المثال، "اجتماع غدًا الساعة 3 مساءً")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "إنشاء حدث",
|
||||
description: "إنشاء حدث جديد مع التحكم الكامل في جميع الخصائص.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "تحديث الحدث",
|
||||
description: "تحديث حدث في التقويم الحالي",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "تحديد حالة الرد",
|
||||
description: "قبول أو رفض أو قبول بشكل مؤقت حدثًا",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "خوادم نظام MCP",
|
||||
@@ -453,6 +753,94 @@ 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 مع تنسيق وتصميم أساسي.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -475,7 +863,34 @@ const TRANSLATIONS = {
|
||||
"تسمح مفاتيح واجهة برمجة التطبيقات لحامليها بالوصول إلى مثيل إني ثينك إلْلْم هذا وإدارته برمجيًا.",
|
||||
link: "اقرأ وثائق واجهة برمجة التطبيقات .",
|
||||
generate: "إنشاء مفتاح واجهة برمجة التطبيقات الجديد",
|
||||
empty: "لم يتم العثور على مفاتيح API",
|
||||
actions: "الإجراءات",
|
||||
messages: {
|
||||
error: "خطأ: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "إنشاء مفتاح API جديد",
|
||||
cancel: "إلغاء",
|
||||
close: "إغلاق",
|
||||
create: "إنشاء مفتاح API",
|
||||
helper:
|
||||
"بمجرد إنشائه، يمكن استخدام مفتاح API للوصول إلى مثيل AnythingLLM هذا وإدارته برمجيًا.",
|
||||
name: {
|
||||
label: "الاسم",
|
||||
placeholder: "تكامل الإنتاج",
|
||||
helper:
|
||||
"اختياري. استخدم اسمًا واضحًا حتى تتمكن من التعرف على هذا المفتاح لاحقًا.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "نسخ مفتاح API",
|
||||
copied: "تم النسخ",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"هل أنت متأكد أنك تريد تعطيل مفتاح API هذا؟\nبعد القيام بذلك لن يعود قابلاً للاستخدام.\n\nهذا الإجراء لا يمكن التراجع عنه.",
|
||||
},
|
||||
table: {
|
||||
name: "الاسم",
|
||||
key: "مفتاح واجهة برمجة التطبيقات",
|
||||
by: "تم الإنشاء بواسطة",
|
||||
created: "تم إنشاؤها",
|
||||
@@ -1117,8 +1532,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"الصق رمز API الذي تلقيته من @BotFather، ثم اختر مساحة عمل افتراضية لجهازك التابع للروبوت للدردشة فيها.",
|
||||
"bot-token": "رمز الرمز (Token)",
|
||||
"default-workspace": "مساحة العمل الافتراضية",
|
||||
"no-workspace": "لا توجد مساحات عمل متاحة. سيتم إنشاء مساحة عمل جديدة.",
|
||||
connecting: "التحميل...",
|
||||
"connect-bot": "روبوت الاتصال",
|
||||
},
|
||||
@@ -1156,20 +1569,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "فشل إلغاء صلاحية المستخدم.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "معلق على الموافقة",
|
||||
"pending-description":
|
||||
"المستخدمون في انتظار التحقق. قارن رمز المطابقة المعروض هنا بالرمز المعروض في محادثتهم على تطبيق Telegram.",
|
||||
"approved-title": "المستخدمون المعتمدون",
|
||||
"approved-description":
|
||||
"المستخدمون الذين تم منحهم الإذن للتواصل مع روبوتك.",
|
||||
user: "المستخدم",
|
||||
"pairing-code": "رمز التوفيق",
|
||||
"no-pending": "لا توجد طلبات معلقة.",
|
||||
"no-approved": "لا يوجد مستخدمون معتمدون.",
|
||||
unknown: "غير معروف",
|
||||
approve: "الموافقة",
|
||||
deny: "رفض",
|
||||
revoke: "إلغاء",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
1533
frontend/src/locales/ca/common.js
Normal file
1533
frontend/src/locales/ca/common.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -424,6 +424,310 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Připojení k GMail",
|
||||
description:
|
||||
"Umožněte svému agentovi, aby interagoval s Gmail – vyhledával e-maily, četl konverzace, vytvářel návrhy, posílal e-maily a spravoval vaši schránku. <a>Prostudujte dokumentaci</a>.",
|
||||
multiUserWarning:
|
||||
"Integrace s Gmailem není dostupná v režimu pro více uživatelů z bezpečnostních důvodů. Pro použití této funkce, prosím, deaktivujte režim pro více uživatelů.",
|
||||
configuration: "Konfigurace Gmailu",
|
||||
deploymentId: "ID nasazení",
|
||||
deploymentIdHelp:
|
||||
"Identifikátor nasazení z vaší webové aplikace Google Apps Script",
|
||||
apiKey: "Klíč API",
|
||||
apiKeyHelp:
|
||||
"Klíč API, který jste nakonfigurovali ve vaší instalaci Google Apps Script",
|
||||
configurationRequired:
|
||||
"Prosím, nakonfigurujte ID nasazení a klíč API, abyste aktivovali funkce pro Gmail.",
|
||||
configured: "Nastaveno",
|
||||
searchSkills: "Dovednosti pro vyhledávání...",
|
||||
noSkillsFound: "Žádný z nabízených profilů neodpovídá vašim kritériím.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Vyhledávání a čtení e-mailů",
|
||||
description: "Vyhledejte a čtěte e-maily z vaší schránky Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Návrhy e-mailů",
|
||||
description: "Vytvářejte, upravujte a spravujte návrhy e-mailů.",
|
||||
},
|
||||
send: {
|
||||
title: "Odesílejte a odpovídejte na e-maily",
|
||||
description:
|
||||
"Odesílejte e-maily a okamžitě odpovídejte na diskuse.",
|
||||
},
|
||||
threads: {
|
||||
title: "Spravujte emailové vlákna",
|
||||
description:
|
||||
"Spravujte e-mailové vlákna – označte jako přečtené/ne přečtené, archivujte, vyhoďte",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiky integrace",
|
||||
description:
|
||||
"Zobrazte statistiky poštovní schránky a informace o účtu.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Hledat e-maily",
|
||||
description: "Hledejte e-maily pomocí syntaxe dotazů v Gmailu",
|
||||
},
|
||||
readThread: {
|
||||
title: "Přečtěte si vlákno",
|
||||
description: "Přečtěte si kompletní řetězec e-mailů podle ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Vytvořit návrh",
|
||||
description: "Vytvořte nový návrh e-mailu",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Vytvořit návrh odpovědi",
|
||||
description: "Vytvořte návrh odpovědi na existující téma.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Aktualizovaná verze návrhu",
|
||||
description: "Aktualizujte existující návrh e-mailu",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Získej návrh",
|
||||
description: "Získejte konkrétní verzi dokumentu podle jejího ID.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Návrhy (seznam)",
|
||||
description: "Vypište všechny návrhy e-mailů.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Smazat návrh",
|
||||
description: "Smazat návrh e-mailu",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Odešlete návrh",
|
||||
description: "Odešlete existující návrh e-mailu",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Odeslat e-mail",
|
||||
description: "Odešlete e-mail co nejrychleji.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Odpovědět na vlákno",
|
||||
description: "Odpovězte na e-mailovou diskuzi co nejdříve.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Označit vlákno jako přečtené",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Označit jako nepročtené",
|
||||
description: "Označte vlákno jako nepročtené.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Přesun do koše",
|
||||
description: "Přesuňte vlákno do koše",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archiv",
|
||||
description: "Uložte vlákno do archivu",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Přesun do schránky",
|
||||
description: "Přesuňte vlákno do schránky (účetní knihy)",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiky poštovní schránky",
|
||||
description:
|
||||
"Získejte informace o počtu nečtených e-mailů a statistiky poštovní schránky.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Otevřít schránku",
|
||||
description:
|
||||
"Jednoduchý způsob, jak získat e-maily z vaší schránky Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Připojení k Outlooku",
|
||||
description:
|
||||
"Umožněte svému agentovi interakci s Microsoft Outlook – vyhledávání e-mailů, čtení vláken, vytváření návrhů, odesílání e-mailů a správu vaší poštovní schránky prostřednictvím Microsoft Graph API. <a>Prostudujte dokumentaci</a>.",
|
||||
multiUserWarning:
|
||||
"Integrace s Outlookem není dostupná v režimu pro více uživatelů z důvodu bezpečnosti. Pro použití této funkce, prosím, deaktivujte režim pro více uživatelů.",
|
||||
configuration: "Konfigurace Outlooku",
|
||||
authType: "Typ účtu",
|
||||
authTypeHelp:
|
||||
"Vyberte, jaké typy účtů Microsoft mohou být ověřovány. Možnost „Všechny účty“ podporuje jak osobní, tak pracovní/školní účty. Možnost „Pouze osobní účty“ omezuje na osobní účty Microsoft. Možnost „Pouze organizace“ omezuje na pracovní/školní účty z konkrétního tenantu Azure AD.",
|
||||
authTypeCommon: "Všechny účty (osobní a pracovní/školní)",
|
||||
authTypeConsumers: "Pouze osobní účty Microsoft",
|
||||
authTypeOrganization: "Účty organizací (vyžaduje ID pronajímatele)",
|
||||
clientId: "Identifikátor klienta (ID aplikace)",
|
||||
clientIdHelp:
|
||||
"Identifikátor aplikace (klienta) z registrace vaší aplikace v Azure AD",
|
||||
tenantId: "Identifikátor (pro nájemce)",
|
||||
tenantIdHelp:
|
||||
"ID adresáře (uživatele) z registrace vaší aplikace v Azure AD. Je nutné pouze pro ověřování v rámci organizace.",
|
||||
clientSecret: "Tajný klíč klienta",
|
||||
clientSecretHelp:
|
||||
"Tajná hodnota klienta z registrace vaší aplikace v Azure AD",
|
||||
configurationRequired:
|
||||
"Prosím, nakonfigurujte ID klienta a tajný klíč, aby bylo možné využít funkce Outlook.",
|
||||
authRequired:
|
||||
"Nejprve si uložte své přihlašovací údaje, a poté se ověřte u společnosti Microsoft, abyste dokončili nastavení.",
|
||||
authenticateWithMicrosoft: "Ověřte se pomocí Microsoftu",
|
||||
authenticated: "Úspěšně jsem se ověřil pomocí Microsoft Outlook.",
|
||||
revokeAccess: "Odvolat přístup",
|
||||
configured: "Konfigurováno",
|
||||
searchSkills: "Dovednosti pro vyhledávání...",
|
||||
noSkillsFound: "Žádné výsledky neodpovídají vašemu vyhledávání.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Vyhledávání a čtení e-mailů",
|
||||
description:
|
||||
"Vyhledejte a čtěte e-maily ve vaší poštovní schránce Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Návrhy e-mailů",
|
||||
description: "Vytvářejte, upravujte a spravujte návrhy e-mailů.",
|
||||
},
|
||||
send: {
|
||||
title: "Odesílejte e-maily",
|
||||
description:
|
||||
"Odešlete nové e-maily nebo okamžitě odpovězte na zprávy.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiky integrace",
|
||||
description:
|
||||
"Zobrazte statistiky poštovní schránky a informace o účtu.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Otevřít schránku",
|
||||
description: "Získejte nejnovější e-maily z vaší schránky Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Vyhledávání v e-mailech",
|
||||
description:
|
||||
"Hledejte e-maily pomocí syntaxe pro vyhledávání od Microsoftu",
|
||||
},
|
||||
readThread: {
|
||||
title: "Přečtěte si konverzaci",
|
||||
description: "Přečtěte si kompletní vedení e-mailové konverzace.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Vytvořit návrh",
|
||||
description:
|
||||
"Vytvořte nový návrh e-mailu nebo návrh odpovědi na stávající zprávu.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Aktualizovaná verze návrhu",
|
||||
description: "Aktualizujte stávající návrh e-mailu",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Návrhy (seznam)",
|
||||
description: "Vypište všechny návrhy e-mailů.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Smazat návrh",
|
||||
description: "Smazat návrh e-mailu",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Ode mne návrh",
|
||||
description: "Odešlete existující návrh e-mailu",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Odešlete e-mail",
|
||||
description:
|
||||
"Odešlete nový e-mail nebo odpověď na stávající zprávu okamžitě.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiky poštovní schránky",
|
||||
description:
|
||||
"Získejte informace o počtu složek a statistiky poštovní schránky.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Připojení k kalendáři Google",
|
||||
description:
|
||||
"Umožněte svému agentovi interakci s Google Kalendářem – prohlížení kalendářů, získávání událostí, vytváření a aktualizaci událostí a správu potvrzení účasti. <a>Přečtěte si dokumentaci</a>.",
|
||||
multiUserWarning:
|
||||
"Integrace s Google Kalendářem není dostupná v režimu pro více uživatelů z důvodu bezpečnosti. Pro použití této funkce, prosím, deaktivujte režim pro více uživatelů.",
|
||||
configuration: "Konfigurace kalendáře Google",
|
||||
deploymentId: "ID nasazení",
|
||||
deploymentIdHelp:
|
||||
"ID nasazení z vaší webové aplikace Google Apps Script",
|
||||
apiKey: "Klíč API",
|
||||
apiKeyHelp:
|
||||
"Klíč API, který jste nakonfigurovali ve vaší instalaci Google Apps Script",
|
||||
configurationRequired:
|
||||
"Prosím, nakonfigurujte ID nasazení a API klíč, abyste mohli využívat funkce Google Kalendáře.",
|
||||
configured: "Konfigurováno",
|
||||
searchSkills: "Dovednosti pro vyhledávání...",
|
||||
noSkillsFound: "Žádné výsledky neodpovídají vašemu vyhledávání.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendáře",
|
||||
description: "Zobrazte a spravujte své kalendáře Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Seznam událostí",
|
||||
description: "Zobrazte a vyhledejte události v kalendáři",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Vytvořit a aktualizovat události",
|
||||
description: "Vytvořte nové akce a upravte stávající.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Správa odpovědí na pozvánky",
|
||||
description: "Spravujte stav své odpovědi pro události",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalendáře v seznamu",
|
||||
description:
|
||||
"Vypište všechny kalendáře, které vlastníte nebo máte aktivní předplatné.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Získejte podrobné informace o kalendáři",
|
||||
description: "Získejte podrobné informace o konkrétním kalendáři.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Získejte informace o události",
|
||||
description: "Získejte podrobné informace o konkrétním události",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Získejte události pro daný den",
|
||||
description:
|
||||
"Získejte všechny události naplánované pro konkrétní den.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Zobrazit události (rozsah dat)",
|
||||
description: "Získejte události v definovaném časovém rozsahu",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Zobrazit nadcházející akce",
|
||||
description:
|
||||
"Najděte události pro dnešek, tento týden nebo tento měsíc pomocí jednoduchých klíčových slov.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Rychlé přidání události",
|
||||
description:
|
||||
"Vytvořte událost z přirozeného jazyka (např. „Schůzka zítra ve 15:00“)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Vytvořit událost",
|
||||
description:
|
||||
"Vytvořte nový event s plnou kontrolou nad všemi jeho vlastnostmi.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Aktualizace události",
|
||||
description: "Aktualizovat existující událost v kalendáři",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Nastavit stav potvrzení účasti",
|
||||
description: "Přijmout, zamítnout nebo přijmout událost s rezervou",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servery společnosti MCP",
|
||||
@@ -470,6 +774,95 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -580,7 +973,34 @@ const TRANSLATIONS = {
|
||||
"API klíče umožňují držiteli programově přistupovat a spravovat tuto instanci AnythingLLM.",
|
||||
link: "Přečíst dokumentaci API",
|
||||
generate: "Generovat nový API klíč",
|
||||
empty: "Nebyly nalezeny žádné API klíče",
|
||||
actions: "Akce",
|
||||
messages: {
|
||||
error: "Chyba: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Vytvořit nový API klíč",
|
||||
cancel: "Zrušit",
|
||||
close: "Zavřít",
|
||||
create: "Vytvořit API klíč",
|
||||
helper:
|
||||
"Po vytvoření lze API klíč použít pro programový přístup k této instanci AnythingLLM a její správu.",
|
||||
name: {
|
||||
label: "Název",
|
||||
placeholder: "Produkční integrace",
|
||||
helper:
|
||||
"Volitelné. Použijte přívětivý název, abyste klíč později snadno rozpoznali.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopírovat API klíč",
|
||||
copied: "Zkopírováno",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Opravdu chcete deaktivovat tento API klíč?\nPoté už nebude možné jej používat.\n\nTuto akci nelze vrátit zpět.",
|
||||
},
|
||||
table: {
|
||||
name: "Název",
|
||||
key: "API klíč",
|
||||
by: "Vytvořil",
|
||||
created: "Vytvořeno",
|
||||
@@ -1133,9 +1553,6 @@ const TRANSLATIONS = {
|
||||
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í",
|
||||
},
|
||||
@@ -1175,20 +1592,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -411,6 +411,305 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Gmail-forbindelse",
|
||||
description:
|
||||
"Giv din agent mulighed for at interagere med Gmail – søg efter e-mails, læs samtaler, oprette udkast, sende e-mails og administrere din indbakke. <a>Læs dokumentationen</a>.",
|
||||
multiUserWarning:
|
||||
"Integration med Gmail er ikke tilgængelig i multi-bruger-tilstand af sikkerhedsmæssige årsager. For at bruge denne funktion, bedes du deaktivere multi-bruger-tilstanden.",
|
||||
configuration: "Konfiguration af Gmail",
|
||||
deploymentId: "Implementerings-ID",
|
||||
deploymentIdHelp: "Deployment-ID'en fra din Google Apps Script webapp",
|
||||
apiKey: "API-nøgle",
|
||||
apiKeyHelp:
|
||||
"API-nøglen, du har konfigureret i din Google Apps Script-implementering.",
|
||||
configurationRequired:
|
||||
"Venligst konfigurer Deployment ID og API-nøglen for at aktivere Gmail-funktionaliteten.",
|
||||
configured: "Konfigureret",
|
||||
searchSkills: "Søgeteknikker...",
|
||||
noSkillsFound: "Ingen resultater fundet, der matcher din søgning.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Søg og læs e-mails",
|
||||
description: "Søg og læs e-mails fra din Gmail-indbakke",
|
||||
},
|
||||
drafts: {
|
||||
title: "Udkast til e-mails",
|
||||
description: "Opret, rediger og administrer udkast til e-mails",
|
||||
},
|
||||
send: {
|
||||
title: "Send og svar på e-mails",
|
||||
description: "Send e-mails og svar på tråde øjeblikkeligt",
|
||||
},
|
||||
threads: {
|
||||
title: "Administrer e-mailtråde",
|
||||
description:
|
||||
"Administrer e-mailtråde – marker som læst/ulæst, arkiver, slet",
|
||||
},
|
||||
account: {
|
||||
title: "Statistik for integration",
|
||||
description:
|
||||
"Se statistik for din e-postindbakke og kontoinformation.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Søg i e-mails",
|
||||
description:
|
||||
"Søg efter e-mails ved hjælp af Gmail's forespørgselssprog",
|
||||
},
|
||||
readThread: {
|
||||
title: "Læs tråd",
|
||||
description: "Læs hele e-mailtråden sorteret efter ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Opret udkast",
|
||||
description: "Opret et nyt udkast til en e-mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Opret udkast",
|
||||
description: "Opret et udkast til et svar på en eksisterende tråd.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Opdateret udkast",
|
||||
description: "Opdater en eksisterende udkast til en e-mail",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Få udkast",
|
||||
description: "Hent en bestemt udkast baseret på ID",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Udkast til lister",
|
||||
description: "Vis alle udkastede e-mails",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Slet udkast",
|
||||
description: "Slet et udkast til e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Send udkast",
|
||||
description: "Send en eksisterende udkast til en e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Send e-mail",
|
||||
description: "Send en e-mail med det samme",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Svar på tråd",
|
||||
description: "Svar på en e-mailtråd med det samme",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Marker en tråd som læst",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Marker som ikke læst",
|
||||
description: "Marker en tråd som ikke læst",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Flyt til papirkurven",
|
||||
description: "Flyt en tråd til papirkurven",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arkiv",
|
||||
description: "Arkiver tråden",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Flyt til indbakken",
|
||||
description: "Flyt en tråd til indbakken",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistik for postkasse",
|
||||
description:
|
||||
"Få oplysninger om antallet af ulæste beskeder og statistik for din e-mailindbakke.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Åbn indbakken",
|
||||
description:
|
||||
"En effektiv måde at hente e-mails fra din Gmail-indbakke",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook-forbindelse",
|
||||
description:
|
||||
"Giv din agent mulighed for at interagere med Microsoft Outlook – søg efter e-mails, læs samtaler, oprette udkast, sende e-mails og administrer din indbakke via Microsoft Graph API. Se dokumentationen her: <a>.",
|
||||
multiUserWarning:
|
||||
"Integration med Outlook er ikke tilgængelig i multi-bruger-tilstand af sikkerhedsmæssige årsager. For at bruge denne funktion, bedes du deaktivere multi-bruger-tilstanden.",
|
||||
configuration: "Outlook-konfiguration",
|
||||
authType: "Kontotype",
|
||||
authTypeHelp:
|
||||
'Vælg, hvilke typer af Microsoft-konti der kan godkende. "Alle konti" understøtter både personlige og arbejds-/skolekonti. "Kun personlige konti" begrænser til kun personlige Microsoft-konti. "Kun arbejds-/skolekonti" begrænser til arbejds-/skolekonti fra en specifik Azure AD-tenant.',
|
||||
authTypeCommon: "Alle konti (personlige og arbejds-/skolerelaterede)",
|
||||
authTypeConsumers: "Kun personlige Microsoft-konti",
|
||||
authTypeOrganization: "Kun organisationskonti (kræver lejer-ID)",
|
||||
clientId: "Anvendelses-ID (kunde)",
|
||||
clientIdHelp:
|
||||
"Applikations-ID (også kaldet klient-ID) fra din Azure AD applikationsregistrering",
|
||||
tenantId: "Identifikationsnummer (Lejer)",
|
||||
tenantIdHelp:
|
||||
"Identifikationsnummeret (for lejer) fra din Azure AD-applikationsregistrering. Kræves kun til autentificering, der kun er for organisationen.",
|
||||
clientSecret: "Klientens hemmelige nøgle",
|
||||
clientSecretHelp:
|
||||
"Klientens hemmelige værdi fra din Azure AD-applikationsregistrering",
|
||||
configurationRequired:
|
||||
"Vær venligst oprettet Client ID og Client Secret for at aktivere Outlook-funktionaliteten.",
|
||||
authRequired:
|
||||
"Gem dine legitimationsoplysninger først, og derefter skal du autentificere dig hos Microsoft for at fuldføre opsætningen.",
|
||||
authenticateWithMicrosoft: "Bekræft med Microsoft",
|
||||
authenticated: "Succesfuldt bekræftet med Microsoft Outlook.",
|
||||
revokeAccess: "Annullér adgang",
|
||||
configured: "Konfigureret",
|
||||
searchSkills: "Færdigheder inden for søgning...",
|
||||
noSkillsFound: "Ingen resultater fundet, der matcher din søgning.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Søg og læs e-mails",
|
||||
description: "Søg og læs e-mails fra din Outlook-indbakke",
|
||||
},
|
||||
drafts: {
|
||||
title: "Udkast til e-mails",
|
||||
description: "Opret, rediger og administrer udkast til e-mails.",
|
||||
},
|
||||
send: {
|
||||
title: "Send e-mails",
|
||||
description:
|
||||
"Send nye e-mails eller svar på beskeder med det samme.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistik om integration",
|
||||
description: "Se statistik for din postkasse og kontoinformation.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Åbn indbakken",
|
||||
description: "Få de seneste e-mails fra din Outlook-indbakke.",
|
||||
},
|
||||
search: {
|
||||
title: "Søg i e-mails",
|
||||
description:
|
||||
"Søg efter e-mails ved hjælp af Microsofts søgesyntaks",
|
||||
},
|
||||
readThread: {
|
||||
title: "Læs samtale",
|
||||
description: "Læs hele e-mail-samtaletråden",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Opret udkast",
|
||||
description:
|
||||
"Opret et nyt udkast til en e-mail eller et udkast til et svar på en eksisterende besked.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Opdateret udkast",
|
||||
description: "Opdater en eksisterende udkast til en e-mail",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Udkast til lister",
|
||||
description: "Vis alle udkastede e-mails",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Slet udkast",
|
||||
description: "Slet en udkast til e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Send udkast",
|
||||
description: "Send en eksisterende udkast til en e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Send e-mail",
|
||||
description:
|
||||
"Send en ny e-mail eller svar på en eksisterende besked med det samme.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistik for postkasse",
|
||||
description: "Få antallet af mapper og statistikker for postkasser",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Kalender-tilslutning",
|
||||
description:
|
||||
"Giv din agent mulighed for at interagere med Google Kalender – se kalendere, få adgang til begivenheder, oprette og opdatere begivenheder, og administrere tilmeldinger. <a>Læs dokumentationen</a>.",
|
||||
multiUserWarning:
|
||||
"Integration med Google Kalender er ikke tilgængelig i multi-bruger-tilstand af sikkerhedsmæssige årsager. For at bruge denne funktion, bedes du deaktivere multi-bruger-tilstanden.",
|
||||
configuration: "Konfiguration af Google Kalender",
|
||||
deploymentId: "Identifikations-ID",
|
||||
deploymentIdHelp: "Deployment-ID fra din Google Apps Script webapp",
|
||||
apiKey: "API-nøgle",
|
||||
apiKeyHelp:
|
||||
"API-nøglen, du har konfigureret i din Google Apps Script-implementering.",
|
||||
configurationRequired:
|
||||
"Vær venligst oprettet Deployment ID og API-nøgle for at aktivere Google Calendar-funktionaliteten.",
|
||||
configured: "Konfigureret",
|
||||
searchSkills: "Søgeteknikker...",
|
||||
noSkillsFound: "Ingen resultater matcher din søgning.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendere",
|
||||
description: "Se og administrer dine Google Kalendere",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Læs begivenheder",
|
||||
description: "Se og søg efter begivenheder i kalenderen",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Opret og opdater begivenheder",
|
||||
description: "Opret nye begivenheder og rediger eksisterende.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Håndtering af bekræftelser",
|
||||
description: "Administrer status for dine svar på begivenheder",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalenderlister",
|
||||
description: "Vis alle kalendere, du ejer eller er abonnent på.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Få detaljer om kalenderen",
|
||||
description: "Få detaljerede oplysninger om en bestemt kalender",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Find arrangement",
|
||||
description: "Få detaljerede oplysninger om et bestemt arrangement",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Find begivenheder for den pågældende dag",
|
||||
description:
|
||||
"Find alle begivenheder, der er planlagt til en bestemt dato.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Find begivenheder (datointerval)",
|
||||
description: "Find begivenheder inden for et angivet tidsinterval",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Se kommende arrangementer",
|
||||
description:
|
||||
"Find begivenheder for i dag, denne uge eller denne måned ved hjælp af enkle søgeord.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Tilføj begivenhed hurtigt",
|
||||
description:
|
||||
'Opret et arrangement ud fra naturligt sprog (f.eks. "Møde i morgen kl. 15:00")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Opret begivenhed",
|
||||
description:
|
||||
"Opret et nyt arrangement med fuld kontrol over alle indstillinger.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Opdatering af begivenhed",
|
||||
description: "Opdater en eksisterende kalenderbegivenhed",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Angiv status for bekræftet deltagelse",
|
||||
description:
|
||||
"Accepter, afvise eller midlertidigt acceptere et arrangement",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-servere",
|
||||
@@ -457,6 +756,94 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -479,7 +866,34 @@ const TRANSLATIONS = {
|
||||
"API-nøgler giver indehaveren mulighed for programmatisk at få adgang til og administrere denne AnythingLLM-instans.",
|
||||
link: "Læs API-dokumentationen",
|
||||
generate: "Generér ny API-nøgle",
|
||||
empty: "Ingen API-nøgler fundet",
|
||||
actions: "Handlinger",
|
||||
messages: {
|
||||
error: "Fejl: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Opret ny API-nøgle",
|
||||
cancel: "Annuller",
|
||||
close: "Luk",
|
||||
create: "Opret API-nøgle",
|
||||
helper:
|
||||
"Når API-nøglen er oprettet, kan den bruges til programmatisk at få adgang til og konfigurere denne AnythingLLM-instans.",
|
||||
name: {
|
||||
label: "Navn",
|
||||
placeholder: "Produktionsintegration",
|
||||
helper:
|
||||
"Valgfrit. Brug et sigende navn, så du nemt kan kende nøglen senere.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopiér API-nøgle",
|
||||
copied: "Kopieret",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Er du sikker på, at du vil deaktivere denne API-nøgle?\nNår du gør det, kan den ikke længere bruges.\n\nDenne handling kan ikke fortrydes.",
|
||||
},
|
||||
table: {
|
||||
name: "Navn",
|
||||
key: "API-nøgle",
|
||||
by: "Oprettet af",
|
||||
created: "Oprettet",
|
||||
@@ -1140,9 +1554,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1183,20 +1594,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -100,10 +100,10 @@ const TRANSLATIONS = {
|
||||
"system-prompt-variables": "Systempromptvariablen",
|
||||
"mobile-app": "AnythingLLM Mobile",
|
||||
"community-hub": {
|
||||
title: "Gemeindezentrum",
|
||||
trending: "Entdecken Sie die aktuell beliebtesten Themen",
|
||||
"your-account": "Ihr Konto",
|
||||
"import-item": "Artikel importieren",
|
||||
title: "Community Hub",
|
||||
trending: "Neuigkeiten",
|
||||
"your-account": "Community Hub Account",
|
||||
"import-item": "Community Import",
|
||||
},
|
||||
channels: "Kanäle",
|
||||
"available-channels": {
|
||||
@@ -112,7 +112,7 @@ const TRANSLATIONS = {
|
||||
},
|
||||
login: {
|
||||
"multi-user": {
|
||||
welcome: "Willkommen bei",
|
||||
welcome: "Willkommen",
|
||||
"placeholder-username": "Benutzername",
|
||||
"placeholder-password": "Passwort",
|
||||
login: "Anmelden",
|
||||
@@ -417,6 +417,324 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Gmail-Verbindung",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, mit Gmail zu interagieren: E-Mails durchsuchen, E-Mail-Threads lesen, Entwürfe erstellen, E-Mails senden und Ihren Posteingang verwalten. <a>Lesen Sie die Dokumentation</a>.",
|
||||
multiUserWarning:
|
||||
"Die Integration mit Gmail ist aus Sicherheitsgründen nicht im Mehrbenutzermodus verfügbar. Bitte deaktivieren Sie den Mehrbenutzermodus, um diese Funktion zu nutzen.",
|
||||
configuration: "Gmail-Konfiguration",
|
||||
deploymentId: "Deployment-ID",
|
||||
deploymentIdHelp:
|
||||
"Die Bereitstellungs-ID Ihrer Google Apps Script Webanwendung",
|
||||
apiKey: "API-Schlüssel",
|
||||
apiKeyHelp:
|
||||
"Der API-Schlüssel, den Sie in Ihrer Google Apps Script-Bereitstellung konfiguriert haben",
|
||||
configurationRequired:
|
||||
"Bitte konfigurieren Sie die Deployment-ID und den API-Schlüssel, um die Gmail-Funktionen zu aktivieren.",
|
||||
configured: "Konfiguriert",
|
||||
searchSkills: "Suchfähigkeiten...",
|
||||
noSkillsFound: "Keine Ergebnisse zu Ihrer Suche.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Nachrichten suchen und lesen",
|
||||
description:
|
||||
"Suchen und lesen Sie E-Mails aus Ihrem Gmail-Posteingang.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Entwurf-E-Mails",
|
||||
description:
|
||||
"Erstellen, bearbeiten und verwalten von E-Mail-Entwürfen",
|
||||
},
|
||||
send: {
|
||||
title: "E-Mails senden und beantworten",
|
||||
description:
|
||||
"Senden Sie E-Mails und antworten Sie sofort auf Nachrichten.",
|
||||
},
|
||||
threads: {
|
||||
title: "E-Mail-Verläufe verwalten",
|
||||
description:
|
||||
"E-Mail-Threads verwalten – als gelesen/unleserlich markieren, archivieren, in den Papierkorb verschieben",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiken zur Integration",
|
||||
description:
|
||||
"Anzeigen von Postfachstatistiken und Kontoinformationen",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "E-Mails durchsuchen",
|
||||
description: "E-Mails mit der Gmail-Suchsyntax durchsuchen",
|
||||
},
|
||||
readThread: {
|
||||
title: "Den Thread lesen",
|
||||
description:
|
||||
"Lesen Sie den vollständigen E-Mail-Thread anhand der ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Entwurf erstellen",
|
||||
description: "Erstelle eine neue Entwurf-E-Mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Entwurf für Antwort erstellen",
|
||||
description:
|
||||
"Erstellen Sie eine Entwurfsantwort an ein bestehendes Thema.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Entwurf aktualisieren",
|
||||
description: "Eine bestehende Entwurf-E-Mail aktualisieren",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Entwurf anfordern",
|
||||
description:
|
||||
"Eine bestimmte Entwurfversion anhand ihrer ID abrufen.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Entwürfe",
|
||||
description: "Liste alle Entwurf-E-Mails auf",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Entwurf löschen",
|
||||
description: "Einen Entwurf für eine E-Mail löschen",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Entwurf senden",
|
||||
description: "Senden Sie eine bestehende Entwurf-E-Mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "E-Mail senden",
|
||||
description: "Senden Sie sofort eine E-Mail.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Antwort auf den Thread",
|
||||
description: "Antworten Sie umgehend auf einen E-Mail-Thread.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Markiere einen Thread als gelesen.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Als nicht gelesen markieren",
|
||||
description: "Markiere einen Thread als nicht gelesen.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "In den Papierkorb verschieben",
|
||||
description: "Ein Thema in den Papierkorb verschieben",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archiv",
|
||||
description: "Thread archivieren",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Zum Posteingang verschieben",
|
||||
description: "Einen Thread in den Posteingang verschieben",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiken für E-Mail-Postfach",
|
||||
description:
|
||||
"Erhalten Sie Informationen über die Anzahl nicht gelesener E-Mails und Statistiken für Ihr Postfach.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "E-Mail-Postfach öffnen",
|
||||
description:
|
||||
"Ein einfacher und effizienter Weg, um E-Mails aus dem Gmail-Posteingang zu erhalten.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook-Verbindung",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, mit Microsoft Outlook zu interagieren – Suchen Sie E-Mails, lesen Sie Threads, erstellen Sie Entwürfe, senden Sie E-Mails und verwalten Sie Ihren Posteingang über die Microsoft Graph API. <a> Lesen Sie die Dokumentation</a>.",
|
||||
multiUserWarning:
|
||||
"Die Integration mit Outlook ist aus Sicherheitsgründen nicht im Mehrbenutzermodus verfügbar. Um diese Funktion nutzen zu können, bitte den Mehrbenutzermodus deaktivieren.",
|
||||
configuration: "Konfiguration von Outlook",
|
||||
authType: "Kontotyp",
|
||||
authTypeHelp:
|
||||
"Wählen Sie, welche Arten von Microsoft-Konten zur Authentifizierung verwendet werden können. „Alle Konten“ unterstützt sowohl persönliche als auch Arbeits-/Schulkonten. „Nur persönliche Konten“ beschränkt sich auf persönliche Microsoft-Konten. „Nur Arbeits-/Schulkonten“ beschränkt sich auf Arbeits-/Schulkonten eines bestimmten Azure AD-Mandanten.",
|
||||
authTypeCommon: "Alle Konten (persönliche und Arbeits-/Schulkonten)",
|
||||
authTypeConsumers: "Nur persönliche Microsoft-Konten",
|
||||
authTypeOrganization:
|
||||
"Nur Konten für Organisationen (benötigt eine Tenant-ID)",
|
||||
clientId: "Anwendungs-ID (Kunden-ID)",
|
||||
clientIdHelp:
|
||||
"Die Anwendungs-ID (Client-ID) von Ihrer Azure AD-Anwendung",
|
||||
tenantId: "Verzeichnis-ID (Mieter)",
|
||||
tenantIdHelp:
|
||||
"Die Verzeichnis-ID (für den Mieter) aus Ihrer Azure AD-App-Registrierung. Dies ist nur für die Authentifizierung innerhalb einer Organisation erforderlich.",
|
||||
clientSecret: "Client-Schlüssel",
|
||||
clientSecretHelp:
|
||||
"Der geheime Wert, den Sie für die Registrierung Ihrer Azure AD-Anwendung festgelegt haben.",
|
||||
configurationRequired:
|
||||
"Bitte konfigurieren Sie die Client-ID und den Client-Schlüssel, um die Outlook-Funktionen zu aktivieren.",
|
||||
authRequired:
|
||||
"Speichern Sie zuerst Ihre Anmeldedaten, und anschließend melden Sie sich bei Microsoft an, um die Einrichtung abzuschließen.",
|
||||
authenticateWithMicrosoft: "Mit Microsoft anmelden",
|
||||
authenticated: "Erfolgreiche Authentifizierung mit Microsoft Outlook.",
|
||||
revokeAccess: "Zugriff widerrufen",
|
||||
configured: "Konfiguriert",
|
||||
searchSkills: "Suchfähigkeiten...",
|
||||
noSkillsFound:
|
||||
"Keine der angebotenen Fähigkeiten passen zu Ihrer Suche.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Nachrichten suchen und lesen",
|
||||
description:
|
||||
"Suchen und lesen Sie E-Mails aus Ihrem Outlook-Posteingang.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Entwurf-E-Mails",
|
||||
description:
|
||||
"Erstellen, bearbeiten und verwalten von E-Mail-Entwürfen",
|
||||
},
|
||||
send: {
|
||||
title: "E-Mails versenden",
|
||||
description:
|
||||
"Neue E-Mails senden oder sofort auf Nachrichten antworten",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiken zur Integration",
|
||||
description:
|
||||
"Anzeigen von Postfachstatistiken und Kontoinformationen",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "E-Mail-Postfach öffnen",
|
||||
description:
|
||||
"Abrufen von aktuellen E-Mails aus Ihrem Outlook-Posteingang",
|
||||
},
|
||||
search: {
|
||||
title: "E-Mails durchsuchen",
|
||||
description:
|
||||
"E-Mails mithilfe der Syntax von Microsoft Search durchsuchen",
|
||||
},
|
||||
readThread: {
|
||||
title: "Lesen der Konversation",
|
||||
description: "Den vollständigen E-Mail-Austausch durchlesen.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Entwurf erstellen",
|
||||
description:
|
||||
"Erstellen Sie eine neue Entwurf-E-Mail oder einen Entwurf-Antwort auf eine bestehende Nachricht.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Entwurf aktualisieren",
|
||||
description: "Aktualisieren Sie eine bestehende Entwurf-E-Mail",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Entwurf-Listen",
|
||||
description: "Zeigen Sie alle Entwurfse-Mails an",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Entwurf löschen",
|
||||
description: "Einen Entwurf einer E-Mail löschen",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Entwurf senden",
|
||||
description: "Senden Sie eine bestehende E-Mail-Entwurf",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "E-Mail senden",
|
||||
description:
|
||||
"Senden Sie eine neue E-Mail oder antworten Sie sofort auf eine bestehende Nachricht.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiken für den Posteingang",
|
||||
description:
|
||||
"Erhalten Sie Informationen über die Anzahl der Ordner und Statistiken für E-Mail-Postfächer.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Kalender-Verbindung",
|
||||
description:
|
||||
"Ermöglichen Sie Ihrem Agenten, mit Google Kalender zu interagieren – Kalender anzeigen, Ereignisse einsehen, erstellen und aktualisieren, sowie Rückmeldungen verwalten. <a> Lesen Sie die Dokumentation </a>.",
|
||||
multiUserWarning:
|
||||
"Die Integration mit Google Kalender ist aus Sicherheitsgründen nicht im Mehrbenutzermodus verfügbar. Bitte deaktivieren Sie den Mehrbenutzermodus, um diese Funktion nutzen zu können.",
|
||||
configuration: "Konfiguration des Google Kalenders",
|
||||
deploymentId: "Deployment-ID",
|
||||
deploymentIdHelp:
|
||||
"Die Bereitstellungs-ID Ihrer Google Apps Script Web-Anwendung",
|
||||
apiKey: "API-Schlüssel",
|
||||
apiKeyHelp:
|
||||
"Der API-Schlüssel, den Sie in Ihrer Google Apps Script-Bereitstellung konfiguriert haben",
|
||||
configurationRequired:
|
||||
"Bitte konfigurieren Sie die Deployment-ID und den API-Schlüssel, um die Google Calendar-Funktionen zu aktivieren.",
|
||||
configured: "Konfiguriert",
|
||||
searchSkills: "Suchfähigkeiten...",
|
||||
noSkillsFound: "Keine Übereinstimmungen zu Ihrer Suche.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalender",
|
||||
description: "Überprüfen und verwalten Sie Ihre Google-Kalender.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Veranstaltungen lesen",
|
||||
description: "Kalenderereignisse anzeigen und suchen",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Erstellen und aktualisieren von Veranstaltungen",
|
||||
description:
|
||||
"Erstellen Sie neue Veranstaltungen und ändern Sie bestehende",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Verwaltung von Rückmeldungen",
|
||||
description:
|
||||
"Verwalten Sie den Status Ihrer Teilnahme an Veranstaltungen",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalenderlisten",
|
||||
description:
|
||||
"Listen Sie alle Kalender auf, die Sie besitzen oder für die Sie ein Abonnement haben.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Details zum Kalender anzeigen",
|
||||
description:
|
||||
"Erhalten Sie detaillierte Informationen über einen bestimmten Kalender.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Veranstaltung finden",
|
||||
description:
|
||||
"Erhalten Sie detaillierte Informationen über ein bestimmtes Ereignis.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Veranstaltungen für den Tag",
|
||||
description:
|
||||
"Alle Veranstaltungen, die für einen bestimmten Tag geplant sind, anzeigen.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Veranstaltungen (Zeitraum) anzeigen",
|
||||
description:
|
||||
"Ereignisse innerhalb eines benutzerdefinierten Datumsbereichs abrufen",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Anstehende Veranstaltungen anzeigen",
|
||||
description:
|
||||
"Finden Sie Veranstaltungen für heute, diese Woche oder diesen Monat, indem Sie einfache Suchbegriffe verwenden.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Schnellere Veranstaltung hinzufügen",
|
||||
description:
|
||||
"Erstellen Sie eine Veranstaltung aus natürlicher Sprache (z. B. „Treffen morgen um 15:00 Uhr“)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Ereignis erstellen",
|
||||
description:
|
||||
"Erstellen Sie ein neues Ereignis mit vollständiger Kontrolle über alle Eigenschaften.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Aktualisierungsereignis",
|
||||
description: "Ein bestehendes Kalendereintrag aktualisieren",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Status der Rückmeldung",
|
||||
description: "Teilen, ablehnen oder vorläufig zustimmen",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"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.",
|
||||
@@ -459,13 +777,6 @@ const TRANSLATIONS = {
|
||||
"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: {
|
||||
@@ -577,7 +888,34 @@ const TRANSLATIONS = {
|
||||
"API-Schlüssel ermöglichen es dem Besitzer, programmatisch auf diese AnythingLLM-Instanz zuzugreifen und sie zu verwalten.",
|
||||
link: "Lesen Sie die API-Dokumentation",
|
||||
generate: "Neuen API-Schlüssel generieren",
|
||||
empty: "Keine API-Schlüssel gefunden",
|
||||
actions: "Aktionen",
|
||||
messages: {
|
||||
error: "Fehler: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Neuen API-Schlüssel erstellen",
|
||||
cancel: "Abbrechen",
|
||||
close: "Schließen",
|
||||
create: "API-Schlüssel erstellen",
|
||||
helper:
|
||||
"Nach der Erstellung kann der API-Schlüssel verwendet werden, um programmgesteuert auf diese AnythingLLM-Instanz zuzugreifen und sie zu konfigurieren.",
|
||||
name: {
|
||||
label: "Name",
|
||||
placeholder: "Produktionsintegration",
|
||||
helper:
|
||||
"Optional. Verwenden Sie einen leicht verständlichen Namen, damit Sie diesen Schlüssel später wiedererkennen.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "API-Schlüssel kopieren",
|
||||
copied: "Kopiert",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Möchten Sie diesen API-Schlüssel wirklich deaktivieren?\nDanach kann er nicht mehr verwendet werden.\n\nDiese Aktion kann nicht rückgängig gemacht werden.",
|
||||
},
|
||||
table: {
|
||||
name: "Name",
|
||||
key: "API-Schlüssel",
|
||||
by: "Erstellt von",
|
||||
created: "Erstellt",
|
||||
@@ -1148,9 +1486,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1197,20 +1532,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -420,6 +420,299 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail",
|
||||
description:
|
||||
"Enable your agent to interact with Gmail - search emails, read threads, compose drafts, send emails, and manage your inbox. <a>Read the documentation</a>.",
|
||||
multiUserWarning:
|
||||
"Gmail integration is not available in multi-user mode for security reasons. Please disable multi-user mode to use this feature.",
|
||||
configuration: "Gmail Configuration",
|
||||
deploymentId: "Deployment ID",
|
||||
deploymentIdHelp:
|
||||
"The deployment ID from your Google Apps Script web app",
|
||||
apiKey: "API Key",
|
||||
apiKeyHelp:
|
||||
"The API key you configured in your Google Apps Script deployment",
|
||||
configurationRequired:
|
||||
"Please configure the Deployment ID and API Key to enable Gmail skills.",
|
||||
configured: "Configured",
|
||||
searchSkills: "Search skills...",
|
||||
noSkillsFound: "No skills match your search.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Search & Read Emails",
|
||||
description: "Search and read emails from your Gmail inbox",
|
||||
},
|
||||
drafts: {
|
||||
title: "Draft Emails",
|
||||
description: "Create, edit, and manage email drafts",
|
||||
},
|
||||
send: {
|
||||
title: "Send & Reply to Emails",
|
||||
description: "Send emails and reply to threads immediately",
|
||||
},
|
||||
threads: {
|
||||
title: "Manage Email Threads",
|
||||
description:
|
||||
"Manage email threads - mark read/unread, archive, trash",
|
||||
},
|
||||
account: {
|
||||
title: "Integration Statistics",
|
||||
description: "View mailbox statistics and account information",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Get Inbox",
|
||||
description: "Streamlined way to get the inbox emails from Gmail",
|
||||
},
|
||||
search: {
|
||||
title: "Search Emails",
|
||||
description: "Search emails using Gmail query syntax",
|
||||
},
|
||||
readThread: {
|
||||
title: "Read Thread",
|
||||
description: "Read a full email thread by ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Create Draft",
|
||||
description: "Create a new draft email",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Create Draft Reply",
|
||||
description: "Create a draft reply to an existing thread",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Update Draft",
|
||||
description: "Update an existing draft email",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Get Draft",
|
||||
description: "Retrieve a specific draft by ID",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "List Drafts",
|
||||
description: "List all draft emails",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Delete Draft",
|
||||
description: "Delete a draft email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Send Draft",
|
||||
description: "Send an existing draft email",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Send Email",
|
||||
description: "Send an email immediately",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Reply to Thread",
|
||||
description: "Reply to an email thread immediately",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Mark a thread as read",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Mark Unread",
|
||||
description: "Mark a thread as unread",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Move to Trash",
|
||||
description: "Move a thread to trash",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archive",
|
||||
description: "Archive a thread",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Move to Inbox",
|
||||
description: "Move a thread to inbox",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Mailbox Stats",
|
||||
description: "Get unread counts and mailbox statistics",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Calendar",
|
||||
description:
|
||||
"Enable your agent to interact with Google Calendar - view calendars, get events, create and update events, and manage RSVPs. <a>Read the documentation</a>.",
|
||||
multiUserWarning:
|
||||
"Google Calendar integration is not available in multi-user mode for security reasons. Please disable multi-user mode to use this feature.",
|
||||
configuration: "Google Calendar Configuration",
|
||||
deploymentId: "Deployment ID",
|
||||
deploymentIdHelp:
|
||||
"The deployment ID from your Google Apps Script web app",
|
||||
apiKey: "API Key",
|
||||
apiKeyHelp:
|
||||
"The API key you configured in your Google Apps Script deployment",
|
||||
configurationRequired:
|
||||
"Please configure the Deployment ID and API Key to enable Google Calendar skills.",
|
||||
configured: "Configured",
|
||||
searchSkills: "Search skills...",
|
||||
noSkillsFound: "No skills match your search.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendars",
|
||||
description: "View and manage your Google Calendars",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Read Events",
|
||||
description: "View and search calendar events",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Create & Update Events",
|
||||
description: "Create new events and modify existing ones",
|
||||
},
|
||||
rsvp: {
|
||||
title: "RSVP Management",
|
||||
description: "Manage your response status for events",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "List Calendars",
|
||||
description: "List all calendars you own or are subscribed to",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Get Calendar Details",
|
||||
description: "Get detailed information about a specific calendar",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Get Event",
|
||||
description: "Get detailed information about a specific event",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Get Events for Day",
|
||||
description: "Get all events scheduled for a specific day",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Get Events (Date Range)",
|
||||
description: "Get events within a custom date range",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Get Upcoming Events",
|
||||
description:
|
||||
"Get events for today, this week, or this month using simple keywords",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Quick Add Event",
|
||||
description:
|
||||
"Create an event from natural language (e.g., 'Meeting tomorrow at 3pm')",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Create Event",
|
||||
description:
|
||||
"Create a new event with full control over all properties",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Update Event",
|
||||
description: "Update an existing calendar event",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Set RSVP Status",
|
||||
description: "Accept, decline, or tentatively accept an event",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook",
|
||||
description:
|
||||
"Enable your agent to interact with Microsoft Outlook - search emails, read threads, compose drafts, send emails, and manage your inbox via Microsoft Graph API. <a>Read the documentation</a>.",
|
||||
multiUserWarning:
|
||||
"Outlook integration is not available in multi-user mode for security reasons. Please disable multi-user mode to use this feature.",
|
||||
configuration: "Outlook Configuration",
|
||||
authType: "Account Type",
|
||||
authTypeHelp:
|
||||
"Choose which types of Microsoft accounts can authenticate. 'All accounts' supports both personal and work/school accounts. 'Personal only' restricts to personal Microsoft accounts. 'Organization only' restricts to work/school accounts from a specific Azure AD tenant.",
|
||||
authTypeCommon: "All accounts (personal & work/school)",
|
||||
authTypeConsumers: "Personal Microsoft accounts only",
|
||||
authTypeOrganization: "Organization accounts only (requires Tenant ID)",
|
||||
clientId: "Application (Client) ID",
|
||||
clientIdHelp:
|
||||
"The Application (Client) ID from your Azure AD app registration",
|
||||
tenantId: "Directory (Tenant) ID",
|
||||
tenantIdHelp:
|
||||
"The Directory (Tenant) ID from your Azure AD app registration. Required only for organization-only authentication.",
|
||||
clientSecret: "Client Secret",
|
||||
clientSecretHelp:
|
||||
"The client secret value from your Azure AD app registration",
|
||||
configurationRequired:
|
||||
"Please configure the Client ID and Client Secret to enable Outlook skills.",
|
||||
authRequired:
|
||||
"Save your credentials first, then authenticate with Microsoft to complete the setup.",
|
||||
authenticateWithMicrosoft: "Authenticate with Microsoft",
|
||||
authenticated: "Successfully authenticated with Microsoft Outlook.",
|
||||
revokeAccess: "Revoke Access",
|
||||
configured: "Configured",
|
||||
searchSkills: "Search skills...",
|
||||
noSkillsFound: "No skills match your search.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Search & Read Emails",
|
||||
description: "Search and read emails from your Outlook inbox",
|
||||
},
|
||||
drafts: {
|
||||
title: "Draft Emails",
|
||||
description: "Create, edit, and manage email drafts",
|
||||
},
|
||||
send: {
|
||||
title: "Send Emails",
|
||||
description: "Send new emails or reply to messages immediately",
|
||||
},
|
||||
account: {
|
||||
title: "Integration Statistics",
|
||||
description: "View mailbox statistics and account information",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Get Inbox",
|
||||
description: "Get recent emails from your Outlook inbox",
|
||||
},
|
||||
search: {
|
||||
title: "Search Emails",
|
||||
description: "Search emails using Microsoft Search syntax",
|
||||
},
|
||||
readThread: {
|
||||
title: "Read Conversation",
|
||||
description: "Read a full email conversation thread",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Create Draft",
|
||||
description:
|
||||
"Create a new draft email or draft reply to an existing message",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Update Draft",
|
||||
description: "Update an existing draft email",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "List Drafts",
|
||||
description: "List all draft emails",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Delete Draft",
|
||||
description: "Delete a draft email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Send Draft",
|
||||
description: "Send an existing draft email",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Send Email",
|
||||
description:
|
||||
"Send a new email or reply to an existing message immediately",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Mailbox Stats",
|
||||
description: "Get folder counts and mailbox statistics",
|
||||
},
|
||||
},
|
||||
},
|
||||
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.",
|
||||
},
|
||||
@@ -466,6 +759,94 @@ 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.",
|
||||
},
|
||||
@@ -577,7 +958,34 @@ const TRANSLATIONS = {
|
||||
"API keys allow the holder to programmatically access and manage this AnythingLLM instance.",
|
||||
link: "Read the API documentation",
|
||||
generate: "Generate New API Key",
|
||||
empty: "No API keys found",
|
||||
actions: "Actions",
|
||||
messages: {
|
||||
error: "Error: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Create new API key",
|
||||
cancel: "Cancel",
|
||||
close: "Close",
|
||||
create: "Create API Key",
|
||||
helper:
|
||||
"Once created the API key can be used to programmatically access and configure this AnythingLLM instance.",
|
||||
name: {
|
||||
label: "Name",
|
||||
placeholder: "Production integration",
|
||||
helper:
|
||||
"Optional. Use a friendly name so you can identify this key later.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copy API Key",
|
||||
copied: "Copied",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Are you sure you want to deactivate this api key?\nAfter you do this it will not longer be useable.\n\nThis action is irreversible.",
|
||||
},
|
||||
table: {
|
||||
name: "Name",
|
||||
key: "API Key",
|
||||
by: "Created By",
|
||||
created: "Created",
|
||||
@@ -697,8 +1105,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -735,20 +1141,9 @@ const TRANSLATIONS = {
|
||||
"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: {
|
||||
|
||||
@@ -423,6 +423,327 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Conector de GMail",
|
||||
description:
|
||||
"Permita que su agente interactúe con Gmail: buscar correos electrónicos, leer hilos, redactar borradores, enviar correos electrónicos y gestionar su bandeja de entrada. <a>Consulte la documentación</a>.",
|
||||
multiUserWarning:
|
||||
"La integración con Gmail no está disponible en el modo para múltiples usuarios por razones de seguridad. Para utilizar esta función, por favor, desactive el modo para múltiples usuarios.",
|
||||
configuration: "Configuración de Gmail",
|
||||
deploymentId: "ID de despliegue",
|
||||
deploymentIdHelp:
|
||||
"El ID de implementación de tu aplicación web de Google Apps Script",
|
||||
apiKey: "Clave API",
|
||||
apiKeyHelp:
|
||||
"La clave de API que configuraste en la implementación de tu Google Apps Script.",
|
||||
configurationRequired:
|
||||
"Por favor, configure el ID de implementación y la clave de API para habilitar las funciones de Gmail.",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de búsqueda...",
|
||||
noSkillsFound: "No se encontraron coincidencias con tu búsqueda.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Buscar y leer correos electrónicos",
|
||||
description:
|
||||
"Busque y lea correos electrónicos de su bandeja de entrada de Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Plantillas de correos electrónicos",
|
||||
description:
|
||||
"Crea, edita y gestiona borradores de correo electrónico.",
|
||||
},
|
||||
send: {
|
||||
title: "Enviar y responder a correos electrónicos",
|
||||
description:
|
||||
"Envía correos electrónicos y responde a las conversaciones de inmediato.",
|
||||
},
|
||||
threads: {
|
||||
title: "Gestionar hilos de correo electrónico",
|
||||
description:
|
||||
"Gestionar hilos de correo electrónico: marcar como leído/no leído, archivar, eliminar",
|
||||
},
|
||||
account: {
|
||||
title: "Estadísticas de integración",
|
||||
description:
|
||||
"Visualice estadísticas de la bandeja de entrada y información de la cuenta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Buscar correos electrónicos",
|
||||
description:
|
||||
"Busque correos electrónicos utilizando la sintaxis de consulta de Gmail.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leer el hilo",
|
||||
description:
|
||||
"Lee la conversación completa de correo electrónico, ordenada por ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Crear borrador",
|
||||
description: "Crea un nuevo borrador de correo electrónico.",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Crear respuesta preliminar",
|
||||
description:
|
||||
"Cree una respuesta preliminar a un hilo de discusión existente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versión actualizada del borrador",
|
||||
description:
|
||||
"Actualizar un borrador de correo electrónico existente",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Obtener borrador",
|
||||
description: "Recuperar un borrador específico mediante su ID.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Borradores",
|
||||
description: "Enumera todos los correos electrónicos en proyecto.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Eliminar borrador",
|
||||
description: "Eliminar un borrador de correo electrónico",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Enviar borrador",
|
||||
description: "Enviar una versión previa de un correo electrónico.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Enviar correo electrónico",
|
||||
description: "Envía un correo electrónico inmediatamente.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Responder a la discusión",
|
||||
description:
|
||||
"Responder a una conversación por correo electrónico de inmediato.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Indicar que un hilo ha sido leído.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Marcar como no leído",
|
||||
description: "Indicar que un hilo está sin leer.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Mover a la papelera",
|
||||
description: "Mover un hilo a la papelera",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archivo",
|
||||
description: "Archivar un hilo de conversación",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Mover a la bandeja de entrada",
|
||||
description: "Mover un hilo a la bandeja de entrada",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Estadísticas de la bandeja de entrada",
|
||||
description:
|
||||
"Obtén el número de correos no leídos y estadísticas de la bandeja de entrada.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Acceder a la bandeja de entrada",
|
||||
description:
|
||||
"Una forma sencilla de acceder a los correos electrónicos de la bandeja de entrada de Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Conector de Outlook",
|
||||
description:
|
||||
"Permita que su agente interactúe con Microsoft Outlook: buscar correos electrónicos, leer hilos, redactar borradores, enviar correos electrónicos y administrar su bandeja de entrada a través de la API de Microsoft Graph. Consulte la documentación.",
|
||||
multiUserWarning:
|
||||
"La integración con Outlook no está disponible en el modo multiusuario por razones de seguridad. Para utilizar esta función, por favor, desactive el modo multiusuario.",
|
||||
configuration: "Configuración de Outlook",
|
||||
authType: "Tipo de cuenta",
|
||||
authTypeHelp:
|
||||
'Seleccione qué tipos de cuentas de Microsoft pueden autenticarse. "Todas las cuentas" admite tanto cuentas personales como cuentas de trabajo/escuela. "Solo cuentas personales" se limita a cuentas personales de Microsoft. "Solo cuentas de organización" se limita a cuentas de trabajo/escuela de un inquilino específico de Azure AD.',
|
||||
authTypeCommon: "Todas las cuentas (personales y de trabajo/escuela)",
|
||||
authTypeConsumers: "Cuentas personales de Microsoft únicamente.",
|
||||
authTypeOrganization:
|
||||
"Cuentas de organizaciones únicamente (requiere el ID del inquilino)",
|
||||
clientId: "Identificador del cliente (solicitante)",
|
||||
clientIdHelp:
|
||||
"El ID de la aplicación (cliente) de su registro de aplicación en Azure AD",
|
||||
tenantId: "ID del inquilino",
|
||||
tenantIdHelp:
|
||||
"El ID del directorio (del inquilino) de su registro de aplicación en Azure AD. Es necesario únicamente para la autenticación dentro de una organización.",
|
||||
clientSecret: "Clave secreta",
|
||||
clientSecretHelp:
|
||||
"El valor secreto del cliente de su registro de aplicación en Azure AD.",
|
||||
configurationRequired:
|
||||
"Por favor, configure el ID del cliente y la clave secreta para habilitar las funciones de Outlook.",
|
||||
authRequired:
|
||||
"Primero, guarde sus credenciales, y luego, utilice las credenciales para autenticarse con Microsoft y completar la configuración.",
|
||||
authenticateWithMicrosoft: "Autenticarse con Microsoft",
|
||||
authenticated: "Autenticación exitosa con Microsoft Outlook.",
|
||||
revokeAccess: "Revocar el acceso",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de búsqueda...",
|
||||
noSkillsFound:
|
||||
"No se encontraron resultados que coincidan con tu búsqueda.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Buscar y leer correos electrónicos",
|
||||
description:
|
||||
"Busque y lea correos electrónicos desde su bandeja de entrada de Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Borradores de correos electrónicos",
|
||||
description:
|
||||
"Crea, edita y gestiona borradores de correos electrónicos.",
|
||||
},
|
||||
send: {
|
||||
title: "Enviar correos electrónicos",
|
||||
description:
|
||||
"Envía nuevos correos electrónicos o responde a los mensajes de inmediato.",
|
||||
},
|
||||
account: {
|
||||
title: "Estadísticas de integración",
|
||||
description:
|
||||
"Visualice las estadísticas de la bandeja de entrada y la información de la cuenta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Acceder a la bandeja de entrada",
|
||||
description:
|
||||
"Consigue los últimos correos electrónicos de tu bandeja de entrada de Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Buscar correos electrónicos",
|
||||
description:
|
||||
"Busque correos electrónicos utilizando la sintaxis de búsqueda de Microsoft.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leer la conversación",
|
||||
description: "Leer toda la conversación por correo electrónico.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Crear borrador",
|
||||
description:
|
||||
"Cree un nuevo borrador de correo electrónico o un borrador de respuesta a un mensaje existente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versión actualizada del borrador",
|
||||
description:
|
||||
"Actualizar un borrador de correo electrónico existente",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Borradores",
|
||||
description: "Enumere todas las correos electrónicos en borrador.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Eliminar borrador",
|
||||
description: "Eliminar un borrador de correo electrónico",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Enviar borrador",
|
||||
description: "Enviar un borrador de correo electrónico existente",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Enviar correo electrónico",
|
||||
description:
|
||||
"Envía un nuevo correo electrónico o responde a un mensaje existente de inmediato.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Estadísticas de la bandeja de entrada",
|
||||
description:
|
||||
"Obtén el número de carpetas y estadísticas de la bandeja de entrada.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Conector para Google Calendar",
|
||||
description:
|
||||
"Permita que su agente interactúe con Google Calendar: visualice calendarios, obtenga información sobre eventos, cree y actualice eventos, y gestione las confirmaciones de asistencia. <a>Consulte la documentación</a>.",
|
||||
multiUserWarning:
|
||||
"La integración con Google Calendar no está disponible en el modo de varios usuarios por razones de seguridad. Para utilizar esta función, por favor, desactive el modo de varios usuarios.",
|
||||
configuration: "Configuración de Google Calendar",
|
||||
deploymentId: "ID de implementación",
|
||||
deploymentIdHelp:
|
||||
"El ID de implementación de su aplicación web de Google Apps Script",
|
||||
apiKey: "Clave de API",
|
||||
apiKeyHelp:
|
||||
"La clave API que configuraste en tu implementación de Google Apps Script.",
|
||||
configurationRequired:
|
||||
"Por favor, configure el ID de implementación y la clave de API para habilitar las funciones de Google Calendar.",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de búsqueda...",
|
||||
noSkillsFound:
|
||||
"No se encontraron resultados que coincidan con tu búsqueda.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendarios",
|
||||
description: "Visualiza y administra tus calendarios de Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Leer eventos",
|
||||
description: "Visualice y busque eventos en el calendario.",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Crear y actualizar eventos",
|
||||
description: "Crear nuevos eventos y modificar los existentes.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Gestión de confirmaciones de asistencia",
|
||||
description: "Gestiona el estado de tus respuestas para eventos.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Calendarios",
|
||||
description:
|
||||
"Enumere todos los calendarios que posee o a los que esté suscrito.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Obtén los detalles del calendario",
|
||||
description:
|
||||
"Obtenga información detallada sobre un calendario específico.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Obtener información del evento",
|
||||
description:
|
||||
"Obtenga información detallada sobre un evento específico.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Encuentra eventos para el día.",
|
||||
description:
|
||||
"Obtén todos los eventos programados para una fecha específica.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Obtener eventos (rango de fechas)",
|
||||
description:
|
||||
"Obtener eventos dentro de un rango de fechas personalizado.",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Consulta los próximos eventos",
|
||||
description:
|
||||
"Encuentre eventos para hoy, esta semana o este mes utilizando palabras clave sencillas.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Añadir evento rápidamente",
|
||||
description:
|
||||
'Crear un evento a partir de lenguaje natural (por ejemplo, "Reunión mañana a las 3 de la tarde")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Crear evento",
|
||||
description:
|
||||
"Cree un nuevo evento con control total sobre todas las propiedades.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Actualización del evento",
|
||||
description: "Actualizar un evento existente en el calendario",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Establecer estado de confirmación",
|
||||
description:
|
||||
"Aceptar, rechazar o aceptar provisionalmente un evento.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servidores MCP",
|
||||
@@ -470,6 +791,97 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -585,7 +997,34 @@ const TRANSLATIONS = {
|
||||
"Las claves de API permiten al titular acceder y administrar programáticamente esta instancia de AnythingLLM.",
|
||||
link: "Leer la documentación de la API",
|
||||
generate: "Generar nueva clave de API",
|
||||
empty: "No se encontraron claves API",
|
||||
actions: "Acciones",
|
||||
messages: {
|
||||
error: "Error: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Crear nueva clave API",
|
||||
cancel: "Cancelar",
|
||||
close: "Cerrar",
|
||||
create: "Crear clave API",
|
||||
helper:
|
||||
"Una vez creada, la clave API se puede usar para acceder y configurar esta instancia de AnythingLLM mediante programación.",
|
||||
name: {
|
||||
label: "Nombre",
|
||||
placeholder: "Integración de producción",
|
||||
helper:
|
||||
"Opcional. Usa un nombre descriptivo para poder identificar esta clave más adelante.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copiar clave API",
|
||||
copied: "Copiada",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"¿Seguro que deseas desactivar esta clave API?\nDespués de hacerlo ya no se podrá usar.\n\nEsta acción es irreversible.",
|
||||
},
|
||||
table: {
|
||||
name: "Nombre",
|
||||
key: "Clave de API",
|
||||
by: "Creado por",
|
||||
created: "Creado",
|
||||
@@ -1161,9 +1600,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1205,20 +1641,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -406,6 +406,306 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail-iga ühendamine",
|
||||
description:
|
||||
"Lase oma esindajal interakteeruda Gmailiga – otsida e-kirju, lugeda teemasid, luua esialgseid versioone, saatada e-kirju ja hallata oma postkasti. <a>Vaata dokumentatsiooni</a>.",
|
||||
multiUserWarning:
|
||||
"Gmaili integreerimine ei ole saadaval mitme kasutaja režiimis turvalisuse huvides. Palun deaktiveerige mitme kasutaja režiim, et kasutada seda funktsiooni.",
|
||||
configuration: "Gmaili seadmine",
|
||||
deploymentId: "Paigaldamis ID",
|
||||
deploymentIdHelp: "Veebirakenduse Google Apps Scripti ID",
|
||||
apiKey: "API võti",
|
||||
apiKeyHelp:
|
||||
"API võti, mida olete konfigureerinud oma Google Apps Scripti rakenduses.",
|
||||
configurationRequired:
|
||||
'Palun konfigureerige "Deployment ID" ja API võti, et Gmaili funktsionaalsus oleks aktiivne.',
|
||||
configured: "Konfigureeritud",
|
||||
searchSkills: "otsinguteadused...",
|
||||
noSkillsFound: "Leidke ei leitud sobivaid oskusi teie otsingu põhjal.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Leia ja luge e-kirju",
|
||||
description: "Kutsutage ja looge Gmaili postkasti olevad e-kirjad",
|
||||
},
|
||||
drafts: {
|
||||
title: "Esimesed kirjad",
|
||||
description: "Loo, muuda ja hallata e-kirjade projekte",
|
||||
},
|
||||
send: {
|
||||
title: "Saada ja vastata e-kirjadele",
|
||||
description: "Saada e-kirju ja vastata teemades kohe",
|
||||
},
|
||||
threads: {
|
||||
title: "Hallata e-kirjade seeriaid",
|
||||
description:
|
||||
"Hallata e-posti vestlusi – märgistada kui lugemata/lugemata, salvestada, kustutada",
|
||||
},
|
||||
account: {
|
||||
title: "Integreerimise statistika",
|
||||
description: "Vaata postkasti statistikat ja konto teavet.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "E-kirjade otsing",
|
||||
description: "Kutse e-kirju Gmaili küsimismängu sintaksiga",
|
||||
},
|
||||
readThread: {
|
||||
title: "Loe teemat",
|
||||
description: "Vaata kogu e-kirjade sarja ID järgi",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Loo esialgne versioon",
|
||||
description: "Loo uus e-posti eelnäide",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Loo esialgne vastus",
|
||||
description: "Loo esialgne vastus olemasolevale teemale.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Väljaanne",
|
||||
description: "Värskendada olemasolevat e-kirja projekti",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Vaata esialgne versioon",
|
||||
description: "Taasta konkreetne versioon ID-täringuga",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Esialgne versioon",
|
||||
description: "Loeda kõik e-kirjade plaani",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Hüvata projekti",
|
||||
description: "Hüvata e-kirja, mis on loodud",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Saada projekti",
|
||||
description: "Saada olemasolev e-kirja esialgne versioon",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Saatke e-kiri",
|
||||
description: "Saatke e-kiri kohe",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Vastata teemale",
|
||||
description: "Vasta e-posti teemale kohe",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Märki, et teema on lugemata.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Märgi kui vaatamata",
|
||||
description: "Märki, et teema on lugemata",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Saada jäätmeteks",
|
||||
description: "Liigu teema prügikasti",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arhiiv",
|
||||
description: "Salvatage teema",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Liiguta postkasti",
|
||||
description: 'Liiga "Saadud" pildile',
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Postkasti statistika",
|
||||
description:
|
||||
"Vaata, mitu ebakirjutatud kirja on, ning postkasti statistikat.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Ava postkasti",
|
||||
description:
|
||||
"Lihtne viis, kuidas saada Gmailist oma postkasti e-kirjad.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlooki ühineja",
|
||||
description:
|
||||
"Laske oma agentil interakteeruda Microsoft Outlookiga – otsida e-kirju, lugeda teemasid, luua esialgseid versioone, saata e-kirju ja hallata oma postkasti Microsoft Graph API kaudu. <a>Vaata dokumentatsiooni</a>.",
|
||||
multiUserWarning:
|
||||
"Outlooki integratsioon ei ole saadaval mitme kasutaja režiimis turvalisuse huvides. Palun deaktiveeri mitme kasutaja režiim, et kasutada seda funktsiooni.",
|
||||
configuration: "Outlooki seadistamine",
|
||||
authType: "Kontoti tüüp",
|
||||
authTypeHelp:
|
||||
'Valige, milliseid Microsofti kontode tüüpe saab autentida. "Kõik kontod" toetab nii isiklikke kui ka töö- või kooli kontode. " ainult isiklikud kontod" piirab kasutamise ainult isikliktega Microsofti kontodega. " ainult organisatsioonile kuuluvad kontod" piirab kasutamise ainult töö- või kooli kontodega, mis kuuluvad konkreetsele Azure AD kliendile.',
|
||||
authTypeCommon: "Kõik kontod (personaalsed ja töö/kooli kontod)",
|
||||
authTypeConsumers: "V ainult isiklikud Microsofti kontod",
|
||||
authTypeOrganization:
|
||||
"Vain organisatsioonide kontod (vajalik Rentniku ID)",
|
||||
clientId: "Rakenduse (kliendi) ID",
|
||||
clientIdHelp:
|
||||
"Rakenduse (kliendi) ID, mis on teie Azure AD rakenduse registreerimisel saadud",
|
||||
tenantId: "Kinnitusnumber (kasutaja)",
|
||||
tenantIdHelp:
|
||||
'"Kinnitusnumber (kasutaja) teie Azure AD rakenduse registreerimise kohta. Nii on vaja ainult organisatsioonide enda autentimiseks."',
|
||||
clientSecret: "Klientide andmetest saadava teabe turvaandlik kood",
|
||||
clientSecretHelp:
|
||||
"Klientide andmevara, mis on saadaval teie Azure AD rakenduse registreerimisel",
|
||||
configurationRequired:
|
||||
"Palun konfigureerige kliendi ID ja kliendi salavai, et Outlooki funktsioonid oleksid saadaval.",
|
||||
authRequired:
|
||||
"Esiteks salvestage oma andmed, seejärel käivitage Microsoftiga autentimine, et lõpule viia seadistamine.",
|
||||
authenticateWithMicrosoft:
|
||||
"Veenduge, et olete Microsoftiga sisselogitud",
|
||||
authenticated: "Eduka autentimine Microsoft Outlook-iga.",
|
||||
revokeAccess: "Tõsta juurdepääsu kaotamine",
|
||||
configured: "Konfigureeritud",
|
||||
searchSkills: "otsinguteadused...",
|
||||
noSkillsFound: "Sellele andmetele ei leitud sobivaid tulemusi.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Abi otsimiseks ja e-kirjade lugemiseks",
|
||||
description: "Kavatu ja loe oma Outlooki postkasti e-kirju",
|
||||
},
|
||||
drafts: {
|
||||
title: "Esimesed kirjad",
|
||||
description: "Loo, muuda ja hallata e-kirjade plaane",
|
||||
},
|
||||
send: {
|
||||
title: "Saada e-kirju",
|
||||
description: "Saada uusi e-kirju või vastata teatele kohe",
|
||||
},
|
||||
account: {
|
||||
title: "Integreerimise statistika",
|
||||
description: "Vaata postkasti statistikat ja kontoinformatsiooni",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Ava postkasti",
|
||||
description: "Vaata viimaseid e-kirju oma Outlook postkasti",
|
||||
},
|
||||
search: {
|
||||
title: "E-kirjade otsing",
|
||||
description: "Kõnede otsimiseks kasutage Microsofti otsingusünkt.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Loe vestluse",
|
||||
description: "Vaata kogu e-kirjade vestluse täisteksti",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Loo esialgne versioon",
|
||||
description:
|
||||
"Loo uus e-kirja versioon või uus vastamine olemasolevale kirja kohta.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versiooni uuendamine",
|
||||
description: "Värskendada olemasolevat e-kirja versiooni",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Esialgne versioon",
|
||||
description: "Loeda kõik eelnevate kirjade nimekiri",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Hüvata projekti",
|
||||
description: "Hüvida kirjalik e-kiri",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Saada esialgne versioon",
|
||||
description: "Saada olemasolev e-kirja esialgne versioon",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Saada e-kiri",
|
||||
description:
|
||||
"Saada uus e-kiri või vastata olemasolevale sõnule kohe",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Postkasti statistika",
|
||||
description: "Vaata kaustade arvu ja postkasti statistikat",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Kalendri ühendaja",
|
||||
description:
|
||||
"Lisage oma esindajale võimalus interakteeruda Google Kalendriga – vaadake kalendreid, hankige sündmusi, looge ja uuendage sündmusi ning hallake vastuvõtuid. <a>Vaadake dokumentatsiooni</a>.",
|
||||
multiUserWarning:
|
||||
"Google Kalendri integreerimine ei ole saadaval mitme kasutaja režiimis turvalisuse huvides. Palun deaktiveeri mitme kasutaja režiim, et kasutada seda funktsiooni.",
|
||||
configuration: "Google Kalendri seadistamine",
|
||||
deploymentId: "Paigutuse ID",
|
||||
deploymentIdHelp: "Veebirakenduse Google Apps Scripti ID",
|
||||
apiKey: "API võtme",
|
||||
apiKeyHelp:
|
||||
"API võti, mida olete konfigureerinud oma Google Apps Scripti rakenduses.",
|
||||
configurationRequired:
|
||||
'Palun konfigureerige "Deployment ID" ja API võti, et Google Calendar funktsionaalsus oleks aktiivne.',
|
||||
configured: "Konfigureeritud",
|
||||
searchSkills: "otsinguteadused...",
|
||||
noSkillsFound: "Sellele andmetele ei leitud sobivaid tulemusi.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendrid",
|
||||
description: "Vaata ja hallata oma Google kalendeid",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Vaata üritusi",
|
||||
description: "Vaata ja otsi kalendri sündmusi",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Loo ja uuenda üritusi",
|
||||
description: "Loo uusi üritusi ja muuda olemasolevaid",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Vabatahtlikkuse registreerimise juhtimine",
|
||||
description: "Halda oma vastuse staatuse sündmustele",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalendrid",
|
||||
description:
|
||||
"Loole kõik kalendrid, mille te omate või millele olete registreeritud.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Hankige kalendri üksikasjad",
|
||||
description:
|
||||
"Hankige üksikasjalikke andmeid konkreetse kalendri kohta",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Saada ürituse info",
|
||||
description:
|
||||
"Hankige üksikasjalikku teavet konkreetse ürituse kohta",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Leidke üritused selle päeva jaoks",
|
||||
description:
|
||||
"Vaata kõiki üritusi, mis on planeeritud konkreetsele päeval",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Leia üritused (aegraadi)",
|
||||
description: "Võtke kokku sündmused spetsifitse ajaskaala pikkusel",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Vaata tulevasi üritusi",
|
||||
description:
|
||||
"Leidke sündmused täna, selle nädala või selle kuuga, kasutades lihtsaid sõnu",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Kiirelt sisse lisada",
|
||||
description:
|
||||
'Loo üritus loomuliku keele alusel (nt "Koosolek homme kell 15:00")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Loo üritus",
|
||||
description:
|
||||
"Loo uus üritus, mis võimaldab kontrollida kõiki selle atribuute.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Täiendav info",
|
||||
description: "Muuda olemasoleva kalendri sündmuse",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Määrake vastuvõtu staatus",
|
||||
description:
|
||||
"Mõne sündmuse kinnitamise, kehtestamise või esialgse kinnitamise.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-serverid",
|
||||
@@ -452,6 +752,94 @@ 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",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -557,7 +945,34 @@ const TRANSLATIONS = {
|
||||
"API võtmed võimaldavad programmipõhiselt hallata seda AnythingLLM instantsi.",
|
||||
link: "Loe API dokumentatsiooni",
|
||||
generate: "Genereeri uus API võti",
|
||||
empty: "API võtmeid ei leitud",
|
||||
actions: "Toimingud",
|
||||
messages: {
|
||||
error: "Viga: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Loo uus API võti",
|
||||
cancel: "Tühista",
|
||||
close: "Sulge",
|
||||
create: "Loo API võti",
|
||||
helper:
|
||||
"Pärast loomist saab API võtit kasutada sellele AnythingLLM-i instantsile programmiga ligi pääsemiseks ja selle seadistamiseks.",
|
||||
name: {
|
||||
label: "Nimi",
|
||||
placeholder: "Tootmiskeskkonna integratsioon",
|
||||
helper:
|
||||
"Valikuline. Kasuta sõbralikku nime, et saaksid võtme hiljem hõlpsasti ära tunda.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopeeri API võti",
|
||||
copied: "Kopeeritud",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Kas soovite selle API võtme kindlasti deaktiveerida?\nPärast seda ei saa seda enam kasutada.\n\nSeda toimingut ei saa tagasi võtta.",
|
||||
},
|
||||
table: {
|
||||
name: "Nimi",
|
||||
key: "API võti",
|
||||
by: "Loonud",
|
||||
created: "Loodud",
|
||||
@@ -1095,9 +1510,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1136,20 +1548,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -408,6 +408,304 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "اتصالدهنده برای GMail",
|
||||
description:
|
||||
"به اپراتور خود اجازه دهید تا با Gmail تعامل داشته باشد: جستجو در ایمیلها، خواندن موضوعات، نوشتن پیشنویسها، ارسال ایمیلها و مدیریت صندوق ورودی. برای اطلاعات بیشتر، مستندات را مطالعه کنید.",
|
||||
multiUserWarning:
|
||||
"ادغام با جیمیل در حالت چند کاربر به دلیل مسائل امنیتی، امکانپذیر نیست. لطفاً حالت چند کاربر را غیرفعال کنید تا از این ویژگی استفاده کنید.",
|
||||
configuration: "تنظیمات جیمیل",
|
||||
deploymentId: "شناسه استقرار",
|
||||
deploymentIdHelp: "شناسه (ID) مربوط به اجرای اسکریپت وب در Google Apps",
|
||||
apiKey: "کلید API",
|
||||
apiKeyHelp:
|
||||
"کلید API که در فرایند استقرار اسکریپتهای Google Apps خود تنظیم کردهاید.",
|
||||
configurationRequired:
|
||||
"لطفاً شناسه استقرار و کلید API را تنظیم کنید تا قابلیتهای Gmail فعال شوند.",
|
||||
configured: "تنظیم شده",
|
||||
searchSkills: "مهارتهای جستجو...",
|
||||
noSkillsFound: "هیچ یک از مهارتهای موجود با جستجوی شما مطابقت ندارند.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "جستجو و خواندن ایمیلها",
|
||||
description: "جستجو و خواندن ایمیلها از صندوق ورودی Gmail خود",
|
||||
},
|
||||
drafts: {
|
||||
title: "پیشنویس ایمیلها",
|
||||
description: "ایجاد، ویرایش و مدیریت پیشنویسهای ایمیل",
|
||||
},
|
||||
send: {
|
||||
title: "ارسال و پاسخ به ایمیلها",
|
||||
description: "ایمیلها را ارسال و به فوریت به موضوعات پاسخ دهید.",
|
||||
},
|
||||
threads: {
|
||||
title: "مدیریت موضوعات ایمیل",
|
||||
description:
|
||||
"مدیریت تر وهای ایمیل - علامتگذاری به عنوان خوانده/خوانده نشده، آرشیو، حذف",
|
||||
},
|
||||
account: {
|
||||
title: "آمار ادغام",
|
||||
description: "دسترسی به آمار صندوق ایمیل و اطلاعات حساب",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "جستجو در ایمیلها",
|
||||
description: "جستجو در ایمیلها با استفاده از سینتکس کوئری Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "خواندن موضوع",
|
||||
description: "خواندن کل یک رشته ایمیل بر اساس شناسه (ID)",
|
||||
},
|
||||
createDraft: {
|
||||
title: "ایجاد پیشنویس",
|
||||
description: "یک پیشنویس ایمیل جدید ایجاد کنید.",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "ایجاد پاسخ پیشنویس",
|
||||
description: "یک پیشنویس برای پاسخ به یک موضوع موجود ایجاد کنید.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "نسخه اصلاحشده",
|
||||
description: "بهروزرسانی یک نسخه پیشنویس ایمیل موجود",
|
||||
},
|
||||
getDraft: {
|
||||
title: "دریافت نسخه پیشنویس",
|
||||
description: "بازیابی یک نسخه خاص بر اساس شناسه",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "فهرست پیشنویسها",
|
||||
description: "لیست تمام ایمیلهای پیشنویس",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "حذف پیشنویس",
|
||||
description: "حذف یک پیشنویس ایمیل",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "ارسال پیشنویس",
|
||||
description: "ارسال یک نسخه پیشنویس از ایمیل موجود",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "ارسال ایمیل",
|
||||
description: "بلافاصله یک ایمیل ارسال کنید.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "پاسخ به موضوع",
|
||||
description: "پاسخ فوری به یک رشته ایمیل",
|
||||
},
|
||||
markRead: {
|
||||
title: "مارک ریڈ",
|
||||
description: 'یک موضوع را به عنوان "خوانده شده" علامتگذاری کنید.',
|
||||
},
|
||||
markUnread: {
|
||||
title: 'به عنوان "غیر خوانده شده" علامت بزنید',
|
||||
description:
|
||||
'یک موضوع را به عنوان "غیرخوانده شده" علامتگذاری کنید.',
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "به سطل زباله بفرستید",
|
||||
description: "یک موضوع را به سطل زباله منتقل کنید.",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "آرشیو",
|
||||
description: "فایل آرشیو کردن یک موضوع",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "انتقال به پوشه ورودی",
|
||||
description: "یک موضوع را به صندوق ورودی منتقل کنید.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "آمار صندوق ایمیل",
|
||||
description:
|
||||
"تعداد ایمیلهای دریافتی و آمار صندوق ایمیل را دریافت کنید.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "دسترسی به صندوق ورودی",
|
||||
description:
|
||||
"یک راه ساده برای دریافت ایمیلهای صندوق ورودی از جیمیل",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "اتصال دهنده Outlook",
|
||||
description:
|
||||
"به اپراتور خود اجازه دهید تا با استفاده از Microsoft Outlook ارتباط برقرار کند: جستجو در ایمیلها، خواندن موضوعات، نوشتن پیشنویسها، ارسال ایمیلها و مدیریت صندوق ورودی خود از طریق Microsoft Graph API. برای اطلاعات بیشتر، مستندات را مطالعه کنید.",
|
||||
multiUserWarning:
|
||||
"ادغام با Outlook در حالت چند کاربر به دلایل امنیتی در دسترس نیست. لطفاً حالت چند کاربر را غیرفعال کنید تا از این ویژگی استفاده کنید.",
|
||||
configuration: "تنظیمات Outlook",
|
||||
authType: "نوع حساب",
|
||||
authTypeHelp:
|
||||
'انتخاب کنید که کدام نوع از حسابهای مایکروسافت قابلیت احراز هویت را دارند. گزینه "همه حسابها" از هر دو نوع حساب شخصی و کاری/تحصیلی پشتیبانی میکند. گزینه "فقط حسابهای شخصی" محدود به حسابهای مایکروسافت شخصی است. گزینه "فقط حسابهای کاری/تحصیلی" محدود به حسابهای کاری/تحصیلی از یکテナنت خاص از Azure AD است.',
|
||||
authTypeCommon: "تمام حسابها (شخصی و مربوط به کار/مدرسه)",
|
||||
authTypeConsumers: "فقط حسابهای شخصی مایکروسافت",
|
||||
authTypeOrganization: "فقط حسابهای سازمانی (نیاز به شناسه مستاجر)",
|
||||
clientId: "شناسه کاربر (درخواست)",
|
||||
clientIdHelp: "شناسه برنامه (کاربر) از ثبتنام برنامه در Azure AD",
|
||||
tenantId: "شناسه (مستأجر)",
|
||||
tenantIdHelp:
|
||||
"شناسه (کاربر) از دایرکتوری (Azure AD) که در هنگام ثبتنام برنامه شما در Azure AD دریافت کردهاید. این شناسه فقط برای احراز هویت در سطح سازمان مورد نیاز است.",
|
||||
clientSecret: "کلید خصوصی",
|
||||
clientSecretHelp: "مقدار کلیدی مشتری از ثبتنام برنامه شما در Azure AD",
|
||||
configurationRequired:
|
||||
"لطفاً شناسه و کلید مخفی (Client ID و Client Secret) را تنظیم کنید تا قابلیتهای Outlook فعال شوند.",
|
||||
authRequired:
|
||||
"ابتدا اطلاعات خود را ذخیره کنید، سپس برای تکمیل فرآیند، با مایکروسافت احراز هویت کنید.",
|
||||
authenticateWithMicrosoft: "احراز هویت با مایکروسافت",
|
||||
authenticated: "با موفقیت با Microsoft Outlook احراز هویت شد.",
|
||||
revokeAccess: "لغو دسترسی",
|
||||
configured: "تنظیمشده",
|
||||
searchSkills: "مهارتهای جستجو...",
|
||||
noSkillsFound: "هیچ یک از مهارتهای موجود با جستجوی شما مطابقت ندارند.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "جستجو و خواندن ایمیلها",
|
||||
description: "جستجو و خواندن ایمیلها از صندوق ورودی Outlook",
|
||||
},
|
||||
drafts: {
|
||||
title: "پیشنویس ایمیلها",
|
||||
description: "ایجاد، ویرایش و مدیریت پیشنویسهای ایمیل",
|
||||
},
|
||||
send: {
|
||||
title: "ارسال ایمیل",
|
||||
description:
|
||||
"ایمیلهای جدید را ارسال کنید یا بلافاصله به پیامها پاسخ دهید.",
|
||||
},
|
||||
account: {
|
||||
title: "آمار ادغام",
|
||||
description: "مشاهده آمار صندوق ایمیل و اطلاعات حساب",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "دسترسی به صندوق ورودی ایمیل",
|
||||
description:
|
||||
"آخرین ایمیلهای خود را از صندوق ورودی Outlook دریافت کنید.",
|
||||
},
|
||||
search: {
|
||||
title: "جستجو در ایمیلها",
|
||||
description:
|
||||
"جستجوی ایمیلها با استفاده از دستورالعملهای جستجوی مایکروسافت",
|
||||
},
|
||||
readThread: {
|
||||
title: "خواندن مکالمه",
|
||||
description: "خواندن کل یک مجموعه پیامهای ایمیلی",
|
||||
},
|
||||
createDraft: {
|
||||
title: "ایجاد پیشنویس",
|
||||
description:
|
||||
"یک پیشنویس ایمیل جدید ایجاد کنید یا یک پاسخ پیشنویس برای یک پیام موجود تهیه کنید.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "نسخه جدید",
|
||||
description: "بهروزرسانی یک ایمیل پیشنویس موجود",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "فهرست پیشنویسها",
|
||||
description: "لیستی از تمام ایمیلهای پیشنویس تهیه کنید.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "حذف پیشنویس",
|
||||
description: "حذف یک پیشنویس ایمیل",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "ارسال پیشنویس",
|
||||
description: "یک پیشنویس ایمیل موجود را ارسال کنید.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "ارسال ایمیل",
|
||||
description:
|
||||
"یک ایمیل جدید ارسال کنید یا بلافاصله به یک پیام موجود پاسخ دهید.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "آمار صندوق ایمیل",
|
||||
description:
|
||||
"تعداد پوشهها و آمار صندوقهای ایمیل را به دست آورید.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "اتصالدهنده گوگل کالند",
|
||||
description:
|
||||
"به اپراتور خود اجازه دهید تا با گوگل کالند تعامل داشته باشد: مشاهده تقویمها، دریافت رویدادها، ایجاد و بهروزرسانی رویدادها، و مدیریت پاسخهای حضور و غیاب. برای اطلاعات بیشتر، به مستندات مراجعه کنید.",
|
||||
multiUserWarning:
|
||||
"ادغام با تقویم گوگل در حالت چند کاربر، به دلایل امنیتی، در دسترس نیست. لطفاً حالت چند کاربر را غیرفعال کنید تا از این قابلیت استفاده کنید.",
|
||||
configuration: "تنظیمات تقویم گوگل",
|
||||
deploymentId: "شناسه استقرار",
|
||||
deploymentIdHelp:
|
||||
"شناسه استقرار (Deployment ID) از برنامه وب Google Apps Script شما",
|
||||
apiKey: "کلید API",
|
||||
apiKeyHelp:
|
||||
"کلید API که در تنظیمات اسکریپتهای گوگل خود مشخص کردهاید.",
|
||||
configurationRequired:
|
||||
"لطفاً شناسه استقرار و کلید API را تنظیم کنید تا قابلیتهای گوگل کالدِر فعال شوند.",
|
||||
configured: "تنظیم شده",
|
||||
searchSkills: "مهارتهای جستجو...",
|
||||
noSkillsFound: "هیچ یک از مهارتهای موجود با جستجوی شما مطابقت ندارند.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "تقویمها",
|
||||
description: "مشاهده و مدیریت تقویمهای گوگل خود",
|
||||
},
|
||||
readEvents: {
|
||||
title: "برنامهها",
|
||||
description: "مشاهده و جستجو در رویدادهای تقویم",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "ایجاد و بهروزرسانی رویدادها",
|
||||
description: "ایجاد رویدادهای جدید و تغییر دادن رویدادهای موجود",
|
||||
},
|
||||
rsvp: {
|
||||
title: "مدیریت پاسخهای دعوت",
|
||||
description: "وضعیت پاسخ خود را برای رویدادها تعیین کنید.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "لیست تقویمها",
|
||||
description:
|
||||
"لیستی از تمام تقویمهایی که مالک آن هستید یا به آنها مشترک هستید، تهیه کنید.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "جزئیات تقویم را دریافت کنید",
|
||||
description: "اطلاعات دقیقی در مورد یک تقویم خاص به دست آورید.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "اطلاعات مربوط به رویداد",
|
||||
description: "اطلاعات دقیقی درباره یک رویداد خاص به دست آورید.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "اطلاعات رویدادهای روز",
|
||||
description:
|
||||
"اطلاعات مربوط به تمام رویدادهایی که در یک تاریخ خاص برنامهریزی شدهاند را دریافت کنید.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "نمایش رویدادها (محدوده تاریخ)",
|
||||
description: "به دست آوردن رویدادهایی در یک بازه زمانی سفارشی",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "برنامههای آتی را مشاهده کنید",
|
||||
description:
|
||||
"برای یافتن رویدادهای امروز، این هفته یا این ماه، از کلمات کلیدی ساده استفاده کنید.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "اضافه کردن سریع رویداد",
|
||||
description:
|
||||
'ایجاد یک رویداد بر اساس زبان طبیعی (به عنوان مثال، "جلسه فردا در ساعت 3 بعد از ظهر")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "ایجاد رویداد",
|
||||
description: "ایجاد یک رویداد جدید با کنترل کامل بر تمام ویژگیها",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "اعلام تغییرات",
|
||||
description: "بهروزرسانی یک رویداد موجود در تقویم",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "وضعیت پاسخگویی را تعیین کنید",
|
||||
description: "قبول، رد یا پذیرش موقت یک رویداد",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "سرورهای MCP",
|
||||
@@ -454,6 +752,93 @@ 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 با استفاده از قالببندی و استایلهای ساده",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -476,7 +861,34 @@ const TRANSLATIONS = {
|
||||
"کلیدهای API به دارنده آنها اجازه میدهند به صورت برنامهنویسی به این نمونه AnythingLLM دسترسی داشته و آن را مدیریت کنند.",
|
||||
link: "مطالعه مستندات API",
|
||||
generate: "ایجاد کلید API جدید",
|
||||
empty: "هیچ کلید API یافت نشد",
|
||||
actions: "اقدامات",
|
||||
messages: {
|
||||
error: "خطا: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "ایجاد کلید API جدید",
|
||||
cancel: "لغو",
|
||||
close: "بستن",
|
||||
create: "ایجاد کلید API",
|
||||
helper:
|
||||
"پس از ایجاد، میتوان از این کلید API برای دسترسی و پیکربندی برنامهنویسیشده این نمونه AnythingLLM استفاده کرد.",
|
||||
name: {
|
||||
label: "نام",
|
||||
placeholder: "یکپارچهسازی تولید",
|
||||
helper:
|
||||
"اختیاری است. از یک نام قابلفهم استفاده کنید تا بعداً بتوانید این کلید را تشخیص دهید.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "کپی کلید API",
|
||||
copied: "کپی شد",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"آیا مطمئن هستید که میخواهید این کلید API را غیرفعال کنید؟\nپس از این کار، دیگر قابل استفاده نخواهد بود.\n\nاین عمل غیرقابل بازگشت است.",
|
||||
},
|
||||
table: {
|
||||
name: "نام",
|
||||
key: "کلید API",
|
||||
by: "ایجاد شده توسط",
|
||||
created: "تاریخ ایجاد",
|
||||
@@ -1130,9 +1542,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"توکن API را که از @BotFather دریافت کردهاید، کپی کنید و یک فضای کاری پیشفرض را برای ربات خود انتخاب کنید تا بتواند با کاربران ارتباط برقرار کند.",
|
||||
"bot-token": "توکن ربات",
|
||||
"default-workspace": "فضای کاری پیشفرض",
|
||||
"no-workspace":
|
||||
"فضاهای کاری موجود نیست. یک فضای کاری جدید ایجاد خواهد شد.",
|
||||
connecting: "در حال اتصال...",
|
||||
"connect-bot": "اتصال ربات",
|
||||
},
|
||||
@@ -1172,19 +1581,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "امکان لغو کردن حساب کاربری وجود نداشت.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "منتظر تایید",
|
||||
"pending-description":
|
||||
"کاربرانی که منتظر تایید هستند. کد تطبیقی که در اینجا نشان داده شده را با کد موجود در چت تلگرام خود مطابقت دهید.",
|
||||
"approved-title": "کاربران تایید شده",
|
||||
"approved-description": "کاربرانی که مجوز دارند با ربات شما گفتگو کنند.",
|
||||
user: "کاربر",
|
||||
"pairing-code": "کد جفتسازی",
|
||||
"no-pending": "هیچ درخواست در حال انجام وجود ندارد.",
|
||||
"no-approved": "کاربران تایید شده وجود ندارد",
|
||||
unknown: "نامشخص",
|
||||
approve: "تایید",
|
||||
deny: "رد",
|
||||
revoke: "اعلام لغو",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -413,6 +413,327 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Connecteur GMail",
|
||||
description:
|
||||
"Permettez à votre agent d'interagir avec Gmail : rechercher des e-mails, lire les conversations, rédiger des brouillons, envoyer des e-mails et gérer votre boîte de réception. <a>Consultez la documentation</a>.",
|
||||
multiUserWarning:
|
||||
"L'intégration avec Gmail n'est pas disponible en mode multi-utilisateurs pour des raisons de sécurité. Veuillez désactiver le mode multi-utilisateurs pour utiliser cette fonctionnalité.",
|
||||
configuration: "Configuration de Gmail",
|
||||
deploymentId: "Identifiant de déploiement",
|
||||
deploymentIdHelp:
|
||||
"L'identifiant de déploiement de votre application web Google Apps Script",
|
||||
apiKey: "Clé API",
|
||||
apiKeyHelp:
|
||||
"La clé API que vous avez configurée lors de votre déploiement de Google Apps Script",
|
||||
configurationRequired:
|
||||
"Veuillez configurer l'ID de déploiement et la clé API pour activer les fonctionnalités de Gmail.",
|
||||
configured: "Configuré",
|
||||
searchSkills: "Compétences de recherche...",
|
||||
noSkillsFound: "Aucune compétence ne correspond à votre recherche.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Rechercher et lire des e-mails",
|
||||
description:
|
||||
"Recherchez et lisez vos e-mails dans votre boîte de réception Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Modèles de courriels",
|
||||
description: "Créer, modifier et gérer des brouillons d'e-mails.",
|
||||
},
|
||||
send: {
|
||||
title: "Envoyer et répondre aux e-mails",
|
||||
description:
|
||||
"Envoyez des e-mails et répondez immédiatement aux discussions.",
|
||||
},
|
||||
threads: {
|
||||
title: "Gérer les conversations par e-mail",
|
||||
description:
|
||||
"Gérer les conversations par e-mail : marquer comme lu/non lu, archiver, supprimer",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiques d'intégration",
|
||||
description:
|
||||
"Consultez les statistiques de votre boîte de réception et les informations de votre compte.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Rechercher dans les e-mails",
|
||||
description:
|
||||
"Rechercher des e-mails en utilisant la syntaxe de recherche de Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "Lire le fil de discussion",
|
||||
description: "Lire l'intégralité d'une conversation par ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Créer une version préliminaire",
|
||||
description: "Créez une nouvelle version de l'e-mail.",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Créer une réponse brouillon",
|
||||
description:
|
||||
"Rédiger une réponse préliminaire à un fil de discussion existant.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Mise à jour de la version préliminaire",
|
||||
description: "Mettre à jour un brouillon de courriel existant",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Obtenir la version préliminaire",
|
||||
description:
|
||||
"Récupérer une version spécifique par son identifiant.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Propositions/Brouillons",
|
||||
description: "Énumérer tous les courriels en brouillon.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Supprimer la version brouillon",
|
||||
description: "Supprimer une brouillon de courriel",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Envoyer une version préliminaire",
|
||||
description: "Envoyer une version existante d'un courriel",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Envoyer un e-mail",
|
||||
description: "Envoyez un courriel immédiatement.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Répondre à la discussion",
|
||||
description:
|
||||
"Répondre immédiatement à une conversation par e-mail.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Indiquer qu'un fil de discussion a été lu",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Signaler comme non lu",
|
||||
description: "Indiquer qu'un fil de discussion est non lu",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Envoyer à la poubelle",
|
||||
description: "Déplacer un fil dans la corbeille d'ordures",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archives",
|
||||
description: "Archiver une discussion",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Envoyer vers la boîte de réception",
|
||||
description:
|
||||
"Déplacer un fil de discussion dans la boîte de réception",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiques de la boîte de réception",
|
||||
description:
|
||||
"Obtenez le nombre d'emails non lus et les statistiques de votre boîte de réception.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Accéder à la boîte de réception",
|
||||
description:
|
||||
"Une méthode simple et efficace pour récupérer les e-mails de votre boîte de réception Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Connecteur Outlook",
|
||||
description:
|
||||
"Permettez à votre agent d'interagir avec Microsoft Outlook : rechercher des e-mails, lire les fils de discussion, rédiger des brouillons, envoyer des e-mails et gérer votre boîte de réception via l'API Microsoft Graph. <a>Consultez la documentation</a>.",
|
||||
multiUserWarning:
|
||||
"L'intégration avec Outlook n'est pas disponible en mode multi-utilisateurs pour des raisons de sécurité. Veuillez désactiver le mode multi-utilisateurs afin d'utiliser cette fonctionnalité.",
|
||||
configuration: "Configuration de Outlook",
|
||||
authType: "Type de compte",
|
||||
authTypeHelp:
|
||||
"Choisissez quels types de comptes Microsoft peuvent être utilisés pour l'authentification. « Tous les comptes » prend en charge à la fois les comptes personnels et les comptes professionnels/scolaires. « Seulement les comptes personnels » limite l'utilisation aux comptes Microsoft personnels. « Seulement les comptes professionnels/scolaires » limite l'utilisation aux comptes provenant d'un tenant Azure AD spécifique.",
|
||||
authTypeCommon:
|
||||
"Tous les comptes (personnels et professionnels/scolaires)",
|
||||
authTypeConsumers: "Seuls les comptes Microsoft personnels",
|
||||
authTypeOrganization:
|
||||
"Comptes d'organisations uniquement (nécessite l'identifiant du locataire)",
|
||||
clientId: "Identifiant (Client)",
|
||||
clientIdHelp:
|
||||
"L'identifiant de l'application (client) provenant de votre enregistrement d'application dans Azure AD.",
|
||||
tenantId: "Identifiant (locataire)",
|
||||
tenantIdHelp:
|
||||
"L'ID du répertoire (utilisateur) provenant de votre inscription d'application dans Azure AD. Nécessaire uniquement pour l'authentification au sein d'une seule organisation.",
|
||||
clientSecret: "Clé secrète",
|
||||
clientSecretHelp:
|
||||
"La valeur secrète du client provenant de l'enregistrement de votre application Azure AD.",
|
||||
configurationRequired:
|
||||
"Veuillez configurer l'ID client et le secret client afin d'activer les fonctionnalités Outlook.",
|
||||
authRequired:
|
||||
"Enregistrez d'abord vos informations d'identification, puis authentifiez-vous auprès de Microsoft pour finaliser la configuration.",
|
||||
authenticateWithMicrosoft: "S'authentifier auprès de Microsoft",
|
||||
authenticated: "Connexion réussie avec Microsoft Outlook.",
|
||||
revokeAccess: "Retirer l'accès",
|
||||
configured: "Configuré",
|
||||
searchSkills: "Compétences de recherche...",
|
||||
noSkillsFound: "Aucun résultat correspondant à votre recherche.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Rechercher et lire des e-mails",
|
||||
description:
|
||||
"Recherchez et lisez vos e-mails dans votre boîte de réception Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Modèles de courriels",
|
||||
description:
|
||||
"Créer, modifier et gérer des brouillons de courriels.",
|
||||
},
|
||||
send: {
|
||||
title: "Envoyer des e-mails",
|
||||
description:
|
||||
"Envoyer de nouveaux courriels ou répondre immédiatement aux messages.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiques d'intégration",
|
||||
description:
|
||||
"Consultez les statistiques de votre boîte de réception et les informations de votre compte.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Accéder à la boîte de réception",
|
||||
description:
|
||||
"Récupérez les e-mails récents de votre boîte de réception Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Rechercher des e-mails",
|
||||
description:
|
||||
"Recherchez des e-mails à l'aide de la syntaxe de recherche de Microsoft.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Lire la conversation",
|
||||
description: "Lire l'intégralité d'une conversation par e-mail.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Créer une version préliminaire",
|
||||
description:
|
||||
"Créez une nouvelle version d'un courriel ou une réponse à un courriel existant.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Version actuelle",
|
||||
description: "Mettre à jour un brouillon de courriel existant",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Propositions préliminaires",
|
||||
description: "Énumérez tous les courriels en brouillon.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Supprimer la version brouillon",
|
||||
description: "Supprimer une brouillon de courriel",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Envoyer une version préliminaire",
|
||||
description: "Envoyer une version existante d'un e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Envoyer un e-mail",
|
||||
description:
|
||||
"Envoyez un nouvel e-mail ou répondez immédiatement à un message existant.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiques de la boîte de réception",
|
||||
description:
|
||||
"Obtenez le nombre de dossiers et les statistiques des boîtes aux lettres.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Connecteur Google Calendar",
|
||||
description:
|
||||
"Permettez à votre agent d'interagir avec Google Calendar : consulter les calendriers, afficher les événements, créer et modifier des événements, et gérer les confirmations de présence. <a>Consultez la documentation</a>.",
|
||||
multiUserWarning:
|
||||
"L'intégration avec Google Calendar n'est pas disponible en mode multi-utilisateurs pour des raisons de sécurité. Veuillez désactiver le mode multi-utilisateurs pour utiliser cette fonctionnalité.",
|
||||
configuration: "Configuration de Google Calendar",
|
||||
deploymentId: "ID de déploiement",
|
||||
deploymentIdHelp:
|
||||
"L'identifiant de déploiement de votre application web Google Apps Script",
|
||||
apiKey: "Clé API",
|
||||
apiKeyHelp:
|
||||
"La clé API que vous avez configurée dans votre déploiement de Google Apps Script",
|
||||
configurationRequired:
|
||||
"Veuillez configurer l'ID de déploiement et la clé API pour activer les fonctionnalités Google Calendar.",
|
||||
configured: "Configuré",
|
||||
searchSkills: "Compétences de recherche...",
|
||||
noSkillsFound: "Aucun résultat correspondant à votre recherche.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendriers",
|
||||
description: "Visualisez et gérez vos calendriers Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Lire les événements",
|
||||
description:
|
||||
"Visualiser et rechercher les événements du calendrier",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Créer et mettre à jour des événements",
|
||||
description:
|
||||
"Créer de nouveaux événements et modifier les événements existants.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Gestion des réponses",
|
||||
description: "Gérez votre statut de réponse pour les événements.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Calendriers",
|
||||
description:
|
||||
"Énumérez tous les calendriers que vous possédez ou auxquels vous êtes abonné.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Obtenir les détails du calendrier",
|
||||
description:
|
||||
"Obtenez des informations détaillées sur un calendrier spécifique.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Obtenir l'événement",
|
||||
description:
|
||||
"Obtenez des informations détaillées sur un événement spécifique.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Obtenir les événements pour la journée",
|
||||
description:
|
||||
"Consultez tous les événements prévus pour une date spécifique.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Événements (période)",
|
||||
description:
|
||||
"Récupérer des événements dans une plage de dates personnalisée",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Consulter les événements à venir",
|
||||
description:
|
||||
"Trouvez des événements pour aujourd'hui, cette semaine ou ce mois en utilisant des mots-clés simples.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Ajouter un événement rapidement",
|
||||
description:
|
||||
"Créer un événement à partir d'une description en langage naturel (par exemple, « Réunion demain à 15h »)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Créer un événement",
|
||||
description:
|
||||
"Créez un nouvel événement avec un contrôle total sur toutes les propriétés.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Mise à jour de l'événement",
|
||||
description:
|
||||
"Mettre à jour un événement existant dans le calendrier",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Définir le statut de réponse",
|
||||
description:
|
||||
"Accepter, refuser ou accepter provisoirement un événement.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Serveurs MCP",
|
||||
@@ -460,6 +781,97 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -482,7 +894,34 @@ const TRANSLATIONS = {
|
||||
"Les clés API permettent au titulaire d'accéder et de gérer de manière programmatique cette instance AnythingLLM.",
|
||||
link: "Lisez la documentation de l'API",
|
||||
generate: "Générer une nouvelle clé API",
|
||||
empty: "Aucune clé API trouvée",
|
||||
actions: "Actions",
|
||||
messages: {
|
||||
error: "Erreur : {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Créer une nouvelle clé API",
|
||||
cancel: "Annuler",
|
||||
close: "Fermer",
|
||||
create: "Créer une clé API",
|
||||
helper:
|
||||
"Une fois créée, la clé API peut être utilisée pour accéder à cette instance AnythingLLM et la configurer de manière programmatique.",
|
||||
name: {
|
||||
label: "Nom",
|
||||
placeholder: "Intégration de production",
|
||||
helper:
|
||||
"Facultatif. Utilisez un nom explicite pour pouvoir retrouver facilement cette clé plus tard.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copier la clé API",
|
||||
copied: "Copiée",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Voulez-vous vraiment désactiver cette clé API ?\nAprès cela, elle ne pourra plus être utilisée.\n\nCette action est irréversible.",
|
||||
},
|
||||
table: {
|
||||
name: "Nom",
|
||||
key: "Clé API",
|
||||
by: "Créé par",
|
||||
created: "Créé",
|
||||
@@ -1139,9 +1578,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1182,20 +1618,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -405,6 +405,295 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "חיבור ל-GMail",
|
||||
description:
|
||||
'אפשר לאгент שלכם לתקשר עם Gmail – לחפש הודעות דוא"ל, לקרוא דיונים, ליצור טיוטות, לשלוח הודעות דוא"ל ולנהל תיבת הדואר. <a>קרא את התיעוד</a>.',
|
||||
multiUserWarning:
|
||||
"שילוב עם ג'ימל אינו זמין במצב רב משתמשים מטעמי אבטחה. אנא כבו את מצב רב משתמשים כדי להשתמש בתכונה זו.",
|
||||
configuration: "הגדרת חשבון Gmail",
|
||||
deploymentId: "מזהה הפריסה",
|
||||
deploymentIdHelp: "מזהה הפריסה מהאפליקציה שלך של Google Apps Script.",
|
||||
apiKey: "מפתח API",
|
||||
apiKeyHelp:
|
||||
"מפתח ה-API שבה הגדרת בסביבת העבודה של Google Apps Script שלך.",
|
||||
configurationRequired:
|
||||
"אנא הגדירו את מזהה ההפצה ואת מפתח ה-API כדי לאפשר את יכולות Gmail.",
|
||||
configured: "הוגדר",
|
||||
searchSkills: "כישורים לחיפוש...",
|
||||
noSkillsFound: "לא נמצאו תוצאות התואמות את החיפוש שלך.",
|
||||
categories: {
|
||||
search: {
|
||||
title: 'חיפוש וקריאת הודעות דוא"ל',
|
||||
description: 'חפש וקרא הודעות דוא"ל מהתיבת הדוא"ל של ג\'ימל שלך.',
|
||||
},
|
||||
drafts: {
|
||||
title: 'הודעות דוא"ל לדוגמה',
|
||||
description: 'יצירה, עריכה וניהול של טיוטות של הודעות דוא"ל.',
|
||||
},
|
||||
send: {
|
||||
title: "שליחה ומתן מענה למיילים",
|
||||
description: "שלחו מיילים ונענו לדיונים באופן מיידי.",
|
||||
},
|
||||
threads: {
|
||||
title: 'ניהול שרשראות דוא"ל',
|
||||
description:
|
||||
'ניהול תכתובות דוא"ל – סימון כ"קרא/לא קרא", ארכיון, תיבת זבל',
|
||||
},
|
||||
account: {
|
||||
title: "נתונים על שילוב",
|
||||
description: "צפו בסטטיסטיקות של תיבת הדואר ובתמונות החשבון",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: 'חיפוש הודעות דוא"ל',
|
||||
description: "חיפוש הודעות דוא\"ל באמצעות תחביר שאילתות של ג'ימייל",
|
||||
},
|
||||
readThread: {
|
||||
title: "קרא את השרשור",
|
||||
description: "קרא את כל שרשרת האימיילים שנוצרה על ידי ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "יצירת טיוטה",
|
||||
description: "צור טיוטת אימייל חדשה",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "יצירת תגובה ראשונית",
|
||||
description: "צור תגובה ראשונית לפורום קיים.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "גרסה עדכנית",
|
||||
description: 'עדכן הודעת דוא"ל קיימת',
|
||||
},
|
||||
getDraft: {
|
||||
title: "קבל טיוטה",
|
||||
description: "השגת גרסה ספציפית לפי מספר זיהוי",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "גרסאות טיוטה",
|
||||
description: "רשום את כל ההודעות המאובזרות",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "מחיקת טיוטה",
|
||||
description: "מחיקת תגובה מקושטת",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "שלח טיוטה",
|
||||
description: "שלח גרסה קיימת של מייל",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "שלח אימייל",
|
||||
description: "שלח מייל באופן מיידי",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "תגובה לדיון",
|
||||
description: "התגובה מיידית לשרשור אימיילים",
|
||||
},
|
||||
markRead: {
|
||||
title: "מרק רד",
|
||||
description: 'סמנו נושא כ"קרא"',
|
||||
},
|
||||
markUnread: {
|
||||
title: "סמן כלא קרא",
|
||||
description: "סמנו נושא כלא קרא",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "העבר למיחזור",
|
||||
description: "העברת נושא לקבצי האשפה",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "ארכיון",
|
||||
description: "שמור את הדיון",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "העבר לסמאר",
|
||||
description: "העבר את הדיון לתיבת הדואר הנכנס",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "סטטיסטיקות של תיבת דואר",
|
||||
description:
|
||||
"קבל ספירה של הודעות שטרם נקראו וסטטיסטיקות של תיבת הדואר.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "קבל תיבת הדואר",
|
||||
description:
|
||||
'דרך פשוטה ומהירה לקבל את הודעות הדוא"ל מהתיבת הדוא"ל של ג\'ימל',
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "חיבור ל-Outlook",
|
||||
description:
|
||||
'אפשר לאגנט שלכם לתקשר עם Microsoft Outlook – לחפש הודעות דוא"ל, לקרוא דיונים, ליצור טיוטות, לשלוח הודעות דוא"ל ולנהל תיבת הדואר שלכם באמצעות Microsoft Graph API. <a>קראו את התיעוד</a>.',
|
||||
multiUserWarning:
|
||||
"שילוב עם Outlook אינו זמין במצב רב-משתמשים מטעמי אבטחה. אנא בטל את מצב רב-משתמשים כדי להשתמש בתכונה זו.",
|
||||
configuration: "הגדרת תצורה (Outlook)",
|
||||
authType: "סוג חשבון",
|
||||
authTypeHelp:
|
||||
'בחר איזה סוגי חשבונות מיקרוסופט יכולים לאמת. "כל החשבונות" תומך הן בחשבונות אישיים והן בחשבונות עבודה/לימודים. "רק חשבונות אישיים" מגביל את השימוש לחשבונות מיקרוסופט אישיים בלבד. "רק חשבונות ארגוניים" מגביל את השימוש לחשבונות עבודה/לימודים מחשבון Azure AD ספציפי.',
|
||||
authTypeCommon: "כל החשבונות (אישיים וקשורים לעבודה/לימודים)",
|
||||
authTypeConsumers: "חשבונות אישיים של מיקרוסופט בלבד",
|
||||
authTypeOrganization: "חשבונות רק עבור ארגונים (דורש מזהה שוכר)",
|
||||
clientId: "מספר זיהוי של לקוח (יישום)",
|
||||
clientIdHelp: "מזהה היישום (לקוח) מההרשמה של היישום שלך ב-Azure AD",
|
||||
tenantId: "מספר מזהה (שוכר)",
|
||||
tenantIdHelp:
|
||||
"מזהה ה-ID של הלקוח (שוכר) מההרשמה של היישום שלך ב-Azure AD. נדרש רק לאימות מתוך הארגון בלבד.",
|
||||
clientSecret: "סוד לקוח",
|
||||
clientSecretHelp:
|
||||
"הערך הסודי של הלקוח מההרשמה של היישום שלך ב-Azure AD",
|
||||
configurationRequired:
|
||||
"אנא הגדירו את מזהה הלקוח והסיסמה כדי לאפשר את יכולות Outlook.",
|
||||
authRequired:
|
||||
"שמרו את הפרטים שלכם תחילה, ולאחר מכן השתמשו באימות של מיקרוסופט כדי להשלים את ההגדרה.",
|
||||
authenticateWithMicrosoft: "אימות באמצעות מיקרוסופט",
|
||||
authenticated: "התחברות מוצלחת עם Microsoft Outlook.",
|
||||
revokeAccess: "ביטול גישה",
|
||||
configured: "מוגדר",
|
||||
searchSkills: "כישורים במחקר...",
|
||||
noSkillsFound: "אין התאמות לחיפוש שלך.",
|
||||
categories: {
|
||||
search: {
|
||||
title: 'חיפוש וקריאת הודעות דוא"ל',
|
||||
description: 'חפש וקרא הודעות דוא"ל מהתיבת הדוא"ל של Outlook שלך.',
|
||||
},
|
||||
drafts: {
|
||||
title: 'הודעות דוא"ל לדוגמה',
|
||||
description: 'יצירה, עריכה וניהול של טיוטות של הודעות דוא"ל',
|
||||
},
|
||||
send: {
|
||||
title: 'שלח הודעות דוא"ל',
|
||||
description: "שלחו מיילים חדשים או הגיבו למיילים באופן מיידי.",
|
||||
},
|
||||
account: {
|
||||
title: "נתוני אינטגרציה",
|
||||
description: "צפו בסטטיסטיקות של תיבת הדואר ובמידע על החשבון.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "קבל תיבת דואר",
|
||||
description: "קבל מיילים חדשים מהתיבת הדואר שלך ב-Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: 'חיפוש הודעות דוא"ל',
|
||||
description: 'חיפוש הודעות דוא"ל באמצעות תחביר החיפוש של Microsoft',
|
||||
},
|
||||
readThread: {
|
||||
title: "קרא שיחה",
|
||||
description: 'קראו את כל רצף ההודעות בדוא"ל.',
|
||||
},
|
||||
createDraft: {
|
||||
title: "יצירת טיוטה",
|
||||
description: "צור טיוטת מייל חדשה או טיוטת תגובה למייל קיים.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "גרסה עדכנית",
|
||||
description: 'עדכן הודעת דוא"ל קיימת',
|
||||
},
|
||||
listDrafts: {
|
||||
title: "גרסאות ראשוניות",
|
||||
description: "רשום את כל ההודעות המיילים המוצעות",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "מחיקת טיוטה",
|
||||
description: "מחיקת טיוטת אימייל",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "שלח טיוטה",
|
||||
description: "שלח גרסה קיימת של מייל",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "שלח מייל",
|
||||
description: "שלח מייל חדש או הגיב למייל קיים באופן מיידי.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "סטטיסטיקות של תיבת דואר",
|
||||
description: "קבל ספירת תיקיות ונתונים סטטיסטיים עבור תיבות דואר.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "חיבור ל-Google Calendar",
|
||||
description:
|
||||
"אפשרו לסוכן שלכם לתקשר עם גוגל קלנדר - לצפות בקלנדרים, לקבל אירועים, ליצור ולעדכן אירועים, ולנהל אישורי השתתפות. <a>קראו את התיעוד</a>.",
|
||||
multiUserWarning:
|
||||
"שילוב עם גוגל קלנדר אינו זמין במצב רב-משתמשים מטעמי אבטחה. אנא כבו את מצב רב-משתמשים כדי להשתמש בתכונה זו.",
|
||||
configuration: "הגדרת גלובל קלנדר",
|
||||
deploymentId: "מזהה הפריסה",
|
||||
deploymentIdHelp: "מזהה הפריסה מהאפליקציה שלך של Google Apps Script",
|
||||
apiKey: "מפתח API",
|
||||
apiKeyHelp:
|
||||
"המפתח של ה-API שקבעת בהגדרות של סקריפט האפליקציות של גוגל.",
|
||||
configurationRequired:
|
||||
"אנא הגדירו את מזהה ההפצה ואת מפתח ה-API כדי לאפשר את הפונקציונליות של גוגל קלנדר.",
|
||||
configured: "מוגדר",
|
||||
searchSkills: "כישורים לחיפוש...",
|
||||
noSkillsFound: "אין התאמות לחיפוש שלך.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "יומני",
|
||||
description: "צפו ונהלו את הלוחות שלכם בגוגל",
|
||||
},
|
||||
readEvents: {
|
||||
title: "קרא על אירועים",
|
||||
description: "צפו וחפשו אירועים בלוח השנה",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "יצירה ועדכון אירועים",
|
||||
description: "ליצור אירועים חדשים ולשנות את האירועים הקיימים.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "ניהול אישורי השתתפות",
|
||||
description: "נהלו את סטטוס התגובה שלכם לאירועים",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "רשימת לוחות",
|
||||
description: "רשום את כל הקלנדרים שבבעלותך או אליהם מנויים.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "קבל פרטים על הקלנדר",
|
||||
description: "קבל מידע מפורט על לוח שנה ספציפי.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "קבל אירוע",
|
||||
description: "קבל מידע מפורט על אירוע ספציפי",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "מצא אירועים ליום",
|
||||
description: "קבלו את כל האירועים המתוכננים לתאריך ספציפי.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "קבל אירועים (טווח תאריכים)",
|
||||
description: "קבל אירועים בטווח תאריכים מותאם אישית",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "רשימת אירועים עתידיים",
|
||||
description:
|
||||
"מצאו אירועים של היום, השבוע או החודש באמצעות מילות מפתח פשוטות.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "הוספה מהירה של אירוע",
|
||||
description:
|
||||
'ליצור אירוע מתוך טקסט טבעי (למשל, "פגישה מחר בשעה 15:00")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "יצירת אירוע",
|
||||
description: "צור אירוע חדש עם שליטה מלאה על כל התכונות.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "עדכון אירוע",
|
||||
description: "עדכן אירוע קיים בלוח השנה",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "הגדר סטטוס אישור השתתפות",
|
||||
description: "לקבל, לדחות, או לקבל באופן זמני אירוע",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "שרתי MCP",
|
||||
@@ -451,6 +740,91 @@ 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 עם עיצוב ועיצוב בסיסיים.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -557,7 +931,33 @@ const TRANSLATIONS = {
|
||||
"מפתחות API מאפשרים למחזיק בהם לגשת ולנהל באופן תכנותי את מופע AnythingLLM זה.",
|
||||
link: "קרא את תיעוד ה-API",
|
||||
generate: "צור מפתח API חדש",
|
||||
empty: "לא נמצאו מפתחות API",
|
||||
actions: "פעולות",
|
||||
messages: {
|
||||
error: "שגיאה: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "יצירת מפתח API חדש",
|
||||
cancel: "ביטול",
|
||||
close: "סגירה",
|
||||
create: "צור מפתח API",
|
||||
helper:
|
||||
"לאחר יצירתו, ניתן להשתמש במפתח ה-API כדי לגשת למופע AnythingLLM זה ולהגדיר אותו באופן תכנותי.",
|
||||
name: {
|
||||
label: "שם",
|
||||
placeholder: "אינטגרציית ייצור",
|
||||
helper: "אופציונלי. השתמש בשם ברור כדי שתוכל לזהות את המפתח הזה בהמשך.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "העתק מפתח API",
|
||||
copied: "הועתק",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"האם אתה בטוח שברצונך להשבית את מפתח ה-API הזה?\nלאחר מכן לא יהיה ניתן להשתמש בו יותר.\n\nלא ניתן לבטל פעולה זו.",
|
||||
},
|
||||
table: {
|
||||
name: "שם",
|
||||
key: "מפתח API",
|
||||
by: "נוצר על ידי",
|
||||
created: "נוצר",
|
||||
@@ -1097,8 +1497,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"הדבק את טוקן ה-API שקיבלת מחשבון @BotFather ובחר את חלל העבודה הראשי עבור הבוט שלך, כדי שיוכל לתקשר.",
|
||||
"bot-token": "טוקן בוט",
|
||||
"default-workspace": "סביבת עבודה ברירת מחדל",
|
||||
"no-workspace": "אין מקומות עבודה זמינים. ייקבע מקום עבודה חדש.",
|
||||
connecting: "חיבור...",
|
||||
"connect-bot": "צ'אטבוט",
|
||||
},
|
||||
@@ -1135,19 +1533,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "לא הצלחתי לבטל את החשבון של המשתמש.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "נמצא בהמתנה לאישור",
|
||||
"pending-description":
|
||||
"משתמשים הממתינים לאישור. יש להתאים את הקוד שמוצג כאן עם הקוד המוצג בשיחה שלהם ב-Telegram.",
|
||||
"approved-title": "משתמשים מורשים",
|
||||
"approved-description": "משתמשים שאושרו לנהל שיחה עם הבוט שלכם.",
|
||||
user: "משתמש",
|
||||
"pairing-code": "קוד התאמה",
|
||||
"no-pending": "אין בקשות בתהליך",
|
||||
"no-approved": "אין משתמשים מורשים",
|
||||
unknown: "לא ידוע",
|
||||
approve: "אישור",
|
||||
deny: "לדחות",
|
||||
revoke: "בטל",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -414,6 +414,324 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Connettore per GMail",
|
||||
description:
|
||||
"Permetti al tuo agente di interagire con Gmail: cercare email, leggere conversazioni, creare bozze, inviare email e gestire la tua casella di posta. <a>Consulta la documentazione</a>.",
|
||||
multiUserWarning:
|
||||
"L'integrazione con Gmail non è disponibile in modalità multi-utente per motivi di sicurezza. Per utilizzare questa funzione, è necessario disattivare la modalità multi-utente.",
|
||||
configuration: "Configurazione di Gmail",
|
||||
deploymentId: "ID di distribuzione",
|
||||
deploymentIdHelp:
|
||||
"L'ID di implementazione della tua applicazione web Google Apps Script",
|
||||
apiKey: "Chiave API",
|
||||
apiKeyHelp:
|
||||
"La chiave API che hai configurato nella tua implementazione di Google Apps Script",
|
||||
configurationRequired:
|
||||
"Si prega di configurare l'ID di distribuzione e la chiave API per abilitare le funzionalità di Gmail.",
|
||||
configured: "Configurato",
|
||||
searchSkills: "Competenze di ricerca...",
|
||||
noSkillsFound:
|
||||
"Non sono state trovate corrispondenze per la tua ricerca.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Cerca e leggi le email",
|
||||
description:
|
||||
"Cerca e leggi le email dalla tua casella di posta Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Bozze di email",
|
||||
description: "Creare, modificare e gestire bozze di email.",
|
||||
},
|
||||
send: {
|
||||
title: "Invia e rispondi alle e-mail",
|
||||
description:
|
||||
"Invia e-mail e rispondi immediatamente ai thread di discussione.",
|
||||
},
|
||||
threads: {
|
||||
title: "Gestire le conversazioni via email",
|
||||
description:
|
||||
"Gestire le conversazioni via email: contrassegnare come lette/non lette, archiviare, eliminare",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiche sull'integrazione",
|
||||
description:
|
||||
"Visualizza le statistiche della casella di posta e le informazioni sull'account.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Cerca email",
|
||||
description:
|
||||
"Cerca email utilizzando la sintassi di ricerca di Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leggi la discussione",
|
||||
description:
|
||||
"Leggi l'intera conversazione via email, ordinata per ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Crea una bozza",
|
||||
description: "Crea una nuova bozza di e-mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Crea una bozza di risposta",
|
||||
description: "Crea una bozza di risposta a un thread esistente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versione aggiornata",
|
||||
description: "Aggiornare una bozza di email esistente",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Visualizza la bozza",
|
||||
description: "Recupera una bozza specifica utilizzando l'ID.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Proposte",
|
||||
description: "Elenca tutte le bozze di email.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Elimina bozza",
|
||||
description: "Elimina una bozza di e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Invia versione bozze",
|
||||
description: "Invia una bozza di email esistente.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Invia e-mail",
|
||||
description: "Invia un'e-mail immediatamente.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Rispondere al thread",
|
||||
description:
|
||||
"Rispondere immediatamente a una conversazione via email.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Segna un thread come letto",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Segna come non letto",
|
||||
description: "Segna un thread come non letto.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Elimina",
|
||||
description: "Sposta un thread nel cestino.",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archivio",
|
||||
description: "Archivia la conversazione",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Sposta nella cartella di posta in arrivo",
|
||||
description:
|
||||
"Sposta la conversazione nella casella di posta in arrivo.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiche della casella di posta elettronica",
|
||||
description:
|
||||
"Ottieni il numero di email non lette e le statistiche della casella di posta.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Accedi alla casella di posta",
|
||||
description:
|
||||
"Un modo semplice ed efficiente per accedere alle email nella casella di posta di Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Connettore Outlook",
|
||||
description:
|
||||
"Permetti al tuo agente di interagire con Microsoft Outlook: ricerca email, leggi conversazioni, crea bozze, invia email e gestisci la tua casella di posta elettronica tramite l'API Microsoft Graph. Consulta la documentazione.",
|
||||
multiUserWarning:
|
||||
"L'integrazione con Outlook non è disponibile in modalità multiutente per motivi di sicurezza. Per utilizzare questa funzione, è necessario disattivare la modalità multiutente.",
|
||||
configuration: "Configurazione di Outlook",
|
||||
authType: "Tipo di account",
|
||||
authTypeHelp:
|
||||
"Seleziona quali tipi di account Microsoft possono essere utilizzati per l'autenticazione. L'opzione \"Tutti gli account\" supporta sia account personali che account di lavoro/scuola. L'opzione \"Solo account personali\" limita l'autenticazione a soli account Microsoft personali. L'opzione \"Solo account di organizzazione\" limita l'autenticazione a soli account di lavoro/scuola appartenenti a un tenant specifico di Azure AD.",
|
||||
authTypeCommon: "Tutti i conti (personali e relativi al lavoro/scuola)",
|
||||
authTypeConsumers: "Solo account Microsoft personali",
|
||||
authTypeOrganization:
|
||||
"Solo account per organizzazioni (richiede l'ID del cliente)",
|
||||
clientId: "ID del cliente (richiesta)",
|
||||
clientIdHelp:
|
||||
"L'ID dell'applicazione (Client ID) dal registro della tua app in Azure AD.",
|
||||
tenantId: "ID del locatore",
|
||||
tenantIdHelp:
|
||||
"L'ID del \"Tenant\" (inquilino) dal registro della tua applicazione Azure AD. È necessario solo per l'autenticazione all'interno di un'organizzazione.",
|
||||
clientSecret: "Chiave segreta del cliente",
|
||||
clientSecretHelp:
|
||||
"Il valore segreto fornito dall'applicazione registrata nel tuo Azure AD",
|
||||
configurationRequired:
|
||||
"Si prega di configurare l'ID del cliente e la chiave segreta per abilitare le funzionalità di Outlook.",
|
||||
authRequired:
|
||||
"Salva prima le tue credenziali, quindi effettua l'autenticazione con Microsoft per completare la configurazione.",
|
||||
authenticateWithMicrosoft: "Autenticarsi con Microsoft",
|
||||
authenticated: "Autenticazione riuscita con Microsoft Outlook.",
|
||||
revokeAccess: "Revoca l'accesso",
|
||||
configured: "Configurato",
|
||||
searchSkills: "Competenze di ricerca...",
|
||||
noSkillsFound:
|
||||
"Non sono state trovate corrispondenze per i tuoi criteri di ricerca.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Cerca e leggi le email",
|
||||
description:
|
||||
"Cerca e leggi le e-mail nella tua casella di posta di Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Bozze di email",
|
||||
description: "Crea, modifica e gestisci bozze di email.",
|
||||
},
|
||||
send: {
|
||||
title: "Inviare e-mail",
|
||||
description:
|
||||
"Invia nuove email o rispondi immediatamente ai messaggi ricevuti.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistiche sull'integrazione",
|
||||
description:
|
||||
"Visualizza le statistiche della casella di posta e le informazioni sull'account.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Accedi alla casella di posta",
|
||||
description:
|
||||
"Recupera le ultime email dalla tua casella di posta di Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Cerca nelle email",
|
||||
description:
|
||||
"Cerca email utilizzando la sintassi di ricerca di Microsoft",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leggi la conversazione",
|
||||
description: "Leggi l'intera conversazione via email.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Crea una bozza",
|
||||
description:
|
||||
"Crea una nuova bozza di email o una bozza di risposta a un messaggio esistente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versione aggiornata",
|
||||
description: "Aggiornare una bozza di email esistente",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Proposte",
|
||||
description: "Elenca tutte le email in bozza.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Elimina bozza",
|
||||
description: "Elimina una bozza di email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Invia bozza",
|
||||
description: "Invia una bozza di email esistente.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Invia e-mail",
|
||||
description:
|
||||
"Invia una nuova email o rispondi a un messaggio esistente immediatamente.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistiche della casella di posta",
|
||||
description:
|
||||
"Ottieni il numero di cartelle e le statistiche della casella di posta.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Connettore per Google Calendar",
|
||||
description:
|
||||
"Permetti al tuo agente di interagire con Google Calendar: visualizza calendari, visualizza eventi, crea e aggiorna eventi, e gestisci le conferme di partecipazione. <a>Consulta la documentazione</a>.",
|
||||
multiUserWarning:
|
||||
"L'integrazione con Google Calendar non è disponibile in modalità multiutente per motivi di sicurezza. Per utilizzare questa funzione, è necessario disattivare la modalità multiutente.",
|
||||
configuration: "Configurazione del calendario Google",
|
||||
deploymentId: "ID di distribuzione",
|
||||
deploymentIdHelp:
|
||||
"L'ID di distribuzione dalla tua applicazione web Google Apps Script",
|
||||
apiKey: "Chiave API",
|
||||
apiKeyHelp:
|
||||
"La chiave API che hai configurato nella tua distribuzione di Google Apps Script",
|
||||
configurationRequired:
|
||||
"Si prega di configurare l'ID di distribuzione e la chiave API per abilitare le funzionalità di Google Calendar.",
|
||||
configured: "Configurato",
|
||||
searchSkills: "Competenze di ricerca...",
|
||||
noSkillsFound:
|
||||
"Non sono state trovate corrispondenze per la tua ricerca.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendari",
|
||||
description: "Visualizza e gestisci i tuoi calendari Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Leggi gli eventi",
|
||||
description: "Visualizza e cerca eventi nel calendario",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Creare e aggiornare eventi",
|
||||
description: "Creare nuovi eventi e modificare quelli esistenti.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Gestione delle conferme di partecipazione",
|
||||
description: "Gestisci lo stato della tua risposta per gli eventi.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Calendari personalizzati",
|
||||
description:
|
||||
"Elenca tutti i calendari che possiedi o a cui sei abbonato.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Ottieni i dettagli del calendario",
|
||||
description:
|
||||
"Ottenere informazioni dettagliate su un calendario specifico.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Informazioni sull'evento",
|
||||
description:
|
||||
"Ottenere informazioni dettagliate su un evento specifico.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Trova eventi per il giorno specifico",
|
||||
description:
|
||||
"Visualizza tutti gli eventi programmati per una data specifica.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Eventi (Intervallo di date)",
|
||||
description:
|
||||
"Recupera eventi all'interno di un intervallo di date personalizzato.",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Consulta gli eventi futuri",
|
||||
description:
|
||||
"Trova eventi per oggi, questa settimana o questo mese utilizzando parole chiave semplici.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Aggiungi evento rapidamente",
|
||||
description:
|
||||
'Creare un evento a partire da un testo in linguaggio naturale (ad esempio, "Riunione domani alle 15:00")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Crea evento",
|
||||
description:
|
||||
"Crea un nuovo evento con il pieno controllo su tutte le proprietà.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Aggiornamento evento",
|
||||
description: "Modificare un evento esistente nel calendario",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Imposta lo stato della risposta",
|
||||
description:
|
||||
"Accettare, rifiutare o accettare con riserva un evento",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Server MCP",
|
||||
@@ -461,6 +779,95 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -483,7 +890,34 @@ const TRANSLATIONS = {
|
||||
"Le chiavi API consentono al titolare di accedere e gestire in modo programmatico questa istanza AnythingLLM.",
|
||||
link: "Leggi la documentazione API",
|
||||
generate: "Genera nuova chiave API",
|
||||
empty: "Nessuna chiave API trovata",
|
||||
actions: "Azioni",
|
||||
messages: {
|
||||
error: "Errore: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Crea una nuova chiave API",
|
||||
cancel: "Annulla",
|
||||
close: "Chiudi",
|
||||
create: "Crea chiave API",
|
||||
helper:
|
||||
"Una volta creata, la chiave API può essere usata per accedere e configurare questa istanza AnythingLLM in modo programmatico.",
|
||||
name: {
|
||||
label: "Nome",
|
||||
placeholder: "Integrazione di produzione",
|
||||
helper:
|
||||
"Facoltativo. Usa un nome descrittivo così potrai riconoscere questa chiave in seguito.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copia chiave API",
|
||||
copied: "Copiata",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Sei sicuro di voler disattivare questa chiave API?\nDopo questa azione non potrà più essere utilizzata.\n\nQuesta azione è irreversibile.",
|
||||
},
|
||||
table: {
|
||||
name: "Nome",
|
||||
key: "Chiave API",
|
||||
by: "Creato da",
|
||||
created: "Creato",
|
||||
@@ -1162,9 +1596,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1206,20 +1637,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -404,6 +404,300 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Gmail 接続",
|
||||
description:
|
||||
"エージェントがGmailと連携できるようにする:メールの検索、スレッドの閲覧、ドラフトの作成、メールの送信、およびインボックスの管理を可能にします。詳細については、<a>ドキュメントを参照</a>。",
|
||||
multiUserWarning:
|
||||
"セキュリティ上の理由から、Gmailとの連携はマルチユーザーモードでは利用できません。この機能を使用するには、まずマルチユーザーモードを無効にしてください。",
|
||||
configuration: "Gmail の設定",
|
||||
deploymentId: "デプロイメントID",
|
||||
deploymentIdHelp:
|
||||
"あなたのGoogle Apps ScriptウェブアプリケーションのデプロイメントID",
|
||||
apiKey: "APIキー",
|
||||
apiKeyHelp: "Google Apps Script のデプロイ時に設定した API キー",
|
||||
configurationRequired:
|
||||
"Gmail の機能を有効にするには、デプロイメント ID と API キーを設定してください。",
|
||||
configured: "設定済み",
|
||||
searchSkills: "検索スキル...",
|
||||
noSkillsFound: "検索条件に合致するスキルは見つかりませんでした。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "メールの検索と閲覧",
|
||||
description: "Gmail の受信トレイから、メールを検索および閲覧する",
|
||||
},
|
||||
drafts: {
|
||||
title: "サンプルメール",
|
||||
description: "メールの作成、編集、および管理",
|
||||
},
|
||||
send: {
|
||||
title: "メールの送信と返信",
|
||||
description: "メールを送信し、スレッドへの返信をすぐに行う。",
|
||||
},
|
||||
threads: {
|
||||
title: "メールのトピックを管理する",
|
||||
description:
|
||||
"メールのトピックを管理する - 既読/未読のマーク、アーカイブ、削除",
|
||||
},
|
||||
account: {
|
||||
title: "統合に関する統計",
|
||||
description: "メールボックスの統計情報とアカウント情報を表示する",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "メールを検索する",
|
||||
description: "Gmail のクエリ構文を使用して、メールを検索する",
|
||||
},
|
||||
readThread: {
|
||||
title: "スレッドを読む",
|
||||
description: "IDでメールの全文を閲覧する",
|
||||
},
|
||||
createDraft: {
|
||||
title: "ドラフト作成",
|
||||
description: "新しいメールの草案を作成する",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "草案の返信を作成する",
|
||||
description: "既存のスレッドに対する返信の草案を作成する",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "ドラフトの更新",
|
||||
description: "既存のメールドラフトを更新する",
|
||||
},
|
||||
getDraft: {
|
||||
title: "草案を入手",
|
||||
description: "IDで特定のドラフトを取得する",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "ドラフト案リスト",
|
||||
description: "すべての草案メールの一覧を表示する",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "草案を削除",
|
||||
description: "草案のメールを削除する",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "草案を送信",
|
||||
description: "既存のメールドラフトを送信する",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "メールを送信する",
|
||||
description: "すぐにメールを送信してください",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "スレッドへの返信",
|
||||
description: "メールのやり取りにすぐに返信する",
|
||||
},
|
||||
markRead: {
|
||||
title: "マーク・リード",
|
||||
description: "スレッドを「読了」としてマークする",
|
||||
},
|
||||
markUnread: {
|
||||
title: "未読としてマーク",
|
||||
description: "スレッドを「未読」としてマークする",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "ゴミ箱へ移動",
|
||||
description: "スレッドをゴミ箱に移動する",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "アーカイブ",
|
||||
description: "スレッドをアーカイブする",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "受信トレイへ移動",
|
||||
description: "スレッドをインボックスに移動する",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "メールボックスの統計情報",
|
||||
description: "未読件数とメールボックスの統計情報を取得する",
|
||||
},
|
||||
getInbox: {
|
||||
title: "インボックスを開く",
|
||||
description: "Gmail から受信したメールを効率的に取得する方法",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook 連携機能",
|
||||
description:
|
||||
"エージェントがMicrosoft Outlookと連携できるようにする - Microsoft Graph APIを使用して、メールの検索、スレッドの閲覧、ドラフトの作成、メールの送信、およびインボックスの管理を行う。詳細については、ドキュメントを参照してください。",
|
||||
multiUserWarning:
|
||||
"Outlookとの連携は、セキュリティ上の理由から、複数ユーザーモードでは利用できません。この機能を使い始めるには、複数ユーザーモードを無効にする必要があります。",
|
||||
configuration: "Outlook の設定",
|
||||
authType: "アカウントの種類",
|
||||
authTypeHelp:
|
||||
"認証に使用できるMicrosoftアカウントの種類を選択します。「すべて」は、個人用アカウントと職場/学校用アカウントの両方をサポートします。「個人用のみ」は、個人用Microsoftアカウントに限定されます。「職場/学校用のみ」は、特定のAzure ADテナントからの職場/学校用アカウントに限定されます。",
|
||||
authTypeCommon: "すべての口座(個人用および仕事/学校用)",
|
||||
authTypeConsumers: "個人のMicrosoftアカウントのみ",
|
||||
authTypeOrganization: "組織アカウントのみ(テナントIDが必要です)",
|
||||
clientId: "アプリケーション(クライアント)ID",
|
||||
clientIdHelp:
|
||||
"あなたのAzure ADアプリケーションの「アプリケーション(クライアント)ID」",
|
||||
tenantId: "テナントID",
|
||||
tenantIdHelp:
|
||||
"あなたの Azure AD アプリの登録から取得した「ディレクトリ(テナント)ID」。組織での認証のみに必要です。",
|
||||
clientSecret: "クライアントの秘密",
|
||||
clientSecretHelp:
|
||||
"Azure AD アプリの登録から取得したクライアントのシークレット値",
|
||||
configurationRequired:
|
||||
"Outlook の機能を有効にするには、クライアント ID とクライアントシークレットを設定してください。",
|
||||
authRequired:
|
||||
"まず、認証情報を保存し、その後、Microsoftとの認証を行い、設定を完了してください。",
|
||||
authenticateWithMicrosoft: "マイクロソフトとの認証",
|
||||
authenticated: "Microsoft Outlookとの認証に成功しました。",
|
||||
revokeAccess: "アクセス権を停止する",
|
||||
configured: "設定済み",
|
||||
searchSkills: "検索スキル...",
|
||||
noSkillsFound: "検索条件に一致するスキルは見つかりませんでした。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "メールの検索と閲覧",
|
||||
description: "Outlook の受信トレイから、メールを検索して読み取る。",
|
||||
},
|
||||
drafts: {
|
||||
title: "サンプルメール",
|
||||
description: "メールの作成、編集、および管理",
|
||||
},
|
||||
send: {
|
||||
title: "メールの送信",
|
||||
description:
|
||||
"新しいメールを送信するか、すぐにメッセージに返信してください。",
|
||||
},
|
||||
account: {
|
||||
title: "統合に関する統計",
|
||||
description: "メールボックスの統計情報とアカウント情報を確認する",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "受信トレイを開く",
|
||||
description: "Outlook の受信トレイから、最近のメールを取得する",
|
||||
},
|
||||
search: {
|
||||
title: "メールを検索する",
|
||||
description: "Microsoft の検索構文を使用してメールを検索する",
|
||||
},
|
||||
readThread: {
|
||||
title: "会話の内容を読み取る",
|
||||
description: "メールのやり取り全体を読み込む",
|
||||
},
|
||||
createDraft: {
|
||||
title: "ドラフト作成",
|
||||
description:
|
||||
"新しいメールの草案を作成するか、既存のメッセージへの返信の草案を作成する。",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "ドラフトの更新",
|
||||
description: "既存のメールドラフトを更新する",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "ドラフト案リスト",
|
||||
description: "すべての草案メールの一覧",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "草案を削除",
|
||||
description: "草案のメールを削除する",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "草案を送信",
|
||||
description: "既存のメールの草稿を送信する",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "メールを送信する",
|
||||
description:
|
||||
"新しいメールを作成するか、既存のメッセージにすぐに返信してください。",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "メールボックスの統計",
|
||||
description: "フォルダの数とメールボックスの統計情報を取得する",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google カレンダー 連携機能",
|
||||
description:
|
||||
"エージェントがGoogleカレンダーと連携できるようにする - カレンダーの表示、イベントの取得、イベントの作成と更新、およびRSVPの管理を可能にする。詳細については、ドキュメントを参照してください。",
|
||||
multiUserWarning:
|
||||
"Google カレンダーとの連携は、セキュリティ上の理由から、複数ユーザーモードでは利用できません。この機能をご利用いただくには、複数ユーザーモードを無効にする必要があります。",
|
||||
configuration: "Google カレンダーの設定",
|
||||
deploymentId: "デプロイメントID",
|
||||
deploymentIdHelp:
|
||||
"あなたのGoogle Apps ScriptのウェブアプリケーションのデプロイID",
|
||||
apiKey: "APIキー",
|
||||
apiKeyHelp: "Google Apps Script のデプロイ時に設定した API キー",
|
||||
configurationRequired:
|
||||
"Google カレンダーの機能を使用するために、デプロイメントIDとAPIキーを設定してください。",
|
||||
configured: "設定済み",
|
||||
searchSkills: "検索スキル...",
|
||||
noSkillsFound:
|
||||
"あなたの検索条件に合致するスキルは見つかりませんでした。",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "カレンダー",
|
||||
description: "Googleカレンダーの表示と管理",
|
||||
},
|
||||
readEvents: {
|
||||
title: "イベント情報",
|
||||
description: "カレンダー上のイベントの表示と検索",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "イベントの作成と更新",
|
||||
description: "新しいイベントを作成し、既存のイベントを修正する",
|
||||
},
|
||||
rsvp: {
|
||||
title: "RSVP(出欠確認)管理",
|
||||
description: "イベントへの参加状況を管理する",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "カレンダーリスト",
|
||||
description:
|
||||
"所有している、または購読しているすべてのカレンダーの一覧",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "カレンダーの詳細を確認する",
|
||||
description: "特定のカレンダーに関する詳細な情報த்தைப்入手する",
|
||||
},
|
||||
getEvent: {
|
||||
title: "イベント情報を入手",
|
||||
description: "特定のイベントに関する詳細な情報த்தைப்入手する",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "その日のイベントを検索する",
|
||||
description: "特定の日に予定されているすべてのイベントを取得する",
|
||||
},
|
||||
getEvents: {
|
||||
title: "イベント(期間指定)",
|
||||
description: "指定した期間内のイベントを取得する",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "今後のイベントをチェックする",
|
||||
description:
|
||||
"今日、今週、または今月のイベントを、簡単なキーワードを使って検索する",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "イベントをすぐに登録",
|
||||
description:
|
||||
"自然言語(例:「明日午後3時に会議」)からイベントを作成する",
|
||||
},
|
||||
createEvent: {
|
||||
title: "イベントを作成する",
|
||||
description:
|
||||
"すべてのプロパティを完全に制御できる、新しいイベントを作成する。",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "イベント情報更新",
|
||||
description: "既存の予定を更新する",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "返信状況を設定する",
|
||||
description: "イベントへの参加、拒否、または仮の参加",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP サーバー",
|
||||
@@ -450,6 +744,93 @@ 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ドキュメントを作成する",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -472,7 +853,33 @@ const TRANSLATIONS = {
|
||||
"APIキーにより、プログラム経由でこのAnythingLLMインスタンスにアクセスおよび管理できます。",
|
||||
link: "APIドキュメントを読む",
|
||||
generate: "新しいAPIキーを生成",
|
||||
empty: "APIキーが見つかりません",
|
||||
actions: "操作",
|
||||
messages: {
|
||||
error: "エラー: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "新しいAPIキーを作成",
|
||||
cancel: "キャンセル",
|
||||
close: "閉じる",
|
||||
create: "APIキーを作成",
|
||||
helper:
|
||||
"作成したAPIキーは、このAnythingLLMインスタンスにプログラムからアクセスして設定するために使用できます。",
|
||||
name: {
|
||||
label: "名前",
|
||||
placeholder: "本番環境の統合",
|
||||
helper: "任意です。後でこのキーを識別しやすい名前を付けてください。",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "APIキーをコピー",
|
||||
copied: "コピー済み",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"このAPIキーを無効化してもよろしいですか?\n無効化すると、以後このキーは使用できなくなります。\n\nこの操作は元に戻せません。",
|
||||
},
|
||||
table: {
|
||||
name: "名前",
|
||||
key: "APIキー",
|
||||
by: "作成者",
|
||||
created: "作成日",
|
||||
@@ -1135,9 +1542,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"@BotFatherから受け取ったAPIトークンを貼り付け、ボットとのチャットに使用するデフォルトのワークスペースを選択してください。",
|
||||
"bot-token": "ボット トークン",
|
||||
"default-workspace": "デフォルトのワークスペース",
|
||||
"no-workspace":
|
||||
"利用可能な作業スペースがありません。新しい作業スペースが作成されます。",
|
||||
connecting: "接続中...",
|
||||
"connect-bot": "コネクトボット",
|
||||
},
|
||||
@@ -1175,20 +1579,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "ユーザーの権限停止に失敗。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "承認待ち",
|
||||
"pending-description":
|
||||
"本人情報の確認待ちのユーザー。ここに表示されているペアリングコードを、彼らがTelegramで表示しているコードと照合してください。",
|
||||
"approved-title": "承認されたユーザー",
|
||||
"approved-description":
|
||||
"あなたのボットとのチャットを許可されたユーザー。",
|
||||
user: "利用者",
|
||||
"pairing-code": "組み合わせコード",
|
||||
"no-pending": "処理中のリクエストはありません",
|
||||
"no-approved": "承認されたユーザーはいません",
|
||||
unknown: "不明",
|
||||
approve: "承認",
|
||||
deny: "否定",
|
||||
revoke: "無効化する",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -409,6 +409,294 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail 연결기",
|
||||
description:
|
||||
"제 에이전트가 Gmail과 상호 작용할 수 있도록 설정하세요 - 이메일 검색, 스레드 읽기, 초안 작성, 이메일 전송, 그리고 받은 메일 관리 기능을 사용하세요. <a>문서를 참조하세요</a>.",
|
||||
multiUserWarning:
|
||||
"Gmail 통합 기능은 보안상의 이유로 다중 사용자 모드에서는 사용할 수 없습니다. 이 기능을 사용하려면 다중 사용자 모드를 비활성화해 주세요.",
|
||||
configuration: "Gmail 설정",
|
||||
deploymentId: "배포 ID",
|
||||
deploymentIdHelp: "당신의 Google Apps Script 웹 앱의 배포 ID",
|
||||
apiKey: "API 키",
|
||||
apiKeyHelp: "당신이 Google Apps Script 배포 시 설정한 API 키",
|
||||
configurationRequired:
|
||||
"Gmail 기능을 사용하려면 배포 ID와 API 키를 설정해 주세요.",
|
||||
configured: "설정됨",
|
||||
searchSkills: "검색 기술...",
|
||||
noSkillsFound: "검색 결과와 일치하는 기술이 없습니다.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "이메일 검색 및 읽기",
|
||||
description: "Gmail 계정에서 이메일을 검색하고 읽으세요.",
|
||||
},
|
||||
drafts: {
|
||||
title: "샘플 이메일",
|
||||
description: "이메일 초안을 작성, 편집, 관리",
|
||||
},
|
||||
send: {
|
||||
title: "이메일 보내기 및 답변",
|
||||
description: "이메일을 보내고, 토론 스레드에 즉시 응답",
|
||||
},
|
||||
threads: {
|
||||
title: "이메일 스레드 관리",
|
||||
description:
|
||||
"이메일 스레드 관리 - 읽음/미읽음 표시, 아카이브, 삭제",
|
||||
},
|
||||
account: {
|
||||
title: "통합 통계",
|
||||
description: "메일함 통계 및 계정 정보 확인",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "이메일 검색",
|
||||
description: "Gmail 쿼리 구문을 사용하여 이메일 검색",
|
||||
},
|
||||
readThread: {
|
||||
title: "게시글 전체 읽기",
|
||||
description: "ID를 기준으로 전체 이메일 스레드를 읽기",
|
||||
},
|
||||
createDraft: {
|
||||
title: "초안 작성",
|
||||
description: "새로운 이메일 초안 작성",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "초안 답변 작성",
|
||||
description: "기존 스레드에 대한 답변 초안 작성",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "초안 업데이트",
|
||||
description: "기존 이메일 초안을 업데이트합니다.",
|
||||
},
|
||||
getDraft: {
|
||||
title: "초안 보기",
|
||||
description: "ID를 사용하여 특정 초안을 검색/불러오기",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "초안 목록",
|
||||
description: "모든 초안 이메일 목록을 표시",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "초안 삭제",
|
||||
description: "초안 이메일을 삭제",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "초안 보내기",
|
||||
description: "기존 이메일 초안을 보내기",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "이메일 보내기",
|
||||
description: "즉시 이메일을 보내세요.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "게시글에 답변",
|
||||
description: "이메일 스레드에 즉시 답변",
|
||||
},
|
||||
markRead: {
|
||||
title: "마크 리드",
|
||||
description: '특정 게시글을 "읽음"으로 표시',
|
||||
},
|
||||
markUnread: {
|
||||
title: "미리 읽기",
|
||||
description: '특정 스레드를 "읽지 않은 상태"로 표시',
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "삭제",
|
||||
description: "스레드를 쓰레기함으로 이동",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "보관",
|
||||
description: "게시글을 보관",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "받은 편지함으로 이동",
|
||||
description: "스레드를 받은 편지함으로 이동",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "메일함 통계",
|
||||
description: "읽지 않은 이메일 수 및 메일함 통계 확인",
|
||||
},
|
||||
getInbox: {
|
||||
title: "메일함 보기",
|
||||
description: "Gmail에서 받은 이메일을 효율적으로 관리하는 방법",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "아웃룩 연결",
|
||||
description:
|
||||
"Microsoft Outlook와 상호 작용할 수 있도록 에이전트에게 Microsoft Graph API를 사용하도록 설정합니다. 이메일 검색, 스레드 읽기, 초안 작성, 이메일 전송, 그리고 Microsoft Graph API를 통해 이메일함을 관리할 수 있습니다. 자세한 내용은 <a>문서를 참조하세요</a>.",
|
||||
multiUserWarning:
|
||||
"Outlook 통합 기능은 보안상의 이유로 다중 사용자 모드에서는 사용할 수 없습니다. 이 기능을 사용하려면 다중 사용자 모드를 비활성화해 주십시오.",
|
||||
configuration: "아웃룩 설정",
|
||||
authType: "계정 유형",
|
||||
authTypeHelp:
|
||||
"인증할 수 있는 Microsoft 계정 유형을 선택합니다. '모든 계정'은 개인 및 업무/학교 계정을 모두 지원합니다. '개인 계정만'은 개인 Microsoft 계정에만 적용됩니다. '특정 Azure AD 테넌트의 계정만'은 특정 Azure AD 테넌트의 업무/학교 계정에만 적용됩니다.",
|
||||
authTypeCommon: "모든 계정 (개인 계정 및 직장/학교 계정)",
|
||||
authTypeConsumers: "개인 Microsoft 계정만 해당",
|
||||
authTypeOrganization: "단순히 조직 계정만 (세입자 ID 필요)",
|
||||
clientId: "애플리케이션 (고객) ID",
|
||||
clientIdHelp:
|
||||
"당신의 Azure AD 애플리케이션 등록 시 얻은 애플리케이션(클라이언트) ID",
|
||||
tenantId: "임대인 ID",
|
||||
tenantIdHelp:
|
||||
"Azure AD 애플리케이션 등록 시 얻은 (임차인) ID. 조직 내 사용자만 인증하는 경우에만 필요합니다.",
|
||||
clientSecret: "고객 비밀",
|
||||
clientSecretHelp: "Azure AD 애플리케이션 등록 시 얻은 클라이언트 비밀",
|
||||
configurationRequired:
|
||||
"아웃룩 기능을 사용하려면 클라이언트 ID와 클라이언트 비밀을 설정해 주세요.",
|
||||
authRequired:
|
||||
"먼저 사용자 정보를 저장한 다음, Microsoft를 통해 계정을 인증하여 설정 과정을 완료하십시오.",
|
||||
authenticateWithMicrosoft: "마이크로소프트와 인증",
|
||||
authenticated: "Microsoft Outlook와 성공적으로 인증되었습니다.",
|
||||
revokeAccess: "접근 권한 취소",
|
||||
configured: "설정됨",
|
||||
searchSkills: "검색 기술...",
|
||||
noSkillsFound: "검색하신 조건과 일치하는 기술이 없습니다.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "이메일 검색 및 읽기",
|
||||
description: "Outlook 계정의 이메일을 검색하고 읽으세요.",
|
||||
},
|
||||
drafts: {
|
||||
title: "샘플 이메일",
|
||||
description: "이메일 초안을 작성, 편집 및 관리",
|
||||
},
|
||||
send: {
|
||||
title: "이메일 보내기",
|
||||
description: "새로운 이메일을 보내거나, 즉시 메시지에 응답",
|
||||
},
|
||||
account: {
|
||||
title: "통합 통계",
|
||||
description: "메일함 통계 및 계정 정보 확인",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "메일함 보기",
|
||||
description: "최근에 받은 이메일을 Outlook 계정에서 확인",
|
||||
},
|
||||
search: {
|
||||
title: "이메일 검색",
|
||||
description: "Microsoft 검색 구문을 사용하여 이메일 검색",
|
||||
},
|
||||
readThread: {
|
||||
title: "대화 내용 읽기",
|
||||
description: "전체 이메일 대화 내용을 읽기",
|
||||
},
|
||||
createDraft: {
|
||||
title: "초안 작성",
|
||||
description:
|
||||
"새로운 이메일 초안을 작성하거나 기존 메시지에 대한 답변 초안을 작성합니다.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "초안 업데이트",
|
||||
description: "기존 이메일 초안을 업데이트합니다.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "초안 목록",
|
||||
description: "모든 초안 이메일 목록을 표시",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "초안 삭제",
|
||||
description: "초안 이메일을 삭제",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "초안 보내기",
|
||||
description: "기존 이메일 초안을 보내기",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "이메일 보내기",
|
||||
description: "새로운 이메일을 보내거나 기존 메시지에 즉시 응답",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "메일함 통계",
|
||||
description: "폴더 수와 메일함 통계 정보를 확인합니다.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "구글 캘린더 연동",
|
||||
description:
|
||||
"에이전트가 Google 캘린더와 상호 작용할 수 있도록 설정하세요 - 캘린더 보기, 이벤트 확인, 이벤트 생성 및 업데이트, RSVP 관리 등을 수행할 수 있습니다. <a>문서를 참조하세요</a>.",
|
||||
multiUserWarning:
|
||||
"Google 캘린더 통합 기능은 보안상의 이유로 다중 사용자 모드에서는 사용할 수 없습니다. 이 기능을 사용하려면 다중 사용자 모드를 비활성화해주세요.",
|
||||
configuration: "구글 캘린더 설정",
|
||||
deploymentId: "배포 ID",
|
||||
deploymentIdHelp: "당신의 구글 앱스 스크립트 웹 앱의 배포 ID",
|
||||
apiKey: "API 키",
|
||||
apiKeyHelp: "Google Apps Script 배포 시 설정한 API 키",
|
||||
configurationRequired:
|
||||
"구글 캘린더 기능을 사용하려면 배포 ID와 API 키를 설정해 주세요.",
|
||||
configured: "설정됨",
|
||||
searchSkills: "검색 기술...",
|
||||
noSkillsFound: "검색하신 조건과 일치하는 기술이 없습니다.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "달력",
|
||||
description: "Google 캘린더를 확인하고 관리하세요.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "이벤트 목록 보기",
|
||||
description: "일정 뷰 및 검색",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "이벤트 생성 및 업데이트",
|
||||
description: "새로운 이벤트를 생성하고 기존 이벤트를 수정",
|
||||
},
|
||||
rsvp: {
|
||||
title: "참석 확인 관리",
|
||||
description: "이벤트에 대한 응답 상태를 관리하세요.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "달력 목록",
|
||||
description:
|
||||
"자신이 소유하거나 구독하고 있는 모든 캘린더 목록을 작성하세요.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "달력 세부 정보 보기",
|
||||
description: "특정 캘린더에 대한 자세한 정보를 얻으세요.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "이벤트 정보 보기",
|
||||
description: "특정 이벤트에 대한 자세한 정보를 얻으세요.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "오늘의 행사 정보 보기",
|
||||
description: "특정 날짜에 예정된 모든 행사 목록을 확인",
|
||||
},
|
||||
getEvents: {
|
||||
title: "이벤트 검색 (날짜 범위)",
|
||||
description: "사용자 지정 날짜 범위 내의 이벤트 가져오기",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "다가오는 행사 보기",
|
||||
description:
|
||||
"오늘, 이번 주 또는 이번 달의 이벤트를 간단한 키워드를 사용하여 검색",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "빠르게 이벤트 추가",
|
||||
description:
|
||||
'자연어 (예: "내일 오후 3시에 회의")를 사용하여 이벤트를 생성합니다.',
|
||||
},
|
||||
createEvent: {
|
||||
title: "이벤트 생성",
|
||||
description:
|
||||
"모든 속성에 대한 완전한 제어 기능을 갖춘 새로운 이벤트를 생성합니다.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "이벤트 업데이트",
|
||||
description: "기존 캘린더 이벤트 업데이트",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "RSVP 상태 설정",
|
||||
description: "행사 참여 여부를 수락, 거절, 또는 잠정적으로 수락",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 서버",
|
||||
@@ -455,6 +743,94 @@ 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:
|
||||
"기본적인 스타일과 서식을 사용하여 워드 문서를 만드세요.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -563,7 +939,34 @@ const TRANSLATIONS = {
|
||||
"API 키는 소유자가 프로그래밍 방식으로 이 AnythingLLM 인스턴스에 액세스하고 관리할 수 있도록 합니다.",
|
||||
link: "API 문서 읽기",
|
||||
generate: "새 API 키 생성",
|
||||
empty: "API 키를 찾을 수 없습니다",
|
||||
actions: "작업",
|
||||
messages: {
|
||||
error: "오류: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "새 API 키 만들기",
|
||||
cancel: "취소",
|
||||
close: "닫기",
|
||||
create: "API 키 만들기",
|
||||
helper:
|
||||
"생성된 API 키는 이 AnythingLLM 인스턴스에 프로그래밍 방식으로 접근하고 구성하는 데 사용할 수 있습니다.",
|
||||
name: {
|
||||
label: "이름",
|
||||
placeholder: "프로덕션 통합",
|
||||
helper:
|
||||
"선택 사항입니다. 나중에 쉽게 식별할 수 있도록 알아보기 쉬운 이름을 사용하세요.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "API 키 복사",
|
||||
copied: "복사됨",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"이 API 키를 비활성화하시겠습니까?\n비활성화하면 더 이상 사용할 수 없습니다.\n\n이 작업은 되돌릴 수 없습니다.",
|
||||
},
|
||||
table: {
|
||||
name: "이름",
|
||||
key: "API 키",
|
||||
by: "생성한 사람",
|
||||
created: "생성일",
|
||||
@@ -1114,9 +1517,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"@BotFather로부터 받은 API 토큰을 복사하여, 봇이 채팅할 기본 워크스페이스를 선택하세요.",
|
||||
"bot-token": "봇 토큰",
|
||||
"default-workspace": "기본 워크스페이스",
|
||||
"no-workspace":
|
||||
"사용 가능한 작업 공간이 없습니다. 새로운 작업 공간이 생성될 것입니다.",
|
||||
connecting: "연결 중...",
|
||||
"connect-bot": "연결 봇",
|
||||
},
|
||||
@@ -1154,19 +1554,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "사용자 계정 삭제에 실패했습니다.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "승인 대기 중",
|
||||
"pending-description":
|
||||
"승인 대기 중인 사용자. 여기 표시된 매칭 코드를 자신의 Telegram 채팅에서 표시된 코드로 일치시켜 주세요.",
|
||||
"approved-title": "승인된 사용자",
|
||||
"approved-description": "당신의 봇과 대화할 수 있도록 승인된 사용자.",
|
||||
user: "사용자",
|
||||
"pairing-code": "코드 매칭",
|
||||
"no-pending": "처리 중인 요청이 없습니다.",
|
||||
"no-approved": "승인된 사용자가 없습니다",
|
||||
unknown: "알 수 없음",
|
||||
approve: "승인",
|
||||
deny: "부인",
|
||||
revoke: "취소",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -422,6 +422,312 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail sąsaja",
|
||||
description:
|
||||
"Įgalinkite savo agentą, kad galėtų interaktuoti su Gmail – ieškoti pašto žinučių, skaityti pokalbius, kurti projekte, siųsti pašto žinučių ir valdyti savo pašto dėžę. <a>Peržiūrėkite dokumentaciją</a>.",
|
||||
multiUserWarning:
|
||||
"„Gmail“ integracija negali būti naudojama kelių vartotojų režimu dėl saugumo priežasčių. Norėdami naudoti šią funkciją, prašome išjungti kelių vartotojų režimą.",
|
||||
configuration: "Gmail konfigūracija",
|
||||
deploymentId: "Įrenginio ID",
|
||||
deploymentIdHelp: "Jūsų „Google Apps Script“ svetainės programos ID",
|
||||
apiKey: "API raktas",
|
||||
apiKeyHelp:
|
||||
"„API“ raktas, kurį konfigūruojate savo „Google Apps Script“ programoje.",
|
||||
configurationRequired:
|
||||
"Prašome nustatyti „Deployment ID“ ir API raktą, kad būtų įgalintos Gmail funkcijos.",
|
||||
configured: "Nustatytas",
|
||||
searchSkills: "Paieškos įgūdžiai...",
|
||||
noSkillsFound: "Nėra atitikčių jūsų paieškos kriterijams.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Paieškos ir skaitymas el. paštą",
|
||||
description:
|
||||
"Paieškokite ir skaitykite el. laiimus iš savo „Gmail“ sąrašo",
|
||||
},
|
||||
drafts: {
|
||||
title: "Pagalbos el. pašto rašto projektai",
|
||||
description: "Sukurkite, redaguo, ir valdykite el. pašto rašinius.",
|
||||
},
|
||||
send: {
|
||||
title: "Siųstis ir atsakyti el. pašto žinutėms",
|
||||
description:
|
||||
"Siųkite el. pašto žinutes ir atsakykite į diskusijų siužus nedelsiant.",
|
||||
},
|
||||
threads: {
|
||||
title: "Valdykite el. pašto žinias",
|
||||
description:
|
||||
"Valdykite el. pašto žinias – pažymėkite kaip „perskaityta“ arba „neperskaityta“, archyvuokite, ištrinkite.",
|
||||
},
|
||||
account: {
|
||||
title: "Integracijos statistika",
|
||||
description:
|
||||
"Peržiūrėkite pašto dėžės statistikos ir sąskaitos informaciją.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Paieškos el. paštu",
|
||||
description:
|
||||
"Paieškokite el. laiimus naudodami Gmail paieškos sintaksę",
|
||||
},
|
||||
readThread: {
|
||||
title: "Peržiūrėti temą",
|
||||
description: "Peržiūrėkite visą el. pašto seką pagal ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Sukurti projekto variantą",
|
||||
description: "Sukurkite naują el. pašto projekto variantą",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Sukurti projekto atsakymą",
|
||||
description: "Sukurkite atsakinimo projektą esamai temai.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Paskaitos projekto atnaujinimas",
|
||||
description: "Atnaujinti esamą el. pašto projekto",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Gaukite projekto variantą",
|
||||
description: "Gauti konkretų variantą pagal ID",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Paskaitų planas",
|
||||
description: "Įrašykite visus suvestus el. pašto projektus",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Ištrinkti projekto",
|
||||
description: "Ištrinkite projekto el. laišką",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Siųstis projekto",
|
||||
description: "Siųstis esamą el. pašto projekto",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Siųstis el. pašto laišką",
|
||||
description: "Nurodyti el. pašto žinutę nedelsiant",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Atsakymas į temą",
|
||||
description: "Atsakyti į el. pašto žinią nedelsiant",
|
||||
},
|
||||
markRead: {
|
||||
title: "Markas Redas",
|
||||
description: "Žymkite temą kaip perskaitytą",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Žymėti kaip neperskaityta",
|
||||
description: "Žymkite temą kaip neperskaitytą",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Perkelti į šiukšlių sąvartą",
|
||||
description: "Perkelkite temą į šiukšlių sąsandynę",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archivų",
|
||||
description: "Įrašyti temą į archyvą",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Perkelkite į „Įvesalą“",
|
||||
description: "Perkelti temą į pašto dėžę",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Pašto dėžės statistika",
|
||||
description:
|
||||
"Gaukite neatsakytų žinučių skaičių ir pašto dėžės statistikos duomenis.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Peržiūrėti laiškų dėžę",
|
||||
description: "Efektyvus būdas gauti el. laiškus iš „Gmail“ sąrašo",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "„Outlook“ integracija",
|
||||
description:
|
||||
"Įgalinkite savo agentą, kad galėtų bendrauti su „Microsoft Outlook“ – ieškoti pašto, skaityti pokalbį, kurti projektus, siųsti paštą ir valdyti savo pašto dėžę per „Microsoft Graph“ API. <a>Peržiūrėkite dokumentaciją</a>.",
|
||||
multiUserWarning:
|
||||
"„Outlook“ integracija negalima naudoti kelių vartotojų režimu dėl saugumo priežasčių. Norėdami naudoti šią funkciją, prašome išjungti kelių vartotojų režimą.",
|
||||
configuration: "Outlook konfigūracija",
|
||||
authType: "Sąskaitos tipas",
|
||||
authTypeHelp:
|
||||
"Pasirinkite, kokie Microsoft sąskaitos gali būti patvirtintos. „Visi“ palaiko tiek asmenines, tiek darbo/mokyklos sąskaitas. „Tik asmeninės“ riboja pasirinkimą iki asmeninių Microsoft sąskaitų. „Tik organizacijos“ riboja pasirinkimą iki darbo/mokyklos sąskaitų iš konkretaus „Azure AD“ kliento.",
|
||||
authTypeCommon: "Visos sąskaitos (asmeninės ir darbo/mokyklos)",
|
||||
authTypeConsumers: "Tiesiog asmeninės Microsoft paskyros",
|
||||
authTypeOrganization:
|
||||
"Tiesiog organizacijos sąskaitos (reikia užpildyti „Užimtojo ID“ laukelį)",
|
||||
clientId: "Programos (kliento) ID",
|
||||
clientIdHelp:
|
||||
"Programos (kliento) ID, gautas iš jūsų „Azure AD“ programos registracijos",
|
||||
tenantId: "Identifikavimo numeris (nuomininkas)",
|
||||
tenantIdHelp:
|
||||
"„Tenant“ ID iš jūsų „Azure AD“ programos registracijos. Reikalingas tik, jei autentifikacija vykdoma tik organizacijos naudotojams.",
|
||||
clientSecret: "Kliento slaptas kodas",
|
||||
clientSecretHelp:
|
||||
"Kliento paslaptas reikalas, gautas iš jūsų „Azure AD“ programos registracijos",
|
||||
configurationRequired:
|
||||
"Prašome nustatyti kliento ID ir kliento slaptažodį, kad būtų įgalintos Outlook funkcijos.",
|
||||
authRequired:
|
||||
"Pirmiausia, išsaugokite savo duomenis, o tada, kad užbaigtumėte konfigūraciją, prisijunkite prie „Microsoft“.",
|
||||
authenticateWithMicrosoft: "Patvirtinkite naudodami Microsoft",
|
||||
authenticated: "Sėkmingai prisijungta prie „Microsoft Outlook“.",
|
||||
revokeAccess: "Atšalinti prieigą",
|
||||
configured: "Nustatytas",
|
||||
searchSkills: "Paieškos įgūdžiai...",
|
||||
noSkillsFound: "Nėra atitikčių jūsų paieškai.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Paieškos ir skaitymas el. paštą",
|
||||
description:
|
||||
"Paieškokite ir skaitykite el. pašto laiškus iš savo Outlook sąrašo",
|
||||
},
|
||||
drafts: {
|
||||
title: "Pasiūlytų el. pašto laiškų",
|
||||
description: "Sukurkite, redaguo, ir valdykite el. pašto rašinius.",
|
||||
},
|
||||
send: {
|
||||
title: "Siųstis el. pašto žinutes",
|
||||
description:
|
||||
"Siųkite naujus el. laiškus arba atsakykite į pranešimus nedelskant",
|
||||
},
|
||||
account: {
|
||||
title: "Integracijos statistika",
|
||||
description:
|
||||
"Peržiūrėkite pašto dėžės statistikos ir sąskaitos informaciją.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Peržiūrėti pašto dėžę",
|
||||
description:
|
||||
"Gaukite naujausius el. pašto laiškus iš savo Outlook sąvejos.",
|
||||
},
|
||||
search: {
|
||||
title: "Paieškos el. paštu",
|
||||
description:
|
||||
"Paieškokite el. laiškus naudodami „Microsoft Search“ sintaksę.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Perskaitykite pokalbį",
|
||||
description: "Perskaitykite visą el. pašto pokalbio seką.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Sukurti projekto variantą",
|
||||
description:
|
||||
"Sukurkite naują el. pašto projekto arba atsakymo projekto į esamą pranešimą.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Paskaitos projekto atnaujinimas",
|
||||
description: "Atnaujinkite esamą el. pašto projekto",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Paskaitų planas",
|
||||
description: "Parodykite visus projekto el. laiškus",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Ištrinkti projekto",
|
||||
description: "Ištrinkite projekto el. laišką",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Siųstis projekto",
|
||||
description: "Siųstis jau esančią el. pašto projekto versiją",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Siųstis el. paštą",
|
||||
description:
|
||||
"Siųstinkite naują el. laišką arba atsakykite į esamą pranešimą nedelsdami.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Pašto dėžės statistika",
|
||||
description:
|
||||
"Gaukite folderių skaičius ir pašto dėžutės statistikos duomenis.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "„Google Kalendoriaus“ integracija",
|
||||
description:
|
||||
"Įgalinkite savo agentą, kad galėtų bendradarbiauti su „Google Calendar“ – peržiūrėti kalendorius, gauti renginių informaciją, kurti ir atnaujinti renginius bei tvarkyti patvirtimus. <a>Peržiūrėkite dokumentaciją</a>.",
|
||||
multiUserWarning:
|
||||
"„Google Kalendro“ integracija negali būti naudojama kelių vartotojų režimu dėl saugumo priežasčių. Norėdami naudoti šią funkciją, prašome išjungti kelių vartotojų režimą.",
|
||||
configuration: "„Google Kalendoriaus“ konfigūracija",
|
||||
deploymentId: "Įrenginio ID",
|
||||
deploymentIdHelp: "Jūsų „Google Apps Script“ svetainės programos ID",
|
||||
apiKey: "API raktas",
|
||||
apiKeyHelp:
|
||||
"„API raktas“, kurį konfigūravoje savo „Google Apps Script“ programoje.",
|
||||
configurationRequired:
|
||||
"Prašome nustatyti „Deployment ID“ ir API raktą, kad būtų įgalintos „Google Calendar“ funkcijos.",
|
||||
configured: "Nustatytas",
|
||||
searchSkills: "Paieškos įgūdžiai...",
|
||||
noSkillsFound: "Nėra atitikčių jūsų paieškos kriterijams.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendoriai",
|
||||
description: "Peržiūrėkite ir valdykite savo „Google Kalendorius“.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Peržiūrėti renginius",
|
||||
description: "Peržiūrėkite ir paieškokite kalendoriaus renginių",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Sukurkite ir atnaujinkite renginius",
|
||||
description: "Sukurkite naujas renginius ir keičkite esamus",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Patvirtinimų valdymas",
|
||||
description: "Valdykite savo atsakymo statusą renginiams",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalendoriai",
|
||||
description:
|
||||
"Peržiūrėkite visus kalendorius, kuriuos turite arba kuriems yra prenumerata.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Gaukite kalendoriaus detales",
|
||||
description:
|
||||
"Gaukite išsamią informaciją apie konkrečią kalendorių",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Gaukite renginį",
|
||||
description: "Gaukite išsamią informaciją apie konkrečią renginį",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Rasti renginius šiam dienai",
|
||||
description: "Gaukite visus įvykius, numatytus konkrečią dieną.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Rodyti renginius (laiko intervalas)",
|
||||
description: "Gauti renginius už nurodytą datų intervalą",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Peržiūrėti ateinančias renginius",
|
||||
description:
|
||||
"Raskite renginius šiandien, šią savaitę arba šį mėnesį naudodami paprastus žodžius.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Greitas renginio pridėjimas",
|
||||
description:
|
||||
"Sukurkite renginį iš natūralios kalbos (pvz., „Susitikimas rytoj 15:00 val.“)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Sukurti renginį",
|
||||
description:
|
||||
"Sukurkite naują renginį, turėdami visišką kontrolę per visas jo savybes.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Paskelbimo atnaujinimas",
|
||||
description: "Redaguoti esamą kalendoriaus renginį",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Nurodykite atsakymo statusą",
|
||||
description:
|
||||
"Prisitaikyti, atsisakyti arba iš esmės pritarti renginiui.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP serveriai",
|
||||
@@ -461,13 +767,6 @@ const TRANSLATIONS = {
|
||||
"Maksimalus įrankių skaičius, kurį galima parinkti kiekvienai užklausai. Rekomenduojame nustatyti didesnes reikšmes didelio konteksto modeliams.",
|
||||
},
|
||||
},
|
||||
sql: {
|
||||
title: "SQL jungtis",
|
||||
description:
|
||||
"Įgalinkite savo agentą naudoti SQL, kad atsakytų į jūsų klausimus, prijungus jį prie įvairių SQL duomenų bazų paslaugų.",
|
||||
},
|
||||
default_skill:
|
||||
"Numatyba, kad ši funkcija yra įjungta, tačiau galite ją išjungti, jei nenorite, kad agentas galėtų jos naudotis.",
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -578,7 +877,34 @@ const TRANSLATIONS = {
|
||||
"API raktai leidžia programiškai pasiekti ir valdyti šią AnythingLLM instanciją.",
|
||||
link: "Skaityti API dokumentaciją",
|
||||
generate: "Generuoti naują API raktą",
|
||||
empty: "API raktų nerasta",
|
||||
actions: "Veiksmai",
|
||||
messages: {
|
||||
error: "Klaida: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Sukurti naują API raktą",
|
||||
cancel: "Atšaukti",
|
||||
close: "Uždaryti",
|
||||
create: "Sukurti API raktą",
|
||||
helper:
|
||||
"Sukūrus API raktą, jį galima naudoti programiškai pasiekti ir konfigūruoti šį AnythingLLM egzempliorių.",
|
||||
name: {
|
||||
label: "Pavadinimas",
|
||||
placeholder: "Produkcinė integracija",
|
||||
helper:
|
||||
"Neprivaloma. Naudokite aiškų pavadinimą, kad vėliau lengvai atpažintumėte šį raktą.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopijuoti API raktą",
|
||||
copied: "Nukopijuota",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Ar tikrai norite išjungti šį API raktą?\nPo to jo nebebus galima naudoti.\n\nŠio veiksmo atšaukti negalima.",
|
||||
},
|
||||
table: {
|
||||
name: "Pavadinimas",
|
||||
key: "API raktas",
|
||||
by: "Sukūrė",
|
||||
created: "Sukurta",
|
||||
@@ -1136,8 +1462,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Įveskite API žymiklį, kurį gavote iš @BotFather, ir pasirinkite numatytą darbo vietą, kur jūsų bot galės kalbėti.",
|
||||
"bot-token": "„Bot Token“",
|
||||
"default-workspace": "Numatytasis darbo erdvė",
|
||||
"no-workspace": "Nėra laisvų darbo vietų. Bus sukurta nauja.",
|
||||
connecting: "Prisijungiam...",
|
||||
"connect-bot": "„Connect Bot“",
|
||||
},
|
||||
@@ -1178,20 +1502,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "Nepavyko atšalinti vartotojo.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Laikant patvirtinimo",
|
||||
"pending-description":
|
||||
"Naudotojai, laukiantys patvirtinimo. Palyginkite čia pateiktą kodą su tuo, kuris rodomas jų „Telegram“ pokalbyje.",
|
||||
"approved-title": "Įsijungę vartotojai",
|
||||
"approved-description":
|
||||
"Naudotojai, kuriems suteikiama galimybė kalbėti su jūsų botu.",
|
||||
user: "Naudotojas",
|
||||
"pairing-code": "Kombinacijos kodas",
|
||||
"no-pending": "Nėra atidėtų užklausų",
|
||||
"no-approved": "Nėra patvirtintų vartotojų",
|
||||
unknown: "Nenurodytas",
|
||||
approve: "Aptinka",
|
||||
deny: "Atsisakyti",
|
||||
revoke: "Anuliuoti",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -416,6 +416,316 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail savienojums",
|
||||
description:
|
||||
"Ļauj savam pārstāvim interaktīvi strādāt ar Gmail – meklēt e-pastus, lasīt diskusijas, veidot projekte, nosūtīt e-pastus un pārvaldīt savu e-pasta kārtojumu. <a>Izlasiet dokumentāciju</a>.",
|
||||
multiUserWarning:
|
||||
"Gmail integrācija nav pieejama, kad izmantojat vairākus lietotājus, jo tas ir saistīts ar drošības apsvērumiem. Lūdzu, atslēgt vairāku lietotāju režimu, lai izmantotu šo funkciju.",
|
||||
configuration: "Gmail konfigurācija",
|
||||
deploymentId: "Ieraksta ID",
|
||||
deploymentIdHelp:
|
||||
"Jūsu Google Apps Script veidotās web lietojamās lietojamās ID",
|
||||
apiKey: "API atslēga",
|
||||
apiKeyHelp:
|
||||
"API atslēga, ko jūs konfigurējāt savā Google Apps Script instalēšanā.",
|
||||
configurationRequired:
|
||||
'Lūdzu, konfigurējiet "Deployment ID" un API atslēgu, lai aktivizētu Gmail funkcijas.',
|
||||
configured: "Ierobežots",
|
||||
searchSkills: "Meklēšanas prasmes...",
|
||||
noSkillsFound: "Neatrodītas atbilstības jūsu meklējumiem.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Meklē un lasiet e-pastus",
|
||||
description:
|
||||
"Meklējiet un lasiet e-pasta vēstnes no jūsu Gmail ievakā.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Pamatraksti e-pasta vēstījumiem",
|
||||
description: "Izveidot, rediģēt un pārvaldīt e-pasta rakstus",
|
||||
},
|
||||
send: {
|
||||
title: "Sūtiet un atbildiet uz e-pasta vēstījumiem",
|
||||
description:
|
||||
"Nosūtiet e-pasta ziņojus un atbildiet uz diskusiju tēriņiem nekavējoties.",
|
||||
},
|
||||
threads: {
|
||||
title: "Aizgrieziet e-pasta sarunas",
|
||||
description:
|
||||
"Aizvadīt e-pasta sarunas – atzīmēt kā lasītu/neizlasītu, glabāt arhīvā, atrast atkritumos",
|
||||
},
|
||||
account: {
|
||||
title: "Integrācijas statistika",
|
||||
description:
|
||||
"Apspriediet pasta skapja statistiku un konta informāciju.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Meklē e-pastus",
|
||||
description:
|
||||
"Meklēt e-pasta vēstures, izmantojot Gmail meklēšanas sintaksi",
|
||||
},
|
||||
readThread: {
|
||||
title: "Izlasīt tēmu",
|
||||
description: "Izlasiet pilnu e-pasta sarunu, izmantojot ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Izveidot izstrādi",
|
||||
description: "Izveidot jaunu e-pasta rakstu",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Izveidot atbildes projekta",
|
||||
description: "Izveidot atbildes projekta par esošu tematu.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Pārredzētās versijas",
|
||||
description: "Atjaunini esošā e-pasta projekta",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Saņemiet projekta versiju",
|
||||
description: "Atgūt specifisku dokumentu pēc identifikatora",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Pamatdarba projekti",
|
||||
description:
|
||||
"Izveidot sarakstu ar visiem izstrādātajiem e-pasta vēstījumiem",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Dzēst projekta versiju",
|
||||
description: "Dzēst izstrādāto e-pastu",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Nosūtīt projekta versiju",
|
||||
description: "Nosūtiet esošo e-pasta projekta vēstuli",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Sūtiet e-pastu",
|
||||
description: "Sūtiet e-pastu nekavējoties",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Atbildēt uz tēmu",
|
||||
description: "Atbildiet uz e-pasta sarunu nekavējoties",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Reads",
|
||||
description: "Atzīmējiet tēmu kā lasītu.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Mark – neizlasīts",
|
||||
description: "Atzīmējiet tēmu kā neizlasītu.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Aizvest uz atkritumu konteineru",
|
||||
description: "Pārvietojiet tēmu uz atkritumu failu",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arhivs",
|
||||
description: "Saglabāt tēmu",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: 'Pārvietot uz "Ienākošās"',
|
||||
description: "Pārvietojiet tēmu uz e-pasta skatīšanās rindā",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Pasta kastes statistika",
|
||||
description:
|
||||
"Iesaļojiet neskaitītās e-pasta ziņojumu un e-pasta kastes statistikas",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Atsvēdināt e-pasta skatīšanās rindu",
|
||||
description: "Efektīvs veids, kā saņemt e-pastus no Gmail konta",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook savienojums",
|
||||
description:
|
||||
"Ļaujiet savam pārstāvim interaktīvi darboties ar Microsoft Outlook – meklēt e-pasta ziņojus, lasīt diskusijas, veidot projektejus, nosūtīt e-pasta ziņojus un pārvaldīt savu e-pasta skapis, izmantojot Microsoft Graph API. <a>Izlasiet dokumentāciju</a>.",
|
||||
multiUserWarning:
|
||||
'"Outlook integrācija nav pieejama vairāku lietotāju režīmā, lai nodrošinātu drošību. Lūdzu, atgrieziet multilietotāju režīmu, lai izmantotu šo funkciju."',
|
||||
configuration: "Outlook iestatījumu konfigurēšana",
|
||||
authType: "Aģenta veids",
|
||||
authTypeHelp:
|
||||
'Izvēlieties, kādas Microsoft kontu tipus var autentificēt. "Visas kontas" atbalsta gan personiskus, gan darba/skolas kontus. "Tikai personiskie konti" ierobežo izmantošanu tikai ar personiskiem Microsoft kontiem. "Tikai organizācijas konti" ierobežo izmantošanu tikai ar darba/skolas kontiem no konkrēta Azure AD klienta.',
|
||||
authTypeCommon: "Visas kontas (personālās un darba/skolas)",
|
||||
authTypeConsumers: "Personiskas Microsoft kontas tikai",
|
||||
authTypeOrganization:
|
||||
"Tikai organizācijas konti (nepieciešams īpašnieka ID)",
|
||||
clientId: "Pieteikuma (Klienta) ID",
|
||||
clientIdHelp:
|
||||
"Pieteikuma (klienta) ID no jūsu Azure AD lietojamās programmas reģistrācijas",
|
||||
tenantId: "Reģistrācijas numurs (īres lietotājs)",
|
||||
tenantIdHelp:
|
||||
'"Klienta" ID no jūsu Azure AD lietojumprogrammas reģistrācijas. Nepieciešams tikai, ja tiek izmantota tikai organizācijas autentifikācija.',
|
||||
clientSecret: "Klienta slepšvārds",
|
||||
clientSecretHelp:
|
||||
"Klienta slepenas vērtība, kas iegūta no jūsu Azure AD lietojamās programmas reģistrācijas",
|
||||
configurationRequired:
|
||||
"Lūdzu, konfigurējiet klienta ID un klienta sleptu atslēgu, lai iespējotu Outlook funkcijas.",
|
||||
authRequired:
|
||||
"Pirms sākat, saglabājiet savus autentifikācijas datus, un pēc tam veiciet autentifikāciju, lai pabeigtu konfigurēšanu.",
|
||||
authenticateWithMicrosoft: "Autentizējieties ar Microsoft",
|
||||
authenticated: "Izdevīgi sarakstījies ar Microsoft Outlook.",
|
||||
revokeAccess: "Atcel piekļuvi",
|
||||
configured: "Ierādīts",
|
||||
searchSkills: "Meklēšanas prasmes...",
|
||||
noSkillsFound: "Neatrastas atbilstošas prasmes jūsu meklējumiem.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Meklē un lasiet e-pastus",
|
||||
description:
|
||||
"Meklējiet un lasiet e-pasta ziņojus no jūsu Outlook skapis",
|
||||
},
|
||||
drafts: {
|
||||
title: "Pamatraksti e-pasta vēstījumiem",
|
||||
description: "Izveidot, rediģēt un pārvaldīt e-pasta rakstus",
|
||||
},
|
||||
send: {
|
||||
title: "Nosūtīt e-pastus",
|
||||
description:
|
||||
"Sūtiet jaunas e-pasta vēstules vai atbildiet uz saņemtajām vēstnēm nekavējoties.",
|
||||
},
|
||||
account: {
|
||||
title: "Integrācijas statistika",
|
||||
description:
|
||||
"Apskatiet pasta kastes statistiku un konta informāciju.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Atsvērt e-pasta skatīšanās reklāžu",
|
||||
description:
|
||||
"Iegūstiet jaunākos e-pasta ziņojus no jūsu Outlook skapis",
|
||||
},
|
||||
search: {
|
||||
title: "Meklē e-pastus",
|
||||
description:
|
||||
"Meklē e-pasta ziņojus, izmantojot Microsoft meklēšanas sintaksi",
|
||||
},
|
||||
readThread: {
|
||||
title: "Izlasiet sarunu",
|
||||
description: "Izlasiet pilnu e-pasta sarunu",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Izveidot projekta versiju",
|
||||
description:
|
||||
"Izveidot jaunu e-pasta projekta rakstu vai atbildes projektu esošam ziņojumam.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Pēcmājas projekts",
|
||||
description: "Atjaunināt esošo e-pasta projekta",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Izstrādāto variantu saraksts",
|
||||
description:
|
||||
"Izveidot sarakstu ar visiem izstrādātajiem e-pasta vēstījumiem",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Dzēst projekta versiju",
|
||||
description: "Dzēst izstrādāto e-pastu",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Nosūtīt projekta versiju",
|
||||
description: "Nosūtiet esošā e-pasta projekta versiju",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Sūtīt e-pastu",
|
||||
description:
|
||||
"Sūtiet jaunu e-pastu vai atbildiet uz esošu ziņu nekavējoties.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Pasta kastes statistika",
|
||||
description:
|
||||
"Iesaļojiet mapeņu skaitu un e-pasta kontu statistiku.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Kalendāra integrācija",
|
||||
description:
|
||||
"Ļauj savam pārstāvim interaktīvi darboties ar Google Kalendāru – skatīt kalendārus, iegūt pasākumus, izveidot un atjaunot pasākumus, kā arī pārvaldīt reģistrāciju. <a>Lasiet dokumentāciju</a>.",
|
||||
multiUserWarning:
|
||||
"Google Kalendāra integrācija nav pieejama vairāku lietotāju režīmā, lai nodrošinātu drošību. Lūdzu, atgrieziet multilietotāju režīmu, lai izmantotu šo funkciju.",
|
||||
configuration: "Google kalendāra konfigurācija",
|
||||
deploymentId: "Ierīces identifikators",
|
||||
deploymentIdHelp: "Jūsu Google Apps Script veidlapas ID",
|
||||
apiKey: "API atslēga",
|
||||
apiKeyHelp:
|
||||
"API atslēga, ko jūs konfigurējāt savā Google Apps Script instalācijā",
|
||||
configurationRequired:
|
||||
'Lūdzu, konfigurējiet "Deployment ID" un API atslēgu, lai aktivizētu Google Kalendāra funkcijas.',
|
||||
configured: "Ierīkots",
|
||||
searchSkills: "Meklēšanas prasmes...",
|
||||
noSkillsFound: "Neatrodītas atbilstības jūsu meklējumiem.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendāri",
|
||||
description: "Skatiet un pārvaldiet savus Google kalendārus.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Lasīt pasākumus",
|
||||
description: "Skatiet un meklējiet kalendāra notikumus",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Izveidot un atjaunināt pasākumus",
|
||||
description: "Izveidot jaunas pasākumus un mainīt esošos",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Piedalīšanās reģistrācija",
|
||||
description: "Pārvaldiet savu atbildes statusu pasākumiem",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalendāri",
|
||||
description:
|
||||
"Izveidojot sarakstu, norādi visus kalendārus, ko tu īpašoj un uz kuriem esi reģistrējies.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Iegūstiet kalendāra informāciju",
|
||||
description: "Iesaļojiet detalizētus datus par konkrētu kalendāru.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Iegūstiet pasākuma informāciju",
|
||||
description:
|
||||
"Iesaļojiet detalizētu informāciju par konkrētu pasākumu",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Ieskats uz pasākumiem šajā dienā",
|
||||
description:
|
||||
"Ieskaitiet visus pasākumus, kas plānoti konkrētā datumā",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Iegūstiet pasākumus (datu diapazons)",
|
||||
description:
|
||||
"Iegūt pasākumus, kas notiek konkrētā datuma diapazonā",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Uznāciet nākamo pasākumu",
|
||||
description:
|
||||
"Atrodiet pasākumus šodien, šajā nedēļā vai šajā mēnesī, izmantojot vienkāržus atslēvvadus.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Ātri pievienot pasākumu",
|
||||
description:
|
||||
'Izveidot pasākumu, izmantojot dabas valodu (piemēram, "Sanākšana rīt plkst. 15:00")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Izveidot pasākumu",
|
||||
description:
|
||||
"Izveidot jaunu pasākumu, nodrošinot pilnu kontroli pār visām tās īpašībām.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Pasākuma atjauninājums",
|
||||
description: "Atjaunināt esošas kalendāra notikuma informāciju",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Norādiet atbildes statusu",
|
||||
description: "Atzīst, atgrūst vai temporāri apstiprināt pasākumu",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP serveri",
|
||||
@@ -462,6 +772,96 @@ 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",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -572,7 +972,34 @@ const TRANSLATIONS = {
|
||||
"API atslēgas ļauj to īpašniekam programmatiski piekļūt un pārvaldīt šo AnythingLLM instanci.",
|
||||
link: "Lasīt API dokumentāciju",
|
||||
generate: "Ģenerēt jaunu API atslēgu",
|
||||
empty: "API atslēgas nav atrastas",
|
||||
actions: "Darbības",
|
||||
messages: {
|
||||
error: "Kļūda: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Izveidot jaunu API atslēgu",
|
||||
cancel: "Atcelt",
|
||||
close: "Aizvērt",
|
||||
create: "Izveidot API atslēgu",
|
||||
helper:
|
||||
"Pēc izveides API atslēgu var izmantot, lai programmatiski piekļūtu šai AnythingLLM instancei un to konfigurētu.",
|
||||
name: {
|
||||
label: "Nosaukums",
|
||||
placeholder: "Produkcijas integrācija",
|
||||
helper:
|
||||
"Nav obligāti. Izmantojiet saprotamu nosaukumu, lai vēlāk šo atslēgu būtu viegli atpazīt.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopēt API atslēgu",
|
||||
copied: "Nokopēts",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Vai tiešām vēlaties deaktivizēt šo API atslēgu?\nPēc tam to vairs nevarēs izmantot.\n\nŠo darbību nevar atsaukt.",
|
||||
},
|
||||
table: {
|
||||
name: "Nosaukums",
|
||||
key: "API atslēga",
|
||||
by: "Izveidoja",
|
||||
created: "Izveidots",
|
||||
@@ -1142,8 +1569,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1184,20 +1609,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -410,6 +410,315 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail-verbinding",
|
||||
description:
|
||||
"Maak het mogelijk voor uw agent om met Gmail te communiceren: e-mails zoeken, threads lezen, e-mails opstellen, e-mails versturen en uw inbox beheren. <a>Bekijk de documentatie</a>.",
|
||||
multiUserWarning:
|
||||
"De integratie met Gmail is niet beschikbaar in de modus voor meerdere gebruikers, om veiligheidsredenen. Schakel de modus voor meerdere gebruikers uit om deze functie te gebruiken.",
|
||||
configuration: "Gmail-instellingen",
|
||||
deploymentId: "Identificatiecode voor de implementatie",
|
||||
deploymentIdHelp: "De deployment-ID van je Google Apps Script web-app",
|
||||
apiKey: "API-sleutel",
|
||||
apiKeyHelp:
|
||||
"De API-sleutel die u hebt geconfigureerd in uw Google Apps Script-implementatie.",
|
||||
configurationRequired:
|
||||
"Configureer de Deployment ID en de API-sleutel om de Gmail-functionaliteit te activeren.",
|
||||
configured: "Geconfigureerd",
|
||||
searchSkills: "Vaardigheden op het gebied van zoeken...",
|
||||
noSkillsFound: "Geen resultaten die overeenkomen met uw zoekopdracht.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Zoeken en e-mails lezen",
|
||||
description: "Zoek en lees e-mails uit uw Gmail inbox.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Voorbeeld-e-mails",
|
||||
description: "Maak, bewerk en beheer e-mailontwerpen.",
|
||||
},
|
||||
send: {
|
||||
title: "Verzenden en antwoorden op e-mails",
|
||||
description:
|
||||
"Verzend e-mails en reageer direct op discussieberichten.",
|
||||
},
|
||||
threads: {
|
||||
title: "Beheer e-mailconversaties",
|
||||
description:
|
||||
"Beheer e-mailconversaties – markeer als gelezen/niet gelezen, archiveren, verwijderen",
|
||||
},
|
||||
account: {
|
||||
title: "Statistieken over integratie",
|
||||
description:
|
||||
"Bekijk statistieken en accountinformatie van uw e-mail.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Zoek naar e-mails",
|
||||
description:
|
||||
"Zoek naar e-mails met behulp van de zoeksyntax van Gmail.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Lees het gesprek",
|
||||
description: "Lees het volledige e-mailgesprek, gesorteerd op ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Maak een concept",
|
||||
description: "Maak een nieuwe concept-e-mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Maak een concept-antwoord",
|
||||
description: "Maak een concept-antwoord op een bestaand gesprek.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Aanpassen: Ontwerp",
|
||||
description: "Pas een bestaand concept-e-mail aan.",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Bekijk concept",
|
||||
description: "Haal een specifiek ontwerp op, gebaseerd op zijn ID.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Ontwerpen",
|
||||
description: "Maak een lijst van alle concept-e-mails.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Verwijder concept",
|
||||
description: "Verwijder een concept-e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Verzend concept",
|
||||
description: "Verzend een bestaand e-mailconcept.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Stuur e-mail",
|
||||
description: "Stuur onmiddellijk een e-mail.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Reageer op dit gesprek",
|
||||
description: "Reageer onmiddellijk op een e-mailthread.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Markeer een draad als gelezen",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Mark ongelezen",
|
||||
description: "Markeer een bericht als ongelezen.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Verplaatsen naar prullenbak",
|
||||
description: "Verplaats een onderwerp naar de prullenbak",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archief",
|
||||
description: "Een gesprek archiveren",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Verplaats naar inbox",
|
||||
description: "Verplaats een bericht naar de inbox",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistieken van de e-mail inbox",
|
||||
description:
|
||||
"Bekijk het aantal ongelezen berichten en statistieken over uw e-mailbox.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Open de inbox",
|
||||
description:
|
||||
"Een eenvoudige manier om de e-mails in uw inbox van Gmail te bekijken.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook-connector",
|
||||
description:
|
||||
"Laat uw agent in staat zijn om met Microsoft Outlook te communiceren: e-mails zoeken, threads lezen, concepten opstellen, e-mails versturen en uw inbox beheren via de Microsoft Graph API. Raadpleeg de documentatie.",
|
||||
multiUserWarning:
|
||||
"De integratie met Outlook is niet beschikbaar in de modus voor meerdere gebruikers, vanwege veiligheidsoverwegingen. Om deze functie te gebruiken, moet u de modus voor meerdere gebruikers uitschakelen.",
|
||||
configuration: "Outlook-configuratie",
|
||||
authType: "Type account",
|
||||
authTypeHelp:
|
||||
'Kies welke soorten Microsoft-accounts kunnen worden gebruikt voor authenticatie. "Alle accounts" ondersteunt zowel persoonlijke als werk-/schoolaccounts. "Alleen persoonlijke accounts" beperkt zich tot persoonlijke Microsoft-accounts. "Alleen werk-/schoolaccounts" beperkt zich tot werk-/schoolaccounts van een specifieke Azure AD-tenant.',
|
||||
authTypeCommon:
|
||||
"Alle rekeningen (persoonlijke en zakelijke/schoolrekeningen)",
|
||||
authTypeConsumers: "Alleen persoonlijke Microsoft-accounts",
|
||||
authTypeOrganization:
|
||||
"Alleen accounts voor organisaties (vereist Tenant-ID)",
|
||||
clientId: "Toepassings-ID (klant)",
|
||||
clientIdHelp:
|
||||
"De applicatie-ID (ook wel Client ID genoemd) van uw Azure AD-applicatie.",
|
||||
tenantId: "Identificatienummer (huurder)",
|
||||
tenantIdHelp:
|
||||
"De Directory (Tenant) ID uit uw Azure AD-appregistratie. Vereist alleen voor authenticatie binnen een organisatie.",
|
||||
clientSecret: "Geheime sleutel",
|
||||
clientSecretHelp: "De geheime waarde van uw Azure AD-appregistratie",
|
||||
configurationRequired:
|
||||
"Configureer de Client ID en Client Secret om de Outlook-functionaliteit te activeren.",
|
||||
authRequired:
|
||||
"Sla eerst uw gegevens op, en voer vervolgens de authenticatie uit bij Microsoft om het proces te voltooien.",
|
||||
authenticateWithMicrosoft: "Authenticeer met Microsoft",
|
||||
authenticated: "Succesvol verbonden met Microsoft Outlook.",
|
||||
revokeAccess: "Toegang intrekken",
|
||||
configured: "Geconfigureerd",
|
||||
searchSkills: "Vaardigheden op het gebied van zoeken...",
|
||||
noSkillsFound:
|
||||
"Geen overeenkomende vaardigheden zijn gevonden op basis van uw zoekopdracht.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Zoeken en e-mails lezen",
|
||||
description: "Zoek en lees e-mails uit uw Outlook inbox.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Voorbeeld e-mails",
|
||||
description: "Maak, bewerk en beheer e-mailvoorstellen.",
|
||||
},
|
||||
send: {
|
||||
title: "Verzend e-mails",
|
||||
description:
|
||||
"Verzend nieuwe e-mails of reageer onmiddellijk op berichten.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistieken over integratie",
|
||||
description:
|
||||
"Bekijk statistieken en accountinformatie van uw e-mail.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Open de inbox",
|
||||
description: "Bekijk recente e-mails uit uw Outlook inbox.",
|
||||
},
|
||||
search: {
|
||||
title: "Zoeken in e-mails",
|
||||
description:
|
||||
"Zoek naar e-mails met behulp van de syntax van Microsoft Search",
|
||||
},
|
||||
readThread: {
|
||||
title: "Lees het gesprek",
|
||||
description: "Lees het volledige e-mailgesprek",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Maak een concept",
|
||||
description:
|
||||
"Maak een nieuwe concept-e-mail of een concept-antwoord op een bestaande bericht.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versie",
|
||||
description: "Pas een bestaand concept e-mail aan",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Ontwerpen",
|
||||
description: "Maak een lijst van alle concept-e-mails.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Verwijder concept",
|
||||
description: "Verwijder een concept-e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Verzend concept",
|
||||
description: "Verzend een bestaand e-mailontwerp.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Stuur e-mail",
|
||||
description:
|
||||
"Verzend een nieuw e-mail of reageer direct op een bestaande bericht.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistieken van de e-mailbox",
|
||||
description: "Haal de aantallen mappen en mailbox-statistieken op.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Kalender-connector",
|
||||
description:
|
||||
"Maak het mogelijk voor uw agent om met Google Kalender te communiceren: kalenders bekijken, evenementen bekijken, evenementen aanmaken en bijwerken, en RSVP's beheren. <a>Lees de documentatie</a>.",
|
||||
multiUserWarning:
|
||||
"De integratie met Google Kalender is niet beschikbaar in de modus met meerdere gebruikers, vanwege beveiligingsredenen. Om deze functie te gebruiken, dient u de modus met meerdere gebruikers uit te schakelen.",
|
||||
configuration: "Google Kalender instellingen",
|
||||
deploymentId: "Identificatiecode voor de implementatie",
|
||||
deploymentIdHelp: "De deployment-ID van uw Google Apps Script web-app",
|
||||
apiKey: "API-sleutel",
|
||||
apiKeyHelp:
|
||||
"De API-sleutel die u heeft geconfigureerd in uw Google Apps Script-implementatie.",
|
||||
configurationRequired:
|
||||
"Configureer de Deployment ID en de API-sleutel om de Google Calendar-functionaliteit te activeren.",
|
||||
configured: "Geconfigureerd",
|
||||
searchSkills: "Vaardigheden op het gebied van zoeken...",
|
||||
noSkillsFound:
|
||||
"Geen resultaten gevonden die overeenkomen met uw zoekopdracht.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalenders",
|
||||
description: "Bekijk en beheer uw Google-agenda's",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Bekijk evenementen",
|
||||
description: "Bekijk en zoek naar evenementen in de agenda",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Maak en update evenementen",
|
||||
description:
|
||||
"Creëer nieuwe evenementen en wijzig bestaande evenementen.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Beheer van RSVP-verzoeken",
|
||||
description: "Beheer de status van uw reacties voor evenementen",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Agenda's",
|
||||
description:
|
||||
"Maak een lijst van alle kalenders die u bezit of waarvoor u een abonnement heeft.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Bekijk de details van de agenda",
|
||||
description:
|
||||
"Vind gedetailleerde informatie over een specifieke kalender.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Evenement bekijken",
|
||||
description:
|
||||
"Vind gedetailleerde informatie over een specifiek evenement.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Zoek naar evenementen voor de dag",
|
||||
description:
|
||||
"Bekijk alle evenementen die gepland staan voor een specifieke dag.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Evenementen (tijdsperiode)",
|
||||
description:
|
||||
"Haal evenementen op binnen een aangepaste datumschaal",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Bekijk aankomende evenementen",
|
||||
description:
|
||||
"Zoek evenementen voor vandaag, deze week of deze maand met behulp van eenvoudige zoekwoorden.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Snel evenement toevoegen",
|
||||
description:
|
||||
"Maak een evenement op basis van natuurlijke taal (bijvoorbeeld: 'Ontmoeting morgen om 15:00 uur')",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Evenement aanmaken",
|
||||
description:
|
||||
"Maak een nieuw evenement en beschik over volledige controle over alle instellingen.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Nieuwsupdate",
|
||||
description: "Wijzig een bestaand evenement in uw agenda",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Status van reactie bevestigd",
|
||||
description:
|
||||
"Accepteer, weiger of geef een voorlopige bevestiging van een evenement",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP-servers",
|
||||
@@ -456,6 +765,95 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -478,7 +876,34 @@ const TRANSLATIONS = {
|
||||
"API-sleutels stellen de houder in staat om deze AnythingLLM-instantie programmatisch te openen en beheren.",
|
||||
link: "Lees de API-documentatie",
|
||||
generate: "Genereer Nieuwe API-sleutel",
|
||||
empty: "Geen API-sleutels gevonden",
|
||||
actions: "Acties",
|
||||
messages: {
|
||||
error: "Fout: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Nieuwe API-sleutel maken",
|
||||
cancel: "Annuleren",
|
||||
close: "Sluiten",
|
||||
create: "API-sleutel maken",
|
||||
helper:
|
||||
"Na het aanmaken kan de API-sleutel worden gebruikt om programmatisch toegang te krijgen tot deze AnythingLLM-instantie en deze te configureren.",
|
||||
name: {
|
||||
label: "Naam",
|
||||
placeholder: "Productie-integratie",
|
||||
helper:
|
||||
"Optioneel. Gebruik een duidelijke naam zodat je deze sleutel later makkelijk kunt herkennen.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "API-sleutel kopiëren",
|
||||
copied: "Gekopieerd",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Weet je zeker dat je deze API-sleutel wilt uitschakelen?\nDaarna kan deze niet meer worden gebruikt.\n\nDeze actie kan niet ongedaan worden gemaakt.",
|
||||
},
|
||||
table: {
|
||||
name: "Naam",
|
||||
key: "API-sleutel",
|
||||
by: "Aangemaakt Door",
|
||||
created: "Aangemaakt",
|
||||
@@ -1142,9 +1567,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1187,20 +1609,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -417,6 +417,323 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Połączenie z GMail",
|
||||
description:
|
||||
"Pozwól swojemu agentowi na interakcję z Gmail – wyszukiwanie wiadomości e-mail, czytanie wątków, tworzenie projektów, wysyłanie wiadomości e-mail oraz zarządzanie skrzynką odbiorczą. <a>Przeczytaj dokumentację</a>.",
|
||||
multiUserWarning:
|
||||
"Integracja z Gmailem nie jest dostępna w trybie wieloosobowym z powodów bezpieczeństwa. Aby korzystać z tej funkcji, należy wyłączyć tryb wieloosobowy.",
|
||||
configuration: "Konfiguracja Gmaila",
|
||||
deploymentId: "Identyfikator wdrażania",
|
||||
deploymentIdHelp:
|
||||
"ID aplikacji webowej z Google Apps Script, której używasz",
|
||||
apiKey: "Klucz API",
|
||||
apiKeyHelp:
|
||||
"Klucz API, który skonfigurowałeś w swoim projekcie Google Apps Script",
|
||||
configurationRequired:
|
||||
"Prosimy o skonfigurowanie identyfikatora wdrażania i klucza API, aby włączyć funkcje związane z Gmail.",
|
||||
configured: "Skonfigurowany",
|
||||
searchSkills: "Umiejętności wyszukiwania...",
|
||||
noSkillsFound:
|
||||
"Nie znaleziono żadnych kandydatów, którzy spełniałyby Twoje kryteria.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Wyszukaj i przeczytaj wiadomości e-mail",
|
||||
description:
|
||||
"Wyszukaj i przeczytaj e-maile z swojej skrzynki odbiorczej Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Proponowane wiadomości e-mail",
|
||||
description: "Twórz, edytuj i zarządzaj wersjami e-maili.",
|
||||
},
|
||||
send: {
|
||||
title: "Wysyłanie i odpowiadanie na e-maile",
|
||||
description:
|
||||
"Wysyłaj e-maile i odpowiadaj na dyskusje natychmiast.",
|
||||
},
|
||||
threads: {
|
||||
title: "Zarządzaj wątkami wiadomości e-mail",
|
||||
description:
|
||||
"Zarządzaj wątkami e-maili – oznaczaj jako przeczytane/nieprzeczytane, archiwizuj, usuwaj",
|
||||
},
|
||||
account: {
|
||||
title: "Statystyki dotyczące integracji",
|
||||
description:
|
||||
"Przejrzyj statystyki skrzynki pocztowej oraz informacje dotyczące konta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Wyszukaj wiadomości",
|
||||
description:
|
||||
"Wyszukaj wiadomości e-mail, używając składni zapytań w Gmail.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Przeczytaj wątek",
|
||||
description:
|
||||
"Przeczytaj pełną sekcję korespondencji e-mail według identyfikatora.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Utwórz wersję roboczą",
|
||||
description: "Utwórz nowy projekt wiadomości e-mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Stwórz wersję odpowiedzi",
|
||||
description: "Stwórz wstępną odpowiedź do istniejącego wątku.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Aktualizacja wersji roboczej",
|
||||
description: "Zaktualizuj istniejący projekt e-maila",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Otrzymaj wersję roboczą",
|
||||
description:
|
||||
"Pobierz konkretny wers dokumentu po jego identyfikatorze.",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Proponowane wersje",
|
||||
description: "Wyświetl wszystkie wersje e-maili.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Usuń wersję roboczą",
|
||||
description: "Usuń wersję roboczą wiadomości e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Wyślij wersję roboczą",
|
||||
description: "Wyślij istniejący projekt wiadomości e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Wyślij e-mail",
|
||||
description: "Wyślij e-mail natychmiast",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Odpowiedź na wątek",
|
||||
description: "Odpowiedz na wątek wiadomości e-mail natychmiast",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Oznacz wątek jako przeczytany",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Oznacz jako nieprzeczytane",
|
||||
description: "Oznacz wątek jako nieprzeczytany",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Przenieś do kosza",
|
||||
description: "Przenieś wątek do kosza",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Archiwum",
|
||||
description: "Zarchiwizuj wątek",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: 'Przenieś do folderu "Otrzymane"',
|
||||
description: "Przenieś wątek do folderu „Ostatnie wiadomości”",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statystyki skrzynki pocztowej",
|
||||
description:
|
||||
"Uzyskaj informacje o liczbie nieprzeczytanych wiadomości oraz statystyki dotyczące skrzynki pocztowej.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Otwórz skrzynkę odbiorczą",
|
||||
description:
|
||||
"Sprawne rozwiązanie, dzięki któremu można łatwo pobierać wiadomości z skrzynki odbiorczej z Gmaila.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Łącznik Outlook",
|
||||
description:
|
||||
"Pozwól swojemu agentowi na interakcję z Microsoft Outlook – wyszukiwanie wiadomości e-mail, czytanie wątków, tworzenie projektów, wysyłanie wiadomości e-mail oraz zarządzanie skrzynką odbiorczą za pomocą Microsoft Graph API. <a>Przeczytaj dokumentację</a>.",
|
||||
multiUserWarning:
|
||||
"Integracja z Outlookiem nie jest dostępna w trybie wieloosobowym z powodów bezpieczeństwa. Aby skorzystać z tej funkcji, należy wyłączyć tryb wieloosobowy.",
|
||||
configuration: "Konfiguracja Outlooka",
|
||||
authType: "Typ konta",
|
||||
authTypeHelp:
|
||||
"Wybierz, które typy kont Microsoft mogą być używane do logowania. Opcja „Wszystkie konta” obsługuje zarówno konta osobiste, jak i konta związane z pracą/szkołą. Opcja „Tylko konta osobiste” ogranicza się do kont Microsoft stworzonych przez użytkowników. Opcja „Tylko konta organizacji” ogranicza się do kont z określonego tenanta Azure AD.",
|
||||
authTypeCommon: "Wszystkie konta (osobiste i związane z pracą/szkołą)",
|
||||
authTypeConsumers:
|
||||
"Tylko konta Microsoft dla pojedynczych użytkowników.",
|
||||
authTypeOrganization:
|
||||
"Konta tylko dla organizacji (wymaga identyfikatora najemcy)",
|
||||
clientId: "Identyfikator klienta (zwrócony przez aplikację)",
|
||||
clientIdHelp:
|
||||
"Identyfikator aplikacji (klienta) z rejestracji w Azure AD",
|
||||
tenantId: "Identyfikator (osoby wynajmującej)",
|
||||
tenantIdHelp:
|
||||
"Identyfikator (dla najemcy) z rejestracji aplikacji w Azure AD. Wymagany tylko w przypadku uwierzytelniania tylko dla danej organizacji.",
|
||||
clientSecret: "Klucz API",
|
||||
clientSecretHelp:
|
||||
"Wartość klienta, którą podali podczas rejestracji aplikacji w Azure AD",
|
||||
configurationRequired:
|
||||
"Prosimy o skonfigurowanie identyfikatora klienta i sekretu klienta, aby włączyć funkcje Outlook.",
|
||||
authRequired:
|
||||
"Najpierw zapisz swoje dane, a następnie zaloguj się przez Microsoft, aby dokończyć konfigurację.",
|
||||
authenticateWithMicrosoft: "Zaloguj się przy użyciu konta Microsoft",
|
||||
authenticated: "Pomyślnie uwierzytelniono w Microsoft Outlook.",
|
||||
revokeAccess: "Wydać uprawnienia",
|
||||
configured: "Skonfigurowany",
|
||||
searchSkills: "Umiejętności wyszukiwania...",
|
||||
noSkillsFound:
|
||||
"Nie znaleziono żadnych kandydatów, którzy spełniałyby Twoje kryteria.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Wyszukaj i przeczytaj wiadomości e-mail",
|
||||
description: "Wyszukuj i czytaj e-maile z swojej poczty Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Proponowane wiadomości e-mail",
|
||||
description: "Twórz, edytuj i zarządzaj wersjami e-maili.",
|
||||
},
|
||||
send: {
|
||||
title: "Wysyłaj e-maile",
|
||||
description:
|
||||
"Wysyłaj nowe wiadomości e-mail lub odpowiadaj na wiadomości natychmiast.",
|
||||
},
|
||||
account: {
|
||||
title: "Statystyki dotyczące integracji",
|
||||
description:
|
||||
"Przejrzyj statystyki skrzynki pocztowej oraz informacje dotyczące konta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Otwórz skrzynkę odbiorczą",
|
||||
description:
|
||||
"Otrzymuj najnowsze wiadomości e-mail ze swojej poczty Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Wyszukaj wiadomości",
|
||||
description:
|
||||
"Wyszukuj wiadomości e-mail, używając składni wyszukiwania Microsoft",
|
||||
},
|
||||
readThread: {
|
||||
title: "Przeczytaj rozmowę",
|
||||
description: "Przeczytaj pełną korespondencję mailową.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Stwórz wersję roboczą",
|
||||
description:
|
||||
"Utwórz nowy projekt wiadomości e-mail lub zaproponowany odpowiedź na istniejącą wiadomość.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Aktualizacja wersji roboczej",
|
||||
description: "Zaktualizuj istniejący projekt wiadomości e-mail",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Proponowane wersje",
|
||||
description:
|
||||
"Wyświetl wszystkie wersje e-maili w trakcie tworzenia.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Usuń wersję roboczą",
|
||||
description: "Usuń wersję roboczą wiadomości e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Wyślij wersję roboczą",
|
||||
description: "Wyślij istniejący projekt wiadomości e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Wyślij e-mail",
|
||||
description:
|
||||
"Wyślij nową wiadomość e-mail lub odpowiedz na istniejącą wiadomość natychmiast.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statystyki skrzynki pocztowej",
|
||||
description:
|
||||
"Uzyskaj liczbę folderów oraz statystyki dotyczące skrzynki pocztowej.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Łącznik do Google Kalendarza",
|
||||
description:
|
||||
"Pozwól swojemu agentowi na interakcję z Google Calendar – przeglądaj kalendarze, sprawdzaj wydarzenia, twórz i aktualizuj wydarzenia oraz zarządzaj potwierdzeniami obecności. <a>Przeczytaj dokumentację</a>.",
|
||||
multiUserWarning:
|
||||
"Integracja z Google Calendar nie jest dostępna w trybie wieloosobowym z powodów bezpieczeństwa. Aby korzystać z tej funkcji, należy wyłączyć tryb wieloosobowy.",
|
||||
configuration: "Konfiguracja kalendarza Google",
|
||||
deploymentId: "Identyfikator wdrożenia",
|
||||
deploymentIdHelp:
|
||||
"ID aplikacji webowej z Google Apps Script, której używasz.",
|
||||
apiKey: "Klucz API",
|
||||
apiKeyHelp:
|
||||
"Klucz API, który skonfigurowałeś w swoim projekcie Google Apps Script",
|
||||
configurationRequired:
|
||||
"Prosimy o skonfigurowanie ID wdrażania i klucza API, aby włączyć funkcje związane z Google Calendar.",
|
||||
configured: "Skonfigurowane",
|
||||
searchSkills: "Umiejętności wyszukiwania...",
|
||||
noSkillsFound:
|
||||
"Nie znaleziono żadnych kandydatów, którzy spełniałyby Twoje kryteria.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Kalendarze",
|
||||
description: "Przeglądaj i zarządzaj swoimi kalendarzami Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Sprawdź wydarzenia",
|
||||
description: "Przeglądaj i wyszukuj wydarzenia w kalendarzu",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Tworzenie i aktualizacja wydarzeń",
|
||||
description: "Twórz nowe wydarzenia i modyfikuj istniejące.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Zarządzanie rezerwacjami",
|
||||
description: "Zarządzaj statusem odpowiedzi dla wydarzeń",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Kalendarze",
|
||||
description:
|
||||
"Wypisz wszystkie kalendarze, które posiadasz lub do których subskrybujesz.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Uzyskaj szczegółowe informacje o kalendarzu",
|
||||
description:
|
||||
"Uzyskaj szczegółowe informacje na temat konkretnego kalendarza.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Uzyskaj informacje o wydarzeniu",
|
||||
description:
|
||||
"Uzyskaj szczegółowe informacje na temat konkretnego wydarzenia",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Sprawdź wydarzenia na dany dzień",
|
||||
description:
|
||||
"Pobierz wszystkie wydarzenia zaplanowane na konkretny dzień.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Wyszukaj wydarzenia (zakres dat)",
|
||||
description: "Pobierz wydarzenia w określonym przedziale dat.",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Sprawdź nadchodzące wydarzenia",
|
||||
description:
|
||||
"Znajdź wydarzenia na dzisiaj, w tym tygodniu lub w tym miesiącu, używając prostych słów kluczowych.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Szybkie dodanie wydarzenia",
|
||||
description:
|
||||
"Utwórz wydarzenie na podstawie opisu w języku naturalnym (np. „Spotkanie jutro o 15:00”)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Utwórz wydarzenie",
|
||||
description:
|
||||
"Utwórz nowe wydarzenie, mając pełną kontrolę nad wszystkimi jego właściwościami.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Aktualizacja wydarzenia",
|
||||
description: "Zaktualizuj istniejącą wydarzenie w kalendarzu",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Ustaw status odpowiedzi",
|
||||
description:
|
||||
"Przyjęć, odrzucić lub wyrazić wstępne zainteresowanie udziałem w wydarzeniu",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Serwery MCP",
|
||||
@@ -463,6 +780,96 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -573,7 +980,34 @@ const TRANSLATIONS = {
|
||||
"Klucze API umożliwiają dostęp do instancji AnythingLLM i zarządzanie nią.",
|
||||
link: "Przeczytaj dokumentację API",
|
||||
generate: "Generuj nowy klucz API",
|
||||
empty: "Nie znaleziono kluczy API",
|
||||
actions: "Akcje",
|
||||
messages: {
|
||||
error: "Błąd: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Utwórz nowy klucz API",
|
||||
cancel: "Anuluj",
|
||||
close: "Zamknij",
|
||||
create: "Utwórz klucz API",
|
||||
helper:
|
||||
"Po utworzeniu klucz API może być używany do programowego dostępu do tej instancji AnythingLLM i jej konfiguracji.",
|
||||
name: {
|
||||
label: "Nazwa",
|
||||
placeholder: "Integracja produkcyjna",
|
||||
helper:
|
||||
"Opcjonalne. Użyj przyjaznej nazwy, aby później łatwo rozpoznać ten klucz.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Kopiuj klucz API",
|
||||
copied: "Skopiowano",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Czy na pewno chcesz dezaktywować ten klucz API?\nPo tej operacji nie będzie już można go używać.\n\nTej akcji nie można cofnąć.",
|
||||
},
|
||||
table: {
|
||||
name: "Nazwa",
|
||||
key: "Klucz API",
|
||||
by: "Utworzony przez",
|
||||
created: "Utworzony o",
|
||||
@@ -1139,9 +1573,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1182,20 +1613,9 @@ const TRANSLATIONS = {
|
||||
"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ć",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -415,6 +415,321 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Conector do GMail",
|
||||
description:
|
||||
"Permita que seu agente interaja com o Gmail – pesquise e-mails, leia conversas, crie rascunhos, envie e-mails e gerencie sua caixa de entrada. <a>Consulte a documentação</a>.",
|
||||
multiUserWarning:
|
||||
"A integração com o Gmail não está disponível no modo multiusuário, por razões de segurança. Por favor, desative o modo multiusuário para utilizar esta funcionalidade.",
|
||||
configuration: "Configuração do Gmail",
|
||||
deploymentId: "ID de implantação",
|
||||
deploymentIdHelp:
|
||||
"O ID de implantação da sua aplicação web do Google Apps Script",
|
||||
apiKey: "Chave de API",
|
||||
apiKeyHelp:
|
||||
"A chave de API que você configurou no seu projeto Google Apps Script",
|
||||
configurationRequired:
|
||||
"Por favor, configure o ID de Implantação e a Chave de API para habilitar as funcionalidades do Gmail.",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de pesquisa...",
|
||||
noSkillsFound:
|
||||
"Não encontramos nenhum resultado que corresponda à sua pesquisa.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Pesquisar e ler e-mails",
|
||||
description:
|
||||
"Pesquise e leia e-mails da sua caixa de entrada do Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Rascunhos de e-mails",
|
||||
description: "Crie, edite e gerencie rascunhos de e-mails.",
|
||||
},
|
||||
send: {
|
||||
title: "Enviar e responder a e-mails",
|
||||
description: "Envie e-mails e responda a discussões imediatamente.",
|
||||
},
|
||||
threads: {
|
||||
title: "Gerenciar Fios de E-mail",
|
||||
description:
|
||||
"Gerenciar threads de e-mail: marcar como lido/não lido, arquivar, excluir.",
|
||||
},
|
||||
account: {
|
||||
title: "Estatísticas de integração",
|
||||
description:
|
||||
"Visualize estatísticas da caixa de correio e informações da conta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Pesquisar e-mails",
|
||||
description:
|
||||
"Pesquise e-mails usando a sintaxe de consulta do Gmail.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leia a discussão",
|
||||
description: "Leia toda a sequência de e-mails por ID.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Criar rascunho",
|
||||
description: "Crie uma nova versão do e-mail.",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Criar resposta preliminar",
|
||||
description:
|
||||
"Crie uma resposta preliminar a um tópico já existente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versão atualizada",
|
||||
description: "Atualizar um rascunho de e-mail existente",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Obter rascunho",
|
||||
description: "Recuperar uma versão específica por ID",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Rascunhos",
|
||||
description: "Liste todos os e-mails em rascunho.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Excluir rascunho",
|
||||
description: "Excluir um rascunho de e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Enviar rascunho",
|
||||
description: "Envie uma versão prévia de um e-mail existente.",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Enviar e-mail",
|
||||
description: "Envie um e-mail imediatamente.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Responder à discussão",
|
||||
description:
|
||||
"Responder a uma discussão por e-mail o mais rápido possível.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Marque um tópico como lido",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Marcar como não lido",
|
||||
description: "Marque um tópico como não lido",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Mover para a lixeira",
|
||||
description: "Mover um tópico para a lixeira",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arquivo",
|
||||
description: "Arquivar um tópico",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Mover para a caixa de entrada",
|
||||
description: "Mova a discussão para a caixa de entrada",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Estatísticas da caixa de correio",
|
||||
description:
|
||||
"Obtenha o número de e-mails não lidos e estatísticas da caixa de correio.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Acessar a caixa de entrada",
|
||||
description:
|
||||
"Uma maneira eficiente de acessar os e-mails na caixa de entrada do Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Conector do Outlook",
|
||||
description:
|
||||
"Permita que seu agente interaja com o Microsoft Outlook: pesquise e-mails, leia conversas, crie rascunhos, envie e-mails e gerencie sua caixa de entrada através da API Microsoft Graph. <a>Leia a documentação</a>.",
|
||||
multiUserWarning:
|
||||
"A integração com o Outlook não está disponível no modo multiusuário, por razões de segurança. Por favor, desative o modo multiusuário para utilizar esta funcionalidade.",
|
||||
configuration: "Configuração do Outlook",
|
||||
authType: "Tipo de conta",
|
||||
authTypeHelp:
|
||||
'Selecione quais tipos de contas Microsoft podem ser autenticadas. "Todas as contas" suporta tanto contas pessoais quanto contas de trabalho/escola. "Apenas contas pessoais" restringe a contas Microsoft pessoais. "Apenas contas de organização" restringe a contas de trabalho/escola de um tenant específico do Azure AD.',
|
||||
authTypeCommon: "Todas as contas (pessoais e de trabalho/escola)",
|
||||
authTypeConsumers: "Contas pessoais da Microsoft",
|
||||
authTypeOrganization: "Contas de organizações (requer ID do inquilino)",
|
||||
clientId: "Identificador do Cliente",
|
||||
clientIdHelp:
|
||||
"O ID da aplicação (cliente) do seu registo de aplicação no Azure AD",
|
||||
tenantId: "ID do Inquilino",
|
||||
tenantIdHelp:
|
||||
"O ID do diretório (do inquilino) da sua aplicação no Azure AD. É necessário apenas para a autenticação dentro de uma única organização.",
|
||||
clientSecret: "Chave Secreta do Cliente",
|
||||
clientSecretHelp:
|
||||
"O valor secreto do cliente da sua aplicação registada no Azure AD",
|
||||
configurationRequired:
|
||||
"Por favor, configure o ID do Cliente e o Segredo do Cliente para habilitar as funcionalidades do Outlook.",
|
||||
authRequired:
|
||||
"Primeiro, salve suas credenciais, e então autentique-se com a Microsoft para concluir a configuração.",
|
||||
authenticateWithMicrosoft: "Autentique-se com a Microsoft",
|
||||
authenticated: "Autenticação bem-sucedida com o Microsoft Outlook.",
|
||||
revokeAccess: "Revogar o acesso",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de pesquisa...",
|
||||
noSkillsFound:
|
||||
"Não encontramos nenhuma correspondência com os seus critérios de pesquisa.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Pesquisar e ler e-mails",
|
||||
description:
|
||||
"Pesquise e leia e-mails da sua caixa de entrada do Outlook.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Rascunhos de e-mails",
|
||||
description: "Crie, edite e gerencie rascunhos de e-mails.",
|
||||
},
|
||||
send: {
|
||||
title: "Enviar e-mails",
|
||||
description:
|
||||
"Envie novos e-mails ou responda às mensagens imediatamente.",
|
||||
},
|
||||
account: {
|
||||
title: "Estatísticas de integração",
|
||||
description:
|
||||
"Visualize estatísticas da caixa de correio e informações da conta.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Acesse a caixa de entrada",
|
||||
description:
|
||||
"Acesse e-mails recentes da sua caixa de entrada do Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Pesquisar e-mails",
|
||||
description:
|
||||
"Pesquise e-mails usando a sintaxe de pesquisa do Microsoft.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Leia a conversa",
|
||||
description: "Leia toda a sequência de e-mails.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Criar rascunho",
|
||||
description:
|
||||
"Crie um novo rascunho de e-mail ou um rascunho de resposta a uma mensagem existente.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Versão atualizada",
|
||||
description: "Atualizar um rascunho de e-mail existente",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Rascunhos",
|
||||
description: "Liste todos os e-mails em rascunho.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Excluir rascunho",
|
||||
description: "Excluir uma versão preliminar de um e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Enviar rascunho",
|
||||
description: "Envie uma versão prévia de um e-mail existente",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Enviar e-mail",
|
||||
description:
|
||||
"Envie um novo e-mail ou responda a uma mensagem existente imediatamente.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Estatísticas da caixa de correio",
|
||||
description:
|
||||
"Obtenha o número de pastas e estatísticas da caixa de correio.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Conector do Google Calendar",
|
||||
description:
|
||||
"Permita que seu agente interaja com o Google Agenda – visualize agendas, obter eventos, criar e atualizar eventos, e gerenciar confirmações de presença. <a>Leia a documentação</a>.",
|
||||
multiUserWarning:
|
||||
"A integração com o Google Calendar não está disponível no modo multiusuário, por razões de segurança. Por favor, desative o modo multiusuário para utilizar esta funcionalidade.",
|
||||
configuration: "Configuração do Google Agenda",
|
||||
deploymentId: "ID de implantação",
|
||||
deploymentIdHelp:
|
||||
"O ID de implantação da sua aplicação web do Google Apps Script",
|
||||
apiKey: "Chave de API",
|
||||
apiKeyHelp:
|
||||
"A chave de API que você configurou no seu projeto Google Apps Script",
|
||||
configurationRequired:
|
||||
"Por favor, configure o ID de Implantação e a Chave de API para habilitar as funcionalidades do Google Calendar.",
|
||||
configured: "Configurado",
|
||||
searchSkills: "Habilidades de pesquisa...",
|
||||
noSkillsFound:
|
||||
"Não encontramos nenhum resultado que corresponda à sua pesquisa.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendários",
|
||||
description: "Visualize e gerencie seus calendários do Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Ver eventos",
|
||||
description: "Visualize e pesquise eventos no calendário",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Criar e atualizar eventos",
|
||||
description: "Crie novos eventos e modifique os existentes.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Gerenciamento de confirmações de presença",
|
||||
description: "Gerencie o status da sua resposta para eventos.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Listar calendários",
|
||||
description:
|
||||
"Liste todos os calendários que você possui ou aos quais está inscrito.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Obtenha detalhes do calendário",
|
||||
description:
|
||||
"Obtenha informações detalhadas sobre um calendário específico.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Obtenha informações sobre o evento",
|
||||
description:
|
||||
"Obtenha informações detalhadas sobre um evento específico.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Encontre eventos para o dia",
|
||||
description:
|
||||
"Obtenha todos os eventos agendados para uma data específica.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Obter eventos (período de tempo)",
|
||||
description:
|
||||
"Obtenha eventos dentro de um intervalo de datas personalizado.",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Veja os próximos eventos",
|
||||
description:
|
||||
"Encontre eventos para hoje, esta semana ou este mês utilizando palavras-chave simples.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Adicionar evento rapidamente",
|
||||
description:
|
||||
'Criar um evento a partir de linguagem natural (por exemplo, "Reunião amanhã às 15h")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Criar evento",
|
||||
description:
|
||||
"Crie um novo evento com controle total sobre todas as propriedades.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Atualização do evento",
|
||||
description: "Atualizar um evento existente no calendário",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Definir o status de confirmação de presença",
|
||||
description:
|
||||
"Aceitar, recusar ou aceitar provisoriamente um evento.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servidores MCP",
|
||||
@@ -462,6 +777,95 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -565,10 +969,37 @@ const TRANSLATIONS = {
|
||||
description: "Chaves API permitem acesso programático a esta instância.",
|
||||
link: "Leia a documentação da API",
|
||||
generate: "Gerar Nova Chave",
|
||||
empty: "Nenhuma chave de API encontrada",
|
||||
actions: "Ações",
|
||||
messages: {
|
||||
error: "Erro: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Criar nova chave de API",
|
||||
cancel: "Cancelar",
|
||||
close: "Fechar",
|
||||
create: "Criar chave de API",
|
||||
helper:
|
||||
"Depois de criada, a chave de API pode ser usada para acessar e configurar esta instância do AnythingLLM programaticamente.",
|
||||
name: {
|
||||
label: "Nome",
|
||||
placeholder: "Integração de produção",
|
||||
helper:
|
||||
"Opcional. Use um nome amigável para identificar esta chave depois.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copiar chave de API",
|
||||
copied: "Copiado",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Tem certeza de que deseja desativar esta chave de API?\nDepois disso ela não poderá mais ser usada.\n\nEsta ação é irreversível.",
|
||||
},
|
||||
table: {
|
||||
name: "Nome",
|
||||
key: "Chave API",
|
||||
by: "Criado Por",
|
||||
created: "Criado Em",
|
||||
by: "Criada Por",
|
||||
created: "Criada Em",
|
||||
},
|
||||
},
|
||||
llm: {
|
||||
@@ -1116,9 +1547,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1158,20 +1586,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -38,6 +38,7 @@ import Polish from "./pl/common.js";
|
||||
import Romanian from "./ro/common.js";
|
||||
import Czech from "./cs/common.js";
|
||||
import Lithuanian from "./lt/common.js";
|
||||
import Catalan from "./ca/common.js";
|
||||
|
||||
export const defaultNS = "common";
|
||||
export const resources = {
|
||||
@@ -113,4 +114,7 @@ export const resources = {
|
||||
lt: {
|
||||
common: Lithuanian,
|
||||
},
|
||||
ca: {
|
||||
common: Catalan,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -866,6 +866,322 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Conectorul GMail",
|
||||
description:
|
||||
"Permite-i agentului tău să interacționeze cu Gmail: caută e-mailuri, citește conversații, redactează proiecte, trimite e-mailuri și gestionează folderul tău de e-mail. Consultă documentația disponibilă aici.",
|
||||
multiUserWarning:
|
||||
"Integrarea cu Gmail nu este disponibilă în modul multi-utilizator, din motive de securitate. Vă rugăm să dezactivați modul multi-utilizator pentru a utiliza această funcție.",
|
||||
configuration: "Configurarea contului Gmail",
|
||||
deploymentId: "Identificator de implementare",
|
||||
deploymentIdHelp:
|
||||
"ID-ul de implementare al aplicației web Google Apps Script",
|
||||
apiKey: "Cheie API",
|
||||
apiKeyHelp:
|
||||
"Cheia API pe care ați configurat în mediul de implementare Google Apps Script",
|
||||
configurationRequired:
|
||||
"Vă rugăm să configurați ID-ul de implementare și cheia API pentru a activa funcționalitățile Gmail.",
|
||||
configured: "Configurat",
|
||||
searchSkills: "Abilități de căutare...",
|
||||
noSkillsFound:
|
||||
"Nu s-au găsit rezultate care să corespundă criteriilor dumneavoastră de căutare.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Căutați și citiți e-mailuri",
|
||||
description:
|
||||
"Căutați și citiți e-mailuri din folderul dumneavoastră Gmail",
|
||||
},
|
||||
drafts: {
|
||||
title: "Propuneri de e-mail",
|
||||
description: "Creați, editați și gestionați schițele de e-mail.",
|
||||
},
|
||||
send: {
|
||||
title: "Trimite și răspunde la e-mailuri",
|
||||
description: "Trimite e-mailuri și răspunde imediat la discuții",
|
||||
},
|
||||
threads: {
|
||||
title: "Gestionați conversațiile prin e-mail",
|
||||
description:
|
||||
"Gestionați corespondența prin e-mail: marcați ca fiind citite/nepuse în evidență, arhivați, eliminați",
|
||||
},
|
||||
account: {
|
||||
title: "Statistici privind integrarea",
|
||||
description:
|
||||
"Vizualizați statistici privind cutia poștală și informații despre cont",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Căutați în e-mailuri",
|
||||
description:
|
||||
"Căutați în e-mailuri folosind sintaxa de interogare a Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "Citește thread-ul",
|
||||
description:
|
||||
"Citește întregul fir de e-mail, folosind un identificator (ID).",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Creează o schiță",
|
||||
description: "Creați un proiect nou de e-mail",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Creează un răspuns preliminar",
|
||||
description: "Creați un proiect de răspuns la un thread existent.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Actualizare proiect",
|
||||
description: "Actualizați un e-mail existent, draft",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Obține versiunea preliminară",
|
||||
description: "Recuperați un proiect specific folosind ID-ul său",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Propuneri",
|
||||
description: "Enumerați toate e-mailurile draft",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Șterge proiectul",
|
||||
description: "Șterge un proiect de email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Trimite versiunea preliminară",
|
||||
description: "Trimiteți o versiune existentă a unui e-mail",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Trimite e-mail",
|
||||
description: "Trimiteți un e-mail imediat.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Răspunde la discuție",
|
||||
description: "Răspundeți imediat la un fir de e-mail",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Marcați un fir ca fiind citit",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Marchează ca necitit",
|
||||
description: "Marcați un thread ca fiind necitit",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Mută în coșul de gunoi",
|
||||
description: "Mută un fir în coșul de gunoi",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arhivă",
|
||||
description: "Arhivează un thread",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Mută în Inbox",
|
||||
description: "Mută un fir în folderul „Intrări”",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistici cutie poștală",
|
||||
description:
|
||||
"Obține numărul de e-mailuri necitite și statistici privind cutia poștală.",
|
||||
},
|
||||
getInbox: {
|
||||
title: 'Accesează folderul "Inbox"',
|
||||
description:
|
||||
"O modalitate eficientă de a accesa e-mailurile din inbox-ul Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Conector Outlook",
|
||||
description:
|
||||
"Permiteți-i agentului dumneavoastră să interacționeze cu Microsoft Outlook – să caute e-mailuri, să citească conversații, să redacteze proiecte, să trimită e-mailuri și să gestioneze folderul de intrare, folosind Microsoft Graph API. Consultați documentația aici.",
|
||||
multiUserWarning:
|
||||
"Integrarea cu Outlook nu este disponibilă în modul pentru utilizatori multipli, din motive de securitate. Vă rugăm să dezactivați modul pentru utilizatori multipli pentru a utiliza această funcție.",
|
||||
configuration: "Configurarea Outlook-ului",
|
||||
authType: "Tip de cont",
|
||||
authTypeHelp:
|
||||
"Selectați ce tipuri de conturi Microsoft pot fi utilizate pentru autentificare. Opțiunea „Toate conturile” permite autentificarea atât pentru conturi personale, cât și pentru conturi de lucru/școlare. Opțiunea „Doar conturi personale” limitează autentificarea la conturi Microsoft personale. Opțiunea „Doar conturi de organizație” limitează autentificarea la conturi de lucru/școlare dintr-un anumit tenant Azure AD.",
|
||||
authTypeCommon:
|
||||
"Toate conturile (personale și cele legate de muncă/școală)",
|
||||
authTypeConsumers: "Conturile personale Microsoft sunt acceptate.",
|
||||
authTypeOrganization:
|
||||
"Conturi pentru organizații (necesită ID-ul chiriașului)",
|
||||
clientId: "Identificator (pentru client)",
|
||||
clientIdHelp:
|
||||
"Identificatorul aplicației (Client) din înregistrarea aplicației dumneavoastră Azure AD",
|
||||
tenantId: "Codul identificator (pentru chiriaș)",
|
||||
tenantIdHelp:
|
||||
"ID-ul din director (pentru chiriaș) din înregistrarea aplicației dumneavoastră Azure AD. Este necesar doar pentru autentificare, utilizată exclusiv de organizație.",
|
||||
clientSecret: "Confidențialitatea clientului",
|
||||
clientSecretHelp:
|
||||
"Valoarea secretă a clientului, obținută în urma înregistrării aplicației dvs. în Azure AD",
|
||||
configurationRequired:
|
||||
"Vă rugăm să configurați ID-ul clientului și Secretul clientului pentru a activa funcționalitățile Outlook.",
|
||||
authRequired:
|
||||
"În primul rând, salvați-vă datele de autentificare, apoi autentificați-vă cu Microsoft pentru a finaliza configurarea.",
|
||||
authenticateWithMicrosoft: "Autentificați-vă cu Microsoft",
|
||||
authenticated: "Autentificare reușită cu Microsoft Outlook.",
|
||||
revokeAccess: "Anula accesul",
|
||||
configured: "Configurat",
|
||||
searchSkills: "Abilități de căutare...",
|
||||
noSkillsFound:
|
||||
"Nu s-au găsit rezultate care să corespundă criteriilor dumneavoastră de căutare.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Caută și citește e-mailuri",
|
||||
description:
|
||||
"Căutați și citiți e-mailuri din folderul dumneavoastră Outlook",
|
||||
},
|
||||
drafts: {
|
||||
title: "Propuneri de e-mail",
|
||||
description: "Creați, editați și gestionați schițele de e-mail.",
|
||||
},
|
||||
send: {
|
||||
title: "Trimite e-mailuri",
|
||||
description:
|
||||
"Trimiteți e-mailuri noi sau răspundeți imediat la mesajele primite.",
|
||||
},
|
||||
account: {
|
||||
title: "Statistici privind integrarea",
|
||||
description:
|
||||
"Vizualizați statistici privind cutia poștală și informații despre cont",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Accesați inbox-ul",
|
||||
description:
|
||||
"Accesați email-urile recente din dosarul dvs. Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Căutați în e-mailuri",
|
||||
description:
|
||||
"Căutați în e-mailuri folosind sintaxa de căutare Microsoft",
|
||||
},
|
||||
readThread: {
|
||||
title: "Citește conversația",
|
||||
description: "Citește întreaga corespondență prin e-mail.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Creați o versiune preliminară",
|
||||
description:
|
||||
"Creați un e-mail nou sau un răspuns la un e-mail existent.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Actualizare proiect",
|
||||
description: "Actualizați un e-mail existent, draft",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Propuneri",
|
||||
description: "Enumerați toate e-mailurile draft",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Șterge schița",
|
||||
description: "Șterge un proiect de e-mail",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Trimite versiunea preliminară",
|
||||
description: "Trimite un e-mail existent, draft",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Trimite e-mail",
|
||||
description:
|
||||
"Trimiteți un nou e-mail sau răspundeți imediat la un mesaj existent.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Statistici cutie poștală",
|
||||
description:
|
||||
"Obține numărul de foldere și statisticile pentru cutiile de e-mail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Conector Google Calendar",
|
||||
description:
|
||||
"Permite-ți agentului să interacționeze cu Google Calendar – vizualizează calendare, obține evenimente, creează și actualizează evenimente, și gestionează răspunsurile la invitații. Consultă documentația<a>.",
|
||||
multiUserWarning:
|
||||
"Integrarea cu Google Calendar nu este disponibilă în modul multi-utilizator, din motive de securitate. Vă rugăm să dezactivați modul multi-utilizator pentru a utiliza această funcție.",
|
||||
configuration: "Configurarea calendarului Google",
|
||||
deploymentId: "ID de implementare",
|
||||
deploymentIdHelp:
|
||||
"ID-ul de implementare al aplicației web Google Apps Script",
|
||||
apiKey: "Cheia API",
|
||||
apiKeyHelp:
|
||||
"Cheia API pe care ați configurat în implementarea dumneavoastră de Google Apps Script",
|
||||
configurationRequired:
|
||||
"Vă rugăm să configurați ID-ul de implementare și cheia API pentru a activa funcționalitățile Google Calendar.",
|
||||
configured: "Configurat",
|
||||
searchSkills: "Abilități de căutare...",
|
||||
noSkillsFound:
|
||||
"Nu s-au găsit rezultate care să corespundă criteriilor dumneavoastră de căutare.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Calendare",
|
||||
description: "Vizualizați și gestionați calendarele Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Vezi evenimente",
|
||||
description: "Vizualizați și căutați evenimentele din calendar",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Creați și actualizați evenimente",
|
||||
description:
|
||||
"Creați evenimente noi și modificați evenimentele existente.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Gestionarea răspunsurilor",
|
||||
description:
|
||||
"Gestionați starea răspunsului dumneavoastră pentru evenimente",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Liste de calendare",
|
||||
description:
|
||||
"Enumerați toate calendarele pe care le dețineți sau pentru care aveți abonament.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Obțineți detalii despre calendar",
|
||||
description:
|
||||
"Obțineți informații detaliate despre un calendar specific.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Obține evenimentul",
|
||||
description:
|
||||
"Obțineți informații detaliate despre un eveniment specific.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Obține evenimente pentru ziua respectivă",
|
||||
description:
|
||||
"Obțineți toate evenimentele programate pentru o anumită dată.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Obține evenimente (interval de date)",
|
||||
description: "Obține evenimente într-un interval de date specific",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Vezi evenimentele viitoare",
|
||||
description:
|
||||
"Găsiți evenimente pentru ziua de azi, pentru această săptămână sau pentru acest lună, folosind cuvinte cheie simple.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Adaugă eveniment rapid",
|
||||
description:
|
||||
"Creați un eveniment folosind limbaj natural (de exemplu, „Întâlnire mâine la ora 15:00”)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Creați eveniment",
|
||||
description:
|
||||
"Creați un eveniment nou, având control complet asupra tuturor proprietăților.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Actualizare eveniment",
|
||||
description: "Modificați un eveniment existent din calendar",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Stare confirmare participare",
|
||||
description: "Acceptă, refuză sau acceptă cu rezerve evenimentul",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Servere MCP",
|
||||
@@ -914,6 +1230,95 @@ 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ă.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -1027,7 +1432,34 @@ const TRANSLATIONS = {
|
||||
"Cheile API permit deținătorului să acceseze și să gestioneze programatic această instanță AnythingLLM.",
|
||||
link: "Citește documentația API",
|
||||
generate: "Generează o nouă cheie API",
|
||||
empty: "Nu au fost găsite chei API",
|
||||
actions: "Acțiuni",
|
||||
messages: {
|
||||
error: "Eroare: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Creează o cheie API nouă",
|
||||
cancel: "Anulează",
|
||||
close: "Închide",
|
||||
create: "Creează cheia API",
|
||||
helper:
|
||||
"După creare, cheia API poate fi folosită pentru a accesa și configura programatic această instanță AnythingLLM.",
|
||||
name: {
|
||||
label: "Nume",
|
||||
placeholder: "Integrare de producție",
|
||||
helper:
|
||||
"Opțional. Folosește un nume clar pentru a putea identifica această cheie mai târziu.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Copiază cheia API",
|
||||
copied: "Copiată",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Sigur doriți să dezactivați această cheie API?\nDupă aceea nu va mai putea fi folosită.\n\nAceastă acțiune este ireversibilă.",
|
||||
},
|
||||
table: {
|
||||
name: "Nume",
|
||||
key: "Cheie API",
|
||||
by: "Creat de",
|
||||
created: "Creat la",
|
||||
@@ -1142,9 +1574,6 @@ const TRANSLATIONS = {
|
||||
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ă",
|
||||
},
|
||||
@@ -1186,20 +1615,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -409,6 +409,322 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Подключение к GMail",
|
||||
description:
|
||||
"Предоставьте своему агенту возможность взаимодействовать с Gmail: искать письма, читать цепочки сообщений, составлять черновики, отправлять письма и управлять своей почтой. <a>Ознакомьтесь с документацией</a>.",
|
||||
multiUserWarning:
|
||||
"Интеграция с Gmail недоступна в многопользовательском режиме по соображениям безопасности. Пожалуйста, отключите многопользовательский режим, чтобы использовать эту функцию.",
|
||||
configuration: "Настройка Gmail",
|
||||
deploymentId: "Идентификатор развертывания",
|
||||
deploymentIdHelp:
|
||||
"Идентификатор развертывания вашего веб-приложения Google Apps Script",
|
||||
apiKey: "Ключ API",
|
||||
apiKeyHelp:
|
||||
"Ключ API, который вы настроили в своем проекте Google Apps Script",
|
||||
configurationRequired:
|
||||
"Пожалуйста, настройте идентификатор развертывания и API-ключ, чтобы активировать функции Gmail.",
|
||||
configured: "Настроен",
|
||||
searchSkills: "Навыки поиска...",
|
||||
noSkillsFound: "Не найдено ни одного совпадения с вашим запросом.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Поиск и чтение электронных писем",
|
||||
description:
|
||||
"Найдите и прочитайте электронные письма из вашей почты Gmail.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Черновики электронных писем",
|
||||
description:
|
||||
"Создавайте, редактируйте и управляйте черновиками электронных писем.",
|
||||
},
|
||||
send: {
|
||||
title: "Отправка и ответы на электронные письма",
|
||||
description:
|
||||
"Отправляйте электронные письма и оперативно отвечайте на сообщения в обсуждениях.",
|
||||
},
|
||||
threads: {
|
||||
title: "Управление цепочками писем",
|
||||
description:
|
||||
"Управление цепочками электронных писем: пометка как прочитанные/непрочитанные, архивирование, удаление",
|
||||
},
|
||||
account: {
|
||||
title: "Статистика интеграции",
|
||||
description:
|
||||
"Просмотрите статистику использования почтового ящика и информацию об учетной записи.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Поиск в электронных письмах",
|
||||
description: "Искать письма, используя синтаксис запросов Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "Прочитать тему",
|
||||
description:
|
||||
"Просмотрите всю цепочку электронных писем, отсортированную по идентификатору.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Создать черновик",
|
||||
description: "Создайте новый черновик электронного письма",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Создать черновик ответа",
|
||||
description:
|
||||
"Составьте черновик ответа к существующему обсуждению.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Обновленная версия проекта",
|
||||
description: "Обновить существующий черновик электронного письма",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Получить черновик",
|
||||
description: "Получить конкретный черновик по его идентификатору",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Черновики",
|
||||
description: "Перечислите все черновики электронных писем.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Удалить черновик",
|
||||
description: "Удалить черновик письма",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Отправить черновик",
|
||||
description: "Отправить существующий черновик электронного письма",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Отправить электронное письмо",
|
||||
description: "Немедленно отправьте электронное письмо.",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Ответить на тему",
|
||||
description: "Ответить на цепочку писем немедленно",
|
||||
},
|
||||
markRead: {
|
||||
title: "Марк Рид",
|
||||
description: "Отметьте тему как прочитанную.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Отмечено как непрочитанное",
|
||||
description: "Отметьте тему как непрочитанную.",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Переместить в корзину",
|
||||
description: "Переместить тему в корзину",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Архив",
|
||||
description: "Архивировать тему",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: 'Переместить в папку "Входящие"',
|
||||
description: "Переместить тему в папку «Входящие»",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Статистика почтового ящика",
|
||||
description:
|
||||
"Получите информацию о количестве непрочитанных писем и статистику почтового ящика.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Открыть входящие",
|
||||
description:
|
||||
"Удобный способ получения писем из почтового ящика Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Подключение к Outlook",
|
||||
description:
|
||||
"Позвольте своему агенту взаимодействовать с Microsoft Outlook: искать электронные письма, читать цепочки сообщений, создавать черновики, отправлять электронные письма и управлять своей почтой через Microsoft Graph API. <a>Обратитесь к документации</a>.",
|
||||
multiUserWarning:
|
||||
"Интеграция с Outlook недоступна в многопользовательском режиме из соображений безопасности. Пожалуйста, отключите многопользовательский режим, чтобы использовать эту функцию.",
|
||||
configuration: "Настройка Outlook",
|
||||
authType: "Тип аккаунта",
|
||||
authTypeHelp:
|
||||
"Выберите, какие типы учетных записей Microsoft могут использоваться для аутентификации. «Все учетные записи» поддерживает как личные, так и рабочие/учебные учетные записи. «Только личные» ограничивается личными учетными записями Microsoft. «Только для организации» ограничивается учетными записями из определенного экземпляра Azure AD.",
|
||||
authTypeCommon: "Все счета (личные и рабочие/учебные)",
|
||||
authTypeConsumers: "Личные учетные записи Microsoft",
|
||||
authTypeOrganization:
|
||||
"Данные только для организаций (требуется идентификатор арендатора)",
|
||||
clientId: "Идентификатор клиента (для заявки)",
|
||||
clientIdHelp:
|
||||
"Идентификатор приложения (клиента), полученный при регистрации вашего приложения в Azure AD.",
|
||||
tenantId: "Идентификатор (для арендатора)",
|
||||
tenantIdHelp:
|
||||
"Идентификатор (для арендатора) из вашей регистрации приложения в Azure AD. Требуется только для аутентификации, осуществляемой только внутри организации.",
|
||||
clientSecret: "Секретный ключ",
|
||||
clientSecretHelp:
|
||||
"Секретный ключ, полученный при регистрации вашего приложения в Azure AD.",
|
||||
configurationRequired:
|
||||
"Пожалуйста, настройте идентификатор клиента и секретный ключ, чтобы активировать функции Outlook.",
|
||||
authRequired:
|
||||
"Сначала сохраните свои учетные данные, а затем выполните аутентификацию в Microsoft, чтобы завершить настройку.",
|
||||
authenticateWithMicrosoft: "Авторизуйтесь через Microsoft",
|
||||
authenticated: "Успешно установлено соединение с Microsoft Outlook.",
|
||||
revokeAccess: "Отменить доступ",
|
||||
configured: "Настроен",
|
||||
searchSkills: "Навыки поиска...",
|
||||
noSkillsFound: "Не найдено ни одного соответствующего запросу.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Поиск и чтение электронных писем",
|
||||
description:
|
||||
"Поиск и чтение электронных писем из вашей почтовой ящика Outlook",
|
||||
},
|
||||
drafts: {
|
||||
title: "Черновики электронных писем",
|
||||
description:
|
||||
"Создавайте, редактируйте и управляйте черновиками электронных писем.",
|
||||
},
|
||||
send: {
|
||||
title: "Отправлять электронные письма",
|
||||
description:
|
||||
"Отправьте новые электронные письма или ответьте на сообщения немедленно.",
|
||||
},
|
||||
account: {
|
||||
title: "Статистика интеграции",
|
||||
description:
|
||||
"Просмотр статистики почтового ящика и информации об аккаунте",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Открыть входящие сообщения",
|
||||
description:
|
||||
"Получите последние письма из вашей почтовой ящика Outlook.",
|
||||
},
|
||||
search: {
|
||||
title: "Поиск в электронных письмах",
|
||||
description:
|
||||
"Ищите электронные письма, используя синтаксис поиска Microsoft.",
|
||||
},
|
||||
readThread: {
|
||||
title: "Прочитать диалог",
|
||||
description: "Прочитать полный перечень электронных писем.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Создать черновик",
|
||||
description:
|
||||
"Создайте новый черновик письма или черновик ответа на существующее сообщение.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Обновить черновик",
|
||||
description: "Обновить существующий черновик письма",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Черновики",
|
||||
description: "Перечислите все черновики электронных писем.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Удалить черновик",
|
||||
description: "Удалить черновик письма",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Отправить черновик",
|
||||
description: "Отправить существующий черновик письма",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Отправить электронное письмо",
|
||||
description:
|
||||
"Отправьте новое электронное письмо или ответьте на существующее сообщение немедленно.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Статистика почтового ящика",
|
||||
description:
|
||||
"Получите информацию о количестве папок и статистику использования почтового ящика.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Коннектор для Google Календаря",
|
||||
description:
|
||||
"Позвольте своему агенту взаимодействовать с Google Календарем: просматривать календари, получать информацию о событиях, создавать и обновлять события, а также управлять подтверждениями участия. <a>Обратитесь к документации</a>.",
|
||||
multiUserWarning:
|
||||
"Интеграция с Google Календарем недоступна в многопользовательском режиме по соображениям безопасности. Пожалуйста, отключите многопользовательский режим, чтобы использовать эту функцию.",
|
||||
configuration: "Настройка календаря Google",
|
||||
deploymentId: "Идентификатор развертывания",
|
||||
deploymentIdHelp:
|
||||
"Идентификатор развертывания из вашего веб-приложения Google Apps Script",
|
||||
apiKey: "Ключ API",
|
||||
apiKeyHelp:
|
||||
"Ключ API, который вы настроили в своей среде выполнения Google Apps Script",
|
||||
configurationRequired:
|
||||
"Пожалуйста, настройте идентификатор развертывания и API-ключ, чтобы активировать функциональность Google Calendar.",
|
||||
configured: "Настроен",
|
||||
searchSkills: "Навыки поиска...",
|
||||
noSkillsFound: "Не найдено ни одного соответствующего запросу.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Календари",
|
||||
description:
|
||||
"Просматривайте и управляйте своими календарями Google.",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Просмотр событий",
|
||||
description: "Просмотр и поиск событий в календаре",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Создание и обновление событий",
|
||||
description:
|
||||
"Создавайте новые мероприятия и изменяйте существующие.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Управление RSVP (подтверждение участия)",
|
||||
description: "Управляйте своим статусом участия в мероприятиях.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Календари",
|
||||
description:
|
||||
"Перечислите все календари, которыми вы владеете или для которых у вас есть подписка.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Получить подробную информацию о календаре",
|
||||
description:
|
||||
"Получите подробную информацию о конкретном календаре.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Узнать о мероприятии",
|
||||
description:
|
||||
"Получите подробную информацию о конкретном мероприятии.",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Получите информацию о событиях на сегодня",
|
||||
description:
|
||||
"Получите список всех мероприятий, запланированных на конкретную дату.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Получить события (период времени)",
|
||||
description: "Получить события в указанном диапазоне дат",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Получите информацию о предстоящих мероприятиях",
|
||||
description:
|
||||
"Получите информацию о событиях на сегодня, на этой неделе или в этом месяце, используя простые ключевые слова.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Быстрое добавление события",
|
||||
description:
|
||||
"Создать событие на основе естественного языка (например, «Встреча завтра в 15:00»)",
|
||||
},
|
||||
createEvent: {
|
||||
title: "Создать мероприятие",
|
||||
description:
|
||||
"Создайте новое мероприятие с полным контролем над всеми его параметрами.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Обновление события",
|
||||
description: "Обновить существующее событие в календаре",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Указать статус подтверждения участия",
|
||||
description:
|
||||
"Принять, отклонить или выразить предварительное согласие на мероприятие.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Серверы MCP",
|
||||
@@ -455,6 +771,95 @@ 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 с использованием базовых стилей и форматирования.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -477,7 +882,34 @@ const TRANSLATIONS = {
|
||||
"API ключи позволяют владельцу программно получать доступ к этому экземпляру AnythingLLM и управлять им.",
|
||||
link: "Прочитать документацию по API",
|
||||
generate: "Создать новый API ключ",
|
||||
empty: "API-ключи не найдены",
|
||||
actions: "Действия",
|
||||
messages: {
|
||||
error: "Ошибка: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Создать новый API-ключ",
|
||||
cancel: "Отмена",
|
||||
close: "Закрыть",
|
||||
create: "Создать API-ключ",
|
||||
helper:
|
||||
"После создания API-ключ можно использовать для программного доступа к этому экземпляру AnythingLLM и его настройки.",
|
||||
name: {
|
||||
label: "Название",
|
||||
placeholder: "Продакшн-интеграция",
|
||||
helper:
|
||||
"Необязательно. Используйте понятное имя, чтобы потом легко узнать этот ключ.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Копировать API-ключ",
|
||||
copied: "Скопировано",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Вы уверены, что хотите деактивировать этот API-ключ?\nПосле этого его больше нельзя будет использовать.\n\nЭто действие необратимо.",
|
||||
},
|
||||
table: {
|
||||
name: "Название",
|
||||
key: "API ключ",
|
||||
by: "Создано",
|
||||
created: "Создано",
|
||||
@@ -1148,8 +1580,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"Вставьте API-токен, который вы получили от @BotFather, и выберите основной рабочий стол для вашего бота, чтобы он мог общаться.",
|
||||
"bot-token": "Токен бота",
|
||||
"default-workspace": "Основной рабочий стол",
|
||||
"no-workspace": "Недоступны рабочие места. Будет создано новое.",
|
||||
connecting: "Устанавливается соединение...",
|
||||
"connect-bot": "Bot Connect",
|
||||
},
|
||||
@@ -1191,20 +1621,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "Не удалось отменить действия пользователя.",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "Ожидается утверждение",
|
||||
"pending-description":
|
||||
"Пользователи, ожидающие подтверждения. Сравните код, указанный здесь, с кодом, отображаемым в их чате в Telegram.",
|
||||
"approved-title": "Утвержденные пользователи",
|
||||
"approved-description":
|
||||
"Пользователи, которым разрешено общаться с вашим ботом.",
|
||||
user: "Пользователь",
|
||||
"pairing-code": "Код сопоставления",
|
||||
"no-pending": "Отсутствуют незавершенные запросы.",
|
||||
"no-approved": "Нет зарегистрированных пользователей",
|
||||
unknown: "Неизвестно",
|
||||
approve: "Одобрить",
|
||||
deny: "Отрицать",
|
||||
revoke: "Отменить",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -410,6 +410,322 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "GMail Bağlantısı",
|
||||
description:
|
||||
"Ajantınızın Gmail ile etkileşim kurmasını sağlayın: e-postaları aratın, sohbetleri okuyun, taslaklar oluşturun, e-postalar gönderin ve posta kutunuzu yönetin. <a>Dokümantasyonu okuyun</a>.",
|
||||
multiUserWarning:
|
||||
"Gmail entegrasyonu, güvenlik nedenlerinden dolayı çoklu kullanıcı modunda mevcut değildir. Bu özelliği kullanmak için lütfen çoklu kullanıcı modunu devre dışı bırakın.",
|
||||
configuration: "Gmail Yapılandırma",
|
||||
deploymentId: "Dağıtım Kimliği",
|
||||
deploymentIdHelp:
|
||||
"Google Apps Script web uygulamanızın uygulama kimliği",
|
||||
apiKey: "API Anahtarı",
|
||||
apiKeyHelp:
|
||||
"Google Apps Script kurulumunuzda yapılandırdığınız API anahtarı",
|
||||
configurationRequired:
|
||||
"Lütfen Dağıtım Kimliğini ve API Anahtarını yapılandırarak Gmail yeteneklerini etkinleştirin.",
|
||||
configured: "Yapılandırılmış",
|
||||
searchSkills: "Arama becerileri...",
|
||||
noSkillsFound:
|
||||
"Belirttiğiniz kriterlere uyan herhangi bir sonuç bulunamadı.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "E-postaları arayın ve okuyun",
|
||||
description: "Gmail hesabınızdaki e-postaları arayın ve okuyun.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Taslak E-postalar",
|
||||
description:
|
||||
"E-posta taslaklarını oluşturun, düzenleyin ve yönetin.",
|
||||
},
|
||||
send: {
|
||||
title: "E-postaları gönderme ve yanıt verme",
|
||||
description:
|
||||
"E-postalar gönderin ve tartışmalara anında yanıt verin.",
|
||||
},
|
||||
threads: {
|
||||
title: "E-posta dizilerini yönetin",
|
||||
description:
|
||||
"E-posta dizilerini yönetin - okundu/okunmadı olarak işaretleme, arşivleme, çöp kutusuna gönderme",
|
||||
},
|
||||
account: {
|
||||
title: "Entegrasyon İstatistikleri",
|
||||
description:
|
||||
"Post kutunuzdaki istatistikleri ve hesap bilgilerinizi görüntüleyin.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "E-postaları arayın",
|
||||
description: "Gmail sorgu sözdizimi kullanarak e-postaları arayın",
|
||||
},
|
||||
readThread: {
|
||||
title: "Makaleyi oku",
|
||||
description:
|
||||
"ID numarasına göre, e-posta iletişimin bütününü okuyun.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Taslak Oluştur",
|
||||
description: "Yeni bir e-posta taslağı oluşturun",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Taslak Yanıt Oluştur",
|
||||
description:
|
||||
"Mevcut bir tartışma başlığına yönelik bir yanıt taslağı oluşturun.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Taslak Güncelleme",
|
||||
description: "Mevcut bir e-posta taslağını güncelleyin",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Taslakları görüntüle",
|
||||
description: "Belirli bir taslağı, ID numarası ile alın",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Taslaklar",
|
||||
description: "Tüm taslak e-postaları listele",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Taslağı Sil",
|
||||
description: "Bir taslak e-postayı sil",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Taslak Gönder",
|
||||
description: "Mevcut bir e-posta taslağını gönderin",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "E-posta gönder",
|
||||
description: "Hemen bir e-posta gönderin",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Konuya Cevap Ver",
|
||||
description: "Bir e-posta dizisine anında yanıt verin",
|
||||
},
|
||||
markRead: {
|
||||
title: "মার্ক रीड",
|
||||
description: "Bir konuyla ilgili mesajları okundu olarak işaretle.",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Okunmadı olarak işaretle",
|
||||
description: 'Bir gönderiyi "okunmamış" olarak işaretle.',
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Çöp kutusuna taşı",
|
||||
description: "Bir başlığı çöp kutusuna taşı.",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Arşiv",
|
||||
description: "Bir konuyu arşivle",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Gelen kutusuna taşı",
|
||||
description:
|
||||
"Bir konuyla ilgili mesajları ana posta kutusuna taşı.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Posta Kutusu İstatistikleri",
|
||||
description:
|
||||
"Okunmamış mesaj sayılarını ve posta kutusu istatistiklerini görüntüleyin.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Gelen kutusuna eriş",
|
||||
description:
|
||||
"Gmail'den gelen e-postaları hızlı ve kolay bir şekilde görüntüleme yolu.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook Bağlayıcı",
|
||||
description:
|
||||
"Ajantınızın Microsoft Outlook ile etkileşim kurmasını sağlayın: e-postaları arayın, tartışmaları okuyun, taslaklar oluşturun, e-posta gönderin ve Microsoft Graph API aracılığıyla posta kutunuzu yönetin. Dokümantasyonu okuyun.",
|
||||
multiUserWarning:
|
||||
"Outlook entegrasyonu, güvenlik nedenleriyle çoklu kullanıcı modunda mevcut değildir. Bu özelliği kullanmak için lütfen çoklu kullanıcı modunu devre dışı bırakın.",
|
||||
configuration: "Outlook Yapılandırması",
|
||||
authType: "Hesap Türü",
|
||||
authTypeHelp:
|
||||
'Hangi tür Microsoft hesaplarının kimlik doğrulamasına izin verileceğini seçin. "Tüm hesaplar" hem kişisel hem de iş/okul hesaplarını destekler. "Sadece kişisel hesaplar" yalnızca kişisel Microsoft hesaplarını kısıtlar. "Sadece kuruluş hesapları" belirli bir Azure AD kiracısından iş/okul hesaplarını kısıtlar.',
|
||||
authTypeCommon: "Tüm hesaplar (kişisel ve iş/okul)",
|
||||
authTypeConsumers: "Sadece bireysel Microsoft hesapları",
|
||||
authTypeOrganization:
|
||||
"Sadece kuruluş hesapları (Kira sahibi kimlik numarası gerektirir)",
|
||||
clientId: "Uygulama (Müşteri) Kimliği",
|
||||
clientIdHelp:
|
||||
"Azure AD uygulamanızın kaydından elde ettiğiniz Uygulama (Müşteri) Kimliği",
|
||||
tenantId: "Kiralık Konut Kimlik No",
|
||||
tenantIdHelp:
|
||||
"Azure AD uygulamanızın kayıt bilgilerinden elde edilen (Kiralık Alan) Kimliği. Sadece kuruluş içi kimlik doğrulama için gereklidir.",
|
||||
clientSecret: "Müşteri sırrı",
|
||||
clientSecretHelp:
|
||||
"Azure AD uygulamanızın kaydından elde edilen istemci sır değeri",
|
||||
configurationRequired:
|
||||
"Lütfen, Outlook işlevlerini etkinleştirmek için Client ID ve Client Secret değerlerini yapılandırın.",
|
||||
authRequired:
|
||||
"Öncelikle kimlik bilgilerinizi kaydedin, ardından kurulumu tamamlamak için Microsoft ile kimliğinizi doğrulayın.",
|
||||
authenticateWithMicrosoft: "Microsoft ile kimliğinizi doğrulayın",
|
||||
authenticated:
|
||||
"Microsoft Outlook ile başarılı bir şekilde kimlik doğrulaması tamamlandı.",
|
||||
revokeAccess: "Erişi İptal Et",
|
||||
configured: "Yapılandırılmış",
|
||||
searchSkills: "Arama becerileri...",
|
||||
noSkillsFound:
|
||||
"Belirttiğiniz kriterlere uyan herhangi bir sonuç bulunamadı.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "E-postaları arayın ve okuyun",
|
||||
description:
|
||||
"Outlook posta kutunuzdan e-postaları arayın ve okuyun.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Örnek E-postalar",
|
||||
description: "E-posta taslaklarını oluştur, düzenle ve yönet",
|
||||
},
|
||||
send: {
|
||||
title: "E-posta gönderme",
|
||||
description:
|
||||
"Yeni e-postalar gönderin veya mesajlara anında cevap verin.",
|
||||
},
|
||||
account: {
|
||||
title: "Entegrasyon İstatistikleri",
|
||||
description:
|
||||
"Post kutunuzdaki istatistikleri ve hesap bilgilerinizi görüntüleyin.",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Gelen kutusuna eriş",
|
||||
description:
|
||||
"En son gelen e-postalarınızı Outlook posta kutunuzdan alın.",
|
||||
},
|
||||
search: {
|
||||
title: "E-postaları arayın",
|
||||
description:
|
||||
"Microsoft arama sözdizimi kullanarak e-postaları arayın",
|
||||
},
|
||||
readThread: {
|
||||
title: "Sohbeti okuyun",
|
||||
description: "Tam bir e-posta konuşma dizisini okuyun.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Taslak Oluştur",
|
||||
description:
|
||||
"Yeni bir e-posta taslağı oluşturun veya mevcut bir mesajın yanıtını taslağına ekleyin.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Taslak Güncelleme",
|
||||
description: "Mevcut bir e-posta taslağını güncelleyin",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Taslaklar",
|
||||
description: "Tüm taslak e-postaları listele",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Taslak Sil",
|
||||
description: "Bir taslak e-postayı sil",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Taslak Gönder",
|
||||
description: "Mevcut bir e-posta taslağını gönderin",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "E-posta gönder",
|
||||
description:
|
||||
"Yeni bir e-posta gönderin veya mevcut bir mesajı hemen yanıtlayın.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Post kutusu istatistikleri",
|
||||
description:
|
||||
"Klasörlerin ve posta kutusu istatistiklerinin sayısını alın.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google Takvim Bağlayıcı",
|
||||
description:
|
||||
"Ajantınızın Google Takvim ile etkileşim kurmasını sağlayın - takvimleri görüntüleyin, etkinlikleri alın, etkinlikleri oluşturun ve güncelleyin, ve katılımcıların yanıtlarını yönetin. Dokümantasyonu okuyun.",
|
||||
multiUserWarning:
|
||||
"Google Takvim entegrasyonu, güvenlik nedeniyle çoklu kullanıcı modunda kullanılabilmektedir. Bu özelliği kullanmak için lütfen çoklu kullanıcı modunu devre dışı bırakın.",
|
||||
configuration: "Google Takvim Yapılandırması",
|
||||
deploymentId: "Dağıtım Kimliği",
|
||||
deploymentIdHelp:
|
||||
"Google Apps Script web uygulamanızın dağıtım kimliği",
|
||||
apiKey: "API Anahtarı",
|
||||
apiKeyHelp:
|
||||
"Google Apps Script dağıtımınızda yapılandırdığınız API anahtarı",
|
||||
configurationRequired:
|
||||
"Lütfen Dağıtım Kimliğini ve API Anahtarını yapılandırarak Google Takvim özelliklerini etkinleştirin.",
|
||||
configured: "Yapılandırılmış",
|
||||
searchSkills: "Arama becerileri...",
|
||||
noSkillsFound:
|
||||
"Arama sonuçlarınızda eşleşen herhangi bir beceri bulunmamaktadır.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Takvimler",
|
||||
description: "Google Takvimlerinizi görüntüleyin ve yönetin",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Etkinlikleri oku",
|
||||
description: "Takvimdeki etkinlikleri görüntüleyin ve arayın",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Etkinlikleri Oluştur ve Güncelle",
|
||||
description:
|
||||
"Yeni etkinlikler oluşturun ve mevcut olanları değiştirin.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Katılım Yönetimi",
|
||||
description: "Etkinliklere ilişkin yanıt durumunuzu yönetin",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Takvim Listeleri",
|
||||
description:
|
||||
"Sahip olduğunuz veya abonelik yaptığınız tüm takvimleri listeleyin.",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Takvim Detaylarını Al",
|
||||
description: "Belirli bir takvim hakkında ayrıntılı bilgi edinin.",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Etkinliği Bul",
|
||||
description: "Belirli bir etkinlikle ilgili ayrıntılı bilgi edinin",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Gün İçindeki Etkinlikleri Öğren",
|
||||
description:
|
||||
"Belirli bir güne ait tüm planlanan etkinlikleri görüntüleyin.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Etkinlikleri (Tarih Aralığı) görüntüle",
|
||||
description: "Belirli bir tarih aralığındaki etkinlikleri alın",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Yaklaşan Etkinlikleri Görüntüleyin",
|
||||
description:
|
||||
"Bugün, bu hafta veya bu ay için etkinlikleri, basit anahtar kelimeler kullanarak bulun.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Hızlı Olay Ekle",
|
||||
description:
|
||||
'Doğal dilden bir etkinlik oluşturun (örneğin, "Yarın saat 15:00\'te bir toplantı")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Etkinlik Oluştur",
|
||||
description:
|
||||
"Tüm özellikler üzerinde tam kontrol sağlayarak yeni bir etkinlik oluşturun.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Etkinlik Güncellemesi",
|
||||
description: "Mevcut bir takvim olayını güncelleyin",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Davetiyeye Cevap Durumu Ayarla",
|
||||
description:
|
||||
"Bir etkinliğe katılımı kabul etmek, reddetmek veya geçici olarak katılmayı kabul etmek.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP Sunucuları",
|
||||
@@ -456,6 +772,96 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -473,12 +879,39 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
api: {
|
||||
title: "API Anahtarları",
|
||||
title: "API anahtarları",
|
||||
description:
|
||||
"API anahtarları, bu AnythingLLM örneğine programatik olarak erişmeye ve yönetmeye olanak tanır.",
|
||||
link: "API dokümantasyonunu okuyun",
|
||||
generate: "Yeni API Anahtarı Oluştur",
|
||||
empty: "API anahtarları bulunamadı",
|
||||
actions: "İşlemler",
|
||||
messages: {
|
||||
error: "Hata: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Yeni API anahtarı oluştur",
|
||||
cancel: "İptal",
|
||||
close: "Kapat",
|
||||
create: "API anahtarı oluştur",
|
||||
helper:
|
||||
"Oluşturulduktan sonra API anahtarı, bu AnythingLLM örneğine programatik olarak erişmek ve onu yapılandırmak için kullanılabilir.",
|
||||
name: {
|
||||
label: "Ad",
|
||||
placeholder: "Üretim entegrasyonu",
|
||||
helper:
|
||||
"İsteğe bağlıdır. Bu anahtarı daha sonra kolayca tanıyabilmek için açıklayıcı bir ad kullanın.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "API anahtarını kopyala",
|
||||
copied: "Kopyalandı",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Bu API anahtarını devre dışı bırakmak istediğinizden emin misiniz?\nBunu yaptıktan sonra artık kullanılamaz.\n\nBu işlem geri alınamaz.",
|
||||
},
|
||||
table: {
|
||||
name: "Ad",
|
||||
key: "API Anahtarı",
|
||||
by: "Oluşturan",
|
||||
created: "Oluşturulma Tarihi",
|
||||
@@ -1134,9 +1567,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1176,20 +1606,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -408,6 +408,310 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Kết nối GMail",
|
||||
description:
|
||||
"Cho phép đại lý của bạn tương tác với Gmail – tìm kiếm email, đọc các cuộc trò chuyện, soạn thảo bản nháp, gửi email và quản lý hộp thư. Đọc tài liệu hướng dẫn<a>.",
|
||||
multiUserWarning:
|
||||
"Tính năng tích hợp với Gmail không khả dụng trong chế độ nhiều người dùng vì lý do bảo mật. Vui lòng tắt chế độ nhiều người dùng để sử dụng tính năng này.",
|
||||
configuration: "Cấu hình Gmail",
|
||||
deploymentId: "Mã triển khai",
|
||||
deploymentIdHelp:
|
||||
"Mã triển khai từ ứng dụng web Google Apps Script của bạn",
|
||||
apiKey: "Khóa API",
|
||||
apiKeyHelp:
|
||||
"Khóa API mà bạn đã cấu hình trong quá trình triển khai Google Apps Script của mình.",
|
||||
configurationRequired:
|
||||
"Vui lòng cấu hình ID triển khai và khóa API để kích hoạt các tính năng của Gmail.",
|
||||
configured: "Đã được cấu hình",
|
||||
searchSkills: "Kỹ năng tìm kiếm...",
|
||||
noSkillsFound: "Không có kết quả phù hợp với tìm kiếm của bạn.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Tìm kiếm và đọc email",
|
||||
description:
|
||||
"Tìm kiếm và đọc các email trong hộp thư Gmail của bạn.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Mẫu email",
|
||||
description: "Tạo, chỉnh sửa và quản lý bản nháp email",
|
||||
},
|
||||
send: {
|
||||
title: "Gửi và trả lời email",
|
||||
description:
|
||||
"Gửi email và trả lời các cuộc thảo luận ngay lập tức.",
|
||||
},
|
||||
threads: {
|
||||
title: "Quản lý các chuỗi email",
|
||||
description:
|
||||
"Quản lý các chuỗi email – đánh dấu là đã đọc/chưa đọc, lưu trữ, xóa",
|
||||
},
|
||||
account: {
|
||||
title: "Thống kê tích hợp",
|
||||
description: "Xem thống kê hộp thư và thông tin tài khoản",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "Tìm kiếm trong các email",
|
||||
description: "Tìm kiếm trong email bằng cú pháp truy vấn của Gmail",
|
||||
},
|
||||
readThread: {
|
||||
title: "Đọc chủ đề",
|
||||
description: "Đọc toàn bộ chuỗi email theo ID",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Tạo bản nháp",
|
||||
description: "Tạo một bản nháp email mới",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "Tạo bản nháp trả lời",
|
||||
description: "Tạo một bản dự thảo trả lời cho một chủ đề hiện có.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Cập nhật bản nháp",
|
||||
description: "Cập nhật bản nháp email hiện có",
|
||||
},
|
||||
getDraft: {
|
||||
title: "Xem bản nháp",
|
||||
description: "Lấy lại một bản nháp cụ thể theo ID",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Danh sách dự thảo",
|
||||
description: "Liệt kê tất cả các email đang soạn thảo.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Xóa bản nháp",
|
||||
description: "Xóa bản nháp email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Gửi bản nháp",
|
||||
description: "Gửi một bản nháp email đã có",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Gửi email",
|
||||
description: "Gửi một email ngay lập tức",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "Trả lời cuộc thảo luận",
|
||||
description: "Trả lời một chuỗi email ngay lập tức.",
|
||||
},
|
||||
markRead: {
|
||||
title: "Mark Read",
|
||||
description: "Đánh dấu một chủ đề đã đọc",
|
||||
},
|
||||
markUnread: {
|
||||
title: "Đánh dấu là chưa đọc",
|
||||
description: "Đánh dấu một chủ đề là chưa đọc",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "Xóa",
|
||||
description: 'Di chuyển một chủ đề vào thư mục "rác"',
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "Thư mục lưu trữ",
|
||||
description: "Lưu trữ một chủ đề",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "Di chuyển đến mục Thùng thư",
|
||||
description: "Di chuyển một chủ đề vào hộp thư mục",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Thống kê hộp thư",
|
||||
description:
|
||||
"Hiển thị số lượng email chưa đọc và thống kê hộp thư.",
|
||||
},
|
||||
getInbox: {
|
||||
title: "Truy cập hộp thư",
|
||||
description: "Cách đơn giản để lấy các email trong hộp thư Gmail.",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Kết nối Outlook",
|
||||
description:
|
||||
"Cho phép đại lý của bạn tương tác với Microsoft Outlook – tìm kiếm email, đọc các cuộc thảo luận, soạn thảo bản nháp, gửi email và quản lý hộp thư đến thông qua Microsoft Graph API. Đọc tài liệu hướng dẫn <a>.",
|
||||
multiUserWarning:
|
||||
"Tính năng tích hợp với Outlook không khả dụng trong chế độ nhiều người dùng vì lý do bảo mật. Vui lòng tắt chế độ nhiều người dùng để sử dụng tính năng này.",
|
||||
configuration: "Cấu hình Outlook",
|
||||
authType: "Loại tài khoản",
|
||||
authTypeHelp:
|
||||
'Chọn loại tài khoản Microsoft nào có thể xác thực. "Tất cả các tài khoản" hỗ trợ cả tài khoản cá nhân và tài khoản làm việc/học. "Chỉ tài khoản cá nhân" giới hạn chỉ ở tài khoản Microsoft cá nhân. "Chỉ tài khoản tổ chức" giới hạn ở tài khoản làm việc/học từ một tenant cụ thể của Azure AD.',
|
||||
authTypeCommon:
|
||||
"Tất cả các tài khoản (cá nhân và tài khoản liên quan đến công việc/học tập)",
|
||||
authTypeConsumers: "Chỉ dành cho tài khoản Microsoft cá nhân",
|
||||
authTypeOrganization:
|
||||
"Chỉ dành cho tài khoản tổ chức (cần ID của người thuê).",
|
||||
clientId: "Mã định danh của khách hàng",
|
||||
clientIdHelp:
|
||||
"Mã định danh ứng dụng (Client ID) từ quá trình đăng ký ứng dụng của bạn trong Azure AD",
|
||||
tenantId: "Mã định danh (cho người thuê)",
|
||||
tenantIdHelp:
|
||||
"Mã định danh (Tenant ID) từ ứng dụng Azure AD của bạn. Yêu cầu chỉ khi thực hiện xác thực cho riêng tổ chức.",
|
||||
clientSecret: "Mật khẩu",
|
||||
clientSecretHelp: "Giá trị bí mật của ứng dụng Azure AD của bạn",
|
||||
configurationRequired:
|
||||
"Vui lòng cấu hình ID và bí mật của ứng dụng để kích hoạt các tính năng của Outlook.",
|
||||
authRequired:
|
||||
"Trước tiên, hãy lưu thông tin đăng nhập của bạn, sau đó xác thực với Microsoft để hoàn thành quá trình thiết lập.",
|
||||
authenticateWithMicrosoft: "Xác minh bằng Microsoft",
|
||||
authenticated: "Đã xác thực thành công với Microsoft Outlook.",
|
||||
revokeAccess: "Thu hồi quyền truy cập",
|
||||
configured: "Đã được cấu hình",
|
||||
searchSkills: "Kỹ năng tìm kiếm...",
|
||||
noSkillsFound: "Không có kết quả nào khớp với tìm kiếm của bạn.",
|
||||
categories: {
|
||||
search: {
|
||||
title: "Tìm kiếm và đọc email",
|
||||
description:
|
||||
"Tìm kiếm và đọc các email trong hộp thư Outlook của bạn.",
|
||||
},
|
||||
drafts: {
|
||||
title: "Mẫu email",
|
||||
description: "Tạo, chỉnh sửa và quản lý bản nháp email",
|
||||
},
|
||||
send: {
|
||||
title: "Gửi email",
|
||||
description: "Gửi email mới hoặc trả lời tin nhắn ngay lập tức.",
|
||||
},
|
||||
account: {
|
||||
title: "Thống kê tích hợp",
|
||||
description: "Xem thống kê hộp thư và thông tin tài khoản",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "Truy cập hộp thư",
|
||||
description: "Lấy các email mới nhất từ hộp thư Outlook của bạn",
|
||||
},
|
||||
search: {
|
||||
title: "Tìm kiếm trong thư điện tử",
|
||||
description:
|
||||
"Tìm kiếm trong các email bằng cú pháp tìm kiếm của Microsoft",
|
||||
},
|
||||
readThread: {
|
||||
title: "Đọc cuộc hội thoại",
|
||||
description: "Đọc toàn bộ chuỗi email.",
|
||||
},
|
||||
createDraft: {
|
||||
title: "Tạo bản nháp",
|
||||
description:
|
||||
"Tạo một bản nháp email mới hoặc một bản nháp trả lời cho một tin nhắn hiện có.",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "Cập nhật bản nháp",
|
||||
description: "Cập nhật một bản nháp email đã có",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "Danh sách dự thảo",
|
||||
description: "Liệt kê tất cả các email đang soạn thảo.",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "Xóa bản nháp",
|
||||
description: "Xóa bản nháp email",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "Gửi bản nháp",
|
||||
description: "Gửi một bản nháp email đã có",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "Gửi email",
|
||||
description:
|
||||
"Gửi một email mới hoặc trả lời một tin nhắn hiện có ngay lập tức.",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "Thống kê hộp thư",
|
||||
description: "Lấy số lượng thư mục và thống kê hộp thư.",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Kết nối Google Calendar",
|
||||
description:
|
||||
"Cho phép đại lý của bạn tương tác với Google Calendar - xem lịch, lấy thông tin sự kiện, tạo và cập nhật sự kiện, và quản lý xác nhận tham dự. <a>Đọc tài liệu</a>.",
|
||||
multiUserWarning:
|
||||
"Tính năng tích hợp với Google Calendar không khả dụng ở chế độ nhiều người dùng vì lý do bảo mật. Vui lòng tắt chế độ nhiều người dùng để sử dụng tính năng này.",
|
||||
configuration: "Cấu hình Google Calendar",
|
||||
deploymentId: "Mã triển khai",
|
||||
deploymentIdHelp:
|
||||
"Mã định danh ứng dụng từ ứng dụng web Google Apps Script của bạn",
|
||||
apiKey: "Khóa API",
|
||||
apiKeyHelp:
|
||||
"Khóa API mà bạn đã cấu hình trong quá trình triển khai Google Apps Script của mình.",
|
||||
configurationRequired:
|
||||
"Vui lòng cấu hình ID triển khai và khóa API để kích hoạt các tính năng của Google Calendar.",
|
||||
configured: "Đã được cấu hình",
|
||||
searchSkills: "Kỹ năng tìm kiếm...",
|
||||
noSkillsFound:
|
||||
"Không tìm thấy kết quả phù hợp với tiêu chí tìm kiếm của bạn.",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "Lịch",
|
||||
description: "Xem và quản lý lịch Google của bạn",
|
||||
},
|
||||
readEvents: {
|
||||
title: "Xem sự kiện",
|
||||
description: "Xem và tìm kiếm các sự kiện trong lịch",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "Tạo và cập nhật sự kiện",
|
||||
description:
|
||||
"Tạo các sự kiện mới và chỉnh sửa các sự kiện hiện có.",
|
||||
},
|
||||
rsvp: {
|
||||
title: "Quản lý xác nhận tham dự",
|
||||
description: "Quản lý trạng thái phản hồi của bạn cho các sự kiện",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "Danh sách lịch",
|
||||
description: "Liệt kê tất cả các lịch mà bạn sở hữu hoặc đăng ký",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "Lấy thông tin lịch",
|
||||
description: "Lấy thông tin chi tiết về một lịch cụ thể",
|
||||
},
|
||||
getEvent: {
|
||||
title: "Tìm sự kiện",
|
||||
description: "Lấy thông tin chi tiết về một sự kiện cụ thể",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "Tìm các sự kiện cho ngày hôm nay",
|
||||
description:
|
||||
"Hiển thị tất cả các sự kiện được lên lịch cho một ngày cụ thể.",
|
||||
},
|
||||
getEvents: {
|
||||
title: "Tìm sự kiện (khoảng thời gian)",
|
||||
description:
|
||||
"Lấy danh sách các sự kiện trong một khoảng thời gian tùy chỉnh.",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "Xem các sự kiện sắp tới",
|
||||
description:
|
||||
"Tìm kiếm các sự kiện diễn ra hôm nay, tuần này hoặc tháng này bằng cách sử dụng các từ khóa đơn giản.",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "Thêm sự kiện nhanh chóng",
|
||||
description:
|
||||
'Tạo một sự kiện từ ngôn ngữ tự nhiên (ví dụ: "Cuộc họp vào ngày mai lúc 3 giờ chiều")',
|
||||
},
|
||||
createEvent: {
|
||||
title: "Tạo sự kiện",
|
||||
description:
|
||||
"Tạo một sự kiện mới với quyền kiểm soát hoàn toàn đối với tất cả các thuộc tính.",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "Cập nhật sự kiện",
|
||||
description: "Cập nhật một sự kiện đã có trong lịch",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "Đặt trạng thái xác nhận tham dự",
|
||||
description:
|
||||
"Chấp nhận, từ chối hoặc chấp nhận một sự kiện một cách tạm thời.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "Máy chủ MCP",
|
||||
@@ -454,6 +758,95 @@ 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.",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -476,7 +869,34 @@ const TRANSLATIONS = {
|
||||
"Khóa API cho phép người sở hữu truy cập và quản lý phiên bản AnythingLLM này theo chương trình.",
|
||||
link: "Đọc tài liệu API",
|
||||
generate: "Tạo Khóa API Mới",
|
||||
empty: "Không tìm thấy khóa API nào",
|
||||
actions: "Thao tác",
|
||||
messages: {
|
||||
error: "Lỗi: {{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "Tạo khóa API mới",
|
||||
cancel: "Hủy",
|
||||
close: "Đóng",
|
||||
create: "Tạo khóa API",
|
||||
helper:
|
||||
"Sau khi được tạo, khóa API có thể được dùng để truy cập và cấu hình phiên bản AnythingLLM này theo chương trình.",
|
||||
name: {
|
||||
label: "Tên",
|
||||
placeholder: "Tích hợp production",
|
||||
helper:
|
||||
"Tùy chọn. Hãy dùng tên dễ nhận biết để bạn có thể xác định khóa này sau này.",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "Sao chép khóa API",
|
||||
copied: "Đã sao chép",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"Bạn có chắc muốn vô hiệu hóa khóa API này không?\nSau đó khóa sẽ không thể sử dụng được nữa.\n\nHành động này không thể hoàn tác.",
|
||||
},
|
||||
table: {
|
||||
name: "Tên",
|
||||
key: "Khóa API",
|
||||
by: "Tạo bởi",
|
||||
created: "Ngày tạo",
|
||||
@@ -1132,9 +1552,6 @@ const TRANSLATIONS = {
|
||||
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",
|
||||
},
|
||||
@@ -1174,20 +1591,9 @@ const TRANSLATIONS = {
|
||||
"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",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -394,6 +394,286 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Gmail 连接器",
|
||||
description:
|
||||
"让您的代理能够与Gmail互动:搜索邮件、阅读邮件线程、撰写草稿、发送邮件以及管理您的收件箱。请参考相关文档。",
|
||||
multiUserWarning:
|
||||
"为了安全原因,在多用户模式下无法使用 Gmail 集成功能。请先禁用多用户模式,然后才能使用此功能。",
|
||||
configuration: "Gmail 设置",
|
||||
deploymentId: "部署 ID",
|
||||
deploymentIdHelp: "您的 Google Apps Script 网页应用的部署 ID",
|
||||
apiKey: "API 密钥",
|
||||
apiKeyHelp: "您在 Google Apps Script 部署中配置的 API 密钥。",
|
||||
configurationRequired: "请配置部署 ID 和 API 密钥,以启用 Gmail 功能。",
|
||||
configured: "已配置",
|
||||
searchSkills: "搜索技巧...",
|
||||
noSkillsFound: "未找到与您的搜索条件匹配的技能。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "搜索和阅读电子邮件",
|
||||
description: "搜索并阅读您 Gmail 收件箱中的邮件。",
|
||||
},
|
||||
drafts: {
|
||||
title: "草稿邮件",
|
||||
description: "创建、编辑和管理电子邮件草稿",
|
||||
},
|
||||
send: {
|
||||
title: "发送和回复电子邮件",
|
||||
description: "立即发送电子邮件并回复讨论串",
|
||||
},
|
||||
threads: {
|
||||
title: "管理电子邮件线程",
|
||||
description: "管理邮件线程 - 标记为已读/未读,归档,删除",
|
||||
},
|
||||
account: {
|
||||
title: "集成统计",
|
||||
description: "查看邮件收件箱统计数据和账户信息",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "搜索邮件",
|
||||
description: "使用 Gmail 的查询语法搜索电子邮件",
|
||||
},
|
||||
readThread: {
|
||||
title: "阅读此主题",
|
||||
description: "阅读由ID发起的完整邮件往来",
|
||||
},
|
||||
createDraft: {
|
||||
title: "创建草稿",
|
||||
description: "创建一个新的电子邮件草稿",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "创建草稿回复",
|
||||
description: "创建一个针对现有主题的回应草稿",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "更新草稿",
|
||||
description: "更新已有的电子邮件草稿",
|
||||
},
|
||||
getDraft: {
|
||||
title: "获取草稿",
|
||||
description: "通过ID检索特定草稿",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "草稿清单",
|
||||
description: "列出所有草稿邮件",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "删除草稿",
|
||||
description: "删除草稿邮件",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "发送草稿",
|
||||
description: "发送已有的电子邮件草稿",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "发送电子邮件",
|
||||
description: "立即发送一封电子邮件",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "回复主题",
|
||||
description: "立即回复邮件线程",
|
||||
},
|
||||
markRead: {
|
||||
title: "马克·瑞德",
|
||||
description: "将某个主题标记为已阅读",
|
||||
},
|
||||
markUnread: {
|
||||
title: "标记为未读",
|
||||
description: "将某个主题标记为未读",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "移动到垃圾箱",
|
||||
description: "将某个主题归档到垃圾箱",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "存档",
|
||||
description: "存档该主题",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "移动到收件箱",
|
||||
description: "将某个主题移动到收件箱",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "邮箱统计",
|
||||
description: "获取未读邮件数量和邮箱统计信息",
|
||||
},
|
||||
getInbox: {
|
||||
title: "查看收件箱",
|
||||
description: "一种便捷的方式,可以从 Gmail 中获取收件邮件。",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook 连接器",
|
||||
description:
|
||||
"让您的代理通过 Microsoft Graph API 与 Microsoft Outlook 交互——搜索邮件、阅读邮件线程、撰写草稿、发送邮件以及管理您的收件箱。请查阅相关文档。",
|
||||
multiUserWarning:
|
||||
"由于安全原因,在多用户模式下无法使用 Outlook 集成功能。请先关闭多用户模式,然后再使用此功能。",
|
||||
configuration: "Outlook 设置",
|
||||
authType: "账户类型",
|
||||
authTypeHelp:
|
||||
'选择哪些类型的 Microsoft 账户可以进行身份验证。 "所有账户" 支持个人账户和工作/学校账户。 "仅限个人账户" 仅限于个人 Microsoft 账户。 "仅限工作/学校账户" 仅限于特定 Azure AD 租户的工作/学校账户。',
|
||||
authTypeCommon: "所有账户(包括个人账户和工作/学习账户)",
|
||||
authTypeConsumers: "仅限个人 Microsoft 账户",
|
||||
authTypeOrganization: "仅限组织账户 (需要租户 ID)",
|
||||
clientId: "申请人(客户)ID",
|
||||
clientIdHelp: "您 Azure AD 应用程序注册的应用程序 ID",
|
||||
tenantId: "租户 ID",
|
||||
tenantIdHelp:
|
||||
"您的 Azure AD 应用注册的“租户 ID”。仅在组织内部身份验证时需要。",
|
||||
clientSecret: "客户端密钥",
|
||||
clientSecretHelp: "您的 Azure AD 应用程序注册的客户端机密值",
|
||||
configurationRequired:
|
||||
"请配置客户端 ID 和客户端密钥,以便启用 Outlook 相关功能。",
|
||||
authRequired:
|
||||
"首先保存您的凭据,然后通过 Microsoft 进行身份验证以完成设置。",
|
||||
authenticateWithMicrosoft: "使用 Microsoft 身份验证",
|
||||
authenticated: "已成功与 Microsoft Outlook 认证。",
|
||||
revokeAccess: "撤销权限",
|
||||
configured: "已配置",
|
||||
searchSkills: "搜索技巧...",
|
||||
noSkillsFound: "未找到与您的搜索条件匹配的技能。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "搜索和阅读电子邮件",
|
||||
description: "搜索并阅读您 Outlook 收件箱中的电子邮件。",
|
||||
},
|
||||
drafts: {
|
||||
title: "草稿邮件",
|
||||
description: "创建、编辑和管理电子邮件草稿",
|
||||
},
|
||||
send: {
|
||||
title: "发送电子邮件",
|
||||
description: "立即发送新邮件或回复消息",
|
||||
},
|
||||
account: {
|
||||
title: "集成统计",
|
||||
description: "查看邮件收件箱统计数据和账户信息",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "查看收件箱",
|
||||
description: "从您的 Outlook 收件箱获取最近的邮件",
|
||||
},
|
||||
search: {
|
||||
title: "搜索邮件",
|
||||
description: "使用 Microsoft 搜索语法搜索电子邮件",
|
||||
},
|
||||
readThread: {
|
||||
title: "阅读对话",
|
||||
description: "阅读完整的电子邮件对话记录",
|
||||
},
|
||||
createDraft: {
|
||||
title: "创建草稿",
|
||||
description: "创建一个新的电子邮件草稿,或回复一个已存在的邮件。",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "更新草稿",
|
||||
description: "更新已有的电子邮件草稿",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "草稿清单",
|
||||
description: "列出所有草稿邮件",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "删除草稿",
|
||||
description: "删除草稿邮件",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "发送草稿",
|
||||
description: "发送已有的邮件草稿",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "发送电子邮件",
|
||||
description: "立即发送一封新的电子邮件,或回复已存在的消息。",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "邮件收件统计",
|
||||
description: "获取文件夹数量和邮箱统计信息",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google 日历连接器",
|
||||
description:
|
||||
"让您的代理能够与 Google 日历互动:查看日历、获取活动、创建和更新活动,以及管理确认回复。请参考相关文档。",
|
||||
multiUserWarning:
|
||||
"由于安全原因,在多用户模式下无法使用 Google 日历集成功能。请先禁用多用户模式,然后再使用此功能。",
|
||||
configuration: "谷歌日历配置",
|
||||
deploymentId: "部署ID",
|
||||
deploymentIdHelp: "您的 Google Apps Script 网页应用的部署 ID",
|
||||
apiKey: "API 密钥",
|
||||
apiKeyHelp: "您在 Google Apps Script 部署中配置的 API 密钥。",
|
||||
configurationRequired:
|
||||
"请配置部署 ID 和 API 密钥,以启用 Google 日历功能。",
|
||||
configured: "已配置",
|
||||
searchSkills: "搜索技巧...",
|
||||
noSkillsFound: "未找到与您搜索条件匹配的技能。",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "日历",
|
||||
description: "查看和管理您的 Google 日历",
|
||||
},
|
||||
readEvents: {
|
||||
title: "查看活动",
|
||||
description: "查看和搜索日历活动",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "创建和更新活动",
|
||||
description: "创建新的活动,并修改现有的活动。",
|
||||
},
|
||||
rsvp: {
|
||||
title: "请回复确认",
|
||||
description: "管理您对活动的响应状态",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "日历列表",
|
||||
description: "列出您拥有的或订阅的全部日历。",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "获取日历详情",
|
||||
description: "获取有关特定日历的详细信息",
|
||||
},
|
||||
getEvent: {
|
||||
title: "获取活动",
|
||||
description: "获取有关特定活动的详细信息",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "获取当日活动",
|
||||
description: "获取指定日期的所有活动",
|
||||
},
|
||||
getEvents: {
|
||||
title: "获取活动(日期范围)",
|
||||
description: "获取指定日期范围内的活动",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "查看即将举办的活动",
|
||||
description: "使用简单的关键词,查找今天、本周或本月的活动",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "快速添加活动",
|
||||
description: "从自然语言(例如“明天下午3点开会”)创建一个活动。",
|
||||
},
|
||||
createEvent: {
|
||||
title: "创建活动",
|
||||
description: "创建一个新的活动,并完全控制所有属性。",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "活动更新",
|
||||
description: "更新现有的日历事件",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "设置回复状态",
|
||||
description: "接受、拒绝或表示初步接受某个活动",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 服务器",
|
||||
@@ -439,6 +719,89 @@ 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 文档",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -538,7 +901,32 @@ const TRANSLATIONS = {
|
||||
description: "API 密钥允许持有者以编程方式访问和管理此 AnythingLLM 实例。",
|
||||
link: "阅读 API 文档",
|
||||
generate: "生成新的 API 密钥",
|
||||
empty: "未找到 API 密钥",
|
||||
actions: "操作",
|
||||
messages: {
|
||||
error: "错误:{{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "创建新的 API 密钥",
|
||||
cancel: "取消",
|
||||
close: "关闭",
|
||||
create: "创建 API 密钥",
|
||||
helper: "创建后,API 密钥可用于以编程方式访问并配置此 AnythingLLM 实例。",
|
||||
name: {
|
||||
label: "名称",
|
||||
placeholder: "生产环境集成",
|
||||
helper: "可选。使用一个易于识别的名称,以便之后识别此密钥。",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "复制 API 密钥",
|
||||
copied: "已复制",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"确定要停用此 API 密钥吗?\n停用后将无法再使用。\n\n此操作不可撤销。",
|
||||
},
|
||||
table: {
|
||||
name: "名称",
|
||||
key: "API 密钥",
|
||||
by: "创建者",
|
||||
created: "创建时间",
|
||||
@@ -1065,8 +1453,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"将您从 @BotFather 获得的 API 令牌粘贴到指定位置,并选择一个默认的工作区,以便您的机器人可以进行对话。",
|
||||
"bot-token": "机器人代币",
|
||||
"default-workspace": "默认工作区",
|
||||
"no-workspace": "目前没有可用的工作空间。将会创建一个新的工作空间。",
|
||||
connecting: "正在连接...",
|
||||
"connect-bot": "连接机器人",
|
||||
},
|
||||
@@ -1102,19 +1488,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "未能撤销用户权限。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "待审批",
|
||||
"pending-description":
|
||||
"等待验证的用户。请将此处显示的配对代码与他们在 Telegram 聊天中显示的配对代码进行匹配。",
|
||||
"approved-title": "已批准的用户",
|
||||
"approved-description": "已获得批准,可以与您的机器人进行对话的用户。",
|
||||
user: "用户",
|
||||
"pairing-code": "配对代码",
|
||||
"no-pending": "目前没有待处理的请求",
|
||||
"no-approved": "未批准的用户",
|
||||
unknown: "未知",
|
||||
approve: "批准",
|
||||
deny: "否认",
|
||||
revoke: "撤销",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -384,6 +384,287 @@ const TRANSLATIONS = {
|
||||
},
|
||||
},
|
||||
},
|
||||
gmail: {
|
||||
title: "Gmail 連接器",
|
||||
description:
|
||||
"讓您的代理能夠與 Gmail 互動:搜尋郵件、閱讀郵件討論、撰寫草稿、發送郵件,以及管理您的收件匣。請參閱相關文件。",
|
||||
multiUserWarning:
|
||||
"由於安全考量,Gmail 整合功能在多使用者模式下無法使用。請停用多使用者模式才能使用此功能。",
|
||||
configuration: "Gmail 設定",
|
||||
deploymentId: "部署 ID",
|
||||
deploymentIdHelp: "您的 Google Apps Script 網頁應用程式的部署 ID",
|
||||
apiKey: "API 關鍵字",
|
||||
apiKeyHelp: "您在 Google Apps Script 部署中設定的 API 金鑰",
|
||||
configurationRequired: "請設定部署 ID 和 API 關鍵,以啟用 Gmail 功能。",
|
||||
configured: "設定",
|
||||
searchSkills: "搜尋技巧...",
|
||||
noSkillsFound: "沒有符合您搜尋條件的結果。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "搜尋和閱讀電子郵件",
|
||||
description: "搜尋並閱讀您 Gmail 收件匣中的電子郵件。",
|
||||
},
|
||||
drafts: {
|
||||
title: "草稿郵件",
|
||||
description: "創建、編輯和管理電子郵件草稿",
|
||||
},
|
||||
send: {
|
||||
title: "發送和回覆電子郵件",
|
||||
description: "立即發送電子郵件並回覆討論串",
|
||||
},
|
||||
threads: {
|
||||
title: "管理電子郵件串",
|
||||
description: "管理電子郵件對話 - 標示已讀/未讀、歸檔、刪除",
|
||||
},
|
||||
account: {
|
||||
title: "整合統計",
|
||||
description: "查看郵箱統計資料和帳戶資訊",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
search: {
|
||||
title: "搜尋郵件",
|
||||
description: "使用 Gmail 的查詢語法搜尋電子郵件",
|
||||
},
|
||||
readThread: {
|
||||
title: "閱讀主題",
|
||||
description: "閱讀由 ID 創建的完整電子郵件對話",
|
||||
},
|
||||
createDraft: {
|
||||
title: "建立草稿",
|
||||
description: "建立新的電子郵件草稿",
|
||||
},
|
||||
createDraftReply: {
|
||||
title: "撰寫草稿回覆",
|
||||
description: "撰寫一份針對已有的討論串的回覆草稿。",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "更新草稿",
|
||||
description: "更新現有電子郵件草稿",
|
||||
},
|
||||
getDraft: {
|
||||
title: "取得草稿",
|
||||
description: "根據 ID 取得特定草稿",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "草稿清單",
|
||||
description: "列出所有草稿電子郵件",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "刪除草稿",
|
||||
description: "刪除草稿電子郵件",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "發送草稿",
|
||||
description: "發送現有電子郵件草稿",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "發送電子郵件",
|
||||
description: "立即發送電子郵件",
|
||||
},
|
||||
replyToThread: {
|
||||
title: "回覆主題",
|
||||
description: "立即回覆電子郵件討論串",
|
||||
},
|
||||
markRead: {
|
||||
title: "馬克·瑞德",
|
||||
description: "標示某個主題已閱讀",
|
||||
},
|
||||
markUnread: {
|
||||
title: "標示為未讀",
|
||||
description: "將某個主題標示為未讀",
|
||||
},
|
||||
moveToTrash: {
|
||||
title: "移至垃圾桶",
|
||||
description: "將主題移動到垃圾桶",
|
||||
},
|
||||
moveToArchive: {
|
||||
title: "檔案",
|
||||
description: "將主題歸檔",
|
||||
},
|
||||
moveToInbox: {
|
||||
title: "移動到收件匣",
|
||||
description: "將主題移動到收件匣",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "郵箱統計",
|
||||
description: "查看未讀郵件數量及郵箱統計數據",
|
||||
},
|
||||
getInbox: {
|
||||
title: "開啟收件匣",
|
||||
description: "簡潔的方式,讓您能輕鬆取得 Gmail 郵箱中的郵件。",
|
||||
},
|
||||
},
|
||||
},
|
||||
outlook: {
|
||||
title: "Outlook 連接器",
|
||||
description:
|
||||
"讓您的代理能夠與 Microsoft Outlook 互動 - 搜尋郵件、閱讀討論串、撰寫草稿、發送郵件,以及透過 Microsoft Graph API 管理您的收件匣。 詳情請參考<a>相關文件</a>。",
|
||||
multiUserWarning:
|
||||
"由於安全原因,Outlook 整合功能在多使用者模式下無法使用。請先停用多使用者模式,才能使用此功能。",
|
||||
configuration: "視圖配置",
|
||||
authType: "帳戶類型",
|
||||
authTypeHelp:
|
||||
"選擇哪些類型的 Microsoft 帳戶可以進行驗證。「所有帳戶」支援個人帳戶和工作/學校帳戶。「僅限個人帳戶」僅支援個人 Microsoft 帳戶。「僅限組織帳戶」僅支援特定 Azure AD 租戶中的工作/學校帳戶。",
|
||||
authTypeCommon: "所有帳戶(個人帳戶及工作/學校帳戶)",
|
||||
authTypeConsumers: "僅限個人 Microsoft 帳戶",
|
||||
authTypeOrganization: "僅限於組織帳戶(需要租戶 ID)",
|
||||
clientId: "申請者(客戶)編號",
|
||||
clientIdHelp: "您的 Azure AD 應用程式註冊產生的應用程式 ID",
|
||||
tenantId: "租戶編號",
|
||||
tenantIdHelp:
|
||||
"您的 Azure AD 應用程式註冊的「租戶 ID」。僅用於組織內單向驗證。",
|
||||
clientSecret: "客戶密鑰",
|
||||
clientSecretHelp: "您的 Azure AD 應用程式註冊時所使用的客戶端秘密值",
|
||||
configurationRequired:
|
||||
"請設定 Client ID 和 Client Secret,以便啟用 Outlook 相關功能。",
|
||||
authRequired:
|
||||
"首先儲存您的帳戶資訊,然後再透過 Microsoft 進行驗證,以完成設定。",
|
||||
authenticateWithMicrosoft: "使用 Microsoft 驗證",
|
||||
authenticated: "已成功與 Microsoft Outlook 驗證連線。",
|
||||
revokeAccess: "撤銷權限",
|
||||
configured: "設定",
|
||||
searchSkills: "搜尋技巧...",
|
||||
noSkillsFound: "沒有符合您搜尋條件的結果。",
|
||||
categories: {
|
||||
search: {
|
||||
title: "搜尋和閱讀電子郵件",
|
||||
description: "搜尋並閱讀您 Outlook 收件匣中的電子郵件",
|
||||
},
|
||||
drafts: {
|
||||
title: "草稿郵件",
|
||||
description: "創建、編輯和管理電子郵件草稿",
|
||||
},
|
||||
send: {
|
||||
title: "發送電子郵件",
|
||||
description: "即時發送新的電子郵件或回覆訊息",
|
||||
},
|
||||
account: {
|
||||
title: "整合統計數據",
|
||||
description: "查看郵箱統計資料和帳戶資訊",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
getInbox: {
|
||||
title: "開啟收件匣",
|
||||
description: "從您的 Outlook 郵箱取得最近的郵件",
|
||||
},
|
||||
search: {
|
||||
title: "搜尋電子郵件",
|
||||
description: "使用 Microsoft 搜尋語法來搜尋電子郵件",
|
||||
},
|
||||
readThread: {
|
||||
title: "閱讀對話",
|
||||
description: "閱讀完整的電子郵件對話紀錄",
|
||||
},
|
||||
createDraft: {
|
||||
title: "建立草稿",
|
||||
description: "建立新的電子郵件草稿,或回覆現有訊息的草稿。",
|
||||
},
|
||||
updateDraft: {
|
||||
title: "更新草稿",
|
||||
description: "更新現有電子郵件草稿",
|
||||
},
|
||||
listDrafts: {
|
||||
title: "草稿清單",
|
||||
description: "列出所有草稿電子郵件",
|
||||
},
|
||||
deleteDraft: {
|
||||
title: "刪除草稿",
|
||||
description: "刪除草稿郵件",
|
||||
},
|
||||
sendDraft: {
|
||||
title: "發送草稿",
|
||||
description: "發送現有電子郵件草稿",
|
||||
},
|
||||
sendEmail: {
|
||||
title: "發送電子郵件",
|
||||
description: "發送新的電子郵件或立即回覆現有訊息",
|
||||
},
|
||||
getMailboxStats: {
|
||||
title: "郵箱統計",
|
||||
description: "取得資料夾數量和郵箱統計數據",
|
||||
},
|
||||
},
|
||||
},
|
||||
googleCalendar: {
|
||||
title: "Google 日曆連線",
|
||||
description:
|
||||
"讓您的代理能夠與 Google 日曆互動:查看日曆、取得活動資訊、創建和更新活動,以及管理確認出席。 詳情請參考<a>文件</a>。",
|
||||
multiUserWarning:
|
||||
"由於安全原因,Google 日曆的整合功能在多使用者模式下無法使用。請先停用多使用者模式,然後再使用此功能。",
|
||||
configuration: "Google 日曆設定",
|
||||
deploymentId: "部署 ID",
|
||||
deploymentIdHelp: "您的 Google Apps Script 網頁應用程式的部署 ID",
|
||||
apiKey: "API 關鍵字",
|
||||
apiKeyHelp: "您在 Google Apps Script 部署中設定的 API 金鑰。",
|
||||
configurationRequired:
|
||||
"請設定部署 ID 和 API 鑰,以啟用 Google 日曆功能。",
|
||||
configured: "已設定",
|
||||
searchSkills: "搜尋技巧...",
|
||||
noSkillsFound: "沒有符合您搜尋條件的結果。",
|
||||
categories: {
|
||||
calendars: {
|
||||
title: "日曆",
|
||||
description: "檢視和管理您的 Google 日曆",
|
||||
},
|
||||
readEvents: {
|
||||
title: "閱讀活動",
|
||||
description: "查看和搜尋日曆活動",
|
||||
},
|
||||
writeEvents: {
|
||||
title: "建立與更新活動",
|
||||
description: "創建新的活動,並修改現有的活動。",
|
||||
},
|
||||
rsvp: {
|
||||
title: "請假確認管理",
|
||||
description: "管理您參加活動的回應狀態",
|
||||
},
|
||||
},
|
||||
skills: {
|
||||
listCalendars: {
|
||||
title: "日曆清單",
|
||||
description: "列出您擁有的或訂閱的全部日曆",
|
||||
},
|
||||
getCalendar: {
|
||||
title: "獲取日曆細節",
|
||||
description: "獲取有關特定日曆的詳細資訊",
|
||||
},
|
||||
getEvent: {
|
||||
title: "取得活動",
|
||||
description: "獲取有關特定活動的詳細資訊",
|
||||
},
|
||||
getEventsForDay: {
|
||||
title: "獲取特定日期的活動",
|
||||
description: "列出特定日期的所有活動",
|
||||
},
|
||||
getEvents: {
|
||||
title: "取得活動(日期範圍)",
|
||||
description: "取得指定日期範圍內的活動",
|
||||
},
|
||||
getUpcomingEvents: {
|
||||
title: "查看即將到來的活動",
|
||||
description: "使用簡單的關鍵字,即可查詢今日、本週或本月的活動",
|
||||
},
|
||||
quickAdd: {
|
||||
title: "快速新增活動",
|
||||
description:
|
||||
"從自然語言(例如:「明天下午 3 點舉行會議」)創建活動。",
|
||||
},
|
||||
createEvent: {
|
||||
title: "建立活動",
|
||||
description: "創建一個新的活動,並擁有對所有屬性的完全控制。",
|
||||
},
|
||||
updateEvent: {
|
||||
title: "活動更新",
|
||||
description: "更新現有的日曆事件",
|
||||
},
|
||||
setMyStatus: {
|
||||
title: "設定確認參加狀態",
|
||||
description: "接受、拒絕或表示暫時接受活動",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
mcp: {
|
||||
title: "MCP 伺服器",
|
||||
@@ -428,6 +709,89 @@ 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 文件",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
recorded: {
|
||||
@@ -449,7 +813,33 @@ const TRANSLATIONS = {
|
||||
"API 金鑰可讓持有人透過程式方式存取並管理這個 AnythingLLM 系統。",
|
||||
link: "閱讀 API 文件",
|
||||
generate: "產生新的 API 金鑰",
|
||||
empty: "找不到 API 金鑰",
|
||||
actions: "操作",
|
||||
messages: {
|
||||
error: "錯誤:{{error}}",
|
||||
},
|
||||
modal: {
|
||||
title: "建立新的 API 金鑰",
|
||||
cancel: "取消",
|
||||
close: "關閉",
|
||||
create: "建立 API 金鑰",
|
||||
helper:
|
||||
"建立後,API 金鑰可用於以程式方式存取並設定這個 AnythingLLM 執行個體。",
|
||||
name: {
|
||||
label: "名稱",
|
||||
placeholder: "正式環境整合",
|
||||
helper: "選填。請使用易於辨識的名稱,方便你之後識別這把金鑰。",
|
||||
},
|
||||
},
|
||||
row: {
|
||||
copy: "複製 API 金鑰",
|
||||
copied: "已複製",
|
||||
unnamed: "--",
|
||||
deleteConfirm:
|
||||
"確定要停用此 API 金鑰嗎?\n停用後將無法再使用。\n\n此操作無法復原。",
|
||||
},
|
||||
table: {
|
||||
name: "名稱",
|
||||
key: "API 金鑰",
|
||||
by: "建立者",
|
||||
created: "建立時間",
|
||||
@@ -1058,8 +1448,6 @@ const TRANSLATIONS = {
|
||||
description:
|
||||
"請將您從 @BotFather 處獲得的 API 令牌複製並貼上,然後選擇一個預設的工作空間,讓您的機器人與其對話。",
|
||||
"bot-token": "機器人代幣",
|
||||
"default-workspace": "預設工作空間",
|
||||
"no-workspace": "目前沒有可用的工作空間。將會創建一個新的工作空間。",
|
||||
connecting: "正在連接...",
|
||||
"connect-bot": "連線機器人",
|
||||
},
|
||||
@@ -1095,19 +1483,9 @@ const TRANSLATIONS = {
|
||||
"toast-revoke-failed": "未能取消使用者權限。",
|
||||
},
|
||||
users: {
|
||||
"pending-title": "待審核",
|
||||
"pending-description":
|
||||
"等待驗證的使用者。請將這裡顯示的配對碼與他們在 Telegram 聊天中顯示的配對碼對齊。",
|
||||
"approved-title": "已授權的使用者",
|
||||
"approved-description": "已獲得批准,可以與您的機器人進行對話的使用者。",
|
||||
user: "使用者",
|
||||
"pairing-code": "編碼組合",
|
||||
"no-pending": "目前沒有待處理的請求",
|
||||
"no-approved": "目前沒有已授權的使用者",
|
||||
unknown: "未知的",
|
||||
approve: "批准",
|
||||
deny: "拒絕",
|
||||
revoke: "撤銷",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -205,10 +205,11 @@ const Admin = {
|
||||
return { apiKeys: [], error: e.message };
|
||||
});
|
||||
},
|
||||
generateApiKey: async function () {
|
||||
generateApiKey: async function (data = {}) {
|
||||
return fetch(`${API_BASE}/admin/generate-api-key`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
.then((res) => {
|
||||
if (!res.ok) {
|
||||
|
||||
45
frontend/src/models/googleAgentSkills.js
Normal file
45
frontend/src/models/googleAgentSkills.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders } from "@/utils/request";
|
||||
|
||||
const GoogleAgentSkills = {
|
||||
gmail: {
|
||||
/**
|
||||
* Get the current configuration status for Gmail.
|
||||
* @returns {Promise<{success: boolean, isConfigured?: boolean, config?: {deploymentId: string, apiKey: string}, error?: string}>}
|
||||
*/
|
||||
getStatus: async () => {
|
||||
return await fetch(`${API_BASE}/admin/agent-skills/gmail/status`, {
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
calendar: {
|
||||
/**
|
||||
* Get the current configuration status for Google Calendar.
|
||||
* @returns {Promise<{success: boolean, isConfigured?: boolean, config?: {deploymentId: string, apiKey: string}, error?: string}>}
|
||||
*/
|
||||
getStatus: async () => {
|
||||
return await fetch(
|
||||
`${API_BASE}/admin/agent-skills/google-calendar/status`,
|
||||
{
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
}
|
||||
)
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default GoogleAgentSkills;
|
||||
65
frontend/src/models/outlookAgent.js
Normal file
65
frontend/src/models/outlookAgent.js
Normal file
@@ -0,0 +1,65 @@
|
||||
import { API_BASE } from "@/utils/constants";
|
||||
import { baseHeaders } from "@/utils/request";
|
||||
|
||||
const OutlookAgent = {
|
||||
/**
|
||||
* Save Outlook credentials and get the OAuth authorization URL.
|
||||
* @param {Object} credentials - The credentials to save
|
||||
* @param {string} credentials.clientId - Application (Client) ID
|
||||
* @param {string} credentials.tenantId - Directory (Tenant) ID
|
||||
* @param {string} credentials.clientSecret - Client Secret
|
||||
* @param {string} credentials.authType - Authentication type (organization, common, consumers)
|
||||
* @returns {Promise<{success: boolean, url?: string, error?: string}>}
|
||||
*/
|
||||
saveCredentialsAndGetAuthUrl: async ({
|
||||
clientId,
|
||||
tenantId,
|
||||
clientSecret,
|
||||
authType,
|
||||
}) => {
|
||||
return await fetch(`${API_BASE}/admin/agent-skills/outlook/auth-url`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify({ clientId, tenantId, clientSecret, authType }),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get the current authentication status for Outlook.
|
||||
* @returns {Promise<{success: boolean, isConfigured?: boolean, hasCredentials?: boolean, isAuthenticated?: boolean, tokenExpiry?: number, config?: {clientId: string, tenantId: string, clientSecret: string}, error?: string}>}
|
||||
*/
|
||||
getStatus: async () => {
|
||||
return await fetch(`${API_BASE}/admin/agent-skills/outlook/status`, {
|
||||
method: "GET",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Revoke the Outlook authentication tokens.
|
||||
* @returns {Promise<{success: boolean, error?: string}>}
|
||||
*/
|
||||
revokeAccess: async () => {
|
||||
return await fetch(`${API_BASE}/admin/agent-skills/outlook/revoke`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
return { success: false, error: e.message };
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
export default OutlookAgent;
|
||||
@@ -520,10 +520,11 @@ const System = {
|
||||
return { apiKey: null, error: e.message };
|
||||
});
|
||||
},
|
||||
generateApiKey: async function () {
|
||||
generateApiKey: async function (data = {}) {
|
||||
return fetch(`${API_BASE}/system/generate-api-key`, {
|
||||
method: "POST",
|
||||
headers: baseHeaders(),
|
||||
body: JSON.stringify(data),
|
||||
})
|
||||
.then((res) => {
|
||||
if (!res.ok) {
|
||||
|
||||
@@ -55,6 +55,15 @@ const Workspace = {
|
||||
|
||||
return { workspace, message };
|
||||
},
|
||||
removeQueuedEmbedding: async function (slug, filename) {
|
||||
return fetch(`${API_BASE}/workspace/${slug}/embed-queue`, {
|
||||
method: "DELETE",
|
||||
body: JSON.stringify({ filename }),
|
||||
headers: baseHeaders(),
|
||||
})
|
||||
.then((res) => res.json())
|
||||
.catch(() => ({ success: false }));
|
||||
},
|
||||
chatHistory: async function (slug) {
|
||||
const history = await fetch(`${API_BASE}/workspace/${slug}/chats`, {
|
||||
method: "GET",
|
||||
|
||||
@@ -12,6 +12,7 @@ function ManageFlowMenu({ flow, onDelete }) {
|
||||
const navigate = useNavigate();
|
||||
|
||||
async function deleteFlow() {
|
||||
setOpen(false);
|
||||
if (
|
||||
!window.confirm(
|
||||
"Are you sure you want to delete this flow? This action cannot be undone."
|
||||
@@ -28,6 +29,8 @@ function ManageFlowMenu({ flow, onDelete }) {
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
if (!open) return;
|
||||
|
||||
const handleClickOutside = (event) => {
|
||||
if (menuRef.current && !menuRef.current.contains(event.target)) {
|
||||
setOpen(false);
|
||||
@@ -38,7 +41,7 @@ function ManageFlowMenu({ flow, onDelete }) {
|
||||
return () => {
|
||||
document.removeEventListener("mousedown", handleClickOutside);
|
||||
};
|
||||
}, []);
|
||||
}, [open]);
|
||||
|
||||
return (
|
||||
<div className="relative" ref={menuRef}>
|
||||
@@ -50,20 +53,20 @@ function ManageFlowMenu({ flow, onDelete }) {
|
||||
<Gear className="h-5 w-5" weight="bold" />
|
||||
</button>
|
||||
{open && (
|
||||
<div className="absolute w-[100px] -top-1 left-7 mt-1 border-[1.5px] border-white/40 rounded-lg bg-theme-action-menu-bg flex flex-col shadow-[0_4px_14px_rgba(0,0,0,0.25)] text-white z-99 md:z-10">
|
||||
<div className="absolute min-w-[140px] top-full right-0 mt-1 border-[1.5px] border-white/40 rounded-lg bg-theme-action-menu-bg flex flex-col shadow-[0_4px_14px_rgba(0,0,0,0.25)] text-white z-99 md:z-10">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => navigate(paths.agents.editAgent(flow.uuid))}
|
||||
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">Edit Flow</span>
|
||||
<span className="text-sm whitespace-nowrap">Edit Flow</span>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
onClick={deleteFlow}
|
||||
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 Flow</span>
|
||||
<span className="text-sm whitespace-nowrap">Delete Flow</span>
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
@@ -71,23 +74,15 @@ function ManageFlowMenu({ flow, onDelete }) {
|
||||
);
|
||||
}
|
||||
|
||||
export default function FlowPanel({ flow, toggleFlow, onDelete }) {
|
||||
const [isActive, setIsActive] = useState(flow.active);
|
||||
|
||||
useEffect(() => {
|
||||
setIsActive(flow.active);
|
||||
}, [flow.uuid, flow.active]);
|
||||
|
||||
export default function FlowPanel({ flow, toggleFlow, enabled, onDelete }) {
|
||||
const handleToggle = async () => {
|
||||
try {
|
||||
const { success, error } = await AgentFlows.toggleFlow(
|
||||
flow.uuid,
|
||||
!isActive
|
||||
!enabled
|
||||
);
|
||||
if (!success) throw new Error(error);
|
||||
setIsActive(!isActive);
|
||||
toggleFlow(flow.uuid);
|
||||
showToast("Flow status updated successfully", "success", { clear: true });
|
||||
} catch (error) {
|
||||
console.error("Failed to toggle flow:", error);
|
||||
showToast("Failed to toggle flow", "error", { clear: true });
|
||||
@@ -106,7 +101,7 @@ export default function FlowPanel({ flow, toggleFlow, onDelete }) {
|
||||
</label>
|
||||
</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<Toggle size="lg" enabled={isActive} onChange={handleToggle} />
|
||||
<Toggle size="lg" enabled={enabled} onChange={handleToggle} />
|
||||
<ManageFlowMenu flow={flow} onDelete={onDelete} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,6 +5,7 @@ export default function AgentFlowsList({
|
||||
flows = [],
|
||||
selectedFlow,
|
||||
handleClick,
|
||||
activeFlowIds = [],
|
||||
}) {
|
||||
if (flows.length === 0) {
|
||||
return (
|
||||
@@ -43,7 +44,7 @@ export default function AgentFlowsList({
|
||||
<div className="text-sm font-light">{flow.name}</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<div className="text-sm text-theme-text-secondary font-medium">
|
||||
{flow.active ? "On" : "Off"}
|
||||
{activeFlowIds.includes(flow.uuid) ? "On" : "Off"}
|
||||
</div>
|
||||
<CaretRight
|
||||
size={14}
|
||||
|
||||
@@ -173,12 +173,17 @@ function SkillRow({ skill, disabled, onToggle }) {
|
||||
}`}
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<Icon size={22} className="text-slate-100 shrink-0" />
|
||||
<Icon
|
||||
size={22}
|
||||
className="text-slate-100 light:text-slate-900 shrink-0"
|
||||
/>
|
||||
<div className="flex flex-col">
|
||||
<span className="text-sm font-medium text-slate-100">
|
||||
<span className="text-sm font-medium text-slate-100 light:text-slate-900">
|
||||
{skill.title}
|
||||
</span>
|
||||
<span className="text-xs text-slate-100/50">{skill.description}</span>
|
||||
<span className="text-xs text-slate-100/50 light:text-slate-900/50">
|
||||
{skill.description}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
|
||||
BIN
frontend/src/pages/Admin/Agents/GMailSkillPanel/gmail.png
Normal file
BIN
frontend/src/pages/Admin/Agents/GMailSkillPanel/gmail.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
448
frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx
Normal file
448
frontend/src/pages/Admin/Agents/GMailSkillPanel/index.jsx
Normal file
@@ -0,0 +1,448 @@
|
||||
import React, {
|
||||
useEffect,
|
||||
useState,
|
||||
useRef,
|
||||
useMemo,
|
||||
useCallback,
|
||||
} from "react";
|
||||
import Toggle, { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { Trans, useTranslation } from "react-i18next";
|
||||
import debounce from "lodash.debounce";
|
||||
import {
|
||||
MagnifyingGlass,
|
||||
CircleNotch,
|
||||
Warning,
|
||||
CaretDown,
|
||||
CheckCircle,
|
||||
Info,
|
||||
} from "@phosphor-icons/react";
|
||||
import GMailIcon from "./gmail.png";
|
||||
import Admin from "@/models/admin";
|
||||
import System from "@/models/system";
|
||||
import GoogleAgentSkills from "@/models/googleAgentSkills";
|
||||
import { getGmailSkills, filterSkillCategories } from "./utils";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import { Link } from "react-router-dom";
|
||||
import paths from "@/utils/paths";
|
||||
|
||||
export default function GMailSkillPanel({
|
||||
title,
|
||||
skill,
|
||||
toggleSkill,
|
||||
enabled = false,
|
||||
disabled = false,
|
||||
setHasChanges,
|
||||
hasChanges = false,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [disabledSkills, setDisabledSkills] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [deploymentId, setDeploymentId] = useState("");
|
||||
const [apiKey, setApiKey] = useState("");
|
||||
const [isMultiUserMode, setIsMultiUserMode] = useState(false);
|
||||
const [configDefaultExpanded, setConfigDefaultExpanded] = useState(true);
|
||||
const prevHasChanges = useRef(hasChanges);
|
||||
const skillCategories = getGmailSkills(t);
|
||||
|
||||
useEffect(() => {
|
||||
setLoading(true);
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_gmail_skills"]),
|
||||
System.keys(),
|
||||
GoogleAgentSkills.gmail.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, settingsRes, statusRes]) => {
|
||||
setDisabledSkills(prefsRes?.settings?.disabled_gmail_skills ?? []);
|
||||
setIsMultiUserMode(settingsRes?.MultiUserMode ?? false);
|
||||
|
||||
if (statusRes?.success && statusRes.config) {
|
||||
const loadedDeploymentId = statusRes.config.deploymentId || "";
|
||||
const loadedApiKey = statusRes.config.apiKey || "";
|
||||
setDeploymentId(loadedDeploymentId);
|
||||
setApiKey(loadedApiKey);
|
||||
setConfigDefaultExpanded(!(loadedDeploymentId && loadedApiKey));
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setDisabledSkills([]);
|
||||
setDeploymentId("");
|
||||
setApiKey("");
|
||||
})
|
||||
.finally(() => setLoading(false));
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevHasChanges.current === true && hasChanges === false) {
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_gmail_skills"]),
|
||||
GoogleAgentSkills.gmail.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, statusRes]) => {
|
||||
setDisabledSkills(prefsRes?.settings?.disabled_gmail_skills ?? []);
|
||||
if (statusRes?.success && statusRes.config) {
|
||||
setDeploymentId(statusRes.config.deploymentId || "");
|
||||
setApiKey(statusRes.config.apiKey || "");
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
prevHasChanges.current = hasChanges;
|
||||
}, [hasChanges]);
|
||||
|
||||
function toggleGmailSkill(skillName) {
|
||||
setHasChanges(true);
|
||||
setDisabledSkills((prev) =>
|
||||
prev.includes(skillName)
|
||||
? prev.filter((s) => s !== skillName)
|
||||
: [...prev, skillName]
|
||||
);
|
||||
}
|
||||
|
||||
const isConfigured = deploymentId && apiKey;
|
||||
|
||||
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">
|
||||
<img src={GMailIcon} alt="GMail" className="w-6 h-6" />
|
||||
<label className="text-theme-text-primary text-md font-bold">
|
||||
{title}
|
||||
</label>
|
||||
</div>
|
||||
<Toggle
|
||||
size="lg"
|
||||
enabled={enabled}
|
||||
disabled={disabled || isMultiUserMode}
|
||||
onChange={() => toggleSkill(skill)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{isMultiUserMode && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-yellow-500 shrink-0" />
|
||||
<p className="text-yellow-500 text-xs">
|
||||
{t("agent.skill.gmail.multiUserWarning")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<p className="text-theme-text-secondary text-opacity-60 text-xs font-medium">
|
||||
<Trans
|
||||
i18nKey="agent.skill.gmail.description"
|
||||
components={{
|
||||
a: (
|
||||
<Link
|
||||
className="text-sky-400 hover:text-sky-500 text-xs font-medium underline"
|
||||
to={paths.docs("/agent/usage/gmail-agent")}
|
||||
target="_blank"
|
||||
/>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
|
||||
{enabled && !isMultiUserMode && (
|
||||
<>
|
||||
<HiddenFormInputs
|
||||
disabledSkills={disabledSkills}
|
||||
deploymentId={deploymentId}
|
||||
apiKey={apiKey}
|
||||
/>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-4">
|
||||
<CircleNotch
|
||||
size={24}
|
||||
className="animate-spin text-theme-text-primary"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<ConfigurationSection
|
||||
deploymentId={deploymentId}
|
||||
setDeploymentId={setDeploymentId}
|
||||
apiKey={apiKey}
|
||||
setApiKey={setApiKey}
|
||||
setHasChanges={setHasChanges}
|
||||
isConfigured={isConfigured}
|
||||
defaultExpanded={configDefaultExpanded}
|
||||
/>
|
||||
|
||||
{isConfigured && (
|
||||
<SkillsSection
|
||||
skillCategories={skillCategories}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={toggleGmailSkill}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ConfigurationSection({
|
||||
deploymentId,
|
||||
setDeploymentId,
|
||||
apiKey,
|
||||
setApiKey,
|
||||
setHasChanges,
|
||||
isConfigured,
|
||||
defaultExpanded = true,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [expanded, setExpanded] = useState(defaultExpanded);
|
||||
|
||||
return (
|
||||
<div className="border border-theme-sidebar-border/50 rounded-lg overflow-hidden mt-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setExpanded(!expanded)}
|
||||
className="border-none w-full flex items-center justify-between p-3 bg-theme-bg-secondary/30 hover:bg-theme-bg-secondary/50 transition-colors"
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<span className="text-theme-text-primary font-semibold text-sm">
|
||||
{t("agent.skill.gmail.configuration")}
|
||||
</span>
|
||||
{isConfigured && (
|
||||
<div className="flex items-center gap-x-1">
|
||||
<CheckCircle size={14} weight="fill" className="text-green-500" />
|
||||
<span className="text-xs text-green-500">
|
||||
{t("agent.skill.gmail.configured")}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<CaretDown
|
||||
size={16}
|
||||
className={`text-theme-text-secondary transition-transform ${expanded ? "rotate-180" : ""}`}
|
||||
/>
|
||||
</button>
|
||||
|
||||
{expanded && (
|
||||
<div className="p-3 flex flex-col gap-y-4 border-t border-theme-sidebar-border/50">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.gmail.deploymentId")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="deployment-id-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="deployment-id-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.gmail.deploymentIdHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={deploymentId}
|
||||
onChange={(e) => {
|
||||
setDeploymentId(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="AKfycb..."
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.gmail.apiKey")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="api-key-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="api-key-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.gmail.apiKeyHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="password"
|
||||
value={apiKey}
|
||||
onChange={(e) => {
|
||||
setApiKey(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="Your API key..."
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
{!isConfigured && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-orange-500/10 border border-orange-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-orange-500 shrink-0" />
|
||||
<p className="text-orange-500 text-xs">
|
||||
{t("agent.skill.gmail.configurationRequired")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillSearchInput({ onSearch }) {
|
||||
const { t } = useTranslation();
|
||||
const inputRef = useRef(null);
|
||||
|
||||
const debouncedSearch = useMemo(
|
||||
() =>
|
||||
debounce((value) => {
|
||||
onSearch(value);
|
||||
}, 300),
|
||||
[onSearch]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
debouncedSearch.cancel();
|
||||
};
|
||||
}, [debouncedSearch]);
|
||||
|
||||
const handleChange = (e) => {
|
||||
debouncedSearch(e.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="relative">
|
||||
<input
|
||||
ref={inputRef}
|
||||
type="search"
|
||||
placeholder={t("agent.skill.gmail.searchSkills")}
|
||||
onChange={handleChange}
|
||||
className="w-full pl-9 pr-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50 search-input"
|
||||
/>
|
||||
<MagnifyingGlass
|
||||
size={16}
|
||||
className="absolute left-3 top-1/2 -translate-y-1/2 text-theme-text-secondary"
|
||||
weight="bold"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillsSection({ skillCategories, disabledSkills, onToggle }) {
|
||||
const { t } = useTranslation();
|
||||
const [searchTerm, setSearchTerm] = useState("");
|
||||
|
||||
const handleSearch = useCallback((value) => {
|
||||
setSearchTerm(value);
|
||||
}, []);
|
||||
|
||||
const filteredCategories = useMemo(
|
||||
() => filterSkillCategories(skillCategories, searchTerm),
|
||||
[skillCategories, searchTerm]
|
||||
);
|
||||
|
||||
const hasResults = Object.keys(filteredCategories).length > 0;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col mt-4 gap-y-4">
|
||||
<SkillSearchInput onSearch={handleSearch} />
|
||||
{hasResults ? (
|
||||
<div className="flex flex-col gap-y-4">
|
||||
{Object.entries(filteredCategories).map(([categoryKey, category]) => (
|
||||
<CategorySection
|
||||
key={categoryKey}
|
||||
category={category}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={onToggle}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p className="text-theme-text-secondary text-sm text-center py-4">
|
||||
{t("agent.skill.gmail.noSkillsFound")}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function CategorySection({ category, disabledSkills, onToggle }) {
|
||||
const Icon = category.icon;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2 px-1">
|
||||
<Icon size={18} className="text-theme-text-primary" />
|
||||
<span className="text-sm font-medium text-theme-text-primary">
|
||||
{category.title}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{category.skills.map((skill) => (
|
||||
<SkillRow
|
||||
key={skill.name}
|
||||
skill={skill}
|
||||
disabled={disabledSkills.includes(skill.name)}
|
||||
onToggle={() => onToggle(skill.name)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillRow({ skill, disabled, onToggle }) {
|
||||
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 flex-col">
|
||||
<span className="text-sm font-medium text-slate-100 light:text-slate-900">
|
||||
{skill.title}
|
||||
</span>
|
||||
<span className="text-xs text-slate-100/50 light:text-slate-900/50">
|
||||
{skill.description}
|
||||
</span>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function HiddenFormInputs({ disabledSkills, deploymentId, apiKey }) {
|
||||
const configJson = JSON.stringify({
|
||||
deploymentId: deploymentId || "",
|
||||
apiKey: apiKey || "",
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
<input
|
||||
name="system::disabled_gmail_skills"
|
||||
type="hidden"
|
||||
value={disabledSkills.join(",")}
|
||||
/>
|
||||
<input
|
||||
name="system::gmail_agent_config"
|
||||
type="hidden"
|
||||
value={configJson}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
136
frontend/src/pages/Admin/Agents/GMailSkillPanel/utils.js
Normal file
136
frontend/src/pages/Admin/Agents/GMailSkillPanel/utils.js
Normal file
@@ -0,0 +1,136 @@
|
||||
import {
|
||||
MagnifyingGlass,
|
||||
EnvelopeOpen,
|
||||
PaperPlaneTilt,
|
||||
ChartBar,
|
||||
PencilSimple,
|
||||
} from "@phosphor-icons/react";
|
||||
export { filterSkillCategories } from "../utils";
|
||||
|
||||
export const getGmailSkills = (t) => ({
|
||||
search: {
|
||||
title: t("agent.skill.gmail.categories.search.title"),
|
||||
description: t("agent.skill.gmail.categories.search.description"),
|
||||
icon: MagnifyingGlass,
|
||||
skills: [
|
||||
{
|
||||
name: "gmail-get-inbox",
|
||||
title: t("agent.skill.gmail.skills.getInbox.title"),
|
||||
description: t("agent.skill.gmail.skills.getInbox.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-search",
|
||||
title: t("agent.skill.gmail.skills.search.title"),
|
||||
description: t("agent.skill.gmail.skills.search.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-read-thread",
|
||||
title: t("agent.skill.gmail.skills.readThread.title"),
|
||||
description: t("agent.skill.gmail.skills.readThread.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
drafts: {
|
||||
title: t("agent.skill.gmail.categories.drafts.title"),
|
||||
description: t("agent.skill.gmail.categories.drafts.description"),
|
||||
icon: PencilSimple,
|
||||
skills: [
|
||||
{
|
||||
name: "gmail-create-draft",
|
||||
title: t("agent.skill.gmail.skills.createDraft.title"),
|
||||
description: t("agent.skill.gmail.skills.createDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-create-draft-reply",
|
||||
title: t("agent.skill.gmail.skills.createDraftReply.title"),
|
||||
description: t("agent.skill.gmail.skills.createDraftReply.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-update-draft",
|
||||
title: t("agent.skill.gmail.skills.updateDraft.title"),
|
||||
description: t("agent.skill.gmail.skills.updateDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-get-draft",
|
||||
title: t("agent.skill.gmail.skills.getDraft.title"),
|
||||
description: t("agent.skill.gmail.skills.getDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-list-drafts",
|
||||
title: t("agent.skill.gmail.skills.listDrafts.title"),
|
||||
description: t("agent.skill.gmail.skills.listDrafts.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-delete-draft",
|
||||
title: t("agent.skill.gmail.skills.deleteDraft.title"),
|
||||
description: t("agent.skill.gmail.skills.deleteDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-send-draft",
|
||||
title: t("agent.skill.gmail.skills.sendDraft.title"),
|
||||
description: t("agent.skill.gmail.skills.sendDraft.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
send: {
|
||||
title: t("agent.skill.gmail.categories.send.title"),
|
||||
description: t("agent.skill.gmail.categories.send.description"),
|
||||
icon: PaperPlaneTilt,
|
||||
skills: [
|
||||
{
|
||||
name: "gmail-send-email",
|
||||
title: t("agent.skill.gmail.skills.sendEmail.title"),
|
||||
description: t("agent.skill.gmail.skills.sendEmail.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-reply-to-thread",
|
||||
title: t("agent.skill.gmail.skills.replyToThread.title"),
|
||||
description: t("agent.skill.gmail.skills.replyToThread.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
threads: {
|
||||
title: t("agent.skill.gmail.categories.threads.title"),
|
||||
description: t("agent.skill.gmail.categories.threads.description"),
|
||||
icon: EnvelopeOpen,
|
||||
skills: [
|
||||
{
|
||||
name: "gmail-mark-read",
|
||||
title: t("agent.skill.gmail.skills.markRead.title"),
|
||||
description: t("agent.skill.gmail.skills.markRead.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-mark-unread",
|
||||
title: t("agent.skill.gmail.skills.markUnread.title"),
|
||||
description: t("agent.skill.gmail.skills.markUnread.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-move-to-trash",
|
||||
title: t("agent.skill.gmail.skills.moveToTrash.title"),
|
||||
description: t("agent.skill.gmail.skills.moveToTrash.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-move-to-archive",
|
||||
title: t("agent.skill.gmail.skills.moveToArchive.title"),
|
||||
description: t("agent.skill.gmail.skills.moveToArchive.description"),
|
||||
},
|
||||
{
|
||||
name: "gmail-move-to-inbox",
|
||||
title: t("agent.skill.gmail.skills.moveToInbox.title"),
|
||||
description: t("agent.skill.gmail.skills.moveToInbox.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
account: {
|
||||
title: t("agent.skill.gmail.categories.account.title"),
|
||||
description: t("agent.skill.gmail.categories.account.description"),
|
||||
icon: ChartBar,
|
||||
skills: [
|
||||
{
|
||||
name: "gmail-get-mailbox-stats",
|
||||
title: t("agent.skill.gmail.skills.getMailboxStats.title"),
|
||||
description: t("agent.skill.gmail.skills.getMailboxStats.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,457 @@
|
||||
import React, {
|
||||
useEffect,
|
||||
useState,
|
||||
useRef,
|
||||
useMemo,
|
||||
useCallback,
|
||||
} from "react";
|
||||
import Toggle, { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { Trans, useTranslation } from "react-i18next";
|
||||
import debounce from "lodash.debounce";
|
||||
import {
|
||||
MagnifyingGlass,
|
||||
CircleNotch,
|
||||
Warning,
|
||||
CaretDown,
|
||||
CheckCircle,
|
||||
Info,
|
||||
} from "@phosphor-icons/react";
|
||||
import Admin from "@/models/admin";
|
||||
import System from "@/models/system";
|
||||
import GoogleAgentSkills from "@/models/googleAgentSkills";
|
||||
import { getGoogleCalendarSkills, filterSkillCategories } from "./utils";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import { Link } from "react-router-dom";
|
||||
import paths from "@/utils/paths";
|
||||
import GoogleCalendarIcon from "./google-calendar.png";
|
||||
|
||||
export default function GoogleCalendarSkillPanel({
|
||||
title,
|
||||
skill,
|
||||
toggleSkill,
|
||||
enabled = false,
|
||||
disabled = false,
|
||||
setHasChanges,
|
||||
hasChanges = false,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [disabledSkills, setDisabledSkills] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [deploymentId, setDeploymentId] = useState("");
|
||||
const [apiKey, setApiKey] = useState("");
|
||||
const [isMultiUserMode, setIsMultiUserMode] = useState(false);
|
||||
const [configDefaultExpanded, setConfigDefaultExpanded] = useState(true);
|
||||
const prevHasChanges = useRef(hasChanges);
|
||||
const skillCategories = getGoogleCalendarSkills(t);
|
||||
|
||||
useEffect(() => {
|
||||
setLoading(true);
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_google_calendar_skills"]),
|
||||
System.keys(),
|
||||
GoogleAgentSkills.calendar.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, settingsRes, statusRes]) => {
|
||||
setDisabledSkills(
|
||||
prefsRes?.settings?.disabled_google_calendar_skills ?? []
|
||||
);
|
||||
setIsMultiUserMode(settingsRes?.MultiUserMode ?? false);
|
||||
|
||||
if (statusRes?.success && statusRes.config) {
|
||||
const loadedDeploymentId = statusRes.config.deploymentId || "";
|
||||
const loadedApiKey = statusRes.config.apiKey || "";
|
||||
setDeploymentId(loadedDeploymentId);
|
||||
setApiKey(loadedApiKey);
|
||||
setConfigDefaultExpanded(!(loadedDeploymentId && loadedApiKey));
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setDisabledSkills([]);
|
||||
setDeploymentId("");
|
||||
setApiKey("");
|
||||
})
|
||||
.finally(() => setLoading(false));
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevHasChanges.current === true && hasChanges === false) {
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_google_calendar_skills"]),
|
||||
GoogleAgentSkills.calendar.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, statusRes]) => {
|
||||
setDisabledSkills(
|
||||
prefsRes?.settings?.disabled_google_calendar_skills ?? []
|
||||
);
|
||||
if (statusRes?.success && statusRes.config) {
|
||||
setDeploymentId(statusRes.config.deploymentId || "");
|
||||
setApiKey(statusRes.config.apiKey || "");
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
prevHasChanges.current = hasChanges;
|
||||
}, [hasChanges]);
|
||||
|
||||
function toggleGoogleCalendarSkill(skillName) {
|
||||
setHasChanges(true);
|
||||
setDisabledSkills((prev) =>
|
||||
prev.includes(skillName)
|
||||
? prev.filter((s) => s !== skillName)
|
||||
: [...prev, skillName]
|
||||
);
|
||||
}
|
||||
|
||||
const isConfigured = deploymentId && apiKey;
|
||||
|
||||
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">
|
||||
<img
|
||||
src={GoogleCalendarIcon}
|
||||
alt="Google Calendar"
|
||||
width={24}
|
||||
height={24}
|
||||
/>
|
||||
<label className="text-theme-text-primary text-md font-bold">
|
||||
{title}
|
||||
</label>
|
||||
</div>
|
||||
<Toggle
|
||||
size="lg"
|
||||
enabled={enabled}
|
||||
disabled={disabled || isMultiUserMode}
|
||||
onChange={() => toggleSkill(skill)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{isMultiUserMode && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-yellow-500 shrink-0" />
|
||||
<p className="text-yellow-500 text-xs">
|
||||
{t("agent.skill.googleCalendar.multiUserWarning")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<p className="text-theme-text-secondary text-opacity-60 text-xs font-medium">
|
||||
<Trans
|
||||
i18nKey="agent.skill.googleCalendar.description"
|
||||
components={{
|
||||
a: (
|
||||
<Link
|
||||
className="text-sky-400 hover:text-sky-500 text-xs font-medium underline"
|
||||
to={paths.docs("/agent/usage/google-calendar-agent")}
|
||||
target="_blank"
|
||||
/>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
|
||||
{enabled && !isMultiUserMode && (
|
||||
<>
|
||||
<HiddenFormInputs
|
||||
disabledSkills={disabledSkills}
|
||||
deploymentId={deploymentId}
|
||||
apiKey={apiKey}
|
||||
/>
|
||||
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-4">
|
||||
<CircleNotch
|
||||
size={24}
|
||||
className="animate-spin text-theme-text-primary"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<ConfigurationSection
|
||||
deploymentId={deploymentId}
|
||||
setDeploymentId={setDeploymentId}
|
||||
apiKey={apiKey}
|
||||
setApiKey={setApiKey}
|
||||
setHasChanges={setHasChanges}
|
||||
isConfigured={isConfigured}
|
||||
defaultExpanded={configDefaultExpanded}
|
||||
/>
|
||||
|
||||
{isConfigured && (
|
||||
<SkillsSection
|
||||
skillCategories={skillCategories}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={toggleGoogleCalendarSkill}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ConfigurationSection({
|
||||
deploymentId,
|
||||
setDeploymentId,
|
||||
apiKey,
|
||||
setApiKey,
|
||||
setHasChanges,
|
||||
isConfigured,
|
||||
defaultExpanded = true,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [expanded, setExpanded] = useState(defaultExpanded);
|
||||
|
||||
return (
|
||||
<div className="border border-theme-sidebar-border/50 rounded-lg overflow-hidden mt-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setExpanded(!expanded)}
|
||||
className="border-none w-full flex items-center justify-between p-3 bg-theme-bg-secondary/30 hover:bg-theme-bg-secondary/50 transition-colors"
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<span className="text-theme-text-primary font-semibold text-sm">
|
||||
{t("agent.skill.googleCalendar.configuration")}
|
||||
</span>
|
||||
{isConfigured && (
|
||||
<div className="flex items-center gap-x-1">
|
||||
<CheckCircle size={14} weight="fill" className="text-green-500" />
|
||||
<span className="text-xs text-green-500">
|
||||
{t("agent.skill.googleCalendar.configured")}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<CaretDown
|
||||
size={16}
|
||||
className={`text-theme-text-secondary transition-transform ${expanded ? "rotate-180" : ""}`}
|
||||
/>
|
||||
</button>
|
||||
|
||||
{expanded && (
|
||||
<div className="p-3 flex flex-col gap-y-4 border-t border-theme-sidebar-border/50">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.googleCalendar.deploymentId")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="gcal-deployment-id-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="gcal-deployment-id-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.googleCalendar.deploymentIdHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={deploymentId}
|
||||
onChange={(e) => {
|
||||
setDeploymentId(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="AKfycb..."
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.googleCalendar.apiKey")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="gcal-api-key-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="gcal-api-key-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.googleCalendar.apiKeyHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="password"
|
||||
value={apiKey}
|
||||
onChange={(e) => {
|
||||
setApiKey(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="Your API key..."
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
{!isConfigured && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-orange-500/10 border border-orange-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-orange-500 shrink-0" />
|
||||
<p className="text-orange-500 text-xs">
|
||||
{t("agent.skill.googleCalendar.configurationRequired")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillSearchInput({ onSearch }) {
|
||||
const { t } = useTranslation();
|
||||
const inputRef = useRef(null);
|
||||
|
||||
const debouncedSearch = useMemo(
|
||||
() =>
|
||||
debounce((value) => {
|
||||
onSearch(value);
|
||||
}, 300),
|
||||
[onSearch]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
debouncedSearch.cancel();
|
||||
};
|
||||
}, [debouncedSearch]);
|
||||
|
||||
const handleChange = (e) => {
|
||||
debouncedSearch(e.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="relative">
|
||||
<input
|
||||
ref={inputRef}
|
||||
type="search"
|
||||
placeholder={t("agent.skill.googleCalendar.searchSkills")}
|
||||
onChange={handleChange}
|
||||
className="w-full pl-9 pr-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50 search-input"
|
||||
/>
|
||||
<MagnifyingGlass
|
||||
size={16}
|
||||
className="absolute left-3 top-1/2 -translate-y-1/2 text-theme-text-secondary"
|
||||
weight="bold"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillsSection({ skillCategories, disabledSkills, onToggle }) {
|
||||
const { t } = useTranslation();
|
||||
const [searchTerm, setSearchTerm] = useState("");
|
||||
|
||||
const handleSearch = useCallback((value) => {
|
||||
setSearchTerm(value);
|
||||
}, []);
|
||||
|
||||
const filteredCategories = useMemo(
|
||||
() => filterSkillCategories(skillCategories, searchTerm),
|
||||
[skillCategories, searchTerm]
|
||||
);
|
||||
|
||||
const hasResults = Object.keys(filteredCategories).length > 0;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col mt-4 gap-y-4">
|
||||
<SkillSearchInput onSearch={handleSearch} />
|
||||
{hasResults ? (
|
||||
<div className="flex flex-col gap-y-4">
|
||||
{Object.entries(filteredCategories).map(([categoryKey, category]) => (
|
||||
<CategorySection
|
||||
key={categoryKey}
|
||||
category={category}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={onToggle}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p className="text-theme-text-secondary text-sm text-center py-4">
|
||||
{t("agent.skill.googleCalendar.noSkillsFound")}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function CategorySection({ category, disabledSkills, onToggle }) {
|
||||
const Icon = category.icon;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2 px-1">
|
||||
<Icon size={18} className="text-theme-text-primary" />
|
||||
<span className="text-sm font-medium text-theme-text-primary">
|
||||
{category.title}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{category.skills.map((skill) => (
|
||||
<SkillRow
|
||||
key={skill.name}
|
||||
skill={skill}
|
||||
disabled={disabledSkills.includes(skill.name)}
|
||||
onToggle={() => onToggle(skill.name)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillRow({ skill, disabled, onToggle }) {
|
||||
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 flex-col">
|
||||
<span className="text-sm font-medium text-slate-100 light:text-slate-900">
|
||||
{skill.title}
|
||||
</span>
|
||||
<span className="text-xs text-slate-100/50 light:text-slate-900/50">
|
||||
{skill.description}
|
||||
</span>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function HiddenFormInputs({ disabledSkills, deploymentId, apiKey }) {
|
||||
const configJson = JSON.stringify({
|
||||
deploymentId: deploymentId || "",
|
||||
apiKey: apiKey || "",
|
||||
});
|
||||
|
||||
return (
|
||||
<>
|
||||
<input
|
||||
name="system::disabled_google_calendar_skills"
|
||||
type="hidden"
|
||||
value={disabledSkills.join(",")}
|
||||
/>
|
||||
<input
|
||||
name="system::google_calendar_agent_config"
|
||||
type="hidden"
|
||||
value={configJson}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
import {
|
||||
CalendarBlank,
|
||||
CalendarCheck,
|
||||
CalendarPlus,
|
||||
UserCircleGear,
|
||||
} from "@phosphor-icons/react";
|
||||
export { filterSkillCategories } from "../utils";
|
||||
|
||||
export const getGoogleCalendarSkills = (t) => ({
|
||||
calendars: {
|
||||
title: t("agent.skill.googleCalendar.categories.calendars.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.categories.calendars.description"
|
||||
),
|
||||
icon: CalendarBlank,
|
||||
skills: [
|
||||
{
|
||||
name: "gcal-list-calendars",
|
||||
title: t("agent.skill.googleCalendar.skills.listCalendars.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.listCalendars.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-get-calendar",
|
||||
title: t("agent.skill.googleCalendar.skills.getCalendar.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.getCalendar.description"
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
readEvents: {
|
||||
title: t("agent.skill.googleCalendar.categories.readEvents.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.categories.readEvents.description"
|
||||
),
|
||||
icon: CalendarCheck,
|
||||
skills: [
|
||||
{
|
||||
name: "gcal-get-event",
|
||||
title: t("agent.skill.googleCalendar.skills.getEvent.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.getEvent.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-get-events-for-day",
|
||||
title: t("agent.skill.googleCalendar.skills.getEventsForDay.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.getEventsForDay.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-get-events",
|
||||
title: t("agent.skill.googleCalendar.skills.getEvents.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.getEvents.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-get-upcoming-events",
|
||||
title: t("agent.skill.googleCalendar.skills.getUpcomingEvents.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.getUpcomingEvents.description"
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
writeEvents: {
|
||||
title: t("agent.skill.googleCalendar.categories.writeEvents.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.categories.writeEvents.description"
|
||||
),
|
||||
icon: CalendarPlus,
|
||||
skills: [
|
||||
{
|
||||
name: "gcal-quick-add",
|
||||
title: t("agent.skill.googleCalendar.skills.quickAdd.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.quickAdd.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-create-event",
|
||||
title: t("agent.skill.googleCalendar.skills.createEvent.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.createEvent.description"
|
||||
),
|
||||
},
|
||||
{
|
||||
name: "gcal-update-event",
|
||||
title: t("agent.skill.googleCalendar.skills.updateEvent.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.updateEvent.description"
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
rsvp: {
|
||||
title: t("agent.skill.googleCalendar.categories.rsvp.title"),
|
||||
description: t("agent.skill.googleCalendar.categories.rsvp.description"),
|
||||
icon: UserCircleGear,
|
||||
skills: [
|
||||
{
|
||||
name: "gcal-set-my-status",
|
||||
title: t("agent.skill.googleCalendar.skills.setMyStatus.title"),
|
||||
description: t(
|
||||
"agent.skill.googleCalendar.skills.setMyStatus.description"
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
667
frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx
Normal file
667
frontend/src/pages/Admin/Agents/OutlookSkillPanel/index.jsx
Normal file
@@ -0,0 +1,667 @@
|
||||
import React, {
|
||||
useEffect,
|
||||
useState,
|
||||
useRef,
|
||||
useMemo,
|
||||
useCallback,
|
||||
} from "react";
|
||||
import Toggle, { SimpleToggleSwitch } from "@/components/lib/Toggle";
|
||||
import { Trans, useTranslation } from "react-i18next";
|
||||
import debounce from "lodash.debounce";
|
||||
import {
|
||||
MagnifyingGlass,
|
||||
CircleNotch,
|
||||
Warning,
|
||||
CaretDown,
|
||||
CheckCircle,
|
||||
Info,
|
||||
ArrowSquareOut,
|
||||
XCircle,
|
||||
} from "@phosphor-icons/react";
|
||||
import Admin from "@/models/admin";
|
||||
import System from "@/models/system";
|
||||
import OutlookAgent from "@/models/outlookAgent";
|
||||
import { getOutlookSkills, filterSkillCategories } from "./utils";
|
||||
import OutlookIcon from "./outlook.png";
|
||||
import { Tooltip } from "react-tooltip";
|
||||
import { Link } from "react-router-dom";
|
||||
import paths from "@/utils/paths";
|
||||
|
||||
export default function OutlookSkillPanel({
|
||||
title,
|
||||
skill,
|
||||
toggleSkill,
|
||||
enabled = false,
|
||||
disabled = false,
|
||||
setHasChanges,
|
||||
hasChanges = false,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [disabledSkills, setDisabledSkills] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [clientId, setClientId] = useState("");
|
||||
const [tenantId, setTenantId] = useState("");
|
||||
const [clientSecret, setClientSecret] = useState("");
|
||||
const [authType, setAuthType] = useState("common");
|
||||
const [isAuthenticated, setIsAuthenticated] = useState(false);
|
||||
const [authLoading, setAuthLoading] = useState(false);
|
||||
const [isMultiUserMode, setIsMultiUserMode] = useState(false);
|
||||
const [configDefaultExpanded, setConfigDefaultExpanded] = useState(true);
|
||||
const prevHasChanges = useRef(hasChanges);
|
||||
const skillCategories = getOutlookSkills(t);
|
||||
|
||||
const fetchStatus = async () => {
|
||||
try {
|
||||
const data = await OutlookAgent.getStatus();
|
||||
if (data.success) {
|
||||
setIsAuthenticated(data.isAuthenticated);
|
||||
// Load config from status endpoint
|
||||
if (data.config) {
|
||||
setClientId(data.config.clientId || "");
|
||||
setTenantId(data.config.tenantId || "");
|
||||
setClientSecret(data.config.clientSecret || "");
|
||||
setAuthType(data.config.authType || "common");
|
||||
setConfigDefaultExpanded(
|
||||
!(data.config.clientId && data.config.clientSecret)
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Failed to fetch Outlook status:", e);
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
setLoading(true);
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_outlook_skills"]),
|
||||
System.keys(),
|
||||
OutlookAgent.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, settingsRes, statusRes]) => {
|
||||
setDisabledSkills(prefsRes?.settings?.disabled_outlook_skills ?? []);
|
||||
setIsMultiUserMode(settingsRes?.MultiUserMode ?? false);
|
||||
|
||||
// Load config from status endpoint
|
||||
if (statusRes?.success) {
|
||||
setIsAuthenticated(statusRes.isAuthenticated);
|
||||
if (statusRes.config) {
|
||||
setClientId(statusRes.config.clientId || "");
|
||||
setTenantId(statusRes.config.tenantId || "");
|
||||
setClientSecret(statusRes.config.clientSecret || "");
|
||||
setAuthType(statusRes.config.authType || "common");
|
||||
setConfigDefaultExpanded(
|
||||
!(statusRes.config.clientId && statusRes.config.clientSecret)
|
||||
);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setDisabledSkills([]);
|
||||
setClientId("");
|
||||
setTenantId("");
|
||||
setClientSecret("");
|
||||
setAuthType("common");
|
||||
})
|
||||
.finally(() => setLoading(false));
|
||||
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const outlookAuth = urlParams.get("outlook_auth");
|
||||
if (outlookAuth === "success") {
|
||||
fetchStatus();
|
||||
window.history.replaceState({}, document.title, window.location.pathname);
|
||||
} else if (outlookAuth === "error") {
|
||||
const message = urlParams.get("message");
|
||||
console.error("Outlook auth error:", message);
|
||||
window.history.replaceState({}, document.title, window.location.pathname);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (prevHasChanges.current === true && hasChanges === false) {
|
||||
Promise.all([
|
||||
Admin.systemPreferencesByFields(["disabled_outlook_skills"]),
|
||||
OutlookAgent.getStatus(),
|
||||
])
|
||||
.then(([prefsRes, statusRes]) => {
|
||||
setDisabledSkills(prefsRes?.settings?.disabled_outlook_skills ?? []);
|
||||
if (statusRes?.success) {
|
||||
setIsAuthenticated(statusRes.isAuthenticated);
|
||||
if (statusRes.config) {
|
||||
setClientId(statusRes.config.clientId || "");
|
||||
setTenantId(statusRes.config.tenantId || "");
|
||||
setClientSecret(statusRes.config.clientSecret || "");
|
||||
setAuthType(statusRes.config.authType || "common");
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
prevHasChanges.current = hasChanges;
|
||||
}, [hasChanges]);
|
||||
|
||||
function toggleOutlookSkill(skillName) {
|
||||
setHasChanges(true);
|
||||
setDisabledSkills((prev) =>
|
||||
prev.includes(skillName)
|
||||
? prev.filter((s) => s !== skillName)
|
||||
: [...prev, skillName]
|
||||
);
|
||||
}
|
||||
|
||||
const handleStartAuth = async () => {
|
||||
setAuthLoading(true);
|
||||
try {
|
||||
const data = await OutlookAgent.saveCredentialsAndGetAuthUrl({
|
||||
clientId,
|
||||
tenantId,
|
||||
clientSecret,
|
||||
authType,
|
||||
});
|
||||
if (data.success && data.url) {
|
||||
window.open(data.url, "_blank");
|
||||
} else {
|
||||
console.error("Failed to get auth URL:", data.error);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Auth error:", e);
|
||||
} finally {
|
||||
setAuthLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
const handleRevokeAuth = async () => {
|
||||
setAuthLoading(true);
|
||||
try {
|
||||
const data = await OutlookAgent.revokeAccess();
|
||||
if (data.success) {
|
||||
setIsAuthenticated(false);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error("Revoke error:", e);
|
||||
} finally {
|
||||
setAuthLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// For organization auth type, tenant ID is required; for others it's optional
|
||||
const hasCredentials =
|
||||
authType === "organization"
|
||||
? clientId && tenantId && clientSecret
|
||||
: clientId && clientSecret;
|
||||
const isConfigured = hasCredentials && isAuthenticated;
|
||||
|
||||
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">
|
||||
<img src={OutlookIcon} alt="Outlook" className="w-6 h-6" />
|
||||
<label className="text-theme-text-primary text-md font-bold">
|
||||
{title}
|
||||
</label>
|
||||
</div>
|
||||
<Toggle
|
||||
size="lg"
|
||||
enabled={enabled}
|
||||
disabled={disabled || isMultiUserMode}
|
||||
onChange={() => toggleSkill(skill)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{isMultiUserMode && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-yellow-500/10 border border-yellow-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-yellow-500 shrink-0" />
|
||||
<p className="text-yellow-500 text-xs">
|
||||
{t("agent.skill.outlook.multiUserWarning")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<p className="text-theme-text-secondary text-opacity-60 text-xs font-medium">
|
||||
<Trans
|
||||
i18nKey="agent.skill.outlook.description"
|
||||
components={{
|
||||
a: (
|
||||
<Link
|
||||
className="text-sky-400 hover:text-sky-500 text-xs font-medium underline"
|
||||
to={paths.docs("/agent/usage/outlook-agent")}
|
||||
target="_blank"
|
||||
/>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
|
||||
{enabled && !isMultiUserMode && (
|
||||
<>
|
||||
<HiddenFormInputs disabledSkills={disabledSkills} />
|
||||
|
||||
{loading ? (
|
||||
<div className="flex items-center justify-center py-4">
|
||||
<CircleNotch
|
||||
size={24}
|
||||
className="animate-spin text-theme-text-primary"
|
||||
/>
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<ConfigurationSection
|
||||
clientId={clientId}
|
||||
setClientId={setClientId}
|
||||
tenantId={tenantId}
|
||||
setTenantId={setTenantId}
|
||||
clientSecret={clientSecret}
|
||||
setClientSecret={setClientSecret}
|
||||
authType={authType}
|
||||
setAuthType={setAuthType}
|
||||
setHasChanges={setHasChanges}
|
||||
hasCredentials={hasCredentials}
|
||||
isAuthenticated={isAuthenticated}
|
||||
isConfigured={isConfigured}
|
||||
defaultExpanded={configDefaultExpanded}
|
||||
onStartAuth={handleStartAuth}
|
||||
onRevokeAuth={handleRevokeAuth}
|
||||
authLoading={authLoading}
|
||||
/>
|
||||
|
||||
{isConfigured && (
|
||||
<SkillsSection
|
||||
skillCategories={skillCategories}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={toggleOutlookSkill}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ConfigurationSection({
|
||||
clientId,
|
||||
setClientId,
|
||||
tenantId,
|
||||
setTenantId,
|
||||
clientSecret,
|
||||
setClientSecret,
|
||||
authType,
|
||||
setAuthType,
|
||||
setHasChanges,
|
||||
hasCredentials,
|
||||
isAuthenticated,
|
||||
isConfigured,
|
||||
defaultExpanded = true,
|
||||
onStartAuth,
|
||||
onRevokeAuth,
|
||||
authLoading,
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
const [expanded, setExpanded] = useState(defaultExpanded);
|
||||
const showTenantId = authType === "organization";
|
||||
|
||||
return (
|
||||
<div className="border border-theme-sidebar-border/50 rounded-lg overflow-hidden mt-2">
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => setExpanded(!expanded)}
|
||||
className="border-none w-full flex items-center justify-between p-3 bg-theme-bg-secondary/30 hover:bg-theme-bg-secondary/50 transition-colors"
|
||||
>
|
||||
<div className="flex items-center gap-x-2">
|
||||
<span className="text-theme-text-primary font-semibold text-sm">
|
||||
{t("agent.skill.outlook.configuration")}
|
||||
</span>
|
||||
{isConfigured && (
|
||||
<div className="flex items-center gap-x-1">
|
||||
<CheckCircle size={14} weight="fill" className="text-green-500" />
|
||||
<span className="text-xs text-green-500">
|
||||
{t("agent.skill.outlook.configured")}
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<CaretDown
|
||||
size={16}
|
||||
className={`text-theme-text-secondary transition-transform ${expanded ? "rotate-180" : ""}`}
|
||||
/>
|
||||
</button>
|
||||
|
||||
{expanded && (
|
||||
<div className="p-3 flex flex-col gap-y-4 border-t border-theme-sidebar-border/50">
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.outlook.authType")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="auth-type-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="auth-type-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100 max-w-xs"
|
||||
>
|
||||
{t("agent.skill.outlook.authTypeHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<select
|
||||
value={authType}
|
||||
onChange={(e) => {
|
||||
setAuthType(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm"
|
||||
>
|
||||
<option value="common">
|
||||
{t("agent.skill.outlook.authTypeCommon")}
|
||||
</option>
|
||||
<option value="consumers">
|
||||
{t("agent.skill.outlook.authTypeConsumers")}
|
||||
</option>
|
||||
<option value="organization">
|
||||
{t("agent.skill.outlook.authTypeOrganization")}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.outlook.clientId")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="client-id-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="client-id-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.outlook.clientIdHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={clientId}
|
||||
onChange={(e) => {
|
||||
setClientId(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{showTenantId && (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.outlook.tenantId")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="tenant-id-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="tenant-id-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.outlook.tenantIdHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="text"
|
||||
value={tenantId}
|
||||
onChange={(e) => {
|
||||
setTenantId(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2">
|
||||
<label className="text-theme-text-primary text-sm font-medium">
|
||||
{t("agent.skill.outlook.clientSecret")}
|
||||
</label>
|
||||
<Info
|
||||
data-tooltip-id="client-secret-tooltip"
|
||||
size={16}
|
||||
className="text-theme-text-secondary"
|
||||
/>
|
||||
<Tooltip
|
||||
id="client-secret-tooltip"
|
||||
place="top"
|
||||
delayShow={300}
|
||||
className="tooltip !text-xs !opacity-100"
|
||||
>
|
||||
{t("agent.skill.outlook.clientSecretHelp")}
|
||||
</Tooltip>
|
||||
</div>
|
||||
<input
|
||||
type="password"
|
||||
value={clientSecret}
|
||||
onChange={(e) => {
|
||||
setClientSecret(e.target.value);
|
||||
setHasChanges(true);
|
||||
}}
|
||||
placeholder="Your client secret..."
|
||||
className="w-full px-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50"
|
||||
/>
|
||||
</div>
|
||||
|
||||
{!hasCredentials && (
|
||||
<div className="flex items-center gap-x-2 p-3 bg-orange-500/10 border border-orange-500/30 rounded-lg">
|
||||
<Warning size={20} className="text-orange-500 shrink-0" />
|
||||
<p className="text-orange-500 text-xs">
|
||||
{t("agent.skill.outlook.configurationRequired")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{hasCredentials && !isAuthenticated && (
|
||||
<div className="flex flex-col gap-y-3">
|
||||
<div className="flex items-center gap-x-2 p-3 bg-blue-500/10 border border-blue-500/30 rounded-lg">
|
||||
<Info size={20} className="text-blue-500 shrink-0" />
|
||||
<p className="text-blue-500 text-xs">
|
||||
{t("agent.skill.outlook.authRequired")}
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
onClick={onStartAuth}
|
||||
disabled={authLoading}
|
||||
className="flex items-center justify-center gap-x-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-600/50 text-white text-sm font-medium rounded-lg transition-colors"
|
||||
>
|
||||
{authLoading ? (
|
||||
<CircleNotch size={16} className="animate-spin" />
|
||||
) : (
|
||||
<ArrowSquareOut size={16} />
|
||||
)}
|
||||
{t("agent.skill.outlook.authenticateWithMicrosoft")}
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{hasCredentials && isAuthenticated && (
|
||||
<div className="flex flex-col gap-y-3">
|
||||
<div className="flex items-center gap-x-2 p-3 bg-green-500/10 border border-green-500/30 rounded-lg">
|
||||
<CheckCircle
|
||||
size={20}
|
||||
weight="fill"
|
||||
className="text-green-500 shrink-0"
|
||||
/>
|
||||
<p className="text-green-500 text-xs">
|
||||
{t("agent.skill.outlook.authenticated")}
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
onClick={onRevokeAuth}
|
||||
disabled={authLoading}
|
||||
className="flex items-center justify-center gap-x-2 px-4 py-2 bg-red-600/20 hover:bg-red-600/30 border border-red-600/50 text-red-500 text-sm font-medium rounded-lg transition-colors"
|
||||
>
|
||||
{authLoading ? (
|
||||
<CircleNotch size={16} className="animate-spin" />
|
||||
) : (
|
||||
<XCircle size={16} />
|
||||
)}
|
||||
{t("agent.skill.outlook.revokeAccess")}
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillSearchInput({ onSearch }) {
|
||||
const { t } = useTranslation();
|
||||
const inputRef = useRef(null);
|
||||
|
||||
const debouncedSearch = useMemo(
|
||||
() =>
|
||||
debounce((value) => {
|
||||
onSearch(value);
|
||||
}, 300),
|
||||
[onSearch]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
debouncedSearch.cancel();
|
||||
};
|
||||
}, [debouncedSearch]);
|
||||
|
||||
const handleChange = (e) => {
|
||||
debouncedSearch(e.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="relative">
|
||||
<input
|
||||
ref={inputRef}
|
||||
type="search"
|
||||
placeholder={t("agent.skill.outlook.searchSkills")}
|
||||
onChange={handleChange}
|
||||
className="w-full pl-9 pr-3 py-2 bg-theme-bg-primary border border-theme-sidebar-border rounded-lg text-theme-text-primary text-sm placeholder:text-theme-text-secondary/50 search-input"
|
||||
/>
|
||||
<MagnifyingGlass
|
||||
size={16}
|
||||
className="absolute left-3 top-1/2 -translate-y-1/2 text-theme-text-secondary"
|
||||
weight="bold"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillsSection({ skillCategories, disabledSkills, onToggle }) {
|
||||
const { t } = useTranslation();
|
||||
const [searchTerm, setSearchTerm] = useState("");
|
||||
|
||||
const handleSearch = useCallback((value) => {
|
||||
setSearchTerm(value);
|
||||
}, []);
|
||||
|
||||
const filteredCategories = useMemo(
|
||||
() => filterSkillCategories(skillCategories, searchTerm),
|
||||
[skillCategories, searchTerm]
|
||||
);
|
||||
|
||||
const hasResults = Object.keys(filteredCategories).length > 0;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col mt-4 gap-y-4">
|
||||
<SkillSearchInput onSearch={handleSearch} />
|
||||
{hasResults ? (
|
||||
<div className="flex flex-col gap-y-4">
|
||||
{Object.entries(filteredCategories).map(([categoryKey, category]) => (
|
||||
<CategorySection
|
||||
key={categoryKey}
|
||||
category={category}
|
||||
disabledSkills={disabledSkills}
|
||||
onToggle={onToggle}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p className="text-theme-text-secondary text-sm text-center py-4">
|
||||
{t("agent.skill.outlook.noSkillsFound")}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function CategorySection({ category, disabledSkills, onToggle }) {
|
||||
const Icon = category.icon;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-y-2">
|
||||
<div className="flex items-center gap-x-2 px-1">
|
||||
<Icon size={18} className="text-theme-text-primary" />
|
||||
<span className="text-sm font-medium text-theme-text-primary">
|
||||
{category.title}
|
||||
</span>
|
||||
</div>
|
||||
<div className="flex flex-col gap-y-2">
|
||||
{category.skills.map((skill) => (
|
||||
<SkillRow
|
||||
key={skill.name}
|
||||
skill={skill}
|
||||
disabled={disabledSkills.includes(skill.name)}
|
||||
onToggle={() => onToggle(skill.name)}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function SkillRow({ skill, disabled, onToggle }) {
|
||||
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 flex-col">
|
||||
<span className="text-sm font-medium text-slate-100 light:text-slate-900">
|
||||
{skill.title}
|
||||
</span>
|
||||
<span className="text-xs text-slate-100/50 light:text-slate-900/50">
|
||||
{skill.description}
|
||||
</span>
|
||||
</div>
|
||||
<SimpleToggleSwitch enabled={!disabled} onChange={onToggle} size="md" />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function HiddenFormInputs({ disabledSkills }) {
|
||||
return (
|
||||
<input
|
||||
name="system::disabled_outlook_skills"
|
||||
type="hidden"
|
||||
value={disabledSkills.join(",")}
|
||||
/>
|
||||
);
|
||||
}
|
||||
BIN
frontend/src/pages/Admin/Agents/OutlookSkillPanel/outlook.png
Normal file
BIN
frontend/src/pages/Admin/Agents/OutlookSkillPanel/outlook.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
90
frontend/src/pages/Admin/Agents/OutlookSkillPanel/utils.js
Normal file
90
frontend/src/pages/Admin/Agents/OutlookSkillPanel/utils.js
Normal file
@@ -0,0 +1,90 @@
|
||||
import {
|
||||
MagnifyingGlass,
|
||||
PaperPlaneTilt,
|
||||
ChartBar,
|
||||
PencilSimple,
|
||||
} from "@phosphor-icons/react";
|
||||
export { filterSkillCategories } from "../utils";
|
||||
|
||||
export const getOutlookSkills = (t) => ({
|
||||
search: {
|
||||
title: t("agent.skill.outlook.categories.search.title"),
|
||||
description: t("agent.skill.outlook.categories.search.description"),
|
||||
icon: MagnifyingGlass,
|
||||
skills: [
|
||||
{
|
||||
name: "outlook-get-inbox",
|
||||
title: t("agent.skill.outlook.skills.getInbox.title"),
|
||||
description: t("agent.skill.outlook.skills.getInbox.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-search",
|
||||
title: t("agent.skill.outlook.skills.search.title"),
|
||||
description: t("agent.skill.outlook.skills.search.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-read-thread",
|
||||
title: t("agent.skill.outlook.skills.readThread.title"),
|
||||
description: t("agent.skill.outlook.skills.readThread.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
drafts: {
|
||||
title: t("agent.skill.outlook.categories.drafts.title"),
|
||||
description: t("agent.skill.outlook.categories.drafts.description"),
|
||||
icon: PencilSimple,
|
||||
skills: [
|
||||
{
|
||||
name: "outlook-create-draft",
|
||||
title: t("agent.skill.outlook.skills.createDraft.title"),
|
||||
description: t("agent.skill.outlook.skills.createDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-update-draft",
|
||||
title: t("agent.skill.outlook.skills.updateDraft.title"),
|
||||
description: t("agent.skill.outlook.skills.updateDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-list-drafts",
|
||||
title: t("agent.skill.outlook.skills.listDrafts.title"),
|
||||
description: t("agent.skill.outlook.skills.listDrafts.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-delete-draft",
|
||||
title: t("agent.skill.outlook.skills.deleteDraft.title"),
|
||||
description: t("agent.skill.outlook.skills.deleteDraft.description"),
|
||||
},
|
||||
{
|
||||
name: "outlook-send-draft",
|
||||
title: t("agent.skill.outlook.skills.sendDraft.title"),
|
||||
description: t("agent.skill.outlook.skills.sendDraft.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
send: {
|
||||
title: t("agent.skill.outlook.categories.send.title"),
|
||||
description: t("agent.skill.outlook.categories.send.description"),
|
||||
icon: PaperPlaneTilt,
|
||||
skills: [
|
||||
{
|
||||
name: "outlook-send-email",
|
||||
title: t("agent.skill.outlook.skills.sendEmail.title"),
|
||||
description: t("agent.skill.outlook.skills.sendEmail.description"),
|
||||
},
|
||||
],
|
||||
},
|
||||
account: {
|
||||
title: t("agent.skill.outlook.categories.account.title"),
|
||||
description: t("agent.skill.outlook.categories.account.description"),
|
||||
icon: ChartBar,
|
||||
skills: [
|
||||
{
|
||||
name: "outlook-get-mailbox-stats",
|
||||
title: t("agent.skill.outlook.skills.getMailboxStats.title"),
|
||||
description: t(
|
||||
"agent.skill.outlook.skills.getMailboxStats.description"
|
||||
),
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
@@ -1,6 +1,5 @@
|
||||
import React, { useEffect, useRef, useState } from "react";
|
||||
import Admin from "@/models/admin";
|
||||
import AnythingLLMIcon from "@/media/logo/anything-llm-icon.png";
|
||||
import SerpApiIcon from "./icons/serpapi.png";
|
||||
import SearchApiIcon from "./icons/searchapi.png";
|
||||
import SerperDotDevIcon from "./icons/serper.png";
|
||||
@@ -34,14 +33,6 @@ import {
|
||||
} from "./SearchProviderOptions";
|
||||
|
||||
const SEARCH_PROVIDERS = [
|
||||
{
|
||||
name: "Please make a selection",
|
||||
value: "none",
|
||||
logo: AnythingLLMIcon,
|
||||
options: () => <React.Fragment />,
|
||||
description:
|
||||
"Web search will be disabled until a provider and keys are provided.",
|
||||
},
|
||||
{
|
||||
name: "DuckDuckGo",
|
||||
value: "duckduckgo-engine",
|
||||
@@ -119,13 +110,6 @@ const SEARCH_PROVIDERS = [
|
||||
options: (settings) => <PerplexitySearchOptions settings={settings} />,
|
||||
description: "AI-powered web search using the Perplexity Search API.",
|
||||
},
|
||||
{
|
||||
name: "Perplexity Search",
|
||||
value: "perplexity-search",
|
||||
logo: PerplexitySearchIcon,
|
||||
options: (settings) => <PerplexitySearchOptions settings={settings} />,
|
||||
description: "AI-powered web search using the Perplexity Search API.",
|
||||
},
|
||||
];
|
||||
|
||||
export default function AgentWebSearchSelection({
|
||||
@@ -139,7 +123,7 @@ export default function AgentWebSearchSelection({
|
||||
}) {
|
||||
const searchInputRef = useRef(null);
|
||||
const [filteredResults, setFilteredResults] = useState([]);
|
||||
const [selectedProvider, setSelectedProvider] = useState("none");
|
||||
const [selectedProvider, setSelectedProvider] = useState("duckduckgo-engine");
|
||||
const [searchQuery, setSearchQuery] = useState("");
|
||||
const [searchMenuOpen, setSearchMenuOpen] = useState(false);
|
||||
|
||||
@@ -169,9 +153,11 @@ export default function AgentWebSearchSelection({
|
||||
useEffect(() => {
|
||||
Admin.systemPreferencesByFields(["agent_search_provider"])
|
||||
.then((res) =>
|
||||
setSelectedProvider(res?.settings?.agent_search_provider ?? "none")
|
||||
setSelectedProvider(
|
||||
res?.settings?.agent_search_provider ?? "duckduckgo-engine"
|
||||
)
|
||||
)
|
||||
.catch(() => setSelectedProvider("none"));
|
||||
.catch(() => setSelectedProvider("duckduckgo-engine"));
|
||||
}, []);
|
||||
|
||||
const selectedSearchProviderObject =
|
||||
@@ -289,11 +275,9 @@ export default function AgentWebSearchSelection({
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
{selectedProvider !== "none" && (
|
||||
<div className="mt-4 flex flex-col gap-y-1">
|
||||
{selectedSearchProviderObject.options(settings)}
|
||||
</div>
|
||||
)}
|
||||
<div className="mt-4 flex flex-col gap-y-1">
|
||||
{selectedSearchProviderObject.options(settings)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -13,11 +13,16 @@ import {
|
||||
Robot,
|
||||
Hammer,
|
||||
FlowArrow,
|
||||
Package,
|
||||
} from "@phosphor-icons/react";
|
||||
import ContextualSaveBar from "@/components/ContextualSaveBar";
|
||||
import { castToType } from "@/utils/types";
|
||||
import { FullScreenLoader } from "@/components/Preloader";
|
||||
import { getDefaultSkills, getConfigurableSkills } from "./skills";
|
||||
import {
|
||||
getDefaultSkills,
|
||||
getConfigurableSkills,
|
||||
getAppIntegrationSkills,
|
||||
} from "./skills.jsx";
|
||||
import { DefaultBadge } from "./Badges/default";
|
||||
import ImportedSkillList from "./Imported/SkillList";
|
||||
import ImportedSkillConfig from "./Imported/ImportedSkillConfig";
|
||||
@@ -64,10 +69,30 @@ export default function AdminAgents() {
|
||||
useState(false);
|
||||
|
||||
const defaultSkills = getDefaultSkills(t);
|
||||
const configurableSkills = getConfigurableSkills(t, {
|
||||
const allConfigurableSkills = getConfigurableSkills(t, {
|
||||
fileSystemAgentAvailable,
|
||||
createFilesAgentAvailable,
|
||||
});
|
||||
const allAppIntegrationSkills = getAppIntegrationSkills(t);
|
||||
|
||||
// Filter skills based on mode restrictions
|
||||
// singleUserOnly -> hidden in multi-user mode
|
||||
// multiUserOnly -> hidden when NOT in multi-user mode
|
||||
const isMultiUserMode = settings?.MultiUserMode ?? false;
|
||||
const filterSkillsByMode = ([_, skillConfig]) => {
|
||||
if (!skillConfig.mode) return true;
|
||||
if (skillConfig.mode.includes("singleUserOnly") && isMultiUserMode)
|
||||
return false;
|
||||
if (skillConfig.mode.includes("multiUserOnly") && !isMultiUserMode)
|
||||
return false;
|
||||
return true;
|
||||
};
|
||||
const configurableSkills = Object.fromEntries(
|
||||
Object.entries(allConfigurableSkills).filter(filterSkillsByMode)
|
||||
);
|
||||
const appIntegrationSkills = Object.fromEntries(
|
||||
Object.entries(allAppIntegrationSkills).filter(filterSkillsByMode)
|
||||
);
|
||||
|
||||
// Alert user if they try to leave the page with unsaved changes
|
||||
useEffect(() => {
|
||||
@@ -111,7 +136,7 @@ export default function AdminAgents() {
|
||||
_preferences.settings?.disabled_agent_skills ?? []
|
||||
);
|
||||
setImportedSkills(_preferences.settings?.imported_agent_skills ?? []);
|
||||
setActiveFlowIds(_preferences.settings?.active_agent_flows ?? []);
|
||||
setActiveFlowIds(flows.filter((f) => f.active).map((f) => f.uuid));
|
||||
setAgentFlows(flows);
|
||||
setFileSystemAgentAvailable(fsAgentAvailable);
|
||||
setCreateFilesAgentAvailable(createFilesAvailable);
|
||||
@@ -217,6 +242,8 @@ export default function AdminAgents() {
|
||||
SelectedSkillComponent = ImportedSkillConfig;
|
||||
} else if (configurableSkills[selectedSkill]) {
|
||||
SelectedSkillComponent = configurableSkills[selectedSkill]?.component;
|
||||
} else if (appIntegrationSkills[selectedSkill]) {
|
||||
SelectedSkillComponent = appIntegrationSkills[selectedSkill]?.component;
|
||||
} else {
|
||||
SelectedSkillComponent = defaultSkills[selectedSkill]?.component;
|
||||
}
|
||||
@@ -367,6 +394,17 @@ export default function AdminAgents() {
|
||||
activeSkills={agentSkills}
|
||||
/>
|
||||
|
||||
<div className="text-theme-text-primary flex items-center gap-x-2 mt-6">
|
||||
<Package size={24} />
|
||||
<p className="text-lg font-medium">App Integrations</p>
|
||||
</div>
|
||||
<SkillList
|
||||
skills={appIntegrationSkills}
|
||||
selectedSkill={selectedSkill}
|
||||
handleClick={handleSkillClick}
|
||||
activeSkills={agentSkills}
|
||||
/>
|
||||
|
||||
<div className="text-theme-text-primary flex items-center gap-x-2">
|
||||
<Plug size={24} />
|
||||
<p className="text-lg font-medium">Custom Skills</p>
|
||||
@@ -385,6 +423,7 @@ export default function AdminAgents() {
|
||||
flows={agentFlows}
|
||||
selectedFlow={selectedFlow}
|
||||
handleClick={handleFlowClick}
|
||||
activeFlowIds={activeFlowIds}
|
||||
/>
|
||||
<input
|
||||
type="hidden"
|
||||
@@ -429,7 +468,7 @@ export default function AdminAgents() {
|
||||
</button>
|
||||
</div>
|
||||
<div className="flex-1 overflow-y-auto p-4">
|
||||
<div className=" bg-theme-bg-secondary text-white rounded-xl p-4 overflow-y-scroll no-scroll">
|
||||
<div className=" bg-theme-bg-secondary text-white rounded-xl p-4 overflow-y-scroll overflow-x-visible no-scroll">
|
||||
{SelectedSkillComponent ? (
|
||||
<>
|
||||
{selectedMcpServer ? (
|
||||
@@ -468,7 +507,7 @@ export default function AdminAgents() {
|
||||
setHasChanges={setHasChanges}
|
||||
{...defaultSkills[selectedSkill]}
|
||||
/>
|
||||
) : (
|
||||
) : configurableSkills?.[selectedSkill] ? (
|
||||
// The selected skill is a configurable skill - show the configurable skill panel
|
||||
<SelectedSkillComponent
|
||||
skill={configurableSkills[selectedSkill]?.skill}
|
||||
@@ -481,6 +520,21 @@ export default function AdminAgents() {
|
||||
hasChanges={hasChanges}
|
||||
{...configurableSkills[selectedSkill]}
|
||||
/>
|
||||
) : (
|
||||
// The selected skill is an app integration skill
|
||||
<SelectedSkillComponent
|
||||
skill={
|
||||
appIntegrationSkills[selectedSkill]?.skill
|
||||
}
|
||||
settings={settings}
|
||||
toggleSkill={toggleAgentSkill}
|
||||
enabled={agentSkills.includes(
|
||||
appIntegrationSkills[selectedSkill]?.skill
|
||||
)}
|
||||
setHasChanges={setHasChanges}
|
||||
hasChanges={hasChanges}
|
||||
{...appIntegrationSkills[selectedSkill]}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
@@ -564,6 +618,17 @@ export default function AdminAgents() {
|
||||
activeSkills={agentSkills}
|
||||
/>
|
||||
|
||||
<div className="text-theme-text-primary flex items-center gap-x-2 mt-6">
|
||||
<Package size={24} />
|
||||
<p className="text-lg font-medium">App Integrations</p>
|
||||
</div>
|
||||
<SkillList
|
||||
skills={appIntegrationSkills}
|
||||
selectedSkill={selectedSkill}
|
||||
handleClick={handleSkillClick}
|
||||
activeSkills={agentSkills}
|
||||
/>
|
||||
|
||||
<div className="text-theme-text-primary flex items-center gap-x-2 mt-4">
|
||||
<Plug size={24} />
|
||||
<p className="text-lg font-medium">Custom Skills</p>
|
||||
@@ -601,6 +666,7 @@ export default function AdminAgents() {
|
||||
flows={agentFlows}
|
||||
selectedFlow={selectedFlow}
|
||||
handleClick={handleFlowClick}
|
||||
activeFlowIds={activeFlowIds}
|
||||
/>
|
||||
|
||||
<MCPServerHeader
|
||||
@@ -624,7 +690,7 @@ export default function AdminAgents() {
|
||||
|
||||
{/* Selected agent skill setting panel */}
|
||||
<div className="flex-[2] flex flex-col gap-y-[18px] mt-10">
|
||||
<div className="bg-theme-bg-secondary text-white rounded-xl flex-1 p-4 overflow-y-scroll no-scroll">
|
||||
<div className="bg-theme-bg-secondary text-white rounded-xl flex-1 p-4 overflow-y-scroll overflow-x-visible no-scroll">
|
||||
{SelectedSkillComponent ? (
|
||||
<>
|
||||
{selectedMcpServer ? (
|
||||
@@ -663,7 +729,7 @@ export default function AdminAgents() {
|
||||
setHasChanges={setHasChanges}
|
||||
{...defaultSkills[selectedSkill]}
|
||||
/>
|
||||
) : (
|
||||
) : configurableSkills?.[selectedSkill] ? (
|
||||
// The selected skill is a configurable skill - show the configurable skill panel
|
||||
<SelectedSkillComponent
|
||||
skill={configurableSkills[selectedSkill]?.skill}
|
||||
@@ -676,6 +742,19 @@ export default function AdminAgents() {
|
||||
hasChanges={hasChanges}
|
||||
{...configurableSkills[selectedSkill]}
|
||||
/>
|
||||
) : (
|
||||
// The selected skill is an app integration skill
|
||||
<SelectedSkillComponent
|
||||
skill={appIntegrationSkills[selectedSkill]?.skill}
|
||||
settings={settings}
|
||||
toggleSkill={toggleAgentSkill}
|
||||
enabled={agentSkills.includes(
|
||||
appIntegrationSkills[selectedSkill]?.skill
|
||||
)}
|
||||
setHasChanges={setHasChanges}
|
||||
hasChanges={hasChanges}
|
||||
{...appIntegrationSkills[selectedSkill]}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
@@ -723,6 +802,7 @@ function SkillList({
|
||||
selectedSkill = null,
|
||||
handleClick = null,
|
||||
activeSkills = [],
|
||||
Icon = null,
|
||||
}) {
|
||||
if (skills.length === 0) return null;
|
||||
|
||||
@@ -749,7 +829,14 @@ function SkillList({
|
||||
}`}
|
||||
onClick={() => handleClick?.(skill)}
|
||||
>
|
||||
<div className="text-sm font-light">{settings.title}</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
{settings.Icon ? (
|
||||
<settings.Icon size={16} />
|
||||
) : (
|
||||
Icon && <Icon size={16} />
|
||||
)}
|
||||
<div className="text-sm font-light">{settings.title}</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-x-2">
|
||||
{isDefault ? (
|
||||
<DefaultBadge title={skill} />
|
||||
|
||||
137
frontend/src/pages/Admin/Agents/skills.jsx
Normal file
137
frontend/src/pages/Admin/Agents/skills.jsx
Normal file
@@ -0,0 +1,137 @@
|
||||
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 GMailSkillPanel from "./GMailSkillPanel";
|
||||
import GoogleCalendarSkillPanel from "./GoogleCalendarSkillPanel";
|
||||
import OutlookSkillPanel from "./OutlookSkillPanel";
|
||||
import {
|
||||
Brain,
|
||||
File,
|
||||
Browser,
|
||||
ChartBar,
|
||||
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";
|
||||
import GMailIcon from "./GMailSkillPanel/gmail.png";
|
||||
import OutlookIcon from "./OutlookSkillPanel/outlook.png";
|
||||
import GoogleCalendarIcon from "./GoogleCalendarSkillPanel/google-calendar.png";
|
||||
|
||||
export const getDefaultSkills = (t) => ({
|
||||
"rag-memory": {
|
||||
title: t("agent.skill.rag.title"),
|
||||
description: t("agent.skill.rag.description"),
|
||||
component: DefaultSkillPanel,
|
||||
icon: Brain,
|
||||
image: RAGImage,
|
||||
skill: "rag-memory",
|
||||
},
|
||||
"document-summarizer": {
|
||||
title: t("agent.skill.view.title"),
|
||||
description: t("agent.skill.view.description"),
|
||||
component: DefaultSkillPanel,
|
||||
icon: File,
|
||||
image: SummarizeImage,
|
||||
skill: "document-summarizer",
|
||||
},
|
||||
"web-scraping": {
|
||||
title: t("agent.skill.scrape.title"),
|
||||
description: t("agent.skill.scrape.description"),
|
||||
component: DefaultSkillPanel,
|
||||
icon: Browser,
|
||||
image: ScrapeWebsitesImage,
|
||||
skill: "web-scraping",
|
||||
},
|
||||
});
|
||||
|
||||
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"),
|
||||
component: GenericSkillPanel,
|
||||
skill: "create-chart",
|
||||
icon: ChartBar,
|
||||
image: GenerateChartsImage,
|
||||
},
|
||||
"web-browsing": {
|
||||
title: t("agent.skill.web.title"),
|
||||
description: t("agent.skill.web.description"),
|
||||
component: AgentWebSearchSelection,
|
||||
skill: "web-browsing",
|
||||
},
|
||||
"sql-agent": {
|
||||
title: t("agent.skill.sql.title"),
|
||||
description: t("agent.skill.sql.description"),
|
||||
component: AgentSQLConnectorSelection,
|
||||
skill: "sql-agent",
|
||||
},
|
||||
});
|
||||
|
||||
export const getAppIntegrationSkills = (t) => ({
|
||||
"gmail-agent": {
|
||||
title: t("agent.skill.gmail.title"),
|
||||
description: t("agent.skill.gmail.description"),
|
||||
component: GMailSkillPanel,
|
||||
skill: "gmail-agent",
|
||||
Icon: ({ size }) => (
|
||||
<img src={GMailIcon} alt="GMail" width={size} height={size} />
|
||||
),
|
||||
mode: ["singleUserOnly"],
|
||||
},
|
||||
"google-calendar-agent": {
|
||||
title: t("agent.skill.googleCalendar.title"),
|
||||
description: t("agent.skill.googleCalendar.description"),
|
||||
component: GoogleCalendarSkillPanel,
|
||||
skill: "google-calendar-agent",
|
||||
Icon: ({ size }) => (
|
||||
<img
|
||||
src={GoogleCalendarIcon}
|
||||
alt="Google Calendar"
|
||||
width={size}
|
||||
height={size}
|
||||
/>
|
||||
),
|
||||
mode: ["singleUserOnly"],
|
||||
},
|
||||
"outlook-agent": {
|
||||
title: t("agent.skill.outlook.title"),
|
||||
description: t("agent.skill.outlook.description"),
|
||||
component: OutlookSkillPanel,
|
||||
skill: "outlook-agent",
|
||||
Icon: ({ size }) => (
|
||||
<img src={OutlookIcon} alt="Outlook" width={size} height={size} />
|
||||
),
|
||||
mode: ["singleUserOnly"],
|
||||
},
|
||||
});
|
||||
33
frontend/src/pages/Admin/Agents/utils.js
Normal file
33
frontend/src/pages/Admin/Agents/utils.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import strDistance from "js-levenshtein";
|
||||
|
||||
const LEVENSHTEIN_THRESHOLD = 3;
|
||||
|
||||
function skillMatchesSearch(skill, searchTerm) {
|
||||
if (!searchTerm) return true;
|
||||
|
||||
const normalizedSearch = searchTerm.toLowerCase().trim();
|
||||
const titleLower = skill.title.toLowerCase();
|
||||
const descLower = skill.description.toLowerCase();
|
||||
|
||||
if (titleLower.includes(normalizedSearch)) return true;
|
||||
if (descLower.includes(normalizedSearch)) return true;
|
||||
if (strDistance(titleLower, normalizedSearch) <= LEVENSHTEIN_THRESHOLD)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
export function filterSkillCategories(skillCategories, searchTerm) {
|
||||
if (!searchTerm) return skillCategories;
|
||||
|
||||
const filtered = {};
|
||||
for (const [key, category] of Object.entries(skillCategories)) {
|
||||
const matchingSkills = category.skills.filter((skill) =>
|
||||
skillMatchesSearch(skill, searchTerm)
|
||||
);
|
||||
if (matchingSkills.length > 0) {
|
||||
filtered[key] = { ...category, skills: matchingSkills };
|
||||
}
|
||||
}
|
||||
return filtered;
|
||||
}
|
||||
@@ -1,31 +1,25 @@
|
||||
import { useEffect, useState } from "react";
|
||||
import Admin from "@/models/admin";
|
||||
import showToast from "@/utils/toast";
|
||||
import { Trash } from "@phosphor-icons/react";
|
||||
import { userFromStorage } from "@/utils/request";
|
||||
import System from "@/models/system";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function ApiKeyRow({ apiKey, removeApiKey }) {
|
||||
const { t } = useTranslation();
|
||||
const [copied, setCopied] = useState(false);
|
||||
const handleDelete = async () => {
|
||||
if (
|
||||
!window.confirm(
|
||||
`Are you sure you want to deactivate this api key?\nAfter you do this it will not longer be useable.\n\nThis action is irreversible.`
|
||||
)
|
||||
)
|
||||
return false;
|
||||
if (!window.confirm(t("api.row.deleteConfirm"))) return false;
|
||||
|
||||
const user = userFromStorage();
|
||||
const Model = !!user ? Admin : System;
|
||||
await Model.deleteApiKey(apiKey.id);
|
||||
showToast("API Key permanently deleted", "info");
|
||||
removeApiKey(apiKey.id);
|
||||
};
|
||||
|
||||
const copyApiKey = () => {
|
||||
if (!apiKey) return false;
|
||||
window.navigator.clipboard.writeText(apiKey.secret);
|
||||
showToast("API Key copied to clipboard", "success");
|
||||
setCopied(true);
|
||||
};
|
||||
|
||||
@@ -41,26 +35,37 @@ export default function ApiKeyRow({ apiKey, removeApiKey }) {
|
||||
|
||||
return (
|
||||
<>
|
||||
<tr className="bg-transparent text-white text-opacity-80 text-xs font-medium border-b border-white/10 h-10">
|
||||
<td scope="row" className="px-6 whitespace-nowrap">
|
||||
{apiKey.secret}
|
||||
<tr className="bg-transparent text-white text-opacity-80 text-xs font-medium border-b border-white/10">
|
||||
<td scope="row" className="px-6 py-3 whitespace-nowrap align-middle">
|
||||
{apiKey.name || t("api.row.unnamed")}
|
||||
</td>
|
||||
<td className="px-6 text-left">{apiKey.createdBy?.username || "--"}</td>
|
||||
<td className="px-6">{apiKey.createdAt}</td>
|
||||
<td className="px-6 flex items-center gap-x-6 h-full mt-1">
|
||||
<button
|
||||
onClick={copyApiKey}
|
||||
disabled={copied}
|
||||
className="text-xs font-medium text-blue-300 rounded-lg hover:text-white hover:light:text-blue-500 hover:text-opacity-60 hover:underline"
|
||||
>
|
||||
{copied ? "Copied" : "Copy API Key"}
|
||||
</button>
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
className="text-xs font-medium text-white/80 light:text-black/80 hover:light:text-red-500 hover:text-red-300 rounded-lg px-2 py-1 hover:bg-white hover:light:bg-red-50 hover:bg-opacity-10"
|
||||
>
|
||||
<Trash className="h-5 w-5" />
|
||||
</button>
|
||||
<td scope="row" className="px-6 py-3 align-middle">
|
||||
<code className="font-mono text-[11px] break-all text-theme-text-primary">
|
||||
{apiKey.secret}
|
||||
</code>
|
||||
</td>
|
||||
<td className="px-6 py-3 text-left align-middle">
|
||||
{apiKey.createdBy?.username || "--"}
|
||||
</td>
|
||||
<td className="px-6 py-3 whitespace-nowrap align-middle">
|
||||
{new Date(apiKey.createdAt).toLocaleString()}
|
||||
</td>
|
||||
<td className="px-6 py-3 align-middle">
|
||||
<div className="flex items-center gap-x-6">
|
||||
<button
|
||||
onClick={copyApiKey}
|
||||
disabled={copied}
|
||||
className="text-xs font-medium text-blue-300 rounded-lg hover:text-white hover:light:text-blue-500 hover:text-opacity-60 hover:underline"
|
||||
>
|
||||
{copied ? t("api.row.copied") : t("api.row.copy")}
|
||||
</button>
|
||||
<button
|
||||
onClick={handleDelete}
|
||||
className="text-xs font-medium text-white/80 light:text-black/80 hover:light:text-red-500 hover:text-red-300 rounded-lg px-2 py-1 hover:bg-white hover:light:bg-red-50 hover:bg-opacity-10"
|
||||
>
|
||||
<Trash className="h-5 w-5" />
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</>
|
||||
|
||||
@@ -4,10 +4,12 @@ import Admin from "@/models/admin";
|
||||
import paths from "@/utils/paths";
|
||||
import { userFromStorage } from "@/utils/request";
|
||||
import System from "@/models/system";
|
||||
import showToast from "@/utils/toast";
|
||||
import { useTranslation } from "react-i18next";
|
||||
|
||||
export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
const { t } = useTranslation();
|
||||
const [apiKey, setApiKey] = useState(null);
|
||||
const [name, setName] = useState("");
|
||||
const [error, setError] = useState(null);
|
||||
const [copied, setCopied] = useState(false);
|
||||
|
||||
@@ -17,7 +19,9 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
const user = userFromStorage();
|
||||
const Model = !!user ? Admin : System;
|
||||
|
||||
const { apiKey: newApiKey, error } = await Model.generateApiKey();
|
||||
const { apiKey: newApiKey, error } = await Model.generateApiKey({
|
||||
name,
|
||||
});
|
||||
if (!!newApiKey) {
|
||||
setApiKey(newApiKey);
|
||||
onSuccess();
|
||||
@@ -29,9 +33,6 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
if (!apiKey) return false;
|
||||
window.navigator.clipboard.writeText(apiKey.secret);
|
||||
setCopied(true);
|
||||
showToast("API key copied to clipboard", "success", {
|
||||
clear: true,
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
@@ -50,7 +51,7 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
<div className="relative p-6 border-b rounded-t border-theme-modal-border">
|
||||
<div className="w-full flex gap-x-2 items-center">
|
||||
<h3 className="text-xl font-semibold text-white overflow-hidden overflow-ellipsis whitespace-nowrap">
|
||||
Create new API key
|
||||
{t("api.modal.title")}
|
||||
</h3>
|
||||
</div>
|
||||
<button
|
||||
@@ -64,7 +65,28 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
<div className="px-7 py-6">
|
||||
<form onSubmit={handleCreate}>
|
||||
<div className="space-y-6 max-h-[60vh] overflow-y-auto pr-2">
|
||||
{error && <p className="text-red-400 text-sm">Error: {error}</p>}
|
||||
{error && (
|
||||
<p className="text-red-400 text-sm">
|
||||
{t("api.messages.error", { error })}
|
||||
</p>
|
||||
)}
|
||||
{!apiKey && (
|
||||
<div>
|
||||
<label className="block mb-2 text-sm font-medium text-white">
|
||||
{t("api.modal.name.label")}
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
value={name}
|
||||
onChange={(e) => setName(e.target.value)}
|
||||
placeholder={t("api.modal.name.placeholder")}
|
||||
className="border-none bg-theme-settings-input-bg text-white placeholder:text-theme-settings-input-placeholder text-sm rounded-lg outline-none block w-full p-2.5"
|
||||
/>
|
||||
<p className="text-white text-opacity-60 text-xs md:text-sm mt-2">
|
||||
{t("api.modal.name.helper")}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
{apiKey && (
|
||||
<div className="relative">
|
||||
<input
|
||||
@@ -92,8 +114,7 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
</div>
|
||||
)}
|
||||
<p className="text-white text-opacity-60 text-xs md:text-sm">
|
||||
Once created the API key can be used to programmatically access
|
||||
and configure this AnythingLLM instance.
|
||||
{t("api.modal.helper")}
|
||||
</p>
|
||||
<a
|
||||
href={paths.apiDocs()}
|
||||
@@ -112,13 +133,13 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
type="button"
|
||||
className="transition-all duration-300 text-white hover:bg-zinc-700 px-4 py-2 rounded-lg text-sm mr-2"
|
||||
>
|
||||
Cancel
|
||||
{t("api.modal.cancel")}
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
className="transition-all duration-300 bg-white text-black hover:opacity-60 px-4 py-2 rounded-lg text-sm"
|
||||
>
|
||||
Create API Key
|
||||
{t("api.modal.create")}
|
||||
</button>
|
||||
</>
|
||||
) : (
|
||||
@@ -127,7 +148,7 @@ export default function NewApiKeyModal({ closeModal, onSuccess }) {
|
||||
type="button"
|
||||
className="transition-all duration-300 text-white hover:bg-zinc-700 px-4 py-2 rounded-lg text-sm"
|
||||
>
|
||||
Close
|
||||
{t("api.modal.close")}
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -84,10 +84,13 @@ export default function AdminApiKeys() {
|
||||
containerClassName="flex w-full"
|
||||
/>
|
||||
) : (
|
||||
<table className="w-full text-xs text-left rounded-lg min-w-[640px] border-spacing-0">
|
||||
<table className="w-full text-xs text-left rounded-lg min-w-[720px] border-spacing-0 md:mt-6 mt-0">
|
||||
<thead className="text-theme-text-secondary text-xs leading-[18px] font-bold uppercase border-white/10 border-b">
|
||||
<tr>
|
||||
<th scope="col" className="px-6 py-3 rounded-tl-lg">
|
||||
{t("api.table.name")}
|
||||
</th>
|
||||
<th scope="col" className="px-6 py-3">
|
||||
{t("api.table.key")}
|
||||
</th>
|
||||
<th scope="col" className="px-6 py-3">
|
||||
@@ -97,15 +100,15 @@ export default function AdminApiKeys() {
|
||||
{t("api.table.created")}
|
||||
</th>
|
||||
<th scope="col" className="px-6 py-3 rounded-tr-lg">
|
||||
{" "}
|
||||
{t("api.actions")}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{apiKeys.length === 0 ? (
|
||||
<tr className="bg-transparent text-theme-text-secondary text-sm font-medium">
|
||||
<td colSpan="4" className="px-6 py-4 text-center">
|
||||
No API keys found
|
||||
<td colSpan="5" className="px-6 py-4 text-center">
|
||||
{t("api.empty")}
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
|
||||
@@ -158,6 +158,13 @@ export default function handleSocketResponse(socket, event, setChatHistory) {
|
||||
);
|
||||
}
|
||||
|
||||
if (type === "chatId") {
|
||||
if (!data.content.chatId) return prev;
|
||||
return prev.map((msg) =>
|
||||
msg.uuid === uuid ? { ...msg, chatId: data.content.chatId } : msg
|
||||
);
|
||||
}
|
||||
|
||||
if (type === "textResponseChunk") {
|
||||
return prev
|
||||
.map((msg) =>
|
||||
|
||||
@@ -63,7 +63,7 @@ markdown.renderer.rules.strong_close = () => "</strong>";
|
||||
markdown.renderer.rules.link_open = (tokens, idx) => {
|
||||
const token = tokens[idx];
|
||||
const href = token.attrs.find((attr) => attr[0] === "href");
|
||||
return `<a href="${href[1]}" target="_blank" rel="noopener noreferrer">`;
|
||||
return `<a href="${HTMLEncode(href[1])}" target="_blank" rel="noopener noreferrer">`;
|
||||
};
|
||||
|
||||
// Custom renderer for responsive images rendered in markdown
|
||||
@@ -73,7 +73,7 @@ markdown.renderer.rules.image = function (tokens, idx) {
|
||||
const src = token.attrs[srcIndex][1];
|
||||
const alt = token.content || "";
|
||||
|
||||
return `<div class="w-full max-w-[800px]"><img src="${src}" alt="${alt}" class="w-full h-auto" /></div>`;
|
||||
return `<div class="w-full max-w-[800px]"><img src="${HTMLEncode(src)}" alt="${HTMLEncode(alt)}" class="w-full h-auto" /></div>`;
|
||||
};
|
||||
|
||||
markdown.use(markdownItKatexPlugin);
|
||||
|
||||
@@ -67,6 +67,12 @@ export const LEMONADE_COMMON_URLS = [
|
||||
"http://127.0.0.1:8000/live",
|
||||
"http://host.docker.internal:8000/live",
|
||||
"http://172.17.0.1:8000/live",
|
||||
|
||||
// In Lemonade 10.1.0 the base port is 13305
|
||||
"http://localhost:13305/live",
|
||||
"http://127.0.0.1:13305/live",
|
||||
"http://host.docker.internal:13305/live",
|
||||
"http://172.17.0.1:13305/live",
|
||||
];
|
||||
|
||||
export function fullApiUrl() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "anything-llm",
|
||||
"version": "1.11.1",
|
||||
"version": "1.12.1",
|
||||
"description": "The best solution for turning private documents into a chat bot using off-the-shelf tools and commercially viable AI technologies.",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
|
||||
@@ -454,3 +454,7 @@ TTS_PROVIDER="native"
|
||||
# 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)
|
||||
|
||||
# (optional) Comma-separated list of skills that are auto-approved.
|
||||
# This will allow the skill to be invoked without user interaction.
|
||||
# AGENT_AUTO_APPROVED_SKILLS=create-pdf-file,create-word-file
|
||||
|
||||
@@ -409,6 +409,12 @@ function adminEndpoints(app) {
|
||||
case "disabled_create_files_skills":
|
||||
requestedSettings[label] = safeJsonParse(setting?.value, []);
|
||||
break;
|
||||
case "disabled_gmail_skills":
|
||||
requestedSettings[label] = safeJsonParse(setting?.value, []);
|
||||
break;
|
||||
case "disabled_outlook_skills":
|
||||
requestedSettings[label] = safeJsonParse(setting?.value, []);
|
||||
break;
|
||||
case "imported_agent_skills":
|
||||
requestedSettings[label] = ImportedPlugin.listImportedPlugins();
|
||||
break;
|
||||
@@ -503,10 +509,11 @@ function adminEndpoints(app) {
|
||||
async (request, response) => {
|
||||
try {
|
||||
const user = await userFromSession(request, response);
|
||||
const { apiKey, error } = await ApiKey.create(user.id);
|
||||
const { name = null } = reqBody(request);
|
||||
const { apiKey, error } = await ApiKey.create(user.id, name);
|
||||
await EventLogs.logEvent(
|
||||
"api_key_created",
|
||||
{ createdBy: user?.username },
|
||||
{ createdBy: user?.username, name: apiKey?.name },
|
||||
user?.id
|
||||
);
|
||||
return response.status(200).json({
|
||||
|
||||
@@ -985,16 +985,17 @@ function systemEndpoints(app) {
|
||||
app.post(
|
||||
"/system/generate-api-key",
|
||||
[validatedRequest],
|
||||
async (_, response) => {
|
||||
async (request, response) => {
|
||||
try {
|
||||
if (response.locals.multiUserMode) {
|
||||
return response.sendStatus(401).end();
|
||||
}
|
||||
|
||||
const { apiKey, error } = await ApiKey.create();
|
||||
const { name = null } = reqBody(request);
|
||||
const { apiKey, error } = await ApiKey.create(null, name);
|
||||
await EventLogs.logEvent(
|
||||
"api_key_created",
|
||||
{},
|
||||
{ name: apiKey?.name },
|
||||
response?.locals?.user?.id
|
||||
);
|
||||
return response.status(200).json({
|
||||
|
||||
@@ -36,12 +36,19 @@ function telegramEndpoints(app) {
|
||||
null;
|
||||
const threadSlug = activeUser?.active_thread || null;
|
||||
|
||||
let thread = null;
|
||||
let workspace = await Workspace.get({ slug: workspaceSlug });
|
||||
if (!workspace) {
|
||||
const available = await Workspace.where({}, 1);
|
||||
if (available.length) workspace = available[0];
|
||||
}
|
||||
const thread = await WorkspaceThread.get({ slug: threadSlug });
|
||||
|
||||
if (!threadSlug) {
|
||||
const availableThreads = await WorkspaceThread.where({
|
||||
workspace_id: workspace.id,
|
||||
});
|
||||
if (availableThreads.length) thread = availableThreads[0];
|
||||
}
|
||||
|
||||
return response.status(200).json({
|
||||
config: {
|
||||
@@ -157,7 +164,7 @@ function telegramEndpoints(app) {
|
||||
async (_request, response) => {
|
||||
try {
|
||||
const service = new TelegramBotService();
|
||||
service.stop();
|
||||
await service.stop();
|
||||
await ExternalCommunicationConnector.delete("telegram");
|
||||
await EventLogs.logEvent("telegram_bot_disconnected");
|
||||
return response.status(200).json({ success: true });
|
||||
|
||||
70
server/endpoints/utils/googleAgentSkillEndpoints.js
Normal file
70
server/endpoints/utils/googleAgentSkillEndpoints.js
Normal file
@@ -0,0 +1,70 @@
|
||||
const {
|
||||
isSingleUserMode,
|
||||
} = require("../../utils/middleware/multiUserProtected");
|
||||
const { validatedRequest } = require("../../utils/middleware/validatedRequest");
|
||||
const { GmailBridge } = require("../../utils/agents/aibitat/plugins/gmail/lib");
|
||||
const {
|
||||
GoogleCalendarBridge,
|
||||
} = require("../../utils/agents/aibitat/plugins/google-calendar/lib");
|
||||
|
||||
function googleAgentSkillEndpoints(app) {
|
||||
if (!app) return;
|
||||
|
||||
app.get(
|
||||
"/admin/agent-skills/gmail/status",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (_request, response) => {
|
||||
try {
|
||||
const config = await GmailBridge.getConfig();
|
||||
|
||||
const hasDeploymentId = !!config.deploymentId;
|
||||
const hasApiKey = !!config.apiKey;
|
||||
const isConfigured = hasDeploymentId && hasApiKey;
|
||||
|
||||
const safeConfig = {
|
||||
deploymentId: config.deploymentId || "",
|
||||
apiKey: hasApiKey ? "********" : "",
|
||||
};
|
||||
|
||||
return response.status(200).json({
|
||||
success: true,
|
||||
isConfigured,
|
||||
config: safeConfig,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error("Gmail status error:", e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/agent-skills/google-calendar/status",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (_request, response) => {
|
||||
try {
|
||||
const config = await GoogleCalendarBridge.getConfig();
|
||||
|
||||
const hasDeploymentId = !!config.deploymentId;
|
||||
const hasApiKey = !!config.apiKey;
|
||||
const isConfigured = hasDeploymentId && hasApiKey;
|
||||
|
||||
const safeConfig = {
|
||||
deploymentId: config.deploymentId || "",
|
||||
apiKey: hasApiKey ? "********" : "",
|
||||
};
|
||||
|
||||
return response.status(200).json({
|
||||
success: true,
|
||||
isConfigured,
|
||||
config: safeConfig,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error("Google Calendar status error:", e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = { googleAgentSkillEndpoints };
|
||||
190
server/endpoints/utils/outlookAgentUtils.js
Normal file
190
server/endpoints/utils/outlookAgentUtils.js
Normal file
@@ -0,0 +1,190 @@
|
||||
const { reqBody } = require("../../utils/http");
|
||||
const {
|
||||
isSingleUserMode,
|
||||
} = require("../../utils/middleware/multiUserProtected");
|
||||
const { validatedRequest } = require("../../utils/middleware/validatedRequest");
|
||||
|
||||
/**
|
||||
* Constructs the OAuth redirect URI from the request headers.
|
||||
* @param {Object} request - Express request object
|
||||
* @returns {string} The redirect URI for OAuth callback
|
||||
*/
|
||||
function getOutlookRedirectUri(request) {
|
||||
const protocol = request.headers["x-forwarded-proto"] || request.protocol;
|
||||
const host = request.headers["x-forwarded-host"] || request.get("host");
|
||||
return `${protocol}://${host}/api/agent-skills/outlook/auth-callback`;
|
||||
}
|
||||
|
||||
function outlookAgentEndpoints(app) {
|
||||
if (!app) return;
|
||||
|
||||
app.post(
|
||||
"/admin/agent-skills/outlook/auth-url",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (request, response) => {
|
||||
try {
|
||||
const { clientId, tenantId, clientSecret, authType } = reqBody(request);
|
||||
|
||||
if (!clientId || !clientSecret) {
|
||||
return response.status(400).json({
|
||||
success: false,
|
||||
error: "Client ID and Client Secret are required.",
|
||||
});
|
||||
}
|
||||
|
||||
const outlookLib = require("../../utils/agents/aibitat/plugins/outlook/lib");
|
||||
const { AUTH_TYPES } = outlookLib;
|
||||
const validAuthType = Object.values(AUTH_TYPES).includes(authType)
|
||||
? authType
|
||||
: AUTH_TYPES.common;
|
||||
|
||||
if (validAuthType === AUTH_TYPES.organization && !tenantId) {
|
||||
return response.status(400).json({
|
||||
success: false,
|
||||
error:
|
||||
"Tenant ID is required for organization-only authentication.",
|
||||
});
|
||||
}
|
||||
|
||||
const existingConfig = await outlookLib.OutlookBridge.getConfig();
|
||||
const configUpdate = {
|
||||
...existingConfig,
|
||||
clientId: clientId.trim(),
|
||||
tenantId: tenantId?.trim() || "",
|
||||
authType: validAuthType,
|
||||
};
|
||||
|
||||
if (!/^\*+$/.test(clientSecret))
|
||||
configUpdate.clientSecret = clientSecret.trim();
|
||||
|
||||
// If auth type changed, clear tokens as they won't work with different authority
|
||||
if (
|
||||
existingConfig.authType &&
|
||||
existingConfig.authType !== validAuthType
|
||||
) {
|
||||
delete configUpdate.accessToken;
|
||||
delete configUpdate.refreshToken;
|
||||
delete configUpdate.tokenExpiry;
|
||||
}
|
||||
|
||||
await outlookLib.OutlookBridge.updateConfig(configUpdate);
|
||||
outlookLib.reset();
|
||||
|
||||
const redirectUri = getOutlookRedirectUri(request);
|
||||
const result = await outlookLib.getAuthUrl(redirectUri);
|
||||
if (!result.success) {
|
||||
return response
|
||||
.status(400)
|
||||
.json({ success: false, error: result.error });
|
||||
}
|
||||
|
||||
return response.status(200).json({ success: true, url: result.url });
|
||||
} catch (e) {
|
||||
console.error("Outlook auth URL error:", e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/agent-skills/outlook/auth-callback",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (request, response) => {
|
||||
try {
|
||||
const { code, error, error_description } = request.query;
|
||||
|
||||
if (error) {
|
||||
console.error("Outlook OAuth error:", error, error_description);
|
||||
return response.redirect(
|
||||
`/?outlook_auth=error&message=${encodeURIComponent(error_description || error)}`
|
||||
);
|
||||
}
|
||||
|
||||
if (!code) {
|
||||
return response.redirect(
|
||||
"/?outlook_auth=error&message=No authorization code received"
|
||||
);
|
||||
}
|
||||
|
||||
const outlookLib = require("../../utils/agents/aibitat/plugins/outlook/lib");
|
||||
const redirectUri = getOutlookRedirectUri(request);
|
||||
const result = await outlookLib.exchangeCodeForToken(code, redirectUri);
|
||||
|
||||
const frontendUrl =
|
||||
process.env.NODE_ENV === "development" ? "http://localhost:3000" : "";
|
||||
|
||||
if (!result.success) {
|
||||
return response.redirect(
|
||||
`${frontendUrl}/settings/agents?outlook_auth=error&message=${encodeURIComponent(result.error)}`
|
||||
);
|
||||
}
|
||||
|
||||
return response.redirect(
|
||||
`${frontendUrl}/settings/agents?outlook_auth=success`
|
||||
);
|
||||
} catch (e) {
|
||||
console.error("Outlook OAuth callback error:", e);
|
||||
response.redirect(
|
||||
`/?outlook_auth=error&message=${encodeURIComponent(e.message)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/admin/agent-skills/outlook/status",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (_request, response) => {
|
||||
try {
|
||||
const outlookLib = require("../../utils/agents/aibitat/plugins/outlook/lib");
|
||||
const { AUTH_TYPES, normalizeTokenExpiry } = outlookLib;
|
||||
const config = await outlookLib.OutlookBridge.getConfig();
|
||||
const isConfigured = await outlookLib.OutlookBridge.isToolAvailable();
|
||||
|
||||
const authType = config.authType || AUTH_TYPES.common;
|
||||
let hasCredentials = !!(config.clientId && config.clientSecret);
|
||||
if (authType === AUTH_TYPES.organization) {
|
||||
hasCredentials = hasCredentials && !!config.tenantId;
|
||||
}
|
||||
|
||||
const safeConfig = {
|
||||
clientId: config.clientId || "",
|
||||
tenantId: config.tenantId || "",
|
||||
clientSecret: config.clientSecret ? "********" : "",
|
||||
authType: config.authType || AUTH_TYPES.common,
|
||||
};
|
||||
|
||||
return response.status(200).json({
|
||||
success: true,
|
||||
isConfigured,
|
||||
hasCredentials,
|
||||
isAuthenticated: !!config.accessToken,
|
||||
tokenExpiry: normalizeTokenExpiry(config.tokenExpiry),
|
||||
config: safeConfig,
|
||||
});
|
||||
} catch (e) {
|
||||
console.error("Outlook status error:", e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.post(
|
||||
"/admin/agent-skills/outlook/revoke",
|
||||
[validatedRequest, isSingleUserMode],
|
||||
async (_request, response) => {
|
||||
try {
|
||||
const outlookLib = require("../../utils/agents/aibitat/plugins/outlook/lib");
|
||||
const { SystemSettings } = require("../../models/systemSettings");
|
||||
await SystemSettings.delete({ label: "outlook_agent_config" });
|
||||
outlookLib.reset();
|
||||
return response.status(200).json({ success: true });
|
||||
} catch (e) {
|
||||
console.error("Outlook revoke error:", e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
module.exports = { outlookAgentEndpoints };
|
||||
@@ -224,6 +224,28 @@ function workspaceEndpoints(app) {
|
||||
deletes,
|
||||
response.locals?.user?.id
|
||||
);
|
||||
|
||||
const {
|
||||
isNativeEmbedder,
|
||||
embedFiles,
|
||||
} = require("../utils/EmbeddingWorkerManager");
|
||||
|
||||
if (isNativeEmbedder() && adds.length > 0) {
|
||||
await embedFiles(
|
||||
currWorkspace.slug,
|
||||
adds,
|
||||
currWorkspace.id,
|
||||
response.locals?.user?.id ?? null
|
||||
);
|
||||
const updatedWorkspace = await Workspace.get({
|
||||
id: currWorkspace.id,
|
||||
});
|
||||
response
|
||||
.status(200)
|
||||
.json({ workspace: updatedWorkspace, message: null });
|
||||
return;
|
||||
}
|
||||
|
||||
const { failedToEmbed = [], errors = [] } = await Document.addDocuments(
|
||||
currWorkspace,
|
||||
adds,
|
||||
@@ -1059,6 +1081,66 @@ function workspaceEndpoints(app) {
|
||||
}
|
||||
);
|
||||
|
||||
// SSE endpoint for embedding progress
|
||||
app.get(
|
||||
"/workspace/:slug/embed-progress",
|
||||
[
|
||||
validatedRequest,
|
||||
flexUserRoleValid([ROLES.admin, ROLES.manager]),
|
||||
validWorkspaceSlug,
|
||||
],
|
||||
async (request, response) => {
|
||||
try {
|
||||
const workspace = response.locals.workspace;
|
||||
const {
|
||||
addSSEConnection,
|
||||
removeSSEConnection,
|
||||
} = require("../utils/EmbeddingWorkerManager");
|
||||
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Content-Type", "text/event-stream");
|
||||
response.setHeader("Access-Control-Allow-Origin", "*");
|
||||
response.setHeader("Connection", "keep-alive");
|
||||
response.flushHeaders();
|
||||
addSSEConnection(workspace.slug, response);
|
||||
request.on("close", () => {
|
||||
removeSSEConnection(workspace.slug, response);
|
||||
});
|
||||
} catch (e) {
|
||||
console.error(e.message, e);
|
||||
response.status(500).end();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.delete(
|
||||
"/workspace/:slug/embed-queue",
|
||||
[
|
||||
validatedRequest,
|
||||
flexUserRoleValid([ROLES.admin, ROLES.manager]),
|
||||
validWorkspaceSlug,
|
||||
],
|
||||
async (request, response) => {
|
||||
try {
|
||||
const workspace = response.locals.workspace;
|
||||
const { filename } = reqBody(request);
|
||||
if (!filename) {
|
||||
response
|
||||
.status(400)
|
||||
.json({ success: false, error: "Missing filename" });
|
||||
return;
|
||||
}
|
||||
|
||||
const { removeQueuedFile } = require("../utils/EmbeddingWorkerManager");
|
||||
const sent = removeQueuedFile(workspace.slug, filename);
|
||||
response.status(200).json({ success: sent });
|
||||
} catch (e) {
|
||||
console.error(e.message, e);
|
||||
response.status(500).json({ success: false, error: e.message });
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get(
|
||||
"/workspace/:slug/is-agent-command-available",
|
||||
[validatedRequest, flexUserRoleValid([ROLES.all]), validWorkspaceSlug],
|
||||
|
||||
@@ -35,6 +35,12 @@ const { mcpServersEndpoints } = require("./endpoints/mcpServers");
|
||||
const { mobileEndpoints } = require("./endpoints/mobile");
|
||||
const { webPushEndpoints } = require("./endpoints/webPush");
|
||||
const { telegramEndpoints } = require("./endpoints/telegram");
|
||||
const {
|
||||
outlookAgentEndpoints,
|
||||
} = require("./endpoints/utils/outlookAgentUtils");
|
||||
const {
|
||||
googleAgentSkillEndpoints,
|
||||
} = require("./endpoints/utils/googleAgentSkillEndpoints");
|
||||
const { httpLogger } = require("./middleware/httpLogger");
|
||||
const app = express();
|
||||
const apiRouter = express.Router();
|
||||
@@ -89,6 +95,8 @@ mcpServersEndpoints(apiRouter);
|
||||
mobileEndpoints(apiRouter);
|
||||
webPushEndpoints(apiRouter);
|
||||
telegramEndpoints(apiRouter);
|
||||
outlookAgentEndpoints(apiRouter);
|
||||
googleAgentSkillEndpoints(apiRouter);
|
||||
// Externally facing embedder endpoints
|
||||
embeddedEndpoints(apiRouter);
|
||||
|
||||
|
||||
199
server/jobs/embedding-worker.js
Normal file
199
server/jobs/embedding-worker.js
Normal file
@@ -0,0 +1,199 @@
|
||||
/**
|
||||
* Embedding Worker
|
||||
*
|
||||
* Runs the full document-embedding loop in an isolated child process so that
|
||||
* OOM from the native embedding model only kills this worker, not the main server.
|
||||
*
|
||||
* Spawned on-demand by EmbeddingWorkerManager via BackgroundService/Bree.
|
||||
* Processes files sequentially and accepts additional files mid-run.
|
||||
*
|
||||
* IPC protocol (receives from parent):
|
||||
* { type: "embed", files, workspaceSlug, workspaceId, userId }
|
||||
* { type: "add_files", files }
|
||||
*
|
||||
* IPC protocol (sends to parent):
|
||||
* { type: "batch_starting", workspaceSlug, filenames, totalDocs }
|
||||
* { type: "doc_starting", workspaceSlug, filename, docIndex, totalDocs }
|
||||
* { type: "chunk_progress", workspaceSlug, filename, chunksProcessed, totalChunks }
|
||||
* { type: "doc_complete", workspaceSlug, filename, docIndex, totalDocs }
|
||||
* { type: "doc_failed", workspaceSlug, filename, error }
|
||||
* { type: "all_complete", workspaceSlug, embedded, failed }
|
||||
*/
|
||||
|
||||
const { v4: uuidv4 } = require("uuid");
|
||||
const prisma = require("../utils/prisma");
|
||||
const { getVectorDbClass } = require("../utils/helpers");
|
||||
const { fileData } = require("../utils/files");
|
||||
const { Telemetry } = require("../models/telemetry");
|
||||
|
||||
const queue = [];
|
||||
const cancelled = new Set();
|
||||
let processing = false;
|
||||
let workspaceSlug = null;
|
||||
let workspaceId = null;
|
||||
let userId = null;
|
||||
|
||||
function emit(event) {
|
||||
try {
|
||||
process.send({ ...event, silent: true });
|
||||
} catch {
|
||||
// Parent may have disconnected
|
||||
}
|
||||
}
|
||||
|
||||
async function processQueue() {
|
||||
if (processing || queue.length === 0) return;
|
||||
processing = true;
|
||||
|
||||
const VectorDb = getVectorDbClass();
|
||||
const batch = [...queue];
|
||||
queue.length = 0;
|
||||
|
||||
emit({
|
||||
type: "batch_starting",
|
||||
workspaceSlug,
|
||||
userId,
|
||||
filenames: batch,
|
||||
totalDocs: batch.length,
|
||||
});
|
||||
|
||||
Telemetry.sendTelemetry("documents_embedded_in_workspace").catch(() => {});
|
||||
const embedded = [];
|
||||
const failedToEmbed = [];
|
||||
|
||||
for (const [index, filePath] of batch.entries()) {
|
||||
if (cancelled.has(filePath)) {
|
||||
cancelled.delete(filePath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const docProgress = {
|
||||
workspaceSlug,
|
||||
userId,
|
||||
filename: filePath,
|
||||
docIndex: index,
|
||||
totalDocs: batch.length,
|
||||
};
|
||||
|
||||
const data = await fileData(filePath);
|
||||
if (!data) {
|
||||
emit({
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: "Failed to load file data",
|
||||
});
|
||||
failedToEmbed.push(filePath);
|
||||
continue;
|
||||
}
|
||||
|
||||
const docId = uuidv4();
|
||||
const { pageContent: _pageContent, ...metadata } = data;
|
||||
const newDoc = {
|
||||
docId,
|
||||
filename: filePath.split("/")[1],
|
||||
docpath: filePath,
|
||||
workspaceId,
|
||||
metadata: JSON.stringify(metadata),
|
||||
};
|
||||
|
||||
emit({
|
||||
type: "doc_starting",
|
||||
...docProgress,
|
||||
});
|
||||
|
||||
// Set context so NativeEmbedder can send chunk_progress IPC messages
|
||||
// enriched with workspace/file info (read via process.send in embedChunks).
|
||||
global.__embeddingProgress = { workspaceSlug, filename: filePath, userId };
|
||||
|
||||
const { vectorized, error } = await VectorDb.addDocumentToNamespace(
|
||||
workspaceSlug,
|
||||
{ ...data, docId },
|
||||
filePath
|
||||
);
|
||||
|
||||
if (!vectorized) {
|
||||
console.error("Failed to vectorize", metadata?.title || newDoc.filename);
|
||||
failedToEmbed.push(metadata?.title || newDoc.filename);
|
||||
emit({
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: error || "Unknown error",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
await prisma.workspace_documents.create({ data: newDoc });
|
||||
embedded.push(filePath);
|
||||
emit({
|
||||
type: "doc_complete",
|
||||
...docProgress,
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err.message);
|
||||
emit({
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: "Failed to save document record",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
processing = false;
|
||||
|
||||
// If new files were added while we were processing, recurse.
|
||||
if (queue.length > 0) {
|
||||
await processQueue();
|
||||
return;
|
||||
}
|
||||
|
||||
emit({
|
||||
type: "all_complete",
|
||||
workspaceSlug,
|
||||
userId,
|
||||
totalDocs: batch.length,
|
||||
embedded: embedded.length,
|
||||
failed: failedToEmbed.length,
|
||||
embeddedFiles: embedded,
|
||||
failedFiles: failedToEmbed,
|
||||
});
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
process.on("message", async (msg) => {
|
||||
if (!msg || !msg.type) return;
|
||||
|
||||
if (msg.type === "embed") {
|
||||
workspaceSlug = msg.workspaceSlug;
|
||||
workspaceId = msg.workspaceId;
|
||||
userId = msg.userId;
|
||||
queue.push(...msg.files);
|
||||
processQueue().catch((err) => {
|
||||
console.error("[embedding-worker] Fatal error:", err);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
|
||||
if (msg.type === "add_files") {
|
||||
queue.push(...msg.files);
|
||||
// If we're not currently processing (worker is idle between batches),
|
||||
// kick off processing immediately.
|
||||
if (!processing) {
|
||||
processQueue().catch((err) => {
|
||||
console.error("[embedding-worker] Fatal error:", err);
|
||||
process.exit(1);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (msg.type === "remove_file") {
|
||||
const idx = queue.indexOf(msg.filename);
|
||||
if (idx !== -1) queue.splice(idx, 1);
|
||||
else cancelled.add(msg.filename);
|
||||
emit({
|
||||
type: "file_removed",
|
||||
workspaceSlug,
|
||||
filename: msg.filename,
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -2,17 +2,20 @@ const prisma = require("../utils/prisma");
|
||||
|
||||
const ApiKey = {
|
||||
tablename: "api_keys",
|
||||
writable: [],
|
||||
writable: ["name"],
|
||||
|
||||
makeSecret: () => {
|
||||
const uuidAPIKey = require("uuid-apikey");
|
||||
return uuidAPIKey.create().apiKey;
|
||||
},
|
||||
|
||||
create: async function (createdByUserId = null) {
|
||||
create: async function (createdByUserId = null, name = null) {
|
||||
try {
|
||||
const normalizedName =
|
||||
typeof name === "string" && name.trim().length > 0 ? name.trim() : null;
|
||||
const apiKey = await prisma.api_keys.create({
|
||||
data: {
|
||||
name: normalizedName,
|
||||
secret: this.makeSecret(),
|
||||
createdBy: createdByUserId,
|
||||
},
|
||||
|
||||
@@ -84,13 +84,37 @@ const Document = {
|
||||
const VectorDb = getVectorDbClass();
|
||||
if (additions.length === 0) return { failed: [], embedded: [] };
|
||||
const { fileData } = require("../utils/files");
|
||||
const { emitProgress } = require("../utils/EmbeddingWorkerManager");
|
||||
const embedded = [];
|
||||
const failedToEmbed = [];
|
||||
const errors = new Set();
|
||||
|
||||
for (const path of additions) {
|
||||
emitProgress(workspace.slug, {
|
||||
type: "batch_starting",
|
||||
workspaceSlug: workspace.slug,
|
||||
userId,
|
||||
filenames: additions,
|
||||
totalDocs: additions.length,
|
||||
});
|
||||
|
||||
for (const [index, path] of additions.entries()) {
|
||||
const docProgress = {
|
||||
workspaceSlug: workspace.slug,
|
||||
userId,
|
||||
filename: path,
|
||||
docIndex: index,
|
||||
totalDocs: additions.length,
|
||||
};
|
||||
|
||||
const data = await fileData(path);
|
||||
if (!data) continue;
|
||||
if (!data) {
|
||||
emitProgress(workspace.slug, {
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: "Failed to load file data",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
const docId = uuidv4();
|
||||
const { pageContent: _pageContent, ...metadata } = data;
|
||||
@@ -102,6 +126,14 @@ const Document = {
|
||||
metadata: JSON.stringify(metadata),
|
||||
};
|
||||
|
||||
emitProgress(workspace.slug, { type: "doc_starting", ...docProgress });
|
||||
|
||||
global.__embeddingProgress = {
|
||||
workspaceSlug: workspace.slug,
|
||||
filename: path,
|
||||
userId,
|
||||
};
|
||||
|
||||
const { vectorized, error } = await VectorDb.addDocumentToNamespace(
|
||||
workspace.slug,
|
||||
{ ...data, docId },
|
||||
@@ -115,17 +147,42 @@ const Document = {
|
||||
);
|
||||
failedToEmbed.push(metadata?.title || newDoc.filename);
|
||||
errors.add(error);
|
||||
emitProgress(workspace.slug, {
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: error || "Unknown error",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
await prisma.workspace_documents.create({ data: newDoc });
|
||||
embedded.push(path);
|
||||
emitProgress(workspace.slug, {
|
||||
type: "doc_complete",
|
||||
...docProgress,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error.message);
|
||||
emitProgress(workspace.slug, {
|
||||
type: "doc_failed",
|
||||
...docProgress,
|
||||
error: "Failed to save document record",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
global.__embeddingProgress = null;
|
||||
|
||||
emitProgress(workspace.slug, {
|
||||
type: "all_complete",
|
||||
workspaceSlug: workspace.slug,
|
||||
userId,
|
||||
totalDocs: additions.length,
|
||||
embedded: embedded.length,
|
||||
failed: failedToEmbed.length,
|
||||
});
|
||||
|
||||
await Telemetry.sendTelemetry("documents_embedded_in_workspace", {
|
||||
LLMSelection: process.env.LLM_PROVIDER || "openai",
|
||||
Embedder: process.env.EMBEDDING_ENGINE || "inherit",
|
||||
|
||||
@@ -18,6 +18,21 @@ function isNullOrNaN(value) {
|
||||
return isNaN(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges a string field from source to target if it passes validation.
|
||||
* @param {Object} target - The target object to merge into
|
||||
* @param {Object} source - The source object to read from
|
||||
* @param {string} fieldName - The field name to merge
|
||||
* @param {Function|null} validator - Optional validator function that returns false to reject the value
|
||||
*/
|
||||
function mergeStringField(target, source, fieldName, validator = null) {
|
||||
const value = source[fieldName];
|
||||
if (value && typeof value === "string" && value.trim()) {
|
||||
if (validator && !validator(value)) return;
|
||||
target[fieldName] = value.trim();
|
||||
}
|
||||
}
|
||||
|
||||
const SystemSettings = {
|
||||
/** A default system prompt that is used when no other system prompt is set or available to the function caller. */
|
||||
saneDefaultSystemPrompt:
|
||||
@@ -35,6 +50,12 @@ const SystemSettings = {
|
||||
"disabled_agent_skills",
|
||||
"disabled_filesystem_skills",
|
||||
"disabled_create_files_skills",
|
||||
"disabled_gmail_skills",
|
||||
"gmail_agent_config",
|
||||
"disabled_google_calendar_skills",
|
||||
"google_calendar_agent_config",
|
||||
"disabled_outlook_skills",
|
||||
"outlook_agent_config",
|
||||
"imported_agent_skills",
|
||||
"custom_app_name",
|
||||
"feature_flags",
|
||||
@@ -54,6 +75,12 @@ const SystemSettings = {
|
||||
"disabled_agent_skills",
|
||||
"disabled_filesystem_skills",
|
||||
"disabled_create_files_skills",
|
||||
"disabled_gmail_skills",
|
||||
"gmail_agent_config",
|
||||
"disabled_google_calendar_skills",
|
||||
"google_calendar_agent_config",
|
||||
"disabled_outlook_skills",
|
||||
"outlook_agent_config",
|
||||
"agent_sql_connections",
|
||||
"custom_app_name",
|
||||
"default_system_prompt",
|
||||
@@ -174,6 +201,138 @@ const SystemSettings = {
|
||||
return JSON.stringify([]);
|
||||
}
|
||||
},
|
||||
disabled_gmail_skills: (updates) => {
|
||||
try {
|
||||
const skills = updates.split(",").filter((skill) => !!skill);
|
||||
return JSON.stringify(skills);
|
||||
} catch {
|
||||
console.error(`Could not validate disabled gmail skills.`);
|
||||
return JSON.stringify([]);
|
||||
}
|
||||
},
|
||||
gmail_agent_config: async (update) => {
|
||||
const GmailBridge = require("../utils/agents/aibitat/plugins/gmail/lib");
|
||||
try {
|
||||
if (!update) return JSON.stringify({});
|
||||
|
||||
const newConfig =
|
||||
typeof update === "string" ? safeJsonParse(update, {}) : update;
|
||||
const existingConfig = safeJsonParse(
|
||||
(await SystemSettings.get({ label: "gmail_agent_config" }))?.value,
|
||||
{}
|
||||
);
|
||||
|
||||
const mergedConfig = { ...existingConfig };
|
||||
|
||||
mergeStringField(mergedConfig, newConfig, "deploymentId");
|
||||
mergeStringField(
|
||||
mergedConfig,
|
||||
newConfig,
|
||||
"apiKey",
|
||||
(v) => !v.match(/^\*+$/)
|
||||
);
|
||||
|
||||
return JSON.stringify(mergedConfig);
|
||||
} catch (e) {
|
||||
console.error(`Could not validate gmail agent config:`, e.message);
|
||||
return JSON.stringify({});
|
||||
} finally {
|
||||
GmailBridge.reset();
|
||||
}
|
||||
},
|
||||
disabled_google_calendar_skills: (updates) => {
|
||||
try {
|
||||
const skills = updates.split(",").filter((skill) => !!skill);
|
||||
return JSON.stringify(skills);
|
||||
} catch {
|
||||
console.error(`Could not validate disabled google calendar skills.`);
|
||||
return JSON.stringify([]);
|
||||
}
|
||||
},
|
||||
google_calendar_agent_config: async (update) => {
|
||||
const GoogleCalendarBridge = require("../utils/agents/aibitat/plugins/google-calendar/lib");
|
||||
try {
|
||||
if (!update) return JSON.stringify({});
|
||||
|
||||
const newConfig =
|
||||
typeof update === "string" ? safeJsonParse(update, {}) : update;
|
||||
const existingConfig = safeJsonParse(
|
||||
(await SystemSettings.get({ label: "google_calendar_agent_config" }))
|
||||
?.value,
|
||||
{}
|
||||
);
|
||||
|
||||
const mergedConfig = { ...existingConfig };
|
||||
|
||||
mergeStringField(mergedConfig, newConfig, "deploymentId");
|
||||
mergeStringField(
|
||||
mergedConfig,
|
||||
newConfig,
|
||||
"apiKey",
|
||||
(v) => !v.match(/^\*+$/)
|
||||
);
|
||||
|
||||
return JSON.stringify(mergedConfig);
|
||||
} catch (e) {
|
||||
console.error(
|
||||
`Could not validate google calendar agent config:`,
|
||||
e.message
|
||||
);
|
||||
return JSON.stringify({});
|
||||
} finally {
|
||||
GoogleCalendarBridge.reset();
|
||||
}
|
||||
},
|
||||
disabled_outlook_skills: (updates) => {
|
||||
try {
|
||||
const skills = updates.split(",").filter((skill) => !!skill);
|
||||
return JSON.stringify(skills);
|
||||
} catch {
|
||||
console.error(`Could not validate disabled outlook skills.`);
|
||||
return JSON.stringify([]);
|
||||
}
|
||||
},
|
||||
outlook_agent_config: async (update) => {
|
||||
const OutlookBridge = require("../utils/agents/aibitat/plugins/outlook/lib");
|
||||
try {
|
||||
if (!update) return JSON.stringify({});
|
||||
|
||||
const newConfig =
|
||||
typeof update === "string" ? safeJsonParse(update, {}) : update;
|
||||
const existingConfig = safeJsonParse(
|
||||
(await SystemSettings.get({ label: "outlook_agent_config" }))?.value,
|
||||
{}
|
||||
);
|
||||
|
||||
const mergedConfig = { ...existingConfig };
|
||||
|
||||
mergeStringField(mergedConfig, newConfig, "clientId");
|
||||
mergeStringField(mergedConfig, newConfig, "tenantId");
|
||||
mergeStringField(
|
||||
mergedConfig,
|
||||
newConfig,
|
||||
"clientSecret",
|
||||
(v) => !v.match(/^\*+$/)
|
||||
);
|
||||
|
||||
if (newConfig.accessToken !== undefined) {
|
||||
mergedConfig.accessToken = newConfig.accessToken;
|
||||
}
|
||||
if (newConfig.refreshToken !== undefined) {
|
||||
mergedConfig.refreshToken = newConfig.refreshToken;
|
||||
}
|
||||
if (newConfig.tokenExpiry !== undefined) {
|
||||
mergedConfig.tokenExpiry = newConfig.tokenExpiry;
|
||||
}
|
||||
|
||||
return JSON.stringify(mergedConfig);
|
||||
} catch (e) {
|
||||
console.error(`Could not validate outlook agent config:`, e.message);
|
||||
return JSON.stringify({});
|
||||
} finally {
|
||||
OutlookBridge.reset();
|
||||
}
|
||||
},
|
||||
agent_sql_connections: async (updates) => {
|
||||
const existingConnections = safeJsonParse(
|
||||
(await SystemSettings.get({ label: "agent_sql_connections" }))?.value,
|
||||
@@ -401,6 +560,18 @@ const SystemSettings = {
|
||||
return this._updateSettings(updates);
|
||||
},
|
||||
|
||||
delete: async function (clause = {}) {
|
||||
try {
|
||||
if (!Object.keys(clause).length)
|
||||
throw new Error("Clause cannot be empty");
|
||||
await prisma.system_settings.deleteMany({ where: clause });
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(error.message);
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
// Explicit update of settings + key validations.
|
||||
// Only use this method when directly setting a key value
|
||||
// that takes no user input for the keys being modified.
|
||||
@@ -417,6 +588,8 @@ const SystemSettings = {
|
||||
}
|
||||
}
|
||||
|
||||
if (validatedValue === undefined) continue;
|
||||
|
||||
updatePromises.push(
|
||||
prisma.system_settings.upsert({
|
||||
where: { label: key },
|
||||
|
||||
@@ -315,6 +315,45 @@ const WorkspaceChats = {
|
||||
return { chats: null, message: error.message };
|
||||
}
|
||||
},
|
||||
upsert: async function (
|
||||
chatId = null,
|
||||
data = {
|
||||
workspaceId: null,
|
||||
prompt: null,
|
||||
response: {},
|
||||
user: null,
|
||||
threadId: null,
|
||||
include: true,
|
||||
apiSessionId: null,
|
||||
}
|
||||
) {
|
||||
try {
|
||||
const payload = {
|
||||
workspaceId: data.workspaceId,
|
||||
response: safeJSONStringify(data.response),
|
||||
user_id: data.user?.id || null,
|
||||
thread_id: data.threadId,
|
||||
api_session_id: data.apiSessionId,
|
||||
include: data.include,
|
||||
};
|
||||
|
||||
const { chat } = await prisma.workspace_chats.upsert({
|
||||
where: {
|
||||
id: Number(chatId),
|
||||
user_id: data.user?.id || null,
|
||||
},
|
||||
// On updates, we already have the prompt so we don't need to set it again.
|
||||
update: { ...payload, lastUpdatedAt: new Date() },
|
||||
|
||||
// On creates, we need to set the prompt or else record will fail.
|
||||
create: { ...payload, prompt: data.prompt },
|
||||
});
|
||||
return { chat, message: null };
|
||||
} catch (error) {
|
||||
console.error(error.message);
|
||||
return { chat: null, message: error.message };
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = { WorkspaceChats };
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "anything-llm-server",
|
||||
"version": "1.11.1",
|
||||
"version": "1.12.1",
|
||||
"description": "Server endpoints to process or create content for chatting",
|
||||
"main": "index.js",
|
||||
"author": "Timothy Carambat (Mintplex Labs)",
|
||||
@@ -35,6 +35,7 @@
|
||||
"@mdpdf/mdpdf": "0.1.4",
|
||||
"@mintplex-labs/bree": "^9.2.5",
|
||||
"@mintplex-labs/express-ws": "^5.0.7",
|
||||
"@mintplex-labs/mdpdf": "^0.1.9",
|
||||
"@modelcontextprotocol/sdk": "^1.24.3",
|
||||
"@pinecone-database/pinecone": "^2.0.1",
|
||||
"@prisma/client": "5.3.1",
|
||||
@@ -69,6 +70,7 @@
|
||||
"joi": "^17.11.0",
|
||||
"joi-password-complexity": "^5.2.0",
|
||||
"js-tiktoken": "^1.0.8",
|
||||
"jsdom": "26.1.0",
|
||||
"jsonrepair": "^3.7.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"jsdom": "26.1.0",
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "api_keys" ADD COLUMN "name" TEXT;
|
||||
@@ -13,6 +13,7 @@ datasource db {
|
||||
|
||||
model api_keys {
|
||||
id Int @id @default(autoincrement())
|
||||
name String?
|
||||
secret String? @unique
|
||||
createdBy Int?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@ -35,6 +35,15 @@ class AWSBedrockLLM {
|
||||
// Add other models here if identified
|
||||
];
|
||||
|
||||
/**
|
||||
* List of Bedrock models observed to not support the `temperature` inference parameter.
|
||||
* @type {string[]}
|
||||
*/
|
||||
noTemperatureModels = [
|
||||
"anthropic.claude-opus-4-7",
|
||||
// Add other models here if identified
|
||||
];
|
||||
|
||||
/**
|
||||
* Initializes the AWS Bedrock LLM connector.
|
||||
* @param {object | null} [embedder=null] - An optional embedder instance. Defaults to NativeEmbedder.
|
||||
@@ -103,6 +112,21 @@ class AWSBedrockLLM {
|
||||
return createBedrockCredentials(this.authMethod);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the temperature configuration for the AWS Bedrock LLM.
|
||||
* @param {number} temperature - The temperature to use.
|
||||
* @returns {{temperature: number}} The temperature configuration object with the temperature value as a float.
|
||||
*/
|
||||
temperatureConfig(temperature = this.defaultTemp) {
|
||||
if (typeof temperature !== "number") return {};
|
||||
|
||||
// So model names prefix `us.` and may not be exact matches - so we check with includes to see if the model
|
||||
// substring matches any of the models in the noTemperatureModels array.
|
||||
if (this.noTemperatureModels.some((model) => this.model.includes(model)))
|
||||
return {};
|
||||
return { temperature: parseFloat(temperature) };
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the configured AWS authentication method ('iam' or 'sessionToken').
|
||||
* Defaults to 'iam' if the environment variable is invalid.
|
||||
@@ -408,7 +432,7 @@ class AWSBedrockLLM {
|
||||
messages: history,
|
||||
inferenceConfig: {
|
||||
maxTokens: maxTokensToSend,
|
||||
temperature: temperature ?? this.defaultTemp,
|
||||
...this.temperatureConfig(temperature),
|
||||
},
|
||||
system: systemBlock,
|
||||
})
|
||||
@@ -483,7 +507,7 @@ class AWSBedrockLLM {
|
||||
messages: history,
|
||||
inferenceConfig: {
|
||||
maxTokens: maxTokensToSend,
|
||||
temperature: temperature ?? this.defaultTemp,
|
||||
...this.temperatureConfig(temperature),
|
||||
},
|
||||
system: systemBlock,
|
||||
})
|
||||
|
||||
@@ -208,6 +208,22 @@ class GenericOpenAiLLM {
|
||||
return textResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Includes the usage in the response if the ENV flag is set
|
||||
* using the stream_options: { include_usage: true } option. This is available via ENV
|
||||
* because some providers will crash with invalid options.
|
||||
* @returns {Object}
|
||||
*/
|
||||
#includeStreamOptionsUsage() {
|
||||
if (!("GENERIC_OPEN_AI_REPORT_USAGE" in process.env)) return {};
|
||||
if (process.env.GENERIC_OPEN_AI_REPORT_USAGE !== "true") return {};
|
||||
return {
|
||||
stream_options: {
|
||||
include_usage: true,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async getChatCompletion(messages = null, { temperature = 0.7 }) {
|
||||
const result = await LLMPerformanceMonitor.measureAsyncFunction(
|
||||
this.openai.chat.completions
|
||||
@@ -256,6 +272,7 @@ class GenericOpenAiLLM {
|
||||
messages,
|
||||
temperature,
|
||||
max_tokens: this.maxTokens,
|
||||
...this.#includeStreamOptionsUsage(),
|
||||
}),
|
||||
messages,
|
||||
runPromptTokenCalculation: true,
|
||||
@@ -404,6 +421,50 @@ class GenericOpenAiLLM {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether this provider supports native OpenAI-compatible tool calling.
|
||||
* - This can be any OpenAI compatible provider that supports tool calling
|
||||
* - We check the ENV to see if the provider supports tool calling.
|
||||
* - If the ENV is not set, we default to false.
|
||||
* @returns {boolean}
|
||||
*/
|
||||
#supportsCapabilityFromENV(capability = "") {
|
||||
const CapabilityEnvMap = {
|
||||
tools: "PROVIDER_SUPPORTS_NATIVE_TOOL_CALLING",
|
||||
reasoning: "PROVIDER_SUPPORTS_REASONING",
|
||||
imageGeneration: "PROVIDER_SUPPORTS_IMAGE_GENERATION",
|
||||
vision: "PROVIDER_SUPPORTS_VISION",
|
||||
};
|
||||
|
||||
const envKey = CapabilityEnvMap[capability];
|
||||
if (!envKey) return false;
|
||||
if (!(envKey in process.env)) return false;
|
||||
return process.env[envKey]?.includes("generic-openai") || false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the capabilities of the model.
|
||||
* @returns {{tools: 'unknown' | boolean, reasoning: 'unknown' | boolean, imageGeneration: 'unknown' | boolean, vision: 'unknown' | boolean}}
|
||||
*/
|
||||
getModelCapabilities() {
|
||||
try {
|
||||
return {
|
||||
tools: this.#supportsCapabilityFromENV("tools"),
|
||||
reasoning: this.#supportsCapabilityFromENV("reasoning"),
|
||||
imageGeneration: this.#supportsCapabilityFromENV("imageGeneration"),
|
||||
vision: this.#supportsCapabilityFromENV("vision"),
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("Error getting model capabilities:", error);
|
||||
return {
|
||||
tools: "unknown",
|
||||
reasoning: "unknown",
|
||||
imageGeneration: "unknown",
|
||||
vision: "unknown",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Simple wrapper for dynamic embedder & normalize interface for all LLM implementations
|
||||
async embedTextInput(textInput) {
|
||||
return await this.embedder.embedTextInput(textInput);
|
||||
|
||||
@@ -22,7 +22,7 @@ class LemonadeLLM {
|
||||
process.env.LEMONADE_LLM_BASE_PATH,
|
||||
"openai"
|
||||
),
|
||||
apiKey: process.env.LEMONADE_LLM_API_KEY ?? null,
|
||||
apiKey: process.env.LEMONADE_LLM_API_KEY || null,
|
||||
});
|
||||
|
||||
this.model = modelPreference || process.env.LEMONADE_LLM_MODEL_PREF;
|
||||
@@ -202,7 +202,7 @@ class LemonadeLLM {
|
||||
process.env.LEMONADE_LLM_BASE_PATH,
|
||||
"openai"
|
||||
),
|
||||
apiKey: process.env.LEMONADE_LLM_API_KEY ?? null,
|
||||
apiKey: process.env.LEMONADE_LLM_API_KEY || null,
|
||||
});
|
||||
|
||||
const { labels = [] } = await client.models.retrieve(this.model);
|
||||
@@ -223,6 +223,41 @@ class LemonadeLLM {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the currently loaded models from the Lemonade server.
|
||||
* @returns {Promise<string[]>}
|
||||
*/
|
||||
static async getCurrentlyLoadedModels() {
|
||||
const endpoint = new URL(
|
||||
parseLemonadeServerEndpoint(process.env.LEMONADE_LLM_BASE_PATH, "openai")
|
||||
);
|
||||
endpoint.pathname += "/health";
|
||||
const loadedModels = await fetch(endpoint.toString(), {
|
||||
method: "GET",
|
||||
headers: {
|
||||
...(process.env.LEMONADE_LLM_API_KEY
|
||||
? { Authorization: `Bearer ${process.env.LEMONADE_LLM_API_KEY}` }
|
||||
: {}),
|
||||
},
|
||||
})
|
||||
.then((response) => {
|
||||
if (!response.ok)
|
||||
throw new Error(
|
||||
`Failed to get currently loaded models: ${response.statusText}`
|
||||
);
|
||||
return response.json();
|
||||
})
|
||||
.then(({ all_models_loaded = [] } = {}) => {
|
||||
return all_models_loaded.map((model) => {
|
||||
return {
|
||||
model_name: model.model_name,
|
||||
ctx_size: model?.recipe_options?.ctx_size ?? 8192,
|
||||
};
|
||||
});
|
||||
});
|
||||
return loadedModels;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility function to load a model from the Lemonade server.
|
||||
* Does not check if the model is already loaded or unloads any models.
|
||||
@@ -230,12 +265,33 @@ class LemonadeLLM {
|
||||
*/
|
||||
static async loadModel(model, basePath = process.env.LEMONADE_LLM_BASE_PATH) {
|
||||
try {
|
||||
const desiredCtxSize = Number(this.promptWindowLimit());
|
||||
const currentlyLoadedModels =
|
||||
await LemonadeLLM.getCurrentlyLoadedModels();
|
||||
const modelAlreadyLoaded = currentlyLoadedModels.find(
|
||||
(m) => m.model_name === model
|
||||
);
|
||||
|
||||
if (modelAlreadyLoaded) {
|
||||
if (modelAlreadyLoaded.ctx_size === desiredCtxSize) {
|
||||
LemonadeLLM.slog(
|
||||
`Model ${model} already loaded with ctx size ${desiredCtxSize}`
|
||||
);
|
||||
return true;
|
||||
}
|
||||
|
||||
LemonadeLLM.slog(
|
||||
`Model ${model} needs to be reloaded again with ctx size ${desiredCtxSize}`
|
||||
);
|
||||
}
|
||||
|
||||
const endpoint = new URL(parseLemonadeServerEndpoint(basePath, "openai"));
|
||||
endpoint.pathname += "/load";
|
||||
|
||||
LemonadeLLM.slog(
|
||||
`Loading model ${model} with context size ${this.promptWindowLimit()}`
|
||||
`Loading model ${model} with context size ${desiredCtxSize}`
|
||||
);
|
||||
|
||||
await fetch(endpoint.toString(), {
|
||||
method: "POST",
|
||||
headers: {
|
||||
@@ -246,7 +302,7 @@ class LemonadeLLM {
|
||||
},
|
||||
body: JSON.stringify({
|
||||
model_name: String(model),
|
||||
ctx_size: Number(this.promptWindowLimit()),
|
||||
ctx_size: desiredCtxSize,
|
||||
}),
|
||||
})
|
||||
.then((response) => {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user