feat: add integrations tools page with prebuilt icons

- add the integrations page sidebar with collapsible icon-only navigation and Figma-aligned marketplace card
- move custom integration SVGs into the iconify collection and document the Tailwind i-custom workflow
- preserve source SVG collection dimensions when flattening generated icon data so existing main nav icons keep their 20x20 viewBox
- add an icon dimension guard for layout-sensitive generated icons
- update model provider routing, i18n, and focused frontend tests
This commit is contained in:
Jingyi-Dify 2026-05-07 17:45:13 -07:00
parent eed92f1bd1
commit 14be7dc9f1
55 changed files with 1805 additions and 276 deletions

View File

@ -43,3 +43,14 @@ const config = useMemo(() => ({
config={config}
/>
```
## Custom SVG icon generation
IsUrgent: False
Category: Performance
### Description
New custom SVG icons should be added to `packages/iconify-collections/assets/...`, generated with `pnpm --filter @dify/iconify-collections generate`, checked with `pnpm --filter @dify/iconify-collections check:dimensions`, and consumed through Tailwind `i-custom-*` classes. Do not add new generated React icon components or JSON files under `web/app/components/base/icons/src/...` for new custom SVG icons.
When reviewing generated `packages/iconify-collections/custom-*/icons.json` diffs, verify unrelated existing icons did not lose or change intrinsic `width` / `height`, especially layout-sensitive groups such as `main-nav-*`.

View File

@ -0,0 +1,43 @@
# @dify/iconify-collections
Pre-generated Iconify collections for Dify custom SVG icons. The web app imports these collections from this package so Tailwind does not need to scan and build custom SVG icon data from the old `web/app/components/base/icons/src` tree during dev startup.
## Adding Custom SVG Icons
Add new SVG source files under one of these directories:
- `assets/public/...` for multi-color or public brand-like icons.
- `assets/vender/...` for UI vendor icons that should render with `currentColor`.
After adding or changing SVG files, regenerate the packaged collections:
```bash
pnpm --filter @dify/iconify-collections generate
```
Then run the dimension guard:
```bash
pnpm --filter @dify/iconify-collections check:dimensions
```
This protects existing icon groups with layout-sensitive intrinsic sizes, such as the `main-nav-*` icons that must remain `20x20` after collection flattening.
Commit both the SVG source files and the generated package files under `custom-public/` or `custom-vender/`.
Restart the web dev server after regenerating icons. Tailwind loads this plugin collection at startup, so an already-running dev server may not render newly-added `i-custom-*` classes until it restarts.
Use the generated icons through Tailwind icon classes in frontend code. For example:
```text
assets/vender/integrations/mcp.svg
```
becomes:
```tsx
<span aria-hidden className="i-custom-vender-integrations-mcp size-4" />
```
Do not add new generated React icon components or JSON files under `web/app/components/base/icons/src/...` for new custom SVG icons. That path is legacy; new custom icons should flow through this package and be consumed as `i-custom-*` classes.
When reviewing generated `icons.json` diffs, check that unrelated existing icon groups did not lose or change their intrinsic `width` and `height`. If a group is layout-sensitive, add it to `scripts/check-icon-dimensions.ts`.

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 15.3333 14.6667" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M13.1423 4.75207L12.9779 5.12919C12.8576 5.40528 12.4757 5.40528 12.3554 5.12919L12.1911 4.75207C11.8981 4.07965 11.3703 3.54427 10.7118 3.25139L10.2053 3.02615C9.93153 2.90435 9.93153 2.50587 10.2053 2.38408L10.6835 2.17143C11.3589 1.87101 11.8961 1.31582 12.1841 0.620552L12.3529 0.213023C12.4705 -0.0710075 12.8628 -0.0710075 12.9804 0.213023L13.1492 0.620552C13.4372 1.31582 13.9744 1.87101 14.6499 2.17143L15.1279 2.38408C15.4018 2.50587 15.4018 2.90435 15.1279 3.02615L14.6215 3.25139C13.963 3.54427 13.4353 4.07965 13.1423 4.75207ZM5.33333 1.33333C8.045 1.33333 10.284 3.35708 10.6225 5.97663L12.1228 8.3358C12.2216 8.49113 12.2017 8.72313 11.9729 8.82113L10.6667 9.38067V11.3333C10.6667 12.0697 10.0697 12.6667 9.33333 12.6667H8.00067L8 14.6667H2L2.00017 12.2041C2.00022 11.4168 1.70901 10.6725 1.17033 10.0007C0.438047 9.08753 0 7.92827 0 6.66667C0 3.72115 2.38781 1.33333 5.33333 1.33333ZM5.33333 2.66667C3.12419 2.66667 1.33333 4.45753 1.33333 6.66667C1.33333 7.58993 1.64545 8.46193 2.21052 9.1666C2.93977 10.076 3.33357 11.1115 3.3335 12.2042L3.33342 13.3333H6.66713L6.6678 11.3333H9.33333V8.50127L10.3665 8.05873L9.33813 6.44175L9.30007 6.14745C9.04433 4.16761 7.34953 2.66667 5.33333 2.66667ZM12.3262 11.3286L13.4357 12.0683C14.2133 10.9041 14.6667 9.50507 14.6667 8.00007C14.6667 7.54467 14.6252 7.09907 14.5457 6.66667L13.2504 7C13.3049 7.3252 13.3333 7.65933 13.3333 8.00007C13.3333 9.2314 12.9624 10.3761 12.3262 11.3286Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 14 12.9447" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M4.92578 9.8151C4.92578 8.82303 4.12163 8.01823 3.12956 8.01823C2.13752 8.01827 1.33333 8.82306 1.33333 9.8151C1.33349 10.807 2.13762 11.6113 3.12956 11.6113C4.12153 11.6113 4.92563 10.807 4.92578 9.8151ZM12.6667 9.8151C12.6667 8.82306 11.8625 8.01827 10.8704 8.01823C9.87837 8.01823 9.07422 8.82303 9.07422 9.8151C9.07438 10.807 9.87847 11.6113 10.8704 11.6113C11.8624 11.6113 12.6665 10.807 12.6667 9.8151ZM8.79622 3.12956C8.79619 2.13752 7.99205 1.33333 7 1.33333C6.00795 1.33333 5.20382 2.13752 5.20378 3.12956C5.20378 4.12163 6.00793 4.92578 7 4.92578C7.99207 4.92578 8.79622 4.12163 8.79622 3.12956ZM10.1296 3.12956C10.1296 4.62918 9.07477 5.88194 7.66667 6.1875V6.72526L8.74284 7.51953C9.3012 7.00174 10.0489 6.6849 10.8704 6.6849C12.5989 6.68493 14 8.08668 14 9.8151C13.9998 11.5434 12.5988 12.9446 10.8704 12.9447C9.14209 12.9447 7.74104 11.5434 7.74089 9.8151C7.74089 9.38937 7.82585 8.98325 7.97982 8.61328L7 7.88932L6.01953 8.61328C6.17356 8.98332 6.25911 9.38929 6.25911 9.8151C6.25896 11.5434 4.85791 12.9447 3.12956 12.9447C1.40124 12.9446 0.000156326 11.5434 0 9.8151C0 8.08668 1.40114 6.68493 3.12956 6.6849C3.95094 6.6849 4.69819 7.00193 5.25651 7.51953L6.33333 6.72526V6.1875C4.92523 5.88194 3.87044 4.62918 3.87044 3.12956C3.87048 1.40114 5.27158 0 7 0C8.72843 0 10.1295 1.40114 10.1296 3.12956Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 12.6667 14.6667" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M6.33333 0L12.6667 3.66667V11L6.33333 14.6667L0 11V3.66667L6.33333 0ZM1.99592 4.0518L6.3334 6.56293L10.6708 4.05183L6.33333 1.54067L1.99592 4.0518ZM1.33333 5.20886V10.2313L5.66673 12.7401V7.71767L1.33333 5.20886ZM7.00007 12.74L11.3333 10.2313V5.20891L7.00007 7.71767V12.74Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 515 B

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 12 13.3333" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M2.66667 2.66667C2.66667 1.19391 3.86057 0 5.33333 0C6.80607 0 8 1.19391 8 2.66667H11.3333C11.7015 2.66667 12 2.96515 12 3.33333V6.1138C12 6.3302 11.8949 6.53313 11.7183 6.65813C11.5415 6.78307 11.3152 6.81447 11.1112 6.74233C10.973 6.69353 10.8237 6.66667 10.6667 6.66667C9.93027 6.66667 9.33333 7.2636 9.33333 8C9.33333 8.7364 9.93027 9.33333 10.6667 9.33333C10.8237 9.33333 10.973 9.30647 11.1112 9.25767C11.3152 9.18553 11.5415 9.21693 11.7183 9.34187C11.8949 9.46687 12 9.6698 12 9.8862V12.6667C12 13.0349 11.7015 13.3333 11.3333 13.3333H0.666667C0.29848 13.3333 0 13.0349 0 12.6667V3.33333C0 2.96515 0.29848 2.66667 0.666667 2.66667H2.66667ZM5.33333 1.33333C4.59695 1.33333 4 1.93029 4 2.66667C4 2.82369 4.02687 2.97301 4.0757 3.11117C4.14781 3.31521 4.11641 3.54157 3.99145 3.71826C3.86649 3.89495 3.66355 4 3.44714 4H1.33333V12H10.6667V10.6667C9.19393 10.6667 8 9.47273 8 8C8 6.52727 9.19393 5.33333 10.6667 5.33333V4H7.21953C7.00313 4 6.8002 3.89495 6.6752 3.71826C6.55027 3.54157 6.51887 3.31521 6.591 3.11117C6.6398 2.97301 6.66667 2.8237 6.66667 2.66667C6.66667 1.93029 6.06973 1.33333 5.33333 1.33333Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,6 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 13.4445 14.6667" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Vector">
<path d="M7.873 1.01976C8.28503 1.01976 8.68078 1.18055 8.97605 1.46791C9.12039 1.60841 9.23516 1.77638 9.31357 1.96193C9.39199 2.14747 9.43248 2.34683 9.43265 2.54827C9.43282 2.7497 9.39267 2.94913 9.31457 3.13481C9.23647 3.32048 9.12199 3.48865 8.97788 3.62939L4.53331 7.98841C4.48512 8.03528 4.44681 8.09133 4.42065 8.15326C4.39449 8.21519 4.38102 8.28173 4.38102 8.34896C4.38102 8.41619 4.39449 8.48273 4.42065 8.54466C4.44681 8.60659 4.48512 8.66264 4.53331 8.70951C4.63178 8.80538 4.76378 8.85902 4.9012 8.85902C5.03862 8.85902 5.17062 8.80538 5.26908 8.70951L5.32897 8.65024L5.33019 8.64901L9.71304 4.3505C10.0085 4.06393 10.404 3.90381 10.8155 3.90415C11.2271 3.90449 11.6224 4.06527 11.9173 4.35233L11.9479 4.38228C12.0924 4.52293 12.2072 4.69111 12.2856 4.87689C12.3641 5.06267 12.4045 5.26228 12.4045 5.46393C12.4045 5.66559 12.3641 5.8652 12.2856 6.05098C12.2072 6.23676 12.0924 6.40494 11.9479 6.54559L6.62757 11.7632C6.51503 11.8726 6.42557 12.0034 6.36448 12.1479C6.30339 12.2925 6.27191 12.4478 6.27191 12.6047C6.27191 12.7616 6.30339 12.9169 6.36448 13.0615C6.42557 13.206 6.51503 13.3368 6.62757 13.4462L7.72023 14.5175C7.81867 14.6131 7.95053 14.6667 8.08781 14.6667C8.22508 14.6667 8.35695 14.6131 8.45539 14.5175C8.50358 14.4706 8.54189 14.4145 8.56805 14.3526C8.59421 14.2907 8.60769 14.2241 8.60769 14.1569C8.60769 14.0897 8.59421 14.0231 8.56805 13.9612C8.54189 13.8993 8.50358 13.8432 8.45539 13.7964L7.36273 12.7245C7.34667 12.7089 7.33391 12.6902 7.32519 12.6696C7.31647 12.649 7.31198 12.6268 7.31198 12.6044C7.31198 12.582 7.31647 12.5598 7.32519 12.5392C7.33391 12.5186 7.34667 12.4999 7.36273 12.4843L12.683 7.2673C12.924 7.03296 13.1155 6.75268 13.2463 6.44304C13.3771 6.1334 13.4445 5.80068 13.4445 5.46454C13.4445 5.12841 13.3771 4.79569 13.2463 4.48605C13.1155 4.17641 12.924 3.89613 12.683 3.66178L12.6525 3.63123C12.3646 3.35023 12.016 3.13908 11.6336 3.01405C11.2512 2.88903 10.8453 2.85347 10.447 2.91012C10.5038 2.51705 10.4668 2.1161 10.3389 1.74009C10.211 1.36408 9.99593 1.0237 9.71121 0.746808C9.21914 0.267942 8.55962 0 7.873 0C7.18639 0 6.52687 0.267942 6.0348 0.746808L0.152297 6.51564C0.104103 6.56251 0.0657945 6.61857 0.039636 6.6805C0.0134776 6.74243 0 6.80897 0 6.8762C0 6.94342 0.0134776 7.00997 0.039636 7.0719C0.0657945 7.13382 0.104103 7.18988 0.152297 7.23675C0.250735 7.33243 0.382601 7.38595 0.519877 7.38595C0.657153 7.38595 0.789019 7.33243 0.887457 7.23675L6.76996 1.46791C7.06523 1.18055 7.46098 1.01976 7.873 1.01976Z" fill="var(--fill-0, #495464)"/>
<path d="M8.35362 2.74526C8.32747 2.80719 8.28916 2.86324 8.24096 2.91011L3.88989 7.17685C3.74539 7.3175 3.63053 7.48568 3.5521 7.67146C3.47367 7.85724 3.43327 8.05685 3.43327 8.25851C3.43327 8.46016 3.47367 8.65977 3.5521 8.84555C3.63053 9.03133 3.74539 9.19951 3.88989 9.34017C4.18516 9.62753 4.58092 9.78832 4.99294 9.78832C5.40496 9.78832 5.80072 9.62753 6.09598 9.34017L10.4464 5.07343C10.5449 4.97756 10.6769 4.92392 10.8143 4.92392C10.9518 4.92392 11.0837 4.97756 11.1822 5.07343C11.2304 5.1203 11.2687 5.17635 11.2949 5.23828C11.321 5.30021 11.3345 5.36675 11.3345 5.43398C11.3345 5.5012 11.321 5.56775 11.2949 5.62968C11.2687 5.69161 11.2304 5.74766 11.1822 5.79453L6.83114 10.0613C6.339 10.54 5.67951 10.8078 4.99294 10.8078C4.30636 10.8078 3.64688 10.54 3.15473 10.0613C2.91376 9.82692 2.72222 9.54664 2.59143 9.237C2.46064 8.92736 2.39325 8.59464 2.39325 8.25851C2.39325 7.92238 2.46064 7.58966 2.59143 7.28001C2.72222 6.97037 2.91376 6.69009 3.15473 6.45575L7.50519 2.18901C7.60366 2.09315 7.73566 2.03951 7.87308 2.03951C8.0105 2.03951 8.1425 2.09315 8.24096 2.18901C8.28916 2.23588 8.32747 2.29193 8.35362 2.35386C8.37978 2.41579 8.39326 2.48233 8.39326 2.54956C8.39326 2.61679 8.37978 2.68333 8.35362 2.74526Z" fill="var(--fill-0, #495464)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 14.5 14.5" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M5.08333 0.75V13.75M2.19444 0.75H12.3056C13.1033 0.75 13.75 1.3967 13.75 2.19444V12.3056C13.75 13.1033 13.1033 13.75 12.3056 13.75H2.19444C1.3967 13.75 0.75 13.1033 0.75 12.3056V2.19444C0.75 1.3967 1.3967 0.75 2.19444 0.75Z" stroke="var(--stroke-0, black)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 527 B

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 12.3333 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M11.6667 0C12.0349 0 12.3333 0.29848 12.3333 0.666667V4C12.3333 4.36819 12.0349 4.66667 11.6667 4.66667H8.33333V13.3333C8.33333 13.7015 8.03487 14 7.66667 14H5C4.63181 14 4.33333 13.7015 4.33333 13.3333V4.66667H0.666667C0.29848 4.66667 0 4.36819 0 4V2.41202C0 2.15951 0.142667 1.92867 0.368527 1.81574L4 0H11.6667ZM8.33333 1.33333H4.31476L1.33333 2.82405V3.33333H5.66667V12.6667H7V3.33333H8.33333V1.33333ZM11 1.33333H9.66667V3.33333H11V1.33333Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 681 B

View File

@ -0,0 +1,10 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 13.325 13.325" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Vector">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.81641 5.01888L5.91797 5.04883L12.8913 7.70573L12.9837 7.7487C13.3889 7.97463 13.4445 8.54581 13.0905 8.8457L13.0085 8.9056L10.4837 10.4837L8.9056 13.0085C8.62921 13.4507 7.99075 13.4178 7.7487 12.9837L7.70573 12.8913L5.04883 5.91797C4.85479 5.40863 5.31088 4.90871 5.81641 5.01888ZM8.47852 11.1751L9.43359 9.64779L9.47786 9.58529C9.52536 9.52564 9.5828 9.47422 9.64779 9.43359L11.1751 8.47852L6.81901 6.81901L8.47852 11.1751Z" fill="var(--fill-0, #495464)"/>
<path d="M3.87891 9.06445L2.22917 10.7142L1.28646 9.77148L2.9362 8.12175L3.87891 9.06445Z" fill="var(--fill-0, #495464)"/>
<path d="M2.33333 6.66667H0V5.33333H2.33333V6.66667Z" fill="var(--fill-0, #495464)"/>
<path d="M3.87891 2.93555L2.9362 3.87826L1.28646 2.22852L2.22917 1.28581L3.87891 2.93555Z" fill="var(--fill-0, #495464)"/>
<path d="M10.7142 2.22852L9.06445 3.87826L8.12175 2.93555L9.77148 1.28581L10.7142 2.22852Z" fill="var(--fill-0, #495464)"/>
<path d="M6.66667 2.33333H5.33333V0H6.66667V2.33333Z" fill="var(--fill-0, #495464)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,3 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 12.6667 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M2 12C0.895401 12 7.95946e-07 11.1046 6.99382e-07 10C6.02818e-07 8.89543 0.8954 8 2 8H4C4.8706 8 5.61127 8.55625 5.886 9.33273L6.66667 9.33333C7.4 9.33333 8 8.73333 8 8L7.9994 7.88599C7.22293 7.61125 6.66667 6.8706 6.66667 6C6.66667 5.1294 7.22293 4.38873 7.9994 4.114L8 4C8 3.26667 7.4 2.66667 6.66667 2.66667L5.8862 2.6666C5.61167 3.4434 4.87087 4 4 4L2 4C0.8954 4 9.65672e-08 3.1046 0 2C-9.65672e-08 0.8954 0.8954 2.71413e-07 2 1.74846e-07L4 0C4.8706 -7.61103e-08 5.61127 0.556266 5.886 1.33273L6.66667 1.33333C8.14 1.33333 9.33333 2.52667 9.33333 4L10.6667 4C11.7712 4 12.6667 4.8954 12.6667 6C12.6667 7.1046 11.7712 8 10.6667 8H9.33333C9.33333 9.47276 8.13943 10.6667 6.66667 10.6667L5.8862 10.6666C5.61167 11.4434 4.87087 12 4 12H2ZM2 2.66667L4 2.66667C4.3682 2.66667 4.66667 2.3682 4.66667 2C4.66667 1.6318 4.3682 1.33333 4 1.33333L2 1.33333C1.6318 1.33333 1.33333 1.6318 1.33333 2C1.33333 2.3682 1.6318 2.66667 2 2.66667ZM8.66667 6.66667H10.6667C11.0349 6.66667 11.3333 6.3682 11.3333 6C11.3333 5.6318 11.0349 5.33333 10.6667 5.33333L8.66667 5.33333C8.29848 5.33333 8 5.6318 8 6C8 6.3682 8.29848 6.66667 8.66667 6.66667ZM2 10.6667H4C4.3682 10.6667 4.66667 10.3682 4.66667 10C4.66667 9.63181 4.3682 9.33333 4 9.33333H2C1.6318 9.33333 1.33333 9.63181 1.33333 10C1.33333 10.3682 1.6318 10.6667 2 10.6667Z" fill="var(--fill-0, #495464)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +1,7 @@
{
"prefix": "custom-vender",
"name": "Dify Custom Vender",
"total": 291,
"total": 300,
"version": "0.0.0-private",
"author": {
"name": "LangGenius, Inc.",

View File

@ -23,6 +23,7 @@
"./custom-vender/chars.json": "./custom-vender/chars.json"
},
"scripts": {
"check:dimensions": "tsx ./scripts/check-icon-dimensions.ts",
"generate": "tsx ./scripts/generate-collections.ts"
},
"devDependencies": {

View File

@ -0,0 +1,94 @@
import { readFile } from 'node:fs/promises'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
type IconData = {
width?: number
height?: number
}
type IconCollection = {
icons: Record<string, IconData>
width?: number
height?: number
}
type DimensionRule = {
collection: 'custom-vender'
icons: string[]
width: number
height: number
}
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const packageDir = path.resolve(__dirname, '..')
const dimensionRules: DimensionRule[] = [
{
collection: 'custom-vender',
icons: [
'main-nav-home',
'main-nav-home-active',
'main-nav-integrations',
'main-nav-integrations-active',
'main-nav-knowledge',
'main-nav-knowledge-active',
'main-nav-marketplace',
'main-nav-marketplace-active',
'main-nav-studio',
'main-nav-studio-active',
],
width: 20,
height: 20,
},
]
const readCollection = async (collection: DimensionRule['collection']): Promise<IconCollection> => {
return JSON.parse(
await readFile(path.resolve(packageDir, collection, 'icons.json'), 'utf8'),
) as IconCollection
}
const main = async () => {
const collections = new Map<string, IconCollection>()
const failures: string[] = []
for (const rule of dimensionRules) {
if (!collections.has(rule.collection))
collections.set(rule.collection, await readCollection(rule.collection))
const collection = collections.get(rule.collection)!
for (const iconName of rule.icons) {
const icon = collection.icons[iconName]
const width = icon?.width ?? collection.width ?? 16
const height = icon?.height ?? collection.height ?? 16
if (!icon) {
failures.push(`${rule.collection}:${iconName} is missing`)
continue
}
if (width !== rule.width || height !== rule.height) {
failures.push(
`${rule.collection}:${iconName} expected ${rule.width}x${rule.height}, got ${width}x${height}`,
)
}
}
}
if (failures.length) {
console.error('Icon dimension check failed:')
for (const failure of failures)
console.error(`- ${failure}`)
process.exitCode = 1
return
}
console.log('Icon dimension check passed.')
}
main().catch((error: unknown) => {
console.error(error)
process.exitCode = 1
})

View File

@ -21,6 +21,8 @@ type AliasData = Omit<IconData, 'body'> & {
type ImportedCollection = {
icons?: Record<string, IconData>
aliases?: Record<string, AliasData>
width?: number
height?: number
lastModified?: number
}
@ -60,11 +62,17 @@ const flattenCollections = (collections: ImportedCollections, prefix: string) =>
const segment = collectionKey.slice(prefix.length + 1)
const namePrefix = segment ? `${segment}-` : ''
const applyCollectionSize = <T extends IconData | AliasData>(iconData: T): T => ({
...iconData,
...(iconData.width === undefined && collection.width !== undefined ? { width: collection.width } : {}),
...(iconData.height === undefined && collection.height !== undefined ? { height: collection.height } : {}),
})
for (const [iconName, iconData] of Object.entries(collection.icons ?? {}))
icons[`${namePrefix}${iconName}`] = iconData
icons[`${namePrefix}${iconName}`] = applyCollectionSize(iconData)
for (const [aliasName, aliasData] of Object.entries(collection.aliases ?? {}))
aliases[`${namePrefix}${aliasName}`] = aliasData
aliases[`${namePrefix}${aliasName}`] = applyCollectionSize(aliasData)
if (typeof collection.lastModified === 'number')
lastModified = Math.max(lastModified, collection.lastModified)

View File

@ -13,6 +13,14 @@
- `frontend-query-mutation` is the source of truth for Dify frontend contracts, query and mutation call-site patterns, conditional queries, invalidation, and mutation error handling.
## SVG Icons (Mandatory)
- New custom SVG icons must be added under `../packages/iconify-collections/assets/...`.
- Run `pnpm --filter @dify/iconify-collections generate` and consume generated icons with Tailwind `i-custom-*` classes.
- Restart the web dev server after regenerating icons because Tailwind loads the custom icon collection at startup.
- Do not add new generated React icon components or JSON files under `app/components/base/icons/src/...`.
- See `../packages/iconify-collections/README.md` for the full workflow.
## Design Token Mapping
- When translating Figma designs to code, read `../packages/dify-ui/AGENTS.md` for the Figma `--radius/*` token to Tailwind `rounded-*` class mapping. The two scales are offset by one step.

View File

@ -2,13 +2,13 @@
import type { FC } from 'react'
import * as React from 'react'
import { useTranslation } from 'react-i18next'
import ToolProviderList from '@/app/components/tools/provider-list'
import IntegrationsPage from '@/app/components/tools/integrations-page'
import useDocumentTitle from '@/hooks/use-document-title'
const ToolsList: FC = () => {
const { t } = useTranslation()
useDocumentTitle(t('menus.tools', { ns: 'common' }))
return <ToolProviderList />
return <IntegrationsPage />
}
export default React.memo(ToolsList)

View File

@ -45,14 +45,14 @@ describe('AccountSetting Constants', () => {
expect(isValidAccountSettingTab('invalid')).toBe(false)
})
it('should keep migrated setting destinations disabled until integrations sections are ready', () => {
expect(enableMovedAccountSettingDestinations).toBe(false)
it('should map migrated setting tabs to integrations sections', () => {
expect(enableMovedAccountSettingDestinations).toBe(true)
expect(movedAccountSettingDestinations[ACCOUNT_SETTING_TAB.PROVIDER]).toBe('/tools?section=provider')
expect(movedAccountSettingDestinations[ACCOUNT_SETTING_TAB.DATA_SOURCE]).toBe('/tools?section=data-source')
expect(movedAccountSettingDestinations[ACCOUNT_SETTING_TAB.API_BASED_EXTENSION]).toBe('/tools?section=api-based-extension')
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.PROVIDER)).toBeUndefined()
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.DATA_SOURCE)).toBeUndefined()
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.API_BASED_EXTENSION)).toBeUndefined()
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.PROVIDER)).toBe('/tools?section=provider')
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.DATA_SOURCE)).toBe('/tools?section=data-source')
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.API_BASED_EXTENSION)).toBe('/tools?section=api-based-extension')
expect(getMovedAccountSettingDestination(ACCOUNT_SETTING_TAB.BILLING)).toBeUndefined()
})
})

View File

@ -174,7 +174,8 @@ describe('AccountSetting', () => {
// Assert
// Assert
expect(screen.getByText('common.userProfile.settings'))!.toBeInTheDocument()
expect(screen.getByText('common.settings.workspaceSettings'))!.toBeInTheDocument()
expect(screen.queryByText('common.settings.workplaceGroup'))!.not.toBeInTheDocument()
expect(screen.queryByText('common.settings.provider'))!.not.toBeInTheDocument()
expect(screen.getAllByText('common.settings.members').length).toBeGreaterThan(0)
expect(screen.getByText('common.settings.billing'))!.toBeInTheDocument()

View File

@ -7,7 +7,7 @@ export const movedAccountSettingDestinations: Partial<Record<AccountSettingTab,
[ACCOUNT_SETTING_TAB.API_BASED_EXTENSION]: '/tools?section=api-based-extension',
}
export const enableMovedAccountSettingDestinations = false
export const enableMovedAccountSettingDestinations = true
export const getMovedAccountSettingDestination = (tab: AccountSettingTab) => {
if (!enableMovedAccountSettingDestinations)

View File

@ -5,7 +5,6 @@ import { cn } from '@langgenius/dify-ui/cn'
import { ScrollArea } from '@langgenius/dify-ui/scroll-area'
import { useCallback, useState } from 'react'
import { useTranslation } from 'react-i18next'
import SearchInput from '@/app/components/base/search-input'
import BillingPage from '@/app/components/billing/billing-page'
import CustomPage from '@/app/components/custom/custom-page'
import {
@ -148,16 +147,13 @@ export default function AccountSetting({
show
onClose={handleClose}
>
<div className="mx-auto flex h-screen max-w-[1048px]">
<div className="flex w-[44px] flex-col border-r border-divider-burn pr-6 pl-4 sm:w-[224px]">
<div className="mt-6 mb-8 px-3 py-2 title-2xl-semi-bold text-text-primary">{t('userProfile.settings', { ns: 'common' })}</div>
<div className="mx-auto flex h-screen w-fit max-w-full">
<div className="flex w-[44px] flex-col border-r border-divider-burn pr-6 pl-4 sm:w-[260px]">
<div className="mt-6 mb-8 px-3 py-2 title-2xl-semi-bold whitespace-nowrap text-text-primary">{t('settings.workspaceSettings', { ns: 'common' })}</div>
<div className="w-full">
{
menuItems.map(menuItem => (
<div key={menuItem.key} className="mb-2">
{!isCurrentWorkspaceDatasetOperator && (
<div className="mb-0.5 py-2 pb-1 pl-3 system-xs-medium-uppercase text-text-tertiary">{menuItem.name}</div>
)}
<div>
{
menuItem.items.map(item => (
@ -212,18 +208,14 @@ export default function AccountSetting({
<div className="mt-1 system-sm-regular text-text-tertiary">{activeItem?.description}</div>
)}
</div>
{activeMenu === ACCOUNT_SETTING_TAB.PROVIDER && (
<div className="flex grow justify-end">
<SearchInput
className="w-[200px]"
onChange={setSearchValue}
value={searchValue}
/>
</div>
)}
</div>
<div className="px-4 pt-2 sm:px-8">
{activeMenu === ACCOUNT_SETTING_TAB.PROVIDER && <ModelProviderPage searchText={searchValue} />}
{activeMenu === ACCOUNT_SETTING_TAB.PROVIDER && (
<ModelProviderPage
searchText={searchValue}
onSearchTextChange={setSearchValue}
/>
)}
{activeMenu === ACCOUNT_SETTING_TAB.MEMBERS && <MembersPage />}
{activeMenu === ACCOUNT_SETTING_TAB.BILLING && <BillingPage />}
{activeMenu === ACCOUNT_SETTING_TAB.DATA_SOURCE && <DataSourcePage />}

View File

@ -59,6 +59,17 @@ vi.mock('../install-from-marketplace', () => ({
default: () => <div data-testid="install-from-marketplace" />,
}))
vi.mock('@/app/components/plugins/plugin-page/use-reference-setting', () => ({
default: () => ({
referenceSetting: { permission: {}, auto_upgrade: {} },
setReferenceSettings: vi.fn(),
}),
}))
vi.mock('@/app/components/plugins/reference-setting-modal', () => ({
default: () => <div data-testid="reference-setting-modal" />,
}))
vi.mock('@/service/client', async (importOriginal) => {
const actual = await importOriginal<typeof import('@/service/client')>()
const originalPlugins = actual.consoleQuery.plugins as unknown as Record<string, unknown>
@ -91,7 +102,7 @@ vi.mock('@/service/client', async (importOriginal) => {
describe('ModelProviderPage non-cloud branch', () => {
it('should skip the quota panel when cloud edition is disabled', () => {
renderWithSystemFeatures(<ModelProviderPage searchText="" />, {
renderWithSystemFeatures(<ModelProviderPage searchText="" onSearchTextChange={vi.fn()} />, {
systemFeatures: { enable_marketplace: false },
})

View File

@ -21,7 +21,7 @@ const renderModelProviderPage = (
props: { searchText?: string, enableMarketplace?: boolean } = {},
) => {
const { searchText = '', enableMarketplace = true } = props
return renderWithSystemFeatures(<ModelProviderPage searchText={searchText} />, {
return renderWithSystemFeatures(<ModelProviderPage searchText={searchText} onSearchTextChange={vi.fn()} />, {
systemFeatures: { enable_marketplace: enableMarketplace },
})
}
@ -71,6 +71,17 @@ vi.mock('../install-from-marketplace', () => ({
default: () => <div data-testid="install-from-marketplace" />,
}))
vi.mock('@/app/components/plugins/plugin-page/use-reference-setting', () => ({
default: () => ({
referenceSetting: { permission: {}, auto_upgrade: {} },
setReferenceSettings: vi.fn(),
}),
}))
vi.mock('@/app/components/plugins/reference-setting-modal', () => ({
default: () => <div data-testid="reference-setting-modal" />,
}))
vi.mock('../provider-added-card', () => ({
default: ({ provider }: { provider: { provider: string } }) => <div data-testid="provider-card">{provider.provider}</div>,
}))
@ -147,8 +158,9 @@ describe('ModelProviderPage', () => {
it('should render main elements', () => {
renderModelProviderPage()
expect(screen.getByText('common.modelProvider.models')).toBeInTheDocument()
expect(screen.getByPlaceholderText('common.operation.search')).toBeInTheDocument()
expect(screen.getByTestId('system-model-selector')).toBeInTheDocument()
expect(screen.getByText('plugin.autoUpdate.updateSettings')).toBeInTheDocument()
expect(screen.getByTestId('install-from-marketplace')).toBeInTheDocument()
})

View File

@ -5,9 +5,12 @@ import type { PluginDetail } from '@/app/components/plugins/types'
import { cn } from '@langgenius/dify-ui/cn'
import { useQuery, useSuspenseQuery } from '@tanstack/react-query'
import { useDebounce } from 'ahooks'
import { useMemo } from 'react'
import { useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import SearchInput from '@/app/components/base/search-input'
import { usePluginsWithLatestVersion } from '@/app/components/plugins/hooks'
import useReferenceSetting from '@/app/components/plugins/plugin-page/use-reference-setting'
import ReferenceSettingModal from '@/app/components/plugins/reference-setting-modal'
import { IS_CLOUD_EDITION } from '@/config'
import { useProviderContext } from '@/context/provider-context'
import { consoleQuery } from '@/service/client'
@ -22,20 +25,23 @@ import {
import InstallFromMarketplace from './install-from-marketplace'
import ProviderAddedCard from './provider-added-card'
import QuotaPanel from './provider-added-card/quota-panel'
import { providerSupportsCredits } from './supports-credits'
import SystemModelSelector from './system-model-selector'
import { providerToPluginId } from './utils'
type SystemModelConfigStatus = 'no-provider' | 'none-configured' | 'partially-configured' | 'fully-configured'
type Props = {
onSearchTextChange: (value: string) => void
searchText: string
}
const FixedModelProvider = ['langgenius/openai/openai', 'langgenius/anthropic/anthropic']
const ModelProviderPage = ({ searchText }: Props) => {
const ModelProviderPage = ({ onSearchTextChange, searchText }: Props) => {
const debouncedSearchText = useDebounce(searchText, { wait: 500 })
const { t } = useTranslation()
const [showUpdateSettingModal, setShowUpdateSettingModal] = useState(false)
const { data: textGenerationDefaultModel, isLoading: isTextGenerationDefaultModelLoading } = useDefaultModel(ModelTypeEnum.textGeneration)
const { data: embeddingsDefaultModel, isLoading: isEmbeddingsDefaultModelLoading } = useDefaultModel(ModelTypeEnum.textEmbedding)
const { data: rerankDefaultModel, isLoading: isRerankDefaultModelLoading } = useDefaultModel(ModelTypeEnum.rerank)
@ -43,6 +49,10 @@ const ModelProviderPage = ({ searchText }: Props) => {
const { data: ttsDefaultModel, isLoading: isTTSDefaultModelLoading } = useDefaultModel(ModelTypeEnum.tts)
const { modelProviders: providers } = useProviderContext()
const { data: systemFeatures } = useSuspenseQuery(systemFeaturesQueryOptions())
const {
referenceSetting,
setReferenceSettings,
} = useReferenceSetting()
const allPluginIds = useMemo(() => {
return [...new Set(providers.map(p => providerToPluginId(p.provider)).filter(Boolean))]
@ -128,36 +138,70 @@ const ModelProviderPage = ({ searchText }: Props) => {
return [filteredConfiguredProviders, filteredNotConfiguredProviders]
}, [configuredProviders, debouncedSearchText, notConfiguredProviders])
const [creditsBackedProviders, otherConfiguredProviders] = useMemo(() => {
const creditsBackedProviders: ModelProvider[] = []
const otherConfiguredProviders: ModelProvider[] = []
filteredConfiguredProviders.forEach((provider) => {
if (providerSupportsCredits(provider, systemFeatures.trial_models))
creditsBackedProviders.push(provider)
else
otherConfiguredProviders.push(provider)
})
return [creditsBackedProviders, otherConfiguredProviders]
}, [filteredConfiguredProviders, systemFeatures.trial_models])
const hasConfiguredProviders = creditsBackedProviders.length > 0 || otherConfiguredProviders.length > 0
return (
<div className="relative -mt-2 pt-1">
<div className={cn('mb-2 flex items-center')}>
<div className="grow system-md-semibold text-text-primary">{t('modelProvider.models', { ns: 'common' })}</div>
<div className={cn(
'relative flex shrink-0 items-center justify-end gap-2 rounded-lg border border-transparent p-px',
showWarning && 'border-components-panel-border bg-components-panel-bg-blur pl-2 shadow-xs',
)}
>
{showWarning && <div className="absolute top-0 right-0 bottom-0 left-0 opacity-40" style={{ background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)' }} />}
{showWarning && (
<div className="flex items-center gap-1 system-xs-medium text-text-primary">
<span className="i-ri-alert-fill h-4 w-4 text-text-warning-secondary" />
<span className="max-w-[460px] truncate" title={t(warningTextKey, { ns: 'common' })}>{t(warningTextKey, { ns: 'common' })}</span>
</div>
<div className="mb-2 flex h-8 items-center justify-between">
<SearchInput
className="w-[200px]"
value={searchText}
onChange={onSearchTextChange}
/>
<div className="flex min-w-0 items-center justify-end gap-2">
<button
type="button"
disabled={!referenceSetting}
className="flex h-8 w-[208px] shrink-0 items-center justify-center gap-0.5 rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 system-sm-medium text-components-button-secondary-text shadow-xs hover:bg-components-button-secondary-bg-hover disabled:cursor-not-allowed disabled:opacity-60"
onClick={() => setShowUpdateSettingModal(true)}
>
<span aria-hidden className="i-ri-flashlight-line size-4 shrink-0" />
<span className="truncate px-0.5">{t('autoUpdate.updateSettings', { ns: 'plugin' })}</span>
<span className="inline-flex h-[18px] min-w-4 shrink-0 items-center justify-center rounded-[5px] border border-divider-deep bg-components-badge-bg-dimm px-1 system-2xs-medium-uppercase text-text-tertiary">
{t('autoUpdate.strategy.latest.name', { ns: 'plugin' })}
</span>
<span aria-hidden className="i-ri-arrow-down-s-line size-4 shrink-0" />
</button>
<div className={cn(
'relative flex shrink-0 items-center justify-end gap-2 rounded-lg border border-transparent p-px',
showWarning && 'border-components-panel-border bg-components-panel-bg-blur pl-2 shadow-xs',
)}
<SystemModelSelector
notConfigured={showWarning}
textGenerationDefaultModel={textGenerationDefaultModel}
embeddingsDefaultModel={embeddingsDefaultModel}
rerankDefaultModel={rerankDefaultModel}
speech2textDefaultModel={speech2textDefaultModel}
ttsDefaultModel={ttsDefaultModel}
isLoading={isDefaultModelLoading}
/>
>
{showWarning && <div className="absolute top-0 right-0 bottom-0 left-0 opacity-40" style={{ background: 'linear-gradient(92deg, rgba(247, 144, 9, 0.25) 0%, rgba(255, 255, 255, 0.00) 100%)' }} />}
{showWarning && (
<div className="flex items-center gap-1 system-xs-medium text-text-primary">
<span className="i-ri-alert-fill h-4 w-4 text-text-warning-secondary" />
<span className="max-w-[280px] truncate" title={t(warningTextKey, { ns: 'common' })}>{t(warningTextKey, { ns: 'common' })}</span>
</div>
)}
<SystemModelSelector
className="w-[188px]"
notConfigured={showWarning}
textGenerationDefaultModel={textGenerationDefaultModel}
embeddingsDefaultModel={embeddingsDefaultModel}
rerankDefaultModel={rerankDefaultModel}
speech2textDefaultModel={speech2textDefaultModel}
ttsDefaultModel={ttsDefaultModel}
isLoading={isDefaultModelLoading}
/>
</div>
</div>
</div>
{IS_CLOUD_EDITION && <QuotaPanel providers={providers} />}
{!filteredConfiguredProviders?.length && (
{!hasConfiguredProviders && (
<div className="mb-2 rounded-[10px] bg-workflow-process-bg p-4">
<div className="flex h-10 w-10 items-center justify-center rounded-[10px] border-[0.5px] border-components-card-border bg-components-card-bg shadow-lg backdrop-blur-sm">
<span className="i-ri-brain-line h-5 w-5 text-text-primary" />
@ -166,23 +210,46 @@ const ModelProviderPage = ({ searchText }: Props) => {
<div className="mt-1 system-xs-regular text-text-tertiary">{t('modelProvider.emptyProviderTip', { ns: 'common' })}</div>
</div>
)}
{!!filteredConfiguredProviders?.length && (
<div className="relative">
{filteredConfiguredProviders?.map(provider => (
<ProviderAddedCard
key={provider.provider}
provider={provider}
pluginDetail={pluginDetailMap.get(providerToPluginId(provider.provider))}
/>
))}
</div>
{!!creditsBackedProviders.length && (
<section className="pt-2">
<div className="mb-2">
<div className="system-md-semibold text-text-primary">{t('modelProvider.creditsBackedProviders', { ns: 'common' })}</div>
<div className="mt-0.5 system-xs-regular text-text-tertiary">{t('modelProvider.creditsBackedProvidersDesc', { ns: 'common' })}</div>
</div>
<div className="grid grid-cols-3 gap-2">
{creditsBackedProviders.map(provider => (
<ProviderAddedCard
layout="grid"
key={provider.provider}
provider={provider}
pluginDetail={pluginDetailMap.get(providerToPluginId(provider.provider))}
/>
))}
</div>
</section>
)}
{!!otherConfiguredProviders.length && (
<section className="pt-4">
<div className="mb-2 system-md-semibold text-text-primary">{t('modelProvider.configuredProviders', { ns: 'common' })}</div>
<div className="grid grid-cols-3 gap-2">
{otherConfiguredProviders.map(provider => (
<ProviderAddedCard
layout="grid"
key={provider.provider}
provider={provider}
pluginDetail={pluginDetailMap.get(providerToPluginId(provider.provider))}
/>
))}
</div>
</section>
)}
{!!filteredNotConfiguredProviders?.length && (
<>
<div className="mb-2 flex items-center pt-2 system-md-semibold text-text-primary">{t('modelProvider.toBeConfigured', { ns: 'common' })}</div>
<div className="relative">
<section className="pt-4">
<div className="mb-2 flex items-center system-md-semibold text-text-primary">{t('modelProvider.toBeConfigured', { ns: 'common' })}</div>
<div className="grid grid-cols-3 gap-2">
{filteredNotConfiguredProviders?.map(provider => (
<ProviderAddedCard
layout="grid"
notConfigured
key={provider.provider}
provider={provider}
@ -190,7 +257,7 @@ const ModelProviderPage = ({ searchText }: Props) => {
/>
))}
</div>
</>
</section>
)}
{
enableMarketplace && (
@ -200,6 +267,13 @@ const ModelProviderPage = ({ searchText }: Props) => {
/>
)
}
{showUpdateSettingModal && referenceSetting && (
<ReferenceSettingModal
payload={referenceSetting}
onHide={() => setShowUpdateSettingModal(false)}
onSave={setReferenceSettings}
/>
)}
</div>
)
}

View File

@ -36,11 +36,11 @@ const InstallFromMarketplace = ({
if (plugin.type === 'bundle')
return null
return <ProviderCard key={plugin.plugin_id} payload={plugin} />
return <ProviderCard key={plugin.plugin_id} className="h-[146px]" payload={plugin} />
}, [])
return (
<div className="mb-2">
<div id="model-provider-marketplace" className="mb-2 scroll-mt-4">
<Divider className="mt-4! h-px" />
<div className="flex items-center justify-between">
<button
@ -73,7 +73,7 @@ const InstallFromMarketplace = ({
marketplaceCollectionPluginsMap={{}}
plugins={allPlugins}
showInstallButton
cardContainerClassName="grid grid-cols-2 gap-2"
cardContainerClassName="grid grid-cols-3 gap-2"
cardRender={cardRender}
emptyClassName="h-auto"
/>

View File

@ -16,9 +16,11 @@ import {
import { IS_CE_EDITION } from '@/config'
import { useAppContext } from '@/context/app-context'
import { useProviderContextSelector } from '@/context/provider-context'
import { renderI18nObject } from '@/i18n-config'
import { consoleQuery } from '@/service/client'
import { useModelProviderListExpanded, useSetModelProviderListExpanded } from '../atoms'
import { ConfigurationMethodEnum } from '../declarations'
import { useLanguage } from '../hooks'
import ModelBadge from '../model-badge'
import ProviderIcon from '../provider-icon'
import {
@ -30,16 +32,19 @@ import ModelList from './model-list'
import ProviderCardActions from './provider-card-actions'
type ProviderAddedCardProps = {
layout?: 'list' | 'grid'
notConfigured?: boolean
provider: ModelProvider
pluginDetail?: PluginDetail
}
const ProviderAddedCard: FC<ProviderAddedCardProps> = ({
layout = 'list',
notConfigured,
provider,
pluginDetail,
}) => {
const { t } = useTranslation()
const language = useLanguage()
const refreshModelProviders = useProviderContextSelector(state => state.refreshModelProviders)
const currentProviderName = provider.provider
const expanded = useModelProviderListExpanded(currentProviderName)
@ -87,6 +92,119 @@ const ProviderAddedCard: FC<ProviderAddedCardProps> = ({
refetchModelList().catch(() => {})
}, [expanded, loading, refetchModelList, setExpanded])
const providerLabel = renderI18nObject(provider.label, language)
const description = renderI18nObject(
provider.description || pluginDetail?.declaration.description || provider.help?.title || provider.label,
language,
)
const organization = pluginDetail?.declaration.author || currentProviderName.split('/')[0]
if (layout === 'grid') {
return (
<div
data-testid="provider-added-card"
className={cn(
'group relative mb-0 min-h-[120px] overflow-hidden rounded-xl border-[0.5px] border-divider-regular bg-components-panel-on-panel-item-bg shadow-xs',
currentProviderName === 'langgenius/openai/openai' && 'bg-third-party-model-bg-openai',
currentProviderName === 'langgenius/anthropic/anthropic' && 'bg-third-party-model-bg-anthropic',
)}
>
<div className="p-4 pb-3">
<div className="flex min-w-0 items-start gap-3">
<div className="flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-background-default-subtle">
<img
alt=""
src={renderI18nObject(provider.icon_small, language)}
className="size-10 rounded-lg object-contain"
/>
</div>
<div className="min-w-0 flex-1">
<div className="flex h-5 min-w-0 items-center gap-1">
<div className="truncate system-md-semibold text-text-secondary" title={providerLabel}>
{providerLabel}
</div>
{pluginDetail && (
<ProviderCardActions
detail={pluginDetail}
onUpdate={refreshModelProviders}
/>
)}
</div>
<div className="mt-0.5 flex h-4 min-w-0 items-center gap-2 system-xs-regular text-text-tertiary">
<span className="truncate" title={organization}>{organization}</span>
</div>
</div>
</div>
<div className="mt-3 line-clamp-2 h-8 system-xs-regular text-text-tertiary">
{description}
</div>
<div className="mt-3 flex min-w-0 gap-0.5 overflow-hidden">
{provider.supported_model_types.slice(0, 4).map(modelType => (
<ModelBadge key={modelType}>
{modelTypeFormat(modelType)}
</ModelBadge>
))}
</div>
</div>
<div className="absolute right-0 bottom-0 left-0 hidden min-h-20 flex-wrap items-end gap-2 rounded-xl bg-linear-to-t from-components-panel-on-panel-item-bg via-components-panel-on-panel-item-bg to-background-gradient-mask-transparent p-4 group-focus-within:flex group-hover:flex">
{(showModelProvider || !notConfigured) && (
<button
type="button"
data-testid="show-models-button"
className="flex h-8 min-w-0 flex-1 items-center justify-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg px-3 system-sm-medium text-components-button-secondary-text shadow-xs hover:bg-components-button-secondary-bg-hover"
aria-label={t('modelProvider.showModels', { ns: 'common' })}
onClick={handleOpenModelList}
>
<span className="truncate">
{
hasModelList
? t('modelProvider.modelsNum', { ns: 'common', num: modelList.length })
: t('modelProvider.showModels', { ns: 'common' })
}
</span>
{!loading && <span className="ml-1 i-ri-arrow-right-s-line size-4 shrink-0" />}
{loading && <span className="ml-1 i-ri-loader-2-line size-3 animate-spin" />}
</button>
)}
{!showModelProvider && notConfigured && (
<div className="flex h-8 min-w-0 flex-1 items-center justify-center rounded-lg bg-background-default-subtle px-2">
<span className="mr-1 i-ri-information-2-fill size-4 shrink-0 text-text-accent" />
<span className="truncate system-xs-medium text-text-secondary">{t('modelProvider.configureTip', { ns: 'common' })}</span>
</div>
)}
{showCredential && (
<CredentialPanel
provider={provider}
/>
)}
{showCustomModelActions && (
<div className="flex shrink-0">
<ManageCustomModelCredentials
provider={provider}
currentCustomConfigurationModelFixedFields={undefined}
/>
<AddCustomModel
provider={provider}
configurationMethod={ConfigurationMethodEnum.customizableModel}
currentCustomConfigurationModelFixedFields={undefined}
/>
</div>
)}
</div>
{!showCollapsedSection && (
<div className="px-2 pb-2">
<ModelList
provider={provider}
models={modelList}
onCollapse={() => setExpanded(false)}
onChange={refreshModelList}
/>
</div>
)}
</div>
)
}
return (
<div
data-testid="provider-added-card"

View File

@ -100,7 +100,7 @@ const QuotaPanel: FC<QuotaPanelProps> = ({
<div className={cn('pointer-events-none absolute inset-0', styles.gridBg)} />
<div className="relative">
<div className="mb-2 flex h-4 items-center system-xs-medium-uppercase text-text-tertiary">
{t('modelProvider.quota', { ns: 'common' })}
{t('modelProvider.quotaLabel', { ns: 'common' })}
<Infotip aria-label={tipText} className="ml-0.5">
{tipText}
</Infotip>
@ -110,6 +110,7 @@ const QuotaPanel: FC<QuotaPanelProps> = ({
{credits > 0
? <span className="mr-0.5 system-xl-semibold text-text-secondary">{formatNumber(credits)}</span>
: <span className="mr-0.5 system-xl-semibold text-text-destructive">{t('modelProvider.card.quotaExhausted', { ns: 'common' })}</span>}
<span>{t('modelProvider.credits', { ns: 'common' })}</span>
{nextCreditResetDate
? (
<>

View File

@ -4,6 +4,7 @@ import type {
DefaultModelResponse,
} from '../declarations'
import { Button } from '@langgenius/dify-ui/button'
import { cn } from '@langgenius/dify-ui/cn'
import {
Dialog,
DialogCloseButton,
@ -27,6 +28,7 @@ import {
import ModelSelector from '../model-selector'
type SystemModelSelectorProps = {
className?: string
textGenerationDefaultModel: DefaultModelResponse | undefined
embeddingsDefaultModel: DefaultModelResponse | undefined
rerankDefaultModel: DefaultModelResponse | undefined
@ -51,6 +53,7 @@ type SystemModelTipKey
| 'modelProvider.ttsModel.tip'
const SystemModel: FC<SystemModelSelectorProps> = ({
className,
textGenerationDefaultModel,
embeddingsDefaultModel,
rerankDefaultModel,
@ -148,7 +151,7 @@ const SystemModel: FC<SystemModelSelectorProps> = ({
return (
<>
<Button
className="relative"
className={cn('relative', className)}
variant={notConfigured ? 'primary' : 'secondary'}
size="small"
disabled={isLoading}

View File

@ -0,0 +1,90 @@
import { fireEvent, screen } from '@testing-library/react'
import { renderWithNuqs } from '@/test/nuqs-testing'
import IntegrationsPage from '../integrations-page'
vi.mock('@/app/components/header/account-setting/model-provider-page', () => ({
__esModule: true,
default: ({
onSearchTextChange,
searchText,
}: {
onSearchTextChange: (value: string) => void
searchText: string
}) => (
<div data-testid="model-provider-page">
<input
aria-label="search"
value={searchText}
onChange={event => onSearchTextChange(event.target.value)}
/>
</div>
),
}))
vi.mock('@/app/components/header/account-setting/data-source-page-new', () => ({
__esModule: true,
default: () => <div data-testid="data-source-page" />,
}))
vi.mock('@/app/components/header/account-setting/api-based-extension-page', () => ({
__esModule: true,
default: () => <div data-testid="api-extension-page" />,
}))
vi.mock('../provider-list', () => ({
__esModule: true,
default: () => <div data-testid="tool-provider-list" />,
}))
const renderIntegrationsPage = (searchParams?: Record<string, string>) => {
return renderWithNuqs(<IntegrationsPage />, { searchParams })
}
describe('IntegrationsPage', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('renders the model provider section from the section query', () => {
renderIntegrationsPage({ section: 'provider' })
expect(screen.getByTestId('model-provider-page')).toBeInTheDocument()
expect(screen.getAllByText('common.settings.provider')).toHaveLength(2)
expect(screen.getByRole('textbox', { name: 'search' })).toBeInTheDocument()
})
it('renders migrated legacy setting sections', () => {
const { unmount } = renderIntegrationsPage({ section: 'data-source' })
expect(screen.getByTestId('data-source-page')).toBeInTheDocument()
unmount()
renderIntegrationsPage({ section: 'api-based-extension' })
expect(screen.getByTestId('api-extension-page')).toBeInTheDocument()
})
it('keeps existing category-only tools URLs functional', () => {
renderIntegrationsPage({ category: 'mcp' })
expect(screen.getByTestId('tool-provider-list')).toBeInTheDocument()
expect(screen.getByRole('link', { name: 'MCP' })).toHaveClass('bg-state-base-active')
})
it('collapses and expands the integrations sidebar', () => {
renderIntegrationsPage({ section: 'provider' })
fireEvent.click(screen.getByRole('button', { name: 'common.settings.collapse' }))
expect(screen.queryByText('common.settings.integrations')).not.toBeInTheDocument()
expect(screen.queryByText('common.settings.customTool')).not.toBeInTheDocument()
expect(screen.getByRole('link', { name: 'MCP' })).toBeInTheDocument()
expect(screen.getByLabelText('common.settings.trigger')).toBeInTheDocument()
expect(screen.getByRole('button', { name: 'common.settings.expand' })).toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: 'common.settings.expand' }))
expect(screen.getByText('common.settings.integrations')).toBeInTheDocument()
expect(screen.getByText('common.settings.customTool')).toBeInTheDocument()
})
})

View File

@ -0,0 +1,369 @@
'use client'
import { cn } from '@langgenius/dify-ui/cn'
import { parseAsStringLiteral, useQueryState } from 'nuqs'
import { useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
import DatasourceIcon from '@/app/components/base/icons/src/vender/workflow/Datasource'
import ApiBasedExtensionPage from '@/app/components/header/account-setting/api-based-extension-page'
import DataSourcePage from '@/app/components/header/account-setting/data-source-page-new'
import ModelProviderPage from '@/app/components/header/account-setting/model-provider-page'
import Link from '@/next/link'
import ToolProviderList from './provider-list'
const INTEGRATION_SECTION_VALUES = [
'provider',
'builtin',
'mcp',
'custom-tool',
'workflow-tool',
'data-source',
'api-based-extension',
] as const
type IntegrationSection = typeof INTEGRATION_SECTION_VALUES[number]
const TOOL_CATEGORY_VALUES = ['builtin', 'api', 'workflow', 'mcp'] as const
type ToolCategory = typeof TOOL_CATEGORY_VALUES[number]
type IconComponent = typeof DatasourceIcon
const parseAsIntegrationSection = parseAsStringLiteral(INTEGRATION_SECTION_VALUES)
const parseAsToolCategory = parseAsStringLiteral(TOOL_CATEGORY_VALUES)
const toolCategoryBySection: Partial<Record<IntegrationSection, string>> = {
'builtin': 'builtin',
'mcp': 'mcp',
'custom-tool': 'api',
'workflow-tool': 'workflow',
}
const sectionByToolCategory: Record<ToolCategory, IntegrationSection> = {
builtin: 'builtin',
api: 'custom-tool',
workflow: 'workflow-tool',
mcp: 'mcp',
}
type NavItem = {
activeIcon?: IconComponent | string
disabled?: boolean
icon: IconComponent | string
iconClassName?: string
label: string
section?: IntegrationSection
}
const navItemClassName = 'flex h-8 w-full items-center gap-2 rounded-lg py-1 pr-1 pl-3 text-left system-sm-medium transition-colors'
const activeNavItemClassName = 'bg-state-base-active system-sm-semibold text-components-menu-item-text-active'
const inactiveNavItemClassName = 'text-components-menu-item-text hover:bg-state-base-hover hover:text-components-menu-item-text-hover'
const disabledNavItemClassName = 'cursor-not-allowed text-components-menu-item-text-disabled'
const buildSectionHref = (section: IntegrationSection) => {
const category = toolCategoryBySection[section]
const params = new URLSearchParams({ section })
if (category)
params.set('category', category)
return `/tools?${params.toString()}`
}
type NavLinkItemProps = {
collapsed?: boolean
item: NavItem
section: IntegrationSection
}
const renderIcon = (icon: IconComponent | string, className = 'size-4') => {
if (typeof icon === 'string')
return <span className={cn(className, icon)} />
const Icon = icon
return <Icon className={className} />
}
const NavLinkItem = ({ collapsed, item, section }: NavLinkItemProps) => {
const isActive = item.section === section
const icon = isActive && item.activeIcon ? item.activeIcon : item.icon
const className = cn(
navItemClassName,
collapsed && 'justify-center px-0',
isActive ? activeNavItemClassName : inactiveNavItemClassName,
)
if (!item.section) {
return (
<div
title={item.label}
aria-label={item.label}
className={cn(
navItemClassName,
collapsed && 'justify-center px-0',
disabledNavItemClassName,
)}
aria-disabled="true"
>
<span aria-hidden className="flex size-5 shrink-0 items-center justify-center">
{renderIcon(item.icon, item.iconClassName)}
</span>
{!collapsed && <span className="min-w-0 truncate">{item.label}</span>}
</div>
)
}
return (
<Link
href={buildSectionHref(item.section)}
title={item.label}
aria-label={item.label}
className={className}
>
<span aria-hidden className="flex size-5 shrink-0 items-center justify-center">
{renderIcon(icon, item.iconClassName)}
</span>
{!collapsed && <span className="min-w-0 truncate">{item.label}</span>}
</Link>
)
}
export default function IntegrationsPage() {
const { t } = useTranslation()
const [sectionParam] = useQueryState('section', parseAsIntegrationSection)
const [categoryParam] = useQueryState('category', parseAsToolCategory)
const section = sectionParam ?? sectionByToolCategory[categoryParam ?? 'builtin']
const [providerSearchText, setProviderSearchText] = useState('')
const [sidebarCollapsed, setSidebarCollapsed] = useState(false)
const providerItem = useMemo<NavItem>(() => ({
section: 'provider',
label: t('settings.provider', { ns: 'common' }),
icon: 'i-ri-brain-2-line',
activeIcon: 'i-ri-brain-2-fill',
}), [t])
const toolItems = useMemo<NavItem[]>(() => [
{
section: 'mcp',
label: 'MCP',
icon: 'i-custom-vender-integrations-mcp',
iconClassName: 'h-[14.5px] w-[13.5px]',
},
{
section: 'custom-tool',
label: t('settings.customTool', { ns: 'common' }),
icon: 'i-custom-vender-integrations-custom-tool',
iconClassName: 'h-[14.5px] w-[12.5px]',
},
{
section: 'workflow-tool',
label: t('type.workflow', { ns: 'tools' }),
icon: 'i-custom-vender-integrations-workflow-as-tool',
iconClassName: 'h-3 w-[12.5px]',
},
{
section: 'api-based-extension',
label: t('settings.apiBasedExtension', { ns: 'common' }),
icon: 'i-custom-vender-integrations-api-extension',
iconClassName: 'h-[13px] w-3.5',
},
], [t])
const secondaryItems = useMemo<NavItem[]>(() => [
{
section: 'data-source',
label: t('settings.dataSource', { ns: 'common' }),
icon: DatasourceIcon,
iconClassName: 'size-4',
},
{
label: t('settings.trigger', { ns: 'common' }),
icon: 'i-custom-vender-integrations-trigger',
iconClassName: 'h-[13.5px] w-[13.5px]',
disabled: true,
},
{
label: t('settings.agentStrategy', { ns: 'common' }),
icon: 'i-custom-vender-integrations-agent-strategy',
iconClassName: 'h-[14.5px] w-[15.5px]',
disabled: true,
},
{
label: t('settings.extension', { ns: 'common' }),
icon: 'i-custom-vender-integrations-extension',
iconClassName: 'h-[13.5px] w-3',
disabled: true,
},
], [t])
const activeItem = [providerItem, ...toolItems, ...secondaryItems].find(item => item.section === section)
const isToolSection = Boolean(toolCategoryBySection[section])
return (
<div className="flex h-full min-h-0 bg-background-body">
<aside className={cn(
'flex shrink-0 flex-col border-r border-divider-burn bg-background-body px-2 py-2 transition-[width]',
sidebarCollapsed ? 'w-14 items-center' : 'w-[200px] items-end',
)}
>
<div className={cn(
'flex min-h-0 flex-1 flex-col pb-4',
sidebarCollapsed ? 'w-10' : 'w-[184px]',
)}
>
<div className={cn(
'flex h-8 shrink-0 items-center py-1',
sidebarCollapsed ? 'justify-center' : 'justify-between',
)}
>
{!sidebarCollapsed && (
<div className="title-3xl-semi-bold whitespace-nowrap text-text-primary">
{t('settings.integrations', { ns: 'common' })}
</div>
)}
<button
type="button"
className="flex size-5 items-center justify-center rounded-md text-text-tertiary hover:bg-state-base-hover hover:text-text-secondary"
aria-label={t(sidebarCollapsed ? 'settings.expand' : 'settings.collapse', { ns: 'common' })}
title={t(sidebarCollapsed ? 'settings.expand' : 'settings.collapse', { ns: 'common' })}
onClick={() => setSidebarCollapsed(collapsed => !collapsed)}
>
<span
aria-hidden
className={cn(
'i-custom-vender-integrations-panel-left size-[14.5px]',
sidebarCollapsed && 'rotate-180',
)}
/>
</button>
</div>
{!sidebarCollapsed && (
<div className="mt-6 flex shrink-0 items-center gap-1">
<button
type="button"
disabled
className="flex h-8 min-w-0 flex-1 cursor-not-allowed items-center justify-center gap-0.5 rounded-lg border-[0.5px] border-components-button-primary-border bg-components-button-primary-bg px-2 system-sm-medium text-components-button-primary-text opacity-60 shadow-xs"
title={t('installAction', { ns: 'plugin' })}
>
<span aria-hidden className="i-ri-add-line size-4 shrink-0" />
<span className="min-w-0 truncate pl-1">{t('installAction', { ns: 'plugin' })}</span>
<span aria-hidden className="i-ri-arrow-down-s-line size-4 shrink-0" />
</button>
<button
type="button"
disabled
className="flex size-8 shrink-0 cursor-not-allowed items-center justify-center rounded-lg border-[0.5px] border-components-button-secondary-border bg-components-button-secondary-bg text-components-button-secondary-text opacity-60 shadow-xs"
aria-label={t('settings.filter', { ns: 'common' })}
title={t('settings.filter', { ns: 'common' })}
>
<span aria-hidden className="i-ri-equalizer-2-line size-4" />
</button>
</div>
)}
<nav className="mt-6 shrink-0 space-y-0.5">
<NavLinkItem collapsed={sidebarCollapsed} item={providerItem} section={section} />
<div>
<Link
href={buildSectionHref('builtin')}
title={t('menus.tools', { ns: 'common' })}
aria-label={t('menus.tools', { ns: 'common' })}
className={cn(
navItemClassName,
sidebarCollapsed && 'justify-center px-0',
section === 'builtin' ? activeNavItemClassName : inactiveNavItemClassName,
)}
>
<span aria-hidden className="flex size-5 shrink-0 items-center justify-center">
<span className="i-custom-vender-integrations-tools h-3.5 w-[12.5px]" />
</span>
{!sidebarCollapsed && (
<>
<span className="min-w-0 flex-1 truncate">{t('menus.tools', { ns: 'common' })}</span>
<span aria-hidden className="i-ri-arrow-down-s-fill size-4 shrink-0" />
</>
)}
</Link>
<div className={cn('space-y-0.5', !sidebarCollapsed && 'pl-6')}>
{toolItems.map(item => (
<NavLinkItem
collapsed={sidebarCollapsed}
key={item.label}
item={item}
section={section}
/>
))}
</div>
</div>
{secondaryItems.map(item => (
<NavLinkItem
collapsed={sidebarCollapsed}
key={item.label}
item={item}
section={section}
/>
))}
</nav>
</div>
{!sidebarCollapsed && (
<div className="flex min-h-[123px] w-full shrink-0 flex-col items-start gap-2 rounded-xl bg-background-default-hover p-4">
<div className="relative isolate h-[34.654px] w-[86.251px] shrink-0">
<div className="absolute top-0 left-[-1px] z-[3] flex size-[34.139px] items-center justify-center">
<div className="flex size-8 rotate-[-3.97deg] items-center justify-center rounded-lg border border-background-default-subtle bg-background-default-subtle">
<div className="flex size-full items-center justify-center rounded-lg border-[0.5px] border-divider-regular bg-components-icon-bg-pink-soft p-1 text-[20px] leading-[1.2]">
🕹
</div>
</div>
</div>
<div className="absolute top-0 left-[26.14px] z-[2] flex size-[34.654px] items-center justify-center">
<div className="flex size-8 rotate-[4.97deg] items-center justify-center rounded-lg border border-background-default-subtle bg-background-default-subtle">
<div className="flex size-full items-center justify-center rounded-lg border-[0.5px] border-divider-regular bg-components-icon-bg-orange-dark-soft p-1 text-[20px] leading-[1.2]">
📙
</div>
</div>
</div>
<div className="absolute top-px left-[53.79px] z-[1] flex size-[33.458px] items-center justify-center">
<div className="flex size-8 rotate-[-2.67deg] items-center justify-center rounded-lg border border-background-default-subtle bg-background-default-subtle">
<div className="flex size-full items-center justify-center rounded-lg border-[0.5px] border-divider-regular bg-components-icon-bg-teal-soft p-1 text-[20px] leading-[1.2]">
🤖
</div>
</div>
</div>
</div>
<div className="w-full system-xs-medium text-text-secondary">
{t('settings.discoverMoreIntegrationsInMarketplace', { ns: 'common' })}
</div>
</div>
)}
</aside>
<section className="flex min-w-0 flex-1 flex-col overflow-hidden">
{!isToolSection && (
<div className="flex min-h-14 shrink-0 items-center justify-between border-b border-divider-subtle px-6 py-2">
<div>
<div className="system-xl-semibold text-text-primary">{activeItem?.label}</div>
{section === 'provider' && (
<div className="mt-0.5 system-xs-regular text-text-tertiary">
{t('modelProvider.pageDesc', { ns: 'common' })}
</div>
)}
</div>
</div>
)}
<div className="min-h-0 flex-1 overflow-y-auto">
{section === 'provider' && (
<div className="px-6 pt-6">
<ModelProviderPage
searchText={providerSearchText}
onSearchTextChange={setProviderSearchText}
/>
</div>
)}
{section === 'data-source' && (
<div className="px-6 pt-6">
<DataSourcePage />
</div>
)}
{section === 'api-based-extension' && (
<div className="px-6 pt-6">
<ApiBasedExtensionPage />
</div>
)}
{isToolSection && <ToolProviderList />}
</div>
</section>
</div>
)
}

View File

@ -407,8 +407,11 @@
"modelProvider.config": "تكوين",
"modelProvider.configLoadBalancing": "تكوين موازنة التحميل",
"modelProvider.configureTip": "قم بإعداد مفتاح api أو أضف نموذجًا للاستخدام",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "تأكيد الحذف؟",
"modelProvider.credits": "أرصدة الرسائل",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "التكوين الافتراضي",
"modelProvider.deprecated": "مهمل",
"modelProvider.discoverMore": "اكتشف المزيد في ",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "لم يتم العثور على نموذج لـ {{model}}",
"modelProvider.noneConfigured": "قم بتكوين نموذج نظام افتراضي لتشغيل التطبيقات",
"modelProvider.notConfigured": "لم يتم تكوين نموذج النظام بالكامل بعد",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "المعلمات",
"modelProvider.parametersInvalidRemoved": "بعض المعلمات غير صالحة وتمت إزالتها",
"modelProvider.priorityUsing": "أولوية الاستخدام",
"modelProvider.providerManaged": "مدار من قبل المزود",
"modelProvider.providerManagedDescription": "استخدم مجموعة واحدة من بيانات الاعتماد المقدمة من مزود النموذج.",
"modelProvider.quota": "حصة",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "الرموز المجانية المتاحة المتبقية",
"modelProvider.rerankModel.key": "نموذج إعادة الترتيب",
"modelProvider.rerankModel.tip": "سيعيد نموذج إعادة الترتيب ترتيب قائمة المستندات المرشحة بناءً على المطابقة الدلالية مع استعلام المستخدم، مما يحسن نتائج الترتيب الدلالي",
@ -628,16 +633,25 @@
"provider.validating": "جارٍ التحقق من المفتاح...",
"settings.account": "حسابي",
"settings.accountGroup": "عام",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "ملحق API",
"settings.billing": "الفوترة",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "مصدر البيانات",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "عام",
"settings.integrations": "التكاملات",
"settings.language": "اللغة",
"settings.members": "الأعضاء",
"settings.plugin": "الإضافات",
"settings.provider": "مزود النموذج",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "مساحة العمل",
"settings.workspaceSettings": "إعدادات مساحة العمل",
"tag.addNew": "إضافة علامة جديدة",
"tag.addTag": "إضافة علامات",
"tag.create": "إنشاء",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Konfigurieren",
"modelProvider.configLoadBalancing": "Lastenausgleich für die Konfiguration",
"modelProvider.configureTip": "Einrichten des API-Schlüssels oder Hinzufügen des zu verwendenden Modells",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Löschung bestätigen?",
"modelProvider.credits": "Nachrichtenguthaben",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Standardkonfiguration",
"modelProvider.deprecated": "Veraltet",
"modelProvider.discoverMore": "Erfahren Sie mehr in",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Kein Modell für {{model}} gefunden",
"modelProvider.noneConfigured": "Konfigurieren Sie ein Standard-Systemmodell, um Anwendungen auszuführen",
"modelProvider.notConfigured": "Das Systemmodell wurde noch nicht vollständig konfiguriert, und einige Funktionen sind möglicherweise nicht verfügbar.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETER",
"modelProvider.parametersInvalidRemoved": "Einige Parameter sind ungültig und wurden entfernt.",
"modelProvider.priorityUsing": "Bevorzugte Nutzung",
"modelProvider.providerManaged": "Vom Anbieter verwaltet",
"modelProvider.providerManagedDescription": "Verwenden Sie den einzelnen Satz von Anmeldeinformationen, der vom Modellanbieter bereitgestellt wird.",
"modelProvider.quota": "Kontingent",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Verbleibende verfügbare kostenlose Token",
"modelProvider.rerankModel.key": "Rerank-Modell",
"modelProvider.rerankModel.tip": "Rerank-Modell wird die Kandidatendokumentenliste basierend auf der semantischen Übereinstimmung mit der Benutzeranfrage neu ordnen und die Ergebnisse der semantischen Rangordnung verbessern",
@ -628,16 +633,25 @@
"provider.validating": "Schlüssel wird validiert...",
"settings.account": "Mein Konto",
"settings.accountGroup": "KONTO",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API-Erweiterung",
"settings.billing": "Abrechnung",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Datenquelle",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "ALLGEMEIN",
"settings.integrations": "Integrationen",
"settings.language": "Sprache",
"settings.members": "Mitglieder",
"settings.plugin": "Plugins",
"settings.provider": "Modellanbieter",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ARBEITSBEREICH",
"settings.workspaceSettings": "Arbeitsbereich-Einstellungen",
"tag.addNew": "Neues Tag hinzufügen",
"tag.addTag": "Tags hinzufügen",
"tag.create": "Erstellen",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Config",
"modelProvider.configLoadBalancing": "Config Load Balancing",
"modelProvider.configureTip": "Set up api-key or add model to use",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Confirm deletion?",
"modelProvider.credits": "Message Credits",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Default Config",
"modelProvider.deprecated": "Deprecated",
"modelProvider.discoverMore": "Discover more in ",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "No model found for {{model}}",
"modelProvider.noneConfigured": "Configure a default system model to run applications",
"modelProvider.notConfigured": "The system model has not yet been fully configured",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETERS",
"modelProvider.parametersInvalidRemoved": "Some parameters are invalid and have been removed",
"modelProvider.priorityUsing": "Prioritize using",
"modelProvider.providerManaged": "Provider managed",
"modelProvider.providerManagedDescription": "Use the single set of credentials provided by the model provider.",
"modelProvider.quota": "AI Credits",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Remaining available free tokens",
"modelProvider.rerankModel.key": "Rerank Model",
"modelProvider.rerankModel.tip": "Rerank model will reorder the candidate document list based on the semantic match with user query, improving the results of semantic ranking",
@ -628,16 +633,25 @@
"provider.validating": "Validating key...",
"settings.account": "My account",
"settings.accountGroup": "GENERAL",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API Extension",
"settings.billing": "Billing",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Data Source",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENERAL",
"settings.integrations": "Integrations",
"settings.language": "Language",
"settings.members": "Members",
"settings.plugin": "Plugins",
"settings.provider": "Model Provider",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "WORKSPACE",
"settings.workspaceSettings": "Workspace Settings",
"tag.addNew": "Add new tag",
"tag.addTag": "Add tags",
"tag.create": "Create",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Configurar",
"modelProvider.configLoadBalancing": "Configurar Balanceo de Carga",
"modelProvider.configureTip": "Configurar la clave de API o agregar el modelo que se va a usar",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "¿Confirmar eliminación?",
"modelProvider.credits": "Créditos de Mensaje",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Configuración Predeterminada",
"modelProvider.deprecated": "Desaprobado",
"modelProvider.discoverMore": "Descubre más en",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "No se encontró modelo para {{model}}",
"modelProvider.noneConfigured": "Configura un modelo de sistema predeterminado para ejecutar aplicaciones",
"modelProvider.notConfigured": "El modelo del sistema aún no ha sido completamente configurado, y algunas funciones pueden no estar disponibles.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARÁMETROS",
"modelProvider.parametersInvalidRemoved": "Algunos parámetros son inválidos y han sido eliminados",
"modelProvider.priorityUsing": "Uso prioritario",
"modelProvider.providerManaged": "Gestionado por el proveedor",
"modelProvider.providerManagedDescription": "Usa el único conjunto de credenciales proporcionado por el proveedor del modelo.",
"modelProvider.quota": "Cuota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Tokens gratuitos restantes disponibles",
"modelProvider.rerankModel.key": "Modelo de Reordenar",
"modelProvider.rerankModel.tip": "El modelo de reordenar reordenará la lista de documentos candidatos basada en la coincidencia semántica con la consulta del usuario, mejorando los resultados de clasificación semántica",
@ -628,16 +633,25 @@
"provider.validating": "Validando clave...",
"settings.account": "Mi cuenta",
"settings.accountGroup": "CUENTA",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Extensión basada en API",
"settings.billing": "Facturación",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Fuente de Datos",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENERAL",
"settings.integrations": "Integraciones",
"settings.language": "Idioma",
"settings.members": "Miembros",
"settings.plugin": "Plugins",
"settings.provider": "Proveedor de Modelo",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ESPACIO DE TRABAJO",
"settings.workspaceSettings": "Configuración del espacio de trabajo",
"tag.addNew": "Agregar nueva etiqueta",
"tag.addTag": "Agregar etiquetas",
"tag.create": "Crear",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "پیکربندی",
"modelProvider.configLoadBalancing": "پیکربندی تعادل بار",
"modelProvider.configureTip": "api-key را راه اندازی کنید یا مدل را برای استفاده اضافه کنید",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "تأیید حذف؟",
"modelProvider.credits": "اعتبار پیام",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "پیکربندی پیش‌فرض",
"modelProvider.deprecated": "منسوخ شده",
"modelProvider.discoverMore": "اطلاعات بیشتر در",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "هیچ مدلی برای {{model}} یافت نشد",
"modelProvider.noneConfigured": "یک مدل سیستم پیش‌فرض برای اجرای برنامه‌ها پیکربندی کنید",
"modelProvider.notConfigured": "مدل سیستم هنوز به طور کامل پیکربندی نشده است و برخی از عملکردها ممکن است در دسترس نباشند.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "پارامترها",
"modelProvider.parametersInvalidRemoved": "برخی پارامترها نامعتبر هستند و حذف شده‌اند",
"modelProvider.priorityUsing": "استفاده با اولویت",
"modelProvider.providerManaged": "مدیریت شده توسط ارائه‌دهنده",
"modelProvider.providerManagedDescription": "استفاده از مجموعه واحد اعتبارنامه ارائه شده توسط ارائه‌دهنده مدل.",
"modelProvider.quota": "سهمیه",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "توکن‌های رایگان باقی‌مانده در دسترس",
"modelProvider.rerankModel.key": "مدل رتبه‌بندی مجدد",
"modelProvider.rerankModel.tip": "مدل رتبه‌بندی مجدد، لیست اسناد کاندید را بر اساس تطابق معنایی با پرسش کاربر مرتب می‌کند و نتایج رتبه‌بندی معنایی را بهبود می‌بخشد",
@ -628,16 +633,25 @@
"provider.validating": "در حال اعتبارسنجی کلید...",
"settings.account": "حساب من",
"settings.accountGroup": "حساب کاربری",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "توسعه مبتنی بر API",
"settings.billing": "صورتحساب",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "منبع داده",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "عمومی",
"settings.integrations": "ادغام‌ها",
"settings.language": "زبان",
"settings.members": "اعضا",
"settings.plugin": "افزونه‌ها",
"settings.provider": "ارائه دهنده مدل",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "فضای کاری",
"settings.workspaceSettings": "تنظیمات فضای کاری",
"tag.addNew": "افزودن برچسب جدید",
"tag.addTag": "افزودن برچسب‌ها",
"tag.create": "ایجاد",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Configuration",
"modelProvider.configLoadBalancing": "Équilibrage de charge de configuration",
"modelProvider.configureTip": "Configurer api-key ou ajouter un modèle à utiliser",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "confirmer la suppression?",
"modelProvider.credits": "Crédits de Messages",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Configuration par défaut",
"modelProvider.deprecated": "Obsolète",
"modelProvider.discoverMore": "Découvrez-en plus dans",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Aucun modèle trouvé pour {{model}}",
"modelProvider.noneConfigured": "Configurez un modèle système par défaut pour exécuter les applications",
"modelProvider.notConfigured": "Le modèle du système n'a pas encore été entièrement configuré, et certaines fonctions peuvent être indisponibles.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMÈTRES",
"modelProvider.parametersInvalidRemoved": "Certains paramètres sont invalides et ont été supprimés.",
"modelProvider.priorityUsing": "Prioriser l'utilisation",
"modelProvider.providerManaged": "Géré par le fournisseur",
"modelProvider.providerManagedDescription": "Utilisez lensemble unique dinformations didentification fourni par le fournisseur de modèle.",
"modelProvider.quota": "Quota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Tokens gratuits restants disponibles",
"modelProvider.rerankModel.key": "Modèle de Réorganisation",
"modelProvider.rerankModel.tip": "Le modèle de réorganisation réorganisera la liste des documents candidats en fonction de la correspondance sémantique avec la requête de l'utilisateur, améliorant ainsi les résultats du classement sémantique.",
@ -628,16 +633,25 @@
"provider.validating": "Validation de la clé...",
"settings.account": "Mon compte",
"settings.accountGroup": "COMPTE",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Extension API",
"settings.billing": "Facturation",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Source de Données",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GÉNÉRALITÉS",
"settings.integrations": "Intégrations",
"settings.language": "Langue",
"settings.members": "Membres",
"settings.plugin": "Plugins",
"settings.provider": "Fournisseur de Modèle",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ESPACE DE TRAVAIL",
"settings.workspaceSettings": "Paramètres de lespace de travail",
"tag.addNew": "Ajouter une nouvelle balise",
"tag.addTag": "ajouter une balise",
"tag.create": "Créer",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "कॉन्फ़िग",
"modelProvider.configLoadBalancing": "लोड बैलेंसिंग कॉन्फ़िग करें",
"modelProvider.configureTip": "एपीआई-कुंजी सेट करें या उपयोग के लिए मॉडल जोड़ें",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "हटाने की पुष्टि करें?",
"modelProvider.credits": "संदेश क्रेडिट्स",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "डिफ़ॉल्ट कॉन्फ़िग",
"modelProvider.deprecated": "अप्रचलित",
"modelProvider.discoverMore": "और अधिक खोजें",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "{{model}} के लिए कोई मॉडल नहीं मिला",
"modelProvider.noneConfigured": "एप्लिकेशन चलाने के लिए एक डिफ़ॉल्ट सिस्टम मॉडल कॉन्फ़िगर करें",
"modelProvider.notConfigured": "सिस्टम मॉडल को अभी पूरी तरह से कॉन्फ़िगर नहीं किया गया है, और कुछ कार्य उपलब्ध नहीं हो सकते हैं।",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "पैरामीटर",
"modelProvider.parametersInvalidRemoved": "कुछ पैरामीटर अमान्य हैं और हटा दिए गए हैं",
"modelProvider.priorityUsing": "प्राथमिकता का उपयोग",
"modelProvider.providerManaged": "प्रदाता प्रबंधित",
"modelProvider.providerManagedDescription": "मॉडल प्रदाता द्वारा प्रदान की गई एकल सेट की साख का उपयोग करें।",
"modelProvider.quota": "कोटा",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "बचे हुए उपलब्ध मुफ्त टोकन",
"modelProvider.rerankModel.key": "रीरैंक मॉडल",
"modelProvider.rerankModel.tip": "रीरैंक मॉडल उपयोगकर्ता प्रश्न के साथ सांविधिक मेल के आधार पर उम्मीदवार दस्तावेज़ सूची को पुनः क्रमित करेगा, सांविधिक रैंकिंग के परिणामों में सुधार करेगा।",
@ -628,16 +633,25 @@
"provider.validating": "कुंजी का सत्यापन हो रहा है...",
"settings.account": "मेरा खाता",
"settings.accountGroup": "खाता",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API विस्तार",
"settings.billing": "बिलिंग",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "डेटा स्रोत",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "सामान्य",
"settings.integrations": "एकीकरण",
"settings.language": "भाषा",
"settings.members": "सदस्य",
"settings.plugin": "प्लगइन्स",
"settings.provider": "मॉडल प्रदाता",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "कार्यस्थल",
"settings.workspaceSettings": "कार्यस्थल सेटिंग्स",
"tag.addNew": "नया टैग जोड़ें",
"tag.addTag": "टैग जोड़ें",
"tag.create": "बनाएं",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Konfigurasi",
"modelProvider.configLoadBalancing": "Penyeimbangan Beban Konfigurasi",
"modelProvider.configureTip": "Menyiapkan api-key atau menambahkan model untuk digunakan",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Mengkonfirmasi penghapusan?",
"modelProvider.credits": "Kredit Pesan",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Konfigurasi Default",
"modelProvider.deprecated": "Usang",
"modelProvider.discoverMore": "Temukan lebih lanjut di",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Tidak ditemukan model untuk {{model}}",
"modelProvider.noneConfigured": "Konfigurasikan model sistem default untuk menjalankan aplikasi",
"modelProvider.notConfigured": "Model sistem belum sepenuhnya dikonfigurasi",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETER",
"modelProvider.parametersInvalidRemoved": "Beberapa parameter tidak valid dan telah dihapus",
"modelProvider.priorityUsing": "Prioritaskan penggunaan",
"modelProvider.providerManaged": "Penyedia dikelola",
"modelProvider.providerManagedDescription": "Gunakan satu set kredensial yang disediakan oleh penyedia model.",
"modelProvider.quota": "Kuota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Token gratis yang masih tersedia",
"modelProvider.rerankModel.key": "Peringkat ulang Model",
"modelProvider.rerankModel.tip": "Model rerank akan menyusun ulang daftar dokumen kandidat berdasarkan kecocokan semantik dengan kueri pengguna, meningkatkan hasil peringkat semantik",
@ -628,16 +633,25 @@
"provider.validating": "Memvalidasi kunci...",
"settings.account": "Akun saya",
"settings.accountGroup": "UMUM",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Ekstensi API",
"settings.billing": "Penagihan",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Sumber Data",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "UMUM",
"settings.integrations": "Integrasi",
"settings.language": "Bahasa",
"settings.members": "Anggota",
"settings.plugin": "Plugin",
"settings.provider": "Penyedia Model",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "WORKSPACE",
"settings.workspaceSettings": "Pengaturan Workspace",
"tag.addNew": "Tambahkan tag baru",
"tag.addTag": "Tambahkan tag",
"tag.create": "Menciptakan",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Configura",
"modelProvider.configLoadBalancing": "Configura Bilanciamento del Carico",
"modelProvider.configureTip": "Configura la chiave API o aggiungi il modello da utilizzare",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "confermare l'eliminazione?",
"modelProvider.credits": "Crediti Messaggi",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Config predefinito",
"modelProvider.deprecated": "Deprecato",
"modelProvider.discoverMore": "Scopri di più in",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Nessun modello trovato per {{model}}",
"modelProvider.noneConfigured": "Configura un modello di sistema predefinito per eseguire le applicazioni",
"modelProvider.notConfigured": "Il modello di sistema non è ancora stato completamente configurato e alcune funzioni potrebbero non essere disponibili.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETRI",
"modelProvider.parametersInvalidRemoved": "Alcuni parametri non sono validi e sono stati rimossi.",
"modelProvider.priorityUsing": "Utilizzo prioritario",
"modelProvider.providerManaged": "Gestito dal fornitore",
"modelProvider.providerManagedDescription": "Usa il singolo set di credenziali fornito dal fornitore del modello.",
"modelProvider.quota": "Quota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Token gratuiti rimanenti disponibili",
"modelProvider.rerankModel.key": "Modello di Rerank",
"modelProvider.rerankModel.tip": "Il modello di rerank riordinerà la lista dei documenti candidati basandosi sulla corrispondenza semantica con la query dell'utente, migliorando i risultati del ranking semantico",
@ -628,16 +633,25 @@
"provider.validating": "Convalida chiave in corso...",
"settings.account": "Il mio account",
"settings.accountGroup": "ACCOUNT",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Estensione API",
"settings.billing": "Fatturazione",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Fonte Dati",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENERALE",
"settings.integrations": "Integrazioni",
"settings.language": "Lingua",
"settings.members": "Membri",
"settings.plugin": "Plugin",
"settings.provider": "Fornitore di Modelli",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "WORKSPACE",
"settings.workspaceSettings": "Impostazioni workspace",
"tag.addNew": "Aggiungi nuovo tag",
"tag.addTag": "Aggiungi tag",
"tag.create": "Crea",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "設定",
"modelProvider.configLoadBalancing": "負荷分散の設定",
"modelProvider.configureTip": "API キーを設定するか、使用するモデルを追加してください",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "削除を確認",
"modelProvider.credits": "クレジット",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "デフォルトの設定",
"modelProvider.deprecated": "廃止予定",
"modelProvider.discoverMore": "もっと発見する",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "{{model}}に対するモデルが見つかりません",
"modelProvider.noneConfigured": "アプリケーションを実行するためにデフォルトのシステムモデルを設定してください",
"modelProvider.notConfigured": "システムモデルがまだ完全に設定されておらず、一部の機能が利用できない場合があります。",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "パラメータ",
"modelProvider.parametersInvalidRemoved": "いくつかのパラメータが無効であり、削除されました。",
"modelProvider.priorityUsing": "優先利用",
"modelProvider.providerManaged": "プロバイダ管理",
"modelProvider.providerManagedDescription": "モデルプロバイダによって提供される認証情報を使用します。",
"modelProvider.quota": "クォータ",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "残りの無料トークン",
"modelProvider.rerankModel.key": "Rerank モデル",
"modelProvider.rerankModel.tip": "Rerank モデルは、ユーザークエリとの意味的一致に基づいて候補文書リストを再配置し、意味的ランキングの結果を向上させます。",
@ -628,16 +633,25 @@
"provider.validating": "キーの検証中...",
"settings.account": "マイアカウント",
"settings.accountGroup": "アカウント",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API 拡張",
"settings.billing": "請求",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "データソース",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "一般",
"settings.integrations": "統合",
"settings.language": "言語",
"settings.members": "メンバー",
"settings.plugin": "プラグイン",
"settings.provider": "モデルプロバイダー",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ワークスペース",
"settings.workspaceSettings": "ワークスペース設定",
"tag.addNew": "新しいタグを追加",
"tag.addTag": "タグを追加",
"tag.create": "作成",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "설정",
"modelProvider.configLoadBalancing": "Config 로드 밸런싱",
"modelProvider.configureTip": "api-key 설정 또는 사용할 모델 추가",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "삭제를 확인하시겠습니까?",
"modelProvider.credits": "메시지 크레딧",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "기본 구성",
"modelProvider.deprecated": "사용 중단됨",
"modelProvider.discoverMore": "더 알아보기",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "{{model}}에 대한 모델을 찾을 수 없습니다",
"modelProvider.noneConfigured": "애플리케이션을 실행하려면 기본 시스템 모델을 구성하세요",
"modelProvider.notConfigured": "시스템 모델이 아직 완전히 설정되지 않아 일부 기능을 사용할 수 없습니다.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "매개변수",
"modelProvider.parametersInvalidRemoved": "일부 매개변수가 유효하지 않아 제거되었습니다.",
"modelProvider.priorityUsing": "우선 사용",
"modelProvider.providerManaged": "제공자 관리",
"modelProvider.providerManagedDescription": "모델 공급자가 제공하는 단일 자격 증명 집합을 사용합니다.",
"modelProvider.quota": "할당량",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "남은 무료 토큰 사용 가능",
"modelProvider.rerankModel.key": "재랭크 모델",
"modelProvider.rerankModel.tip": "재랭크 모델은 사용자 쿼리와의 의미적 일치를 기반으로 후보 문서 목록을 재배열하여 의미적 순위를 향상시킵니다.",
@ -628,16 +633,25 @@
"provider.validating": "키를 확인하는 중...",
"settings.account": "내 계정",
"settings.accountGroup": "계정",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API 확장",
"settings.billing": "청구",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "데이터 소스",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "일반",
"settings.integrations": "통합",
"settings.language": "언어",
"settings.members": "멤버",
"settings.plugin": "플러그인",
"settings.provider": "모델 제공자",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "작업 공간",
"settings.workspaceSettings": "작업 공간 설정",
"tag.addNew": "새 태그 추가",
"tag.addTag": "태그 추가",
"tag.create": "생성",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Config",
"modelProvider.configLoadBalancing": "Config Load Balancing",
"modelProvider.configureTip": "Set up api-key or add model to use",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Confirm deletion?",
"modelProvider.credits": "Message Credits",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Default Config",
"modelProvider.deprecated": "Deprecated",
"modelProvider.discoverMore": "Discover more in ",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "No model found for {{model}}",
"modelProvider.noneConfigured": "Configureer een standaard systeemmodel om applicaties uit te voeren",
"modelProvider.notConfigured": "The system model has not yet been fully configured",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETERS",
"modelProvider.parametersInvalidRemoved": "Some parameters are invalid and have been removed",
"modelProvider.priorityUsing": "Prioritize using",
"modelProvider.providerManaged": "Provider managed",
"modelProvider.providerManagedDescription": "Use the single set of credentials provided by the model provider.",
"modelProvider.quota": "Quota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Remaining available free tokens",
"modelProvider.rerankModel.key": "Rerank Model",
"modelProvider.rerankModel.tip": "Rerank model will reorder the candidate document list based on the semantic match with user query, improving the results of semantic ranking",
@ -628,16 +633,25 @@
"provider.validating": "Validating key...",
"settings.account": "My account",
"settings.accountGroup": "GENERAL",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API Extension",
"settings.billing": "Billing",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Data Source",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENERAL",
"settings.integrations": "Integrations",
"settings.language": "Language",
"settings.members": "Members",
"settings.plugin": "Plugins",
"settings.provider": "Model Provider",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "WORKSPACE",
"settings.workspaceSettings": "Workspace-instellingen",
"tag.addNew": "Add new tag",
"tag.addTag": "Add tags",
"tag.create": "Create",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Konfiguracja",
"modelProvider.configLoadBalancing": "Równoważenie obciążenia konfiguracji",
"modelProvider.configureTip": "Konfigurowanie klucza interfejsu API lub dodawanie modelu do użycia",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "potwierdzić usunięcie?",
"modelProvider.credits": "Kredyty wiadomości",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Domyślna konfiguracja",
"modelProvider.deprecated": "Przestarzałe",
"modelProvider.discoverMore": "Dowiedz się więcej w",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Nie znaleziono modelu dla {{model}}",
"modelProvider.noneConfigured": "Skonfiguruj domyślny model systemowy, aby uruchamiać aplikacje",
"modelProvider.notConfigured": "Systemowy model nie został jeszcze w pełni skonfigurowany, co może skutkować niedostępnością niektórych funkcji.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETRY",
"modelProvider.parametersInvalidRemoved": "Niektóre parametry są nieprawidłowe i zostały usunięte.",
"modelProvider.priorityUsing": "Priorytetyzacja użycia",
"modelProvider.providerManaged": "Zarządzany przez dostawcę",
"modelProvider.providerManagedDescription": "Użyj pojedynczego zestawu poświadczeń dostarczonych przez dostawcę modelu.",
"modelProvider.quota": "Limit",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Pozostałe dostępne darmowe tokeny",
"modelProvider.rerankModel.key": "Model ponownego rankingu",
"modelProvider.rerankModel.tip": "Model ponownego rankingu zmieni kolejność listy dokumentów kandydatów na podstawie semantycznego dopasowania z zapytaniem użytkownika, poprawiając wyniki rankingu semantycznego",
@ -628,16 +633,25 @@
"provider.validating": "Weryfikowanie klucza...",
"settings.account": "Moje konto",
"settings.accountGroup": "KONTO",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Rozszerzenie API",
"settings.billing": "Rozliczenia",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Źródło danych",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "OGÓLNE",
"settings.integrations": "Integracje",
"settings.language": "Język",
"settings.members": "Członkowie",
"settings.plugin": "Pluginy",
"settings.provider": "Dostawca modelu",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "PRZESTRZEŃ ROBOCZA",
"settings.workspaceSettings": "Ustawienia przestrzeni roboczej",
"tag.addNew": "Dodaj nowy tag",
"tag.addTag": "Dodaj tagi",
"tag.create": "Utwórz",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Configuração",
"modelProvider.configLoadBalancing": "Balanceamento de carga de configuração",
"modelProvider.configureTip": "Configure a chave de API ou adicione o modelo a ser usado",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "confirmar exclusão?",
"modelProvider.credits": "Créditos de Mensagem",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Configuração padrão",
"modelProvider.deprecated": "Obsoleto",
"modelProvider.discoverMore": "Descubra mais em",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Nenhum modelo encontrado para {{model}}",
"modelProvider.noneConfigured": "Configure um modelo de sistema padrão para executar aplicações",
"modelProvider.notConfigured": "O modelo do sistema ainda não foi totalmente configurado e algumas funções podem estar indisponíveis.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARÂMETROS",
"modelProvider.parametersInvalidRemoved": "Alguns parâmetros são inválidos e foram removidos",
"modelProvider.priorityUsing": "Uso prioritário",
"modelProvider.providerManaged": "Gerenciado pelo provedor",
"modelProvider.providerManagedDescription": "Use o único conjunto de credenciais fornecido pelo provedor de modelo.",
"modelProvider.quota": "Quota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Tokens gratuitos disponíveis restantes",
"modelProvider.rerankModel.key": "Modelo de Reordenação",
"modelProvider.rerankModel.tip": "O modelo de reordenaenação reorganizará a lista de documentos candidatos com base na correspondência semântica com a consulta do usuário, melhorando os resultados da classificação semântica",
@ -628,16 +633,25 @@
"provider.validating": "Validando chave...",
"settings.account": "Minha conta",
"settings.accountGroup": "CONTA",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Extensão baseada em API",
"settings.billing": "Faturamento",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Fonte de dados",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GERAL",
"settings.integrations": "Integrações",
"settings.language": "Idioma",
"settings.members": "Membros",
"settings.plugin": "Plugins",
"settings.provider": "Fornecedor de modelo",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ESPAÇO DE TRABALHO",
"settings.workspaceSettings": "Configurações do espaço de trabalho",
"tag.addNew": "Adicionar nova tag",
"tag.addTag": "adicionar etiqueta",
"tag.create": "Criar",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Configurare",
"modelProvider.configLoadBalancing": "Echilibrarea încărcării de configurare",
"modelProvider.configureTip": "Configurați api-key sau adăugați modelul de utilizat",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "confirmați ștergerea?",
"modelProvider.credits": "Credite mesaje",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Configurație implicită",
"modelProvider.deprecated": "Învechit",
"modelProvider.discoverMore": "Descoperă mai multe în",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Nu a fost găsit niciun model pentru {{model}}",
"modelProvider.noneConfigured": "Configurați un model de sistem implicit pentru a rula aplicații",
"modelProvider.notConfigured": "Modelul de sistem nu a fost încă configurat complet, iar unele funcții pot fi indisponibile.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETRI",
"modelProvider.parametersInvalidRemoved": "Unele parametrii sunt invalizi și au fost eliminați.",
"modelProvider.priorityUsing": "Prioritizează utilizarea",
"modelProvider.providerManaged": "Gestionat de furnizor",
"modelProvider.providerManagedDescription": "Utilizați setul unic de acreditări furnizat de furnizorul de modele.",
"modelProvider.quota": "Cotă",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Jetoane gratuite disponibile rămase",
"modelProvider.rerankModel.key": "Model de reordonare",
"modelProvider.rerankModel.tip": "Modelul de reordonare va reordona lista de documente candidate pe baza potrivirii semantice cu interogarea utilizatorului, îmbunătățind rezultatele clasificării semantice",
@ -628,16 +633,25 @@
"provider.validating": "Se validează cheia...",
"settings.account": "Contul meu",
"settings.accountGroup": "CONT",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Extensie API",
"settings.billing": "Facturare",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Sursă de date",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENERAL",
"settings.integrations": "Integrări",
"settings.language": "Limbă",
"settings.members": "Membri",
"settings.plugin": "Plugin-uri",
"settings.provider": "Furnizor de modele",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "SPAȚIU DE LUCRU",
"settings.workspaceSettings": "Setări spațiu de lucru",
"tag.addNew": "Adăugați o etichetă nouă",
"tag.addTag": "Adăugați etichete",
"tag.create": "Creați",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Настройка",
"modelProvider.configLoadBalancing": "Настроить балансировку нагрузки",
"modelProvider.configureTip": "Настройте api-ключ или добавьте модель для использования",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Подтвердить удаление?",
"modelProvider.credits": "Кредиты на сообщения",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Настройка по умолчанию",
"modelProvider.deprecated": "Устаревший",
"modelProvider.discoverMore": "Узнайте больше в",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Модель не найдена для {{model}}",
"modelProvider.noneConfigured": "Настройте системную модель по умолчанию для запуска приложений",
"modelProvider.notConfigured": "Системная модель еще не полностью настроена, и некоторые функции могут быть недоступны.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "ПАРАМЕТРЫ",
"modelProvider.parametersInvalidRemoved": "Некоторые параметры недействительны и были удалены",
"modelProvider.priorityUsing": "Приоритетное использование",
"modelProvider.providerManaged": "Управляется поставщиком",
"modelProvider.providerManagedDescription": "Используйте один набор учетных данных, предоставленный поставщиком модели.",
"modelProvider.quota": "Квота",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Оставшиеся доступные бесплатные токены",
"modelProvider.rerankModel.key": "Модель повторного ранжирования",
"modelProvider.rerankModel.tip": "Модель повторного ранжирования изменит порядок списка документов-кандидатов на основе семантического соответствия запросу пользователя, улучшая результаты семантического ранжирования",
@ -628,16 +633,25 @@
"provider.validating": "Проверка ключа...",
"settings.account": "Моя учетная запись",
"settings.accountGroup": "АККАУНТ",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API расширение",
"settings.billing": "Оплата",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Источник данных",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "ОБЩЕЕ",
"settings.integrations": "Интеграции",
"settings.language": "Язык",
"settings.members": "Участники",
"settings.plugin": "Плагины",
"settings.provider": "Поставщик модели",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "РАБОЧЕЕ ПРОСТРАНСТВО",
"settings.workspaceSettings": "Настройки рабочего пространства",
"tag.addNew": "Добавить новый тег",
"tag.addTag": "Добавить теги",
"tag.create": "Создать",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Konfiguracija",
"modelProvider.configLoadBalancing": "Konfiguracija uravnoteženja obremenitev",
"modelProvider.configureTip": "Nastavitev tipke API ali dodajanje modela za uporabo",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Potrdite izbris?",
"modelProvider.credits": "Sporočilni krediti",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Privzeta konfiguracija",
"modelProvider.deprecated": "Zastarelo",
"modelProvider.discoverMore": "Odkrijte več v",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Za {{model}} ni najden noben model",
"modelProvider.noneConfigured": "Konfigurirajte privzeti sistemski model za zaganjanje aplikacij",
"modelProvider.notConfigured": "Sistemski model še ni popolnoma konfiguriran, nekatere funkcije morda ne bodo na voljo.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETRI",
"modelProvider.parametersInvalidRemoved": "Nekateri parametri so neveljavni in so bili odstranjeni.",
"modelProvider.priorityUsing": "Prednostna uporaba",
"modelProvider.providerManaged": "Upravljano s strani ponudnika",
"modelProvider.providerManagedDescription": "Uporabite enoten sklop poverilnic, ki jih zagotovi ponudnik modela.",
"modelProvider.quota": "Kvote",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Preostali razpoložljivi brezplačni žetoni",
"modelProvider.rerankModel.key": "Model za prerazvrstitev",
"modelProvider.rerankModel.tip": "Model za prerazvrstitev bo prerazporedil seznam kandidatskih dokumentov na podlagi semantične ujemanja z uporabniško poizvedbo, s čimer se izboljšajo rezultati semantičnega razvrščanja.",
@ -628,16 +633,25 @@
"provider.validating": "Preverjam ključ...",
"settings.account": "Moj račun",
"settings.accountGroup": "SPLOŠNO",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Razširitev API-ja",
"settings.billing": "Zaračunavanje",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Vir podatkov",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "SPLOŠNO",
"settings.integrations": "Integracije",
"settings.language": "Jezik",
"settings.members": "Člani",
"settings.plugin": "Vtičniki",
"settings.provider": "Ponudnik modelov",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "DELOVNI PROSTOR",
"settings.workspaceSettings": "Nastavitve delovnega prostora",
"tag.addNew": "Dodajanje nove oznake",
"tag.addTag": "Dodajanje oznak",
"tag.create": "Ustvariti",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "กําหนดค่า",
"modelProvider.configLoadBalancing": "กําหนดค่าโหลดบาลานซ์",
"modelProvider.configureTip": "ตั้งค่า api-key หรือเพิ่มโมเดลเพื่อใช้",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "ยืนยันการลบ?",
"modelProvider.credits": "เครดิตข้อความ",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "การกําหนดค่าเริ่มต้น",
"modelProvider.deprecated": "เลิกใช้งานแล้ว",
"modelProvider.discoverMore": "ดูเพิ่มเติมใน",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "ไม่พบแบบจําลองสําหรับ {{model}}",
"modelProvider.noneConfigured": "กำหนดค่าโมเดลระบบเริ่มต้นเพื่อเรียกใช้แอปพลิเคชัน",
"modelProvider.notConfigured": "โมเดลระบบยังไม่ได้รับการกําหนดค่าอย่างสมบูรณ์ และฟังก์ชันบางอย่างอาจไม่พร้อมใช้งาน",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "พารามิเตอร์",
"modelProvider.parametersInvalidRemoved": "บางพารามิเตอร์ไม่ถูกต้องและถูกนำออก",
"modelProvider.priorityUsing": "จัดลําดับความสําคัญของการใช้",
"modelProvider.providerManaged": "จัดการผู้ให้บริการ",
"modelProvider.providerManagedDescription": "ใช้ข้อมูลประจําตัวชุดเดียวที่ผู้ให้บริการโมเดลให้มา",
"modelProvider.quota": "โควตา",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "โทเค็นฟรีที่เหลืออยู่",
"modelProvider.rerankModel.key": "จัดอันดับโมเดลใหม่",
"modelProvider.rerankModel.tip": "โมเดล Rerank จะจัดลําดับรายการเอกสารผู้สมัครใหม่ตามการจับคู่ความหมายกับการสืบค้นของผู้ใช้ ซึ่งช่วยปรับปรุงผลลัพธ์ของการจัดอันดับความหมาย",
@ -628,16 +633,25 @@
"provider.validating": "กําลังตรวจสอบความถูกต้องของคีย์...",
"settings.account": "บัญชีของฉัน",
"settings.accountGroup": "ทั่วไป",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "ส่วนขยาย API",
"settings.billing": "เรียก เก็บ เงิน",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "แหล่งข้อมูล",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "ทั่วไป",
"settings.integrations": "บูรณาการ",
"settings.language": "ภาษา",
"settings.members": "สมาชิก",
"settings.plugin": "ปลั๊กอิน",
"settings.provider": "ผู้ให้บริการโมเดล",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "พื้นที่",
"settings.workspaceSettings": "การตั้งค่าพื้นที่ทำงาน",
"tag.addNew": "เพิ่มแท็กใหม่",
"tag.addTag": "เพิ่มแท็ก",
"tag.create": "สร้าง",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Yapılandır",
"modelProvider.configLoadBalancing": "Yük Dengelemeyi Yapılandır",
"modelProvider.configureTip": "Api-key'i ayarlayın veya kullanmak için model ekleyin",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "silme onayı?",
"modelProvider.credits": "Mesaj Kredileri",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Varsayılan Yapılandırma",
"modelProvider.deprecated": "Kullanım dışı",
"modelProvider.discoverMore": "Daha fazlasını keşfedin",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "{{model}} için model bulunamadı",
"modelProvider.noneConfigured": "Uygulamaları çalıştırmak için varsayılan bir sistem modeli yapılandırın",
"modelProvider.notConfigured": "Sistem modeli henüz tam olarak yapılandırılmadı ve bazı işlevler kullanılamayabilir.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "PARAMETRELER",
"modelProvider.parametersInvalidRemoved": "Bazı parametreler geçersizdir ve kaldırılmıştır.",
"modelProvider.priorityUsing": "Öncelikli Kullanım",
"modelProvider.providerManaged": "Sağlayıcı tarafından yönetilen",
"modelProvider.providerManagedDescription": "Model sağlayıcı tarafından sağlanan tek bir kimlik bilgisi grubunu kullanın.",
"modelProvider.quota": "Kota",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Kalan kullanılabilir ücretsiz tokenler",
"modelProvider.rerankModel.key": "Yeniden Sıralama Modeli",
"modelProvider.rerankModel.tip": "Yeniden sıralama modeli, kullanıcı sorgusuyla anlam eşleştirmesine dayalı olarak aday belge listesini yeniden sıralayacak ve anlam sıralama sonuçlarını iyileştirecektir.",
@ -628,16 +633,25 @@
"provider.validating": "Anahtar doğrulanıyor...",
"settings.account": "Hesabım",
"settings.accountGroup": "HESAP",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API Uzantısı",
"settings.billing": "Faturalandırma",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Veri Kaynağı",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "GENEL",
"settings.integrations": "Entegrasyonlar",
"settings.language": "Dil",
"settings.members": "Üyeler",
"settings.plugin": "Eklentiler",
"settings.provider": "Model Sağlayıcı",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "ÇALIŞMA ALANI",
"settings.workspaceSettings": "Çalışma alanı ayarları",
"tag.addNew": "Yeni etiket ekle",
"tag.addTag": "Etiket ekle",
"tag.create": "Oluştur",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Налаштування",
"modelProvider.configLoadBalancing": "Балансування навантаження конфігурації",
"modelProvider.configureTip": "Налаштуйте api-ключ або додайте модель для використання",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "підтвердити видалення?",
"modelProvider.credits": "Кредити повідомлень",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Конфігурація за замовчуванням",
"modelProvider.deprecated": "Застарілий",
"modelProvider.discoverMore": "Відкрийте для себе більше в",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Модель для {{model}} не знайдено",
"modelProvider.noneConfigured": "Налаштуйте системну модель за замовчуванням для запуску застосунків",
"modelProvider.notConfigured": "Системну модель ще не повністю налаштовано, і деякі функції можуть бути недоступні.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "ПАРАМЕТРИ",
"modelProvider.parametersInvalidRemoved": "Деякі параметри є недійсними і були видалені",
"modelProvider.priorityUsing": "Пріоритезувати використання",
"modelProvider.providerManaged": "Під управлінням провайдера",
"modelProvider.providerManagedDescription": "Використовуйте єдиний набір облікових даних, наданий постачальником моделі.",
"modelProvider.quota": "Квота",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Залишилося доступних безкоштовних токенів",
"modelProvider.rerankModel.key": "Модель повторного ранжування",
"modelProvider.rerankModel.tip": "Модель повторного ранжування змінить порядок списку документів-кандидатів на основі семантичної відповідності запиту користувача, покращуючи результати семантичного ранжування.",
@ -628,16 +633,25 @@
"provider.validating": "Перевірка ключа...",
"settings.account": "Мій обліковий запис",
"settings.accountGroup": "ОБЛІКОВИЙ ЗАПИС",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Розширення API",
"settings.billing": "Виставлення рахунків",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Джерело даних",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "ЗАГАЛЬНЕ",
"settings.integrations": "Інтеграції",
"settings.language": "Мова",
"settings.members": "Учасники",
"settings.plugin": "Плагіни",
"settings.provider": "Постачальник моделі",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "РОБОЧИЙ ПРОСТІР",
"settings.workspaceSettings": "Налаштування робочого простору",
"tag.addNew": "Додати новий тег",
"tag.addTag": "додати тег",
"tag.create": "Створити",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "Cấu hình",
"modelProvider.configLoadBalancing": "Cấu hình cân bằng tải",
"modelProvider.configureTip": "Thiết lập api-key hoặc thêm mô hình để sử dụng",
"modelProvider.configuredProviders": "Configured providers",
"modelProvider.confirmDelete": "Xác nhận xóa?",
"modelProvider.credits": "Tín dụng Tin nhắn",
"modelProvider.creditsBackedProviders": "Available with Message Credits",
"modelProvider.creditsBackedProvidersDesc": "These providers work with your Message Credits — no API key needed.",
"modelProvider.defaultConfig": "Cấu hình mặc định",
"modelProvider.deprecated": "Đã lỗi thời",
"modelProvider.discoverMore": "Khám phá thêm trong",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "Không tìm thấy mô hình cho {{model}}",
"modelProvider.noneConfigured": "Cấu hình mô hình hệ thống mặc định để chạy ứng dụng",
"modelProvider.notConfigured": "Mô hình hệ thống vẫn chưa được cấu hình hoàn toàn và một số chức năng có thể không khả dụng.",
"modelProvider.pageDesc": "Choose a language model to power your apps. You need at least one configured before building in Studio.",
"modelProvider.parameters": "THAM SỐ",
"modelProvider.parametersInvalidRemoved": "Một số tham số không hợp lệ và đã được loại bỏ",
"modelProvider.priorityUsing": "Ưu tiên sử dụng",
"modelProvider.providerManaged": "Nhà cung cấp được quản lý",
"modelProvider.providerManagedDescription": "Sử dụng bộ thông tin đăng nhập duy nhất do nhà cung cấp mô hình cung cấp.",
"modelProvider.quota": "Hạn mức",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "Số lượng mã thông báo miễn phí còn lại",
"modelProvider.rerankModel.key": "Mô hình Sắp xếp lại",
"modelProvider.rerankModel.tip": "Mô hình sắp xếp lại sẽ sắp xếp lại danh sách tài liệu ứng cử viên dựa trên sự phù hợp ngữ nghĩa với truy vấn của người dùng, cải thiện kết quả của việc xếp hạng ngữ nghĩa",
@ -628,16 +633,25 @@
"provider.validating": "Đang xác minh khóa...",
"settings.account": "Tài khoản của tôi",
"settings.accountGroup": "TÀI KHOẢN",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "Mở rộng dựa trên API",
"settings.billing": "Thanh toán",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "Nguồn dữ liệu",
"settings.discoverMoreIntegrationsInMarketplace": "Discover more integrations in the Marketplace",
"settings.expand": "Expand",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "TỔNG QUÁT",
"settings.integrations": "Tích hợp",
"settings.language": "Ngôn ngữ",
"settings.members": "Thành viên",
"settings.plugin": "Plugins",
"settings.provider": "Nhà cung cấp mô hình",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "KHÔNG GIAN LÀM VIỆC",
"settings.workspaceSettings": "Cài đặt không gian làm việc",
"tag.addNew": "Thêm thẻ mới",
"tag.addTag": "thêm thẻ",
"tag.create": "Tạo",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "配置",
"modelProvider.configLoadBalancing": "设置负载均衡",
"modelProvider.configureTip": "请配置 API 密钥,添加模型。",
"modelProvider.configuredProviders": "已配置供应商",
"modelProvider.confirmDelete": "确认删除?",
"modelProvider.credits": "消息额度",
"modelProvider.creditsBackedProviders": "可使用消息额度",
"modelProvider.creditsBackedProvidersDesc": "这些供应商可使用你的消息额度,无需 API Key。",
"modelProvider.defaultConfig": "默认配置",
"modelProvider.deprecated": "已弃用",
"modelProvider.discoverMore": "发现更多就在",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "找不到模型 {{model}}",
"modelProvider.noneConfigured": "配置默认系统模型以运行应用",
"modelProvider.notConfigured": "系统模型尚未完全配置",
"modelProvider.pageDesc": "选择一个语言模型为你的应用提供能力。在 Studio 中构建应用前,至少需要配置一个模型。",
"modelProvider.parameters": "参数",
"modelProvider.parametersInvalidRemoved": "部分参数无效,已移除",
"modelProvider.priorityUsing": "优先使用",
"modelProvider.providerManaged": "由模型供应商管理",
"modelProvider.providerManagedDescription": "使用模型供应商提供的单组凭据",
"modelProvider.quota": "AI Credits",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "剩余免费额度",
"modelProvider.rerankModel.key": "Rerank 模型",
"modelProvider.rerankModel.tip": "重排序模型将根据候选文档列表与用户问题语义匹配度进行重新排序,从而改进语义排序的结果",
@ -628,16 +633,25 @@
"provider.validating": "验证密钥中...",
"settings.account": "我的账户",
"settings.accountGroup": "通用",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API 扩展",
"settings.billing": "账单",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "数据来源",
"settings.discoverMoreIntegrationsInMarketplace": "在 Marketplace 发现更多集成",
"settings.expand": "展开",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "通用",
"settings.integrations": "集成",
"settings.language": "语言",
"settings.members": "成员",
"settings.plugin": "插件",
"settings.provider": "模型供应商",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "工作空间",
"settings.workspaceSettings": "工作空间设置",
"tag.addNew": "创建新标签",
"tag.addTag": "添加标签",
"tag.create": "创建",

View File

@ -407,8 +407,11 @@
"modelProvider.config": "配置",
"modelProvider.configLoadBalancing": "配置負載均衡",
"modelProvider.configureTip": "設置 api-key 或新增要使用的模型",
"modelProvider.configuredProviders": "已配置供應商",
"modelProvider.confirmDelete": "確認刪除?",
"modelProvider.credits": "訊息額度",
"modelProvider.creditsBackedProviders": "可使用訊息額度",
"modelProvider.creditsBackedProvidersDesc": "這些供應商可使用你的訊息額度,無需 API Key。",
"modelProvider.defaultConfig": "默認配置",
"modelProvider.deprecated": "已棄用",
"modelProvider.discoverMore": "發現更多",
@ -443,12 +446,14 @@
"modelProvider.noModelFound": "找不到模型 {{model}}",
"modelProvider.noneConfigured": "配置預設系統模型以執行應用",
"modelProvider.notConfigured": "系統模型尚未完全配置,部分功能可能無法使用。",
"modelProvider.pageDesc": "選擇一個語言模型為你的應用提供能力。在 Studio 中構建應用前,至少需要配置一個模型。",
"modelProvider.parameters": "引數",
"modelProvider.parametersInvalidRemoved": "一些參數無效,已被移除",
"modelProvider.priorityUsing": "優先使用",
"modelProvider.providerManaged": "提供者管理",
"modelProvider.providerManagedDescription": "使用模型提供程式提供的單組憑證。",
"modelProvider.quota": "額度",
"modelProvider.quotaLabel": "QUOTA",
"modelProvider.quotaTip": "剩餘免費額度",
"modelProvider.rerankModel.key": "Rerank 模型",
"modelProvider.rerankModel.tip": "重排序模型將根據候選文件列表與使用者問題語義匹配度進行重新排序,從而改進語義排序的結果",
@ -628,16 +633,25 @@
"provider.validating": "驗證金鑰中...",
"settings.account": "我的賬戶",
"settings.accountGroup": "賬戶",
"settings.agentStrategy": "Agent strategy",
"settings.apiBasedExtension": "API 擴充套件",
"settings.billing": "賬單",
"settings.collapse": "Collapse",
"settings.customTool": "Custom Tool",
"settings.dataSource": "資料來源",
"settings.discoverMoreIntegrationsInMarketplace": "在 Marketplace 探索更多整合",
"settings.expand": "展開",
"settings.extension": "Extension",
"settings.filter": "Filter",
"settings.generalGroup": "常規",
"settings.integrations": "整合",
"settings.language": "語言",
"settings.members": "成員",
"settings.plugin": "外掛",
"settings.provider": "模型供應商",
"settings.trigger": "Trigger",
"settings.workplaceGroup": "工作空間",
"settings.workspaceSettings": "工作空間設定",
"tag.addNew": "建立新標籤",
"tag.addTag": "新增標籤",
"tag.create": "建立",