mirror of
https://github.com/langgenius/dify.git
synced 2024-11-16 11:42:29 +08:00
Merge branch 'fix/chore-fix' into dev/plugin-deploy
This commit is contained in:
commit
6da877c6a6
54
.github/pull_request_template.md
vendored
54
.github/pull_request_template.md
vendored
|
@ -1,34 +1,32 @@
|
||||||
# Checklist:
|
# Summary
|
||||||
|
|
||||||
|
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
|
||||||
|
|
||||||
|
> [!Tip]
|
||||||
|
> Close issue syntax: `Fixes #<issue number>` or `Resolves #<issue number>`, see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) for more details.
|
||||||
|
|
||||||
|
|
||||||
|
# Screenshots
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Before: </td>
|
||||||
|
<td>After: </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>...</td>
|
||||||
|
<td>...</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
# Checklist
|
||||||
|
|
||||||
> [!IMPORTANT]
|
> [!IMPORTANT]
|
||||||
> Please review the checklist below before submitting your pull request.
|
> Please review the checklist below before submitting your pull request.
|
||||||
|
|
||||||
- [ ] Please open an issue before creating a PR or link to an existing issue
|
|
||||||
- [ ] I have performed a self-review of my own code
|
|
||||||
- [ ] I have commented my code, particularly in hard-to-understand areas
|
|
||||||
- [ ] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
|
|
||||||
|
|
||||||
# Description
|
|
||||||
|
|
||||||
Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue. Close issue syntax: `Fixes #<issue number>`, see [documentation](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) for more details.
|
|
||||||
|
|
||||||
Fixes
|
|
||||||
|
|
||||||
## Type of Change
|
|
||||||
|
|
||||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
|
||||||
- [ ] New feature (non-breaking change which adds functionality)
|
|
||||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
||||||
- [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs)
|
- [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs)
|
||||||
- [ ] Improvement, including but not limited to code refactoring, performance optimization, and UI/UX improvement
|
- [x] I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
|
||||||
- [ ] Dependency upgrade
|
- [x] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
|
||||||
|
- [x] I've updated the documentation accordingly.
|
||||||
# Testing Instructions
|
- [x] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
|
||||||
|
|
||||||
Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration
|
|
||||||
|
|
||||||
- [ ] Test A
|
|
||||||
- [ ] Test B
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="join Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="join Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="join Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat en Discord"></a>
|
alt="chat en Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="join Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="seguir en X(Twitter)"></a>
|
alt="seguir en X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat sur Discord"></a>
|
alt="chat sur Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="join Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="suivre sur X(Twitter)"></a>
|
alt="suivre sur X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="Discordでチャット"></a>
|
alt="Discordでチャット"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="X(Twitter)でフォロー"></a>
|
alt="X(Twitter)でフォロー"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Follow Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Follow Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
|
@ -19,6 +19,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat on Discord"></a>
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Follow Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="follow on X(Twitter)"></a>
|
alt="follow on X(Twitter)"></a>
|
||||||
|
|
180
README_SI.md
Normal file
180
README_SI.md
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
![cover-v5-optimized](https://github.com/langgenius/dify/assets/13230914/f9e19af5-61ba-4119-b926-d10c4c06ebab)
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
📌 <a href="https://dify.ai/blog/introducing-dify-workflow-file-upload-a-demo-on-ai-podcast">Predstavljamo nalaganje datotek Dify Workflow: znova ustvarite Google NotebookLM Podcast</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://cloud.dify.ai">Dify Cloud</a> ·
|
||||||
|
<a href="https://docs.dify.ai/getting-started/install-self-hosted">Samostojno gostovanje</a> ·
|
||||||
|
<a href="https://docs.dify.ai">Dokumentacija</a> ·
|
||||||
|
<a href="https://udify.app/chat/22L1zSxg6yW1cWQg">Povpraševanje za podjetja</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://dify.ai" target="_blank">
|
||||||
|
<img alt="Static Badge" src="https://img.shields.io/badge/Product-F04438"></a>
|
||||||
|
<a href="https://dify.ai/pricing" target="_blank">
|
||||||
|
<img alt="Static Badge" src="https://img.shields.io/badge/free-pricing?logo=free&color=%20%23155EEF&label=pricing&labelColor=%20%23528bff"></a>
|
||||||
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
|
alt="chat on Discord"></a>
|
||||||
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
|
alt="follow on X(Twitter)"></a>
|
||||||
|
<a href="https://hub.docker.com/u/langgenius" target="_blank">
|
||||||
|
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/langgenius/dify-web?labelColor=%20%23FDB062&color=%20%23f79009"></a>
|
||||||
|
<a href="https://github.com/langgenius/dify/graphs/commit-activity" target="_blank">
|
||||||
|
<img alt="Commits last month" src="https://img.shields.io/github/commit-activity/m/langgenius/dify?labelColor=%20%2332b583&color=%20%2312b76a"></a>
|
||||||
|
<a href="https://github.com/langgenius/dify/" target="_blank">
|
||||||
|
<img alt="Issues closed" src="https://img.shields.io/github/issues-search?query=repo%3Alanggenius%2Fdify%20is%3Aclosed&label=issues%20closed&labelColor=%20%237d89b0&color=%20%235d6b98"></a>
|
||||||
|
<a href="https://github.com/langgenius/dify/discussions/" target="_blank">
|
||||||
|
<img alt="Discussion posts" src="https://img.shields.io/github/discussions/langgenius/dify?labelColor=%20%239b8afb&color=%20%237a5af8"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="./README.md"><img alt="README in English" src="https://img.shields.io/badge/English-d9d9d9"></a>
|
||||||
|
<a href="./README_CN.md"><img alt="简体中文版自述文件" src="https://img.shields.io/badge/简体中文-d9d9d9"></a>
|
||||||
|
<a href="./README_JA.md"><img alt="日本語のREADME" src="https://img.shields.io/badge/日本語-d9d9d9"></a>
|
||||||
|
<a href="./README_ES.md"><img alt="README en Español" src="https://img.shields.io/badge/Español-d9d9d9"></a>
|
||||||
|
<a href="./README_FR.md"><img alt="README en Français" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||||
|
<a href="./README_KL.md"><img alt="README tlhIngan Hol" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||||
|
<a href="./README_KR.md"><img alt="README in Korean" src="https://img.shields.io/badge/한국어-d9d9d9"></a>
|
||||||
|
<a href="./README_AR.md"><img alt="README بالعربية" src="https://img.shields.io/badge/العربية-d9d9d9"></a>
|
||||||
|
<a href="./README_TR.md"><img alt="Türkçe README" src="https://img.shields.io/badge/Türkçe-d9d9d9"></a>
|
||||||
|
<a href="./README_VI.md"><img alt="README Tiếng Việt" src="https://img.shields.io/badge/Ti%E1%BA%BFng%20Vi%E1%BB%87t-d9d9d9"></a>
|
||||||
|
<a href="./README_SI.md"><img alt="README Slovenščina" src="https://img.shields.io/badge/Sloven%C5%A1%C4%8Dina-d9d9d9"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
Dify je odprtokodna platforma za razvoj aplikacij LLM. Njegov intuitivni vmesnik združuje agentski potek dela z umetno inteligenco, cevovod RAG, zmogljivosti agentov, upravljanje modelov, funkcije opazovanja in več, kar vam omogoča hiter prehod od prototipa do proizvodnje.
|
||||||
|
|
||||||
|
## Hitri začetek
|
||||||
|
> Preden namestite Dify, se prepričajte, da vaša naprava izpolnjuje naslednje minimalne sistemske zahteve:
|
||||||
|
>
|
||||||
|
>- CPU >= 2 Core
|
||||||
|
>- RAM >= 4 GiB
|
||||||
|
|
||||||
|
</br>
|
||||||
|
|
||||||
|
Najlažji način za zagon strežnika Dify je prek docker compose . Preden zaženete Dify z naslednjimi ukazi, se prepričajte, da sta Docker in Docker Compose nameščena na vašem računalniku:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd dify
|
||||||
|
cd docker
|
||||||
|
cp .env.example .env
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Po zagonu lahko dostopate do nadzorne plošče Dify v brskalniku na [http://localhost/install](http://localhost/install) in začnete postopek inicializacije.
|
||||||
|
|
||||||
|
#### Iskanje pomoči
|
||||||
|
Prosimo, glejte naša pogosta vprašanja [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs) če naletite na težave pri nastavitvi Dify. Če imate še vedno težave, se obrnite na [skupnost ali nas](#community--contact).
|
||||||
|
|
||||||
|
> Če želite prispevati k Difyju ali narediti dodaten razvoj, glejte naš vodnik za [uvajanje iz izvorne kode](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code)
|
||||||
|
|
||||||
|
## Ključne značilnosti
|
||||||
|
**1. Potek dela**:
|
||||||
|
Zgradite in preizkusite zmogljive poteke dela AI na vizualnem platnu, pri čemer izkoristite vse naslednje funkcije in več.
|
||||||
|
|
||||||
|
|
||||||
|
https://github.com/langgenius/dify/assets/13230914/356df23e-1604-483d-80a6-9517ece318aa
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**2. Celovita podpora za modele**:
|
||||||
|
Brezhibna integracija s stotinami lastniških/odprtokodnih LLM-jev ducatov ponudnikov sklepanja in samostojnih rešitev, ki pokrivajo GPT, Mistral, Llama3 in vse modele, združljive z API-jem OpenAI. Celoten seznam podprtih ponudnikov modelov najdete [tukaj](https://docs.dify.ai/getting-started/readme/model-providers).
|
||||||
|
|
||||||
|
![providers-v5](https://github.com/langgenius/dify/assets/13230914/5a17bdbe-097a-4100-8363-40255b70f6e3)
|
||||||
|
|
||||||
|
|
||||||
|
**3. Prompt IDE**:
|
||||||
|
intuitivni vmesnik za ustvarjanje pozivov, primerjavo zmogljivosti modela in dodajanje dodatnih funkcij, kot je pretvorba besedila v govor, aplikaciji, ki temelji na klepetu.
|
||||||
|
|
||||||
|
**4. RAG Pipeline**:
|
||||||
|
E Obsežne zmogljivosti RAG, ki pokrivajo vse od vnosa dokumenta do priklica, s podporo za ekstrakcijo besedila iz datotek PDF, PPT in drugih običajnih formatov dokumentov.
|
||||||
|
|
||||||
|
**5. Agent capabilities**:
|
||||||
|
definirate lahko agente, ki temeljijo na klicanju funkcij LLM ali ReAct, in dodate vnaprej izdelana orodja ali orodja po meri za agenta. Dify ponuja več kot 50 vgrajenih orodij za agente AI, kot so Google Search, DALL·E, Stable Diffusion in WolframAlpha.
|
||||||
|
|
||||||
|
**6. LLMOps**:
|
||||||
|
Spremljajte in analizirajte dnevnike aplikacij in učinkovitost skozi čas. Pozive, nabore podatkov in modele lahko nenehno izboljšujete na podlagi proizvodnih podatkov in opomb.
|
||||||
|
|
||||||
|
**7. Backend-as-a-Service**:
|
||||||
|
AVse ponudbe Difyja so opremljene z ustreznimi API-ji, tako da lahko Dify brez težav integrirate v svojo poslovno logiko.
|
||||||
|
|
||||||
|
|
||||||
|
## Uporaba Dify
|
||||||
|
|
||||||
|
- **Cloud </br>**
|
||||||
|
Gostimo storitev Dify Cloud za vsakogar, ki jo lahko preizkusite brez nastavitev. Zagotavlja vse zmožnosti različice za samostojno namestitev in vključuje 200 brezplačnih klicev GPT-4 v načrtu peskovnika.
|
||||||
|
|
||||||
|
- **Self-hosting Dify Community Edition</br>**
|
||||||
|
Hitro zaženite Dify v svojem okolju s tem [začetnim vodnikom](#quick-start) . Za dodatne reference in podrobnejša navodila uporabite našo [dokumentacijo](https://docs.dify.ai) .
|
||||||
|
|
||||||
|
|
||||||
|
- **Dify za podjetja/organizacije</br>**
|
||||||
|
Ponujamo dodatne funkcije, osredotočene na podjetja. Zabeležite svoja vprašanja prek tega klepetalnega robota ali nam pošljite e-pošto, da se pogovorimo o potrebah podjetja. </br>
|
||||||
|
> Za novoustanovljena podjetja in mala podjetja, ki uporabljajo AWS, si oglejte Dify Premium na AWS Marketplace in ga z enim klikom uvedite v svoj AWS VPC. To je cenovno ugodna ponudba AMI z možnostjo ustvarjanja aplikacij z logotipom in blagovno znamko po meri.
|
||||||
|
|
||||||
|
|
||||||
|
## Staying ahead
|
||||||
|
|
||||||
|
Star Dify on GitHub and be instantly notified of new releases.
|
||||||
|
|
||||||
|
![star-us](https://github.com/langgenius/dify/assets/13230914/b823edc1-6388-4e25-ad45-2f6b187adbb4)
|
||||||
|
|
||||||
|
|
||||||
|
## Napredne nastavitve
|
||||||
|
|
||||||
|
Če morate prilagoditi konfiguracijo, si oglejte komentarje v naši datoteki .env.example in posodobite ustrezne vrednosti v svoji .env datoteki. Poleg tega boste morda morali prilagoditi docker-compose.yamlsamo datoteko, na primer spremeniti različice slike, preslikave vrat ali namestitve nosilca, glede na vaše specifično okolje in zahteve za uvajanje. Po kakršnih koli spremembah ponovno zaženite docker-compose up -d. Celoten seznam razpoložljivih spremenljivk okolja najdete tukaj .
|
||||||
|
|
||||||
|
Če želite konfigurirati visoko razpoložljivo nastavitev, so na voljo Helm Charts in datoteke YAML, ki jih prispeva skupnost, ki omogočajo uvedbo Difyja v Kubernetes.
|
||||||
|
|
||||||
|
- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify)
|
||||||
|
- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm)
|
||||||
|
- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes)
|
||||||
|
|
||||||
|
#### Uporaba Terraform za uvajanje
|
||||||
|
|
||||||
|
namestite Dify v Cloud Platform z enim klikom z uporabo [terraform](https://www.terraform.io/)
|
||||||
|
|
||||||
|
##### Azure Global
|
||||||
|
- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform)
|
||||||
|
|
||||||
|
##### Google Cloud
|
||||||
|
- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform)
|
||||||
|
|
||||||
|
## Prispevam
|
||||||
|
|
||||||
|
Za tiste, ki bi radi prispevali kodo, si oglejte naš vodnik za prispevke . Hkrati vas prosimo, da podprete Dify tako, da ga delite na družbenih medijih ter na dogodkih in konferencah.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> Iščemo sodelavce za pomoč pri prevajanju Difyja v jezike, ki niso mandarinščina ali angleščina. Če želite pomagati, si oglejte i18n README za več informacij in nam pustite komentar v global-userskanalu našega strežnika skupnosti Discord .
|
||||||
|
|
||||||
|
## Skupnost in stik
|
||||||
|
|
||||||
|
* [Github Discussion](https://github.com/langgenius/dify/discussions). Najboljše za: izmenjavo povratnih informacij in postavljanje vprašanj.
|
||||||
|
* [GitHub Issues](https://github.com/langgenius/dify/issues). Najboljše za: hrošče, na katere naletite pri uporabi Dify.AI, in predloge funkcij. Oglejte si naš [vodnik za prispevke](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md).
|
||||||
|
* [Discord](https://discord.gg/FngNHpbcY7). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo.
|
||||||
|
* [X(Twitter)](https://twitter.com/dify_ai). Najboljše za: deljenje vaših aplikacij in druženje s skupnostjo.
|
||||||
|
|
||||||
|
**Contributors**
|
||||||
|
|
||||||
|
<a href="https://github.com/langgenius/dify/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=langgenius/dify" />
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Star history
|
||||||
|
|
||||||
|
[![Star History Chart](https://api.star-history.com/svg?repos=langgenius/dify&type=Date)](https://star-history.com/#langgenius/dify&Date)
|
||||||
|
|
||||||
|
|
||||||
|
## Varnostno razkritje
|
||||||
|
|
||||||
|
Zaradi zaščite vaše zasebnosti se izogibajte objavljanju varnostnih vprašanj na GitHub. Namesto tega pošljite vprašanja na security@dify.ai in zagotovili vam bomo podrobnejši odgovor.
|
||||||
|
|
||||||
|
## Licenca
|
||||||
|
|
||||||
|
To skladišče je na voljo pod [odprtokodno licenco Dify](LICENSE) , ki je v bistvu Apache 2.0 z nekaj dodatnimi omejitvami.
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="Discord'da sohbet et"></a>
|
alt="Discord'da sohbet et"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Follow Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="X(Twitter)'da takip et"></a>
|
alt="X(Twitter)'da takip et"></a>
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||||
alt="chat trên Discord"></a>
|
alt="chat trên Discord"></a>
|
||||||
|
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||||
|
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||||
|
alt="Follow Reddit"></a>
|
||||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||||
alt="theo dõi trên X(Twitter)"></a>
|
alt="theo dõi trên X(Twitter)"></a>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
from configs import dify_config
|
from configs import dify_config
|
||||||
|
|
||||||
|
@ -29,6 +30,9 @@ from models import account, dataset, model, source, task, tool, tools, web # no
|
||||||
|
|
||||||
# DO NOT REMOVE ABOVE
|
# DO NOT REMOVE ABOVE
|
||||||
|
|
||||||
|
if sys.version_info[:2] == (3, 10):
|
||||||
|
print("Warning: Python 3.10 will not be supported in the next version.")
|
||||||
|
|
||||||
|
|
||||||
warnings.simplefilter("ignore", ResourceWarning)
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
|
||||||
|
@ -49,7 +53,6 @@ if dify_config.TESTING:
|
||||||
@app.after_request
|
@app.after_request
|
||||||
def after_request(response):
|
def after_request(response):
|
||||||
"""Add Version headers to the response."""
|
"""Add Version headers to the response."""
|
||||||
response.set_cookie("remember_token", "", expires=0)
|
|
||||||
response.headers.add("X-Version", dify_config.CURRENT_VERSION)
|
response.headers.add("X-Version", dify_config.CURRENT_VERSION)
|
||||||
response.headers.add("X-Env", dify_config.DEPLOY_ENV)
|
response.headers.add("X-Env", dify_config.DEPLOY_ENV)
|
||||||
return response
|
return response
|
||||||
|
|
|
@ -9,7 +9,7 @@ class PackagingInfo(BaseSettings):
|
||||||
|
|
||||||
CURRENT_VERSION: str = Field(
|
CURRENT_VERSION: str = Field(
|
||||||
description="Dify version",
|
description="Dify version",
|
||||||
default="0.11.0",
|
default="0.11.1",
|
||||||
)
|
)
|
||||||
|
|
||||||
COMMIT_SHA: str = Field(
|
COMMIT_SHA: str = Field(
|
||||||
|
|
|
@ -17,6 +17,7 @@ language_timezone_mapping = {
|
||||||
"hi-IN": "Asia/Kolkata",
|
"hi-IN": "Asia/Kolkata",
|
||||||
"tr-TR": "Europe/Istanbul",
|
"tr-TR": "Europe/Istanbul",
|
||||||
"fa-IR": "Asia/Tehran",
|
"fa-IR": "Asia/Tehran",
|
||||||
|
"sl-SI": "Europe/Ljubljana",
|
||||||
}
|
}
|
||||||
|
|
||||||
languages = list(language_timezone_mapping.keys())
|
languages = list(language_timezone_mapping.keys())
|
||||||
|
|
|
@ -361,6 +361,7 @@ class WorkflowBasedAppRunner(AppRunner):
|
||||||
node_run_index=workflow_entry.graph_engine.graph_runtime_state.node_run_steps,
|
node_run_index=workflow_entry.graph_engine.graph_runtime_state.node_run_steps,
|
||||||
output=event.pre_iteration_output,
|
output=event.pre_iteration_output,
|
||||||
parallel_mode_run_id=event.parallel_mode_run_id,
|
parallel_mode_run_id=event.parallel_mode_run_id,
|
||||||
|
duration=event.duration,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
elif isinstance(event, (IterationRunSucceededEvent | IterationRunFailedEvent)):
|
elif isinstance(event, (IterationRunSucceededEvent | IterationRunFailedEvent)):
|
||||||
|
|
|
@ -111,6 +111,7 @@ class QueueIterationNextEvent(AppQueueEvent):
|
||||||
"""iteratoin run in parallel mode run id"""
|
"""iteratoin run in parallel mode run id"""
|
||||||
node_run_index: int
|
node_run_index: int
|
||||||
output: Optional[Any] = None # output for the current iteration
|
output: Optional[Any] = None # output for the current iteration
|
||||||
|
duration: Optional[float] = None
|
||||||
|
|
||||||
@field_validator("output", mode="before")
|
@field_validator("output", mode="before")
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -307,6 +308,8 @@ class QueueNodeSucceededEvent(AppQueueEvent):
|
||||||
execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
|
execution_metadata: Optional[dict[NodeRunMetadataKey, Any]] = None
|
||||||
|
|
||||||
error: Optional[str] = None
|
error: Optional[str] = None
|
||||||
|
"""single iteration duration map"""
|
||||||
|
iteration_duration_map: Optional[dict[str, float]] = None
|
||||||
|
|
||||||
|
|
||||||
class QueueNodeInIterationFailedEvent(AppQueueEvent):
|
class QueueNodeInIterationFailedEvent(AppQueueEvent):
|
||||||
|
|
|
@ -434,6 +434,7 @@ class IterationNodeNextStreamResponse(StreamResponse):
|
||||||
parallel_id: Optional[str] = None
|
parallel_id: Optional[str] = None
|
||||||
parallel_start_node_id: Optional[str] = None
|
parallel_start_node_id: Optional[str] = None
|
||||||
parallel_mode_run_id: Optional[str] = None
|
parallel_mode_run_id: Optional[str] = None
|
||||||
|
duration: Optional[float] = None
|
||||||
|
|
||||||
event: StreamEvent = StreamEvent.ITERATION_NEXT
|
event: StreamEvent = StreamEvent.ITERATION_NEXT
|
||||||
workflow_run_id: str
|
workflow_run_id: str
|
||||||
|
|
|
@ -624,6 +624,7 @@ class WorkflowCycleManage:
|
||||||
parallel_id=event.parallel_id,
|
parallel_id=event.parallel_id,
|
||||||
parallel_start_node_id=event.parallel_start_node_id,
|
parallel_start_node_id=event.parallel_start_node_id,
|
||||||
parallel_mode_run_id=event.parallel_mode_run_id,
|
parallel_mode_run_id=event.parallel_mode_run_id,
|
||||||
|
duration=event.duration,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
model: Qwen2.5-72B-Instruct
|
||||||
|
label:
|
||||||
|
zh_Hans: Qwen2.5-72B-Instruct
|
||||||
|
en_US: Qwen2.5-72B-Instruct
|
||||||
|
model_type: llm
|
||||||
|
features:
|
||||||
|
- agent-thought
|
||||||
|
- tool-call
|
||||||
|
- stream-tool-call
|
||||||
|
model_properties:
|
||||||
|
mode: chat
|
||||||
|
context_size: 32768
|
||||||
|
parameter_rules:
|
||||||
|
- name: max_tokens
|
||||||
|
use_template: max_tokens
|
||||||
|
label:
|
||||||
|
en_US: "Max Tokens"
|
||||||
|
zh_Hans: "最大Token数"
|
||||||
|
type: int
|
||||||
|
default: 512
|
||||||
|
min: 1
|
||||||
|
required: true
|
||||||
|
help:
|
||||||
|
en_US: "The maximum number of tokens that can be generated by the model varies depending on the model."
|
||||||
|
zh_Hans: "模型可生成的最大 token 个数,不同模型上限不同。"
|
||||||
|
|
||||||
|
- name: temperature
|
||||||
|
use_template: temperature
|
||||||
|
label:
|
||||||
|
en_US: "Temperature"
|
||||||
|
zh_Hans: "采样温度"
|
||||||
|
type: float
|
||||||
|
default: 0.7
|
||||||
|
min: 0.0
|
||||||
|
max: 1.0
|
||||||
|
precision: 1
|
||||||
|
required: true
|
||||||
|
help:
|
||||||
|
en_US: "The randomness of the sampling temperature control output. The temperature value is within the range of [0.0, 1.0]. The higher the value, the more random and creative the output; the lower the value, the more stable it is. It is recommended to adjust either top_p or temperature parameters according to your needs to avoid adjusting both at the same time."
|
||||||
|
zh_Hans: "采样温度控制输出的随机性。温度值在 [0.0, 1.0] 范围内,值越高,输出越随机和创造性;值越低,输出越稳定。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。"
|
||||||
|
|
||||||
|
- name: top_p
|
||||||
|
use_template: top_p
|
||||||
|
label:
|
||||||
|
en_US: "Top P"
|
||||||
|
zh_Hans: "Top P"
|
||||||
|
type: float
|
||||||
|
default: 0.7
|
||||||
|
min: 0.0
|
||||||
|
max: 1.0
|
||||||
|
precision: 1
|
||||||
|
required: true
|
||||||
|
help:
|
||||||
|
en_US: "The value range of the sampling method is [0.0, 1.0]. The top_p value determines that the model selects tokens from the top p% of candidate words with the highest probability; when top_p is 0, this parameter is invalid. It is recommended to adjust either top_p or temperature parameters according to your needs to avoid adjusting both at the same time."
|
||||||
|
zh_Hans: "采样方法的取值范围为 [0.0,1.0]。top_p 值确定模型从概率最高的前p%的候选词中选取 tokens;当 top_p 为 0 时,此参数无效。建议根据需求调整 top_p 或 temperature 参数,避免同时调整两者。"
|
||||||
|
|
||||||
|
- name: top_k
|
||||||
|
use_template: top_k
|
||||||
|
label:
|
||||||
|
en_US: "Top K"
|
||||||
|
zh_Hans: "Top K"
|
||||||
|
type: int
|
||||||
|
default: 50
|
||||||
|
min: 0
|
||||||
|
max: 100
|
||||||
|
required: true
|
||||||
|
help:
|
||||||
|
en_US: "The value range is [0,100], which limits the model to only select from the top k words with the highest probability when choosing the next word at each step. The larger the value, the more diverse text generation will be."
|
||||||
|
zh_Hans: "取值范围为 [0,100],限制模型在每一步选择下一个词时,只从概率最高的前 k 个词中选取。数值越大,文本生成越多样。"
|
||||||
|
|
||||||
|
- name: frequency_penalty
|
||||||
|
use_template: frequency_penalty
|
||||||
|
label:
|
||||||
|
en_US: "Frequency Penalty"
|
||||||
|
zh_Hans: "频率惩罚"
|
||||||
|
type: float
|
||||||
|
default: 0
|
||||||
|
min: -1.0
|
||||||
|
max: 1.0
|
||||||
|
precision: 1
|
||||||
|
required: false
|
||||||
|
help:
|
||||||
|
en_US: "Used to adjust the frequency of repeated content in automatically generated text. Positive numbers reduce repetition, while negative numbers increase repetition. After setting this parameter, if a word has already appeared in the text, the model will decrease the probability of choosing that word for subsequent generation."
|
||||||
|
zh_Hans: "用于调整自动生成文本中重复内容的频率。正数减少重复,负数增加重复。设置此参数后,如果一个词在文本中已经出现过,模型在后续生成中选择该词的概率会降低。"
|
||||||
|
|
||||||
|
- name: user
|
||||||
|
use_template: text
|
||||||
|
label:
|
||||||
|
en_US: "User"
|
||||||
|
zh_Hans: "用户"
|
||||||
|
type: string
|
||||||
|
required: false
|
||||||
|
help:
|
||||||
|
en_US: "Used to track and differentiate conversation requests from different users."
|
||||||
|
zh_Hans: "用于追踪和区分不同用户的对话请求。"
|
|
@ -1,3 +1,4 @@
|
||||||
|
- Qwen2.5-72B-Instruct
|
||||||
- Qwen2-7B-Instruct
|
- Qwen2-7B-Instruct
|
||||||
- Qwen2-72B-Instruct
|
- Qwen2-72B-Instruct
|
||||||
- Yi-1.5-34B-Chat
|
- Yi-1.5-34B-Chat
|
||||||
|
|
|
@ -6,6 +6,7 @@ from core.model_runtime.entities.message_entities import (
|
||||||
PromptMessage,
|
PromptMessage,
|
||||||
PromptMessageTool,
|
PromptMessageTool,
|
||||||
)
|
)
|
||||||
|
from core.model_runtime.entities.model_entities import ModelFeature
|
||||||
from core.model_runtime.model_providers.openai_api_compatible.llm.llm import OAIAPICompatLargeLanguageModel
|
from core.model_runtime.model_providers.openai_api_compatible.llm.llm import OAIAPICompatLargeLanguageModel
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,14 +29,13 @@ class GiteeAILargeLanguageModel(OAIAPICompatLargeLanguageModel):
|
||||||
user: Optional[str] = None,
|
user: Optional[str] = None,
|
||||||
) -> Union[LLMResult, Generator]:
|
) -> Union[LLMResult, Generator]:
|
||||||
self._add_custom_parameters(credentials, model, model_parameters)
|
self._add_custom_parameters(credentials, model, model_parameters)
|
||||||
return super()._invoke(model, credentials, prompt_messages, model_parameters, tools, stop, stream)
|
return super()._invoke(model, credentials, prompt_messages, model_parameters, tools, stop, stream, user)
|
||||||
|
|
||||||
def validate_credentials(self, model: str, credentials: dict) -> None:
|
def validate_credentials(self, model: str, credentials: dict) -> None:
|
||||||
self._add_custom_parameters(credentials, model, None)
|
self._add_custom_parameters(credentials, model, None)
|
||||||
super().validate_credentials(model, credentials)
|
super().validate_credentials(model, credentials)
|
||||||
|
|
||||||
@staticmethod
|
def _add_custom_parameters(self, credentials: dict, model: str, model_parameters: dict) -> None:
|
||||||
def _add_custom_parameters(credentials: dict, model: str, model_parameters: dict) -> None:
|
|
||||||
if model is None:
|
if model is None:
|
||||||
model = "bge-large-zh-v1.5"
|
model = "bge-large-zh-v1.5"
|
||||||
|
|
||||||
|
@ -45,3 +45,7 @@ class GiteeAILargeLanguageModel(OAIAPICompatLargeLanguageModel):
|
||||||
credentials["mode"] = LLMMode.COMPLETION.value
|
credentials["mode"] = LLMMode.COMPLETION.value
|
||||||
else:
|
else:
|
||||||
credentials["mode"] = LLMMode.CHAT.value
|
credentials["mode"] = LLMMode.CHAT.value
|
||||||
|
|
||||||
|
schema = self.get_model_schema(model, credentials)
|
||||||
|
if ModelFeature.TOOL_CALL in schema.features or ModelFeature.MULTI_TOOL_CALL in schema.features:
|
||||||
|
credentials["function_calling_type"] = "tool_call"
|
||||||
|
|
|
@ -178,6 +178,7 @@ class ElasticSearchVector(BaseVector):
|
||||||
Field.VECTOR.value: { # Make sure the dimension is correct here
|
Field.VECTOR.value: { # Make sure the dimension is correct here
|
||||||
"type": "dense_vector",
|
"type": "dense_vector",
|
||||||
"dims": dim,
|
"dims": dim,
|
||||||
|
"index": True,
|
||||||
"similarity": "cosine",
|
"similarity": "cosine",
|
||||||
},
|
},
|
||||||
Field.METADATA_KEY.value: {
|
Field.METADATA_KEY.value: {
|
||||||
|
|
|
@ -50,9 +50,9 @@ class WordExtractor(BaseExtractor):
|
||||||
|
|
||||||
self.web_path = self.file_path
|
self.web_path = self.file_path
|
||||||
# TODO: use a better way to handle the file
|
# TODO: use a better way to handle the file
|
||||||
with tempfile.NamedTemporaryFile(delete=False) as self.temp_file:
|
self.temp_file = tempfile.NamedTemporaryFile() # noqa: SIM115
|
||||||
self.temp_file.write(r.content)
|
self.temp_file.write(r.content)
|
||||||
self.file_path = self.temp_file.name
|
self.file_path = self.temp_file.name
|
||||||
elif not os.path.isfile(self.file_path):
|
elif not os.path.isfile(self.file_path):
|
||||||
raise ValueError(f"File path {self.file_path} is not a valid file or url")
|
raise ValueError(f"File path {self.file_path} is not a valid file or url")
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from typing import Literal, Optional
|
from typing import Literal, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field, field_validator
|
||||||
|
|
||||||
from core.model_runtime.utils.encoders import jsonable_encoder
|
from core.model_runtime.utils.encoders import jsonable_encoder
|
||||||
from core.tools.__base.tool import ToolParameter
|
from core.tools.__base.tool import ToolParameter
|
||||||
|
@ -37,6 +37,11 @@ class ToolProviderApiEntity(BaseModel):
|
||||||
tools: list[ToolApiEntity] = Field(default_factory=list)
|
tools: list[ToolApiEntity] = Field(default_factory=list)
|
||||||
labels: list[str] = Field(default_factory=list)
|
labels: list[str] = Field(default_factory=list)
|
||||||
|
|
||||||
|
@field_validator("tools", mode="before")
|
||||||
|
@classmethod
|
||||||
|
def convert_none_to_empty_list(cls, v):
|
||||||
|
return v if v is not None else []
|
||||||
|
|
||||||
def to_dict(self) -> dict:
|
def to_dict(self) -> dict:
|
||||||
# -------------
|
# -------------
|
||||||
# overwrite tool parameter types for temp fix
|
# overwrite tool parameter types for temp fix
|
||||||
|
|
|
@ -698,7 +698,11 @@ class ToolManager:
|
||||||
"""
|
"""
|
||||||
get api provider
|
get api provider
|
||||||
"""
|
"""
|
||||||
provider_obj: ApiToolProvider | None = (
|
"""
|
||||||
|
get tool provider
|
||||||
|
"""
|
||||||
|
provider_name = provider
|
||||||
|
provider_obj: ApiToolProvider = (
|
||||||
db.session.query(ApiToolProvider)
|
db.session.query(ApiToolProvider)
|
||||||
.filter(
|
.filter(
|
||||||
ApiToolProvider.tenant_id == tenant_id,
|
ApiToolProvider.tenant_id == tenant_id,
|
||||||
|
@ -708,7 +712,7 @@ class ToolManager:
|
||||||
)
|
)
|
||||||
|
|
||||||
if provider_obj is None:
|
if provider_obj is None:
|
||||||
raise ValueError(f"you have not added provider {provider}")
|
raise ValueError(f"you have not added provider {provider_name}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
credentials = json.loads(provider_obj.credentials_str) or {}
|
credentials = json.loads(provider_obj.credentials_str) or {}
|
||||||
|
|
17
api/core/tools/utils/rag_web_reader.py
Normal file
17
api/core/tools/utils/rag_web_reader.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def get_image_upload_file_ids(content):
|
||||||
|
pattern = r"!\[image\]\((http?://.*?(file-preview|image-preview))\)"
|
||||||
|
matches = re.findall(pattern, content)
|
||||||
|
image_upload_file_ids = []
|
||||||
|
for match in matches:
|
||||||
|
if match[1] == "file-preview":
|
||||||
|
content_pattern = r"files/([^/]+)/file-preview"
|
||||||
|
else:
|
||||||
|
content_pattern = r"files/([^/]+)/image-preview"
|
||||||
|
content_match = re.search(content_pattern, match[0])
|
||||||
|
if content_match:
|
||||||
|
image_upload_file_id = content_match.group(1)
|
||||||
|
image_upload_file_ids.append(image_upload_file_id)
|
||||||
|
return image_upload_file_ids
|
|
@ -17,6 +17,7 @@ from .segments import (
|
||||||
from .types import SegmentType
|
from .types import SegmentType
|
||||||
from .variables import (
|
from .variables import (
|
||||||
ArrayAnyVariable,
|
ArrayAnyVariable,
|
||||||
|
ArrayFileVariable,
|
||||||
ArrayNumberVariable,
|
ArrayNumberVariable,
|
||||||
ArrayObjectVariable,
|
ArrayObjectVariable,
|
||||||
ArrayStringVariable,
|
ArrayStringVariable,
|
||||||
|
@ -58,4 +59,5 @@ __all__ = [
|
||||||
"ArrayStringSegment",
|
"ArrayStringSegment",
|
||||||
"FileSegment",
|
"FileSegment",
|
||||||
"FileVariable",
|
"FileVariable",
|
||||||
|
"ArrayFileVariable",
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
|
from collections.abc import Sequence
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
from pydantic import Field
|
from pydantic import Field
|
||||||
|
|
||||||
from core.helper import encrypter
|
from core.helper import encrypter
|
||||||
|
|
||||||
from .segments import (
|
from .segments import (
|
||||||
ArrayAnySegment,
|
ArrayAnySegment,
|
||||||
|
ArrayFileSegment,
|
||||||
ArrayNumberSegment,
|
ArrayNumberSegment,
|
||||||
ArrayObjectSegment,
|
ArrayObjectSegment,
|
||||||
ArrayStringSegment,
|
ArrayStringSegment,
|
||||||
|
@ -24,11 +28,12 @@ class Variable(Segment):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
id: str = Field(
|
id: str = Field(
|
||||||
default="",
|
default=lambda _: str(uuid4()),
|
||||||
description="Unique identity for variable. It's only used by environment variables now.",
|
description="Unique identity for variable.",
|
||||||
)
|
)
|
||||||
name: str
|
name: str
|
||||||
description: str = Field(default="", description="Description of the variable.")
|
description: str = Field(default="", description="Description of the variable.")
|
||||||
|
selector: Sequence[str] = Field(default_factory=list)
|
||||||
|
|
||||||
|
|
||||||
class StringVariable(StringSegment, Variable):
|
class StringVariable(StringSegment, Variable):
|
||||||
|
@ -78,3 +83,7 @@ class NoneVariable(NoneSegment, Variable):
|
||||||
|
|
||||||
class FileVariable(FileSegment, Variable):
|
class FileVariable(FileSegment, Variable):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class ArrayFileVariable(ArrayFileSegment, Variable):
|
||||||
|
pass
|
||||||
|
|
|
@ -24,6 +24,7 @@ class NodeRunMetadataKey(str, Enum):
|
||||||
PARENT_PARALLEL_ID = "parent_parallel_id"
|
PARENT_PARALLEL_ID = "parent_parallel_id"
|
||||||
PARENT_PARALLEL_START_NODE_ID = "parent_parallel_start_node_id"
|
PARENT_PARALLEL_START_NODE_ID = "parent_parallel_start_node_id"
|
||||||
PARALLEL_MODE_RUN_ID = "parallel_mode_run_id"
|
PARALLEL_MODE_RUN_ID = "parallel_mode_run_id"
|
||||||
|
ITERATION_DURATION_MAP = "iteration_duration_map" # single iteration duration if iteration node runs
|
||||||
|
|
||||||
|
|
||||||
class NodeRunResult(BaseModel):
|
class NodeRunResult(BaseModel):
|
||||||
|
|
|
@ -95,13 +95,16 @@ class VariablePool(BaseModel):
|
||||||
if len(selector) < 2:
|
if len(selector) < 2:
|
||||||
raise ValueError("Invalid selector")
|
raise ValueError("Invalid selector")
|
||||||
|
|
||||||
|
if isinstance(value, Variable):
|
||||||
|
variable = value
|
||||||
if isinstance(value, Segment):
|
if isinstance(value, Segment):
|
||||||
v = value
|
variable = variable_factory.segment_to_variable(segment=value, selector=selector)
|
||||||
else:
|
else:
|
||||||
v = variable_factory.build_segment(value)
|
segment = variable_factory.build_segment(value)
|
||||||
|
variable = variable_factory.segment_to_variable(segment=segment, selector=selector)
|
||||||
|
|
||||||
hash_key = hash(tuple(selector[1:]))
|
hash_key = hash(tuple(selector[1:]))
|
||||||
self.variable_dictionary[selector[0]][hash_key] = v
|
self.variable_dictionary[selector[0]][hash_key] = variable
|
||||||
|
|
||||||
def get(self, selector: Sequence[str], /) -> Segment | None:
|
def get(self, selector: Sequence[str], /) -> Segment | None:
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -148,6 +148,7 @@ class IterationRunStartedEvent(BaseIterationEvent):
|
||||||
class IterationRunNextEvent(BaseIterationEvent):
|
class IterationRunNextEvent(BaseIterationEvent):
|
||||||
index: int = Field(..., description="index")
|
index: int = Field(..., description="index")
|
||||||
pre_iteration_output: Optional[Any] = Field(None, description="pre iteration output")
|
pre_iteration_output: Optional[Any] = Field(None, description="pre iteration output")
|
||||||
|
duration: Optional[float] = Field(None, description="duration")
|
||||||
|
|
||||||
|
|
||||||
class IterationRunSucceededEvent(BaseIterationEvent):
|
class IterationRunSucceededEvent(BaseIterationEvent):
|
||||||
|
@ -156,6 +157,7 @@ class IterationRunSucceededEvent(BaseIterationEvent):
|
||||||
outputs: Optional[dict[str, Any]] = None
|
outputs: Optional[dict[str, Any]] = None
|
||||||
metadata: Optional[dict[str, Any]] = None
|
metadata: Optional[dict[str, Any]] = None
|
||||||
steps: int = 0
|
steps: int = 0
|
||||||
|
iteration_duration_map: Optional[dict[str, float]] = None
|
||||||
|
|
||||||
|
|
||||||
class IterationRunFailedEvent(BaseIterationEvent):
|
class IterationRunFailedEvent(BaseIterationEvent):
|
||||||
|
|
|
@ -143,14 +143,14 @@ def _extract_text_by_file_extension(*, file_content: bytes, file_extension: str)
|
||||||
|
|
||||||
def _extract_text_from_plain_text(file_content: bytes) -> str:
|
def _extract_text_from_plain_text(file_content: bytes) -> str:
|
||||||
try:
|
try:
|
||||||
return file_content.decode("utf-8")
|
return file_content.decode("utf-8", "ignore")
|
||||||
except UnicodeDecodeError as e:
|
except UnicodeDecodeError as e:
|
||||||
raise TextExtractionError("Failed to decode plain text file") from e
|
raise TextExtractionError("Failed to decode plain text file") from e
|
||||||
|
|
||||||
|
|
||||||
def _extract_text_from_json(file_content: bytes) -> str:
|
def _extract_text_from_json(file_content: bytes) -> str:
|
||||||
try:
|
try:
|
||||||
json_data = json.loads(file_content.decode("utf-8"))
|
json_data = json.loads(file_content.decode("utf-8", "ignore"))
|
||||||
return json.dumps(json_data, indent=2, ensure_ascii=False)
|
return json.dumps(json_data, indent=2, ensure_ascii=False)
|
||||||
except (UnicodeDecodeError, json.JSONDecodeError) as e:
|
except (UnicodeDecodeError, json.JSONDecodeError) as e:
|
||||||
raise TextExtractionError(f"Failed to decode or parse JSON file: {e}") from e
|
raise TextExtractionError(f"Failed to decode or parse JSON file: {e}") from e
|
||||||
|
@ -159,7 +159,7 @@ def _extract_text_from_json(file_content: bytes) -> str:
|
||||||
def _extract_text_from_yaml(file_content: bytes) -> str:
|
def _extract_text_from_yaml(file_content: bytes) -> str:
|
||||||
"""Extract the content from yaml file"""
|
"""Extract the content from yaml file"""
|
||||||
try:
|
try:
|
||||||
yaml_data = yaml.safe_load_all(file_content.decode("utf-8"))
|
yaml_data = yaml.safe_load_all(file_content.decode("utf-8", "ignore"))
|
||||||
return yaml.dump_all(yaml_data, allow_unicode=True, sort_keys=False)
|
return yaml.dump_all(yaml_data, allow_unicode=True, sort_keys=False)
|
||||||
except (UnicodeDecodeError, yaml.YAMLError) as e:
|
except (UnicodeDecodeError, yaml.YAMLError) as e:
|
||||||
raise TextExtractionError(f"Failed to decode or parse YAML file: {e}") from e
|
raise TextExtractionError(f"Failed to decode or parse YAML file: {e}") from e
|
||||||
|
@ -217,7 +217,7 @@ def _extract_text_from_file(file: File):
|
||||||
|
|
||||||
def _extract_text_from_csv(file_content: bytes) -> str:
|
def _extract_text_from_csv(file_content: bytes) -> str:
|
||||||
try:
|
try:
|
||||||
csv_file = io.StringIO(file_content.decode("utf-8"))
|
csv_file = io.StringIO(file_content.decode("utf-8", "ignore"))
|
||||||
csv_reader = csv.reader(csv_file)
|
csv_reader = csv.reader(csv_file)
|
||||||
rows = list(csv_reader)
|
rows = list(csv_reader)
|
||||||
|
|
||||||
|
|
|
@ -156,6 +156,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
index=0,
|
index=0,
|
||||||
pre_iteration_output=None,
|
pre_iteration_output=None,
|
||||||
)
|
)
|
||||||
|
iter_run_map: dict[str, float] = {}
|
||||||
outputs: list[Any] = [None] * len(iterator_list_value)
|
outputs: list[Any] = [None] * len(iterator_list_value)
|
||||||
try:
|
try:
|
||||||
if self.node_data.is_parallel:
|
if self.node_data.is_parallel:
|
||||||
|
@ -175,6 +176,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
iteration_graph,
|
iteration_graph,
|
||||||
index,
|
index,
|
||||||
item,
|
item,
|
||||||
|
iter_run_map,
|
||||||
)
|
)
|
||||||
future.add_done_callback(thread_pool.task_done_callback)
|
future.add_done_callback(thread_pool.task_done_callback)
|
||||||
futures.append(future)
|
futures.append(future)
|
||||||
|
@ -213,6 +215,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
start_at,
|
start_at,
|
||||||
graph_engine,
|
graph_engine,
|
||||||
iteration_graph,
|
iteration_graph,
|
||||||
|
iter_run_map,
|
||||||
)
|
)
|
||||||
if self.node_data.error_handle_mode == ErrorHandleMode.REMOVE_ABNORMAL_OUTPUT:
|
if self.node_data.error_handle_mode == ErrorHandleMode.REMOVE_ABNORMAL_OUTPUT:
|
||||||
outputs = [output for output in outputs if output is not None]
|
outputs = [output for output in outputs if output is not None]
|
||||||
|
@ -230,7 +233,9 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
|
|
||||||
yield RunCompletedEvent(
|
yield RunCompletedEvent(
|
||||||
run_result=NodeRunResult(
|
run_result=NodeRunResult(
|
||||||
status=WorkflowNodeExecutionStatus.SUCCEEDED, outputs={"output": jsonable_encoder(outputs)}
|
status=WorkflowNodeExecutionStatus.SUCCEEDED,
|
||||||
|
outputs={"output": jsonable_encoder(outputs)},
|
||||||
|
metadata={NodeRunMetadataKey.ITERATION_DURATION_MAP: iter_run_map},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except IterationNodeError as e:
|
except IterationNodeError as e:
|
||||||
|
@ -356,15 +361,19 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
start_at: datetime,
|
start_at: datetime,
|
||||||
graph_engine: "GraphEngine",
|
graph_engine: "GraphEngine",
|
||||||
iteration_graph: Graph,
|
iteration_graph: Graph,
|
||||||
|
iter_run_map: dict[str, float],
|
||||||
parallel_mode_run_id: Optional[str] = None,
|
parallel_mode_run_id: Optional[str] = None,
|
||||||
) -> Generator[NodeEvent | InNodeEvent, None, None]:
|
) -> Generator[NodeEvent | InNodeEvent, None, None]:
|
||||||
"""
|
"""
|
||||||
run single iteration
|
run single iteration
|
||||||
"""
|
"""
|
||||||
|
iter_start_at = datetime.now(timezone.utc).replace(tzinfo=None)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
rst = graph_engine.run()
|
rst = graph_engine.run()
|
||||||
# get current iteration index
|
# get current iteration index
|
||||||
current_index = variable_pool.get([self.node_id, "index"]).value
|
current_index = variable_pool.get([self.node_id, "index"]).value
|
||||||
|
iteration_run_id = parallel_mode_run_id if parallel_mode_run_id is not None else f"{current_index}"
|
||||||
next_index = int(current_index) + 1
|
next_index = int(current_index) + 1
|
||||||
|
|
||||||
if current_index is None:
|
if current_index is None:
|
||||||
|
@ -431,6 +440,8 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
variable_pool.add([self.node_id, "index"], next_index)
|
variable_pool.add([self.node_id, "index"], next_index)
|
||||||
if next_index < len(iterator_list_value):
|
if next_index < len(iterator_list_value):
|
||||||
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
||||||
|
duration = (datetime.now(timezone.utc).replace(tzinfo=None) - iter_start_at).total_seconds()
|
||||||
|
iter_run_map[iteration_run_id] = duration
|
||||||
yield IterationRunNextEvent(
|
yield IterationRunNextEvent(
|
||||||
iteration_id=self.id,
|
iteration_id=self.id,
|
||||||
iteration_node_id=self.node_id,
|
iteration_node_id=self.node_id,
|
||||||
|
@ -439,6 +450,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
index=next_index,
|
index=next_index,
|
||||||
parallel_mode_run_id=parallel_mode_run_id,
|
parallel_mode_run_id=parallel_mode_run_id,
|
||||||
pre_iteration_output=None,
|
pre_iteration_output=None,
|
||||||
|
duration=duration,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
elif self.node_data.error_handle_mode == ErrorHandleMode.REMOVE_ABNORMAL_OUTPUT:
|
elif self.node_data.error_handle_mode == ErrorHandleMode.REMOVE_ABNORMAL_OUTPUT:
|
||||||
|
@ -449,6 +461,8 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
|
|
||||||
if next_index < len(iterator_list_value):
|
if next_index < len(iterator_list_value):
|
||||||
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
||||||
|
duration = (datetime.now(timezone.utc).replace(tzinfo=None) - iter_start_at).total_seconds()
|
||||||
|
iter_run_map[iteration_run_id] = duration
|
||||||
yield IterationRunNextEvent(
|
yield IterationRunNextEvent(
|
||||||
iteration_id=self.id,
|
iteration_id=self.id,
|
||||||
iteration_node_id=self.node_id,
|
iteration_node_id=self.node_id,
|
||||||
|
@ -457,6 +471,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
index=next_index,
|
index=next_index,
|
||||||
parallel_mode_run_id=parallel_mode_run_id,
|
parallel_mode_run_id=parallel_mode_run_id,
|
||||||
pre_iteration_output=None,
|
pre_iteration_output=None,
|
||||||
|
duration=duration,
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
elif self.node_data.error_handle_mode == ErrorHandleMode.TERMINATED:
|
elif self.node_data.error_handle_mode == ErrorHandleMode.TERMINATED:
|
||||||
|
@ -474,7 +489,10 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
)
|
)
|
||||||
yield metadata_event
|
yield metadata_event
|
||||||
|
|
||||||
current_iteration_output = variable_pool.get(self.node_data.output_selector).value
|
current_output_segment = variable_pool.get(self.node_data.output_selector)
|
||||||
|
if current_output_segment is None:
|
||||||
|
raise IterationNodeError("iteration output selector not found")
|
||||||
|
current_iteration_output = current_output_segment.value
|
||||||
outputs[current_index] = current_iteration_output
|
outputs[current_index] = current_iteration_output
|
||||||
# remove all nodes outputs from variable pool
|
# remove all nodes outputs from variable pool
|
||||||
for node_id in iteration_graph.node_ids:
|
for node_id in iteration_graph.node_ids:
|
||||||
|
@ -485,6 +503,8 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
|
|
||||||
if next_index < len(iterator_list_value):
|
if next_index < len(iterator_list_value):
|
||||||
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
variable_pool.add([self.node_id, "item"], iterator_list_value[next_index])
|
||||||
|
duration = (datetime.now(timezone.utc).replace(tzinfo=None) - iter_start_at).total_seconds()
|
||||||
|
iter_run_map[iteration_run_id] = duration
|
||||||
yield IterationRunNextEvent(
|
yield IterationRunNextEvent(
|
||||||
iteration_id=self.id,
|
iteration_id=self.id,
|
||||||
iteration_node_id=self.node_id,
|
iteration_node_id=self.node_id,
|
||||||
|
@ -493,6 +513,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
index=next_index,
|
index=next_index,
|
||||||
parallel_mode_run_id=parallel_mode_run_id,
|
parallel_mode_run_id=parallel_mode_run_id,
|
||||||
pre_iteration_output=jsonable_encoder(current_iteration_output) if current_iteration_output else None,
|
pre_iteration_output=jsonable_encoder(current_iteration_output) if current_iteration_output else None,
|
||||||
|
duration=duration,
|
||||||
)
|
)
|
||||||
|
|
||||||
except IterationNodeError as e:
|
except IterationNodeError as e:
|
||||||
|
@ -528,6 +549,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
iteration_graph: Graph,
|
iteration_graph: Graph,
|
||||||
index: int,
|
index: int,
|
||||||
item: Any,
|
item: Any,
|
||||||
|
iter_run_map: dict[str, float],
|
||||||
) -> Generator[NodeEvent | InNodeEvent, None, None]:
|
) -> Generator[NodeEvent | InNodeEvent, None, None]:
|
||||||
"""
|
"""
|
||||||
run single iteration in parallel mode
|
run single iteration in parallel mode
|
||||||
|
@ -546,6 +568,7 @@ class IterationNode(BaseNode[IterationNodeData]):
|
||||||
start_at=start_at,
|
start_at=start_at,
|
||||||
graph_engine=graph_engine_copy,
|
graph_engine=graph_engine_copy,
|
||||||
iteration_graph=iteration_graph,
|
iteration_graph=iteration_graph,
|
||||||
|
iter_run_map=iter_run_map,
|
||||||
parallel_mode_run_id=parallel_mode_run_id,
|
parallel_mode_run_id=parallel_mode_run_id,
|
||||||
):
|
):
|
||||||
q.put(event)
|
q.put(event)
|
||||||
|
|
|
@ -59,4 +59,4 @@ class ListOperatorNodeData(BaseNodeData):
|
||||||
filter_by: FilterBy
|
filter_by: FilterBy
|
||||||
order_by: OrderBy
|
order_by: OrderBy
|
||||||
limit: Limit
|
limit: Limit
|
||||||
extract_by: ExtractConfig
|
extract_by: ExtractConfig = Field(default_factory=ExtractConfig)
|
||||||
|
|
|
@ -21,7 +21,7 @@ if [[ "${MODE}" == "worker" ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec celery -A app.celery worker -P ${CELERY_WORKER_CLASS:-gevent} $CONCURRENCY_OPTION --loglevel ${LOG_LEVEL} \
|
exec celery -A app.celery worker -P ${CELERY_WORKER_CLASS:-gevent} $CONCURRENCY_OPTION --loglevel ${LOG_LEVEL} \
|
||||||
-Q ${CELERY_QUEUES:-dataset,generation,mail,ops_trace,app_deletion}
|
-Q ${CELERY_QUEUES:-dataset,mail,ops_trace,app_deletion}
|
||||||
|
|
||||||
elif [[ "${MODE}" == "beat" ]]; then
|
elif [[ "${MODE}" == "beat" ]]; then
|
||||||
exec celery -A app.celery beat --loglevel ${LOG_LEVEL}
|
exec celery -A app.celery beat --loglevel ${LOG_LEVEL}
|
||||||
|
|
|
@ -46,7 +46,6 @@ def init_app(app: Flask) -> Celery:
|
||||||
broker_connection_retry_on_startup=True,
|
broker_connection_retry_on_startup=True,
|
||||||
worker_log_format=dify_config.LOG_FORMAT,
|
worker_log_format=dify_config.LOG_FORMAT,
|
||||||
worker_task_log_format=dify_config.LOG_FORMAT,
|
worker_task_log_format=dify_config.LOG_FORMAT,
|
||||||
worker_logfile=dify_config.LOG_FILE,
|
|
||||||
worker_hijack_root_logger=False,
|
worker_hijack_root_logger=False,
|
||||||
timezone=pytz.timezone(dify_config.LOG_TZ),
|
timezone=pytz.timezone(dify_config.LOG_TZ),
|
||||||
)
|
)
|
||||||
|
@ -56,6 +55,11 @@ def init_app(app: Flask) -> Celery:
|
||||||
broker_use_ssl=ssl_options, # Add the SSL options to the broker configuration
|
broker_use_ssl=ssl_options, # Add the SSL options to the broker configuration
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if dify_config.LOG_FILE:
|
||||||
|
celery_app.conf.update(
|
||||||
|
worker_logfile=dify_config.LOG_FILE,
|
||||||
|
)
|
||||||
|
|
||||||
celery_app.set_default()
|
celery_app.set_default()
|
||||||
app.extensions["celery"] = celery_app
|
app.extensions["celery"] = celery_app
|
||||||
|
|
||||||
|
|
|
@ -9,19 +9,21 @@ from configs import dify_config
|
||||||
|
|
||||||
|
|
||||||
def init_app(app: Flask):
|
def init_app(app: Flask):
|
||||||
log_handlers = None
|
log_handlers = []
|
||||||
log_file = dify_config.LOG_FILE
|
log_file = dify_config.LOG_FILE
|
||||||
if log_file:
|
if log_file:
|
||||||
log_dir = os.path.dirname(log_file)
|
log_dir = os.path.dirname(log_file)
|
||||||
os.makedirs(log_dir, exist_ok=True)
|
os.makedirs(log_dir, exist_ok=True)
|
||||||
log_handlers = [
|
log_handlers.append(
|
||||||
RotatingFileHandler(
|
RotatingFileHandler(
|
||||||
filename=log_file,
|
filename=log_file,
|
||||||
maxBytes=dify_config.LOG_FILE_MAX_SIZE * 1024 * 1024,
|
maxBytes=dify_config.LOG_FILE_MAX_SIZE * 1024 * 1024,
|
||||||
backupCount=dify_config.LOG_FILE_BACKUP_COUNT,
|
backupCount=dify_config.LOG_FILE_BACKUP_COUNT,
|
||||||
),
|
)
|
||||||
logging.StreamHandler(sys.stdout),
|
)
|
||||||
]
|
|
||||||
|
# Always add StreamHandler to log to console
|
||||||
|
log_handlers.append(logging.StreamHandler(sys.stdout))
|
||||||
|
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=dify_config.LOG_LEVEL,
|
level=dify_config.LOG_LEVEL,
|
||||||
|
|
|
@ -180,6 +180,20 @@ def _get_remote_file_info(url: str):
|
||||||
return mime_type, filename, file_size
|
return mime_type, filename, file_size
|
||||||
|
|
||||||
|
|
||||||
|
def _get_file_type_by_mimetype(mime_type: str) -> FileType:
|
||||||
|
if "image" in mime_type:
|
||||||
|
file_type = FileType.IMAGE
|
||||||
|
elif "video" in mime_type:
|
||||||
|
file_type = FileType.VIDEO
|
||||||
|
elif "audio" in mime_type:
|
||||||
|
file_type = FileType.AUDIO
|
||||||
|
elif "text" in mime_type or "pdf" in mime_type:
|
||||||
|
file_type = FileType.DOCUMENT
|
||||||
|
else:
|
||||||
|
file_type = FileType.CUSTOM
|
||||||
|
return file_type
|
||||||
|
|
||||||
|
|
||||||
def _build_from_tool_file(
|
def _build_from_tool_file(
|
||||||
*,
|
*,
|
||||||
mapping: Mapping[str, Any],
|
mapping: Mapping[str, Any],
|
||||||
|
@ -199,12 +213,13 @@ def _build_from_tool_file(
|
||||||
raise ValueError(f"ToolFile {mapping.get('tool_file_id')} not found")
|
raise ValueError(f"ToolFile {mapping.get('tool_file_id')} not found")
|
||||||
|
|
||||||
extension = "." + tool_file.file_key.split(".")[-1] if "." in tool_file.file_key else ".bin"
|
extension = "." + tool_file.file_key.split(".")[-1] if "." in tool_file.file_key else ".bin"
|
||||||
|
file_type = mapping.get("type", _get_file_type_by_mimetype(tool_file.mimetype))
|
||||||
|
|
||||||
return File(
|
return File(
|
||||||
id=mapping.get("id"),
|
id=mapping.get("id"),
|
||||||
tenant_id=tenant_id,
|
tenant_id=tenant_id,
|
||||||
filename=tool_file.name,
|
filename=tool_file.name,
|
||||||
type=FileType.value_of(mapping.get("type")),
|
type=file_type,
|
||||||
transfer_method=transfer_method,
|
transfer_method=transfer_method,
|
||||||
remote_url=tool_file.original_url,
|
remote_url=tool_file.original_url,
|
||||||
related_id=tool_file.id,
|
related_id=tool_file.id,
|
||||||
|
|
|
@ -1,34 +1,65 @@
|
||||||
from collections.abc import Mapping
|
from collections.abc import Mapping, Sequence
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
from uuid import uuid4
|
||||||
|
|
||||||
from configs import dify_config
|
from configs import dify_config
|
||||||
from core.file import File
|
from core.file import File
|
||||||
from core.variables import (
|
from core.variables.exc import VariableError
|
||||||
|
from core.variables.segments import (
|
||||||
ArrayAnySegment,
|
ArrayAnySegment,
|
||||||
ArrayFileSegment,
|
ArrayFileSegment,
|
||||||
ArrayNumberSegment,
|
ArrayNumberSegment,
|
||||||
ArrayNumberVariable,
|
|
||||||
ArrayObjectSegment,
|
ArrayObjectSegment,
|
||||||
ArrayObjectVariable,
|
|
||||||
ArraySegment,
|
ArraySegment,
|
||||||
ArrayStringSegment,
|
ArrayStringSegment,
|
||||||
ArrayStringVariable,
|
|
||||||
FileSegment,
|
FileSegment,
|
||||||
FloatSegment,
|
FloatSegment,
|
||||||
FloatVariable,
|
|
||||||
IntegerSegment,
|
IntegerSegment,
|
||||||
IntegerVariable,
|
|
||||||
NoneSegment,
|
NoneSegment,
|
||||||
ObjectSegment,
|
ObjectSegment,
|
||||||
|
Segment,
|
||||||
|
StringSegment,
|
||||||
|
)
|
||||||
|
from core.variables.types import SegmentType
|
||||||
|
from core.variables.variables import (
|
||||||
|
ArrayAnyVariable,
|
||||||
|
ArrayFileVariable,
|
||||||
|
ArrayNumberVariable,
|
||||||
|
ArrayObjectVariable,
|
||||||
|
ArrayStringVariable,
|
||||||
|
FileVariable,
|
||||||
|
FloatVariable,
|
||||||
|
IntegerVariable,
|
||||||
|
NoneVariable,
|
||||||
ObjectVariable,
|
ObjectVariable,
|
||||||
SecretVariable,
|
SecretVariable,
|
||||||
Segment,
|
|
||||||
SegmentType,
|
|
||||||
StringSegment,
|
|
||||||
StringVariable,
|
StringVariable,
|
||||||
Variable,
|
Variable,
|
||||||
)
|
)
|
||||||
from core.variables.exc import VariableError
|
|
||||||
|
|
||||||
|
class InvalidSelectorError(ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class UnsupportedSegmentTypeError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Define the constant
|
||||||
|
SEGMENT_TO_VARIABLE_MAP = {
|
||||||
|
StringSegment: StringVariable,
|
||||||
|
IntegerSegment: IntegerVariable,
|
||||||
|
FloatSegment: FloatVariable,
|
||||||
|
ObjectSegment: ObjectVariable,
|
||||||
|
FileSegment: FileVariable,
|
||||||
|
ArrayStringSegment: ArrayStringVariable,
|
||||||
|
ArrayNumberSegment: ArrayNumberVariable,
|
||||||
|
ArrayObjectSegment: ArrayObjectVariable,
|
||||||
|
ArrayFileSegment: ArrayFileVariable,
|
||||||
|
ArrayAnySegment: ArrayAnyVariable,
|
||||||
|
NoneSegment: NoneVariable,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def build_variable_from_mapping(mapping: Mapping[str, Any], /) -> Variable:
|
def build_variable_from_mapping(mapping: Mapping[str, Any], /) -> Variable:
|
||||||
|
@ -96,3 +127,30 @@ def build_segment(value: Any, /) -> Segment:
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f"not supported value {value}")
|
raise ValueError(f"not supported value {value}")
|
||||||
raise ValueError(f"not supported value {value}")
|
raise ValueError(f"not supported value {value}")
|
||||||
|
|
||||||
|
|
||||||
|
def segment_to_variable(
|
||||||
|
*,
|
||||||
|
segment: Segment,
|
||||||
|
selector: Sequence[str],
|
||||||
|
id: str | None = None,
|
||||||
|
name: str | None = None,
|
||||||
|
description: str = "",
|
||||||
|
) -> Variable:
|
||||||
|
if isinstance(segment, Variable):
|
||||||
|
return segment
|
||||||
|
name = name or selector[-1]
|
||||||
|
id = id or str(uuid4())
|
||||||
|
|
||||||
|
segment_type = type(segment)
|
||||||
|
if segment_type not in SEGMENT_TO_VARIABLE_MAP:
|
||||||
|
raise UnsupportedSegmentTypeError(f"not supported segment type {segment_type}")
|
||||||
|
|
||||||
|
variable_class = SEGMENT_TO_VARIABLE_MAP[segment_type]
|
||||||
|
return variable_class(
|
||||||
|
id=id,
|
||||||
|
name=name,
|
||||||
|
description=description,
|
||||||
|
value=segment.value,
|
||||||
|
selector=selector,
|
||||||
|
)
|
||||||
|
|
115
api/poetry.lock
generated
115
api/poetry.lock
generated
|
@ -1,4 +1,4 @@
|
||||||
# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aiohappyeyeballs"
|
name = "aiohappyeyeballs"
|
||||||
|
@ -950,6 +950,10 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"},
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"},
|
||||||
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"},
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"},
|
||||||
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"},
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"},
|
||||||
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5dab0844f2cf82be357a0eb11a9087f70c5430b2c241493fc122bb6f2bb0917c"},
|
||||||
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e4fe605b917c70283db7dfe5ada75e04561479075761a0b3866c081d035b01c1"},
|
||||||
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1e9a65b5736232e7a7f91ff3d02277f11d339bf34099a56cdab6a8b3410a02b2"},
|
||||||
|
{file = "Brotli-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:58d4b711689366d4a03ac7957ab8c28890415e267f9b6589969e74b6e42225ec"},
|
||||||
{file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"},
|
{file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"},
|
||||||
{file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"},
|
{file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"},
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"},
|
{file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"},
|
||||||
|
@ -962,8 +966,14 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"},
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"},
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"},
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"},
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"},
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"},
|
||||||
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c247dd99d39e0338a604f8c2b3bc7061d5c2e9e2ac7ba9cc1be5a69cb6cd832f"},
|
||||||
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1b2c248cd517c222d89e74669a4adfa5577e06ab68771a529060cf5a156e9757"},
|
||||||
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2a24c50840d89ded6c9a8fdc7b6ed3692ed4e86f1c4a4a938e1e92def92933e0"},
|
||||||
|
{file = "Brotli-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f31859074d57b4639318523d6ffdca586ace54271a73ad23ad021acd807eb14b"},
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"},
|
{file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"},
|
||||||
{file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"},
|
{file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:32d95b80260d79926f5fab3c41701dbb818fde1c9da590e77e571eefd14abe28"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b760c65308ff1e462f65d69c12e4ae085cff3b332d894637f6273a12a482d09f"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"},
|
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"},
|
{file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"},
|
{file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"},
|
||||||
|
@ -974,8 +984,24 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"},
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"},
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"},
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:87a3044c3a35055527ac75e419dfa9f4f3667a1e887ee80360589eb8c90aabb9"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c5529b34c1c9d937168297f2c1fde7ebe9ebdd5e121297ff9c043bdb2ae3d6fb"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ca63e1890ede90b2e4454f9a65135a4d387a4585ff8282bb72964fab893f2111"},
|
||||||
|
{file = "Brotli-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e79e6520141d792237c70bcd7a3b122d00f2613769ae0cb61c52e89fd3443839"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"},
|
{file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"},
|
||||||
{file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"},
|
{file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8bf32b98b75c13ec7cf774164172683d6e7891088f6316e54425fde1efc276d5"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bc37c4d6b87fb1017ea28c9508b36bbcb0c3d18b4260fcdf08b200c74a6aee8"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c0ef38c7a7014ffac184db9e04debe495d317cc9c6fb10071f7fefd93100a4f"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91d7cc2a76b5567591d12c01f019dd7afce6ba8cba6571187e21e2fc418ae648"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93dde851926f4f2678e704fadeb39e16c35d8baebd5252c9fd94ce8ce68c4a0"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0db75f47be8b8abc8d9e31bc7aad0547ca26f24a54e6fd10231d623f183d089"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6967ced6730aed543b8673008b5a391c3b1076d834ca438bbd70635c73775368"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7eedaa5d036d9336c95915035fb57422054014ebdeb6f3b42eac809928e40d0c"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d487f5432bf35b60ed625d7e1b448e2dc855422e87469e3f450aa5552b0eb284"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832436e59afb93e1836081a20f324cb185836c617659b07b129141a8426973c7"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-win32.whl", hash = "sha256:43395e90523f9c23a3d5bdf004733246fba087f2948f87ab28015f12359ca6a0"},
|
||||||
|
{file = "Brotli-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"},
|
{file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"},
|
{file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"},
|
{file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"},
|
||||||
|
@ -985,6 +1011,10 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"},
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"},
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"},
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"},
|
||||||
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:aea440a510e14e818e67bfc4027880e2fb500c2ccb20ab21c7a7c8b5b4703d75"},
|
||||||
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_i686.whl", hash = "sha256:6974f52a02321b36847cd19d1b8e381bf39939c21efd6ee2fc13a28b0d99348c"},
|
||||||
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:a7e53012d2853a07a4a79c00643832161a910674a893d296c9f1259859a289d2"},
|
||||||
|
{file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:d7702622a8b40c49bffb46e1e3ba2e81268d5c04a34f460978c6b5517a34dd52"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"},
|
{file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"},
|
||||||
{file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"},
|
{file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"},
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"},
|
{file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"},
|
||||||
|
@ -996,6 +1026,10 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"},
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"},
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"},
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"},
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"},
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"},
|
||||||
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cb1dac1770878ade83f2ccdf7d25e494f05c9165f5246b46a621cc849341dc01"},
|
||||||
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:3ee8a80d67a4334482d9712b8e83ca6b1d9bc7e351931252ebef5d8f7335a547"},
|
||||||
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:5e55da2c8724191e5b557f8e18943b1b4839b8efc3ef60d65985bcf6f587dd38"},
|
||||||
|
{file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:d342778ef319e1026af243ed0a07c97acf3bad33b9f29e7ae6a1f68fd083e90c"},
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"},
|
{file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"},
|
||||||
{file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"},
|
{file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"},
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"},
|
{file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"},
|
||||||
|
@ -1008,6 +1042,10 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"},
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"},
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"},
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"},
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"},
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"},
|
||||||
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d2b35ca2c7f81d173d2fadc2f4f31e88cc5f7a39ae5b6db5513cf3383b0e0ec7"},
|
||||||
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:af6fa6817889314555aede9a919612b23739395ce767fe7fcbea9a80bf140fe5"},
|
||||||
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:2feb1d960f760a575dbc5ab3b1c00504b24caaf6986e2dc2b01c09c87866a943"},
|
||||||
|
{file = "Brotli-1.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4410f84b33374409552ac9b6903507cdb31cd30d2501fc5ca13d18f73548444a"},
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"},
|
{file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"},
|
||||||
{file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"},
|
{file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"},
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"},
|
{file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"},
|
||||||
|
@ -1020,6 +1058,10 @@ files = [
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"},
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"},
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"},
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"},
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"},
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"},
|
||||||
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0737ddb3068957cf1b054899b0883830bb1fec522ec76b1098f9b6e0f02d9419"},
|
||||||
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4f3607b129417e111e30637af1b56f24f7a49e64763253bbc275c75fa887d4b2"},
|
||||||
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6c6e0c425f22c1c719c42670d561ad682f7bfeeef918edea971a79ac5252437f"},
|
||||||
|
{file = "Brotli-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:494994f807ba0b92092a163a0a283961369a65f6cbe01e8891132b7a320e61eb"},
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"},
|
{file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"},
|
||||||
{file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"},
|
{file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"},
|
||||||
{file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"},
|
{file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"},
|
||||||
|
@ -2432,6 +2474,26 @@ files = [
|
||||||
[package.extras]
|
[package.extras]
|
||||||
test = ["pytest (>=6)"]
|
test = ["pytest (>=6)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fal-client"
|
||||||
|
version = "0.5.6"
|
||||||
|
description = "Python client for fal.ai"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "fal_client-0.5.6-py3-none-any.whl", hash = "sha256:631fd857a3c44753ee46a2eea1e7276471453aca58faac9c3702f744c7c84050"},
|
||||||
|
{file = "fal_client-0.5.6.tar.gz", hash = "sha256:d3afc4b6250023d0ee8437ec504558231d3b106d7aabc12cda8c39883faddecb"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
httpx = ">=0.21.0,<1"
|
||||||
|
httpx-sse = ">=0.4.0,<0.5"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
dev = ["fal-client[docs,test]"]
|
||||||
|
docs = ["sphinx", "sphinx-autodoc-typehints", "sphinx-rtd-theme"]
|
||||||
|
test = ["pillow", "pytest", "pytest-asyncio"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastapi"
|
name = "fastapi"
|
||||||
version = "0.115.4"
|
version = "0.115.4"
|
||||||
|
@ -4070,6 +4132,17 @@ http2 = ["h2 (>=3,<5)"]
|
||||||
socks = ["socksio (==1.*)"]
|
socks = ["socksio (==1.*)"]
|
||||||
zstd = ["zstandard (>=0.18.0)"]
|
zstd = ["zstandard (>=0.18.0)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "httpx-sse"
|
||||||
|
version = "0.4.0"
|
||||||
|
description = "Consume Server-Sent Event (SSE) messages with HTTPX."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721"},
|
||||||
|
{file = "httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "huggingface-hub"
|
name = "huggingface-hub"
|
||||||
version = "0.16.4"
|
version = "0.16.4"
|
||||||
|
@ -8463,29 +8536,29 @@ pyasn1 = ">=0.1.3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff"
|
name = "ruff"
|
||||||
version = "0.6.9"
|
version = "0.7.3"
|
||||||
description = "An extremely fast Python linter and code formatter, written in Rust."
|
description = "An extremely fast Python linter and code formatter, written in Rust."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "ruff-0.6.9-py3-none-linux_armv6l.whl", hash = "sha256:064df58d84ccc0ac0fcd63bc3090b251d90e2a372558c0f057c3f75ed73e1ccd"},
|
{file = "ruff-0.7.3-py3-none-linux_armv6l.whl", hash = "sha256:34f2339dc22687ec7e7002792d1f50712bf84a13d5152e75712ac08be565d344"},
|
||||||
{file = "ruff-0.6.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:140d4b5c9f5fc7a7b074908a78ab8d384dd7f6510402267bc76c37195c02a7ec"},
|
{file = "ruff-0.7.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fb397332a1879b9764a3455a0bb1087bda876c2db8aca3a3cbb67b3dbce8cda0"},
|
||||||
{file = "ruff-0.6.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53fd8ca5e82bdee8da7f506d7b03a261f24cd43d090ea9db9a1dc59d9313914c"},
|
{file = "ruff-0.7.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37d0b619546103274e7f62643d14e1adcbccb242efda4e4bdb9544d7764782e9"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645d7d8761f915e48a00d4ecc3686969761df69fb561dd914a773c1a8266e14e"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d59f0c3ee4d1a6787614e7135b72e21024875266101142a09a61439cb6e38a5"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eae02b700763e3847595b9d2891488989cac00214da7f845f4bcf2989007d577"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44eb93c2499a169d49fafd07bc62ac89b1bc800b197e50ff4633aed212569299"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d5ccc9e58112441de8ad4b29dcb7a86dc25c5f770e3c06a9d57e0e5eba48829"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d0242ce53f3a576c35ee32d907475a8d569944c0407f91d207c8af5be5dae4e"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:417b81aa1c9b60b2f8edc463c58363075412866ae4e2b9ab0f690dc1e87ac1b5"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:6b6224af8b5e09772c2ecb8dc9f3f344c1aa48201c7f07e7315367f6dd90ac29"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c866b631f5fbce896a74a6e4383407ba7507b815ccc52bcedabb6810fdb3ef7"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c50f95a82b94421c964fae4c27c0242890a20fe67d203d127e84fbb8013855f5"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7b118afbb3202f5911486ad52da86d1d52305b59e7ef2031cea3425142b97d6f"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f3eff9961b5d2644bcf1616c606e93baa2d6b349e8aa8b035f654df252c8c67"},
|
||||||
{file = "ruff-0.6.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a67267654edc23c97335586774790cde402fb6bbdb3c2314f1fc087dee320bfa"},
|
{file = "ruff-0.7.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8963cab06d130c4df2fd52c84e9f10d297826d2e8169ae0c798b6221be1d1d2"},
|
||||||
{file = "ruff-0.6.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3ef0cc774b00fec123f635ce5c547dac263f6ee9fb9cc83437c5904183b55ceb"},
|
{file = "ruff-0.7.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:61b46049d6edc0e4317fb14b33bd693245281a3007288b68a3f5b74a22a0746d"},
|
||||||
{file = "ruff-0.6.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:12edd2af0c60fa61ff31cefb90aef4288ac4d372b4962c2864aeea3a1a2460c0"},
|
{file = "ruff-0.7.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:10ebce7696afe4644e8c1a23b3cf8c0f2193a310c18387c06e583ae9ef284de2"},
|
||||||
{file = "ruff-0.6.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:55bb01caeaf3a60b2b2bba07308a02fca6ab56233302406ed5245180a05c5625"},
|
{file = "ruff-0.7.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3f36d56326b3aef8eeee150b700e519880d1aab92f471eefdef656fd57492aa2"},
|
||||||
{file = "ruff-0.6.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:925d26471fa24b0ce5a6cdfab1bb526fb4159952385f386bdcc643813d472039"},
|
{file = "ruff-0.7.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5d024301109a0007b78d57ab0ba190087b43dce852e552734ebf0b0b85e4fb16"},
|
||||||
{file = "ruff-0.6.9-py3-none-win32.whl", hash = "sha256:eb61ec9bdb2506cffd492e05ac40e5bc6284873aceb605503d8494180d6fc84d"},
|
{file = "ruff-0.7.3-py3-none-win32.whl", hash = "sha256:4ba81a5f0c5478aa61674c5a2194de8b02652f17addf8dfc40c8937e6e7d79fc"},
|
||||||
{file = "ruff-0.6.9-py3-none-win_amd64.whl", hash = "sha256:785d31851c1ae91f45b3d8fe23b8ae4b5170089021fbb42402d811135f0b7117"},
|
{file = "ruff-0.7.3-py3-none-win_amd64.whl", hash = "sha256:588a9ff2fecf01025ed065fe28809cd5a53b43505f48b69a1ac7707b1b7e4088"},
|
||||||
{file = "ruff-0.6.9-py3-none-win_arm64.whl", hash = "sha256:a9641e31476d601f83cd602608739a0840e348bda93fec9f1ee816f8b6798b93"},
|
{file = "ruff-0.7.3-py3-none-win_arm64.whl", hash = "sha256:1713e2c5545863cdbfe2cbce21f69ffaf37b813bfd1fb3b90dc9a6f1963f5a8c"},
|
||||||
{file = "ruff-0.6.9.tar.gz", hash = "sha256:b076ef717a8e5bc819514ee1d602bbdca5b4420ae13a9cf61a0c0a4f53a2baa2"},
|
{file = "ruff-0.7.3.tar.gz", hash = "sha256:e1d1ba2e40b6e71a61b063354d04be669ab0d39c352461f3d789cac68b54a313"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -10998,4 +11071,4 @@ cffi = ["cffi (>=1.11)"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = ">=3.10,<3.13"
|
python-versions = ">=3.10,<3.13"
|
||||||
content-hash = "f20bd678044926913dbbc24bd0cf22503a75817aa55f59457ff7822032139b77"
|
content-hash = "2ba4b464eebc26598f290fa94713acc44c588f902176e6efa80622911d40f0ac"
|
||||||
|
|
|
@ -122,6 +122,7 @@ celery = "~5.4.0"
|
||||||
chardet = "~5.1.0"
|
chardet = "~5.1.0"
|
||||||
cohere = "~5.2.4"
|
cohere = "~5.2.4"
|
||||||
dashscope = { version = "~1.17.0", extras = ["tokenizer"] }
|
dashscope = { version = "~1.17.0", extras = ["tokenizer"] }
|
||||||
|
fal-client = "0.5.6"
|
||||||
flask = "~3.0.1"
|
flask = "~3.0.1"
|
||||||
flask-compress = "~1.14"
|
flask-compress = "~1.14"
|
||||||
flask-cors = "~4.0.0"
|
flask-cors = "~4.0.0"
|
||||||
|
@ -278,4 +279,4 @@ pytest-mock = "~3.14.0"
|
||||||
optional = true
|
optional = true
|
||||||
[tool.poetry.group.lint.dependencies]
|
[tool.poetry.group.lint.dependencies]
|
||||||
dotenv-linter = "~0.5.0"
|
dotenv-linter = "~0.5.0"
|
||||||
ruff = "~0.6.9"
|
ruff = "~0.7.3"
|
||||||
|
|
|
@ -1458,6 +1458,7 @@ class SegmentService:
|
||||||
pre_segment_data_list = []
|
pre_segment_data_list = []
|
||||||
segment_data_list = []
|
segment_data_list = []
|
||||||
keywords_list = []
|
keywords_list = []
|
||||||
|
position = max_position + 1 if max_position else 1
|
||||||
for segment_item in segments:
|
for segment_item in segments:
|
||||||
content = segment_item["content"]
|
content = segment_item["content"]
|
||||||
doc_id = str(uuid.uuid4())
|
doc_id = str(uuid.uuid4())
|
||||||
|
@ -1475,7 +1476,7 @@ class SegmentService:
|
||||||
document_id=document.id,
|
document_id=document.id,
|
||||||
index_node_id=doc_id,
|
index_node_id=doc_id,
|
||||||
index_node_hash=segment_hash,
|
index_node_hash=segment_hash,
|
||||||
position=max_position + 1 if max_position else 1,
|
position=position,
|
||||||
content=content,
|
content=content,
|
||||||
word_count=len(content),
|
word_count=len(content),
|
||||||
tokens=tokens,
|
tokens=tokens,
|
||||||
|
@ -1490,6 +1491,7 @@ class SegmentService:
|
||||||
increment_word_count += segment_document.word_count
|
increment_word_count += segment_document.word_count
|
||||||
db.session.add(segment_document)
|
db.session.add(segment_document)
|
||||||
segment_data_list.append(segment_document)
|
segment_data_list.append(segment_document)
|
||||||
|
position += 1
|
||||||
|
|
||||||
pre_segment_data_list.append(segment_document)
|
pre_segment_data_list.append(segment_document)
|
||||||
if "keywords" in segment_item:
|
if "keywords" in segment_item:
|
||||||
|
|
|
@ -109,8 +109,10 @@ class ApiToolManageService:
|
||||||
if schema_type not in [member.value for member in ApiProviderSchemaType]:
|
if schema_type not in [member.value for member in ApiProviderSchemaType]:
|
||||||
raise ValueError(f"invalid schema type {schema}")
|
raise ValueError(f"invalid schema type {schema}")
|
||||||
|
|
||||||
|
provider_name = provider_name.strip()
|
||||||
|
|
||||||
# check if the provider exists
|
# check if the provider exists
|
||||||
provider: ApiToolProvider | None = (
|
provider = (
|
||||||
db.session.query(ApiToolProvider)
|
db.session.query(ApiToolProvider)
|
||||||
.filter(
|
.filter(
|
||||||
ApiToolProvider.tenant_id == tenant_id,
|
ApiToolProvider.tenant_id == tenant_id,
|
||||||
|
@ -249,8 +251,10 @@ class ApiToolManageService:
|
||||||
if schema_type not in [member.value for member in ApiProviderSchemaType]:
|
if schema_type not in [member.value for member in ApiProviderSchemaType]:
|
||||||
raise ValueError(f"invalid schema type {schema}")
|
raise ValueError(f"invalid schema type {schema}")
|
||||||
|
|
||||||
|
provider_name = provider_name.strip()
|
||||||
|
|
||||||
# check if the provider exists
|
# check if the provider exists
|
||||||
provider: ApiToolProvider | None = (
|
provider = (
|
||||||
db.session.query(ApiToolProvider)
|
db.session.query(ApiToolProvider)
|
||||||
.filter(
|
.filter(
|
||||||
ApiToolProvider.tenant_id == tenant_id,
|
ApiToolProvider.tenant_id == tenant_id,
|
||||||
|
@ -322,7 +326,7 @@ class ApiToolManageService:
|
||||||
"""
|
"""
|
||||||
delete tool provider
|
delete tool provider
|
||||||
"""
|
"""
|
||||||
provider: ApiToolProvider | None = (
|
provider = (
|
||||||
db.session.query(ApiToolProvider)
|
db.session.query(ApiToolProvider)
|
||||||
.filter(
|
.filter(
|
||||||
ApiToolProvider.tenant_id == tenant_id,
|
ApiToolProvider.tenant_id == tenant_id,
|
||||||
|
@ -372,7 +376,7 @@ class ApiToolManageService:
|
||||||
if tool_bundle is None:
|
if tool_bundle is None:
|
||||||
raise ValueError(f"invalid tool name {tool_name}")
|
raise ValueError(f"invalid tool name {tool_name}")
|
||||||
|
|
||||||
db_provider: ApiToolProvider | None = (
|
db_provider = (
|
||||||
db.session.query(ApiToolProvider)
|
db.session.query(ApiToolProvider)
|
||||||
.filter(
|
.filter(
|
||||||
ApiToolProvider.tenant_id == tenant_id,
|
ApiToolProvider.tenant_id == tenant_id,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import click
|
||||||
from celery import shared_task
|
from celery import shared_task
|
||||||
|
|
||||||
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
|
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
|
||||||
|
from core.tools.utils.rag_web_reader import get_image_upload_file_ids
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from extensions.ext_storage import storage
|
from extensions.ext_storage import storage
|
||||||
from models.dataset import (
|
from models.dataset import (
|
||||||
|
@ -67,6 +68,16 @@ def clean_dataset_task(
|
||||||
db.session.delete(document)
|
db.session.delete(document)
|
||||||
|
|
||||||
for segment in segments:
|
for segment in segments:
|
||||||
|
image_upload_file_ids = get_image_upload_file_ids(segment.content)
|
||||||
|
for upload_file_id in image_upload_file_ids:
|
||||||
|
image_file = db.session.query(UploadFile).filter(UploadFile.id == upload_file_id).first()
|
||||||
|
try:
|
||||||
|
storage.delete(image_file.key)
|
||||||
|
except Exception:
|
||||||
|
logging.exception(
|
||||||
|
"Delete image_files failed when storage deleted, \
|
||||||
|
image_upload_file_is: {}".format(upload_file_id)
|
||||||
|
)
|
||||||
db.session.delete(segment)
|
db.session.delete(segment)
|
||||||
|
|
||||||
db.session.query(DatasetProcessRule).filter(DatasetProcessRule.dataset_id == dataset_id).delete()
|
db.session.query(DatasetProcessRule).filter(DatasetProcessRule.dataset_id == dataset_id).delete()
|
||||||
|
|
|
@ -6,6 +6,7 @@ import click
|
||||||
from celery import shared_task
|
from celery import shared_task
|
||||||
|
|
||||||
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
|
from core.rag.index_processor.index_processor_factory import IndexProcessorFactory
|
||||||
|
from core.tools.utils.rag_web_reader import get_image_upload_file_ids
|
||||||
from extensions.ext_database import db
|
from extensions.ext_database import db
|
||||||
from extensions.ext_storage import storage
|
from extensions.ext_storage import storage
|
||||||
from models.dataset import Dataset, DocumentSegment
|
from models.dataset import Dataset, DocumentSegment
|
||||||
|
@ -40,6 +41,16 @@ def clean_document_task(document_id: str, dataset_id: str, doc_form: str, file_i
|
||||||
index_processor.clean(dataset, index_node_ids)
|
index_processor.clean(dataset, index_node_ids)
|
||||||
|
|
||||||
for segment in segments:
|
for segment in segments:
|
||||||
|
image_upload_file_ids = get_image_upload_file_ids(segment.content)
|
||||||
|
for upload_file_id in image_upload_file_ids:
|
||||||
|
image_file = db.session.query(UploadFile).filter(UploadFile.id == upload_file_id).first()
|
||||||
|
try:
|
||||||
|
storage.delete(image_file.key)
|
||||||
|
except Exception:
|
||||||
|
logging.exception(
|
||||||
|
"Delete image_files failed when storage deleted, \
|
||||||
|
image_upload_file_is: {}".format(upload_file_id)
|
||||||
|
)
|
||||||
db.session.delete(segment)
|
db.session.delete(segment)
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
|
@ -25,7 +25,9 @@ def document_indexing_task(dataset_id: str, document_ids: list):
|
||||||
start_at = time.perf_counter()
|
start_at = time.perf_counter()
|
||||||
|
|
||||||
dataset = db.session.query(Dataset).filter(Dataset.id == dataset_id).first()
|
dataset = db.session.query(Dataset).filter(Dataset.id == dataset_id).first()
|
||||||
|
if not dataset:
|
||||||
|
logging.info(click.style("Dataset is not found: {}".format(dataset_id), fg="yellow"))
|
||||||
|
return
|
||||||
# check document limit
|
# check document limit
|
||||||
features = FeatureService.get_features(dataset.tenant_id)
|
features = FeatureService.get_features(dataset.tenant_id)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
from collections import UserDict
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -11,7 +12,7 @@ from pymochow.model.table import Table
|
||||||
from requests.adapters import HTTPAdapter
|
from requests.adapters import HTTPAdapter
|
||||||
|
|
||||||
|
|
||||||
class AttrDict(dict):
|
class AttrDict(UserDict):
|
||||||
def __getattr__(self, item):
|
def __getattr__(self, item):
|
||||||
return self.get(item)
|
return self.get(item)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
from collections import UserDict
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -50,7 +51,7 @@ class MockIndex:
|
||||||
return AttrDict({"dimension": 1024})
|
return AttrDict({"dimension": 1024})
|
||||||
|
|
||||||
|
|
||||||
class AttrDict(dict):
|
class AttrDict(UserDict):
|
||||||
def __getattr__(self, item):
|
def __getattr__(self, item):
|
||||||
return self.get(item)
|
return self.get(item)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from core.helper import encrypter
|
from core.helper import encrypter
|
||||||
from core.variables import SecretVariable, StringSegment
|
from core.variables import SecretVariable, StringVariable
|
||||||
from core.workflow.entities.variable_pool import VariablePool
|
from core.workflow.entities.variable_pool import VariablePool
|
||||||
from core.workflow.enums import SystemVariableKey
|
from core.workflow.enums import SystemVariableKey
|
||||||
|
|
||||||
|
@ -54,4 +54,5 @@ def test_convert_variable_to_segment_group():
|
||||||
segments_group = variable_pool.convert_template(template)
|
segments_group = variable_pool.convert_template(template)
|
||||||
assert segments_group.text == "fake-user-id"
|
assert segments_group.text == "fake-user-id"
|
||||||
assert segments_group.log == "fake-user-id"
|
assert segments_group.log == "fake-user-id"
|
||||||
assert segments_group.value == [StringSegment(value="fake-user-id")]
|
assert isinstance(segments_group.value[0], StringVariable)
|
||||||
|
assert segments_group.value[0].value == "fake-user-id"
|
||||||
|
|
|
@ -140,6 +140,17 @@ def test_extract_text_from_plain_text():
|
||||||
assert text == "Hello, world!"
|
assert text == "Hello, world!"
|
||||||
|
|
||||||
|
|
||||||
|
def test_extract_text_from_plain_text_non_utf8():
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
non_utf8_content = b"Hello, world\xa9." # \xA9 represents © in Latin-1
|
||||||
|
with tempfile.NamedTemporaryFile(delete=True) as temp_file:
|
||||||
|
temp_file.write(non_utf8_content)
|
||||||
|
temp_file.seek(0)
|
||||||
|
text = _extract_text_from_plain_text(temp_file.read())
|
||||||
|
assert text == "Hello, world."
|
||||||
|
|
||||||
|
|
||||||
@patch("pypdfium2.PdfDocument")
|
@patch("pypdfium2.PdfDocument")
|
||||||
def test_extract_text_from_pdf(mock_pdf_document):
|
def test_extract_text_from_pdf(mock_pdf_document):
|
||||||
mock_page = Mock()
|
mock_page = Mock()
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
from collections import UserDict
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -14,7 +15,7 @@ from tests.unit_tests.oss.__mock.base import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class AttrDict(dict):
|
class AttrDict(UserDict):
|
||||||
def __getattr__(self, item):
|
def __getattr__(self, item):
|
||||||
return self.get(item)
|
return self.get(item)
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ version: '3'
|
||||||
services:
|
services:
|
||||||
# API service
|
# API service
|
||||||
api:
|
api:
|
||||||
image: langgenius/dify-api:0.11.0
|
image: langgenius/dify-api:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
# Startup mode, 'api' starts the API server.
|
# Startup mode, 'api' starts the API server.
|
||||||
|
@ -227,7 +227,7 @@ services:
|
||||||
# worker service
|
# worker service
|
||||||
# The Celery worker for processing the queue.
|
# The Celery worker for processing the queue.
|
||||||
worker:
|
worker:
|
||||||
image: langgenius/dify-api:0.11.0
|
image: langgenius/dify-api:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
CONSOLE_WEB_URL: ''
|
CONSOLE_WEB_URL: ''
|
||||||
|
@ -397,7 +397,7 @@ services:
|
||||||
|
|
||||||
# Frontend web application.
|
# Frontend web application.
|
||||||
web:
|
web:
|
||||||
image: langgenius/dify-web:0.11.0
|
image: langgenius/dify-web:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
# The base URL of console application api server, refers to the Console base URL of WEB service if console domain is
|
# The base URL of console application api server, refers to the Console base URL of WEB service if console domain is
|
||||||
|
|
|
@ -689,6 +689,9 @@ TEMPLATE_TRANSFORM_MAX_LENGTH=80000
|
||||||
CODE_MAX_STRING_ARRAY_LENGTH=30
|
CODE_MAX_STRING_ARRAY_LENGTH=30
|
||||||
CODE_MAX_OBJECT_ARRAY_LENGTH=30
|
CODE_MAX_OBJECT_ARRAY_LENGTH=30
|
||||||
CODE_MAX_NUMBER_ARRAY_LENGTH=1000
|
CODE_MAX_NUMBER_ARRAY_LENGTH=1000
|
||||||
|
CODE_EXECUTION_CONNECT_TIMEOUT=10
|
||||||
|
CODE_EXECUTION_READ_TIMEOUT=60
|
||||||
|
CODE_EXECUTION_WRITE_TIMEOUT=10
|
||||||
|
|
||||||
# Workflow runtime configuration
|
# Workflow runtime configuration
|
||||||
WORKFLOW_MAX_EXECUTION_STEPS=500
|
WORKFLOW_MAX_EXECUTION_STEPS=500
|
||||||
|
|
|
@ -244,6 +244,9 @@ x-shared-env: &shared-api-worker-env
|
||||||
RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: ${RESET_PASSWORD_TOKEN_EXPIRY_MINUTES:-5}
|
RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: ${RESET_PASSWORD_TOKEN_EXPIRY_MINUTES:-5}
|
||||||
CODE_EXECUTION_ENDPOINT: ${CODE_EXECUTION_ENDPOINT:-http://sandbox:8194}
|
CODE_EXECUTION_ENDPOINT: ${CODE_EXECUTION_ENDPOINT:-http://sandbox:8194}
|
||||||
CODE_EXECUTION_API_KEY: ${SANDBOX_API_KEY:-dify-sandbox}
|
CODE_EXECUTION_API_KEY: ${SANDBOX_API_KEY:-dify-sandbox}
|
||||||
|
CODE_EXECUTION_CONNECT_TIMEOUT: ${CODE_EXECUTION_CONNECT_TIMEOUT:-10}
|
||||||
|
CODE_EXECUTION_READ_TIMEOUT: ${CODE_EXECUTION_READ_TIMEOUT:-60}
|
||||||
|
CODE_EXECUTION_WRITE_TIMEOUT: ${CODE_EXECUTION_WRITE_TIMEOUT:-10}
|
||||||
CODE_MAX_NUMBER: ${CODE_MAX_NUMBER:-9223372036854775807}
|
CODE_MAX_NUMBER: ${CODE_MAX_NUMBER:-9223372036854775807}
|
||||||
CODE_MIN_NUMBER: ${CODE_MIN_NUMBER:--9223372036854775808}
|
CODE_MIN_NUMBER: ${CODE_MIN_NUMBER:--9223372036854775808}
|
||||||
CODE_MAX_DEPTH: ${CODE_MAX_DEPTH:-5}
|
CODE_MAX_DEPTH: ${CODE_MAX_DEPTH:-5}
|
||||||
|
@ -280,7 +283,7 @@ x-shared-env: &shared-api-worker-env
|
||||||
services:
|
services:
|
||||||
# API service
|
# API service
|
||||||
api:
|
api:
|
||||||
image: langgenius/dify-api:0.11.0
|
image: langgenius/dify-api:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
# Use the shared environment variables.
|
# Use the shared environment variables.
|
||||||
|
@ -300,7 +303,7 @@ services:
|
||||||
# worker service
|
# worker service
|
||||||
# The Celery worker for processing the queue.
|
# The Celery worker for processing the queue.
|
||||||
worker:
|
worker:
|
||||||
image: langgenius/dify-api:0.11.0
|
image: langgenius/dify-api:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
# Use the shared environment variables.
|
# Use the shared environment variables.
|
||||||
|
@ -319,7 +322,7 @@ services:
|
||||||
|
|
||||||
# Frontend web application.
|
# Frontend web application.
|
||||||
web:
|
web:
|
||||||
image: langgenius/dify-web:0.11.0
|
image: langgenius/dify-web:0.11.1
|
||||||
restart: always
|
restart: always
|
||||||
environment:
|
environment:
|
||||||
CONSOLE_API_URL: ${CONSOLE_API_URL:-}
|
CONSOLE_API_URL: ${CONSOLE_API_URL:-}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# base image
|
# base image
|
||||||
FROM node:20.11-alpine3.19 AS base
|
FROM node:20-alpine3.20 AS base
|
||||||
LABEL maintainer="takatost@gmail.com"
|
LABEL maintainer="takatost@gmail.com"
|
||||||
|
|
||||||
# if you located in China, you can use aliyun mirror to speed up
|
# if you located in China, you can use aliyun mirror to speed up
|
||||||
|
|
|
@ -47,12 +47,16 @@ const DatasetConfig: FC = () => {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
currentModel: currentRerankModel,
|
currentModel: currentRerankModel,
|
||||||
|
currentProvider: currentRerankProvider,
|
||||||
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
||||||
|
|
||||||
const onRemove = (id: string) => {
|
const onRemove = (id: string) => {
|
||||||
const filteredDataSets = dataSet.filter(item => item.id !== id)
|
const filteredDataSets = dataSet.filter(item => item.id !== id)
|
||||||
setDataSet(filteredDataSets)
|
setDataSet(filteredDataSets)
|
||||||
const retrievalConfig = getMultipleRetrievalConfig(datasetConfigs as any, filteredDataSets, dataSet, !!currentRerankModel)
|
const retrievalConfig = getMultipleRetrievalConfig(datasetConfigs as any, filteredDataSets, dataSet, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
setDatasetConfigs({
|
setDatasetConfigs({
|
||||||
...(datasetConfigs as any),
|
...(datasetConfigs as any),
|
||||||
...retrievalConfig,
|
...retrievalConfig,
|
||||||
|
|
|
@ -172,7 +172,7 @@ const ConfigContent: FC<Props> = ({
|
||||||
return false
|
return false
|
||||||
|
|
||||||
return datasetConfigs.reranking_enable
|
return datasetConfigs.reranking_enable
|
||||||
}, [canManuallyToggleRerank, datasetConfigs.reranking_enable])
|
}, [canManuallyToggleRerank, datasetConfigs.reranking_enable, isRerankDefaultModelValid])
|
||||||
|
|
||||||
const handleDisabledSwitchClick = useCallback(() => {
|
const handleDisabledSwitchClick = useCallback(() => {
|
||||||
if (!currentRerankModel && !showRerankModel)
|
if (!currentRerankModel && !showRerankModel)
|
||||||
|
|
|
@ -43,6 +43,7 @@ const ParamsConfig = ({
|
||||||
const {
|
const {
|
||||||
defaultModel: rerankDefaultModel,
|
defaultModel: rerankDefaultModel,
|
||||||
currentModel: isRerankDefaultModelValid,
|
currentModel: isRerankDefaultModelValid,
|
||||||
|
currentProvider: rerankDefaultProvider,
|
||||||
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
||||||
|
|
||||||
const isValid = () => {
|
const isValid = () => {
|
||||||
|
@ -91,7 +92,10 @@ const ParamsConfig = ({
|
||||||
reranking_mode: restConfigs.reranking_mode,
|
reranking_mode: restConfigs.reranking_mode,
|
||||||
weights: restConfigs.weights,
|
weights: restConfigs.weights,
|
||||||
reranking_enable: restConfigs.reranking_enable,
|
reranking_enable: restConfigs.reranking_enable,
|
||||||
}, selectedDatasets, selectedDatasets, !!isRerankDefaultModelValid)
|
}, selectedDatasets, selectedDatasets, {
|
||||||
|
provider: rerankDefaultProvider?.provider,
|
||||||
|
model: isRerankDefaultModelValid?.model,
|
||||||
|
})
|
||||||
|
|
||||||
setTempDataSetConfigs({
|
setTempDataSetConfigs({
|
||||||
...retrievalConfig,
|
...retrievalConfig,
|
||||||
|
|
|
@ -227,6 +227,7 @@ const Configuration: FC = () => {
|
||||||
const [rerankSettingModalOpen, setRerankSettingModalOpen] = useState(false)
|
const [rerankSettingModalOpen, setRerankSettingModalOpen] = useState(false)
|
||||||
const {
|
const {
|
||||||
currentModel: currentRerankModel,
|
currentModel: currentRerankModel,
|
||||||
|
currentProvider: currentRerankProvider,
|
||||||
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
} = useModelListAndDefaultModelAndCurrentProviderAndModel(ModelTypeEnum.rerank)
|
||||||
const handleSelect = (data: DataSet[]) => {
|
const handleSelect = (data: DataSet[]) => {
|
||||||
if (isEqual(data.map(item => item.id), dataSets.map(item => item.id))) {
|
if (isEqual(data.map(item => item.id), dataSets.map(item => item.id))) {
|
||||||
|
@ -280,7 +281,10 @@ const Configuration: FC = () => {
|
||||||
reranking_mode: restConfigs.reranking_mode,
|
reranking_mode: restConfigs.reranking_mode,
|
||||||
weights: restConfigs.weights,
|
weights: restConfigs.weights,
|
||||||
reranking_enable: restConfigs.reranking_enable,
|
reranking_enable: restConfigs.reranking_enable,
|
||||||
}, newDatasets, dataSets, !!currentRerankModel)
|
}, newDatasets, dataSets, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
|
|
||||||
setDatasetConfigs({
|
setDatasetConfigs({
|
||||||
...retrievalConfig,
|
...retrievalConfig,
|
||||||
|
@ -635,7 +639,10 @@ const Configuration: FC = () => {
|
||||||
|
|
||||||
syncToPublishedConfig(config)
|
syncToPublishedConfig(config)
|
||||||
setPublishedConfig(config)
|
setPublishedConfig(config)
|
||||||
const retrievalConfig = getMultipleRetrievalConfig(modelConfig.dataset_configs, datasets, datasets, !!currentRerankModel)
|
const retrievalConfig = getMultipleRetrievalConfig(modelConfig.dataset_configs, datasets, datasets, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
setDatasetConfigs({
|
setDatasetConfigs({
|
||||||
retrieval_model: RETRIEVE_TYPE.multiWay,
|
retrieval_model: RETRIEVE_TYPE.multiWay,
|
||||||
...modelConfig.dataset_configs,
|
...modelConfig.dataset_configs,
|
||||||
|
|
|
@ -261,6 +261,10 @@ const SettingsModal: FC<ISettingsModalProps> = ({
|
||||||
onChange={onChange('chatColorTheme')}
|
onChange={onChange('chatColorTheme')}
|
||||||
placeholder='E.g #A020F0'
|
placeholder='E.g #A020F0'
|
||||||
/>
|
/>
|
||||||
|
<div className="mt-1 flex justify-between items-center">
|
||||||
|
<p className={`ml-2 ${s.settingsTip} text-gray-500`}>{t(`${prefixSettings}.chatColorThemeInverted`)}</p>
|
||||||
|
<Switch defaultValue={inputInfo.chatColorThemeInverted} onChange={v => setInputInfo({ ...inputInfo, chatColorThemeInverted: v })}></Switch>
|
||||||
|
</div>
|
||||||
</>}
|
</>}
|
||||||
{systemFeatures.enable_web_sso_switch_component && <div className='w-full mt-8'>
|
{systemFeatures.enable_web_sso_switch_component && <div className='w-full mt-8'>
|
||||||
<p className='system-xs-medium text-gray-500'>{t(`${prefixSettings}.sso.label`)}</p>
|
<p className='system-xs-medium text-gray-500'>{t(`${prefixSettings}.sso.label`)}</p>
|
||||||
|
|
|
@ -173,7 +173,7 @@ export const useChatWithHistory = (installedAppInfo?: InstalledApp) => {
|
||||||
const conversationInputs: Record<string, any> = {}
|
const conversationInputs: Record<string, any> = {}
|
||||||
|
|
||||||
inputsForms.forEach((item: any) => {
|
inputsForms.forEach((item: any) => {
|
||||||
conversationInputs[item.variable] = item.default || ''
|
conversationInputs[item.variable] = item.default || null
|
||||||
})
|
})
|
||||||
handleNewConversationInputsChange(conversationInputs)
|
handleNewConversationInputsChange(conversationInputs)
|
||||||
}, [handleNewConversationInputsChange, inputsForms])
|
}, [handleNewConversationInputsChange, inputsForms])
|
||||||
|
|
|
@ -159,7 +159,7 @@ export const useEmbeddedChatbot = () => {
|
||||||
const conversationInputs: Record<string, any> = {}
|
const conversationInputs: Record<string, any> = {}
|
||||||
|
|
||||||
inputsForms.forEach((item: any) => {
|
inputsForms.forEach((item: any) => {
|
||||||
conversationInputs[item.variable] = item.default || ''
|
conversationInputs[item.variable] = item.default || null
|
||||||
})
|
})
|
||||||
handleNewConversationInputsChange(conversationInputs)
|
handleNewConversationInputsChange(conversationInputs)
|
||||||
}, [handleNewConversationInputsChange, inputsForms])
|
}, [handleNewConversationInputsChange, inputsForms])
|
||||||
|
|
|
@ -53,6 +53,6 @@ export const getInputVars = (text: string): ValueSelector[] => {
|
||||||
export const FILE_EXTS: Record<string, string[]> = {
|
export const FILE_EXTS: Record<string, string[]> = {
|
||||||
[SupportUploadFileTypes.image]: ['JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'],
|
[SupportUploadFileTypes.image]: ['JPG', 'JPEG', 'PNG', 'GIF', 'WEBP', 'SVG'],
|
||||||
[SupportUploadFileTypes.document]: ['TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'],
|
[SupportUploadFileTypes.document]: ['TXT', 'MD', 'MARKDOWN', 'PDF', 'HTML', 'XLSX', 'XLS', 'DOCX', 'CSV', 'EML', 'MSG', 'PPTX', 'PPT', 'XML', 'EPUB'],
|
||||||
[SupportUploadFileTypes.audio]: ['MP3', 'M4A', 'WAV', 'WEBM', 'AMR'],
|
[SupportUploadFileTypes.audio]: ['MP3', 'M4A', 'WAV', 'WEBM', 'AMR', 'MPGA'],
|
||||||
[SupportUploadFileTypes.video]: ['MP4', 'MOV', 'MPEG', 'MPGA'],
|
[SupportUploadFileTypes.video]: ['MP4', 'MOV', 'MPEG', 'MPGA'],
|
||||||
}
|
}
|
||||||
|
|
|
@ -774,6 +774,10 @@ Chat applications support session persistence, allowing previous chat history to
|
||||||
<Row>
|
<Row>
|
||||||
<Col>
|
<Col>
|
||||||
### Request Body
|
### Request Body
|
||||||
|
Rename the session, the session name is used for display on clients that support multiple sessions.
|
||||||
|
|
||||||
|
### Path
|
||||||
|
- `conversation_id` (string) Conversation ID
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name='name' type='string' key='name'>
|
<Property name='name' type='string' key='name'>
|
||||||
|
@ -796,10 +800,10 @@ Chat applications support session persistence, allowing previous chat history to
|
||||||
</Col>
|
</Col>
|
||||||
<Col sticky>
|
<Col sticky>
|
||||||
|
|
||||||
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
||||||
|
|
||||||
```bash {{ title: 'cURL' }}
|
```bash {{ title: 'cURL' }}
|
||||||
curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \
|
curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
|
||||||
--header 'Content-Type: application/json' \
|
--header 'Content-Type: application/json' \
|
||||||
--header 'Authorization: Bearer {api_key}' \
|
--header 'Authorization: Bearer {api_key}' \
|
||||||
--data-raw '{
|
--data-raw '{
|
||||||
|
|
|
@ -810,6 +810,9 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||||
<Col>
|
<Col>
|
||||||
对会话进行重命名,会话名称用于显示在支持多会话的客户端上。
|
对会话进行重命名,会话名称用于显示在支持多会话的客户端上。
|
||||||
|
|
||||||
|
### Path
|
||||||
|
- `conversation_id` (string) 会话 ID
|
||||||
|
|
||||||
### Request Body
|
### Request Body
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
|
@ -833,10 +836,10 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||||
</Col>
|
</Col>
|
||||||
<Col sticky>
|
<Col sticky>
|
||||||
|
|
||||||
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
||||||
|
|
||||||
```bash {{ title: 'cURL' }}
|
```bash {{ title: 'cURL' }}
|
||||||
curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \
|
curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
|
||||||
--header 'Authorization: Bearer {api_key}' \
|
--header 'Authorization: Bearer {api_key}' \
|
||||||
--header 'Content-Type: application/json' \
|
--header 'Content-Type: application/json' \
|
||||||
--data-raw '{
|
--data-raw '{
|
||||||
|
|
|
@ -808,6 +808,10 @@ Chat applications support session persistence, allowing previous chat history to
|
||||||
<Row>
|
<Row>
|
||||||
<Col>
|
<Col>
|
||||||
### Request Body
|
### Request Body
|
||||||
|
Rename the session, the session name is used for display on clients that support multiple sessions.
|
||||||
|
|
||||||
|
### Path
|
||||||
|
- `conversation_id` (string) Conversation ID
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name='name' type='string' key='name'>
|
<Property name='name' type='string' key='name'>
|
||||||
|
@ -830,10 +834,10 @@ Chat applications support session persistence, allowing previous chat history to
|
||||||
</Col>
|
</Col>
|
||||||
<Col sticky>
|
<Col sticky>
|
||||||
|
|
||||||
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
||||||
|
|
||||||
```bash {{ title: 'cURL' }}
|
```bash {{ title: 'cURL' }}
|
||||||
curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \
|
curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
|
||||||
--header 'Content-Type: application/json' \
|
--header 'Content-Type: application/json' \
|
||||||
--header 'Authorization: Bearer {api_key}' \
|
--header 'Authorization: Bearer {api_key}' \
|
||||||
--data-raw '{
|
--data-raw '{
|
||||||
|
|
|
@ -824,6 +824,9 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||||
<Col>
|
<Col>
|
||||||
对会话进行重命名,会话名称用于显示在支持多会话的客户端上。
|
对会话进行重命名,会话名称用于显示在支持多会话的客户端上。
|
||||||
|
|
||||||
|
### Path
|
||||||
|
- `conversation_id` (string) 会话 ID
|
||||||
|
|
||||||
### Request Body
|
### Request Body
|
||||||
|
|
||||||
<Properties>
|
<Properties>
|
||||||
|
@ -847,10 +850,10 @@ import { Row, Col, Properties, Property, Heading, SubProperty } from '../md.tsx'
|
||||||
</Col>
|
</Col>
|
||||||
<Col sticky>
|
<Col sticky>
|
||||||
|
|
||||||
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
<CodeGroup title="Request" tag="POST" label="/conversations/:conversation_id/name" targetCode={`curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \\\n--header 'Authorization: Bearer {api_key}' \\\n--header 'Content-Type: application/json' \\\n--data-raw '{ \n "name": "", \n "user": "abc-123"\n}'`}>
|
||||||
|
|
||||||
```bash {{ title: 'cURL' }}
|
```bash {{ title: 'cURL' }}
|
||||||
curl -X POST '${props.appDetail.api_base_url}/conversations/:conversation_id/name' \
|
curl -X POST '${props.appDetail.api_base_url}/conversations/{conversation_id}/name' \
|
||||||
--header 'Authorization: Bearer {api_key}' \
|
--header 'Authorization: Bearer {api_key}' \
|
||||||
--header 'Content-Type: application/json' \
|
--header 'Content-Type: application/json' \
|
||||||
--data-raw '{
|
--data-raw '{
|
||||||
|
|
|
@ -94,6 +94,7 @@ const TextGeneration: FC<IMainProps> = ({
|
||||||
const [isCallBatchAPI, setIsCallBatchAPI] = useState(false)
|
const [isCallBatchAPI, setIsCallBatchAPI] = useState(false)
|
||||||
const isInBatchTab = currentTab === 'batch'
|
const isInBatchTab = currentTab === 'batch'
|
||||||
const [inputs, setInputs] = useState<Record<string, any>>({})
|
const [inputs, setInputs] = useState<Record<string, any>>({})
|
||||||
|
const inputsRef = useRef(inputs)
|
||||||
const [appId, setAppId] = useState<string>('')
|
const [appId, setAppId] = useState<string>('')
|
||||||
const [siteInfo, setSiteInfo] = useState<SiteInfo | null>(null)
|
const [siteInfo, setSiteInfo] = useState<SiteInfo | null>(null)
|
||||||
const [canReplaceLogo, setCanReplaceLogo] = useState<boolean>(false)
|
const [canReplaceLogo, setCanReplaceLogo] = useState<boolean>(false)
|
||||||
|
@ -603,6 +604,7 @@ const TextGeneration: FC<IMainProps> = ({
|
||||||
<RunOnce
|
<RunOnce
|
||||||
siteInfo={siteInfo}
|
siteInfo={siteInfo}
|
||||||
inputs={inputs}
|
inputs={inputs}
|
||||||
|
inputsRef={inputsRef}
|
||||||
onInputsChange={setInputs}
|
onInputsChange={setInputs}
|
||||||
promptConfig={promptConfig}
|
promptConfig={promptConfig}
|
||||||
onSend={handleSend}
|
onSend={handleSend}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import type { FC, FormEvent } from 'react'
|
import type { FC, FormEvent } from 'react'
|
||||||
import React from 'react'
|
import React, { useCallback } from 'react'
|
||||||
import { useTranslation } from 'react-i18next'
|
import { useTranslation } from 'react-i18next'
|
||||||
import {
|
import {
|
||||||
PlayIcon,
|
PlayIcon,
|
||||||
|
@ -19,6 +19,7 @@ export type IRunOnceProps = {
|
||||||
siteInfo: SiteInfo
|
siteInfo: SiteInfo
|
||||||
promptConfig: PromptConfig
|
promptConfig: PromptConfig
|
||||||
inputs: Record<string, any>
|
inputs: Record<string, any>
|
||||||
|
inputsRef: React.MutableRefObject<Record<string, any>>
|
||||||
onInputsChange: (inputs: Record<string, any>) => void
|
onInputsChange: (inputs: Record<string, any>) => void
|
||||||
onSend: () => void
|
onSend: () => void
|
||||||
visionConfig: VisionSettings
|
visionConfig: VisionSettings
|
||||||
|
@ -27,6 +28,7 @@ export type IRunOnceProps = {
|
||||||
const RunOnce: FC<IRunOnceProps> = ({
|
const RunOnce: FC<IRunOnceProps> = ({
|
||||||
promptConfig,
|
promptConfig,
|
||||||
inputs,
|
inputs,
|
||||||
|
inputsRef,
|
||||||
onInputsChange,
|
onInputsChange,
|
||||||
onSend,
|
onSend,
|
||||||
visionConfig,
|
visionConfig,
|
||||||
|
@ -47,6 +49,11 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
onSend()
|
onSend()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handleInputsChange = useCallback((newInputs: Record<string, any>) => {
|
||||||
|
onInputsChange(newInputs)
|
||||||
|
inputsRef.current = newInputs
|
||||||
|
}, [onInputsChange, inputsRef])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="">
|
<div className="">
|
||||||
<section>
|
<section>
|
||||||
|
@ -60,7 +67,7 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
<Select
|
<Select
|
||||||
className='w-full'
|
className='w-full'
|
||||||
defaultValue={inputs[item.key]}
|
defaultValue={inputs[item.key]}
|
||||||
onSelect={(i) => { onInputsChange({ ...inputs, [item.key]: i.value }) }}
|
onSelect={(i) => { handleInputsChange({ ...inputsRef.current, [item.key]: i.value }) }}
|
||||||
items={(item.options || []).map(i => ({ name: i, value: i }))}
|
items={(item.options || []).map(i => ({ name: i, value: i }))}
|
||||||
allowSearch={false}
|
allowSearch={false}
|
||||||
bgClassName='bg-gray-50'
|
bgClassName='bg-gray-50'
|
||||||
|
@ -72,7 +79,7 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
className="block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
|
className="block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
|
||||||
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
||||||
value={inputs[item.key]}
|
value={inputs[item.key]}
|
||||||
onChange={(e) => { onInputsChange({ ...inputs, [item.key]: e.target.value }) }}
|
onChange={(e) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
|
||||||
maxLength={item.max_length || DEFAULT_VALUE_MAX_LEN}
|
maxLength={item.max_length || DEFAULT_VALUE_MAX_LEN}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
@ -81,7 +88,7 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
className='h-[104px] sm:text-xs'
|
className='h-[104px] sm:text-xs'
|
||||||
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
||||||
value={inputs[item.key]}
|
value={inputs[item.key]}
|
||||||
onChange={(e) => { onInputsChange({ ...inputs, [item.key]: e.target.value }) }}
|
onChange={(e) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{item.type === 'number' && (
|
{item.type === 'number' && (
|
||||||
|
@ -90,12 +97,12 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
className="block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
|
className="block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 "
|
||||||
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
placeholder={`${item.name}${!item.required ? `(${t('appDebug.variableTable.optional')})` : ''}`}
|
||||||
value={inputs[item.key]}
|
value={inputs[item.key]}
|
||||||
onChange={(e) => { onInputsChange({ ...inputs, [item.key]: e.target.value }) }}
|
onChange={(e) => { handleInputsChange({ ...inputsRef.current, [item.key]: e.target.value }) }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{item.type === 'file' && (
|
{item.type === 'file' && (
|
||||||
<FileUploaderInAttachmentWrapper
|
<FileUploaderInAttachmentWrapper
|
||||||
onChange={(files) => { onInputsChange({ ...inputs, [item.key]: getProcessedFiles(files)[0] }) }}
|
onChange={(files) => { handleInputsChange({ ...inputsRef.current, [item.key]: getProcessedFiles(files)[0] }) }}
|
||||||
fileConfig={{
|
fileConfig={{
|
||||||
...item.config,
|
...item.config,
|
||||||
fileUploadConfig: (visionConfig as any).fileUploadConfig,
|
fileUploadConfig: (visionConfig as any).fileUploadConfig,
|
||||||
|
@ -104,7 +111,7 @@ const RunOnce: FC<IRunOnceProps> = ({
|
||||||
)}
|
)}
|
||||||
{item.type === 'file-list' && (
|
{item.type === 'file-list' && (
|
||||||
<FileUploaderInAttachmentWrapper
|
<FileUploaderInAttachmentWrapper
|
||||||
onChange={(files) => { onInputsChange({ ...inputs, [item.key]: getProcessedFiles(files) }) }}
|
onChange={(files) => { handleInputsChange({ ...inputsRef.current, [item.key]: getProcessedFiles(files) }) }}
|
||||||
fileConfig={{
|
fileConfig={{
|
||||||
...item.config,
|
...item.config,
|
||||||
fileUploadConfig: (visionConfig as any).fileUploadConfig,
|
fileUploadConfig: (visionConfig as any).fileUploadConfig,
|
||||||
|
|
|
@ -445,6 +445,7 @@ export const useWorkflowRun = () => {
|
||||||
...data,
|
...data,
|
||||||
status: NodeRunningStatus.Running,
|
status: NodeRunningStatus.Running,
|
||||||
details: [],
|
details: [],
|
||||||
|
iterDurationMap: {},
|
||||||
} as any)
|
} as any)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
@ -496,6 +497,8 @@ export const useWorkflowRun = () => {
|
||||||
setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
|
setWorkflowRunningData(produce(workflowRunningData!, (draft) => {
|
||||||
const iteration = draft.tracing!.find(trace => trace.node_id === data.node_id)
|
const iteration = draft.tracing!.find(trace => trace.node_id === data.node_id)
|
||||||
if (iteration) {
|
if (iteration) {
|
||||||
|
if (iteration.iterDurationMap && data.duration)
|
||||||
|
iteration.iterDurationMap[data.parallel_mode_run_id ?? `${data.index - 1}`] = data.duration
|
||||||
if (iteration.details!.length >= iteration.metadata.iterator_length!)
|
if (iteration.details!.length >= iteration.metadata.iterator_length!)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ const BaseNode: FC<BaseNodeProps> = ({
|
||||||
{
|
{
|
||||||
data._iterationLength && data._iterationIndex && data._runningStatus === NodeRunningStatus.Running && (
|
data._iterationLength && data._iterationIndex && data._runningStatus === NodeRunningStatus.Running && (
|
||||||
<div className='mr-1.5 text-xs font-medium text-primary-600'>
|
<div className='mr-1.5 text-xs font-medium text-primary-600'>
|
||||||
{data._iterationIndex}/{data._iterationLength}
|
{data._iterationIndex > data._iterationLength ? data._iterationLength : data._iterationIndex}/{data._iterationLength}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { BlockEnum } from '../../types'
|
import { BlockEnum } from '../../types'
|
||||||
import type { NodeDefault } from '../../types'
|
import type { NodeDefault } from '../../types'
|
||||||
import type { KnowledgeRetrievalNodeType } from './types'
|
import type { KnowledgeRetrievalNodeType } from './types'
|
||||||
import { RerankingModeEnum } from '@/models/datasets'
|
import { checkoutRerankModelConfigedInRetrievalSettings } from './utils'
|
||||||
import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/constants'
|
import { ALL_CHAT_AVAILABLE_BLOCKS, ALL_COMPLETION_AVAILABLE_BLOCKS } from '@/app/components/workflow/constants'
|
||||||
import { DATASET_DEFAULT } from '@/config'
|
import { DATASET_DEFAULT } from '@/config'
|
||||||
import { RETRIEVE_TYPE } from '@/types/app'
|
import { RETRIEVE_TYPE } from '@/types/app'
|
||||||
|
@ -36,12 +36,17 @@ const nodeDefault: NodeDefault<KnowledgeRetrievalNodeType> = {
|
||||||
if (!errorMessages && (!payload.dataset_ids || payload.dataset_ids.length === 0))
|
if (!errorMessages && (!payload.dataset_ids || payload.dataset_ids.length === 0))
|
||||||
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.knowledge`) })
|
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.nodes.knowledgeRetrieval.knowledge`) })
|
||||||
|
|
||||||
if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.multiWay && payload.multiple_retrieval_config?.reranking_mode === RerankingModeEnum.RerankingModel && !payload.multiple_retrieval_config?.reranking_model?.provider && payload.multiple_retrieval_config?.reranking_enable)
|
|
||||||
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.rerankModel`) })
|
|
||||||
|
|
||||||
if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.oneWay && !payload.single_retrieval_config?.model?.provider)
|
if (!errorMessages && payload.retrieval_mode === RETRIEVE_TYPE.oneWay && !payload.single_retrieval_config?.model?.provider)
|
||||||
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t('common.modelProvider.systemReasoningModel.key') })
|
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t('common.modelProvider.systemReasoningModel.key') })
|
||||||
|
|
||||||
|
const { _datasets, multiple_retrieval_config, retrieval_mode } = payload
|
||||||
|
if (retrieval_mode === RETRIEVE_TYPE.multiWay) {
|
||||||
|
const checked = checkoutRerankModelConfigedInRetrievalSettings(_datasets || [], multiple_retrieval_config)
|
||||||
|
|
||||||
|
if (!errorMessages && !checked)
|
||||||
|
errorMessages = t(`${i18nPrefix}.errorMsg.fieldRequired`, { field: t(`${i18nPrefix}.errorMsg.fields.rerankModel`) })
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
isValid: !errorMessages,
|
isValid: !errorMessages,
|
||||||
errorMessage: errorMessages,
|
errorMessage: errorMessages,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import type { CommonNodeType, ModelConfig, ValueSelector } from '@/app/components/workflow/types'
|
import type { CommonNodeType, ModelConfig, ValueSelector } from '@/app/components/workflow/types'
|
||||||
import type { RETRIEVE_TYPE } from '@/types/app'
|
import type { RETRIEVE_TYPE } from '@/types/app'
|
||||||
import type {
|
import type {
|
||||||
|
DataSet,
|
||||||
RerankingModeEnum,
|
RerankingModeEnum,
|
||||||
} from '@/models/datasets'
|
} from '@/models/datasets'
|
||||||
|
|
||||||
|
@ -35,4 +36,5 @@ export type KnowledgeRetrievalNodeType = CommonNodeType & {
|
||||||
retrieval_mode: RETRIEVE_TYPE
|
retrieval_mode: RETRIEVE_TYPE
|
||||||
multiple_retrieval_config?: MultipleRetrievalConfig
|
multiple_retrieval_config?: MultipleRetrievalConfig
|
||||||
single_retrieval_config?: SingleRetrievalConfig
|
single_retrieval_config?: SingleRetrievalConfig
|
||||||
|
_datasets?: DataSet[]
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
currentModel: currentRerankModel,
|
currentModel: currentRerankModel,
|
||||||
|
currentProvider: currentRerankProvider,
|
||||||
} = useCurrentProviderAndModel(
|
} = useCurrentProviderAndModel(
|
||||||
rerankModelList,
|
rerankModelList,
|
||||||
rerankDefaultModel
|
rerankDefaultModel
|
||||||
|
@ -163,7 +164,10 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
draft.retrieval_mode = newMode
|
draft.retrieval_mode = newMode
|
||||||
if (newMode === RETRIEVE_TYPE.multiWay) {
|
if (newMode === RETRIEVE_TYPE.multiWay) {
|
||||||
const multipleRetrievalConfig = draft.multiple_retrieval_config
|
const multipleRetrievalConfig = draft.multiple_retrieval_config
|
||||||
draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, selectedDatasets, selectedDatasets, !!currentRerankModel)
|
draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, selectedDatasets, selectedDatasets, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const hasSetModel = draft.single_retrieval_config?.model?.provider
|
const hasSetModel = draft.single_retrieval_config?.model?.provider
|
||||||
|
@ -180,14 +184,17 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
setInputs(newInputs)
|
setInputs(newInputs)
|
||||||
}, [currentModel?.model, currentModel?.model_properties?.mode, currentProvider?.provider, inputs, setInputs, selectedDatasets, currentRerankModel])
|
}, [currentModel?.model, currentModel?.model_properties?.mode, currentProvider?.provider, inputs, setInputs, selectedDatasets, currentRerankModel, currentRerankProvider])
|
||||||
|
|
||||||
const handleMultipleRetrievalConfigChange = useCallback((newConfig: MultipleRetrievalConfig) => {
|
const handleMultipleRetrievalConfigChange = useCallback((newConfig: MultipleRetrievalConfig) => {
|
||||||
const newInputs = produce(inputs, (draft) => {
|
const newInputs = produce(inputs, (draft) => {
|
||||||
draft.multiple_retrieval_config = getMultipleRetrievalConfig(newConfig!, selectedDatasets, selectedDatasets, !!currentRerankModel)
|
draft.multiple_retrieval_config = getMultipleRetrievalConfig(newConfig!, selectedDatasets, selectedDatasets, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
setInputs(newInputs)
|
setInputs(newInputs)
|
||||||
}, [inputs, setInputs, selectedDatasets, currentRerankModel])
|
}, [inputs, setInputs, selectedDatasets, currentRerankModel, currentRerankProvider])
|
||||||
|
|
||||||
// datasets
|
// datasets
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -200,6 +207,7 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
}
|
}
|
||||||
const newInputs = produce(inputs, (draft) => {
|
const newInputs = produce(inputs, (draft) => {
|
||||||
draft.dataset_ids = datasetIds
|
draft.dataset_ids = datasetIds
|
||||||
|
draft._datasets = selectedDatasets
|
||||||
})
|
})
|
||||||
setInputs(newInputs)
|
setInputs(newInputs)
|
||||||
})()
|
})()
|
||||||
|
@ -228,10 +236,14 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
} = getSelectedDatasetsMode(newDatasets)
|
} = getSelectedDatasetsMode(newDatasets)
|
||||||
const newInputs = produce(inputs, (draft) => {
|
const newInputs = produce(inputs, (draft) => {
|
||||||
draft.dataset_ids = newDatasets.map(d => d.id)
|
draft.dataset_ids = newDatasets.map(d => d.id)
|
||||||
|
draft._datasets = newDatasets
|
||||||
|
|
||||||
if (payload.retrieval_mode === RETRIEVE_TYPE.multiWay && newDatasets.length > 0) {
|
if (payload.retrieval_mode === RETRIEVE_TYPE.multiWay && newDatasets.length > 0) {
|
||||||
const multipleRetrievalConfig = draft.multiple_retrieval_config
|
const multipleRetrievalConfig = draft.multiple_retrieval_config
|
||||||
draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, newDatasets, selectedDatasets, !!currentRerankModel)
|
draft.multiple_retrieval_config = getMultipleRetrievalConfig(multipleRetrievalConfig!, newDatasets, selectedDatasets, {
|
||||||
|
provider: currentRerankProvider?.provider,
|
||||||
|
model: currentRerankModel?.model,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
setInputs(newInputs)
|
setInputs(newInputs)
|
||||||
|
@ -243,7 +255,7 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||||
|| allExternal
|
|| allExternal
|
||||||
)
|
)
|
||||||
setRerankModelOpen(true)
|
setRerankModelOpen(true)
|
||||||
}, [inputs, setInputs, payload.retrieval_mode, selectedDatasets, currentRerankModel])
|
}, [inputs, setInputs, payload.retrieval_mode, selectedDatasets, currentRerankModel, currentRerankProvider])
|
||||||
|
|
||||||
const filterVar = useCallback((varPayload: Var) => {
|
const filterVar = useCallback((varPayload: Var) => {
|
||||||
return varPayload.type === VarType.string
|
return varPayload.type === VarType.string
|
||||||
|
|
|
@ -94,9 +94,10 @@ export const getMultipleRetrievalConfig = (
|
||||||
multipleRetrievalConfig: MultipleRetrievalConfig,
|
multipleRetrievalConfig: MultipleRetrievalConfig,
|
||||||
selectedDatasets: DataSet[],
|
selectedDatasets: DataSet[],
|
||||||
originalDatasets: DataSet[],
|
originalDatasets: DataSet[],
|
||||||
isValidRerankModel?: boolean,
|
validRerankModel?: { provider?: string; model?: string },
|
||||||
) => {
|
) => {
|
||||||
const shouldSetWeightDefaultValue = xorBy(selectedDatasets, originalDatasets, 'id').length > 0
|
const shouldSetWeightDefaultValue = xorBy(selectedDatasets, originalDatasets, 'id').length > 0
|
||||||
|
const rerankModelIsValid = validRerankModel?.provider && validRerankModel?.model
|
||||||
|
|
||||||
const {
|
const {
|
||||||
allHighQuality,
|
allHighQuality,
|
||||||
|
@ -128,18 +129,10 @@ export const getMultipleRetrievalConfig = (
|
||||||
reranking_enable: ((allInternal && allEconomic) || allExternal) ? reranking_enable : true,
|
reranking_enable: ((allInternal && allEconomic) || allExternal) ? reranking_enable : true,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel || allExternal || mixtureInternalAndExternal)
|
if (!rerankModelIsValid)
|
||||||
result.reranking_mode = RerankingModeEnum.RerankingModel
|
result.reranking_model = undefined
|
||||||
|
|
||||||
if (allHighQuality && !inconsistentEmbeddingModel && reranking_mode === undefined && allInternal)
|
|
||||||
result.reranking_mode = RerankingModeEnum.WeightedScore
|
|
||||||
|
|
||||||
if (allHighQuality && !inconsistentEmbeddingModel && (reranking_mode === RerankingModeEnum.WeightedScore || reranking_mode === undefined) && allInternal && !weights) {
|
|
||||||
if (!isValidRerankModel)
|
|
||||||
result.reranking_mode = RerankingModeEnum.WeightedScore
|
|
||||||
else
|
|
||||||
result.reranking_mode = RerankingModeEnum.RerankingModel
|
|
||||||
|
|
||||||
|
const setDefaultWeights = () => {
|
||||||
result.weights = {
|
result.weights = {
|
||||||
vector_setting: {
|
vector_setting: {
|
||||||
vector_weight: allHighQualityVectorSearch
|
vector_weight: allHighQualityVectorSearch
|
||||||
|
@ -160,31 +153,85 @@ export const getMultipleRetrievalConfig = (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shouldSetWeightDefaultValue && allHighQuality && !inconsistentEmbeddingModel && (reranking_mode === RerankingModeEnum.WeightedScore || reranking_mode === undefined || !isValidRerankModel) && allInternal && weights) {
|
if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel || allExternal || mixtureInternalAndExternal) {
|
||||||
if (!isValidRerankModel)
|
result.reranking_mode = RerankingModeEnum.RerankingModel
|
||||||
result.reranking_mode = RerankingModeEnum.WeightedScore
|
|
||||||
else
|
|
||||||
result.reranking_mode = RerankingModeEnum.RerankingModel
|
|
||||||
|
|
||||||
result.weights = {
|
if (rerankModelIsValid) {
|
||||||
vector_setting: {
|
result.reranking_mode = RerankingModeEnum.RerankingModel
|
||||||
vector_weight: allHighQualityVectorSearch
|
result.reranking_model = {
|
||||||
? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.semantic
|
provider: validRerankModel?.provider || '',
|
||||||
: allHighQualityFullTextSearch
|
model: validRerankModel?.model || '',
|
||||||
? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.semantic
|
}
|
||||||
: DEFAULT_WEIGHTED_SCORE.other.semantic,
|
}
|
||||||
embedding_provider_name: selectedDatasets[0].embedding_model_provider,
|
else {
|
||||||
embedding_model_name: selectedDatasets[0].embedding_model,
|
result.reranking_model = undefined
|
||||||
},
|
}
|
||||||
keyword_setting: {
|
}
|
||||||
keyword_weight: allHighQualityVectorSearch
|
|
||||||
? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.keyword
|
if (allHighQuality && !inconsistentEmbeddingModel && allInternal) {
|
||||||
: allHighQualityFullTextSearch
|
if (!reranking_mode) {
|
||||||
? DEFAULT_WEIGHTED_SCORE.allHighQualityFullTextSearch.keyword
|
if (validRerankModel?.provider && validRerankModel?.model) {
|
||||||
: DEFAULT_WEIGHTED_SCORE.other.keyword,
|
result.reranking_mode = RerankingModeEnum.RerankingModel
|
||||||
},
|
result.reranking_model = {
|
||||||
|
provider: validRerankModel.provider,
|
||||||
|
model: validRerankModel.model,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result.reranking_mode = RerankingModeEnum.WeightedScore
|
||||||
|
setDefaultWeights()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reranking_mode === RerankingModeEnum.WeightedScore && !weights)
|
||||||
|
setDefaultWeights()
|
||||||
|
|
||||||
|
if (reranking_mode === RerankingModeEnum.WeightedScore && weights && shouldSetWeightDefaultValue) {
|
||||||
|
if (rerankModelIsValid) {
|
||||||
|
result.reranking_mode = RerankingModeEnum.RerankingModel
|
||||||
|
result.reranking_model = {
|
||||||
|
provider: validRerankModel.provider || '',
|
||||||
|
model: validRerankModel.model || '',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
setDefaultWeights()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reranking_mode === RerankingModeEnum.RerankingModel && !rerankModelIsValid && shouldSetWeightDefaultValue) {
|
||||||
|
result.reranking_mode = RerankingModeEnum.WeightedScore
|
||||||
|
setDefaultWeights()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const checkoutRerankModelConfigedInRetrievalSettings = (
|
||||||
|
datasets: DataSet[],
|
||||||
|
multipleRetrievalConfig?: MultipleRetrievalConfig,
|
||||||
|
) => {
|
||||||
|
if (!multipleRetrievalConfig)
|
||||||
|
return true
|
||||||
|
|
||||||
|
const {
|
||||||
|
allEconomic,
|
||||||
|
allExternal,
|
||||||
|
} = getSelectedDatasetsMode(datasets)
|
||||||
|
|
||||||
|
const {
|
||||||
|
reranking_enable,
|
||||||
|
reranking_mode,
|
||||||
|
reranking_model,
|
||||||
|
} = multipleRetrievalConfig
|
||||||
|
|
||||||
|
if (reranking_mode === RerankingModeEnum.RerankingModel && (!reranking_model?.provider || !reranking_model?.model)) {
|
||||||
|
if ((allEconomic || allExternal) && !reranking_enable)
|
||||||
|
return true
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ import IterationResultPanel from '../run/iteration-result-panel'
|
||||||
import InputsPanel from './inputs-panel'
|
import InputsPanel from './inputs-panel'
|
||||||
import cn from '@/utils/classnames'
|
import cn from '@/utils/classnames'
|
||||||
import Loading from '@/app/components/base/loading'
|
import Loading from '@/app/components/base/loading'
|
||||||
import type { NodeTracing } from '@/types/workflow'
|
import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
|
||||||
|
|
||||||
const WorkflowPreview = () => {
|
const WorkflowPreview = () => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
|
@ -53,12 +53,14 @@ const WorkflowPreview = () => {
|
||||||
}, [workflowRunningData])
|
}, [workflowRunningData])
|
||||||
|
|
||||||
const [iterationRunResult, setIterationRunResult] = useState<NodeTracing[][]>([])
|
const [iterationRunResult, setIterationRunResult] = useState<NodeTracing[][]>([])
|
||||||
|
const [iterDurationMap, setIterDurationMap] = useState<IterationDurationMap>({})
|
||||||
const [isShowIterationDetail, {
|
const [isShowIterationDetail, {
|
||||||
setTrue: doShowIterationDetail,
|
setTrue: doShowIterationDetail,
|
||||||
setFalse: doHideIterationDetail,
|
setFalse: doHideIterationDetail,
|
||||||
}] = useBoolean(false)
|
}] = useBoolean(false)
|
||||||
|
|
||||||
const handleShowIterationDetail = useCallback((detail: NodeTracing[][]) => {
|
const handleShowIterationDetail = useCallback((detail: NodeTracing[][], iterationDurationMap: IterationDurationMap) => {
|
||||||
|
setIterDurationMap(iterationDurationMap)
|
||||||
setIterationRunResult(detail)
|
setIterationRunResult(detail)
|
||||||
doShowIterationDetail()
|
doShowIterationDetail()
|
||||||
}, [doShowIterationDetail])
|
}, [doShowIterationDetail])
|
||||||
|
@ -72,6 +74,7 @@ const WorkflowPreview = () => {
|
||||||
list={iterationRunResult}
|
list={iterationRunResult}
|
||||||
onHide={doHideIterationDetail}
|
onHide={doHideIterationDetail}
|
||||||
onBack={doHideIterationDetail}
|
onBack={doHideIterationDetail}
|
||||||
|
iterDurationMap={iterDurationMap}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
@ -94,6 +97,7 @@ const WorkflowPreview = () => {
|
||||||
list={iterationRunResult}
|
list={iterationRunResult}
|
||||||
onHide={doHideIterationDetail}
|
onHide={doHideIterationDetail}
|
||||||
onBack={doHideIterationDetail}
|
onBack={doHideIterationDetail}
|
||||||
|
iterDurationMap={iterDurationMap}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
: (
|
: (
|
||||||
|
|
|
@ -13,7 +13,7 @@ import cn from '@/utils/classnames'
|
||||||
import { ToastContext } from '@/app/components/base/toast'
|
import { ToastContext } from '@/app/components/base/toast'
|
||||||
import Loading from '@/app/components/base/loading'
|
import Loading from '@/app/components/base/loading'
|
||||||
import { fetchRunDetail, fetchTracingList } from '@/service/log'
|
import { fetchRunDetail, fetchTracingList } from '@/service/log'
|
||||||
import type { NodeTracing } from '@/types/workflow'
|
import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
|
||||||
import type { WorkflowRunDetailResponse } from '@/models/log'
|
import type { WorkflowRunDetailResponse } from '@/models/log'
|
||||||
import { useStore as useAppStore } from '@/app/components/app/store'
|
import { useStore as useAppStore } from '@/app/components/app/store'
|
||||||
|
|
||||||
|
@ -172,15 +172,17 @@ const RunPanel: FC<RunProps> = ({ hideResult, activeTab = 'RESULT', runID, getRe
|
||||||
}, [loading])
|
}, [loading])
|
||||||
|
|
||||||
const [iterationRunResult, setIterationRunResult] = useState<NodeTracing[][]>([])
|
const [iterationRunResult, setIterationRunResult] = useState<NodeTracing[][]>([])
|
||||||
|
const [iterDurationMap, setIterDurationMap] = useState<IterationDurationMap>({})
|
||||||
const [isShowIterationDetail, {
|
const [isShowIterationDetail, {
|
||||||
setTrue: doShowIterationDetail,
|
setTrue: doShowIterationDetail,
|
||||||
setFalse: doHideIterationDetail,
|
setFalse: doHideIterationDetail,
|
||||||
}] = useBoolean(false)
|
}] = useBoolean(false)
|
||||||
|
|
||||||
const handleShowIterationDetail = useCallback((detail: NodeTracing[][]) => {
|
const handleShowIterationDetail = useCallback((detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => {
|
||||||
setIterationRunResult(detail)
|
setIterationRunResult(detail)
|
||||||
doShowIterationDetail()
|
doShowIterationDetail()
|
||||||
}, [doShowIterationDetail])
|
setIterDurationMap(iterDurationMap)
|
||||||
|
}, [doShowIterationDetail, setIterationRunResult, setIterDurationMap])
|
||||||
|
|
||||||
if (isShowIterationDetail) {
|
if (isShowIterationDetail) {
|
||||||
return (
|
return (
|
||||||
|
@ -189,6 +191,7 @@ const RunPanel: FC<RunProps> = ({ hideResult, activeTab = 'RESULT', runID, getRe
|
||||||
list={iterationRunResult}
|
list={iterationRunResult}
|
||||||
onHide={doHideIterationDetail}
|
onHide={doHideIterationDetail}
|
||||||
onBack={doHideIterationDetail}
|
onBack={doHideIterationDetail}
|
||||||
|
iterDurationMap={iterDurationMap}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|
|
@ -6,12 +6,14 @@ import {
|
||||||
RiArrowRightSLine,
|
RiArrowRightSLine,
|
||||||
RiCloseLine,
|
RiCloseLine,
|
||||||
RiErrorWarningLine,
|
RiErrorWarningLine,
|
||||||
|
RiLoader2Line,
|
||||||
} from '@remixicon/react'
|
} from '@remixicon/react'
|
||||||
import { ArrowNarrowLeft } from '../../base/icons/src/vender/line/arrows'
|
import { ArrowNarrowLeft } from '../../base/icons/src/vender/line/arrows'
|
||||||
|
import { NodeRunningStatus } from '../types'
|
||||||
import TracingPanel from './tracing-panel'
|
import TracingPanel from './tracing-panel'
|
||||||
import { Iteration } from '@/app/components/base/icons/src/vender/workflow'
|
import { Iteration } from '@/app/components/base/icons/src/vender/workflow'
|
||||||
import cn from '@/utils/classnames'
|
import cn from '@/utils/classnames'
|
||||||
import type { NodeTracing } from '@/types/workflow'
|
import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
|
||||||
const i18nPrefix = 'workflow.singleRun'
|
const i18nPrefix = 'workflow.singleRun'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
@ -19,6 +21,7 @@ type Props = {
|
||||||
onHide: () => void
|
onHide: () => void
|
||||||
onBack: () => void
|
onBack: () => void
|
||||||
noWrap?: boolean
|
noWrap?: boolean
|
||||||
|
iterDurationMap?: IterationDurationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
const IterationResultPanel: FC<Props> = ({
|
const IterationResultPanel: FC<Props> = ({
|
||||||
|
@ -26,6 +29,7 @@ const IterationResultPanel: FC<Props> = ({
|
||||||
onHide,
|
onHide,
|
||||||
onBack,
|
onBack,
|
||||||
noWrap,
|
noWrap,
|
||||||
|
iterDurationMap,
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const [expandedIterations, setExpandedIterations] = useState<Record<number, boolean>>({})
|
const [expandedIterations, setExpandedIterations] = useState<Record<number, boolean>>({})
|
||||||
|
@ -36,6 +40,40 @@ const IterationResultPanel: FC<Props> = ({
|
||||||
[index]: !prev[index],
|
[index]: !prev[index],
|
||||||
}))
|
}))
|
||||||
}, [])
|
}, [])
|
||||||
|
const countIterDuration = (iteration: NodeTracing[], iterDurationMap: IterationDurationMap): string => {
|
||||||
|
const IterRunIndex = iteration[0].execution_metadata.iteration_index as number
|
||||||
|
const iterRunId = iteration[0].execution_metadata.parallel_mode_run_id
|
||||||
|
const iterItem = iterDurationMap[iterRunId || IterRunIndex]
|
||||||
|
const duration = iterItem
|
||||||
|
return `${(duration && duration > 0.01) ? duration.toFixed(2) : 0.01}s`
|
||||||
|
}
|
||||||
|
const iterationStatusShow = (index: number, iteration: NodeTracing[], iterDurationMap?: IterationDurationMap) => {
|
||||||
|
const hasFailed = iteration.some(item => item.status === NodeRunningStatus.Failed)
|
||||||
|
const isRunning = iteration.some(item => item.status === NodeRunningStatus.Running)
|
||||||
|
const hasDurationMap = iterDurationMap && Object.keys(iterDurationMap).length !== 0
|
||||||
|
|
||||||
|
if (hasFailed)
|
||||||
|
return <RiErrorWarningLine className='w-4 h-4 text-text-destructive' />
|
||||||
|
|
||||||
|
if (isRunning)
|
||||||
|
return <RiLoader2Line className='w-3.5 h-3.5 text-primary-600 animate-spin' />
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{hasDurationMap && (
|
||||||
|
<div className='system-xs-regular text-text-tertiary'>
|
||||||
|
{countIterDuration(iteration, iterDurationMap)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<RiArrowRightSLine
|
||||||
|
className={cn(
|
||||||
|
'w-4 h-4 text-text-tertiary transition-transform duration-200 flex-shrink-0',
|
||||||
|
expandedIterations[index] && 'transform rotate-90',
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
const main = (
|
const main = (
|
||||||
<>
|
<>
|
||||||
|
@ -72,19 +110,7 @@ const IterationResultPanel: FC<Props> = ({
|
||||||
<span className='system-sm-semibold-uppercase text-text-primary flex-grow'>
|
<span className='system-sm-semibold-uppercase text-text-primary flex-grow'>
|
||||||
{t(`${i18nPrefix}.iteration`)} {index + 1}
|
{t(`${i18nPrefix}.iteration`)} {index + 1}
|
||||||
</span>
|
</span>
|
||||||
{
|
{iterationStatusShow(index, iteration, iterDurationMap)}
|
||||||
iteration.some(item => item.status === 'failed')
|
|
||||||
? (
|
|
||||||
<RiErrorWarningLine className='w-4 h-4 text-text-destructive' />
|
|
||||||
)
|
|
||||||
: (< RiArrowRightSLine className={
|
|
||||||
cn(
|
|
||||||
'w-4 h-4 text-text-tertiary transition-transform duration-200 flex-shrink-0',
|
|
||||||
expandedIterations[index] && 'transform rotate-90',
|
|
||||||
)} />
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{expandedIterations[index] && <div
|
{expandedIterations[index] && <div
|
||||||
|
|
|
@ -18,7 +18,7 @@ import StatusContainer from '@/app/components/workflow/run/status-container'
|
||||||
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
|
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
|
||||||
import Button from '@/app/components/base/button'
|
import Button from '@/app/components/base/button'
|
||||||
import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
|
import { CodeLanguage } from '@/app/components/workflow/nodes/code/types'
|
||||||
import type { NodeTracing } from '@/types/workflow'
|
import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
className?: string
|
className?: string
|
||||||
|
@ -26,7 +26,7 @@ type Props = {
|
||||||
inMessage?: boolean
|
inMessage?: boolean
|
||||||
hideInfo?: boolean
|
hideInfo?: boolean
|
||||||
hideProcessDetail?: boolean
|
hideProcessDetail?: boolean
|
||||||
onShowIterationDetail?: (detail: NodeTracing[][]) => void
|
onShowIterationDetail?: (detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => void
|
||||||
notShowIterationNav?: boolean
|
notShowIterationNav?: boolean
|
||||||
justShowIterationNavArrow?: boolean
|
justShowIterationNavArrow?: boolean
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ const NodePanel: FC<Props> = ({
|
||||||
const handleOnShowIterationDetail = (e: React.MouseEvent<HTMLButtonElement>) => {
|
const handleOnShowIterationDetail = (e: React.MouseEvent<HTMLButtonElement>) => {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
e.nativeEvent.stopImmediatePropagation()
|
e.nativeEvent.stopImmediatePropagation()
|
||||||
onShowIterationDetail?.(nodeInfo.details || [])
|
onShowIterationDetail?.(nodeInfo.details || [], nodeInfo?.iterDurationMap || nodeInfo.execution_metadata?.iteration_duration_map || {})
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<div className={cn('px-2 py-1', className)}>
|
<div className={cn('px-2 py-1', className)}>
|
||||||
|
|
|
@ -16,11 +16,11 @@ import NodePanel from './node'
|
||||||
import {
|
import {
|
||||||
BlockEnum,
|
BlockEnum,
|
||||||
} from '@/app/components/workflow/types'
|
} from '@/app/components/workflow/types'
|
||||||
import type { NodeTracing } from '@/types/workflow'
|
import type { IterationDurationMap, NodeTracing } from '@/types/workflow'
|
||||||
|
|
||||||
type TracingPanelProps = {
|
type TracingPanelProps = {
|
||||||
list: NodeTracing[]
|
list: NodeTracing[]
|
||||||
onShowIterationDetail?: (detail: NodeTracing[][]) => void
|
onShowIterationDetail?: (detail: NodeTracing[][], iterDurationMap: IterationDurationMap) => void
|
||||||
className?: string
|
className?: string
|
||||||
hideNodeInfo?: boolean
|
hideNodeInfo?: boolean
|
||||||
hideNodeProcessDetail?: boolean
|
hideNodeProcessDetail?: boolean
|
||||||
|
|
|
@ -72,7 +72,7 @@ export type I18nText = {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Add the new language to the `language.ts` file.
|
4. Add the new language to the `language.json` file.
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
|
|
||||||
|
|
|
@ -569,9 +569,9 @@ const translation = {
|
||||||
MaxParallelismDesc: 'The maximum parallelism is used to control the number of tasks executed simultaneously in a single iteration.',
|
MaxParallelismDesc: 'The maximum parallelism is used to control the number of tasks executed simultaneously in a single iteration.',
|
||||||
errorResponseMethod: 'Error response method',
|
errorResponseMethod: 'Error response method',
|
||||||
ErrorMethod: {
|
ErrorMethod: {
|
||||||
operationTerminated: 'terminated',
|
operationTerminated: 'Terminated',
|
||||||
continueOnError: 'continue on error',
|
continueOnError: 'Continue on Error',
|
||||||
removeAbnormalOutput: 'remove abnormal output',
|
removeAbnormalOutput: 'Remove Abnormal Output',
|
||||||
},
|
},
|
||||||
answerNodeWarningDesc: 'Parallel mode warning: Answer nodes, conversation variable assignments, and persistent read/write operations within iterations may cause exceptions.',
|
answerNodeWarningDesc: 'Parallel mode warning: Answer nodes, conversation variable assignments, and persistent read/write operations within iterations may cause exceptions.',
|
||||||
},
|
},
|
||||||
|
|
|
@ -24,6 +24,7 @@ export type I18nText = {
|
||||||
'pl-PL': string
|
'pl-PL': string
|
||||||
'hi-IN': string
|
'hi-IN': string
|
||||||
'fa-IR': string
|
'fa-IR': string
|
||||||
|
'sl-SI': string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const languages = data.languages
|
export const languages = data.languages
|
||||||
|
@ -53,6 +54,7 @@ export const NOTICE_I18N = {
|
||||||
vi_VN: 'Thông báo quan trọng',
|
vi_VN: 'Thông báo quan trọng',
|
||||||
it_IT: 'Avviso Importante',
|
it_IT: 'Avviso Importante',
|
||||||
fa_IR: 'هشدار مهم',
|
fa_IR: 'هشدار مهم',
|
||||||
|
sl_SI: 'Pomembno obvestilo',
|
||||||
},
|
},
|
||||||
desc: {
|
desc: {
|
||||||
en_US:
|
en_US:
|
||||||
|
@ -83,6 +85,8 @@ export const NOTICE_I18N = {
|
||||||
'Sistemimiz, 28 Ağustos\'ta 19:00 ile 24:00 UTC saatleri arasında güncelleme nedeniyle kullanılamayacaktır. Sorularınız için lütfen destek ekibimizle iletişime geçin (support@dify.ai). Sabrınız için teşekkür ederiz.',
|
'Sistemimiz, 28 Ağustos\'ta 19:00 ile 24:00 UTC saatleri arasında güncelleme nedeniyle kullanılamayacaktır. Sorularınız için lütfen destek ekibimizle iletişime geçin (support@dify.ai). Sabrınız için teşekkür ederiz.',
|
||||||
fa_IR:
|
fa_IR:
|
||||||
'سیستم ما از ساعت 19:00 تا 24:00 UTC در تاریخ 28 اوت برای ارتقاء در دسترس نخواهد بود. برای سؤالات، لطفاً با تیم پشتیبانی ما (support@dify.ai) تماس بگیرید. ما برای صبر شما ارزش قائلیم.',
|
'سیستم ما از ساعت 19:00 تا 24:00 UTC در تاریخ 28 اوت برای ارتقاء در دسترس نخواهد بود. برای سؤالات، لطفاً با تیم پشتیبانی ما (support@dify.ai) تماس بگیرید. ما برای صبر شما ارزش قائلیم.',
|
||||||
|
sl_SI:
|
||||||
|
'Naš sistem ne bo na voljo od 19:00 do 24:00 UTC 28. avgusta zaradi nadgradnje. Za vprašanja se obrnite na našo skupino za podporo (support@dify.ai). Cenimo vašo potrpežljivost.',
|
||||||
},
|
},
|
||||||
href: '#',
|
href: '#',
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,13 @@
|
||||||
"prompt_name": "Farsi",
|
"prompt_name": "Farsi",
|
||||||
"example": "سلام, دیفای!",
|
"example": "سلام, دیفای!",
|
||||||
"supported": true
|
"supported": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": "sl-SI",
|
||||||
|
"name": "Slovensko (Slovenija)",
|
||||||
|
"prompt_name": "Slovensko",
|
||||||
|
"example": "Zdravo, Dify!",
|
||||||
|
"supported": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,8 +86,8 @@ const translation = {
|
||||||
agenteLogDetail: {
|
agenteLogDetail: {
|
||||||
agentMode: 'Modo Agente',
|
agentMode: 'Modo Agente',
|
||||||
toolUsed: 'Ferramenta usada',
|
toolUsed: 'Ferramenta usada',
|
||||||
iterações: 'Iterações',
|
iterations: 'Iterações',
|
||||||
iteração: 'Iteração',
|
iteration: 'Iteração',
|
||||||
finalProcessing: 'Processamento Final',
|
finalProcessing: 'Processamento Final',
|
||||||
},
|
},
|
||||||
agentLogDetail: {
|
agentLogDetail: {
|
||||||
|
|
87
web/i18n/sl-SI/app-annotation.ts
Normal file
87
web/i18n/sl-SI/app-annotation.ts
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
const translation = {
|
||||||
|
title: 'Opombe',
|
||||||
|
name: 'Odgovor na opombo',
|
||||||
|
editBy: 'Odgovor je uredil {{author}}',
|
||||||
|
noData: {
|
||||||
|
title: 'Brez opomb',
|
||||||
|
description: 'Opombe lahko urejate med odpravljanjem napak v aplikaciji ali jih množično uvozite tukaj za visokokakovosten odgovor.',
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
header: {
|
||||||
|
question: 'vprašanje',
|
||||||
|
answer: 'odgovor',
|
||||||
|
createdAt: 'ustvarjeno ob',
|
||||||
|
hits: 'zadetki',
|
||||||
|
actions: 'dejanja',
|
||||||
|
addAnnotation: 'Dodaj opombo',
|
||||||
|
bulkImport: 'Množični uvoz',
|
||||||
|
bulkExport: 'Množični izvoz',
|
||||||
|
clearAll: 'Počisti vse opombe',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
editModal: {
|
||||||
|
title: 'Uredi odgovor na opombo',
|
||||||
|
queryName: 'Uporabniško vprašanje',
|
||||||
|
answerName: 'Pripovedovalec Bot',
|
||||||
|
yourAnswer: 'Vaš odgovor',
|
||||||
|
answerPlaceholder: 'Vnesite svoj odgovor tukaj',
|
||||||
|
yourQuery: 'Vaše vprašanje',
|
||||||
|
queryPlaceholder: 'Vnesite svoje vprašanje tukaj',
|
||||||
|
removeThisCache: 'Odstrani to opombo',
|
||||||
|
createdAt: 'Ustvarjeno ob',
|
||||||
|
},
|
||||||
|
addModal: {
|
||||||
|
title: 'Dodaj odgovor na opombo',
|
||||||
|
queryName: 'Vprašanje',
|
||||||
|
answerName: 'Odgovor',
|
||||||
|
answerPlaceholder: 'Vnesite odgovor tukaj',
|
||||||
|
queryPlaceholder: 'Vnesite vprašanje tukaj',
|
||||||
|
createNext: 'Dodaj še en odgovor z opombo',
|
||||||
|
},
|
||||||
|
batchModal: {
|
||||||
|
title: 'Množični uvoz',
|
||||||
|
csvUploadTitle: 'Povlecite in spustite svoj CSV datoteko tukaj ali ',
|
||||||
|
browse: 'poiščite',
|
||||||
|
tip: 'CSV datoteka mora ustrezati naslednji strukturi:',
|
||||||
|
question: 'vprašanje',
|
||||||
|
answer: 'odgovor',
|
||||||
|
contentTitle: 'vsebina fragmenta',
|
||||||
|
content: 'vsebina',
|
||||||
|
template: 'Prenesite predlogo tukaj',
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
run: 'Zaženi množično obdelavo',
|
||||||
|
runError: 'Napaka pri množičnem zagonu',
|
||||||
|
processing: 'V množični obdelavi',
|
||||||
|
completed: 'Uvoz zaključen',
|
||||||
|
error: 'Napaka pri uvozu',
|
||||||
|
ok: 'V redu',
|
||||||
|
},
|
||||||
|
errorMessage: {
|
||||||
|
answerRequired: 'Odgovor je obvezen',
|
||||||
|
queryRequired: 'Vprašanje je obvezno',
|
||||||
|
},
|
||||||
|
viewModal: {
|
||||||
|
annotatedResponse: 'Odgovor na opombo',
|
||||||
|
hitHistory: 'Zgodovina zadetkov',
|
||||||
|
hit: 'Zadetek',
|
||||||
|
hits: 'Zadetki',
|
||||||
|
noHitHistory: 'Ni zgodovine zadetkov',
|
||||||
|
},
|
||||||
|
hitHistoryTable: {
|
||||||
|
query: 'Vprašanje',
|
||||||
|
match: 'Ujemanje',
|
||||||
|
response: 'Odgovor',
|
||||||
|
source: 'Vir',
|
||||||
|
score: 'Rezultat',
|
||||||
|
time: 'Čas',
|
||||||
|
},
|
||||||
|
initSetup: {
|
||||||
|
title: 'Začetna nastavitev odgovora na opombo',
|
||||||
|
configTitle: 'Nastavitev odgovora na opombo',
|
||||||
|
confirmBtn: 'Shrani in omogoči',
|
||||||
|
configConfirmBtn: 'Shrani',
|
||||||
|
},
|
||||||
|
embeddingModelSwitchTip: 'Model za vektorizacijo besedila opomb, preklapljanje modelov bo ponovno vektoriziralo, kar bo povzročilo dodatne stroške.',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
84
web/i18n/sl-SI/app-api.ts
Normal file
84
web/i18n/sl-SI/app-api.ts
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
const translation = {
|
||||||
|
apiServer: 'API Strežnik',
|
||||||
|
apiKey: 'API Ključ',
|
||||||
|
status: 'Status',
|
||||||
|
disabled: 'Onemogočeno',
|
||||||
|
ok: 'V uporabi',
|
||||||
|
copy: 'Kopiraj',
|
||||||
|
copied: 'Kopirano',
|
||||||
|
regenerate: 'Regeneriraj',
|
||||||
|
play: 'Predvajaj',
|
||||||
|
pause: 'Premor',
|
||||||
|
playing: 'Predvajanje',
|
||||||
|
loading: 'Nalaganje',
|
||||||
|
merMaid: {
|
||||||
|
rerender: 'Ponovno izrisi',
|
||||||
|
},
|
||||||
|
never: 'Nikoli',
|
||||||
|
apiKeyModal: {
|
||||||
|
apiSecretKey: 'API Skrivni ključ',
|
||||||
|
apiSecretKeyTips: 'Da bi preprečili zlorabo API-ja, zaščitite svoj API ključ. Izogibajte se uporabi v navadnem besedilu v sprednji kodi. :)',
|
||||||
|
createNewSecretKey: 'Ustvari nov skrivni ključ',
|
||||||
|
secretKey: 'Skrivni ključ',
|
||||||
|
created: 'USTVARJENO',
|
||||||
|
lastUsed: 'ZADNJA UPORABA',
|
||||||
|
generateTips: 'Hranite ta ključ na varnem in dostopnem mestu.',
|
||||||
|
},
|
||||||
|
actionMsg: {
|
||||||
|
deleteConfirmTitle: 'Izbrisati ta skrivni ključ?',
|
||||||
|
deleteConfirmTips: 'To dejanje ni mogoče razveljaviti.',
|
||||||
|
ok: 'V redu',
|
||||||
|
},
|
||||||
|
completionMode: {
|
||||||
|
title: 'API za dokončanje aplikacije',
|
||||||
|
info: 'Za visokokakovostno generiranje besedil, kot so članki, povzetki in prevodi, uporabite API za dokončanje sporočil z vnosom uporabnika. Generiranje besedil temelji na parametrih modela in predlogah pozivov, določenih v Dify Prompt Engineering.',
|
||||||
|
createCompletionApi: 'Ustvari sporočilo o dokončanju',
|
||||||
|
createCompletionApiTip: 'Ustvari sporočilo o dokončanju za podporo načinu vprašanj in odgovorov.',
|
||||||
|
inputsTips: '(Neobvezno) Navedite vnosna polja uporabnikov kot ključ-vrednost pare, ki ustrezajo spremenljivkam v Prompt Eng. Ključ je ime spremenljivke, vrednost pa vrednost parametra. Če je vrsta polja Izberi, mora biti posredovana vrednost ena izmed vnaprej določenih možnosti.',
|
||||||
|
queryTips: 'Vsebina besedila vnosa uporabnika.',
|
||||||
|
blocking: 'Vrsta blokiranja, čakanje na dokončanje izvajanja in vračanje rezultatov. (Zahteve se lahko prekinejo, če je postopek dolg)',
|
||||||
|
streaming: 'streaming povratki. Implementacija povratkov pretakanja na podlagi SSE (Server-Sent Events).',
|
||||||
|
messageFeedbackApi: 'Povratne informacije o sporočilih (všeč)',
|
||||||
|
messageFeedbackApiTip: 'Ocenite prejeta sporočila v imenu končnih uporabnikov z všečki ali nevšečki. Ti podatki so vidni na strani Dnevniki in opombe ter se uporabljajo za nadaljnje fino prilagajanje modela.',
|
||||||
|
messageIDTip: 'ID sporočila',
|
||||||
|
ratingTip: 'všeč ali nevšeč, null je preklic',
|
||||||
|
parametersApi: 'Pridobite informacije o parametrih aplikacije',
|
||||||
|
parametersApiTip: 'Pridobite konfigurirane vhodne parametre, vključno z imeni spremenljivk, imeni polj, vrstami in privzetimi vrednostmi. Običajno se uporablja za prikaz teh polj v obrazcu ali izpolnjevanje privzetih vrednosti po nalaganju odjemalca.',
|
||||||
|
},
|
||||||
|
chatMode: {
|
||||||
|
title: 'API za klepet aplikacije',
|
||||||
|
info: 'Za vsestranske pogovorne aplikacije, ki uporabljajo obliko vprašanj in odgovorov, pokličite API za klepetna sporočila, da začnete dialog. Ohranite tekoče pogovore tako, da prenesete vrnjeni conversation_id. Parametri odgovorov in predloge so odvisni od nastavitev Dify Prompt Eng.',
|
||||||
|
createChatApi: 'Ustvari klepetno sporočilo',
|
||||||
|
createChatApiTip: 'Ustvari novo pogovorno sporočilo ali nadaljuj obstoječi pogovor.',
|
||||||
|
inputsTips: '(Neobvezno) Navedite vnosna polja uporabnikov kot ključ-vrednost pare, ki ustrezajo spremenljivkam v Prompt Eng. Ključ je ime spremenljivke, vrednost pa vrednost parametra. Če je vrsta polja Izberi, mora biti posredovana vrednost ena izmed vnaprej določenih možnosti.',
|
||||||
|
queryTips: 'Vsebina vnosa/uporabniškega vprašanja',
|
||||||
|
blocking: 'Vrsta blokiranja, čakanje na dokončanje izvajanja in vračanje rezultatov. (Zahteve se lahko prekinejo, če je postopek dolg)',
|
||||||
|
streaming: 'streaming povratki. Implementacija povratkov pretakanja na podlagi SSE (Server-Sent Events).',
|
||||||
|
conversationIdTip: '(Neobvezno) ID pogovora: pustite prazno za prvi pogovor; prenesite conversation_id iz konteksta, da nadaljujete dialog.',
|
||||||
|
messageFeedbackApi: 'Povratne informacije končnih uporabnikov o sporočilu, všeč',
|
||||||
|
messageFeedbackApiTip: 'Ocenite prejeta sporočila v imenu končnih uporabnikov z všečki ali nevšečki. Ti podatki so vidni na strani Dnevniki in opombe ter se uporabljajo za nadaljnje fino prilagajanje modela.',
|
||||||
|
messageIDTip: 'ID sporočila',
|
||||||
|
ratingTip: 'všeč ali nevšeč, null je preklic',
|
||||||
|
chatMsgHistoryApi: 'Pridobi zgodovino klepetnih sporočil',
|
||||||
|
chatMsgHistoryApiTip: 'Prva stran vrne najnovejše `limit` zapise, ki so v obratnem vrstnem redu.',
|
||||||
|
chatMsgHistoryConversationIdTip: 'ID pogovora',
|
||||||
|
chatMsgHistoryFirstId: 'ID prvega klepeta na trenutni strani. Privzeto ni.',
|
||||||
|
chatMsgHistoryLimit: 'Koliko klepetov je vrnjenih na eno zahtevo',
|
||||||
|
conversationsListApi: 'Pridobi seznam pogovorov',
|
||||||
|
conversationsListApiTip: 'Pridobi seznam sej trenutnega uporabnika. Privzeto je vrnjenih zadnjih 20 sej.',
|
||||||
|
conversationsListFirstIdTip: 'ID zadnjega zapisa na trenutni strani, privzeto ni.',
|
||||||
|
conversationsListLimitTip: 'Koliko klepetov je vrnjenih na eno zahtevo',
|
||||||
|
conversationRenamingApi: 'Preimenovanje pogovora',
|
||||||
|
conversationRenamingApiTip: 'Preimenujte pogovore; ime je prikazano v večsejnih odjemalskih vmesnikih.',
|
||||||
|
conversationRenamingNameTip: 'Novo ime',
|
||||||
|
parametersApi: 'Pridobite informacije o parametrih aplikacije',
|
||||||
|
parametersApiTip: 'Pridobite konfigurirane vhodne parametre, vključno z imeni spremenljivk, imeni polj, vrstami in privzetimi vrednostmi. Običajno se uporablja za prikaz teh polj v obrazcu ali izpolnjevanje privzetih vrednosti po nalaganju odjemalca.',
|
||||||
|
},
|
||||||
|
develop: {
|
||||||
|
requestBody: 'Telo zahteve',
|
||||||
|
pathParams: 'Parametri poti',
|
||||||
|
query: 'Poizvedba',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
242
web/i18n/sl-SI/app-debug.ts
Normal file
242
web/i18n/sl-SI/app-debug.ts
Normal file
|
@ -0,0 +1,242 @@
|
||||||
|
const translation = {
|
||||||
|
pageTitle: {
|
||||||
|
line1: 'PROMPT',
|
||||||
|
line2: 'Inženiring',
|
||||||
|
},
|
||||||
|
orchestrate: 'Orkestriraj',
|
||||||
|
promptMode: {
|
||||||
|
simple: 'Preklopi na strokovni način, da urejaš celoten PROMPT',
|
||||||
|
advanced: 'Strokovni način',
|
||||||
|
switchBack: 'Preklopi nazaj',
|
||||||
|
advancedWarning: {
|
||||||
|
title: 'Preklopil si na strokovni način. Ko spremeniš PROMPT, ne moreš več preklopiti nazaj v osnovni način.',
|
||||||
|
description: 'V strokovnem načinu lahko urejaš celoten PROMPT.',
|
||||||
|
learnMore: 'Preberi več',
|
||||||
|
ok: 'V redu',
|
||||||
|
},
|
||||||
|
operation: {
|
||||||
|
addMessage: 'Dodaj sporočilo',
|
||||||
|
},
|
||||||
|
contextMissing: 'Manjka komponenta konteksta, zato učinkovitost PROMPT-a morda ne bo najboljša.',
|
||||||
|
},
|
||||||
|
operation: {
|
||||||
|
applyConfig: 'Objavi',
|
||||||
|
resetConfig: 'Ponastavi',
|
||||||
|
debugConfig: 'Odpravljanje napak',
|
||||||
|
addFeature: 'Dodaj funkcionalnost',
|
||||||
|
automatic: 'Generiraj',
|
||||||
|
stopResponding: 'Prenehaj odgovarjati',
|
||||||
|
agree: 'všeč',
|
||||||
|
disagree: 'ni všeč',
|
||||||
|
cancelAgree: 'Prekliči všeček',
|
||||||
|
cancelDisagree: 'Prekliči nevšečnost',
|
||||||
|
userAction: 'Uporabnik ',
|
||||||
|
},
|
||||||
|
notSetAPIKey: {
|
||||||
|
title: 'Ključ ponudnika LLM ni nastavljen',
|
||||||
|
trailFinished: 'Preizkus končan',
|
||||||
|
description: 'Ključ ponudnika LLM ni nastavljen. Pred odpravljanjem napak je treba nastaviti ključ.',
|
||||||
|
settingBtn: 'Pojdi v nastavitve',
|
||||||
|
},
|
||||||
|
trailUseGPT4Info: {
|
||||||
|
title: 'GPT-4 trenutno ni podprt',
|
||||||
|
description: 'Za uporabo GPT-4 je treba nastaviti API ključ.',
|
||||||
|
},
|
||||||
|
feature: {
|
||||||
|
groupChat: {
|
||||||
|
title: 'Izboljšanje klepeta',
|
||||||
|
description: 'Dodajanje prednastavitev klepeta lahko izboljša uporabniško izkušnjo.',
|
||||||
|
},
|
||||||
|
groupExperience: {
|
||||||
|
title: 'Izboljšanje izkušnje',
|
||||||
|
},
|
||||||
|
conversationOpener: {
|
||||||
|
title: 'Začetek pogovora',
|
||||||
|
description: 'V klepetu AI običajno začne pogovor z uporabnikom z dobrodošlico.',
|
||||||
|
},
|
||||||
|
suggestedQuestionsAfterAnswer: {
|
||||||
|
title: 'Nadaljnja vprašanja',
|
||||||
|
description: 'Nastavitev predlogov za naslednja vprašanja lahko uporabnikom izboljša klepet.',
|
||||||
|
resDes: '3 predlogi za naslednje vprašanje uporabnika.',
|
||||||
|
tryToAsk: 'Poskusi vprašati',
|
||||||
|
},
|
||||||
|
moreLikeThis: {
|
||||||
|
title: 'Več takšnih',
|
||||||
|
description: 'Ustvari več besedil naenkrat, nato pa jih urejaj in nadaljuj z ustvarjanjem.',
|
||||||
|
generateNumTip: 'Število generacij vsakič',
|
||||||
|
tip: 'Uporaba te funkcije povzroča dodatno porabo žetonov.',
|
||||||
|
},
|
||||||
|
speechToText: {
|
||||||
|
title: 'Govor v besedilo',
|
||||||
|
description: 'Ko je omogočeno, lahko uporabljaš glasovni vnos.',
|
||||||
|
resDes: 'Glasovni vnos je omogočen.',
|
||||||
|
},
|
||||||
|
textToSpeech: {
|
||||||
|
title: 'Besedilo v govor',
|
||||||
|
description: 'Ko je omogočeno, lahko besedilo pretvoriš v govor.',
|
||||||
|
resDes: 'Pretvorba besedila v zvok je omogočena.',
|
||||||
|
},
|
||||||
|
citation: {
|
||||||
|
title: 'Citati in pripisovanja',
|
||||||
|
description: 'Ko je omogočeno, prikaži izvorni dokument in pripisani del generirane vsebine.',
|
||||||
|
resDes: 'Citati in pripisovanja so omogočeni.',
|
||||||
|
},
|
||||||
|
annotation: {
|
||||||
|
title: 'Odgovor z opombami',
|
||||||
|
description: 'Ročno lahko dodate visokokakovostne odgovore v predpomnilnik za prednostno ujemanje s podobnimi vprašanji uporabnikov.',
|
||||||
|
resDes: 'Odgovor z opombami je omogočen.',
|
||||||
|
scoreThreshold: {
|
||||||
|
title: 'Prag ujemanja',
|
||||||
|
description: 'Uporabljeno za nastavitev praga podobnosti za odgovor z opombami.',
|
||||||
|
easyMatch: 'Lahko ujemanje',
|
||||||
|
accurateMatch: 'Natančno ujemanje',
|
||||||
|
},
|
||||||
|
matchVariable: {
|
||||||
|
title: 'Spremenljivka za ujemanje',
|
||||||
|
choosePlaceholder: 'Izberi spremenljivko za ujemanje',
|
||||||
|
},
|
||||||
|
cacheManagement: 'Upravljanje opomb',
|
||||||
|
cached: 'Z opombo',
|
||||||
|
remove: 'Odstrani',
|
||||||
|
removeConfirm: 'Izbrisati to opombo?',
|
||||||
|
add: 'Dodaj opombo',
|
||||||
|
edit: 'Uredi opombo',
|
||||||
|
},
|
||||||
|
dataSet: {
|
||||||
|
title: 'Kontekst',
|
||||||
|
noData: 'Uvozi znanje kot kontekst',
|
||||||
|
words: 'Besede',
|
||||||
|
textBlocks: 'Bloki besedila',
|
||||||
|
selectTitle: 'Izberi referenčno znanje',
|
||||||
|
selected: 'Izbrano znanje',
|
||||||
|
noDataSet: 'Znanje ni bilo najdeno',
|
||||||
|
toCreate: 'Pojdi na ustvarjanje',
|
||||||
|
notSupportSelectMulti: 'Trenutno je podprto le eno znanje',
|
||||||
|
queryVariable: {
|
||||||
|
title: 'Spremenljivka poizvedbe',
|
||||||
|
tip: 'Ta spremenljivka bo uporabljena kot vnos poizvedbe za pridobitev kontekstnih informacij.',
|
||||||
|
choosePlaceholder: 'Izberi spremenljivko poizvedbe',
|
||||||
|
noVar: 'Ni spremenljivk',
|
||||||
|
noVarTip: 'ustvari spremenljivko v razdelku Spremenljivke',
|
||||||
|
unableToQueryDataSet: 'Neuspešna poizvedba po znanju',
|
||||||
|
unableToQueryDataSetTip: 'Neuspešna poizvedba po znanju, izberi spremenljivko poizvedbe v razdelku kontekst.',
|
||||||
|
ok: 'V redu',
|
||||||
|
contextVarNotEmpty: 'Spremenljivka poizvedbe ne sme biti prazna',
|
||||||
|
deleteContextVarTitle: 'Izbrisati spremenljivko “{{varName}}”?',
|
||||||
|
deleteContextVarTip: 'Ta spremenljivka je nastavljena kot spremenljivka za poizvedbo po kontekstu. Če jo odstraniš, bo to vplivalo na uporabo znanja. Če jo želiš izbrisati, ponovno izberi v razdelku kontekst.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
tools: {
|
||||||
|
title: 'Orodja',
|
||||||
|
tips: 'Orodja nudijo standardiziran način klicanja API-jev, pri čemer se uporabniški vnos ali spremenljivke uporabijo kot parametri za poizvedovanje zunanjih podatkov.',
|
||||||
|
toolsInUse: '{{count}} orodij v uporabi',
|
||||||
|
modal: {
|
||||||
|
title: 'Orodje',
|
||||||
|
toolType: {
|
||||||
|
title: 'Tip orodja',
|
||||||
|
placeholder: 'Izberi tip orodja',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
title: 'Ime',
|
||||||
|
placeholder: 'Vnesi ime',
|
||||||
|
},
|
||||||
|
variableName: {
|
||||||
|
title: 'Ime spremenljivke',
|
||||||
|
placeholder: 'Vnesi ime spremenljivke',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
conversationHistory: {
|
||||||
|
title: 'Zgodovina pogovorov',
|
||||||
|
description: 'Nastavi predpone imen za vloge v pogovoru',
|
||||||
|
tip: 'Zgodovina pogovorov ni omogočena. Dodaj <histories> v zgornji PROMPT.',
|
||||||
|
learnMore: 'Preberi več',
|
||||||
|
editModal: {
|
||||||
|
title: 'Uredi imena vlog v pogovoru',
|
||||||
|
userPrefix: 'Predpona uporabnika',
|
||||||
|
assistantPrefix: 'Predpona pomočnika',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
title: 'ORODJA',
|
||||||
|
},
|
||||||
|
moderation: {
|
||||||
|
title: 'Moderiranje vsebine',
|
||||||
|
description: 'Zagotovi varno izhodno vsebino s pomočjo API-ja za moderiranje ali vzdrževanja seznama občutljivih besed.',
|
||||||
|
allEnabled: 'VSEBINA VNOSA/IZHODA omogočena',
|
||||||
|
inputEnabled: 'VSEBINA VNOSA omogočena',
|
||||||
|
outputEnabled: 'VSEBINA IZHODA omogočena',
|
||||||
|
modal: {
|
||||||
|
title: 'Nastavitve moderiranja vsebine',
|
||||||
|
provider: {
|
||||||
|
title: 'Ponudnik',
|
||||||
|
openai: 'OpenAI Moderiranje',
|
||||||
|
openaiTip: {
|
||||||
|
prefix: 'OpenAI Moderiranje zahteva nastavljen API ključ pri ',
|
||||||
|
suffix: '.',
|
||||||
|
},
|
||||||
|
keywords: 'Ključne besede',
|
||||||
|
},
|
||||||
|
keywords: {
|
||||||
|
tip: 'Vsaka beseda na lastni vrstici, ločena z vrsticami. Največ 100 znakov na vrstico.',
|
||||||
|
placeholder: 'Vsaka beseda na lastni vrstici, ločena z vrsticami',
|
||||||
|
line: 'Vrstica',
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
input: 'Moderiraj VSEBINO VNOSA',
|
||||||
|
output: 'Moderiraj VSEBINO IZHODA',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
debug: {
|
||||||
|
title: 'Odpravljanje napak',
|
||||||
|
description: 'Debugiranje omogoča pregled podrobnih informacij, kot so podatki API-jev, vklop dnevnikov, opozorila in še več.',
|
||||||
|
},
|
||||||
|
agent: {
|
||||||
|
title: 'Pomočnik',
|
||||||
|
description: 'Osnovne informacije in odgovorne naloge pomočnika.',
|
||||||
|
prompts: 'Temeljni PROMPT',
|
||||||
|
message: {
|
||||||
|
title: 'Vrstice sporočila',
|
||||||
|
user: 'Uporabnik',
|
||||||
|
assistant: 'Pomočnik',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
history: {
|
||||||
|
title: 'Zgodovina',
|
||||||
|
notFound: 'Zgodovina ni bila najdena',
|
||||||
|
notOpen: 'Zgodovina ni odprta',
|
||||||
|
},
|
||||||
|
prompt: {
|
||||||
|
title: 'Vsebina PROMPT-a',
|
||||||
|
},
|
||||||
|
message: {
|
||||||
|
title: 'Sporočilo',
|
||||||
|
description: 'Način nastavitve formatiranega pogovora.',
|
||||||
|
tryChat: 'Preizkusi klepet',
|
||||||
|
},
|
||||||
|
theme: {
|
||||||
|
title: 'Tema',
|
||||||
|
themes: {
|
||||||
|
default: 'Osnovna tema',
|
||||||
|
light: 'Svetla tema',
|
||||||
|
dark: 'Temna tema',
|
||||||
|
custom: 'Prilagodi temo',
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
title: 'Nastavitve teme',
|
||||||
|
primaryColor: {
|
||||||
|
title: 'Primarna barva',
|
||||||
|
placeholder: 'Izberi primarno barvo',
|
||||||
|
},
|
||||||
|
textColor: {
|
||||||
|
title: 'Barva besedila',
|
||||||
|
placeholder: 'Izberi barvo besedila',
|
||||||
|
},
|
||||||
|
ok: 'V redu',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = translation
|
95
web/i18n/sl-SI/app-log.ts
Normal file
95
web/i18n/sl-SI/app-log.ts
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
const translation = {
|
||||||
|
title: 'Dnevniki',
|
||||||
|
description: 'Dnevniki beležijo stanje delovanja aplikacije, vključno z vnosi uporabnikov in odgovori umetne inteligence.',
|
||||||
|
dateTimeFormat: 'DD.MM.YYYY hh:mm A',
|
||||||
|
table: {
|
||||||
|
header: {
|
||||||
|
updatedTime: 'Čas posodobitve',
|
||||||
|
time: 'Čas ustvarjanja',
|
||||||
|
endUser: 'Končni uporabnik ali račun',
|
||||||
|
input: 'Vnos',
|
||||||
|
output: 'Izhod',
|
||||||
|
summary: 'Naslov',
|
||||||
|
messageCount: 'Število sporočil',
|
||||||
|
userRate: 'Ocena uporabnika',
|
||||||
|
adminRate: 'Ocena operaterja',
|
||||||
|
startTime: 'ZAČETNI ČAS',
|
||||||
|
status: 'STATUS',
|
||||||
|
runtime: 'ČAS DELOVANJA',
|
||||||
|
tokens: 'ŽETONI',
|
||||||
|
user: 'Končni uporabnik ali račun',
|
||||||
|
version: 'VERZIJA',
|
||||||
|
},
|
||||||
|
pagination: {
|
||||||
|
previous: 'Prejšnja',
|
||||||
|
next: 'Naslednja',
|
||||||
|
},
|
||||||
|
empty: {
|
||||||
|
noChat: 'Še ni pogovora',
|
||||||
|
noOutput: 'Ni izhoda',
|
||||||
|
element: {
|
||||||
|
title: 'Je kdo tam?',
|
||||||
|
content: 'Opazujte in označite interakcije med končnimi uporabniki in aplikacijami umetne inteligence, da stalno izboljšujete natančnost AI. Lahko <shareLink>delite</shareLink> ali <testLink>preizkusite</testLink> spletno aplikacijo sami, nato pa se vrnete na to stran.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
detail: {
|
||||||
|
time: 'Čas',
|
||||||
|
conversationId: 'ID pogovora',
|
||||||
|
promptTemplate: 'Predloga PROMPT-a',
|
||||||
|
promptTemplateBeforeChat: 'Predloga PROMPT-a pred pogovorom · Kot sistemsko sporočilo',
|
||||||
|
annotationTip: 'Izboljšave, ki jih je označil {{user}}',
|
||||||
|
timeConsuming: 'Porabljen čas',
|
||||||
|
second: 's',
|
||||||
|
tokenCost: 'Porabljeni žetoni',
|
||||||
|
loading: 'nalaganje',
|
||||||
|
operation: {
|
||||||
|
like: 'všeč',
|
||||||
|
dislike: 'ni všeč',
|
||||||
|
addAnnotation: 'Dodaj izboljšavo',
|
||||||
|
editAnnotation: 'Uredi izboljšavo',
|
||||||
|
annotationPlaceholder: 'Vnesite pričakovan odgovor, ki ga želite, da AI odgovori, kar se lahko uporabi za izboljšanje modela in kakovosti generiranja besedil v prihodnje.',
|
||||||
|
},
|
||||||
|
variables: 'Spremenljivke',
|
||||||
|
uploadImages: 'Naložene slike',
|
||||||
|
},
|
||||||
|
filter: {
|
||||||
|
period: {
|
||||||
|
today: 'Danes',
|
||||||
|
last7days: 'Zadnjih 7 dni',
|
||||||
|
last4weeks: 'Zadnje 4 tedne',
|
||||||
|
last3months: 'Zadnji 3 meseci',
|
||||||
|
last12months: 'Zadnjih 12 mesecev',
|
||||||
|
monthToDate: 'Mesec do danes',
|
||||||
|
quarterToDate: 'Četrtletje do danes',
|
||||||
|
yearToDate: 'Leto do danes',
|
||||||
|
allTime: 'Vse obdobje',
|
||||||
|
},
|
||||||
|
annotation: {
|
||||||
|
all: 'Vse',
|
||||||
|
annotated: 'Označene izboljšave ({{count}} elementov)',
|
||||||
|
not_annotated: 'Neoznačene',
|
||||||
|
},
|
||||||
|
sortBy: 'Razvrsti po:',
|
||||||
|
descending: 'padajoče',
|
||||||
|
ascending: 'naraščajoče',
|
||||||
|
},
|
||||||
|
workflowTitle: 'Dnevniki poteka dela',
|
||||||
|
workflowSubtitle: 'Dnevnik beleži delovanje avtomatizacije.',
|
||||||
|
runDetail: {
|
||||||
|
title: 'Dnevnik pogovora',
|
||||||
|
workflowTitle: 'Podrobnosti dnevnika',
|
||||||
|
},
|
||||||
|
promptLog: 'Dnevnik PROMPT-ov',
|
||||||
|
agentLog: 'Dnevnik pomočnika',
|
||||||
|
viewLog: 'Ogled dnevnika',
|
||||||
|
agentLogDetail: {
|
||||||
|
agentMode: 'Način pomočnika',
|
||||||
|
toolUsed: 'Uporabljeno orodje',
|
||||||
|
iterations: 'Iteracije',
|
||||||
|
iteration: 'Iteracija',
|
||||||
|
finalProcessing: 'Končna obdelava',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
168
web/i18n/sl-SI/app-overview.ts
Normal file
168
web/i18n/sl-SI/app-overview.ts
Normal file
|
@ -0,0 +1,168 @@
|
||||||
|
const translation = {
|
||||||
|
welcome: {
|
||||||
|
firstStepTip: 'Začnite s tem, da',
|
||||||
|
enterKeyTip: 'vnesete svoj OpenAI API ključ spodaj',
|
||||||
|
getKeyTip: 'Pridobite svoj API ključ na nadzorni plošči OpenAI',
|
||||||
|
placeholder: 'Vaš OpenAI API ključ (npr. sk-xxxx)',
|
||||||
|
},
|
||||||
|
apiKeyInfo: {
|
||||||
|
cloud: {
|
||||||
|
trial: {
|
||||||
|
title: 'Uporabljate {{providerName}} poskusno kvoto.',
|
||||||
|
description: 'Poskusna kvota je namenjena vašemu testiranju. Preden se kvota izčrpa, nastavite lastnega ponudnika modela ali kupite dodatno kvoto.',
|
||||||
|
},
|
||||||
|
exhausted: {
|
||||||
|
title: 'Vaša poskusna kvota je bila porabljena, nastavite API ključ.',
|
||||||
|
description: 'Porabili ste svojo poskusno kvoto. Prosimo, nastavite lastnega ponudnika modela ali kupite dodatno kvoto.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
selfHost: {
|
||||||
|
title: {
|
||||||
|
row1: 'Za začetek,',
|
||||||
|
row2: 'najprej nastavite svojega ponudnika modela.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
callTimes: 'Število klicev',
|
||||||
|
usedToken: 'Porabljeni žetoni',
|
||||||
|
setAPIBtn: 'Pojdi na nastavitev ponudnika modela',
|
||||||
|
tryCloud: 'Ali preizkusite oblačno različico Dify s prosto kvoto',
|
||||||
|
},
|
||||||
|
overview: {
|
||||||
|
title: 'Pregled',
|
||||||
|
appInfo: {
|
||||||
|
explanation: 'Pripravljena AI spletna aplikacija',
|
||||||
|
accessibleAddress: 'Javni URL',
|
||||||
|
preview: 'Predogled',
|
||||||
|
regenerate: 'Ustvari ponovno',
|
||||||
|
regenerateNotice: 'Ali želite ponovno ustvariti javni URL?',
|
||||||
|
preUseReminder: 'Pred nadaljevanjem omogočite spletno aplikacijo.',
|
||||||
|
settings: {
|
||||||
|
entry: 'Nastavitve',
|
||||||
|
title: 'Nastavitve spletne aplikacije',
|
||||||
|
webName: 'Ime spletne aplikacije',
|
||||||
|
webDesc: 'Opis spletne aplikacije',
|
||||||
|
webDescTip: 'Besedilo bo prikazano na strani za stranke in bo zagotavljalo osnovna navodila za uporabo aplikacije',
|
||||||
|
webDescPlaceholder: 'Vnesite opis spletne aplikacije',
|
||||||
|
language: 'Jezik',
|
||||||
|
workflow: {
|
||||||
|
title: 'Potek dela',
|
||||||
|
subTitle: 'Podrobnosti poteka dela',
|
||||||
|
show: 'Prikaži',
|
||||||
|
hide: 'Skrij',
|
||||||
|
showDesc: 'Pokažite ali skrijte podrobnosti poteka dela v spletni aplikaciji',
|
||||||
|
},
|
||||||
|
chatColorTheme: 'Barvna tema klepeta',
|
||||||
|
chatColorThemeDesc: 'Nastavite barvno temo klepetalnega bota',
|
||||||
|
chatColorThemeInverted: 'Inverzna',
|
||||||
|
invalidHexMessage: 'Neveljavna vrednost heksa',
|
||||||
|
sso: {
|
||||||
|
label: 'SSO avtentikacija',
|
||||||
|
title: 'SSO spletne aplikacije',
|
||||||
|
description: 'Vsi uporabniki morajo pred uporabo spletne aplikacije opraviti prijavo preko SSO',
|
||||||
|
tooltip: 'Za omogočitev SSO za spletno aplikacijo se obrnite na skrbnika',
|
||||||
|
},
|
||||||
|
more: {
|
||||||
|
entry: 'Prikaži več nastavitev',
|
||||||
|
copyright: 'Avtorske pravice',
|
||||||
|
copyRightPlaceholder: 'Vnesite ime avtorja ali organizacije',
|
||||||
|
privacyPolicy: 'Politika zasebnosti',
|
||||||
|
privacyPolicyPlaceholder: 'Vnesite povezavo do politike zasebnosti',
|
||||||
|
privacyPolicyTip: 'Pomaga obiskovalcem razumeti, katere podatke aplikacija zbira, glejte <privacyPolicyLink>politiko zasebnosti</privacyPolicyLink> Dify.',
|
||||||
|
customDisclaimer: 'Prilagojena izjava o omejitvi odgovornosti',
|
||||||
|
customDisclaimerPlaceholder: 'Vnesite prilagojeno izjavo o omejitvi odgovornosti',
|
||||||
|
customDisclaimerTip: 'Prilagojeno izjavo o omejitvi odgovornosti bo prikazano na strani za stranke, ki bo zagotavljala dodatne informacije o aplikaciji',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
embedded: {
|
||||||
|
entry: 'Vdelano',
|
||||||
|
title: 'Vdelava na spletno stran',
|
||||||
|
explanation: 'Izberite način vdelave klepeta na svojo spletno stran',
|
||||||
|
iframe: 'Za dodajanje klepeta kjerkoli na vaši spletni strani dodajte to iframe v vašo HTML kodo.',
|
||||||
|
scripts: 'Za dodajanje klepeta na spodnji desni del vaše spletne strani dodajte to kodo v vašo HTML kodo.',
|
||||||
|
chromePlugin: 'Namestite Dify Chatbot razširitev za Chrome',
|
||||||
|
copied: 'Kopirano',
|
||||||
|
copy: 'Kopiraj',
|
||||||
|
},
|
||||||
|
qrcode: {
|
||||||
|
title: 'Povezava QR koda',
|
||||||
|
scan: 'Skeniraj za deljenje',
|
||||||
|
download: 'Prenesi QR kodo',
|
||||||
|
},
|
||||||
|
customize: {
|
||||||
|
way: 'način',
|
||||||
|
entry: 'Prilagodi',
|
||||||
|
title: 'Prilagodi AI spletno aplikacijo',
|
||||||
|
explanation: 'Lahko prilagodite sprednji del spletne aplikacije, da ustreza vašim scenarijem in potrebam po slogu.',
|
||||||
|
way1: {
|
||||||
|
name: 'Forkajte kodo stranke, jo spremenite in namestite na Vercel (priporočeno)',
|
||||||
|
step1: 'Forkajte kodo stranke in jo spremenite',
|
||||||
|
step1Tip: 'Kliknite tukaj, da forknite izvorno kodo v svoj GitHub račun in spremenite kodo',
|
||||||
|
step1Operation: 'Dify-WebClient',
|
||||||
|
step2: 'Namestite na Vercel',
|
||||||
|
step2Tip: 'Kliknite tukaj, da uvozite repozitorij v Vercel in namestite',
|
||||||
|
step2Operation: 'Uvoz repozitorija',
|
||||||
|
step3: 'Konfigurirajte spremenljivke okolja',
|
||||||
|
step3Tip: 'Dodajte naslednje spremenljivke okolja v Vercel',
|
||||||
|
},
|
||||||
|
way2: {
|
||||||
|
name: 'Napišite kodo na strani stranke za klic API-ja in jo namestite na strežnik',
|
||||||
|
operation: 'Dokumentacija',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
apiInfo: {
|
||||||
|
title: 'API storitev v ozadju',
|
||||||
|
explanation: 'Enostavna integracija v vašo aplikacijo',
|
||||||
|
accessibleAddress: 'API končna točka storitve',
|
||||||
|
doc: 'API referenca',
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
running: 'V storitvi',
|
||||||
|
disable: 'Onemogočeno',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
analysis: {
|
||||||
|
title: 'Analiza',
|
||||||
|
ms: 'ms',
|
||||||
|
tokenPS: 'Žetoni/s',
|
||||||
|
totalMessages: {
|
||||||
|
title: 'Skupno število sporočil',
|
||||||
|
explanation: 'Število dnevnih AI interakcij.',
|
||||||
|
},
|
||||||
|
totalConversations: {
|
||||||
|
title: 'Skupno število pogovorov',
|
||||||
|
explanation: 'Število dnevnih AI pogovorov; inženiring promptov/debugging izključeno.',
|
||||||
|
},
|
||||||
|
activeUsers: {
|
||||||
|
title: 'Aktivni uporabniki',
|
||||||
|
explanation: 'Unikatni uporabniki, ki sodelujejo v vprašanjih in odgovorih z AI; inženiring promptov/debugging izključeno.',
|
||||||
|
},
|
||||||
|
tokenUsage: {
|
||||||
|
title: 'Poraba žetonov',
|
||||||
|
explanation: 'Odzrcaljuje dnevno porabo žetonov jezikovnega modela za aplikacijo, uporabno za namene nadzora stroškov.',
|
||||||
|
consumed: 'Porabljeni',
|
||||||
|
},
|
||||||
|
avgSessionInteractions: {
|
||||||
|
title: 'Povprečne interakcije v seji',
|
||||||
|
explanation: 'Število neprekinjenih komunikacij med uporabnikom in AI; za aplikacije, ki temeljijo na pogovoru.',
|
||||||
|
},
|
||||||
|
avgUserInteractions: {
|
||||||
|
title: 'Povprečne interakcije uporabnika',
|
||||||
|
explanation: 'Odzrcaljuje dnevno pogostost uporabe uporabnikov. Ta metrika odraža vezanost uporabnikov.',
|
||||||
|
},
|
||||||
|
userSatisfactionRate: {
|
||||||
|
title: 'Stopnja zadovoljstva uporabnikov',
|
||||||
|
explanation: 'Število všečkov na 1.000 sporočil. To kaže delež odgovorov, s katerimi so uporabniki zelo zadovoljni.',
|
||||||
|
},
|
||||||
|
avgResponseTime: {
|
||||||
|
title: 'Povprečni odzivni čas',
|
||||||
|
explanation: 'Čas (v ms) za obdelavo/odgovor AI; za aplikacije, ki temeljijo na besedilu.',
|
||||||
|
},
|
||||||
|
tps: {
|
||||||
|
title: 'Hitrost izhoda žetonov',
|
||||||
|
explanation: 'Merite učinkovitost LLM. Šteje hitrost izhoda žetonov od začetka zahteve do zaključka izhoda.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
138
web/i18n/sl-SI/app.ts
Normal file
138
web/i18n/sl-SI/app.ts
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
const translation = {
|
||||||
|
createApp: 'USTVARI APLIKACIJO',
|
||||||
|
types: {
|
||||||
|
all: 'Vse',
|
||||||
|
chatbot: 'Klepetalnik',
|
||||||
|
agent: 'Agent',
|
||||||
|
workflow: 'Potek dela',
|
||||||
|
completion: 'Dopolnjevanje',
|
||||||
|
},
|
||||||
|
duplicate: 'Podvoji',
|
||||||
|
duplicateTitle: 'Podvoji aplikacijo',
|
||||||
|
export: 'Izvozi DSL',
|
||||||
|
exportFailed: 'Izvoz DSL ni uspel.',
|
||||||
|
importDSL: 'Uvozi datoteko DSL',
|
||||||
|
createFromConfigFile: 'Ustvari iz datoteke DSL',
|
||||||
|
importFromDSL: 'Uvozi iz DSL',
|
||||||
|
importFromDSLFile: 'Iz datoteke DSL',
|
||||||
|
importFromDSLUrl: 'Iz URL-ja',
|
||||||
|
importFromDSLUrlPlaceholder: 'Tukaj prilepi povezavo DSL',
|
||||||
|
deleteAppConfirmTitle: 'Izbrišem to aplikacijo?',
|
||||||
|
deleteAppConfirmContent:
|
||||||
|
'Brisanje aplikacije je nepopravljivo. Uporabniki ne bodo več imeli dostopa do vaše aplikacije, vse konfiguracije in dnevniki pa bodo trajno izbrisani.',
|
||||||
|
appDeleted: 'Aplikacija izbrisana',
|
||||||
|
appDeleteFailed: 'Brisanje aplikacije ni uspelo',
|
||||||
|
join: 'Pridruži se skupnosti',
|
||||||
|
communityIntro:
|
||||||
|
'Pogovarjajte se s člani ekipe, sodelavci in razvijalci na različnih kanalih.',
|
||||||
|
roadmap: 'Oglejte si naš načrt',
|
||||||
|
newApp: {
|
||||||
|
startFromBlank: 'Ustvari iz nič',
|
||||||
|
startFromTemplate: 'Ustvari iz predloge',
|
||||||
|
captionAppType: 'Kakšno aplikacijo želite ustvariti?',
|
||||||
|
chatbotDescription: 'Zgradite aplikacijo, ki temelji na klepetu. Ta aplikacija uporablja format vprašanj in odgovorov, ki omogoča več krogov neprekinjenega pogovora.',
|
||||||
|
completionDescription: 'Zgradite aplikacijo, ki na podlagi pozivov generira visokokakovostno besedilo, kot je ustvarjanje člankov, povzetkov, prevodov in več.',
|
||||||
|
completionWarning: 'Ta vrsta aplikacije ne bo več podprta.',
|
||||||
|
agentDescription: 'Zgradite inteligentnega agenta, ki lahko samostojno izbere orodja za dokončanje nalog.',
|
||||||
|
workflowDescription: 'Zgradite aplikacijo, ki generira visokokakovostno besedilo na podlagi orkestracije poteka dela z visoko stopnjo prilagodljivosti. Primerna je za izkušene uporabnike.',
|
||||||
|
workflowWarning: 'Trenutno v beta različici',
|
||||||
|
chatbotType: 'Metoda orkestracije klepetalnika',
|
||||||
|
basic: 'Osnovno',
|
||||||
|
basicTip: 'Za začetnike, lahko kasneje preklopite na Chatflow',
|
||||||
|
basicFor: 'ZA ZAČETNIKE',
|
||||||
|
basicDescription: 'Osnovna orkestracija omogoča orkestracijo aplikacije klepetalnika z enostavnimi nastavitvami, brez možnosti spreminjanja vgrajenih pozivov. Primerna je za začetnike.',
|
||||||
|
advanced: 'Chatflow',
|
||||||
|
advancedFor: 'Za napredne uporabnike',
|
||||||
|
advancedDescription: 'Orkestracija poteka dela orkestrira klepetalnike v obliki potekov dela, ki ponuja visoko stopnjo prilagodljivosti, vključno z možnostjo urejanja vgrajenih pozivov. Primerna je za izkušene uporabnike.',
|
||||||
|
captionName: 'Ikona in ime aplikacije',
|
||||||
|
appNamePlaceholder: 'Poimenujte svojo aplikacijo',
|
||||||
|
captionDescription: 'Opis',
|
||||||
|
appDescriptionPlaceholder: 'Vnesite opis aplikacije',
|
||||||
|
useTemplate: 'Uporabi to predlogo',
|
||||||
|
previewDemo: 'Predogled demo različice',
|
||||||
|
chatApp: 'Pomočnik',
|
||||||
|
chatAppIntro:
|
||||||
|
'Želim zgraditi aplikacijo, ki temelji na klepetu. Ta aplikacija uporablja format vprašanj in odgovorov, ki omogoča več krogov neprekinjenega pogovora.',
|
||||||
|
agentAssistant: 'Novi pomočnik agenta',
|
||||||
|
completeApp: 'Generator besedila',
|
||||||
|
completeAppIntro:
|
||||||
|
'Želim ustvariti aplikacijo, ki na podlagi pozivov generira visokokakovostno besedilo, kot je ustvarjanje člankov, povzetkov, prevodov in več.',
|
||||||
|
showTemplates: 'Želim izbrati iz predloge',
|
||||||
|
hideTemplates: 'Vrni se na izbiro načina',
|
||||||
|
Create: 'Ustvari',
|
||||||
|
Cancel: 'Prekliči',
|
||||||
|
nameNotEmpty: 'Ime ne sme biti prazno',
|
||||||
|
appTemplateNotSelected: 'Izberite predlogo',
|
||||||
|
appTypeRequired: 'Izberite vrsto aplikacije',
|
||||||
|
appCreated: 'Aplikacija ustvarjena',
|
||||||
|
appCreateFailed: 'Ustvarjanje aplikacije ni uspelo',
|
||||||
|
},
|
||||||
|
editApp: 'Uredi informacije',
|
||||||
|
editAppTitle: 'Uredi informacije o aplikaciji',
|
||||||
|
editDone: 'Informacije o aplikaciji posodobljene',
|
||||||
|
editFailed: 'Posodobitev informacij o aplikaciji ni uspela',
|
||||||
|
iconPicker: {
|
||||||
|
ok: 'V redu',
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
emoji: 'Emoji',
|
||||||
|
image: 'Slika',
|
||||||
|
},
|
||||||
|
answerIcon: {
|
||||||
|
title: 'Uporabite ikono WebApp za zamenjavo 🤖',
|
||||||
|
description: 'Ali uporabiti ikono WebApp za zamenjavo 🤖 v deljeni aplikaciji',
|
||||||
|
descriptionInExplore: 'Ali uporabiti ikono WebApp za zamenjavo 🤖 v razdelku Razišči',
|
||||||
|
},
|
||||||
|
switch: 'Preklopi na Workflow Orchestrate',
|
||||||
|
switchTipStart: 'Za vas bo ustvarjena nova kopija aplikacije, ki bo preklopila na Workflow Orchestrate. Nova kopija ne bo ',
|
||||||
|
switchTip: 'dovolila',
|
||||||
|
switchTipEnd: ' preklopa nazaj na Basic Orchestrate.',
|
||||||
|
switchLabel: 'Kopija aplikacije, ki bo ustvarjena',
|
||||||
|
removeOriginal: 'Izbriši izvirno aplikacijo',
|
||||||
|
switchStart: 'Začni preklop',
|
||||||
|
typeSelector: {
|
||||||
|
all: 'VSE VRSTE',
|
||||||
|
chatbot: 'Klepetalnik',
|
||||||
|
agent: 'Agent',
|
||||||
|
workflow: 'Potek dela',
|
||||||
|
completion: 'Dopolnjevanje',
|
||||||
|
},
|
||||||
|
tracing: {
|
||||||
|
title: 'Sledenje uspešnosti aplikacije',
|
||||||
|
description: 'Konfiguracija ponudnika LLMOps tretje osebe in sledenje uspešnosti aplikacije.',
|
||||||
|
config: 'Konfiguracija',
|
||||||
|
view: 'Ogled',
|
||||||
|
collapse: 'Strni',
|
||||||
|
expand: 'Razširi',
|
||||||
|
tracing: 'Sledenje',
|
||||||
|
disabled: 'Onemogočeno',
|
||||||
|
disabledTip: 'Najprej konfigurirajte ponudnika',
|
||||||
|
enabled: 'V storitvi',
|
||||||
|
tracingDescription: 'Zajem celotnega konteksta izvajanja aplikacije, vključno s klici LLM, kontekstom, pozivi, zahtevami HTTP in še več, na platformo za sledenje tretje osebe.',
|
||||||
|
configProviderTitle: {
|
||||||
|
configured: 'Konfigurirano',
|
||||||
|
notConfigured: 'Konfigurirajte ponudnika za omogočanje sledenja',
|
||||||
|
moreProvider: 'Več ponudnikov',
|
||||||
|
},
|
||||||
|
langsmith: {
|
||||||
|
title: 'LangSmith',
|
||||||
|
description: 'Vse-v-enem razvijalska platforma za vsak korak življenjskega cikla aplikacije, ki jo poganja LLM.',
|
||||||
|
},
|
||||||
|
langfuse: {
|
||||||
|
title: 'Langfuse',
|
||||||
|
description: 'Sledi, vrednoti, upravlja pozive in meri za odpravljanje napak in izboljšanje vaše aplikacije LLM.',
|
||||||
|
},
|
||||||
|
inUse: 'V uporabi',
|
||||||
|
configProvider: {
|
||||||
|
title: 'Konfiguracija',
|
||||||
|
placeholder: 'Vnesite vaš {{key}}',
|
||||||
|
project: 'Projekt',
|
||||||
|
publicKey: 'Javni ključ',
|
||||||
|
secretKey: 'Skrivni ključ',
|
||||||
|
viewDocsLink: 'Ogled dokumentov {{key}}',
|
||||||
|
removeConfirmTitle: 'Odstraniti konfiguracijo {{key}}?',
|
||||||
|
removeConfirmContent: 'Trenutna konfiguracija je v uporabi, odstranitev bo onemogočila funkcijo sledenja.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
118
web/i18n/sl-SI/billing.ts
Normal file
118
web/i18n/sl-SI/billing.ts
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
const translation = {
|
||||||
|
currentPlan: 'Trenutni načrt',
|
||||||
|
upgradeBtn: {
|
||||||
|
plain: 'Nadgradi načrt',
|
||||||
|
encourage: 'Nadgradi zdaj',
|
||||||
|
encourageShort: 'Nadgradi',
|
||||||
|
},
|
||||||
|
viewBilling: 'Upravljanje s plačili in naročninami',
|
||||||
|
buyPermissionDeniedTip: 'Za naročnino kontaktirajte svojega skrbnika podjetja',
|
||||||
|
plansCommon: {
|
||||||
|
title: 'Izberite načrt, ki vam ustreza',
|
||||||
|
yearlyTip: 'Z letno naročnino pridobite 2 meseca brezplačno!',
|
||||||
|
mostPopular: 'Najbolj priljubljeno',
|
||||||
|
planRange: {
|
||||||
|
monthly: 'Mesečno',
|
||||||
|
yearly: 'Letno',
|
||||||
|
},
|
||||||
|
month: 'mesec',
|
||||||
|
year: 'leto',
|
||||||
|
save: 'Prihranite ',
|
||||||
|
free: 'Brezplačno',
|
||||||
|
currentPlan: 'Trenutni načrt',
|
||||||
|
contractSales: 'Kontaktirajte prodajo',
|
||||||
|
contractOwner: 'Kontaktirajte upravitelja ekipe',
|
||||||
|
startForFree: 'Začnite brezplačno',
|
||||||
|
getStartedWith: 'Začnite z ',
|
||||||
|
contactSales: 'Kontaktirajte prodajo',
|
||||||
|
talkToSales: 'Pogovorite se s prodajo',
|
||||||
|
modelProviders: 'Ponudniki modelov',
|
||||||
|
teamMembers: 'Člani ekipe',
|
||||||
|
annotationQuota: 'Kvote za označevanje',
|
||||||
|
buildApps: 'Gradite aplikacije',
|
||||||
|
vectorSpace: 'Prostor za vektorje',
|
||||||
|
vectorSpaceBillingTooltip: 'Vsak 1 MB lahko shrani približno 1,2 milijona znakov vektoriziranih podatkov (ocenjeno z uporabo OpenAI Embeddings, odvisno od modelov).',
|
||||||
|
vectorSpaceTooltip: 'Prostor za vektorje je dolgoročni pomnilniški sistem, potreben za to, da LLM-ji razumejo vaše podatke.',
|
||||||
|
documentsUploadQuota: 'Kvote za nalaganje dokumentov',
|
||||||
|
documentProcessingPriority: 'Prioriteta obdelave dokumentov',
|
||||||
|
documentProcessingPriorityTip: 'Za višjo prioriteto obdelave dokumentov nadgradite svoj načrt.',
|
||||||
|
documentProcessingPriorityUpgrade: 'Obdelujte več podatkov z večjo natančnostjo in hitrostjo.',
|
||||||
|
priority: {
|
||||||
|
'standard': 'Standard',
|
||||||
|
'priority': 'Prioriteta',
|
||||||
|
'top-priority': 'Najvišja prioriteta',
|
||||||
|
},
|
||||||
|
logsHistory: 'Zgodovina dnevnikov',
|
||||||
|
customTools: 'Prilagojena orodja',
|
||||||
|
unavailable: 'Ni na voljo',
|
||||||
|
days: 'dni',
|
||||||
|
unlimited: 'Neomejeno',
|
||||||
|
support: 'Podpora',
|
||||||
|
supportItems: {
|
||||||
|
communityForums: 'Skupnostni forumi',
|
||||||
|
emailSupport: 'Podpora preko e-pošte',
|
||||||
|
priorityEmail: 'Prioritetna podpora preko e-pošte in klepeta',
|
||||||
|
logoChange: 'Sprememba logotipa',
|
||||||
|
SSOAuthentication: 'SSO avtentikacija',
|
||||||
|
personalizedSupport: 'Osebna podpora',
|
||||||
|
dedicatedAPISupport: 'Namenska podpora API-ju',
|
||||||
|
customIntegration: 'Prilagojena integracija in podpora',
|
||||||
|
ragAPIRequest: 'RAG API zahtevki',
|
||||||
|
bulkUpload: 'Masovni prenos dokumentov',
|
||||||
|
agentMode: 'Način agenta',
|
||||||
|
workflow: 'Potek dela',
|
||||||
|
llmLoadingBalancing: 'LLM uravnoteženje obremenitve',
|
||||||
|
llmLoadingBalancingTooltip: 'Dodajte več API ključev modelom, kar učinkovito preseže omejitve hitrosti API-ja.',
|
||||||
|
},
|
||||||
|
comingSoon: 'Kmalu na voljo',
|
||||||
|
member: 'Član',
|
||||||
|
memberAfter: 'Član',
|
||||||
|
messageRequest: {
|
||||||
|
title: 'Krediti za sporočila',
|
||||||
|
tooltip: 'Kvota za klice sporočil pri različnih načrtih z uporabo modelov OpenAI (razen GPT-4). Sporočila preko omejitve bodo uporabljala vaš OpenAI API ključ.',
|
||||||
|
},
|
||||||
|
annotatedResponse: {
|
||||||
|
title: 'Omejitve kvote za označevanje',
|
||||||
|
tooltip: 'Ročno urejanje in označevanje odgovorov omogoča prilagojeno visoko kakovostno odgovarjanje na vprašanja v aplikacijah. (Velja samo za klepetalne aplikacije)',
|
||||||
|
},
|
||||||
|
ragAPIRequestTooltip: 'Nanaša se na število API klicev, ki vključujejo samo sposobnosti obdelave baze znanja Dify.',
|
||||||
|
receiptInfo: 'Le lastnik ekipe in skrbnik ekipe lahko naročita in si ogledate podatke o plačilih',
|
||||||
|
},
|
||||||
|
plans: {
|
||||||
|
sandbox: {
|
||||||
|
name: 'Peskovnik',
|
||||||
|
description: '200 brezplačnih poskusov GPT',
|
||||||
|
includesTitle: 'Vključuje:',
|
||||||
|
},
|
||||||
|
professional: {
|
||||||
|
name: 'Profesionalni',
|
||||||
|
description: 'Za posameznike in male ekipe, da odklenete več zmogljivosti po ugodni ceni.',
|
||||||
|
includesTitle: 'Vse v brezplačnem načrtu, plus:',
|
||||||
|
},
|
||||||
|
team: {
|
||||||
|
name: 'Ekipa',
|
||||||
|
description: 'Sodelujte brez omejitev in uživajte v vrhunski zmogljivosti.',
|
||||||
|
includesTitle: 'Vse v profesionalnem načrtu, plus:',
|
||||||
|
},
|
||||||
|
enterprise: {
|
||||||
|
name: 'Podjetje',
|
||||||
|
description: 'Pridobite vse zmogljivosti in podporo za velike sisteme kritične za misijo.',
|
||||||
|
includesTitle: 'Vse v načrtu Ekipa, plus:',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
vectorSpace: {
|
||||||
|
fullTip: 'Prostor za vektorje je poln.',
|
||||||
|
fullSolution: 'Nadgradite svoj načrt za več prostora.',
|
||||||
|
},
|
||||||
|
apps: {
|
||||||
|
fullTipLine1: 'Nadgradite svoj načrt, da',
|
||||||
|
fullTipLine2: 'gradite več aplikacij.',
|
||||||
|
},
|
||||||
|
annotatedResponse: {
|
||||||
|
fullTipLine1: 'Nadgradite svoj načrt, da',
|
||||||
|
fullTipLine2: 'označite več pogovorov.',
|
||||||
|
quotaTitle: 'Kvote za odgovor z označevanjem',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
580
web/i18n/sl-SI/common.ts
Normal file
580
web/i18n/sl-SI/common.ts
Normal file
|
@ -0,0 +1,580 @@
|
||||||
|
const translation = {
|
||||||
|
api: {
|
||||||
|
success: 'Uspeh',
|
||||||
|
actionSuccess: 'Dejanje je uspelo',
|
||||||
|
saved: 'Shranjeno',
|
||||||
|
create: 'Ustvarjeno',
|
||||||
|
remove: 'Odstranjeno',
|
||||||
|
},
|
||||||
|
operation: {
|
||||||
|
create: 'Ustvari',
|
||||||
|
confirm: 'Potrdi',
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
clear: 'Počisti',
|
||||||
|
save: 'Shrani',
|
||||||
|
saveAndEnable: 'Shrani in omogoči',
|
||||||
|
edit: 'Uredi',
|
||||||
|
add: 'Dodaj',
|
||||||
|
added: 'Dodano',
|
||||||
|
refresh: 'Osveži',
|
||||||
|
reset: 'Ponastavi',
|
||||||
|
search: 'Išči',
|
||||||
|
change: 'Spremeni',
|
||||||
|
remove: 'Odstrani',
|
||||||
|
send: 'Pošlji',
|
||||||
|
copy: 'Kopiraj',
|
||||||
|
lineBreak: 'Prelom vrstice',
|
||||||
|
sure: 'Prepričan sem',
|
||||||
|
download: 'Prenesi',
|
||||||
|
delete: 'Izbriši',
|
||||||
|
settings: 'Nastavitve',
|
||||||
|
setup: 'Nastavitev',
|
||||||
|
getForFree: 'Dobite brezplačno',
|
||||||
|
reload: 'Ponovno naloži',
|
||||||
|
ok: 'V redu',
|
||||||
|
log: 'Dnevnik',
|
||||||
|
learnMore: 'Izvedi več',
|
||||||
|
params: 'Parametri',
|
||||||
|
duplicate: 'Podvoji',
|
||||||
|
rename: 'Preimenuj',
|
||||||
|
audioSourceUnavailable: 'Zvočni vir ni na voljo',
|
||||||
|
},
|
||||||
|
errorMsg: {
|
||||||
|
fieldRequired: '{{field}} je obvezno',
|
||||||
|
urlError: 'url mora začeti z http:// ali https://',
|
||||||
|
},
|
||||||
|
placeholder: {
|
||||||
|
input: 'Vnesite prosim',
|
||||||
|
select: 'Izberite prosim',
|
||||||
|
},
|
||||||
|
voice: {
|
||||||
|
language: {
|
||||||
|
zhHans: 'Kitajščina (poenostavljena)',
|
||||||
|
zhHant: 'Kitajščina (tradicionalna)',
|
||||||
|
enUS: 'Angleščina',
|
||||||
|
deDE: 'Nemščina',
|
||||||
|
frFR: 'Francoščina',
|
||||||
|
esES: 'Španščina',
|
||||||
|
itIT: 'Italijanščina',
|
||||||
|
thTH: 'Tajščina',
|
||||||
|
idID: 'Indonezijščina',
|
||||||
|
jaJP: 'Japonščina',
|
||||||
|
koKR: 'Korejščina',
|
||||||
|
ptBR: 'Portugalščina',
|
||||||
|
ruRU: 'Ruščina',
|
||||||
|
ukUA: 'Ukrajinščina',
|
||||||
|
viVN: 'Vietnamščina',
|
||||||
|
plPL: 'Poljščina',
|
||||||
|
roRO: 'Romunščina',
|
||||||
|
hiIN: 'Hindujščina',
|
||||||
|
trTR: 'Turščina',
|
||||||
|
faIR: 'Farsi',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
unit: {
|
||||||
|
char: 'znaki',
|
||||||
|
},
|
||||||
|
actionMsg: {
|
||||||
|
noModification: 'Trenutno ni sprememb.',
|
||||||
|
modifiedSuccessfully: 'Spremenjeno uspešno',
|
||||||
|
modifiedUnsuccessfully: 'Spremenjeno neuspešno',
|
||||||
|
copySuccessfully: 'Kopirano uspešno',
|
||||||
|
paySucceeded: 'Plačilo je uspelo',
|
||||||
|
payCancelled: 'Plačilo preklicano',
|
||||||
|
generatedSuccessfully: 'Generirano uspešno',
|
||||||
|
generatedUnsuccessfully: 'Generirano neuspešno',
|
||||||
|
},
|
||||||
|
model: {
|
||||||
|
params: {
|
||||||
|
temperature: 'Temperatura',
|
||||||
|
temperatureTip:
|
||||||
|
'Nadzoruje naključnost: Znižanje temperature vodi do manj naključnih zaključkov. Ko se temperatura približa ničli, bo model postal determinističen in ponavljajoč.',
|
||||||
|
top_p: 'Top P',
|
||||||
|
top_pTip:
|
||||||
|
'Nadzoruje raznolikost preko vzorčenja jedra: 0.5 pomeni, da je upoštevanih polovica vseh možnosti glede na njihovo verjetnost.',
|
||||||
|
presence_penalty: 'Kaznovanje za prisotnost',
|
||||||
|
presence_penaltyTip:
|
||||||
|
'Kako močno kaznovati nove besede, glede na to, ali so se že pojavile v besedilu.\nPovečuje verjetnost, da bo model obravnaval nove teme.',
|
||||||
|
frequency_penalty: 'Kaznovanje za frekvenco',
|
||||||
|
frequency_penaltyTip:
|
||||||
|
'Kako močno kaznovati nove besede glede na njihovo že obstoječo frekvenco v besedilu.\nZmanjšuje verjetnost, da bo model ponavljal iste vrstice.',
|
||||||
|
max_tokens: 'Največje število žetonov',
|
||||||
|
max_tokensTip:
|
||||||
|
'Uporabljeno za omejitev največje dolžine odgovora, v žetonih.\nVečje vrednosti lahko omejijo prostor za besede, zgodovino pogovorov in znanje. \nPriporočljivo je nastaviti pod dve tretjini.\ngpt-4-1106-preview, gpt-4-vision-preview maksimalno število žetonov (vnos 128k, izhod 4k)',
|
||||||
|
maxTokenSettingTip: 'Vaša nastavitev za največje število žetonov je visoka, kar lahko omeji prostor za pozive, poizvedbe in podatke. Razmislite o nastavitvi pod 2/3.',
|
||||||
|
setToCurrentModelMaxTokenTip: 'Največje število žetonov je posodobljeno na 80 % največjega števila žetonov trenutnega modela {{maxToken}}.',
|
||||||
|
stop_sequences: 'Zaporedja ustavljanja',
|
||||||
|
stop_sequencesTip: 'Do štiri zaporedja, kjer bo API prenehal generirati nadaljnje žetone. Vrnjen tekst ne bo vseboval zaporedja ustavitve.',
|
||||||
|
stop_sequencesPlaceholder: 'Vnesite zaporedje in pritisnite Tab',
|
||||||
|
},
|
||||||
|
tone: {
|
||||||
|
Creative: 'Kreativno',
|
||||||
|
Balanced: 'Uravnoteženo',
|
||||||
|
Precise: 'Natančno',
|
||||||
|
Custom: 'Po meri',
|
||||||
|
},
|
||||||
|
addMoreModel: 'Pojdite v nastavitve, da dodate več modelov',
|
||||||
|
},
|
||||||
|
menus: {
|
||||||
|
status: 'beta',
|
||||||
|
explore: 'Raziskuj',
|
||||||
|
apps: 'Studio',
|
||||||
|
plugins: 'Vtičniki',
|
||||||
|
pluginsTips: 'Integrirajte vtičnike tretjih oseb ali ustvarite vtičnike, združljive s ChatGPT.',
|
||||||
|
datasets: 'Znanje',
|
||||||
|
datasetsTips: 'KMALU: Uvozite svoje besedilne podatke ali pišite podatke v realnem času preko spletnih kljuk za izboljšanje konteksta LLM.',
|
||||||
|
newApp: 'Nova aplikacija',
|
||||||
|
newDataset: 'Ustvari znanje',
|
||||||
|
tools: 'Orodja',
|
||||||
|
},
|
||||||
|
userProfile: {
|
||||||
|
settings: 'Nastavitve',
|
||||||
|
emailSupport: 'Podpora po e-pošti',
|
||||||
|
workspace: 'Delovni prostor',
|
||||||
|
createWorkspace: 'Ustvari delovni prostor',
|
||||||
|
helpCenter: 'Pomoč',
|
||||||
|
communityFeedback: 'Povratne informacije',
|
||||||
|
roadmap: 'Načrt razvoja',
|
||||||
|
community: 'Skupnost',
|
||||||
|
about: 'O nas',
|
||||||
|
logout: 'Odjava',
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
accountGroup: 'SPLOŠNO',
|
||||||
|
workplaceGroup: 'DELOVNI PROSTOR',
|
||||||
|
account: 'Moj račun',
|
||||||
|
members: 'Člani',
|
||||||
|
billing: 'Zaračunavanje',
|
||||||
|
integrations: 'Integracije',
|
||||||
|
language: 'Jezik',
|
||||||
|
provider: 'Ponudnik modelov',
|
||||||
|
dataSource: 'Vir podatkov',
|
||||||
|
plugin: 'Vtičniki',
|
||||||
|
apiBasedExtension: 'Razširitev API-ja',
|
||||||
|
},
|
||||||
|
account: {
|
||||||
|
account: 'Račun',
|
||||||
|
myAccount: 'Moj račun',
|
||||||
|
studio: 'Dify Studio',
|
||||||
|
avatar: 'Avatar',
|
||||||
|
name: 'Ime',
|
||||||
|
email: 'E-pošta',
|
||||||
|
password: 'Geslo',
|
||||||
|
passwordTip: 'Lahko nastavite stalno geslo, če ne želite uporabljati začasnih prijavnih kod',
|
||||||
|
setPassword: 'Nastavi geslo',
|
||||||
|
resetPassword: 'Ponastavi geslo',
|
||||||
|
currentPassword: 'Trenutno geslo',
|
||||||
|
newPassword: 'Novo geslo',
|
||||||
|
confirmPassword: 'Potrdi geslo',
|
||||||
|
notEqual: 'Gesli se ne ujemata.',
|
||||||
|
langGeniusAccount: 'Dify račun',
|
||||||
|
langGeniusAccountTip: 'Vaš Dify račun in povezani uporabniški podatki.',
|
||||||
|
editName: 'Uredi ime',
|
||||||
|
showAppLength: 'Prikaz {{length}} aplikacij',
|
||||||
|
delete: 'Izbriši račun',
|
||||||
|
deleteTip: 'Brisanje vašega računa bo trajno izbrisalo vse vaše podatke in jih ne bo mogoče obnoviti.',
|
||||||
|
deleteConfirmTip: 'Za potrditev pošljite naslednje s svojega registriranega e-poštnega naslova na ',
|
||||||
|
},
|
||||||
|
members: {
|
||||||
|
team: 'Ekipa',
|
||||||
|
invite: 'Dodaj',
|
||||||
|
name: 'IME',
|
||||||
|
lastActive: 'NAZADNJE AKTIVEN',
|
||||||
|
role: 'VLOGE',
|
||||||
|
pending: 'V teku...',
|
||||||
|
owner: 'Lastnik',
|
||||||
|
admin: 'Administrator',
|
||||||
|
adminTip: 'Lahko ustvarja aplikacije in upravlja nastavitve ekipe',
|
||||||
|
normal: 'Običajni uporabnik',
|
||||||
|
normalTip: 'Lahko uporablja samo aplikacije, ne more ustvarjati aplikacij',
|
||||||
|
builder: 'Graditelj',
|
||||||
|
builderTip: 'Lahko ustvarja in ureja lastne aplikacije',
|
||||||
|
editor: 'Urednik',
|
||||||
|
editorTip: 'Lahko ustvarja in ureja aplikacije',
|
||||||
|
datasetOperator: 'Skrbnik znanja',
|
||||||
|
datasetOperatorTip: 'Lahko upravlja samo bazo znanja',
|
||||||
|
inviteTeamMember: 'Dodaj člana ekipe',
|
||||||
|
inviteTeamMemberTip: 'Do vaših podatkov bo lahko dostopal takoj po prijavi.',
|
||||||
|
email: 'E-pošta',
|
||||||
|
emailInvalid: 'Neveljaven format e-pošte',
|
||||||
|
emailPlaceholder: 'Vnesite e-poštne naslove',
|
||||||
|
sendInvite: 'Pošlji povabilo',
|
||||||
|
invitedAsRole: 'Povabljen kot uporabnik {{role}}',
|
||||||
|
invitationSent: 'Povabilo poslano',
|
||||||
|
invitationSentTip: 'Povabilo poslano, in po prijavi v Dify bodo imeli dostop do vaših podatkov ekipe.',
|
||||||
|
invitationLink: 'Povezava za povabilo',
|
||||||
|
failedInvitationEmails: 'Spodnji uporabniki niso bili uspešno povabljeni',
|
||||||
|
ok: 'V redu',
|
||||||
|
removeFromTeam: 'Odstrani iz ekipe',
|
||||||
|
removeFromTeamTip: 'Odstranjen bo dostop do ekipe',
|
||||||
|
setAdmin: 'Nastavi za administratorja',
|
||||||
|
setMember: 'Nastavi za običajnega člana',
|
||||||
|
setBuilder: 'Nastavi za graditelja',
|
||||||
|
setEditor: 'Nastavi za urednika',
|
||||||
|
disInvite: 'Prekliči povabilo',
|
||||||
|
deleteMember: 'Izbriši člana',
|
||||||
|
you: '(Vi)',
|
||||||
|
},
|
||||||
|
integrations: {
|
||||||
|
connected: 'Povezano',
|
||||||
|
google: 'Google',
|
||||||
|
googleAccount: 'Prijavite se z Google računom',
|
||||||
|
github: 'GitHub',
|
||||||
|
githubAccount: 'Prijavite se z GitHub računom',
|
||||||
|
connect: 'Poveži',
|
||||||
|
},
|
||||||
|
language: {
|
||||||
|
displayLanguage: 'Jezik prikaza',
|
||||||
|
timezone: 'Časovni pas',
|
||||||
|
},
|
||||||
|
provider: {
|
||||||
|
apiKey: 'API ključ',
|
||||||
|
enterYourKey: 'Vnesite svoj API ključ tukaj',
|
||||||
|
invalidKey: 'Neveljaven OpenAI API ključ',
|
||||||
|
validatedError: 'Preverjanje ni uspelo: ',
|
||||||
|
validating: 'Preverjam ključ...',
|
||||||
|
saveFailed: 'Shranjevanje API ključa ni uspelo',
|
||||||
|
apiKeyExceedBill: 'Ta API ključ nima več na voljo kvote, preberite',
|
||||||
|
addKey: 'Dodaj ključ',
|
||||||
|
comingSoon: 'Kmalu',
|
||||||
|
editKey: 'Uredi',
|
||||||
|
invalidApiKey: 'Neveljaven API ključ',
|
||||||
|
azure: {
|
||||||
|
apiBase: 'API Osnova',
|
||||||
|
apiBasePlaceholder: 'URL API osnove vašega Azure OpenAI končnega mesta.',
|
||||||
|
apiKey: 'API ključ',
|
||||||
|
apiKeyPlaceholder: 'Vnesite svoj API ključ tukaj',
|
||||||
|
helpTip: 'Spoznajte Azure OpenAI storitev',
|
||||||
|
},
|
||||||
|
openaiHosted: {
|
||||||
|
openaiHosted: 'Gostovani OpenAI',
|
||||||
|
onTrial: 'NA PREIZKUSU',
|
||||||
|
exhausted: 'KVOTA PORABLJENA',
|
||||||
|
desc: 'Gostitvena storitev OpenAI, ki jo ponuja Dify, vam omogoča uporabo modelov, kot je GPT-3.5. Preden porabite kvoto za preizkus, morate nastaviti druge ponudnike modelov.',
|
||||||
|
callTimes: 'Časi klicev',
|
||||||
|
usedUp: 'Kvota za preizkus porabljena. Dodajte svojega ponudnika modelov.',
|
||||||
|
useYourModel: 'Trenutno uporabljate svojega ponudnika modelov.',
|
||||||
|
close: 'Zapri',
|
||||||
|
},
|
||||||
|
anthropicHosted: {
|
||||||
|
anthropicHosted: 'Anthropic Claude',
|
||||||
|
onTrial: 'NA PREIZKUSU',
|
||||||
|
exhausted: 'KVOTA PORABLJENA',
|
||||||
|
desc: 'Zmogljiv model, ki se odlično obnese pri različnih nalogah, od sofisticiranega dialoga in ustvarjanja kreativnih vsebin do podrobnih navodil.',
|
||||||
|
callTimes: 'Časi klicev',
|
||||||
|
usedUp: 'Kvota za preizkus porabljena. Dodajte svojega ponudnika modelov.',
|
||||||
|
useYourModel: 'Trenutno uporabljate svojega ponudnika modelov.',
|
||||||
|
close: 'Zapri',
|
||||||
|
},
|
||||||
|
anthropic: {
|
||||||
|
using: 'Zmožnost vdelave uporablja',
|
||||||
|
enableTip: 'Za omogočitev modela Anthropic morate najprej povezati OpenAI ali Azure OpenAI storitev.',
|
||||||
|
notEnabled: 'Ni omogočeno',
|
||||||
|
keyFrom: 'Pridobite svoj API ključ pri Anthropic',
|
||||||
|
},
|
||||||
|
encrypted: {
|
||||||
|
front: 'Vaš API ključ bo šifriran in shranjen z uporabo',
|
||||||
|
back: ' tehnologije.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
modelProvider: {
|
||||||
|
notConfigured: 'Sistemski model še ni popolnoma konfiguriran, nekatere funkcije morda ne bodo na voljo.',
|
||||||
|
systemModelSettings: 'Nastavitve sistemskega modela',
|
||||||
|
systemModelSettingsLink: 'Zakaj je potrebno nastaviti sistemski model?',
|
||||||
|
selectModel: 'Izberite svoj model',
|
||||||
|
setupModelFirst: 'Najprej nastavite svoj model',
|
||||||
|
systemReasoningModel: {
|
||||||
|
key: 'Sistemski model za sklepanja',
|
||||||
|
tip: 'Nastavite privzeti model za sklepanja, ki se bo uporabljal za ustvarjanje aplikacij, kot tudi funkcije, kot so generiranje imen dialogov in predlaganje naslednjih vprašanj.',
|
||||||
|
},
|
||||||
|
embeddingModel: {
|
||||||
|
key: 'Model za vdelavo',
|
||||||
|
tip: 'Nastavite privzeti model za obdelavo vdelave dokumentov znanja, tako pri iskanju kot pri uvozu znanja se uporablja ta model za vektorizacijo. Preklop bo povzročil neusklajenost vektorske dimenzije med uvoženim znanjem in vprašanjem, kar bo povzročilo neuspešno iskanje. Da bi se izognili neuspehu pri iskanju, ne preklapljajte tega modela brez potrebe.',
|
||||||
|
required: 'Model za vdelavo je obvezen',
|
||||||
|
},
|
||||||
|
speechToTextModel: {
|
||||||
|
key: 'Model za pretvorbo govora v besedilo',
|
||||||
|
tip: 'Nastavite privzeti model za vnos govora v besedilo v pogovoru.',
|
||||||
|
},
|
||||||
|
ttsModel: {
|
||||||
|
key: 'Model za pretvorbo besedila v govor',
|
||||||
|
tip: 'Nastavite privzeti model za pretvorbo besedila v govor v pogovoru.',
|
||||||
|
},
|
||||||
|
rerankModel: {
|
||||||
|
key: 'Model za prerazvrstitev',
|
||||||
|
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.',
|
||||||
|
},
|
||||||
|
apiKey: 'API-KEY',
|
||||||
|
quota: 'Kvote',
|
||||||
|
searchModel: 'Model iskanja',
|
||||||
|
noModelFound: 'Za {{model}} ni najden noben model',
|
||||||
|
models: 'Modeli',
|
||||||
|
showMoreModelProvider: 'Prikaži več ponudnikov modelov',
|
||||||
|
selector: {
|
||||||
|
tip: 'Ta model je bil odstranjen. Prosimo, dodajte model ali izberite drugega.',
|
||||||
|
emptyTip: 'Ni razpoložljivih modelov',
|
||||||
|
emptySetting: 'Prosimo, pojdite v nastavitve za konfiguracijo',
|
||||||
|
rerankTip: 'Prosimo, nastavite model za prerazvrstitev',
|
||||||
|
},
|
||||||
|
card: {
|
||||||
|
quota: 'KVOTE',
|
||||||
|
onTrial: 'Na preizkusu',
|
||||||
|
paid: 'Plačano',
|
||||||
|
quotaExhausted: 'Kvote porabljene',
|
||||||
|
callTimes: 'Časi klicev',
|
||||||
|
tokens: 'Žetoni',
|
||||||
|
buyQuota: 'Kupi kvoto',
|
||||||
|
priorityUse: 'Prednostna uporaba',
|
||||||
|
removeKey: 'Odstrani API ključ',
|
||||||
|
tip: 'Prednostno se bo uporabila plačana kvota. Kvota za preizkus se bo uporabila, ko bo plačana kvota porabljena.',
|
||||||
|
},
|
||||||
|
item: {
|
||||||
|
deleteDesc: '{{modelName}} se uporablja kot sistemski model za sklepanja. Nekatere funkcije ne bodo na voljo po odstranitvi. Prosimo, potrdite.',
|
||||||
|
freeQuota: 'BREZPLAČNA KVOTA',
|
||||||
|
},
|
||||||
|
addApiKey: 'Dodaj svoj API ključ',
|
||||||
|
invalidApiKey: 'Neveljaven API ključ',
|
||||||
|
encrypted: {
|
||||||
|
front: 'Vaš API ključ bo šifriran in shranjen z uporabo',
|
||||||
|
back: ' tehnologije.',
|
||||||
|
},
|
||||||
|
freeQuota: {
|
||||||
|
howToEarn: 'Kako zaslužiti',
|
||||||
|
},
|
||||||
|
addMoreModelProvider: 'DODAJ VEČ PONUDNIKOV MODELOV',
|
||||||
|
addModel: 'Dodaj model',
|
||||||
|
modelsNum: '{{num}} modelov',
|
||||||
|
showModels: 'Prikaži modele',
|
||||||
|
showModelsNum: 'Prikaži {{num}} modelov',
|
||||||
|
collapse: 'Strni',
|
||||||
|
config: 'Konfiguracija',
|
||||||
|
modelAndParameters: 'Model in parametri',
|
||||||
|
model: 'Model',
|
||||||
|
featureSupported: '{{feature}} podprto',
|
||||||
|
callTimes: 'Število klicev',
|
||||||
|
credits: 'Sporočilni krediti',
|
||||||
|
buyQuota: 'Kupi kvoto',
|
||||||
|
getFreeTokens: 'Pridobi brezplačne žetone',
|
||||||
|
priorityUsing: 'Prednostna uporaba',
|
||||||
|
deprecated: 'Zastarelo',
|
||||||
|
confirmDelete: 'Potrdite izbris?',
|
||||||
|
quotaTip: 'Preostali razpoložljivi brezplačni žetoni',
|
||||||
|
loadPresets: 'Naloži prednastavitve',
|
||||||
|
parameters: 'PARAMETRI',
|
||||||
|
loadBalancing: 'Uravnoteženje obremenitev',
|
||||||
|
loadBalancingDescription: 'Zmanjšajte pritisk s pomočjo več sklopov poverilnic.',
|
||||||
|
loadBalancingHeadline: 'Uravnoteženje obremenitev',
|
||||||
|
configLoadBalancing: 'Konfiguracija uravnoteženja obremenitev',
|
||||||
|
modelHasBeenDeprecated: 'Ta model je zastarel',
|
||||||
|
providerManaged: 'Upravljano s strani ponudnika',
|
||||||
|
providerManagedDescription: 'Uporabite enoten sklop poverilnic, ki jih zagotovi ponudnik modela.',
|
||||||
|
defaultConfig: 'Privzeta konfiguracija',
|
||||||
|
apiKeyStatusNormal: 'Stanje API ključa je normalno',
|
||||||
|
apiKeyRateLimit: 'Omejitev hitrosti je dosežena, na voljo po {{seconds}} sekundah',
|
||||||
|
addConfig: 'Dodaj konfiguracijo',
|
||||||
|
editConfig: 'Uredi konfiguracijo',
|
||||||
|
loadBalancingLeastKeyWarning: 'Za omogočanje uravnoteženja obremenitev morata biti omogočena vsaj 2 ključa.',
|
||||||
|
loadBalancingInfo: 'Privzeto uravnoteženje obremenitev uporablja strategijo Round-robin. Če se sproži omejitev hitrosti, se uporabi 1-minutno obdobje ohlajanja.',
|
||||||
|
upgradeForLoadBalancing: 'Nadgradite svoj načrt, da omogočite uravnoteženje obremenitev.',
|
||||||
|
dataSource: {
|
||||||
|
add: 'Dodaj vir podatkov',
|
||||||
|
connect: 'Poveži',
|
||||||
|
configure: 'Konfiguriraj',
|
||||||
|
notion: {
|
||||||
|
title: 'Notion',
|
||||||
|
description: 'Uporaba Notiona kot vira podatkov za Znanost.',
|
||||||
|
connectedWorkspace: 'Povezano delovno okolje',
|
||||||
|
addWorkspace: 'Dodaj delovno okolje',
|
||||||
|
connected: 'Povezan',
|
||||||
|
disconnected: 'Prekinjen',
|
||||||
|
changeAuthorizedPages: 'Spremeni pooblaščene strani',
|
||||||
|
pagesAuthorized: 'Pooblaščene strani',
|
||||||
|
sync: 'Sinhroniziraj',
|
||||||
|
remove: 'Odstrani',
|
||||||
|
selector: {
|
||||||
|
pageSelected: 'Izbrane strani',
|
||||||
|
searchPages: 'Iskanje strani...',
|
||||||
|
noSearchResult: 'Ni rezultatov iskanja',
|
||||||
|
addPages: 'Dodaj strani',
|
||||||
|
preview: 'PREDOGLED',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
website: {
|
||||||
|
title: 'Spletna stran',
|
||||||
|
description: 'Uvoz vsebine s spletnih strani z uporabo spletnega pajka.',
|
||||||
|
with: 'S',
|
||||||
|
configuredCrawlers: 'Konfigurirani pajki',
|
||||||
|
active: 'Aktiven',
|
||||||
|
inactive: 'Neaktiven',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugin: {
|
||||||
|
serpapi: {
|
||||||
|
apiKey: 'API ključ',
|
||||||
|
apiKeyPlaceholder: 'Vnesite svoj API ključ',
|
||||||
|
keyFrom: 'Pridobite svoj SerpAPI ključ na strani računa SerpAPI',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
apiBasedExtension: {
|
||||||
|
title: 'Razširitve API omogočajo centralizirano upravljanje API, kar poenostavi konfiguracijo za enostavno uporabo v aplikacijah Dify.',
|
||||||
|
link: 'Naučite se, kako razviti svojo API razširitev.',
|
||||||
|
linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
|
||||||
|
add: 'Dodaj API razširitev',
|
||||||
|
selector: {
|
||||||
|
title: 'API razširitev',
|
||||||
|
placeholder: 'Prosimo, izberite API razširitev',
|
||||||
|
manage: 'Upravljaj API razširitev',
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
title: 'Dodaj API razširitev',
|
||||||
|
editTitle: 'Uredi API razširitev',
|
||||||
|
name: {
|
||||||
|
title: 'Ime',
|
||||||
|
placeholder: 'Vnesite ime',
|
||||||
|
},
|
||||||
|
apiEndpoint: {
|
||||||
|
title: 'API konec',
|
||||||
|
placeholder: 'Vnesite API konec',
|
||||||
|
},
|
||||||
|
apiKey: {
|
||||||
|
title: 'API ključ',
|
||||||
|
placeholder: 'Vnesite API ključ',
|
||||||
|
lengthError: 'Dolžina API ključa ne sme biti manjša od 5 znakov',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
type: 'Tip',
|
||||||
|
},
|
||||||
|
about: {
|
||||||
|
changeLog: 'Dnevnik sprememb',
|
||||||
|
updateNow: 'Posodobi zdaj',
|
||||||
|
nowAvailable: 'Dify {{version}} je zdaj na voljo.',
|
||||||
|
latestAvailable: 'Dify {{version}} je najnovejša različica na voljo.',
|
||||||
|
},
|
||||||
|
appMenus: {
|
||||||
|
overview: 'Nadzor',
|
||||||
|
promptEng: 'Orkestriraj',
|
||||||
|
apiAccess: 'Dostop API',
|
||||||
|
logAndAnn: 'Dnevniki in objave',
|
||||||
|
logs: 'Dnevniki',
|
||||||
|
},
|
||||||
|
environment: {
|
||||||
|
testing: 'TESTIRANJE',
|
||||||
|
development: 'RAZVOJ',
|
||||||
|
},
|
||||||
|
appModes: {
|
||||||
|
completionApp: 'Generator besedila',
|
||||||
|
chatApp: 'Klepetalna aplikacija',
|
||||||
|
},
|
||||||
|
datasetMenus: {
|
||||||
|
documents: 'Dokumenti',
|
||||||
|
hitTesting: 'Preizkušanje pridobivanja',
|
||||||
|
settings: 'Nastavitve',
|
||||||
|
emptyTip: 'Znanost še ni povezana, pojdite v aplikacijo ali vtičnik, da dokončate povezavo.',
|
||||||
|
viewDoc: 'Ogled dokumentacije',
|
||||||
|
relatedApp: 'povezane aplikacije',
|
||||||
|
},
|
||||||
|
voiceInput: {
|
||||||
|
speaking: 'Govorite zdaj...',
|
||||||
|
converting: 'Pretvarjanje v besedilo...',
|
||||||
|
notAllow: 'mikrofon ni pooblaščen',
|
||||||
|
},
|
||||||
|
modelName: {
|
||||||
|
'gpt-3.5-turbo': 'GPT-3.5-Turbo',
|
||||||
|
'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
|
||||||
|
'gpt-4': 'GPT-4',
|
||||||
|
'gpt-4-32k': 'GPT-4-32K',
|
||||||
|
'text-davinci-003': 'Text-Davinci-003',
|
||||||
|
'text-embedding-ada-002': 'Text-Embedding-Ada-002',
|
||||||
|
'whisper-1': 'Whisper-1',
|
||||||
|
'claude-instant-1': 'Claude-Instant',
|
||||||
|
'claude-2': 'Claude-2',
|
||||||
|
},
|
||||||
|
chat: {
|
||||||
|
renameConversation: 'Preimenuj pogovor',
|
||||||
|
conversationName: 'Ime pogovora',
|
||||||
|
conversationNamePlaceholder: 'Vnesite ime pogovora',
|
||||||
|
conversationNameCanNotEmpty: 'Ime pogovora je obvezno',
|
||||||
|
citation: {
|
||||||
|
title: 'CITATI',
|
||||||
|
linkToDataset: 'Povezava do znanja',
|
||||||
|
characters: 'Znakov:',
|
||||||
|
hitCount: 'Število zadetkov:',
|
||||||
|
vectorHash: 'Vektorski hash:',
|
||||||
|
hitScore: 'Ocena zadetka:',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
promptEditor: {
|
||||||
|
placeholder: 'Tukaj napišite svoje pozivno besedilo, vnesite \'{\' za vstavljanje spremenljivke, vnesite \'/\' za vstavljanje vsebinskega bloka poziva',
|
||||||
|
context: {
|
||||||
|
item: {
|
||||||
|
title: 'Kontekst',
|
||||||
|
desc: 'Vstavi predlogo konteksta',
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
title: '{{num}} Znanost v kontekstu',
|
||||||
|
add: 'Dodaj kontekst ',
|
||||||
|
footer: 'Kontekste lahko upravljate v spodnjem razdelku Kontekst.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
history: {
|
||||||
|
item: {
|
||||||
|
title: 'Zgodovina pogovora',
|
||||||
|
desc: 'Vstavi predlogo zgodovinskega sporočila',
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
title: 'PRIMER',
|
||||||
|
user: 'Pozdravljeni',
|
||||||
|
assistant: 'Pozdravljeni! Kako vam lahko pomagam danes?',
|
||||||
|
edit: 'Uredi imena vlog pogovora',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
variable: {
|
||||||
|
item: {
|
||||||
|
title: 'Spremenljivke in zunanji orodja',
|
||||||
|
desc: 'Vstavi spremenljivke in zunanja orodja',
|
||||||
|
},
|
||||||
|
outputToolDisabledItem: {
|
||||||
|
title: 'Spremenljivke',
|
||||||
|
desc: 'Vstavi spremenljivke',
|
||||||
|
},
|
||||||
|
modal: {
|
||||||
|
add: 'Nova spremenljivka',
|
||||||
|
addTool: 'Novo orodje',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
query: {
|
||||||
|
item: {
|
||||||
|
title: 'Poizvedba',
|
||||||
|
desc: 'Vstavi predlogo uporabniške poizvedbe',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
existed: 'Že obstaja v pozivu',
|
||||||
|
},
|
||||||
|
imageUploader: {
|
||||||
|
uploadFromComputer: 'Naloži iz računalnika',
|
||||||
|
uploadFromComputerReadError: 'Branje slike ni uspelo, poskusite znova.',
|
||||||
|
uploadFromComputerUploadError: 'Nalaganje slike ni uspelo, poskusite znova.',
|
||||||
|
uploadFromComputerLimit: 'Nalaganje slik ne sme presegati {{size}} MB',
|
||||||
|
pasteImageLink: 'Prilepi povezavo do slike',
|
||||||
|
pasteImageLinkInputPlaceholder: 'Tukaj prilepite povezavo do slike',
|
||||||
|
pasteImageLinkInvalid: 'Neveljavna povezava slike',
|
||||||
|
imageUpload: 'Nalaganje slike',
|
||||||
|
},
|
||||||
|
tag: {
|
||||||
|
placeholder: 'Vse oznake',
|
||||||
|
addNew: 'Dodaj novo oznako',
|
||||||
|
noTag: 'Ni oznak',
|
||||||
|
noTagYet: 'Še ni oznak',
|
||||||
|
addTag: 'Dodaj oznake',
|
||||||
|
editTag: 'Uredi oznake',
|
||||||
|
manageTags: 'Upravljaj oznake',
|
||||||
|
selectorPlaceholder: 'Vnesite za iskanje ali ustvarjanje',
|
||||||
|
create: 'Ustvari',
|
||||||
|
delete: 'Izbriši oznako',
|
||||||
|
deleteTip: 'Oznaka se uporablja, jo želite izbrisati?',
|
||||||
|
created: 'Oznaka uspešno ustvarjena',
|
||||||
|
failed: 'Ustvarjanje oznake ni uspelo',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
export default translation
|
30
web/i18n/sl-SI/custom.ts
Normal file
30
web/i18n/sl-SI/custom.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
const translation = {
|
||||||
|
custom: 'Prilagoditev',
|
||||||
|
upgradeTip: {
|
||||||
|
prefix: 'Nadgradite svoj načrt za',
|
||||||
|
suffix: 'prilagoditev vaše blagovne znamke.',
|
||||||
|
},
|
||||||
|
webapp: {
|
||||||
|
title: 'Prilagodi blagovno znamko spletne aplikacije',
|
||||||
|
removeBrand: 'Odstrani Powered by Dify',
|
||||||
|
changeLogo: 'Spremeni sliko Powered by Brand',
|
||||||
|
changeLogoTip: 'Format SVG ali PNG z minimalno velikostjo 40x40px',
|
||||||
|
},
|
||||||
|
app: {
|
||||||
|
title: 'Prilagodi blagovno znamko glave aplikacije',
|
||||||
|
changeLogoTip: 'Format SVG ali PNG z minimalno velikostjo 80x80px',
|
||||||
|
},
|
||||||
|
upload: 'Naloži',
|
||||||
|
uploading: 'Nalagam',
|
||||||
|
uploadedFail: 'Nalaganje slike ni uspelo, prosimo, poskusite znova.',
|
||||||
|
change: 'Spremeni',
|
||||||
|
apply: 'Uporabi',
|
||||||
|
restore: 'Obnovi privzete nastavitve',
|
||||||
|
customize: {
|
||||||
|
contactUs: ' kontaktirajte nas ',
|
||||||
|
prefix: 'Za prilagoditev logotipa blagovne znamke znotraj aplikacije, prosimo,',
|
||||||
|
suffix: 'za nadgradnjo na Enterprise izdajo.',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
175
web/i18n/sl-SI/dataset-creation.ts
Normal file
175
web/i18n/sl-SI/dataset-creation.ts
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
const translation = {
|
||||||
|
steps: {
|
||||||
|
header: {
|
||||||
|
creation: 'Ustvari Znanje',
|
||||||
|
update: 'Dodaj podatke',
|
||||||
|
},
|
||||||
|
one: 'Izberi vir podatkov',
|
||||||
|
two: 'Predobdelava in čiščenje besedila',
|
||||||
|
three: 'Izvedi in zaključi',
|
||||||
|
},
|
||||||
|
error: {
|
||||||
|
unavailable: 'To Znanje ni na voljo',
|
||||||
|
},
|
||||||
|
firecrawl: {
|
||||||
|
configFirecrawl: 'Nastavi 🔥Firecrawl',
|
||||||
|
apiKeyPlaceholder: 'API ključ od firecrawl.dev',
|
||||||
|
getApiKeyLinkText: 'Pridobi API ključ na firecrawl.dev',
|
||||||
|
},
|
||||||
|
jinaReader: {
|
||||||
|
configJinaReader: 'Nastavi Jina Reader',
|
||||||
|
apiKeyPlaceholder: 'API ključ od jina.ai',
|
||||||
|
getApiKeyLinkText: 'Pridobi brezplačni API ključ na jina.ai',
|
||||||
|
},
|
||||||
|
stepOne: {
|
||||||
|
filePreview: 'Predogled datoteke',
|
||||||
|
pagePreview: 'Predogled strani',
|
||||||
|
dataSourceType: {
|
||||||
|
file: 'Uvozi iz datoteke',
|
||||||
|
notion: 'Sinhroniziraj z Notion',
|
||||||
|
web: 'Sinhroniziraj s spletno stranjo',
|
||||||
|
},
|
||||||
|
uploader: {
|
||||||
|
title: 'Naloži datoteko',
|
||||||
|
button: 'Povleci in spusti datoteko ali',
|
||||||
|
browse: 'Prebrskaj',
|
||||||
|
tip: 'Podprti tipi datotek: {{supportTypes}}. Največ {{size}}MB na datoteko.',
|
||||||
|
validation: {
|
||||||
|
typeError: 'Tip datoteke ni podprt',
|
||||||
|
size: 'Datoteka je prevelika. Največja dovoljena velikost je {{size}}MB',
|
||||||
|
count: 'Podprta je le ena datoteka',
|
||||||
|
filesNumber: 'Dosegli ste omejitev za pošiljanje {{filesNumber}} datotek.',
|
||||||
|
},
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
change: 'Zamenjaj',
|
||||||
|
failed: 'Nalaganje ni uspelo',
|
||||||
|
},
|
||||||
|
notionSyncTitle: 'Notion ni povezan',
|
||||||
|
notionSyncTip: 'Za sinhronizacijo z Notion je najprej potrebno vzpostaviti povezavo.',
|
||||||
|
connect: 'Pojdi na povezavo',
|
||||||
|
button: 'Naprej',
|
||||||
|
emptyDatasetCreation: 'Želim ustvariti prazno Znanje',
|
||||||
|
modal: {
|
||||||
|
title: 'Ustvari prazno Znanje',
|
||||||
|
tip: 'Prazno Znanje ne bo vsebovalo dokumentov, dokumente pa lahko naložite kadarkoli.',
|
||||||
|
input: 'Ime Znanja',
|
||||||
|
placeholder: 'Vnesite ime',
|
||||||
|
nameNotEmpty: 'Ime ne sme biti prazno',
|
||||||
|
nameLengthInvalid: 'Ime mora imeti od 1 do 40 znakov',
|
||||||
|
cancelButton: 'Prekliči',
|
||||||
|
confirmButton: 'Ustvari',
|
||||||
|
failed: 'Ustvarjanje ni uspelo',
|
||||||
|
},
|
||||||
|
website: {
|
||||||
|
chooseProvider: 'Izberi ponudnika',
|
||||||
|
fireCrawlNotConfigured: 'Firecrawl ni nastavljen',
|
||||||
|
fireCrawlNotConfiguredDescription: 'Nastavite Firecrawl z API ključem, da ga lahko uporabite.',
|
||||||
|
jinaReaderNotConfigured: 'Jina Reader ni nastavljen',
|
||||||
|
jinaReaderNotConfiguredDescription: 'Nastavite Jina Reader z vnosom brezplačnega API ključa.',
|
||||||
|
configure: 'Nastavi',
|
||||||
|
run: 'Zaženi',
|
||||||
|
firecrawlTitle: 'Izvleci spletno vsebino z 🔥Firecrawl',
|
||||||
|
firecrawlDoc: 'Firecrawl dokumentacija',
|
||||||
|
firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website',
|
||||||
|
jinaReaderTitle: 'Pretvori celotno stran v Markdown',
|
||||||
|
jinaReaderDoc: 'Več o Jina Reader',
|
||||||
|
jinaReaderDocLink: 'https://jina.ai/reader',
|
||||||
|
useSitemap: 'Uporabi sitemap',
|
||||||
|
useSitemapTooltip: 'Sledi zemljevidu spletne strani (sitemap) za iskanje strani. Če ne, bo Jina Reader iterativno iskal strani na podlagi pomembnosti, kar bo prineslo manj, a bolj relevantnih strani.',
|
||||||
|
options: 'Možnosti',
|
||||||
|
crawlSubPage: 'Išči podstrani',
|
||||||
|
limit: 'Omejitev',
|
||||||
|
maxDepth: 'Največja globina',
|
||||||
|
excludePaths: 'Izključi poti',
|
||||||
|
includeOnlyPaths: 'Vključi le poti',
|
||||||
|
extractOnlyMainContent: 'Izvleci le glavno vsebino (brez glav, navigacij, nog itd.)',
|
||||||
|
exceptionErrorTitle: 'Med izvajanjem iskanja je prišlo do izjeme:',
|
||||||
|
unknownError: 'Neznana napaka',
|
||||||
|
totalPageScraped: 'Skupaj preiskanih strani:',
|
||||||
|
selectAll: 'Izberi vse',
|
||||||
|
resetAll: 'Ponastavi vse',
|
||||||
|
scrapTimeInfo: 'Skupaj preiskanih {{total}} strani v {{time}}s',
|
||||||
|
preview: 'Predogled',
|
||||||
|
maxDepthTooltip: 'Največja globina iskanja glede na vneseni URL. Globina 0 bo iskala le stran z vnesenim URL-jem, globina 1 bo iskala URL in vse za tem, dodano z enim /, in tako naprej.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stepTwo: {
|
||||||
|
segmentation: 'Nastavitve razdeljevanja',
|
||||||
|
auto: 'Samodejno',
|
||||||
|
autoDescription: 'Samodejno nastavi pravila za razdeljevanje in predobdelavo besedila. Neizkušenim uporabnikom priporočamo to možnost.',
|
||||||
|
custom: 'Po meri',
|
||||||
|
customDescription: 'Prilagodi pravila za razdeljevanje, dolžino delcev in pravila za predobdelavo besedila itd.',
|
||||||
|
separator: 'Ločilo',
|
||||||
|
separatorTip: 'Ločilo je znak, ki se uporablja za ločevanje besedila. \\n\\n in \\n sta pogosto uporabljeni ločili za ločevanje odstavkov in vrstic. V kombinaciji z vejicami (\\n\\n,\\n) bodo odstavki razdeljeni po vrsticah, ko bo presežena največja dolžina delcev. Uporabite lahko tudi posebna ločila, ki jih sami določite (npr. ***).',
|
||||||
|
separatorPlaceholder: '\\n\\n za ločevanje odstavkov; \\n za ločevanje vrstic',
|
||||||
|
maxLength: 'Največja dolžina delca',
|
||||||
|
overlap: 'Prekrivanje delcev',
|
||||||
|
overlapTip: 'Nastavitev prekrivanja delcev lahko ohrani semantično povezavo med njimi, kar izboljša učinkovitost iskanja. Priporočamo nastavitev 10%-25% največje dolžine delca.',
|
||||||
|
overlapCheck: 'Prekrivanje delca ne sme biti večje od največje dolžine delca',
|
||||||
|
rules: 'Pravila predobdelave besedila',
|
||||||
|
removeExtraSpaces: 'Zamenjaj zaporedne presledke, vrstice in zavihke',
|
||||||
|
removeUrlEmails: 'Izbriši vse URL-je in e-poštne naslove',
|
||||||
|
removeStopwords: 'Odstrani neuporabne besede kot so "a", "an", "the"',
|
||||||
|
preview: 'Potrdi in predogled',
|
||||||
|
reset: 'Ponastavi',
|
||||||
|
indexMode: 'Način indeksiranja',
|
||||||
|
qualified: 'Visoka kakovost',
|
||||||
|
recommend: 'Priporočeno',
|
||||||
|
qualifiedTip: 'Za obdelavo se uporabi privzeti sistemski vmesnik za vdelavo, ki zagotavlja višjo natančnost pri poizvedbah uporabnikov.',
|
||||||
|
warning: 'Najprej nastavite API ključ za model ponudnika.',
|
||||||
|
click: 'Pojdi na nastavitve',
|
||||||
|
economical: 'Ekonomsko',
|
||||||
|
economicalTip: 'Uporablja lokalne vektorske pogone, ključne besede, itd., kar zmanjša natančnost brez porabe žetonov.',
|
||||||
|
QATitle: 'Razdeljevanje v obliki Vprašanje & Odgovor',
|
||||||
|
QATip: 'Omogočanje te možnosti bo porabilo več žetonov',
|
||||||
|
QALanguage: 'Razdelitev z uporabo',
|
||||||
|
estimateCost: 'Ocena stroškov',
|
||||||
|
estimateSegment: 'Ocenjeno število delcev',
|
||||||
|
segmentCount: 'delci',
|
||||||
|
calculating: 'Izračunavam...',
|
||||||
|
fileSource: 'Predobdelava dokumentov',
|
||||||
|
notionSource: 'Predobdelava strani',
|
||||||
|
websiteSource: 'Predobdelava spletne strani',
|
||||||
|
other: 'in drugi ',
|
||||||
|
fileUnit: ' dokumenti',
|
||||||
|
notionUnit: ' strani',
|
||||||
|
webpageUnit: ' strani',
|
||||||
|
previousStep: 'Prejšnji korak',
|
||||||
|
nextStep: 'Shrani in obdela',
|
||||||
|
save: 'Shrani in obdela',
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
sideTipTitle: 'Zakaj razdeljevanje in predobdelava?',
|
||||||
|
sideTipP1: 'Pri obdelavi besedilnih podatkov sta razdeljevanje in čiščenje dve pomembni fazi predobdelave.',
|
||||||
|
sideTipP2: 'Razdeljevanje dolga besedila na odstavke omogoča modelom boljše razumevanje. To izboljša kakovost in relevantnost rezultatov modela.',
|
||||||
|
sideTipP3: 'Čiščenje odstranjuje nepotrebne znake in formate, kar Znanje naredi bolj čisto in lažje obdeljivo.',
|
||||||
|
sideTipP4: 'Pravilno razdeljevanje in čiščenje izboljšata delovanje modela, kar zagotavlja bolj natančne in dragocene rezultate.',
|
||||||
|
previewTitle: 'Predogled',
|
||||||
|
previewTitleButton: 'Predogled',
|
||||||
|
previewButton: 'Preklop v obliko Vprašanje & Odgovor',
|
||||||
|
previewSwitchTipStart: 'Trenutni predogled delcev je v obliki besedila, preklop na predogled v obliki vprašanj in odgovorov bo',
|
||||||
|
previewSwitchTipEnd: ' porabil dodatne žetone',
|
||||||
|
characters: 'znaki',
|
||||||
|
indexSettingTip: 'Če želite spremeniti način indeksiranja in model vdelave, pojdite na ',
|
||||||
|
retrievalSettingTip: 'Če želite spremeniti nastavitve iskanja, pojdite na ',
|
||||||
|
datasetSettingLink: 'nastavitve Znanja.',
|
||||||
|
},
|
||||||
|
stepThree: {
|
||||||
|
creationTitle: '🎉 Znanje ustvarjeno',
|
||||||
|
creationContent: 'Samodejno smo poimenovali Znanje, ime lahko kadarkoli spremenite.',
|
||||||
|
label: 'Ime Znanja',
|
||||||
|
additionTitle: '🎉 Dokument naložen',
|
||||||
|
additionP1: 'Dokument je bil naložen v Znanje',
|
||||||
|
additionP2: ', lahko ga najdete v seznamu dokumentov Znanja.',
|
||||||
|
stop: 'Ustavi obdelavo',
|
||||||
|
resume: 'Nadaljuj obdelavo',
|
||||||
|
navTo: 'Pojdi na dokument',
|
||||||
|
sideTipTitle: 'Kaj sledi',
|
||||||
|
sideTipContent: 'Ko je dokument končan z indeksiranjem, lahko Znanje vključite v aplikacijo kot kontekst, nastavitve konteksta najdete na strani za orkestracijo ukazov. Prav tako ga lahko ustvarite kot samostojni vtičnik za indeksiranje ChatGPT in ga izdate.',
|
||||||
|
modelTitle: 'Ali ste prepričani, da želite ustaviti vdelavo?',
|
||||||
|
modelContent: 'Če boste morali nadaljevati obdelavo kasneje, se bo ta nadaljevala tam, kjer ste končali.',
|
||||||
|
modelButtonConfirm: 'Potrdi',
|
||||||
|
modelButtonCancel: 'Prekliči',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
352
web/i18n/sl-SI/dataset-documents.ts
Normal file
352
web/i18n/sl-SI/dataset-documents.ts
Normal file
|
@ -0,0 +1,352 @@
|
||||||
|
const translation = {
|
||||||
|
list: {
|
||||||
|
title: 'Dokumenti',
|
||||||
|
desc: 'Vse datoteke znanja so prikazane tukaj, celotno znanje pa je mogoče povezati s citati Dify ali indeksirati prek vtičnika Chat.',
|
||||||
|
addFile: 'Dodaj datoteko',
|
||||||
|
addPages: 'Dodaj strani',
|
||||||
|
addUrl: 'Dodaj URL',
|
||||||
|
table: {
|
||||||
|
header: {
|
||||||
|
fileName: 'IME DATOTEKE',
|
||||||
|
words: 'BESEDE',
|
||||||
|
hitCount: 'ŠTEVILO PRIDOBITEV',
|
||||||
|
uploadTime: 'ČAS NALAGANJA',
|
||||||
|
status: 'STATUS',
|
||||||
|
action: 'DEJANJE',
|
||||||
|
},
|
||||||
|
rename: 'Preimenuj',
|
||||||
|
name: 'Ime',
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
uploadFile: 'Naloži novo datoteko',
|
||||||
|
settings: 'Nastavitve segmenta',
|
||||||
|
addButton: 'Dodaj del',
|
||||||
|
add: 'Dodaj del',
|
||||||
|
batchAdd: 'Serijsko dodajanje',
|
||||||
|
archive: 'Arhiviraj',
|
||||||
|
unarchive: 'Razveljavi arhiviranje',
|
||||||
|
delete: 'Izbriši',
|
||||||
|
enableWarning: 'Arhivirane datoteke ni mogoče omogočiti',
|
||||||
|
sync: 'Sinhroniziraj',
|
||||||
|
},
|
||||||
|
index: {
|
||||||
|
enable: 'Omogoči',
|
||||||
|
disable: 'Onemogoči',
|
||||||
|
all: 'Vse',
|
||||||
|
enableTip: 'Datoteka je lahko indeksirana',
|
||||||
|
disableTip: 'Datoteka ne more biti indeksirana',
|
||||||
|
},
|
||||||
|
status: {
|
||||||
|
queuing: 'V čakalni vrsti',
|
||||||
|
indexing: 'Indeksiranje',
|
||||||
|
paused: 'Zaustavljeno',
|
||||||
|
error: 'Napaka',
|
||||||
|
available: 'Na voljo',
|
||||||
|
enabled: 'Omogočeno',
|
||||||
|
disabled: 'Onemogočeno',
|
||||||
|
archived: 'Arhivirano',
|
||||||
|
},
|
||||||
|
empty: {
|
||||||
|
title: 'Dokumentacije še ni',
|
||||||
|
upload: {
|
||||||
|
tip: 'Lahko naložite datoteke, sinhronizirate z spletno stranjo ali aplikacijami, kot so Notion, GitHub itd.',
|
||||||
|
},
|
||||||
|
sync: {
|
||||||
|
tip: 'Dify bo občasno prenesel datoteke iz Notion in dokončal obdelavo.',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
delete: {
|
||||||
|
title: 'Ali ste prepričani, da želite izbrisati?',
|
||||||
|
content: 'Če boste nadaljevali obdelavo kasneje, boste nadaljevali tam, kjer ste končali.',
|
||||||
|
},
|
||||||
|
batchModal: {
|
||||||
|
title: 'Serijsko dodajanje delov',
|
||||||
|
csvUploadTitle: 'Povlecite in spustite svojo CSV datoteko tukaj ali ',
|
||||||
|
browse: 'brskajte',
|
||||||
|
tip: 'CSV datoteka mora ustrezati naslednji strukturi:',
|
||||||
|
question: 'vprašanje',
|
||||||
|
answer: 'odgovor',
|
||||||
|
contentTitle: 'vsebina dela',
|
||||||
|
content: 'vsebina',
|
||||||
|
template: 'Prenesite predlogo tukaj',
|
||||||
|
cancel: 'Prekliči',
|
||||||
|
run: 'Zaženi serijo',
|
||||||
|
runError: 'Serijsko dodajanje ni uspelo',
|
||||||
|
processing: 'V obdelavi serije',
|
||||||
|
completed: 'Uvoz zaključen',
|
||||||
|
error: 'Napaka pri uvozu',
|
||||||
|
ok: 'V redu',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metadata: {
|
||||||
|
title: 'Metapodatki',
|
||||||
|
desc: 'Označevanje metapodatkov za dokumente omogoča, da AI pravočasno dostopa do njih in prikaže vir referenc uporabnikom.',
|
||||||
|
dateTimeFormat: 'MMMM D, YYYY hh:mm A',
|
||||||
|
docTypeSelectTitle: 'Izberite vrsto dokumenta',
|
||||||
|
docTypeChangeTitle: 'Spremeni vrsto dokumenta',
|
||||||
|
docTypeSelectWarning:
|
||||||
|
'Če se vrsta dokumenta spremeni, trenutni vneseni metapodatki ne bodo ohranjeni',
|
||||||
|
firstMetaAction: 'Začni',
|
||||||
|
placeholder: {
|
||||||
|
add: 'Dodaj ',
|
||||||
|
select: 'Izberi ',
|
||||||
|
},
|
||||||
|
source: {
|
||||||
|
upload_file: 'Naloži datoteko',
|
||||||
|
notion: 'Sinhroniziraj iz Notion',
|
||||||
|
github: 'Sinhroniziraj iz Github',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
book: 'Knjiga',
|
||||||
|
webPage: 'Spletna stran',
|
||||||
|
paper: 'Znanstveni članek',
|
||||||
|
socialMediaPost: 'Objava na družbenih omrežjih',
|
||||||
|
personalDocument: 'Osebni dokument',
|
||||||
|
businessDocument: 'Poslovni dokument',
|
||||||
|
IMChat: 'Klepet',
|
||||||
|
wikipediaEntry: 'Vnos iz Wikipedije',
|
||||||
|
notion: 'Sinhroniziraj iz Notion',
|
||||||
|
github: 'Sinhroniziraj iz Github',
|
||||||
|
technicalParameters: 'Tehnični parametri',
|
||||||
|
},
|
||||||
|
field: {
|
||||||
|
processRule: {
|
||||||
|
processDoc: 'Obdelaj dokument',
|
||||||
|
segmentRule: 'Pravilo segmenta',
|
||||||
|
segmentLength: 'Dolžina segmentov',
|
||||||
|
processClean: 'Čiščenje besedila',
|
||||||
|
},
|
||||||
|
book: {
|
||||||
|
title: 'Naslov',
|
||||||
|
language: 'Jezik',
|
||||||
|
author: 'Avtor',
|
||||||
|
publisher: 'Založnik',
|
||||||
|
publicationDate: 'Datum objave',
|
||||||
|
ISBN: 'ISBN',
|
||||||
|
category: 'Kategorija',
|
||||||
|
},
|
||||||
|
webPage: {
|
||||||
|
title: 'Naslov',
|
||||||
|
url: 'URL',
|
||||||
|
language: 'Jezik',
|
||||||
|
authorPublisher: 'Avtor/Založnik',
|
||||||
|
publishDate: 'Datum objave',
|
||||||
|
topicsKeywords: 'Teme/Ključne besede',
|
||||||
|
description: 'Opis',
|
||||||
|
},
|
||||||
|
paper: {
|
||||||
|
title: 'Naslov',
|
||||||
|
language: 'Jezik',
|
||||||
|
author: 'Avtor',
|
||||||
|
publishDate: 'Datum objave',
|
||||||
|
journalConferenceName: 'Ime revije/konference',
|
||||||
|
volumeIssuePage: 'Letnik/Številka/Stran',
|
||||||
|
DOI: 'DOI',
|
||||||
|
topicsKeywords: 'Teme/Ključne besede',
|
||||||
|
abstract: 'Povzetek',
|
||||||
|
},
|
||||||
|
socialMediaPost: {
|
||||||
|
platform: 'Platforma',
|
||||||
|
authorUsername: 'Avtor/Uporabniško ime',
|
||||||
|
publishDate: 'Datum objave',
|
||||||
|
postURL: 'URL objave',
|
||||||
|
topicsTags: 'Teme/Oznake',
|
||||||
|
},
|
||||||
|
personalDocument: {
|
||||||
|
title: 'Naslov',
|
||||||
|
author: 'Avtor',
|
||||||
|
creationDate: 'Datum nastanka',
|
||||||
|
lastModifiedDate: 'Datum zadnje spremembe',
|
||||||
|
documentType: 'Vrsta dokumenta',
|
||||||
|
tagsCategory: 'Oznake/Kategorija',
|
||||||
|
},
|
||||||
|
businessDocument: {
|
||||||
|
title: 'Naslov',
|
||||||
|
author: 'Avtor',
|
||||||
|
creationDate: 'Datum nastanka',
|
||||||
|
lastModifiedDate: 'Datum zadnje spremembe',
|
||||||
|
documentType: 'Vrsta dokumenta',
|
||||||
|
departmentTeam: 'Oddelek/Ekipa',
|
||||||
|
},
|
||||||
|
IMChat: {
|
||||||
|
chatPlatform: 'Platforma za klepet',
|
||||||
|
chatPartiesGroupName: 'Udeleženci klepeta/Skupina',
|
||||||
|
participants: 'Udeleženci',
|
||||||
|
startDate: 'Datum začetka',
|
||||||
|
endDate: 'Datum konca',
|
||||||
|
topicsKeywords: 'Teme/Ključne besede',
|
||||||
|
fileType: 'Vrsta datoteke',
|
||||||
|
},
|
||||||
|
wikipediaEntry: {
|
||||||
|
title: 'Naslov',
|
||||||
|
language: 'Jezik',
|
||||||
|
webpageURL: 'URL spletne strani',
|
||||||
|
editorContributor: 'Urednik/Sodelavec',
|
||||||
|
lastEditDate: 'Datum zadnje spremembe',
|
||||||
|
summaryIntroduction: 'Povzetek/Uvod',
|
||||||
|
},
|
||||||
|
notion: {
|
||||||
|
title: 'Naslov',
|
||||||
|
language: 'Jezik',
|
||||||
|
author: 'Avtor',
|
||||||
|
createdTime: 'Čas nastanka',
|
||||||
|
lastModifiedTime: 'Čas zadnje spremembe',
|
||||||
|
url: 'URL',
|
||||||
|
tag: 'Oznaka',
|
||||||
|
description: 'Opis',
|
||||||
|
},
|
||||||
|
github: {
|
||||||
|
repoName: 'Ime repozitorija',
|
||||||
|
repoDesc: 'Opis repozitorija',
|
||||||
|
repoOwner: 'Lastnik repozitorija',
|
||||||
|
fileName: 'Ime datoteke',
|
||||||
|
filePath: 'Pot do datoteke',
|
||||||
|
programmingLang: 'Programski jezik',
|
||||||
|
url: 'URL',
|
||||||
|
license: 'Licenca',
|
||||||
|
lastCommitTime: 'Čas zadnje spremembe',
|
||||||
|
lastCommitAuthor: 'Avtor zadnje spremembe',
|
||||||
|
},
|
||||||
|
originInfo: {
|
||||||
|
originalFilename: 'Izvirno ime datoteke',
|
||||||
|
originalFileSize: 'Izvirna velikost datoteke',
|
||||||
|
uploadDate: 'Datum nalaganja',
|
||||||
|
lastUpdateDate: 'Datum zadnje spremembe',
|
||||||
|
source: 'Vir',
|
||||||
|
},
|
||||||
|
technicalParameters: {
|
||||||
|
segmentSpecification: 'Specifikacija segmentov',
|
||||||
|
segmentLength: 'Dolžina segmentov',
|
||||||
|
avgParagraphLength: 'Povprečna dolžina odstavka',
|
||||||
|
paragraphs: 'Odstavki',
|
||||||
|
hitCount: 'Število pridobitev',
|
||||||
|
embeddingTime: 'Čas vdelave',
|
||||||
|
embeddedSpend: 'Stroški vdelave',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
languageMap: {
|
||||||
|
zh: 'Kitajščina',
|
||||||
|
en: 'Angleščina',
|
||||||
|
es: 'Španščina',
|
||||||
|
fr: 'Francoščina',
|
||||||
|
de: 'Nemščina',
|
||||||
|
ja: 'Japonščina',
|
||||||
|
ko: 'Korejščina',
|
||||||
|
ru: 'Ruščina',
|
||||||
|
ar: 'Arabščina',
|
||||||
|
pt: 'Portugalščina',
|
||||||
|
it: 'Italijanščina',
|
||||||
|
nl: 'Nizozemščina',
|
||||||
|
pl: 'Poljščina',
|
||||||
|
sv: 'Švedščina',
|
||||||
|
tr: 'Turščina',
|
||||||
|
he: 'Hebrejščina',
|
||||||
|
hi: 'Hindujščina',
|
||||||
|
da: 'Danščina',
|
||||||
|
fi: 'Finščina',
|
||||||
|
no: 'Norveščina',
|
||||||
|
hu: 'Madžarščina',
|
||||||
|
el: 'Grščina',
|
||||||
|
cs: 'Češčina',
|
||||||
|
th: 'Tajščina',
|
||||||
|
id: 'Indonezijščina',
|
||||||
|
},
|
||||||
|
categoryMap: {
|
||||||
|
book: {
|
||||||
|
fiction: 'Leposlovje',
|
||||||
|
biography: 'Biografija',
|
||||||
|
history: 'Zgodovina',
|
||||||
|
science: 'Znanost',
|
||||||
|
technology: 'Tehnologija',
|
||||||
|
education: 'Izobraževanje',
|
||||||
|
philosophy: 'Filozofija',
|
||||||
|
religion: 'Religija',
|
||||||
|
socialSciences: 'Družboslovje',
|
||||||
|
art: 'Umetnost',
|
||||||
|
travel: 'Potovanja',
|
||||||
|
health: 'Zdravje',
|
||||||
|
selfHelp: 'Samopomoč',
|
||||||
|
businessEconomics: 'Poslovanje in ekonomija',
|
||||||
|
cooking: 'Kuhanje',
|
||||||
|
childrenYoungAdults: 'Otroci in mladi odrasli',
|
||||||
|
comicsGraphicNovels: 'Stripi in grafični romani',
|
||||||
|
poetry: 'Poezija',
|
||||||
|
drama: 'Drama',
|
||||||
|
other: 'Drugo',
|
||||||
|
},
|
||||||
|
personalDoc: {
|
||||||
|
notes: 'Zapiski',
|
||||||
|
blogDraft: 'Osnutek bloga',
|
||||||
|
diary: 'Dnevnik',
|
||||||
|
researchReport: 'Raziskovalno poročilo',
|
||||||
|
bookExcerpt: 'Odlomek iz knjige',
|
||||||
|
schedule: 'Urnik',
|
||||||
|
list: 'Seznam',
|
||||||
|
projectOverview: 'Pregled projekta',
|
||||||
|
photoCollection: 'Fotografska zbirka',
|
||||||
|
creativeWriting: 'Ustvarjalno pisanje',
|
||||||
|
codeSnippet: 'Koda',
|
||||||
|
designDraft: 'Oblikovalski osnutek',
|
||||||
|
personalResume: 'Osebni življenjepis',
|
||||||
|
other: 'Drugo',
|
||||||
|
},
|
||||||
|
businessDoc: {
|
||||||
|
meetingMinutes: 'Zapisniki sestankov',
|
||||||
|
researchReport: 'Raziskovalno poročilo',
|
||||||
|
proposal: 'Predlog',
|
||||||
|
employeeHandbook: 'Priročnik za zaposlene',
|
||||||
|
trainingMaterials: 'Izobraževalni materiali',
|
||||||
|
requirementsDocument: 'Dokumentacija zahtev',
|
||||||
|
designDocument: 'Oblikovalska dokumentacija',
|
||||||
|
productSpecification: 'Specifikacija izdelka',
|
||||||
|
financialReport: 'Finančno poročilo',
|
||||||
|
marketAnalysis: 'Tržna analiza',
|
||||||
|
projectPlan: 'Načrt projekta',
|
||||||
|
teamStructure: 'Struktura ekipe',
|
||||||
|
policiesProcedures: 'Pravila in postopki',
|
||||||
|
contractsAgreements: 'Pogodbe in dogovori',
|
||||||
|
emailCorrespondence: 'E-poštna korespondenca',
|
||||||
|
other: 'Drugo',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
embedding: {
|
||||||
|
processing: 'Proces vdelave...',
|
||||||
|
paused: 'Vdelava zaustavljena',
|
||||||
|
completed: 'Vdelava zaključena',
|
||||||
|
error: 'Napaka pri vdelavi',
|
||||||
|
docName: 'Predobdelava dokumenta',
|
||||||
|
mode: 'Pravilo segmentacije',
|
||||||
|
segmentLength: 'Dolžina segmentov',
|
||||||
|
textCleaning: 'Predobdelava in čiščenje besedila',
|
||||||
|
segments: 'Odstavki',
|
||||||
|
highQuality: 'Način visoke kakovosti',
|
||||||
|
economy: 'Ekonomski način',
|
||||||
|
estimate: 'Ocenjena poraba',
|
||||||
|
stop: 'Ustavi obdelavo',
|
||||||
|
resume: 'Nadaljuj obdelavo',
|
||||||
|
automatic: 'Samodejno',
|
||||||
|
custom: 'Po meri',
|
||||||
|
previewTip: 'Predogled odstavkov bo na voljo po zaključku vdelave',
|
||||||
|
},
|
||||||
|
segment: {
|
||||||
|
paragraphs: 'Odstavki',
|
||||||
|
keywords: 'Ključne besede',
|
||||||
|
addKeyWord: 'Dodaj ključno besedo',
|
||||||
|
keywordError: 'Največja dolžina ključne besede je 20',
|
||||||
|
characters: 'znakov',
|
||||||
|
hitCount: 'Število pridobitev',
|
||||||
|
vectorHash: 'Vektorski hash: ',
|
||||||
|
questionPlaceholder: 'dodajte vprašanje tukaj',
|
||||||
|
questionEmpty: 'Vprašanje ne sme biti prazno',
|
||||||
|
answerPlaceholder: 'dodajte odgovor tukaj',
|
||||||
|
answerEmpty: 'Odgovor ne sme biti prazen',
|
||||||
|
contentPlaceholder: 'dodajte vsebino tukaj',
|
||||||
|
contentEmpty: 'Vsebina ne sme biti prazna',
|
||||||
|
newTextSegment: 'Nov besedilni segment',
|
||||||
|
newQaSegment: 'Nov Q&A segment',
|
||||||
|
delete: 'Izbriši ta del?',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
30
web/i18n/sl-SI/dataset-hit-testing.ts
Normal file
30
web/i18n/sl-SI/dataset-hit-testing.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
const translation = {
|
||||||
|
title: 'Testiranje pridobivanja',
|
||||||
|
settingTitle: 'Nastavitve pridobivanja',
|
||||||
|
desc: 'Preizkusite učinkovitost zadetkov znanja na podlagi podanega poizvedbenega besedila',
|
||||||
|
dateTimeFormat: 'DD/MM/YYYY hh:mm A',
|
||||||
|
recents: 'Nedavno',
|
||||||
|
table: {
|
||||||
|
header: {
|
||||||
|
source: 'Vir',
|
||||||
|
text: 'Besedilo',
|
||||||
|
time: 'Čas',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
input: {
|
||||||
|
title: 'Izvorno besedilo',
|
||||||
|
placeholder: 'Prosimo, vnesite besedilo, priporočljivo je kratko izjavno poved.',
|
||||||
|
countWarning: 'Do 200 znakov.',
|
||||||
|
indexWarning: 'Samo znanje visoke kakovosti.',
|
||||||
|
testing: 'Testiranje',
|
||||||
|
},
|
||||||
|
hit: {
|
||||||
|
title: 'PRIDOBLJENI ODSTAVKI',
|
||||||
|
emptyTip: 'Rezultati testiranja pridobivanja bodo prikazani tukaj',
|
||||||
|
},
|
||||||
|
noRecentTip: 'Tukaj ni nedavnih rezultatov poizvedb',
|
||||||
|
viewChart: 'Prikaži VEKTORSKI GRAF',
|
||||||
|
viewDetail: 'Prikaži podrobnosti',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
38
web/i18n/sl-SI/dataset-settings.ts
Normal file
38
web/i18n/sl-SI/dataset-settings.ts
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
const translation = {
|
||||||
|
title: 'Nastavitve znanja',
|
||||||
|
desc: 'Tukaj lahko spremenite lastnosti in nastavitve pridobivanja tega znanja.',
|
||||||
|
form: {
|
||||||
|
name: 'Ime znanja',
|
||||||
|
namePlaceholder: 'Prosimo, vnesite ime znanja',
|
||||||
|
nameError: 'Ime ne sme biti prazno',
|
||||||
|
desc: 'Opis znanja',
|
||||||
|
descInfo: 'Prosimo, napišite jasen besedilni opis, ki bo povzel vsebino znanja. Ta opis bo uporabljen kot osnova za ujemanje pri izbiri med več znanji za sklepanje.',
|
||||||
|
descPlaceholder: 'Opišite, kaj je v tem znanju (neobvezno)',
|
||||||
|
descWrite: 'Naučite se, kako napisati dober opis znanja.',
|
||||||
|
permissions: 'Dovoljenja',
|
||||||
|
permissionsOnlyMe: 'Samo jaz',
|
||||||
|
permissionsAllMember: 'Vsi člani ekipe',
|
||||||
|
permissionsInvitedMembers: 'Določeni člani ekipe',
|
||||||
|
me: '(Vi)',
|
||||||
|
indexMethod: 'Metoda indeksiranja',
|
||||||
|
indexMethodHighQuality: 'Visoka kakovost',
|
||||||
|
indexMethodHighQualityTip: 'Za obdelavo pokličite vdelani model za zagotovitev večje natančnosti pri poizvedbah uporabnikov.',
|
||||||
|
indexMethodEconomy: 'Varčna',
|
||||||
|
indexMethodEconomyTip: 'Uporabite offline vektorske motorje, indeksiranje ključnih besed itd., da zmanjšate natančnost brez porabe žetonov',
|
||||||
|
embeddingModel: 'Vdelani model',
|
||||||
|
embeddingModelTip: 'Če želite spremeniti vdelani model, pojdite na ',
|
||||||
|
embeddingModelTipLink: 'Nastavitve',
|
||||||
|
retrievalSetting: {
|
||||||
|
title: 'Nastavitve pridobivanja',
|
||||||
|
learnMore: 'Izvedite več',
|
||||||
|
description: ' o metodi pridobivanja.',
|
||||||
|
longDescription: ' o metodi pridobivanja, to lahko kadar koli spremenite v nastavitvah znanja.',
|
||||||
|
},
|
||||||
|
externalKnowledgeAPI: 'Zunanji API za znanje',
|
||||||
|
externalKnowledgeID: 'ID zunanjega znanja',
|
||||||
|
retrievalSettings: 'Nastavitve pridobivanja',
|
||||||
|
save: 'Shrani',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default translation
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user