mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-20 02:59:06 +08:00
Merge branch 'main' into feat/attachments
This commit is contained in:
commit
a05d16375e
@ -37,6 +37,7 @@
|
||||
<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>
|
||||
</p>
|
||||
|
||||
|
||||
|
@ -37,6 +37,7 @@
|
||||
<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>
|
||||
</p>
|
||||
|
||||
<div style="text-align: right;">
|
||||
|
@ -36,6 +36,7 @@
|
||||
<a href="./README_KL.md"><img alt="上个月的提交次数" src="https://img.shields.io/badge/法语-d9d9d9"></a>
|
||||
<a href="./README_FR.md"><img alt="上个月的提交次数" src="https://img.shields.io/badge/克林贡语-d9d9d9"></a>
|
||||
<a href="./README_KR.md"><img alt="上个月的提交次数" 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>
|
||||
</div>
|
||||
|
||||
|
||||
|
@ -36,6 +36,7 @@
|
||||
<a href="./README_KL.md"><img alt="Actividad de Commits el último mes" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||
<a href="./README_FR.md"><img alt="Actividad de Commits el último mes" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||
<a href="./README_KR.md"><img alt="Actividad de Commits el último mes" 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>
|
||||
</p>
|
||||
|
||||
#
|
||||
|
@ -36,6 +36,7 @@
|
||||
<a href="./README_KL.md"><img alt="Commits le mois dernier" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||
<a href="./README_FR.md"><img alt="Commits le mois dernier" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||
<a href="./README_KR.md"><img alt="Commits le mois dernier" 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>
|
||||
</p>
|
||||
|
||||
#
|
||||
|
@ -36,6 +36,7 @@
|
||||
<a href="./README_KL.md"><img alt="先月のコミット" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||
<a href="./README_FR.md"><img alt="先月のコミット" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||
<a href="./README_KR.md"><img alt="先月のコミット" 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>
|
||||
</p>
|
||||
|
||||
#
|
||||
|
@ -36,6 +36,7 @@
|
||||
<a href="./README_KL.md"><img alt="Commits last month" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||
<a href="./README_FR.md"><img alt="Commits last month" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||
<a href="./README_KR.md"><img alt="Commits last month" 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>
|
||||
</p>
|
||||
|
||||
#
|
||||
|
@ -36,6 +36,7 @@
|
||||
<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" 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>
|
||||
|
||||
</p>
|
||||
|
||||
|
253
README_TR.md
Normal file
253
README_TR.md
Normal file
@ -0,0 +1,253 @@
|
||||

|
||||
|
||||
<p align="center">
|
||||
<a href="https://cloud.dify.ai">Dify Bulut</a> ·
|
||||
<a href="https://docs.dify.ai/getting-started/install-self-hosted">Kendi Sunucunuzda Barındırma</a> ·
|
||||
<a href="https://docs.dify.ai">Dokümantasyon</a> ·
|
||||
<a href="https://cal.com/guchenhe/60-min-meeting">Kurumsal Sorgu</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://dify.ai" target="_blank">
|
||||
<img alt="Statik Rozet" src="https://img.shields.io/badge/Ürün-F04438"></a>
|
||||
<a href="https://dify.ai/pricing" target="_blank">
|
||||
<img alt="Statik Rozet" src="https://img.shields.io/badge/ücretsiz-fiyatlandırma?logo=free&color=%20%23155EEF&label=fiyatlandirma&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="Discord'da sohbet et"></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="Twitter'da takip et"></a>
|
||||
<a href="https://hub.docker.com/u/langgenius" target="_blank">
|
||||
<img alt="Docker Çekmeleri" 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="Geçen ay yapılan commitler" 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="Kapatılan sorunlar" src="https://img.shields.io/github/issues-search?query=repo%3Alanggenius%2Fdify%20is%3Aclosed&label=kapatilan%20sorunlar&labelColor=%20%237d89b0&color=%20%235d6b98"></a>
|
||||
<a href="https://github.com/langgenius/dify/discussions/" target="_blank">
|
||||
<img alt="Tartışma gönderileri" 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>
|
||||
</p>
|
||||
|
||||
|
||||
Dify, açık kaynaklı bir LLM uygulama geliştirme platformudur. Sezgisel arayüzü, AI iş akışı, RAG pipeline'ı, ajan yetenekleri, model yönetimi, gözlemlenebilirlik özellikleri ve daha fazlasını birleştirerek, prototipten üretime hızlıca geçmenizi sağlar. İşte temel özelliklerin bir listesi:
|
||||
</br> </br>
|
||||
|
||||
**1. Workflow**:
|
||||
Görsel bir arayüz üzerinde güçlü AI iş akışları oluşturun ve test edin, aşağıdaki tüm özellikleri ve daha fazlasını kullanarak.
|
||||
|
||||
|
||||
https://github.com/langgenius/dify/assets/13230914/356df23e-1604-483d-80a6-9517ece318aa
|
||||
|
||||
|
||||
|
||||
**2. Kapsamlı model desteği**:
|
||||
Çok sayıda çıkarım sağlayıcısı ve kendi kendine barındırılan çözümlerden yüzlerce özel / açık kaynaklı LLM ile sorunsuz entegrasyon sağlar. GPT, Mistral, Llama3 ve OpenAI API uyumlu tüm modelleri kapsar. Desteklenen model sağlayıcılarının tam listesine [buradan](https://docs.dify.ai/getting-started/readme/model-providers) ulaşabilirsiniz.
|
||||
|
||||

|
||||
|
||||
|
||||
Özür dilerim, haklısınız. Daha anlamlı ve akıcı bir çeviri yapmaya çalışayım. İşte güncellenmiş çeviri:
|
||||
|
||||
**3. Prompt IDE**:
|
||||
Komut istemlerini oluşturmak, model performansını karşılaştırmak ve sohbet tabanlı uygulamalara metin-konuşma gibi ek özellikler eklemek için kullanıcı dostu bir arayüz.
|
||||
|
||||
**4. RAG Pipeline**:
|
||||
Belge alımından bilgi çekmeye kadar geniş kapsamlı RAG yetenekleri. PDF'ler, PPT'ler ve diğer yaygın belge formatlarından metin çıkarma için hazır destek sunar.
|
||||
|
||||
**5. Ajan yetenekleri**:
|
||||
LLM Fonksiyon Çağırma veya ReAct'a dayalı ajanlar tanımlayabilir ve bu ajanlara önceden hazırlanmış veya özel araçlar ekleyebilirsiniz. Dify, AI ajanları için Google Arama, DALL·E, Stable Diffusion ve WolframAlpha gibi 50'den fazla yerleşik araç sağlar.
|
||||
|
||||
**6. LLMOps**:
|
||||
Uygulama loglarını ve performans metriklerini zaman içinde izleme ve analiz etme imkanı. Üretim ortamından elde edilen verilere ve kullanıcı geri bildirimlerine dayanarak, prompt'ları, veri setlerini ve modelleri sürekli olarak optimize edebilirsiniz. Bu sayede, AI uygulamanızın performansını ve doğruluğunu sürekli olarak artırabilirsiniz.
|
||||
|
||||
**7. Hizmet Olarak Backend**:
|
||||
Dify'ın tüm özellikleri ilgili API'lerle birlikte gelir, böylece Dify'ı kendi iş mantığınıza kolayca entegre edebilirsiniz.
|
||||
|
||||
|
||||
## Özellik karşılaştırması
|
||||
<table style="width: 100%;">
|
||||
<tr>
|
||||
<th align="center">Özellik</th>
|
||||
<th align="center">Dify.AI</th>
|
||||
<th align="center">LangChain</th>
|
||||
<th align="center">Flowise</th>
|
||||
<th align="center">OpenAI Assistants API</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Programlama Yaklaşımı</td>
|
||||
<td align="center">API + Uygulama odaklı</td>
|
||||
<td align="center">Python Kodu</td>
|
||||
<td align="center">Uygulama odaklı</td>
|
||||
<td align="center">API odaklı</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Desteklenen LLM'ler</td>
|
||||
<td align="center">Zengin Çeşitlilik</td>
|
||||
<td align="center">Zengin Çeşitlilik</td>
|
||||
<td align="center">Zengin Çeşitlilik</td>
|
||||
<td align="center">Yalnızca OpenAI</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">RAG Motoru</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Ajan</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
<td align="center">✅</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">İş Akışı</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Gözlemlenebilirlik</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
<td align="center">❌</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Kurumsal Özellikler (SSO/Erişim kontrolü)</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
<td align="center">❌</td>
|
||||
<td align="center">❌</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center">Yerel Dağıtım</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">✅</td>
|
||||
<td align="center">❌</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Dify'ı Kullanma
|
||||
|
||||
- **Cloud </br>**
|
||||
İşte verdiğiniz metnin Türkçe çevirisi, kod bloğu içinde:
|
||||
-
|
||||
Herkesin sıfır kurulumla denemesi için bir [Dify Cloud](https://dify.ai) hizmeti sunuyoruz. Bu hizmet, kendi kendine dağıtılan versiyonun tüm yeteneklerini sağlar ve sandbox planında 200 ücretsiz GPT-4 çağrısı içerir.
|
||||
|
||||
- **Dify Topluluk Sürümünü Kendi Sunucunuzda Barındırma</br>**
|
||||
Bu [başlangıç kılavuzu](#quick-start) ile Dify'ı kendi ortamınızda hızlıca çalıştırın.
|
||||
Daha fazla referans ve detaylı talimatlar için [dokümantasyonumuzu](https://docs.dify.ai) kullanın.
|
||||
|
||||
- **Kurumlar / organizasyonlar için Dify</br>**
|
||||
Ek kurumsal odaklı özellikler sunuyoruz. Kurumsal ihtiyaçları görüşmek için [bizimle bir toplantı planlayın](https://cal.com/guchenhe/30min) veya [bize bir e-posta gönderin](mailto:business@dify.ai?subject=[GitHub]Business%20License%20Inquiry). </br>
|
||||
> AWS kullanan startuplar ve küçük işletmeler için, [AWS Marketplace'deki Dify Premium'a](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) göz atın ve tek tıklamayla kendi AWS VPC'nize dağıtın. Bu, özel logo ve marka ile uygulamalar oluşturma seçeneğine sahip uygun fiyatlı bir AMI teklifdir.
|
||||
|
||||
## Güncel Kalma
|
||||
|
||||
GitHub'da Dify'a yıldız verin ve yeni sürümlerden anında haberdar olun.
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## Hızlı başlangıç
|
||||
> Dify'ı kurmadan önce, makinenizin aşağıdaki minimum sistem gereksinimlerini karşıladığından emin olun:
|
||||
>
|
||||
>- CPU >= 2 Çekirdek
|
||||
>- RAM >= 4GB
|
||||
|
||||
</br>
|
||||
İşte verdiğiniz metnin Türkçe çevirisi, kod bloğu içinde:
|
||||
|
||||
Dify sunucusunu başlatmanın en kolay yolu, [docker-compose.yml](docker/docker-compose.yaml) dosyamızı çalıştırmaktır. Kurulum komutunu çalıştırmadan önce, makinenizde [Docker](https://docs.docker.com/get-docker/) ve [Docker Compose](https://docs.docker.com/compose/install/)'un kurulu olduğundan emin olun:
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
cp .env.example .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Çalıştırdıktan sonra, tarayıcınızda [http://localhost/install](http://localhost/install) adresinden Dify kontrol paneline erişebilir ve başlangıç ayarları sürecini başlatabilirsiniz.
|
||||
|
||||
> Eğer Dify'a katkıda bulunmak veya ek geliştirmeler yapmak isterseniz, [kaynak koddan dağıtım kılavuzumuza](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code) başvurun.
|
||||
|
||||
## Sonraki adımlar
|
||||
|
||||
Yapılandırmayı özelleştirmeniz gerekiyorsa, lütfen [.env.example](docker/.env.example) dosyamızdaki yorumlara bakın ve `.env` dosyanızdaki ilgili değerleri güncelleyin. Ayrıca, spesifik dağıtım ortamınıza ve gereksinimlerinize bağlı olarak `docker-compose.yaml` dosyasının kendisinde de, imaj sürümlerini, port eşlemelerini veya hacim bağlantılarını değiştirmek gibi ayarlamalar yapmanız gerekebilir. Herhangi bir değişiklik yaptıktan sonra, lütfen `docker-compose up -d` komutunu tekrar çalıştırın. Kullanılabilir tüm ortam değişkenlerinin tam listesini [burada](https://docs.dify.ai/getting-started/install-self-hosted/environments) bulabilirsiniz.
|
||||
|
||||
Yüksek kullanılabilirliğe sahip bir kurulum yapılandırmak isterseniz, Dify'ın Kubernetes üzerine dağıtılmasına olanak tanıyan topluluk katkılı [Helm Charts](https://helm.sh/) ve YAML dosyaları mevcuttur.
|
||||
|
||||
- [@LeoQuote tarafından Helm Chart](https://github.com/douban/charts/tree/master/charts/dify)
|
||||
- [@BorisPolonsky tarafından Helm Chart](https://github.com/BorisPolonsky/dify-helm)
|
||||
- [@Winson-030 tarafından YAML dosyası](https://github.com/Winson-030/dify-kubernetes)
|
||||
|
||||
#### Dağıtım için Terraform Kullanımı
|
||||
|
||||
##### Azure Global
|
||||
[Terraform](https://www.terraform.io/) kullanarak Dify'ı Azure'a tek tıklamayla dağıtın.
|
||||
- [@nikawang tarafından Azure Terraform](https://github.com/nikawang/dify-azure-terraform)
|
||||
|
||||
## Katkıda Bulunma
|
||||
|
||||
Kod katkısında bulunmak isteyenler için [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakabilirsiniz.
|
||||
Aynı zamanda, lütfen Dify'ı sosyal medyada, etkinliklerde ve konferanslarda paylaşarak desteklemeyi düşünün.
|
||||
|
||||
> Dify'ı Mandarin veya İngilizce dışındaki dillere çevirmemize yardımcı olacak katkıda bulunanlara ihtiyacımız var. Yardımcı olmakla ilgileniyorsanız, lütfen daha fazla bilgi için [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n/README.md) dosyasına bakın ve [Discord Topluluk Sunucumuzdaki](https://discord.gg/8Tpq4AcN9c) `global-users` kanalında bize bir yorum bırakın.
|
||||
|
||||
**Katkıda Bulunanlar**
|
||||
|
||||
<a href="https://github.com/langgenius/dify/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=langgenius/dify" />
|
||||
</a>
|
||||
|
||||
## Topluluk & iletişim
|
||||
|
||||
* [Github Tartışmaları](https://github.com/langgenius/dify/discussions). En uygun: geri bildirim paylaşmak ve soru sormak için.
|
||||
* [GitHub Sorunları](https://github.com/langgenius/dify/issues). En uygun: Dify.AI kullanırken karşılaştığınız hatalar ve özellik önerileri için. [Katkı Kılavuzumuza](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) bakın.
|
||||
* [Discord](https://discord.gg/FngNHpbcY7). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için.
|
||||
* [Twitter](https://twitter.com/dify_ai). En uygun: uygulamalarınızı paylaşmak ve toplulukla vakit geçirmek için.
|
||||
|
||||
Veya doğrudan bir ekip üyesiyle toplantı planlayın:
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<th>İletişim Noktası</th>
|
||||
<th>Amaç</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href='https://cal.com/guchenhe/15min' target='_blank'><img class="schedule-button" src='https://github.com/langgenius/dify/assets/13230914/9ebcd111-1205-4d71-83d5-948d70b809f5' alt='Git-Hub-README-Button-3x' style="width: 180px; height: auto; object-fit: contain;"/></a></td>
|
||||
<td>İş sorgulamaları & ürün geri bildirimleri</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href='https://cal.com/pinkbanana' target='_blank'><img class="schedule-button" src='https://github.com/langgenius/dify/assets/13230914/d1edd00a-d7e4-4513-be6c-e57038e143fd' alt='Git-Hub-README-Button-2x' style="width: 180px; height: auto; object-fit: contain;"/></a></td>
|
||||
<td>Katkılar, sorunlar & özellik istekleri</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Star history
|
||||
|
||||
[](https://star-history.com/#langgenius/dify&Date)
|
||||
|
||||
## Güvenlik açıklaması
|
||||
|
||||
Gizliliğinizi korumak için, lütfen güvenlik sorunlarını GitHub'da paylaşmaktan kaçının. Bunun yerine, sorularınızı security@dify.ai adresine gönderin ve size daha detaylı bir cevap vereceğiz.
|
||||
|
||||
## Lisans
|
||||
|
||||
Bu depo, temel olarak Apache 2.0 lisansı ve birkaç ek kısıtlama içeren [Dify Açık Kaynak Lisansı](LICENSE) altında kullanıma sunulmuştur.
|
@ -15,6 +15,7 @@ language_timezone_mapping = {
|
||||
'ro-RO': 'Europe/Bucharest',
|
||||
'pl-PL': 'Europe/Warsaw',
|
||||
'hi-IN': 'Asia/Kolkata',
|
||||
'tr-TR': 'Europe/Istanbul',
|
||||
}
|
||||
|
||||
languages = list(language_timezone_mapping.keys())
|
||||
|
@ -19,7 +19,7 @@ def inner_api_only(view):
|
||||
# get header 'X-Inner-Api-Key'
|
||||
inner_api_key = request.headers.get('X-Inner-Api-Key')
|
||||
if not inner_api_key or inner_api_key != dify_config.INNER_API_KEY:
|
||||
abort(404)
|
||||
abort(401)
|
||||
|
||||
return view(*args, **kwargs)
|
||||
|
||||
|
@ -53,7 +53,7 @@ class ConversationDetailApi(Resource):
|
||||
ConversationService.delete(app_model, conversation_id, end_user)
|
||||
except services.errors.conversation.ConversationNotExistsError:
|
||||
raise NotFound("Conversation Not Exists.")
|
||||
return {"result": "success"}, 204
|
||||
return {'result': 'success'}, 200
|
||||
|
||||
|
||||
class ConversationRenameApi(Resource):
|
||||
|
@ -91,7 +91,8 @@ class DatasetConfigManager:
|
||||
top_k=dataset_configs.get('top_k', 4),
|
||||
score_threshold=dataset_configs.get('score_threshold'),
|
||||
reranking_model=dataset_configs.get('reranking_model'),
|
||||
weights=dataset_configs.get('weights')
|
||||
weights=dataset_configs.get('weights'),
|
||||
reranking_enabled=dataset_configs.get('reranking_enabled', True),
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -158,10 +158,11 @@ class DatasetRetrieveConfigEntity(BaseModel):
|
||||
|
||||
retrieve_strategy: RetrieveStrategy
|
||||
top_k: Optional[int] = None
|
||||
score_threshold: Optional[float] = None
|
||||
score_threshold: Optional[float] = .0
|
||||
rerank_mode: Optional[str] = 'reranking_model'
|
||||
reranking_model: Optional[dict] = None
|
||||
weights: Optional[dict] = None
|
||||
reranking_enabled: Optional[bool] = True
|
||||
|
||||
|
||||
|
||||
|
@ -107,11 +107,11 @@ class CodeExecutor:
|
||||
response = response.json()
|
||||
except:
|
||||
raise CodeExecutionException('Failed to parse response')
|
||||
|
||||
if (code := response.get('code')) != 0:
|
||||
raise CodeExecutionException(f"Got error code: {code}. Got error msg: {response.get('message')}")
|
||||
|
||||
response = CodeExecutionResponse(**response)
|
||||
|
||||
if response.code != 0:
|
||||
raise CodeExecutionException(response.message)
|
||||
|
||||
if response.data.error:
|
||||
raise CodeExecutionException(response.data.error)
|
||||
|
@ -73,6 +73,8 @@ class HostingConfiguration:
|
||||
quota_limit=hosted_quota_limit,
|
||||
restrict_models=[
|
||||
RestrictModel(model="gpt-4", base_model_name="gpt-4", model_type=ModelType.LLM),
|
||||
RestrictModel(model="gpt-4o", base_model_name="gpt-4o", model_type=ModelType.LLM),
|
||||
RestrictModel(model="gpt-4o-mini", base_model_name="gpt-4o-mini", model_type=ModelType.LLM),
|
||||
RestrictModel(model="gpt-4-32k", base_model_name="gpt-4-32k", model_type=ModelType.LLM),
|
||||
RestrictModel(model="gpt-4-1106-preview", base_model_name="gpt-4-1106-preview", model_type=ModelType.LLM),
|
||||
RestrictModel(model="gpt-4-vision-preview", base_model_name="gpt-4-vision-preview", model_type=ModelType.LLM),
|
||||
|
@ -116,7 +116,8 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
|
||||
# Add the new header for claude-3-5-sonnet-20240620 model
|
||||
extra_headers = {}
|
||||
if model == "claude-3-5-sonnet-20240620":
|
||||
extra_headers["anthropic-beta"] = "max-tokens-3-5-sonnet-2024-07-15"
|
||||
if model_parameters.get('max_tokens') > 4096:
|
||||
extra_headers["anthropic-beta"] = "max-tokens-3-5-sonnet-2024-07-15"
|
||||
|
||||
if tools:
|
||||
extra_model_kwargs['tools'] = [
|
||||
|
@ -496,6 +496,158 @@ LLM_BASE_MODELS = [
|
||||
)
|
||||
)
|
||||
),
|
||||
AzureBaseModel(
|
||||
base_model_name='gpt-4o-mini',
|
||||
entity=AIModelEntity(
|
||||
model='fake-deployment-name',
|
||||
label=I18nObject(
|
||||
en_US='fake-deployment-name-label',
|
||||
),
|
||||
model_type=ModelType.LLM,
|
||||
features=[
|
||||
ModelFeature.AGENT_THOUGHT,
|
||||
ModelFeature.VISION,
|
||||
ModelFeature.MULTI_TOOL_CALL,
|
||||
ModelFeature.STREAM_TOOL_CALL,
|
||||
],
|
||||
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
|
||||
model_properties={
|
||||
ModelPropertyKey.MODE: LLMMode.CHAT.value,
|
||||
ModelPropertyKey.CONTEXT_SIZE: 128000,
|
||||
},
|
||||
parameter_rules=[
|
||||
ParameterRule(
|
||||
name='temperature',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE],
|
||||
),
|
||||
ParameterRule(
|
||||
name='top_p',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P],
|
||||
),
|
||||
ParameterRule(
|
||||
name='presence_penalty',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY],
|
||||
),
|
||||
ParameterRule(
|
||||
name='frequency_penalty',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY],
|
||||
),
|
||||
_get_max_tokens(default=512, min_val=1, max_val=16384),
|
||||
ParameterRule(
|
||||
name='seed',
|
||||
label=I18nObject(
|
||||
zh_Hans='种子',
|
||||
en_US='Seed'
|
||||
),
|
||||
type='int',
|
||||
help=I18nObject(
|
||||
zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。',
|
||||
en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.'
|
||||
),
|
||||
required=False,
|
||||
precision=2,
|
||||
min=0,
|
||||
max=1,
|
||||
),
|
||||
ParameterRule(
|
||||
name='response_format',
|
||||
label=I18nObject(
|
||||
zh_Hans='回复格式',
|
||||
en_US='response_format'
|
||||
),
|
||||
type='string',
|
||||
help=I18nObject(
|
||||
zh_Hans='指定模型必须输出的格式',
|
||||
en_US='specifying the format that the model must output'
|
||||
),
|
||||
required=False,
|
||||
options=['text', 'json_object']
|
||||
),
|
||||
],
|
||||
pricing=PriceConfig(
|
||||
input=0.150,
|
||||
output=0.600,
|
||||
unit=0.000001,
|
||||
currency='USD',
|
||||
)
|
||||
)
|
||||
),
|
||||
AzureBaseModel(
|
||||
base_model_name='gpt-4o-mini-2024-07-18',
|
||||
entity=AIModelEntity(
|
||||
model='fake-deployment-name',
|
||||
label=I18nObject(
|
||||
en_US='fake-deployment-name-label',
|
||||
),
|
||||
model_type=ModelType.LLM,
|
||||
features=[
|
||||
ModelFeature.AGENT_THOUGHT,
|
||||
ModelFeature.VISION,
|
||||
ModelFeature.MULTI_TOOL_CALL,
|
||||
ModelFeature.STREAM_TOOL_CALL,
|
||||
],
|
||||
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
|
||||
model_properties={
|
||||
ModelPropertyKey.MODE: LLMMode.CHAT.value,
|
||||
ModelPropertyKey.CONTEXT_SIZE: 128000,
|
||||
},
|
||||
parameter_rules=[
|
||||
ParameterRule(
|
||||
name='temperature',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.TEMPERATURE],
|
||||
),
|
||||
ParameterRule(
|
||||
name='top_p',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.TOP_P],
|
||||
),
|
||||
ParameterRule(
|
||||
name='presence_penalty',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.PRESENCE_PENALTY],
|
||||
),
|
||||
ParameterRule(
|
||||
name='frequency_penalty',
|
||||
**PARAMETER_RULE_TEMPLATE[DefaultParameterName.FREQUENCY_PENALTY],
|
||||
),
|
||||
_get_max_tokens(default=512, min_val=1, max_val=16384),
|
||||
ParameterRule(
|
||||
name='seed',
|
||||
label=I18nObject(
|
||||
zh_Hans='种子',
|
||||
en_US='Seed'
|
||||
),
|
||||
type='int',
|
||||
help=I18nObject(
|
||||
zh_Hans='如果指定,模型将尽最大努力进行确定性采样,使得重复的具有相同种子和参数的请求应该返回相同的结果。不能保证确定性,您应该参考 system_fingerprint 响应参数来监视变化。',
|
||||
en_US='If specified, model will make a best effort to sample deterministically, such that repeated requests with the same seed and parameters should return the same result. Determinism is not guaranteed, and you should refer to the system_fingerprint response parameter to monitor changes in the backend.'
|
||||
),
|
||||
required=False,
|
||||
precision=2,
|
||||
min=0,
|
||||
max=1,
|
||||
),
|
||||
ParameterRule(
|
||||
name='response_format',
|
||||
label=I18nObject(
|
||||
zh_Hans='回复格式',
|
||||
en_US='response_format'
|
||||
),
|
||||
type='string',
|
||||
help=I18nObject(
|
||||
zh_Hans='指定模型必须输出的格式',
|
||||
en_US='specifying the format that the model must output'
|
||||
),
|
||||
required=False,
|
||||
options=['text', 'json_object']
|
||||
),
|
||||
],
|
||||
pricing=PriceConfig(
|
||||
input=0.150,
|
||||
output=0.600,
|
||||
unit=0.000001,
|
||||
currency='USD',
|
||||
)
|
||||
)
|
||||
),
|
||||
AzureBaseModel(
|
||||
base_model_name='gpt-4o',
|
||||
entity=AIModelEntity(
|
||||
|
@ -114,6 +114,18 @@ model_credential_schema:
|
||||
show_on:
|
||||
- variable: __model_type
|
||||
value: llm
|
||||
- label:
|
||||
en_US: gpt-4o-mini
|
||||
value: gpt-4o-mini
|
||||
show_on:
|
||||
- variable: __model_type
|
||||
value: llm
|
||||
- label:
|
||||
en_US: gpt-4o-mini-2024-07-18
|
||||
value: gpt-4o-mini-2024-07-18
|
||||
show_on:
|
||||
- variable: __model_type
|
||||
value: llm
|
||||
- label:
|
||||
en_US: gpt-4o
|
||||
value: gpt-4o
|
||||
|
@ -1,12 +1,8 @@
|
||||
import concurrent.futures
|
||||
import copy
|
||||
from functools import reduce
|
||||
from io import BytesIO
|
||||
from typing import Optional
|
||||
|
||||
from flask import Response
|
||||
from openai import AzureOpenAI
|
||||
from pydub import AudioSegment
|
||||
|
||||
from core.model_runtime.entities.model_entities import AIModelEntity
|
||||
from core.model_runtime.errors.invoke import InvokeBadRequestError
|
||||
@ -51,7 +47,7 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel):
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
try:
|
||||
self._tts_invoke(
|
||||
self._tts_invoke_streaming(
|
||||
model=model,
|
||||
credentials=credentials,
|
||||
content_text='Hello Dify!',
|
||||
@ -60,45 +56,6 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel):
|
||||
except Exception as ex:
|
||||
raise CredentialsValidateFailedError(str(ex))
|
||||
|
||||
def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response:
|
||||
"""
|
||||
_tts_invoke text2speech model
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:param content_text: text content to be translated
|
||||
:param voice: model timbre
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
audio_type = self._get_model_audio_type(model, credentials)
|
||||
word_limit = self._get_model_word_limit(model, credentials)
|
||||
max_workers = self._get_model_workers_limit(model, credentials)
|
||||
try:
|
||||
sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit))
|
||||
audio_bytes_list = []
|
||||
|
||||
# Create a thread pool and map the function to the list of sentences
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
|
||||
futures = [executor.submit(self._process_sentence, sentence=sentence, model=model, voice=voice,
|
||||
credentials=credentials) for sentence in sentences]
|
||||
for future in futures:
|
||||
try:
|
||||
if future.result():
|
||||
audio_bytes_list.append(future.result())
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
if len(audio_bytes_list) > 0:
|
||||
audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in
|
||||
audio_bytes_list if audio_bytes]
|
||||
combined_segment = reduce(lambda x, y: x + y, audio_segments)
|
||||
buffer: BytesIO = BytesIO()
|
||||
combined_segment.export(buffer, format=audio_type)
|
||||
buffer.seek(0)
|
||||
return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}")
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str,
|
||||
voice: str) -> any:
|
||||
"""
|
||||
@ -144,7 +101,6 @@ class AzureOpenAIText2SpeechModel(_CommonAzureOpenAI, TTSModel):
|
||||
:param sentence: text content to be translated
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
# transform credentials to kwargs for model instance
|
||||
credentials_kwargs = self._to_credential_kwargs(credentials)
|
||||
client = AzureOpenAI(**credentials_kwargs)
|
||||
response = client.audio.speech.create(model=model, voice=voice, input=sentence.strip())
|
||||
|
@ -21,6 +21,16 @@ parameter_rules:
|
||||
default: 1024
|
||||
min: 1
|
||||
max: 32000
|
||||
- name: enable_enhance
|
||||
label:
|
||||
zh_Hans: 功能增强
|
||||
en_US: Enable Enhancement
|
||||
type: boolean
|
||||
help:
|
||||
zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。
|
||||
en_US: Allow the model to perform external search to enhance the generation results.
|
||||
required: false
|
||||
default: true
|
||||
pricing:
|
||||
input: '0.03'
|
||||
output: '0.10'
|
||||
|
@ -21,6 +21,16 @@ parameter_rules:
|
||||
default: 1024
|
||||
min: 1
|
||||
max: 256000
|
||||
- name: enable_enhance
|
||||
label:
|
||||
zh_Hans: 功能增强
|
||||
en_US: Enable Enhancement
|
||||
type: boolean
|
||||
help:
|
||||
zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。
|
||||
en_US: Allow the model to perform external search to enhance the generation results.
|
||||
required: false
|
||||
default: true
|
||||
pricing:
|
||||
input: '0.015'
|
||||
output: '0.06'
|
||||
|
@ -21,6 +21,16 @@ parameter_rules:
|
||||
default: 1024
|
||||
min: 1
|
||||
max: 32000
|
||||
- name: enable_enhance
|
||||
label:
|
||||
zh_Hans: 功能增强
|
||||
en_US: Enable Enhancement
|
||||
type: boolean
|
||||
help:
|
||||
zh_Hans: 功能增强(如搜索)开关,关闭时将直接由主模型生成回复内容,可以降低响应时延(对于流式输出时的首字时延尤为明显)。但在少数场景里,回复效果可能会下降。
|
||||
en_US: Allow the model to perform external search to enhance the generation results.
|
||||
required: false
|
||||
default: true
|
||||
pricing:
|
||||
input: '0.0045'
|
||||
output: '0.0005'
|
||||
|
@ -36,7 +36,8 @@ class HunyuanLargeLanguageModel(LargeLanguageModel):
|
||||
|
||||
custom_parameters = {
|
||||
'Temperature': model_parameters.get('temperature', 0.0),
|
||||
'TopP': model_parameters.get('top_p', 1.0)
|
||||
'TopP': model_parameters.get('top_p', 1.0),
|
||||
'EnableEnhancement': model_parameters.get('enable_enhance', True)
|
||||
}
|
||||
|
||||
params = {
|
||||
|
@ -2,6 +2,9 @@
|
||||
- google/codegemma-7b
|
||||
- google/recurrentgemma-2b
|
||||
- meta/llama2-70b
|
||||
- meta/llama-3.1-8b-instruct
|
||||
- meta/llama-3.1-70b-instruct
|
||||
- meta/llama-3.1-405b-instruct
|
||||
- meta/llama3-8b-instruct
|
||||
- meta/llama3-70b-instruct
|
||||
- mistralai/mistral-large
|
||||
|
@ -0,0 +1,36 @@
|
||||
model: meta/llama-3.1-405b-instruct
|
||||
label:
|
||||
zh_Hans: meta/llama-3.1-405b-instruct
|
||||
en_US: meta/llama-3.1-405b-instruct
|
||||
model_type: llm
|
||||
features:
|
||||
- agent-thought
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
min: 0
|
||||
max: 1
|
||||
default: 0.5
|
||||
- name: top_p
|
||||
use_template: top_p
|
||||
min: 0
|
||||
max: 1
|
||||
default: 1
|
||||
- name: max_tokens
|
||||
use_template: max_tokens
|
||||
min: 1
|
||||
max: 4096
|
||||
default: 1024
|
||||
- name: frequency_penalt
|
||||
use_template: frequency_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
||||
- name: presence_penalty
|
||||
use_template: presence_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
@ -0,0 +1,36 @@
|
||||
model: meta/llama-3.1-70b-instruct
|
||||
label:
|
||||
zh_Hans: meta/llama-3.1-70b-instruct
|
||||
en_US: meta/llama-3.1-70b-instruct
|
||||
model_type: llm
|
||||
features:
|
||||
- agent-thought
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
min: 0
|
||||
max: 1
|
||||
default: 0.5
|
||||
- name: top_p
|
||||
use_template: top_p
|
||||
min: 0
|
||||
max: 1
|
||||
default: 1
|
||||
- name: max_tokens
|
||||
use_template: max_tokens
|
||||
min: 1
|
||||
max: 4096
|
||||
default: 1024
|
||||
- name: frequency_penalty
|
||||
use_template: frequency_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
||||
- name: presence_penalty
|
||||
use_template: presence_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
@ -0,0 +1,36 @@
|
||||
model: meta/llama-3.1-8b-instruct
|
||||
label:
|
||||
zh_Hans: meta/llama-3.1-8b-instruct
|
||||
en_US: meta/llama-3.1-8b-instruct
|
||||
model_type: llm
|
||||
features:
|
||||
- agent-thought
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
min: 0
|
||||
max: 1
|
||||
default: 0.5
|
||||
- name: top_p
|
||||
use_template: top_p
|
||||
min: 0
|
||||
max: 1
|
||||
default: 1
|
||||
- name: max_tokens
|
||||
use_template: max_tokens
|
||||
min: 1
|
||||
max: 4096
|
||||
default: 1024
|
||||
- name: frequency_penalty
|
||||
use_template: frequency_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
||||
- name: presence_penalty
|
||||
use_template: presence_penalty
|
||||
min: -2
|
||||
max: 2
|
||||
default: 0
|
@ -31,6 +31,9 @@ class NVIDIALargeLanguageModel(OAIAPICompatLargeLanguageModel):
|
||||
'meta/llama2-70b': '',
|
||||
'meta/llama3-8b-instruct': '',
|
||||
'meta/llama3-70b-instruct': '',
|
||||
'meta/llama-3.1-8b-instruct': '',
|
||||
'meta/llama-3.1-70b-instruct': '',
|
||||
'meta/llama-3.1-405b-instruct': '',
|
||||
'google/recurrentgemma-2b': ''
|
||||
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ class OllamaEmbeddingModel(TextEmbeddingModel):
|
||||
if not endpoint_url.endswith('/'):
|
||||
endpoint_url += '/'
|
||||
|
||||
endpoint_url = urljoin(endpoint_url, 'api/embeddings')
|
||||
endpoint_url = urljoin(endpoint_url, 'api/embed')
|
||||
|
||||
# get model properties
|
||||
context_size = self._get_context_size(model, credentials)
|
||||
@ -78,32 +78,28 @@ class OllamaEmbeddingModel(TextEmbeddingModel):
|
||||
else:
|
||||
inputs.append(text)
|
||||
|
||||
batched_embeddings = []
|
||||
# Prepare the payload for the request
|
||||
payload = {
|
||||
'input': inputs,
|
||||
'model': model,
|
||||
}
|
||||
|
||||
for text in inputs:
|
||||
# Prepare the payload for the request
|
||||
payload = {
|
||||
'prompt': text,
|
||||
'model': model,
|
||||
}
|
||||
# Make the request to the OpenAI API
|
||||
response = requests.post(
|
||||
endpoint_url,
|
||||
headers=headers,
|
||||
data=json.dumps(payload),
|
||||
timeout=(10, 300)
|
||||
)
|
||||
|
||||
# Make the request to the OpenAI API
|
||||
response = requests.post(
|
||||
endpoint_url,
|
||||
headers=headers,
|
||||
data=json.dumps(payload),
|
||||
timeout=(10, 300)
|
||||
)
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
response_data = response.json()
|
||||
|
||||
response.raise_for_status() # Raise an exception for HTTP errors
|
||||
response_data = response.json()
|
||||
# Extract embeddings and used tokens from the response
|
||||
embeddings = response_data['embeddings']
|
||||
embedding_used_tokens = self.get_num_tokens(model, credentials, inputs)
|
||||
|
||||
# Extract embeddings and used tokens from the response
|
||||
embeddings = response_data['embedding']
|
||||
embedding_used_tokens = self.get_num_tokens(model, credentials, [text])
|
||||
|
||||
used_tokens += embedding_used_tokens
|
||||
batched_embeddings.append(embeddings)
|
||||
used_tokens += embedding_used_tokens
|
||||
|
||||
# calc usage
|
||||
usage = self._calc_response_usage(
|
||||
@ -113,7 +109,7 @@ class OllamaEmbeddingModel(TextEmbeddingModel):
|
||||
)
|
||||
|
||||
return TextEmbeddingResult(
|
||||
embeddings=batched_embeddings,
|
||||
embeddings=embeddings,
|
||||
usage=usage,
|
||||
model=model
|
||||
)
|
||||
|
@ -1,11 +1,7 @@
|
||||
import concurrent.futures
|
||||
from functools import reduce
|
||||
from io import BytesIO
|
||||
from typing import Optional
|
||||
|
||||
from flask import Response
|
||||
from openai import OpenAI
|
||||
from pydub import AudioSegment
|
||||
|
||||
from core.model_runtime.errors.invoke import InvokeBadRequestError
|
||||
from core.model_runtime.errors.validate import CredentialsValidateFailedError
|
||||
@ -32,7 +28,8 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel):
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
|
||||
if not voice or voice not in [d['value'] for d in self.get_tts_model_voices(model=model, credentials=credentials)]:
|
||||
if not voice or voice not in [d['value'] for d in
|
||||
self.get_tts_model_voices(model=model, credentials=credentials)]:
|
||||
voice = self._get_model_default_voice(model, credentials)
|
||||
# if streaming:
|
||||
return self._tts_invoke_streaming(model=model,
|
||||
@ -50,7 +47,7 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel):
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
try:
|
||||
self._tts_invoke(
|
||||
self._tts_invoke_streaming(
|
||||
model=model,
|
||||
credentials=credentials,
|
||||
content_text='Hello Dify!',
|
||||
@ -59,46 +56,6 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel):
|
||||
except Exception as ex:
|
||||
raise CredentialsValidateFailedError(str(ex))
|
||||
|
||||
def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response:
|
||||
"""
|
||||
_tts_invoke text2speech model
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:param content_text: text content to be translated
|
||||
:param voice: model timbre
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
audio_type = self._get_model_audio_type(model, credentials)
|
||||
word_limit = self._get_model_word_limit(model, credentials)
|
||||
max_workers = self._get_model_workers_limit(model, credentials)
|
||||
try:
|
||||
sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit))
|
||||
audio_bytes_list = []
|
||||
|
||||
# Create a thread pool and map the function to the list of sentences
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
|
||||
futures = [executor.submit(self._process_sentence, sentence=sentence, model=model, voice=voice,
|
||||
credentials=credentials) for sentence in sentences]
|
||||
for future in futures:
|
||||
try:
|
||||
if future.result():
|
||||
audio_bytes_list.append(future.result())
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
if len(audio_bytes_list) > 0:
|
||||
audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in
|
||||
audio_bytes_list if audio_bytes]
|
||||
combined_segment = reduce(lambda x, y: x + y, audio_segments)
|
||||
buffer: BytesIO = BytesIO()
|
||||
combined_segment.export(buffer, format=audio_type)
|
||||
buffer.seek(0)
|
||||
return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}")
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
|
||||
def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str,
|
||||
voice: str) -> any:
|
||||
"""
|
||||
@ -114,7 +71,8 @@ class OpenAIText2SpeechModel(_CommonOpenAI, TTSModel):
|
||||
# doc: https://platform.openai.com/docs/guides/text-to-speech
|
||||
credentials_kwargs = self._to_credential_kwargs(credentials)
|
||||
client = OpenAI(**credentials_kwargs)
|
||||
model_support_voice = [x.get("value") for x in self.get_tts_model_voices(model=model, credentials=credentials)]
|
||||
model_support_voice = [x.get("value") for x in
|
||||
self.get_tts_model_voices(model=model, credentials=credentials)]
|
||||
if not voice or voice not in model_support_voice:
|
||||
voice = self._get_model_default_voice(model, credentials)
|
||||
word_limit = self._get_model_word_limit(model, credentials)
|
||||
|
@ -4,7 +4,7 @@ label:
|
||||
model_type: llm
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 128000
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
@ -15,9 +15,9 @@ parameter_rules:
|
||||
required: true
|
||||
default: 512
|
||||
min: 1
|
||||
max: 128000
|
||||
max: 131072
|
||||
pricing:
|
||||
input: "3"
|
||||
output: "3"
|
||||
input: "2.7"
|
||||
output: "2.7"
|
||||
unit: "0.000001"
|
||||
currency: USD
|
||||
|
@ -4,7 +4,7 @@ label:
|
||||
model_type: llm
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 128000
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
@ -15,9 +15,9 @@ parameter_rules:
|
||||
required: true
|
||||
default: 512
|
||||
min: 1
|
||||
max: 128000
|
||||
max: 131072
|
||||
pricing:
|
||||
input: "0.9"
|
||||
output: "0.9"
|
||||
input: "0.52"
|
||||
output: "0.75"
|
||||
unit: "0.000001"
|
||||
currency: USD
|
||||
|
@ -4,7 +4,7 @@ label:
|
||||
model_type: llm
|
||||
model_properties:
|
||||
mode: chat
|
||||
context_size: 128000
|
||||
context_size: 131072
|
||||
parameter_rules:
|
||||
- name: temperature
|
||||
use_template: temperature
|
||||
@ -15,9 +15,9 @@ parameter_rules:
|
||||
required: true
|
||||
default: 512
|
||||
min: 1
|
||||
max: 128000
|
||||
max: 131072
|
||||
pricing:
|
||||
input: "0.2"
|
||||
output: "0.2"
|
||||
input: "0.06"
|
||||
output: "0.06"
|
||||
unit: "0.000001"
|
||||
currency: USD
|
||||
|
@ -497,12 +497,13 @@ You should also complete the text started with ``` but not tell ``` directly.
|
||||
content = prompt_message.content
|
||||
if not content:
|
||||
content = ' '
|
||||
tongyi_messages.append({
|
||||
message = {
|
||||
'role': 'assistant',
|
||||
'content': content if not rich_content else [{"text": content}],
|
||||
'tool_calls': [tool_call.model_dump() for tool_call in
|
||||
prompt_message.tool_calls] if prompt_message.tool_calls else None
|
||||
})
|
||||
'content': content if not rich_content else [{"text": content}]
|
||||
}
|
||||
if prompt_message.tool_calls:
|
||||
message['tool_calls'] = [tool_call.model_dump() for tool_call in prompt_message.tool_calls]
|
||||
tongyi_messages.append(message)
|
||||
elif isinstance(prompt_message, ToolPromptMessage):
|
||||
tongyi_messages.append({
|
||||
"role": "tool",
|
||||
|
@ -1,7 +1,4 @@
|
||||
import concurrent.futures
|
||||
import threading
|
||||
from functools import reduce
|
||||
from io import BytesIO
|
||||
from queue import Queue
|
||||
from typing import Optional
|
||||
|
||||
@ -9,8 +6,6 @@ import dashscope
|
||||
from dashscope import SpeechSynthesizer
|
||||
from dashscope.api_entities.dashscope_response import SpeechSynthesisResponse
|
||||
from dashscope.audio.tts import ResultCallback, SpeechSynthesisResult
|
||||
from flask import Response
|
||||
from pydub import AudioSegment
|
||||
|
||||
from core.model_runtime.errors.invoke import InvokeBadRequestError
|
||||
from core.model_runtime.errors.validate import CredentialsValidateFailedError
|
||||
@ -55,7 +50,7 @@ class TongyiText2SpeechModel(_CommonTongyi, TTSModel):
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
try:
|
||||
self._tts_invoke(
|
||||
self._tts_invoke_streaming(
|
||||
model=model,
|
||||
credentials=credentials,
|
||||
content_text='Hello Dify!',
|
||||
@ -64,46 +59,6 @@ class TongyiText2SpeechModel(_CommonTongyi, TTSModel):
|
||||
except Exception as ex:
|
||||
raise CredentialsValidateFailedError(str(ex))
|
||||
|
||||
def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> Response:
|
||||
"""
|
||||
_tts_invoke text2speech model
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:param voice: model timbre
|
||||
:param content_text: text content to be translated
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
audio_type = self._get_model_audio_type(model, credentials)
|
||||
word_limit = self._get_model_word_limit(model, credentials)
|
||||
max_workers = self._get_model_workers_limit(model, credentials)
|
||||
try:
|
||||
sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit))
|
||||
audio_bytes_list = []
|
||||
|
||||
# Create a thread pool and map the function to the list of sentences
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
|
||||
futures = [executor.submit(self._process_sentence, sentence=sentence,
|
||||
credentials=credentials, voice=voice, audio_type=audio_type) for sentence in
|
||||
sentences]
|
||||
for future in futures:
|
||||
try:
|
||||
if future.result():
|
||||
audio_bytes_list.append(future.result())
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
if len(audio_bytes_list) > 0:
|
||||
audio_segments = [AudioSegment.from_file(BytesIO(audio_bytes), format=audio_type) for audio_bytes in
|
||||
audio_bytes_list if audio_bytes]
|
||||
combined_segment = reduce(lambda x, y: x + y, audio_segments)
|
||||
buffer: BytesIO = BytesIO()
|
||||
combined_segment.export(buffer, format=audio_type)
|
||||
buffer.seek(0)
|
||||
return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}")
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str,
|
||||
voice: str) -> any:
|
||||
"""
|
||||
|
@ -57,6 +57,7 @@ class XinferenceRerankModel(RerankModel):
|
||||
documents=docs,
|
||||
query=query,
|
||||
top_n=top_n,
|
||||
return_documents=True
|
||||
)
|
||||
except RuntimeError as e:
|
||||
raise InvokeServerUnavailableError(str(e))
|
||||
@ -66,7 +67,7 @@ class XinferenceRerankModel(RerankModel):
|
||||
for idx, result in enumerate(response['results']):
|
||||
# format document
|
||||
index = result['index']
|
||||
page_content = result['document']
|
||||
page_content = result['document'] if isinstance(result['document'], str) else result['document']['text']
|
||||
rerank_document = RerankDocument(
|
||||
index=index,
|
||||
text=page_content,
|
||||
|
240
api/core/model_runtime/model_providers/xinference/tts/tts.py
Normal file
240
api/core/model_runtime/model_providers/xinference/tts/tts.py
Normal file
@ -0,0 +1,240 @@
|
||||
import concurrent.futures
|
||||
from functools import reduce
|
||||
from io import BytesIO
|
||||
from typing import Optional
|
||||
|
||||
from flask import Response
|
||||
from pydub import AudioSegment
|
||||
from xinference_client.client.restful.restful_client import Client, RESTfulAudioModelHandle
|
||||
|
||||
from core.model_runtime.entities.common_entities import I18nObject
|
||||
from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelType
|
||||
from core.model_runtime.errors.invoke import (
|
||||
InvokeAuthorizationError,
|
||||
InvokeBadRequestError,
|
||||
InvokeConnectionError,
|
||||
InvokeError,
|
||||
InvokeRateLimitError,
|
||||
InvokeServerUnavailableError,
|
||||
)
|
||||
from core.model_runtime.errors.validate import CredentialsValidateFailedError
|
||||
from core.model_runtime.model_providers.__base.tts_model import TTSModel
|
||||
|
||||
|
||||
class XinferenceText2SpeechModel(TTSModel):
|
||||
|
||||
def __init__(self):
|
||||
# preset voices, need support custom voice
|
||||
self.model_voices = {
|
||||
'chattts': {
|
||||
'all': [
|
||||
{'name': 'Alloy', 'value': 'alloy'},
|
||||
{'name': 'Echo', 'value': 'echo'},
|
||||
{'name': 'Fable', 'value': 'fable'},
|
||||
{'name': 'Onyx', 'value': 'onyx'},
|
||||
{'name': 'Nova', 'value': 'nova'},
|
||||
{'name': 'Shimmer', 'value': 'shimmer'},
|
||||
]
|
||||
},
|
||||
'cosyvoice': {
|
||||
'zh-Hans': [
|
||||
{'name': '中文男', 'value': '中文男'},
|
||||
{'name': '中文女', 'value': '中文女'},
|
||||
{'name': '粤语女', 'value': '粤语女'},
|
||||
],
|
||||
'zh-Hant': [
|
||||
{'name': '中文男', 'value': '中文男'},
|
||||
{'name': '中文女', 'value': '中文女'},
|
||||
{'name': '粤语女', 'value': '粤语女'},
|
||||
],
|
||||
'en-US': [
|
||||
{'name': '英文男', 'value': '英文男'},
|
||||
{'name': '英文女', 'value': '英文女'},
|
||||
],
|
||||
'ja-JP': [
|
||||
{'name': '日语男', 'value': '日语男'},
|
||||
],
|
||||
'ko-KR': [
|
||||
{'name': '韩语女', 'value': '韩语女'},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
def validate_credentials(self, model: str, credentials: dict) -> None:
|
||||
"""
|
||||
Validate model credentials
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
if ("/" in credentials['model_uid'] or
|
||||
"?" in credentials['model_uid'] or
|
||||
"#" in credentials['model_uid']):
|
||||
raise CredentialsValidateFailedError("model_uid should not contain /, ?, or #")
|
||||
|
||||
if credentials['server_url'].endswith('/'):
|
||||
credentials['server_url'] = credentials['server_url'][:-1]
|
||||
|
||||
# initialize client
|
||||
client = Client(
|
||||
base_url=credentials['server_url']
|
||||
)
|
||||
|
||||
xinference_client = client.get_model(model_uid=credentials['model_uid'])
|
||||
|
||||
if not isinstance(xinference_client, RESTfulAudioModelHandle):
|
||||
raise InvokeBadRequestError(
|
||||
'please check model type, the model you want to invoke is not a audio model')
|
||||
|
||||
self._tts_invoke(
|
||||
model=model,
|
||||
credentials=credentials,
|
||||
content_text='Hello Dify!',
|
||||
voice=self._get_model_default_voice(model, credentials),
|
||||
)
|
||||
except Exception as ex:
|
||||
raise CredentialsValidateFailedError(str(ex))
|
||||
|
||||
def _invoke(self, model: str, tenant_id: str, credentials: dict, content_text: str, voice: str,
|
||||
user: Optional[str] = None):
|
||||
"""
|
||||
_invoke text2speech model
|
||||
|
||||
:param model: model name
|
||||
:param tenant_id: user tenant id
|
||||
:param credentials: model credentials
|
||||
:param voice: model timbre
|
||||
:param content_text: text content to be translated
|
||||
:param user: unique user id
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
return self._tts_invoke(model, credentials, content_text, voice)
|
||||
|
||||
def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity | None:
|
||||
"""
|
||||
used to define customizable model schema
|
||||
"""
|
||||
|
||||
entity = AIModelEntity(
|
||||
model=model,
|
||||
label=I18nObject(
|
||||
en_US=model
|
||||
),
|
||||
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
|
||||
model_type=ModelType.TTS,
|
||||
model_properties={},
|
||||
parameter_rules=[]
|
||||
)
|
||||
|
||||
return entity
|
||||
|
||||
@property
|
||||
def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
|
||||
"""
|
||||
Map model invoke error to unified error
|
||||
The key is the error type thrown to the caller
|
||||
The value is the error type thrown by the model,
|
||||
which needs to be converted into a unified error type for the caller.
|
||||
|
||||
:return: Invoke error mapping
|
||||
"""
|
||||
return {
|
||||
InvokeConnectionError: [
|
||||
InvokeConnectionError
|
||||
],
|
||||
InvokeServerUnavailableError: [
|
||||
InvokeServerUnavailableError
|
||||
],
|
||||
InvokeRateLimitError: [
|
||||
InvokeRateLimitError
|
||||
],
|
||||
InvokeAuthorizationError: [
|
||||
InvokeAuthorizationError
|
||||
],
|
||||
InvokeBadRequestError: [
|
||||
InvokeBadRequestError,
|
||||
KeyError,
|
||||
ValueError
|
||||
]
|
||||
}
|
||||
|
||||
def get_tts_model_voices(self, model: str, credentials: dict, language: Optional[str] = None) -> list:
|
||||
for key, voices in self.model_voices.items():
|
||||
if key in model.lower():
|
||||
if language in voices:
|
||||
return voices[language]
|
||||
elif 'all' in voices:
|
||||
return voices['all']
|
||||
return []
|
||||
|
||||
def _get_model_default_voice(self, model: str, credentials: dict) -> any:
|
||||
return ""
|
||||
|
||||
def _get_model_word_limit(self, model: str, credentials: dict) -> int:
|
||||
return 3500
|
||||
|
||||
def _get_model_audio_type(self, model: str, credentials: dict) -> str:
|
||||
return "mp3"
|
||||
|
||||
def _get_model_workers_limit(self, model: str, credentials: dict) -> int:
|
||||
return 5
|
||||
|
||||
def _tts_invoke(self, model: str, credentials: dict, content_text: str, voice: str) -> any:
|
||||
"""
|
||||
_tts_invoke text2speech model
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:param voice: model timbre
|
||||
:param content_text: text content to be translated
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
if credentials['server_url'].endswith('/'):
|
||||
credentials['server_url'] = credentials['server_url'][:-1]
|
||||
|
||||
word_limit = self._get_model_word_limit(model, credentials)
|
||||
audio_type = self._get_model_audio_type(model, credentials)
|
||||
handle = RESTfulAudioModelHandle(credentials['model_uid'], credentials['server_url'], auth_headers={})
|
||||
|
||||
try:
|
||||
sentences = list(self._split_text_into_sentences(org_text=content_text, max_length=word_limit))
|
||||
audio_bytes_list = []
|
||||
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=min((3, len(sentences)))) as executor:
|
||||
futures = [executor.submit(
|
||||
handle.speech, input=sentence, voice=voice, response_format="mp3", speed=1.0, stream=False)
|
||||
for sentence in sentences]
|
||||
for future in futures:
|
||||
try:
|
||||
if future.result():
|
||||
audio_bytes_list.append(future.result())
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
if len(audio_bytes_list) > 0:
|
||||
audio_segments = [AudioSegment.from_file(
|
||||
BytesIO(audio_bytes), format=audio_type) for audio_bytes in
|
||||
audio_bytes_list if audio_bytes]
|
||||
combined_segment = reduce(lambda x, y: x + y, audio_segments)
|
||||
buffer: BytesIO = BytesIO()
|
||||
combined_segment.export(buffer, format=audio_type)
|
||||
buffer.seek(0)
|
||||
return Response(buffer.read(), status=200, mimetype=f"audio/{audio_type}")
|
||||
except Exception as ex:
|
||||
raise InvokeBadRequestError(str(ex))
|
||||
|
||||
def _tts_invoke_streaming(self, model: str, credentials: dict, content_text: str, voice: str) -> any:
|
||||
"""
|
||||
_tts_invoke_streaming text2speech model
|
||||
|
||||
Attention: stream api may return error [Parallel generation is not supported by ggml]
|
||||
|
||||
:param model: model name
|
||||
:param credentials: model credentials
|
||||
:param voice: model timbre
|
||||
:param content_text: text content to be translated
|
||||
:return: text translated to audio file
|
||||
"""
|
||||
pass
|
@ -17,6 +17,7 @@ supported_model_types:
|
||||
- text-embedding
|
||||
- rerank
|
||||
- speech2text
|
||||
- tts
|
||||
configurate_methods:
|
||||
- customizable-model
|
||||
model_credential_schema:
|
||||
|
@ -37,7 +37,6 @@ class DataPostProcessor:
|
||||
return WeightRerankRunner(
|
||||
tenant_id,
|
||||
Weights(
|
||||
weight_type=weights['weight_type'],
|
||||
vector_setting=VectorSetting(
|
||||
vector_weight=weights['vector_setting']['vector_weight'],
|
||||
embedding_provider_name=weights['vector_setting']['embedding_provider_name'],
|
||||
|
@ -4,7 +4,7 @@ from typing import Any
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
from numpy import ndarray
|
||||
from pgvecto_rs.sqlalchemy import Vector
|
||||
from pgvecto_rs.sqlalchemy import VECTOR
|
||||
from pydantic import BaseModel, model_validator
|
||||
from sqlalchemy import Float, String, create_engine, insert, select, text
|
||||
from sqlalchemy import text as sql_text
|
||||
@ -67,7 +67,7 @@ class PGVectoRS(BaseVector):
|
||||
)
|
||||
text: Mapped[str] = mapped_column(String)
|
||||
meta: Mapped[dict] = mapped_column(postgresql.JSONB)
|
||||
vector: Mapped[ndarray] = mapped_column(Vector(dim))
|
||||
vector: Mapped[ndarray] = mapped_column(VECTOR(dim))
|
||||
|
||||
self._table = _Table
|
||||
self._distance_op = "<=>"
|
||||
|
@ -105,7 +105,7 @@ class RelytVector(BaseVector):
|
||||
redis_client.set(collection_exist_cache_key, 1, ex=3600)
|
||||
|
||||
def add_texts(self, documents: list[Document], embeddings: list[list[float]], **kwargs):
|
||||
from pgvecto_rs.sqlalchemy import Vector
|
||||
from pgvecto_rs.sqlalchemy import VECTOR
|
||||
|
||||
ids = [str(uuid.uuid1()) for _ in documents]
|
||||
metadatas = [d.metadata for d in documents]
|
||||
@ -118,7 +118,7 @@ class RelytVector(BaseVector):
|
||||
self._collection_name,
|
||||
Base.metadata,
|
||||
Column("id", TEXT, primary_key=True),
|
||||
Column("embedding", Vector(len(embeddings[0]))),
|
||||
Column("embedding", VECTOR(len(embeddings[0]))),
|
||||
Column("document", String, nullable=True),
|
||||
Column("metadata", JSON, nullable=True),
|
||||
extend_existing=True,
|
||||
@ -169,7 +169,7 @@ class RelytVector(BaseVector):
|
||||
Args:
|
||||
ids: List of ids to delete.
|
||||
"""
|
||||
from pgvecto_rs.sqlalchemy import Vector
|
||||
from pgvecto_rs.sqlalchemy import VECTOR
|
||||
|
||||
if ids is None:
|
||||
raise ValueError("No ids provided to delete.")
|
||||
@ -179,7 +179,7 @@ class RelytVector(BaseVector):
|
||||
self._collection_name,
|
||||
Base.metadata,
|
||||
Column("id", TEXT, primary_key=True),
|
||||
Column("embedding", Vector(self.embedding_dimension)),
|
||||
Column("embedding", VECTOR(self.embedding_dimension)),
|
||||
Column("document", String, nullable=True),
|
||||
Column("metadata", JSON, nullable=True),
|
||||
extend_existing=True,
|
||||
|
@ -16,8 +16,6 @@ class KeywordSetting(BaseModel):
|
||||
class Weights(BaseModel):
|
||||
"""Model for weighted rerank."""
|
||||
|
||||
weight_type: str
|
||||
|
||||
vector_setting: VectorSetting
|
||||
|
||||
keyword_setting: KeywordSetting
|
||||
|
@ -138,6 +138,7 @@ class DatasetRetrieval:
|
||||
retrieve_config.rerank_mode,
|
||||
retrieve_config.reranking_model,
|
||||
retrieve_config.weights,
|
||||
retrieve_config.reranking_enabled,
|
||||
message_id,
|
||||
)
|
||||
|
||||
@ -606,7 +607,7 @@ class DatasetRetrieval:
|
||||
top_k: int, score_threshold: float) -> list[Document]:
|
||||
filter_documents = []
|
||||
for document in all_documents:
|
||||
if document.metadata['score'] >= score_threshold:
|
||||
if score_threshold and document.metadata['score'] >= score_threshold:
|
||||
filter_documents.append(document)
|
||||
if not filter_documents:
|
||||
return []
|
||||
|
@ -2,6 +2,7 @@ from typing import Any
|
||||
|
||||
from duckduckgo_search import DDGS
|
||||
|
||||
from core.file.file_obj import FileTransferMethod
|
||||
from core.tools.entities.tool_entities import ToolInvokeMessage
|
||||
from core.tools.tool.builtin_tool import BuiltinTool
|
||||
|
||||
@ -21,6 +22,7 @@ class DuckDuckGoImageSearchTool(BuiltinTool):
|
||||
response = DDGS().images(**query_dict)
|
||||
result = []
|
||||
for res in response:
|
||||
res['transfer_method'] = FileTransferMethod.REMOTE_URL
|
||||
msg = ToolInvokeMessage(type=ToolInvokeMessage.MessageType.IMAGE_LINK,
|
||||
message=res.get('image'),
|
||||
save_as='',
|
||||
|
@ -33,7 +33,6 @@ class WeightedScoreConfig(BaseModel):
|
||||
"""
|
||||
Weighted score Config.
|
||||
"""
|
||||
weight_type: str
|
||||
vector_setting: VectorSetting
|
||||
keyword_setting: KeywordSetting
|
||||
|
||||
@ -49,7 +48,6 @@ class MultipleRetrievalConfig(BaseModel):
|
||||
reranking_model: Optional[RerankingModelConfig] = None
|
||||
weights: Optional[WeightedScoreConfig] = None
|
||||
|
||||
|
||||
class ModelConfig(BaseModel):
|
||||
"""
|
||||
Model Config.
|
||||
|
@ -147,7 +147,6 @@ class KnowledgeRetrievalNode(BaseNode):
|
||||
elif node_data.multiple_retrieval_config.reranking_mode == 'weighted_score':
|
||||
reranking_model = None
|
||||
weights = {
|
||||
'weight_type': node_data.multiple_retrieval_config.weights.weight_type,
|
||||
'vector_setting': {
|
||||
"vector_weight": node_data.multiple_retrieval_config.weights.vector_setting.vector_weight,
|
||||
"embedding_provider_name": node_data.multiple_retrieval_config.weights.vector_setting.embedding_provider_name,
|
||||
|
@ -174,13 +174,14 @@ class ToolNode(BaseNode):
|
||||
ext = path.splitext(url)[1]
|
||||
mimetype = response.meta.get('mime_type', 'image/jpeg')
|
||||
filename = response.save_as or url.split('/')[-1]
|
||||
transfer_method = response.meta.get('transfer_method', FileTransferMethod.TOOL_FILE)
|
||||
|
||||
# get tool file id
|
||||
tool_file_id = url.split('/')[-1].split('.')[0]
|
||||
result.append(FileVar(
|
||||
tenant_id=self.tenant_id,
|
||||
type=FileType.IMAGE,
|
||||
transfer_method=FileTransferMethod.TOOL_FILE,
|
||||
transfer_method=transfer_method,
|
||||
url=url,
|
||||
related_id=tool_file_id,
|
||||
filename=filename,
|
||||
|
@ -1,6 +1,16 @@
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from sqlalchemy import MetaData
|
||||
|
||||
db = SQLAlchemy()
|
||||
POSTGRES_INDEXES_NAMING_CONVENTION = {
|
||||
'ix': '%(column_0_label)s_idx',
|
||||
'uq': '%(table_name)s_%(column_0_name)s_key',
|
||||
'ck': '%(table_name)s_%(constraint_name)s_check',
|
||||
'fk': '%(table_name)s_%(column_0_name)s_fkey',
|
||||
'pk': '%(table_name)s_pkey',
|
||||
}
|
||||
|
||||
metadata = MetaData(naming_convention=POSTGRES_INDEXES_NAMING_CONVENTION)
|
||||
db = SQLAlchemy(metadata=metadata)
|
||||
|
||||
|
||||
def init_app(app):
|
||||
|
@ -29,7 +29,6 @@ vector_setting_fields = {
|
||||
}
|
||||
|
||||
weighted_score_fields = {
|
||||
'weight_type': fields.String,
|
||||
'keyword_setting': fields.Nested(keyword_setting_fields),
|
||||
'vector_setting': fields.Nested(vector_setting_fields),
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
[alembic]
|
||||
# template used to generate migration files
|
||||
# file_template = %%(rev)s_%%(slug)s
|
||||
file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
|
||||
|
||||
# set to 'true' to run the environment during
|
||||
# the 'revision' command, regardless of autogenerate
|
||||
|
27
api/poetry.lock
generated
27
api/poetry.lock
generated
@ -5619,23 +5619,25 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "pgvecto-rs"
|
||||
version = "0.1.4"
|
||||
version = "0.2.1"
|
||||
description = "Python binding for pgvecto.rs"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
python-versions = "<3.13,>=3.8"
|
||||
files = [
|
||||
{file = "pgvecto_rs-0.1.4-py3-none-any.whl", hash = "sha256:9b08a9e612f0cd65d1cc6e17a35b9bb5956187e0e3981bf6e997ff9e615c6116"},
|
||||
{file = "pgvecto_rs-0.1.4.tar.gz", hash = "sha256:078b96cff1f3d417169ad46cacef7fc4d644978bbd6725a5c24c0675de5030ab"},
|
||||
{file = "pgvecto_rs-0.2.1-py3-none-any.whl", hash = "sha256:b3ee2c465219469ad537b3efea2916477c6c576b3d6fd4298980d0733d12bb27"},
|
||||
{file = "pgvecto_rs-0.2.1.tar.gz", hash = "sha256:07046eaad2c4f75745f76de9ba483541909f1c595aced8d3434224a4f933daca"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
numpy = ">=1.23"
|
||||
SQLAlchemy = {version = ">=2.0.23", optional = true, markers = "extra == \"sqlalchemy\""}
|
||||
toml = ">=0.10"
|
||||
|
||||
[package.extras]
|
||||
django = ["Django (>=4.2)"]
|
||||
psycopg3 = ["psycopg[binary] (>=3.1.12)"]
|
||||
sdk = ["openai (>=1.2.2)", "pgvecto_rs[sqlalchemy]"]
|
||||
sqlalchemy = ["SQLAlchemy (>=2.0.23)", "pgvecto_rs[psycopg3]"]
|
||||
sqlalchemy = ["SQLAlchemy (>=2.0.23)"]
|
||||
|
||||
[[package]]
|
||||
name = "pgvector"
|
||||
@ -6131,10 +6133,7 @@ files = [
|
||||
[package.dependencies]
|
||||
annotated-types = ">=0.4.0"
|
||||
pydantic-core = "2.20.1"
|
||||
typing-extensions = [
|
||||
{version = ">=4.6.1", markers = "python_version < \"3.13\""},
|
||||
{version = ">=4.12.2", markers = "python_version >= \"3.13\""},
|
||||
]
|
||||
typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""}
|
||||
|
||||
[package.extras]
|
||||
email = ["email-validator (>=2.0.0)"]
|
||||
@ -9098,13 +9097,13 @@ h11 = ">=0.9.0,<1"
|
||||
|
||||
[[package]]
|
||||
name = "xinference-client"
|
||||
version = "0.9.4"
|
||||
version = "0.13.3"
|
||||
description = "Client for Xinference"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "xinference-client-0.9.4.tar.gz", hash = "sha256:21934bc9f3142ade66aaed33c2b6cf244c274d5b4b3163f9981bebdddacf205f"},
|
||||
{file = "xinference_client-0.9.4-py3-none-any.whl", hash = "sha256:6d3f1df3537a011f0afee5f9c9ca4f3ff564ca32cc999cf7038b324c0b907d0c"},
|
||||
{file = "xinference-client-0.13.3.tar.gz", hash = "sha256:822b722100affdff049c27760be7d62ac92de58c87a40d3361066df446ba648f"},
|
||||
{file = "xinference_client-0.13.3-py3-none-any.whl", hash = "sha256:f0eff3858b1ebcef2129726f82b09259c177e11db466a7ca23def3d4849c419f"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
@ -9501,5 +9500,5 @@ cffi = ["cffi (>=1.11)"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "a8b61d74d9322302b7447b6f8728ad606abc160202a8a122a05a8ef3cec7055b"
|
||||
python-versions = ">=3.10,<3.13"
|
||||
content-hash = "50acbb78f2a273dfa8683d9d292596e89d13a420c6ecb1afad331f2c38dd1423"
|
||||
|
@ -154,7 +154,7 @@ pydantic_extra_types = "~2.9.0"
|
||||
pydub = "~0.25.1"
|
||||
pyjwt = "~2.8.0"
|
||||
pypdfium2 = "~4.17.0"
|
||||
python = "^3.10"
|
||||
python = ">=3.10,<3.13"
|
||||
python-docx = "~1.1.0"
|
||||
python-dotenv = "1.0.0"
|
||||
pyyaml = "~6.0.1"
|
||||
@ -173,7 +173,7 @@ transformers = "~4.35.0"
|
||||
unstructured = { version = "~0.10.27", extras = ["docx", "epub", "md", "msg", "ppt", "pptx"] }
|
||||
websocket-client = "~1.7.0"
|
||||
werkzeug = "~3.0.1"
|
||||
xinference-client = "0.9.4"
|
||||
xinference-client = "0.13.3"
|
||||
yarl = "~1.9.4"
|
||||
zhipuai = "1.0.7"
|
||||
rank-bm25 = "~0.2.2"
|
||||
@ -204,7 +204,7 @@ cloudscraper = "1.2.71"
|
||||
[tool.poetry.group.vdb.dependencies]
|
||||
chromadb = "0.5.1"
|
||||
oracledb = "~2.2.1"
|
||||
pgvecto-rs = "0.1.4"
|
||||
pgvecto-rs = { version = "~0.2.1", extras = ['sqlalchemy'] }
|
||||
pgvector = "0.2.5"
|
||||
pymilvus = "~2.4.4"
|
||||
pymysql = "1.1.1"
|
||||
|
@ -106,7 +106,7 @@ class MockXinferenceClass:
|
||||
def _check_cluster_authenticated(self):
|
||||
self._cluster_authed = True
|
||||
|
||||
def rerank(self: RESTfulRerankModelHandle, documents: list[str], query: str, top_n: int) -> dict:
|
||||
def rerank(self: RESTfulRerankModelHandle, documents: list[str], query: str, top_n: int, return_documents: bool) -> dict:
|
||||
# check if self._model_uid is a valid uuid
|
||||
if not re.match(r'[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}', self._model_uid) and \
|
||||
self._model_uid != 'rerank':
|
||||
|
@ -208,7 +208,8 @@ def test__convert_to_knowledge_retrieval_node_for_chatbot():
|
||||
reranking_model={
|
||||
'reranking_provider_name': 'cohere',
|
||||
'reranking_model_name': 'rerank-english-v2.0'
|
||||
}
|
||||
},
|
||||
reranking_enabled=True
|
||||
)
|
||||
)
|
||||
|
||||
@ -251,7 +252,8 @@ def test__convert_to_knowledge_retrieval_node_for_workflow_app():
|
||||
reranking_model={
|
||||
'reranking_provider_name': 'cohere',
|
||||
'reranking_model_name': 'rerank-english-v2.0'
|
||||
}
|
||||
},
|
||||
reranking_enabled=True
|
||||
)
|
||||
)
|
||||
|
||||
|
@ -655,6 +655,7 @@ SSRF_SANDBOX_HOST=sandbox
|
||||
# docker env var for specifying vector db type at startup
|
||||
# (based on the vector db type, the corresponding docker
|
||||
# compose profile will be used)
|
||||
# if you want to use unstructured, add ',unstructured' to the end
|
||||
# ------------------------------
|
||||
COMPOSE_PROFILES=${VECTOR_STORE:-weaviate}
|
||||
|
||||
|
@ -418,7 +418,7 @@ services:
|
||||
|
||||
# pgvecto-rs vector store
|
||||
pgvecto-rs:
|
||||
image: tensorchord/pgvecto-rs:pg16-v0.2.0
|
||||
image: tensorchord/pgvecto-rs:pg16-v0.3.0
|
||||
profiles:
|
||||
- pgvecto-rs
|
||||
restart: always
|
||||
@ -583,6 +583,16 @@ services:
|
||||
ports:
|
||||
- "${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123}"
|
||||
|
||||
# unstructured .
|
||||
# (if used, you need to set ETL_TYPE to Unstructured in the api & worker service.)
|
||||
unstructured:
|
||||
image: downloads.unstructured.io/unstructured-io/unstructured-api:latest
|
||||
profiles:
|
||||
- unstructured
|
||||
restart: always
|
||||
volumes:
|
||||
- ./volumes/unstructured:/app/data
|
||||
|
||||
networks:
|
||||
# create a network between sandbox, api and ssrf_proxy, and can not access outside.
|
||||
ssrf_proxy_network:
|
||||
|
@ -4,6 +4,7 @@ import { memo, useMemo } from 'react'
|
||||
import type { FC } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import {
|
||||
RiAlertFill,
|
||||
RiQuestionLine,
|
||||
} from '@remixicon/react'
|
||||
import WeightedScore from './weighted-score'
|
||||
@ -26,7 +27,6 @@ import TooltipPlus from '@/app/components/base/tooltip-plus'
|
||||
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||
import type {
|
||||
DataSet,
|
||||
WeightedScoreEnum,
|
||||
} from '@/models/datasets'
|
||||
import { RerankingModeEnum } from '@/models/datasets'
|
||||
import cn from '@/utils/classnames'
|
||||
@ -112,12 +112,11 @@ const ConfigContent: FC<Props> = ({
|
||||
})
|
||||
}
|
||||
|
||||
const handleWeightedScoreChange = (value: { type: WeightedScoreEnum; value: number[] }) => {
|
||||
const handleWeightedScoreChange = (value: { value: number[] }) => {
|
||||
const configs = {
|
||||
...datasetConfigs,
|
||||
weights: {
|
||||
...datasetConfigs.weights!,
|
||||
weight_type: value.type,
|
||||
vector_setting: {
|
||||
...datasetConfigs.weights!.vector_setting!,
|
||||
vector_weight: value.value[0],
|
||||
@ -178,14 +177,6 @@ const ConfigContent: FC<Props> = ({
|
||||
popupContent={(
|
||||
<div className='w-[320px]'>
|
||||
{t('dataset.nTo1RetrievalLegacy')}
|
||||
<a
|
||||
className='underline'
|
||||
href={LEGACY_LINK_MAP[language]}
|
||||
target='_blank'
|
||||
rel='noopener noreferrer'
|
||||
>
|
||||
({t('dataset.nTo1RetrievalLegacyLink')})
|
||||
</a>
|
||||
</div>
|
||||
)}
|
||||
>
|
||||
@ -196,6 +187,22 @@ const ConfigContent: FC<Props> = ({
|
||||
description={t('appDebug.datasetConfig.retrieveOneWay.description')}
|
||||
isChosen={type === RETRIEVE_TYPE.oneWay}
|
||||
onChosen={() => { setType(RETRIEVE_TYPE.oneWay) }}
|
||||
extra={(
|
||||
<div className='flex pl-3 pr-1 py-3 border-t border-divider-subtle bg-state-warning-hover rounded-b-xl'>
|
||||
<RiAlertFill className='shrink-0 mr-1.5 w-4 h-4 text-text-warning-secondary' />
|
||||
<div className='system-xs-medium text-text-primary'>
|
||||
{t('dataset.nTo1RetrievalLegacyLinkText')}
|
||||
<a
|
||||
className='text-text-accent'
|
||||
href={LEGACY_LINK_MAP[language]}
|
||||
target='_blank'
|
||||
rel='noopener noreferrer'
|
||||
>
|
||||
{t('dataset.nTo1RetrievalLegacyLink')}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
/>
|
||||
<RadioCard
|
||||
icon={<MultiPathRetrieval className='shrink-0 mr-3 w-9 h-9 rounded-lg' />}
|
||||
@ -302,7 +309,6 @@ const ConfigContent: FC<Props> = ({
|
||||
<div className='mt-2 space-y-4'>
|
||||
<WeightedScore
|
||||
value={{
|
||||
type: datasetConfigs.weights!.weight_type,
|
||||
value: [
|
||||
datasetConfigs.weights!.vector_setting.vector_weight,
|
||||
datasetConfigs.weights!.keyword_setting.keyword_weight,
|
||||
|
@ -0,0 +1,7 @@
|
||||
.weightedScoreSliderTrack {
|
||||
background: var(--color-util-colors-blue-light-blue-light-500) !important;
|
||||
}
|
||||
|
||||
.weightedScoreSliderTrack-1 {
|
||||
background: transparent !important;
|
||||
}
|
@ -1,9 +1,6 @@
|
||||
import { memo, useCallback } from 'react'
|
||||
import { memo } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import {
|
||||
DEFAULT_WEIGHTED_SCORE,
|
||||
WeightedScoreEnum,
|
||||
} from '@/models/datasets'
|
||||
import './weighted-score.css'
|
||||
import Slider from '@/app/components/base/slider'
|
||||
import cn from '@/utils/classnames'
|
||||
|
||||
@ -17,7 +14,6 @@ const formatNumber = (value: number) => {
|
||||
}
|
||||
|
||||
type Value = {
|
||||
type: WeightedScoreEnum
|
||||
value: number[]
|
||||
}
|
||||
|
||||
@ -30,78 +26,31 @@ const WeightedScore = ({
|
||||
onChange = () => {},
|
||||
}: WeightedScoreProps) => {
|
||||
const { t } = useTranslation()
|
||||
const options = [
|
||||
{
|
||||
value: WeightedScoreEnum.SemanticFirst,
|
||||
label: t('dataset.weightedScore.semanticFirst'),
|
||||
},
|
||||
{
|
||||
value: WeightedScoreEnum.KeywordFirst,
|
||||
label: t('dataset.weightedScore.keywordFirst'),
|
||||
},
|
||||
{
|
||||
value: WeightedScoreEnum.Customized,
|
||||
label: t('dataset.weightedScore.customized'),
|
||||
},
|
||||
]
|
||||
|
||||
const disabled = value.type !== WeightedScoreEnum.Customized
|
||||
|
||||
const handleTypeChange = useCallback((type: WeightedScoreEnum) => {
|
||||
const result = { ...value, type }
|
||||
|
||||
if (type === WeightedScoreEnum.SemanticFirst)
|
||||
result.value = [DEFAULT_WEIGHTED_SCORE.semanticFirst.semantic, DEFAULT_WEIGHTED_SCORE.semanticFirst.keyword]
|
||||
|
||||
if (type === WeightedScoreEnum.KeywordFirst)
|
||||
result.value = [DEFAULT_WEIGHTED_SCORE.keywordFirst.semantic, DEFAULT_WEIGHTED_SCORE.keywordFirst.keyword]
|
||||
|
||||
onChange(result)
|
||||
}, [value, onChange])
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className='flex items-center mb-1 space-x-4'>
|
||||
{
|
||||
options.map(option => (
|
||||
<div
|
||||
key={option.value}
|
||||
className='flex py-1.5 max-w-[calc((100%-32px)/3)] system-sm-regular text-text-secondary cursor-pointer'
|
||||
onClick={() => handleTypeChange(option.value)}
|
||||
>
|
||||
<div
|
||||
className={cn(
|
||||
'shrink-0 mr-2 w-4 h-4 bg-components-radio-bg border border-components-radio-border rounded-full shadow-xs',
|
||||
value.type === option.value && 'border-[5px] border-components-radio-border-checked',
|
||||
)}
|
||||
></div>
|
||||
<div className='truncate' title={option.label}>{option.label}</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
<div className='flex items-center px-3 h-9 space-x-3 rounded-lg border border-components-panel-border'>
|
||||
<div className='shrink-0 flex items-center w-[90px] system-xs-semibold-uppercase text-util-colors-blue-blue-500'>
|
||||
<div className='mr-1 truncate uppercase' title={t('dataset.weightedScore.semantic') || ''}>
|
||||
{t('dataset.weightedScore.semantic')}
|
||||
</div>
|
||||
{formatNumber(value.value[0])}
|
||||
</div>
|
||||
<div className='px-3 pt-5 h-[52px] space-x-3 rounded-lg border border-components-panel-border'>
|
||||
<Slider
|
||||
className={cn('grow h-0.5 bg-gradient-to-r from-[#53B1FD] to-[#2ED3B7]', disabled && 'cursor-not-allowed')}
|
||||
className={cn('grow h-0.5 !bg-util-colors-teal-teal-500 rounded-full')}
|
||||
max={1.0}
|
||||
min={0}
|
||||
step={0.1}
|
||||
value={value.value[0]}
|
||||
onChange={v => onChange({ type: value.type, value: [v, (10 - v * 10) / 10] })}
|
||||
disabled={disabled}
|
||||
thumbClassName={cn(disabled && '!cursor-not-allowed')}
|
||||
trackClassName='!bg-transparent'
|
||||
onChange={v => onChange({ value: [v, (10 - v * 10) / 10] })}
|
||||
trackClassName='weightedScoreSliderTrack'
|
||||
/>
|
||||
<div className='shrink-0 flex items-center justify-end w-[90px] system-xs-semibold-uppercase text-util-colors-cyan-cyan-500'>
|
||||
{formatNumber(value.value[1])}
|
||||
<div className='ml-1 truncate uppercase' title={t('dataset.weightedScore.keyword') || ''}>
|
||||
{t('dataset.weightedScore.keyword')}
|
||||
<div className='flex justify-between mt-1'>
|
||||
<div className='shrink-0 flex items-center w-[90px] system-xs-semibold-uppercase text-util-colors-blue-light-blue-light-500'>
|
||||
<div className='mr-1 truncate uppercase' title={t('dataset.weightedScore.semantic') || ''}>
|
||||
{t('dataset.weightedScore.semantic')}
|
||||
</div>
|
||||
{formatNumber(value.value[0])}
|
||||
</div>
|
||||
<div className='shrink-0 flex items-center justify-end w-[90px] system-xs-semibold-uppercase text-util-colors-teal-teal-500'>
|
||||
{formatNumber(value.value[1])}
|
||||
<div className='ml-1 truncate uppercase' title={t('dataset.weightedScore.keyword') || ''}>
|
||||
{t('dataset.weightedScore.keyword')}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -30,6 +30,7 @@ const ChatWrapper = () => {
|
||||
handleFeedback,
|
||||
currentChatInstanceRef,
|
||||
appData,
|
||||
themeBuilder,
|
||||
} = useChatWithHistoryContext()
|
||||
const appConfig = useMemo(() => {
|
||||
const config = appParams || {}
|
||||
@ -143,6 +144,7 @@ const ChatWrapper = () => {
|
||||
onFeedback={handleFeedback}
|
||||
suggestedQuestions={suggestedQuestions}
|
||||
hideProcessDetail
|
||||
themeBuilder={themeBuilder}
|
||||
/>
|
||||
)
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import type {
|
||||
ChatItem,
|
||||
Feedback,
|
||||
} from '../types'
|
||||
import type { ThemeBuilder } from '../embedded-chatbot/theme/theme-context'
|
||||
import type {
|
||||
AppConversationData,
|
||||
AppData,
|
||||
@ -46,6 +47,7 @@ export type ChatWithHistoryContextValue = {
|
||||
appId?: string
|
||||
handleFeedback: (messageId: string, feedback: Feedback) => void
|
||||
currentChatInstanceRef: RefObject<{ handleStop: () => void }>
|
||||
themeBuilder?: ThemeBuilder
|
||||
}
|
||||
|
||||
export const ChatWithHistoryContext = createContext<ChatWithHistoryContextValue>({
|
||||
|
@ -4,6 +4,7 @@ import {
|
||||
useState,
|
||||
} from 'react'
|
||||
import { useAsyncEffect } from 'ahooks'
|
||||
import { useThemeContext } from '../embedded-chatbot/theme/theme-context'
|
||||
import {
|
||||
ChatWithHistoryContext,
|
||||
useChatWithHistoryContext,
|
||||
@ -34,6 +35,7 @@ const ChatWithHistory: FC<ChatWithHistoryProps> = ({
|
||||
appChatListDataLoading,
|
||||
chatShouldReloadKey,
|
||||
isMobile,
|
||||
themeBuilder,
|
||||
} = useChatWithHistoryContext()
|
||||
|
||||
const chatReady = (!showConfigPanelBeforeChat || !!appPrevChatList.length)
|
||||
@ -41,13 +43,14 @@ const ChatWithHistory: FC<ChatWithHistoryProps> = ({
|
||||
const site = appData?.site
|
||||
|
||||
useEffect(() => {
|
||||
themeBuilder?.buildTheme(site?.chat_color_theme, site?.chat_color_theme_inverted)
|
||||
if (site) {
|
||||
if (customConfig)
|
||||
document.title = `${site.title}`
|
||||
else
|
||||
document.title = `${site.title} - Powered by Dify`
|
||||
}
|
||||
}, [site, customConfig])
|
||||
}, [site, customConfig, themeBuilder])
|
||||
|
||||
if (appInfoLoading) {
|
||||
return (
|
||||
@ -106,6 +109,7 @@ const ChatWithHistoryWrap: FC<ChatWithHistoryWrapProps> = ({
|
||||
}) => {
|
||||
const media = useBreakpoints()
|
||||
const isMobile = media === MediaType.mobile
|
||||
const themeBuilder = useThemeContext()
|
||||
|
||||
const {
|
||||
appInfoError,
|
||||
@ -171,6 +175,7 @@ const ChatWithHistoryWrap: FC<ChatWithHistoryWrapProps> = ({
|
||||
appId,
|
||||
handleFeedback,
|
||||
currentChatInstanceRef,
|
||||
themeBuilder,
|
||||
}}>
|
||||
<ChatWithHistory className={className} />
|
||||
</ChatWithHistoryContext.Provider>
|
||||
|
@ -51,7 +51,7 @@ const Chatbot = () => {
|
||||
else
|
||||
document.title = `${site.title} - Powered by Dify`
|
||||
}
|
||||
}, [site, customConfig])
|
||||
}, [site, customConfig, themeBuilder])
|
||||
|
||||
if (appInfoLoading) {
|
||||
return (
|
||||
|
@ -12,6 +12,7 @@ type Props = {
|
||||
onChosen: () => void
|
||||
chosenConfig?: React.ReactNode
|
||||
icon?: JSX.Element
|
||||
extra?: React.ReactNode
|
||||
}
|
||||
|
||||
const RadioCard: FC<Props> = ({
|
||||
@ -20,20 +21,24 @@ const RadioCard: FC<Props> = ({
|
||||
isChosen,
|
||||
onChosen,
|
||||
icon,
|
||||
extra,
|
||||
}) => {
|
||||
return (
|
||||
<div
|
||||
className={cn(s.item, isChosen && s.active, 'flex')}
|
||||
className={cn(s.item, isChosen && s.active)}
|
||||
onClick={onChosen}
|
||||
>
|
||||
{icon}
|
||||
<div>
|
||||
<div className='flex justify-between items-center'>
|
||||
<div className='leading-5 text-sm font-medium text-gray-900'>{title}</div>
|
||||
<div className={s.radio}></div>
|
||||
<div className='flex px-3 py-2'>
|
||||
{icon}
|
||||
<div>
|
||||
<div className='flex justify-between items-center'>
|
||||
<div className='leading-5 text-sm font-medium text-gray-900'>{title}</div>
|
||||
<div className={s.radio}></div>
|
||||
</div>
|
||||
<div className='leading-[18px] text-xs font-normal text-gray-500'>{description}</div>
|
||||
</div>
|
||||
<div className='leading-[18px] text-xs font-normal text-gray-500'>{description}</div>
|
||||
</div>
|
||||
{extra}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
.item {
|
||||
@apply relative p-4 rounded-xl border border-gray-100 cursor-pointer;
|
||||
@apply relative rounded-xl border border-gray-100 cursor-pointer;
|
||||
background-color: #fcfcfd;
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@ import ModelSelector from '@/app/components/header/account-setting/model-provide
|
||||
import { useModelListAndDefaultModel } from '@/app/components/header/account-setting/model-provider-page/hooks'
|
||||
import { ModelTypeEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
|
||||
import {
|
||||
DEFAULT_WEIGHTED_SCORE,
|
||||
RerankingModeEnum,
|
||||
WeightedScoreEnum,
|
||||
} from '@/models/datasets'
|
||||
@ -69,12 +70,12 @@ const RetrievalParamConfig: FC<Props> = ({
|
||||
result.weights = {
|
||||
weight_type: WeightedScoreEnum.Customized,
|
||||
vector_setting: {
|
||||
vector_weight: 0.5,
|
||||
vector_weight: DEFAULT_WEIGHTED_SCORE.other.semantic,
|
||||
embedding_provider_name: '',
|
||||
embedding_model_name: '',
|
||||
},
|
||||
keyword_setting: {
|
||||
keyword_weight: 0.5,
|
||||
keyword_weight: DEFAULT_WEIGHTED_SCORE.other.keyword,
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -202,7 +203,6 @@ const RetrievalParamConfig: FC<Props> = ({
|
||||
value.reranking_mode === RerankingModeEnum.WeightedScore && (
|
||||
<WeightedScore
|
||||
value={{
|
||||
type: value.weights!.weight_type,
|
||||
value: [
|
||||
value.weights!.vector_setting.vector_weight,
|
||||
value.weights!.keyword_setting.keyword_weight,
|
||||
@ -213,7 +213,6 @@ const RetrievalParamConfig: FC<Props> = ({
|
||||
...value,
|
||||
weights: {
|
||||
...value.weights!,
|
||||
weight_type: v.type,
|
||||
vector_setting: {
|
||||
...value.weights!.vector_setting,
|
||||
vector_weight: v.value[0],
|
||||
|
@ -264,20 +264,18 @@ const Form = () => {
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
{currentDataset?.embedding_available && (
|
||||
<div className={rowClass}>
|
||||
<div className={labelClass} />
|
||||
<div className='w-[480px]'>
|
||||
<Button
|
||||
className='min-w-24'
|
||||
variant='primary'
|
||||
onClick={handleSave}
|
||||
>
|
||||
{t('datasetSettings.form.save')}
|
||||
</Button>
|
||||
</div>
|
||||
<div className={rowClass}>
|
||||
<div className={labelClass} />
|
||||
<div className='w-[480px]'>
|
||||
<Button
|
||||
className='min-w-24'
|
||||
variant='primary'
|
||||
onClick={handleSave}
|
||||
>
|
||||
{t('datasetSettings.form.save')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ const ParameterItem: FC<ParameterItemProps> = ({
|
||||
const handleInputChange = (newValue: ParameterValue) => {
|
||||
setLocalValue(newValue)
|
||||
|
||||
if (onChange && (parameterRule.name === 'stop' || !isNullOrUndefined(value)))
|
||||
if (onChange && (parameterRule.name === 'stop' || !isNullOrUndefined(value) || parameterRule.required))
|
||||
onChange(newValue)
|
||||
}
|
||||
|
||||
|
@ -249,6 +249,7 @@ const SystemModel: FC<SystemModelSelectorProps> = ({
|
||||
{t('common.operation.cancel')}
|
||||
</Button>
|
||||
<Button
|
||||
className='ml-2'
|
||||
variant='primary'
|
||||
onClick={handleSave}
|
||||
disabled={!isCurrentWorkspaceManager}
|
||||
|
@ -194,6 +194,10 @@ const Workflow: FC<WorkflowProps> = memo(({
|
||||
e.preventDefault()
|
||||
if ((e.key === 'z' || e.key === 'Z') && (e.ctrlKey || e.metaKey))
|
||||
e.preventDefault()
|
||||
if ((e.key === 'y' || e.key === 'Y') && (e.ctrlKey || e.metaKey))
|
||||
e.preventDefault()
|
||||
if ((e.key === 's' || e.key === 'S') && (e.ctrlKey || e.metaKey))
|
||||
e.preventDefault()
|
||||
})
|
||||
useEventListener('mousemove', (e) => {
|
||||
const containerClientRect = workflowContainerRef.current?.getBoundingClientRect()
|
||||
@ -260,7 +264,7 @@ const Workflow: FC<WorkflowProps> = memo(({
|
||||
|
||||
const { shortcutsEnabled: workflowHistoryShortcutsEnabled } = useWorkflowHistoryStore()
|
||||
|
||||
useKeyPress('delete', handleNodesDelete)
|
||||
useKeyPress(['delete', 'backspace'], handleNodesDelete)
|
||||
useKeyPress(['delete', 'backspace'], handleEdgeDelete)
|
||||
useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.c`, (e) => {
|
||||
if (isEventTargetInputArea(e.target as HTMLElement))
|
||||
@ -310,7 +314,7 @@ const Workflow: FC<WorkflowProps> = memo(({
|
||||
>
|
||||
<SyncingDataModal />
|
||||
<CandidateNode />
|
||||
<Header/>
|
||||
<Header />
|
||||
<Panel />
|
||||
<Operator handleRedo={handleHistoryForward} handleUndo={handleHistoryBack} />
|
||||
{
|
||||
|
@ -2,7 +2,6 @@ import type { CommonNodeType, ModelConfig, ValueSelector } from '@/app/component
|
||||
import type { RETRIEVE_TYPE } from '@/types/app'
|
||||
import type {
|
||||
RerankingModeEnum,
|
||||
WeightedScoreEnum,
|
||||
} from '@/models/datasets'
|
||||
|
||||
export type MultipleRetrievalConfig = {
|
||||
@ -14,7 +13,6 @@ export type MultipleRetrievalConfig = {
|
||||
}
|
||||
reranking_mode?: RerankingModeEnum
|
||||
weights?: {
|
||||
weight_type: WeightedScoreEnum
|
||||
vector_setting: {
|
||||
vector_weight: number
|
||||
embedding_provider_name: string
|
||||
|
@ -263,7 +263,7 @@ const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
|
||||
handleMultipleRetrievalConfigChange,
|
||||
handleModelChanged,
|
||||
handleCompletionParamsChange,
|
||||
selectedDatasets,
|
||||
selectedDatasets: selectedDatasets.filter(d => d.name),
|
||||
handleOnDatasetsChange,
|
||||
isShowSingleRun,
|
||||
hideSingleRun,
|
||||
|
@ -7,7 +7,6 @@ import type {
|
||||
import {
|
||||
DEFAULT_WEIGHTED_SCORE,
|
||||
RerankingModeEnum,
|
||||
WeightedScoreEnum,
|
||||
} from '@/models/datasets'
|
||||
import { RETRIEVE_METHOD } from '@/types/app'
|
||||
import { DATASET_DEFAULT } from '@/config'
|
||||
@ -89,7 +88,7 @@ export const getMultipleRetrievalConfig = (multipleRetrievalConfig: MultipleRetr
|
||||
reranking_mode,
|
||||
reranking_model,
|
||||
weights,
|
||||
reranking_enable,
|
||||
reranking_enable: allEconomic ? reranking_enable : true,
|
||||
}
|
||||
|
||||
if (allEconomic || mixtureHighQualityAndEconomic || inconsistentEmbeddingModel)
|
||||
@ -100,7 +99,6 @@ export const getMultipleRetrievalConfig = (multipleRetrievalConfig: MultipleRetr
|
||||
|
||||
if (allHighQuality && !inconsistentEmbeddingModel && (reranking_mode === RerankingModeEnum.WeightedScore || reranking_mode === undefined) && !weights) {
|
||||
result.weights = {
|
||||
weight_type: WeightedScoreEnum.Customized,
|
||||
vector_setting: {
|
||||
vector_weight: allHighQualityVectorSearch
|
||||
? DEFAULT_WEIGHTED_SCORE.allHighQualityVectorSearch.semantic
|
||||
|
@ -70,6 +70,7 @@ const translation = {
|
||||
},
|
||||
nTo1RetrievalLegacy: 'N-to-1 retrieval will be officially deprecated from September. It is recommended to use the latest Multi-path retrieval to obtain better results. ',
|
||||
nTo1RetrievalLegacyLink: 'Learn more',
|
||||
nTo1RetrievalLegacyLinkText: ' N-to-1 retrieval will be officially deprecated in September.',
|
||||
}
|
||||
|
||||
export default translation
|
||||
|
@ -300,8 +300,8 @@ const translation = {
|
||||
'editModalTitle': '入力フィールドを編集',
|
||||
'description': '{{varName}} の変数設定',
|
||||
'fieldType': 'フィールドタイプ',
|
||||
'string': 'ショートテキスト',
|
||||
'text-input': 'ショートテキスト',
|
||||
'string': '短文',
|
||||
'text-input': '短文',
|
||||
'paragraph': '段落',
|
||||
'select': '選択',
|
||||
'number': '数値',
|
||||
|
@ -292,8 +292,8 @@ const translation = {
|
||||
tip: '会話でのテキスト-to-音声入力に使用するデフォルトモデルを設定します。',
|
||||
},
|
||||
rerankModel: {
|
||||
key: '再ランクモデル',
|
||||
tip: '再ランクモデルは、ユーザークエリとの意味的一致に基づいて候補文書リストを再配置し、意味的ランキングの結果を向上させます。',
|
||||
key: 'Rerankモデル',
|
||||
tip: 'Rerankモデルは、ユーザークエリとの意味的一致に基づいて候補文書リストを再配置し、意味的ランキングの結果を向上させます。',
|
||||
},
|
||||
apiKey: 'API-キー',
|
||||
quota: 'クォータ',
|
||||
@ -305,7 +305,7 @@ const translation = {
|
||||
tip: 'このモデルは削除されました。別のモデルを追加するか、別のモデルを選択してください。',
|
||||
emptyTip: '利用可能なモデルはありません',
|
||||
emptySetting: '設定に移動して構成してください',
|
||||
rerankTip: '再ランクモデルを設定してください',
|
||||
rerankTip: 'Rerankモデルを設定してください',
|
||||
},
|
||||
card: {
|
||||
quota: 'クォータ',
|
||||
|
@ -33,7 +33,7 @@ const translation = {
|
||||
},
|
||||
hybrid_search: {
|
||||
title: 'ハイブリッド検索',
|
||||
description: '全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するために再ランク付けを行います。再ランクモデルAPIの設定が必要です。',
|
||||
description: '全文検索とベクトル検索を同時に実行し、ユーザーのクエリに最適なマッチを選択するためにRerank付けを行います。RerankモデルAPIの設定が必要です。',
|
||||
recommend: 'おすすめ',
|
||||
},
|
||||
invertedIndex: {
|
||||
|
@ -134,7 +134,7 @@ const translation = {
|
||||
variableValue: '変数値',
|
||||
code: 'コード',
|
||||
model: 'モデル',
|
||||
rerankModel: '再ランクモデル',
|
||||
rerankModel: 'Rerankモデル',
|
||||
},
|
||||
invalidVariable: '無効な変数',
|
||||
},
|
||||
@ -296,7 +296,7 @@ const translation = {
|
||||
},
|
||||
knowledgeRetrieval: {
|
||||
queryVariable: 'クエリ変数',
|
||||
knowledge: '知識',
|
||||
knowledge: 'ナレッジ',
|
||||
outputVars: {
|
||||
output: '検索されたセグメント化されたデータ',
|
||||
content: 'セグメント化されたコンテンツ',
|
||||
|
@ -74,6 +74,8 @@ export const NOTICE_I18N = {
|
||||
'Наша система буде недоступна з 19:00 до 24:00 UTC 28 серпня для оновлення. Якщо у вас виникнуть запитання, будь ласка, зв’яжіться з нашою службою підтримки (support@dify.ai). Дякуємо за терпіння.',
|
||||
vi_VN:
|
||||
'Hệ thống của chúng tôi sẽ ngừng hoạt động từ 19:00 đến 24:00 UTC vào ngày 28 tháng 8 để nâng cấp. Nếu có thắc mắc, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi (support@dify.ai). Chúng tôi đánh giá cao sự kiên nhẫn của bạn.',
|
||||
tr_TR:
|
||||
'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.',
|
||||
},
|
||||
href: '#',
|
||||
}
|
||||
|
@ -125,6 +125,13 @@
|
||||
"prompt_name": "Hindi",
|
||||
"example": "नमस्ते, Dify!",
|
||||
"supported": "true"
|
||||
},
|
||||
{
|
||||
"value": "tr-TR",
|
||||
"name": "Türkçe",
|
||||
"prompt_name": "Türkçe",
|
||||
"example": "Selam!",
|
||||
"supported": "true"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
87
web/i18n/tr-TR/app-annotation.ts
Normal file
87
web/i18n/tr-TR/app-annotation.ts
Normal file
@ -0,0 +1,87 @@
|
||||
const translation = {
|
||||
title: 'Ek Açıklamalar',
|
||||
name: 'Ek Açıklama Yanıtı',
|
||||
editBy: '{{author}} tarafından düzenlendi',
|
||||
noData: {
|
||||
title: 'Ek açıklama yok',
|
||||
description: 'Uygulama hata ayıklaması sırasında ek açıklamaları düzenleyebilir veya yüksek kaliteli bir yanıt için burada toplu olarak ek açıklamaları içe aktarabilirsiniz.',
|
||||
},
|
||||
table: {
|
||||
header: {
|
||||
question: 'soru',
|
||||
answer: 'cevap',
|
||||
createdAt: 'oluşturulma tarihi',
|
||||
hits: 'vuruşlar',
|
||||
actions: 'aksiyonlar',
|
||||
addAnnotation: 'Ek Açıklama Ekle',
|
||||
bulkImport: 'Toplu İçe Aktarma',
|
||||
bulkExport: 'Toplu Dışa Aktarma',
|
||||
clearAll: 'Tüm Ek Açıklamaları Temizle',
|
||||
},
|
||||
},
|
||||
editModal: {
|
||||
title: 'Ek Açıklama Yanıtını Düzenle',
|
||||
queryName: 'Kullanıcı Sorgusu',
|
||||
answerName: 'Storyteller Bot',
|
||||
yourAnswer: 'Senin Cevabın',
|
||||
answerPlaceholder: 'Cevabınızı buraya yazın',
|
||||
yourQuery: 'Senin Sorgun',
|
||||
queryPlaceholder: 'Sorgunuzu buraya yazın',
|
||||
removeThisCache: 'Bu Ek Açıklamayı Kaldır',
|
||||
createdAt: 'Oluşturulma Tarihi',
|
||||
},
|
||||
addModal: {
|
||||
title: 'Ek Açıklama Yantı Ekle',
|
||||
queryName: 'Soru',
|
||||
answerName: 'Cevap',
|
||||
answerPlaceholder: 'Cevabı buraya yazın',
|
||||
queryPlaceholder: 'Sorguyu buraya yazın',
|
||||
createNext: 'Başka bir ek açıklamalı yanıt ekle',
|
||||
},
|
||||
batchModal: {
|
||||
title: 'Toplu İçe Aktarma',
|
||||
csvUploadTitle: 'CSV dosyanızı buraya sürükleyip bırakın veya ',
|
||||
browse: 'gözatın',
|
||||
tip: 'CSV dosyası aşağıdaki yapıya uygun olmalıdır:',
|
||||
question: 'soru',
|
||||
answer: 'cevap',
|
||||
contentTitle: 'içerik parçası',
|
||||
content: 'içerik',
|
||||
template: 'Şablonu buradan indir',
|
||||
cancel: 'İptal',
|
||||
run: 'Toplu İşlemi Çalıştır',
|
||||
runError: 'Toplu işlem başarısız oldu',
|
||||
processing: 'Toplu işlemde',
|
||||
completed: 'İçe aktarma tamamlandı',
|
||||
error: 'İçe Aktarma Hatası',
|
||||
ok: 'Tamam',
|
||||
},
|
||||
errorMessage: {
|
||||
answerRequired: 'Cevap gerekli',
|
||||
queryRequired: 'Soru gerekli',
|
||||
},
|
||||
viewModal: {
|
||||
annotatedResponse: 'Ek Açıklama Yanıtı',
|
||||
hitHistory: 'Vuruş Geçmişi',
|
||||
hit: 'Vuruş',
|
||||
hits: 'Vuruşlar',
|
||||
noHitHistory: 'Vuruş geçmişi yok',
|
||||
},
|
||||
hitHistoryTable: {
|
||||
query: 'Sorgu',
|
||||
match: 'Eşleşme',
|
||||
response: 'Yanıt',
|
||||
source: 'Kaynak',
|
||||
score: 'Puan',
|
||||
time: 'Zaman',
|
||||
},
|
||||
initSetup: {
|
||||
title: 'Ek Açıklama Yanıtı İlk Kurulum',
|
||||
configTitle: 'Ek Açıklama Yanıtı Ayarı',
|
||||
confirmBtn: 'Kaydet ve Etkinleştir',
|
||||
configConfirmBtn: 'Kaydet',
|
||||
},
|
||||
embeddingModelSwitchTip: 'Ek açıklama metin vektörleştirme modeli, model değiştirmek yeniden yerleştirilecek ve ek maliyetlere yol açacaktır.',
|
||||
}
|
||||
|
||||
export default translation
|
83
web/i18n/tr-TR/app-api.ts
Normal file
83
web/i18n/tr-TR/app-api.ts
Normal file
@ -0,0 +1,83 @@
|
||||
const translation = {
|
||||
apiServer: 'API Sunucusu',
|
||||
apiKey: 'API Anahtarı',
|
||||
status: 'Durum',
|
||||
disabled: 'Devre Dışı',
|
||||
ok: 'Hizmette',
|
||||
copy: 'Kopyala',
|
||||
copied: 'Kopyalandı',
|
||||
play: 'Oynat',
|
||||
pause: 'Duraklat',
|
||||
playing: 'Oynatılıyor',
|
||||
loading: 'Yükleniyor',
|
||||
merMaind: {
|
||||
rerender: 'Yeniden İşleme',
|
||||
},
|
||||
never: 'Asla',
|
||||
apiKeyModal: {
|
||||
apiSecretKey: 'API Gizli Anahtar',
|
||||
apiSecretKeyTips: 'API suiistimalini önlemek için, API Anahtarınızı koruyunuz. Ön uç kodda düz metin olarak kullanmaktan kaçının. :)',
|
||||
createNewSecretKey: 'Yeni Gizli Anahtar Oluştur',
|
||||
secretKey: 'Gizli Anahtar',
|
||||
created: 'OLUŞTURULDU',
|
||||
lastUsed: 'SON KULLANIM',
|
||||
generateTips: 'Bu anahtarı güvenli ve erişilebilir bir yerde saklayın.',
|
||||
},
|
||||
actionMsg: {
|
||||
deleteConfirmTitle: 'Bu gizli anahtarı silmek istiyor musunuz?',
|
||||
deleteConfirmTips: 'Bu işlem geri alınamaz.',
|
||||
ok: 'Tamam',
|
||||
},
|
||||
completionMode: {
|
||||
title: 'Completion Uygulama API',
|
||||
info: 'Makale, özet ve çeviri gibi yüksek kaliteli metin üretimi için, completion-messages API\'sini kullanıcı girişi ile birlikte kullanın. Metin üretimi, Dify Prompt Engineering\'de ayarlanan model parametrelerine ve prompt şablonlarına dayanır.',
|
||||
createCompletionApi: 'Completion Mesajı Oluştur',
|
||||
createCompletionApiTip: 'Soru-cevap modunu desteklemek için bir Completion Mesajı oluşturun.',
|
||||
inputsTips: '(İsteğe bağlı) Prompt Eng\'deki değişkenlere karşılık gelen kullanıcı giriş alanlarını anahtar-değer çiftleri olarak sağlayın. Anahtar, değişken adıdır, Değer ise parametre değeridir. Alan türü Select ise, gönderilen Değer önceden ayarlanmış seçeneklerden biri olmalıdır.',
|
||||
queryTips: 'Kullanıcı giriş metni içeriği.',
|
||||
blocking: 'Bloke etme tipi, yürütmenin tamamlanmasını bekleyip sonuçları döndürme. (Süreç uzun sürerse istekler kesilebilir)',
|
||||
streaming: 'Streaming döndürmeleri. SSE (Sunucu Tarafından Gönderilen Etkinlikler) tabanlı streaming döndürme uygulaması.',
|
||||
messageFeedbackApi: 'Mesaj geri bildirimi (beğeni)',
|
||||
messageFeedbackApiTip: 'Son kullanıcılar adına beğeni veya beğenmeme ile alınan mesajları değerlendirin. Bu veriler, Günlükler ve Ek Açıklamalar sayfasında görünür ve gelecekteki model ince ayarları için kullanılır.',
|
||||
messageIDTip: 'Mesaj Kimliği',
|
||||
ratingTip: 'beğeni veya beğenmeme, null geri almaktır',
|
||||
parametersApi: 'Uygulama parametre bilgilerini al',
|
||||
parametersApiTip: 'Değişken adları, alan adları, türleri ve varsayılan değerler dahil olmak üzere yapılandırılmış Giriş parametrelerini alın. Genellikle bu alanları bir formda görüntülemek veya istemci yüklendikten sonra varsayılan değerleri doldurmak için kullanılır.',
|
||||
},
|
||||
chatMode: {
|
||||
title: 'Chat Uygulama API',
|
||||
info: 'Soru-Cevap formatını kullanan çok yönlü sohbet uygulamaları için, diyalogu başlatmak üzere chat-messages API\'sini çağırın. conversation_id\'yi ileterek devam eden konuşmaları sürdürün. Yanıt parametreleri ve şablonları, Dify Prompt Engineering ayarlarına bağlıdır.',
|
||||
createChatApi: 'Sohbet mesajı oluştur',
|
||||
createChatApiTip: 'Yeni bir konuşma mesajı oluşturun veya mevcut diyaloğu devam ettirin.',
|
||||
inputsTips: '(İsteğe bağlı) Prompt Eng\'deki değişkenlere karşılık gelen kullanıcı giriş alanlarını anahtar-değer çiftleri olarak sağlayın. Anahtar, değişken adıdır, Değer ise parametre değeridir. Alan türü Select ise, gönderilen Değer önceden ayarlanmış seçeneklerden biri olmalıdır.',
|
||||
queryTips: 'Kullanıcı girişi/soru içeriği',
|
||||
blocking: 'Bloke etme tipi, yürütmenin tamamlanmasını bekleyip sonuçları döndürme. (Süreç uzun sürerse istekler kesilebilir)',
|
||||
streaming: 'Streaming döndürmeleri. SSE (Sunucu Tarafından Gönderilen Etkinlikler) tabanlı streaming döndürme uygulaması.',
|
||||
conversationIdTip: '(İsteğe bağlı) Konuşma ID: ilk konuşma için boş bırakın; diyaloğu devam ettirmek için context\'ten conversation_id\'yi iletin.',
|
||||
messageFeedbackApi: 'Mesaj son kullanıcı geri bildirimi, beğeni',
|
||||
messageFeedbackApiTip: 'Son kullanıcılar adına beğeni veya beğenmeme ile alınan mesajları değerlendirin. Bu veriler, Günlükler ve Ek Açıklamalar sayfasında görünür ve gelecekteki model ince ayarları için kullanılır.',
|
||||
messageIDTip: 'Mesaj Kimliği',
|
||||
ratingTip: 'beğeni veya beğenmeme, null geri almaktır',
|
||||
chatMsgHistoryApi: 'Sohbet geçmişi mesajı al',
|
||||
chatMsgHistoryApiTip: 'İlk sayfa en son `limit` barını döndürür ve bu ters sıradadır.',
|
||||
chatMsgHistoryConversationIdTip: 'Konuşma ID',
|
||||
chatMsgHistoryFirstId: 'Mevcut sayfadaki ilk sohbet kaydının ID\'si. Varsayılan yok.',
|
||||
chatMsgHistoryLimit: 'Bir istekte kaç sohbet döndürüleceği',
|
||||
conversationsListApi: 'Konuşma listesini al',
|
||||
conversationsListApiTip: 'Mevcut kullanıcının oturum listesini alır. Varsayılan olarak, son 20 oturum döndürülür.',
|
||||
conversationsListFirstIdTip: 'Mevcut sayfadaki son kaydın ID\'si, varsayılan yok.',
|
||||
conversationsListLimitTip: 'Bir istekte kaç sohbet döndürüleceği',
|
||||
conversationRenamingApi: 'Konuşma yeniden adlandırma',
|
||||
conversationRenamingApiTip: 'Konuşmaları yeniden adlandırın; ad, çoklu oturum istemci arayüzlerinde görüntülenir.',
|
||||
conversationRenamingNameTip: 'Yeni isim',
|
||||
parametersApi: 'Uygulama parametre bilgilerini al',
|
||||
parametersApiTip: 'Değişken adları, alan adları, türleri ve varsayılan değerler dahil olmak üzere yapılandırılmış Giriş parametrelerini alın. Genellikle bu alanları bir formda görüntülemek veya istemci yüklendikten sonra varsayılan değerleri doldurmak için kullanılır.',
|
||||
},
|
||||
develop: {
|
||||
requestBody: 'Request Body',
|
||||
pathParams: 'Path Params',
|
||||
query: 'Query',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
460
web/i18n/tr-TR/app-debug.ts
Normal file
460
web/i18n/tr-TR/app-debug.ts
Normal file
@ -0,0 +1,460 @@
|
||||
const translation = {
|
||||
pageTitle: {
|
||||
line1: 'PROMPT',
|
||||
line2: 'Engineering',
|
||||
},
|
||||
orchestrate: 'Orchestrate',
|
||||
promptMode: {
|
||||
simple: 'Tüm PROMPT\'u düzenlemek için Uzman Moduna geçin',
|
||||
advanced: 'Uzman Modu',
|
||||
switchBack: 'Geri Dön',
|
||||
advancedWarning: {
|
||||
title: 'Uzman Moduna geçtiniz ve PROMPT\'u değiştirdiğinizde, temel moda geri DÖNEMEZSİNİZ.',
|
||||
description: 'Uzman Modunda, tüm PROMPT\'u düzenleyebilirsiniz.',
|
||||
learnMore: 'Daha Fazla Bilgi',
|
||||
ok: 'Tamam',
|
||||
},
|
||||
operation: {
|
||||
addMessage: 'Mesaj Ekle',
|
||||
},
|
||||
contextMissing: 'Bağlam bileşeni eksik, promptun etkinliği iyi olmayabilir.',
|
||||
},
|
||||
operation: {
|
||||
applyConfig: 'Yayınla',
|
||||
resetConfig: 'Sıfırla',
|
||||
debugConfig: 'Hata Ayıkla',
|
||||
addFeature: 'Özellik Ekle',
|
||||
automatic: 'Oluştur',
|
||||
stopResponding: 'Yanıtlamayı Durdur',
|
||||
agree: 'beğeni',
|
||||
disagree: 'beğenmeme',
|
||||
cancelAgree: 'Beğeniyi İptal Et',
|
||||
cancelDisagree: 'Beğenmeme İptal Et',
|
||||
userAction: 'Kullanıcı',
|
||||
},
|
||||
notSetAPIKey: {
|
||||
title: 'LLM sağlayıcı anahtarı ayarlanmadı',
|
||||
trailFinished: 'Deneme süresi sona erdi',
|
||||
description: 'LLM sağlayıcı anahtarı ayarlanmadı, hata ayıklamadan önce ayarlanması gerekiyor.',
|
||||
settingBtn: 'Ayarlar\'a git',
|
||||
},
|
||||
trailUseGPT4Info: {
|
||||
title: 'Şu anda gpt-4 desteklenmiyor',
|
||||
description: 'Gpt-4 kullanmak için, lütfen API Anahtarını ayarlayın.',
|
||||
},
|
||||
feature: {
|
||||
groupChat: {
|
||||
title: 'Sohbet Geliştirme',
|
||||
description: 'Uygulamalar için ön görüşme ayarları eklemek kullanıcı deneyimini artırabilir.',
|
||||
},
|
||||
groupExperience: {
|
||||
title: 'Deneyim Geliştirme',
|
||||
},
|
||||
conversationOpener: {
|
||||
title: 'Konuşma Başlatıcı',
|
||||
description: 'Bir sohbet uygulamasında, yapay zekanın kullanıcıya aktif olarak söylediği ilk cümle genellikle bir karşılama olarak kullanılır.',
|
||||
},
|
||||
suggestedQuestionsAfterAnswer: {
|
||||
title: 'Takip Soruları',
|
||||
description: 'Sonraki soru önerilerini ayarlamak, kullanıcılara daha iyi bir sohbet deneyimi sunabilir.',
|
||||
resDes: 'Kullanıcı için 3 önerilen sonraki soru.',
|
||||
tryToAsk: 'Sormayı dene',
|
||||
},
|
||||
moreLikeThis: {
|
||||
title: 'Bunun gibi daha fazlası',
|
||||
description: 'Birden fazla metni bir kerede üretin, ardından düzenleyin ve üretmeye devam edin',
|
||||
generateNumTip: 'Her üretim seferinde üretilen metin sayısı',
|
||||
tip: 'Bu özelliği kullanmak ek token maliyetine yol açacaktır',
|
||||
},
|
||||
speechToText: {
|
||||
title: 'Sesten Metne',
|
||||
description: 'Etkinleştirildiğinde, sesli giriş kullanabilirsiniz.',
|
||||
resDes: 'Sesli giriş etkinleştirildi',
|
||||
},
|
||||
textToSpeech: {
|
||||
title: 'Metinden Sese',
|
||||
description: 'Etkinleştirildiğinde, metin sese dönüştürülebilir.',
|
||||
resDes: 'Metinden Ses dosyasına dönüştürme etkinleştirildi',
|
||||
},
|
||||
citation: {
|
||||
title: 'Alıntılar ve Atıflar',
|
||||
description: 'Etkinleştirildiğinde, oluşturulan içeriğin kaynak belgesi ve atıfta bulunulan bölümü gösterilir.',
|
||||
resDes: 'Alıntılar ve Atıflar etkinleştirildi',
|
||||
},
|
||||
annotation: {
|
||||
title: 'Ek Açıklama Yanıtı',
|
||||
description: 'Benzer kullanıcı sorularıyla öncelikli eşleşme için, yüksek kaliteli yanıtları manuel olarak önbelleğe ekleyebilirsiniz.',
|
||||
resDes: 'Ek Açıklama Yanıtı etkinleştirildi',
|
||||
scoreThreshold: {
|
||||
title: 'Skor Eşiği',
|
||||
description: 'Ek açıklama yanıtı için benzerlik eşiğini ayarlamak için kullanılır.',
|
||||
easyMatch: 'Kolay Eşleşme',
|
||||
accurateMatch: 'Doğru Eşleşme',
|
||||
},
|
||||
matchVariable: {
|
||||
title: 'Eşleşme Değişkeni',
|
||||
choosePlaceholder: 'Eşleşme değişkenini seçin',
|
||||
},
|
||||
cacheManagement: 'Ek Açıklamalar',
|
||||
cached: 'Ek Açıklamalı',
|
||||
remove: 'Kaldır',
|
||||
removeConfirm: 'Bu ek açıklamayı silmek istiyor musunuz?',
|
||||
add: 'Ek açıklama ekle',
|
||||
edit: 'Ek açıklamayı düzenle',
|
||||
},
|
||||
dataSet: {
|
||||
title: 'Bağlam',
|
||||
noData: 'Bağlam olarak Bilgi\'yi içe aktarabilirsiniz',
|
||||
words: 'Kelimeler',
|
||||
textBlocks: 'Metin Blokları',
|
||||
selectTitle: 'Referans Bilgi\'yi seçin',
|
||||
selected: 'Bilgi seçildi',
|
||||
noDataSet: 'Bilgi bulunamadı',
|
||||
toCreate: 'Oluşturmaya git',
|
||||
notSupportSelectMulti: 'Şu anda sadece bir Bilgi destekleniyor',
|
||||
queryVariable: {
|
||||
title: 'Sorgu değişkeni',
|
||||
tip: 'Bu değişken, bağlam geri alımı için sorgu girişi olarak kullanılacak ve bu değişkenin girdisiyle ilgili bağlam bilgisi elde edilecektir.',
|
||||
choosePlaceholder: 'Sorgu değişkenini seçin',
|
||||
noVar: 'Değişken yok',
|
||||
noVarTip: 'Lütfen Değişkenler bölümünde bir değişken oluşturun',
|
||||
unableToQueryDataSet: 'Bilgi sorgulanamıyor',
|
||||
unableToQueryDataSetTip: 'Bilgi başarılı bir şekilde sorgulanamıyor, lütfen bağlam bölümünde bir bağlam sorgu değişkeni seçin.',
|
||||
ok: 'Tamam',
|
||||
contextVarNotEmpty: 'Bağlam sorgu değişkeni boş olamaz',
|
||||
deleteContextVarTitle: 'Değişken "{{varName}}" silinsin mi?',
|
||||
deleteContextVarTip: 'Bu değişken bağlam sorgu değişkeni olarak ayarlanmış, kaldırılması Bilgi\'nin normal kullanımını etkileyecektir. Yine de silmek istiyorsanız, lütfen bağlam bölümünde yeniden seçin.',
|
||||
},
|
||||
},
|
||||
tools: {
|
||||
title: 'Araçlar',
|
||||
tips: 'Araçlar, kullanıcı girişi veya değişkenleri istek parametreleri olarak alarak dış verileri bağlam olarak sorgulamak için standart bir API çağrı yöntemi sağlar.',
|
||||
toolsInUse: '{{count}} araç kullanımda',
|
||||
modal: {
|
||||
title: 'Araç',
|
||||
toolType: {
|
||||
title: 'Araç Türü',
|
||||
placeholder: 'Lütfen araç türünü seçin',
|
||||
},
|
||||
name: {
|
||||
title: 'İsim',
|
||||
placeholder: 'Lütfen ismi girin',
|
||||
},
|
||||
variableName: {
|
||||
title: 'Değişken İsmi',
|
||||
placeholder: 'Lütfen değişken ismini girin',
|
||||
},
|
||||
},
|
||||
},
|
||||
conversationHistory: {
|
||||
title: 'Konuşma Geçmişi',
|
||||
description: 'Konuşma rolleri için ön ek isimler ayarlayın',
|
||||
tip: 'Konuşma Geçmişi etkin değil, lütfen promptun üst kısmında <histories> ekleyin.',
|
||||
learnMore: 'Daha fazla bilgi',
|
||||
editModal: {
|
||||
title: 'Konuşma Rol İsimlerini Düzenle',
|
||||
userPrefix: 'Kullanıcı ön eki',
|
||||
assistantPrefix: 'Asistan ön eki',
|
||||
},
|
||||
},
|
||||
toolbox: {
|
||||
title: 'ARAÇLAR',
|
||||
},
|
||||
moderation: {
|
||||
title: 'İçerik Denetimi',
|
||||
description: 'Denetim API\'sini kullanarak veya bir hassas kelime listesi oluşturarak model çıktısını güvence altına alın.',
|
||||
allEnabled: 'GİRİŞ/ÇIKIŞ İçeriği Etkin',
|
||||
inputEnabled: 'GİRİŞ İçeriği Etkin',
|
||||
outputEnabled: 'ÇIKIŞ İçeriği Etkin',
|
||||
modal: {
|
||||
title: 'İçerik denetim ayarları',
|
||||
provider: {
|
||||
title: 'Sağlayıcı',
|
||||
openai: 'OpenAI Denetim',
|
||||
openaiTip: {
|
||||
prefix: 'OpenAI Denetim, Ayarlar sayfasında yapılandırılmış bir OpenAI API anahtarı gerektirir',
|
||||
suffix: '.',
|
||||
},
|
||||
keywords: 'Anahtar Kelimeler',
|
||||
},
|
||||
keywords: {
|
||||
tip: 'Her satırda bir tane, satır sonlarıyla ayrılmış. Satır başına en fazla 100 karakter.',
|
||||
placeholder: 'Her satırda bir tane, satır sonlarıyla ayrılmış',
|
||||
line: 'Satır',
|
||||
},
|
||||
content: {
|
||||
input: 'GİRİŞ İçeriğini Denetle',
|
||||
output: 'ÇIKIŞ İçeriğini Denetle',
|
||||
preset: 'Önceden Ayarlanmış Yanıtlar',
|
||||
placeholder: 'Önceden ayarlanmış yanıt içeriği buraya',
|
||||
condition: 'GİRİŞ ve ÇIKIŞ İçeriği denetimi en az birinde etkin',
|
||||
fromApi: 'Önceden ayarlanmış yanıtlar API tarafından döndürülür',
|
||||
errorMessage: 'Önceden ayarlanmış yanıtlar boş olamaz',
|
||||
supportMarkdown: 'Markdown desteklenir',
|
||||
},
|
||||
openaiNotConfig: {
|
||||
before: 'OpenAI Denetim, Ayarlar sayfasında yapılandırılmış bir OpenAI API anahtarı gerektirir',
|
||||
after: '',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
generate: {
|
||||
title: 'Prompt Oluşturucu',
|
||||
description: 'Prompt Oluşturucu, yapılandırılan modeli kullanarak promptları daha iyi kalite ve yapı için optimize eder. Lütfen açık ve ayrıntılı talimatlar yazın.',
|
||||
tryIt: 'Deneyin',
|
||||
instruction: 'Talimatlar',
|
||||
instructionPlaceHolder: 'Açık ve belirli talimatlar yazın.',
|
||||
generate: 'Oluştur',
|
||||
resTitle: 'Oluşturulmuş Prompt',
|
||||
noDataLine1: 'Kullanım durumunuzu solda açıklayın,',
|
||||
noDataLine2: 'orkestrasyon önizlemesi burada görünecek.',
|
||||
apply: 'Uygula',
|
||||
loading: 'Uygulama orkestrasyonu yapılıyor...',
|
||||
overwriteTitle: 'Mevcut yapılandırmanın üzerine yazılsın mı?',
|
||||
overwriteMessage: 'Bu promptu uygulamak mevcut yapılandırmanın üzerine yazacaktır.',
|
||||
template: {
|
||||
pythonDebugger: {
|
||||
name: 'Python hata ayıklayıcı',
|
||||
instruction: 'Talimatlarınıza göre kod üretebilen ve hata ayıklayabilen bir bot',
|
||||
},
|
||||
translation: {
|
||||
name: 'Çeviri',
|
||||
instruction: 'Birden çok dili çevirebilen bir çevirmen',
|
||||
},
|
||||
professionalAnalyst: {
|
||||
name: 'Profesyonel analist',
|
||||
instruction: 'Uzun raporlardan içgörüleri çıkarın, riskleri belirleyin ve temel bilgileri tek bir notta özetleyin',
|
||||
},
|
||||
excelFormulaExpert: {
|
||||
name: 'Excel formül uzmanı',
|
||||
instruction: 'Kullanıcı talimatlarına dayalı olarak Excel formüllerini anlamaya, kullanmaya ve oluşturmaya yardımcı olan bir sohbet botu',
|
||||
},
|
||||
travelPlanning: {
|
||||
name: 'Seyahat planlama',
|
||||
instruction: 'Seyahat Planlama Asistanı, kullanıcıların seyahatlerini zorluk çekmeden planlamalarına yardımcı olmak için tasarlanmış akıllı bir araçtır',
|
||||
},
|
||||
SQLSorcerer: {
|
||||
name: 'SQL büyücüsü',
|
||||
instruction: 'Günlük dili SQL sorgularına dönüştürür',
|
||||
},
|
||||
GitGud: {
|
||||
name: 'Git güd',
|
||||
instruction: 'Kullanıcı tarafından açıklanan sürüm kontrol eylemlerine dayalı uygun Git komutları oluşturur',
|
||||
},
|
||||
meetingTakeaways: {
|
||||
name: 'Toplantıdan alınanlar',
|
||||
instruction: 'Toplantıları anahtar konular, önemli çıkarımlar ve eylem maddeleri dahil olmak üzere özlü özetlere ayırır',
|
||||
},
|
||||
writingsPolisher: {
|
||||
name: 'Yazma cilalayıcı',
|
||||
instruction: 'Yazılarınızı geliştirmek için ileri düzeyde kopya düzenleme teknikleri kullanır',
|
||||
},
|
||||
},
|
||||
},
|
||||
resetConfig: {
|
||||
title: 'Sıfırlamayı onaylıyor musunuz?',
|
||||
message:
|
||||
'Sıfırlama, son yayımlanan yapılandırmaya geri yükleyerek değişiklikleri atar.',
|
||||
},
|
||||
errorMessage: {
|
||||
nameOfKeyRequired: 'Anahtar adı: {{key}} gerekli',
|
||||
valueOfVarRequired: '{{key}} değeri boş olamaz',
|
||||
queryRequired: 'İstek metni gereklidir.',
|
||||
waitForResponse:
|
||||
'Önceki mesajın yanıtını tamamlamasını bekleyin.',
|
||||
waitForBatchResponse:
|
||||
'Toplu görevin yanıtını tamamlamasını bekleyin.',
|
||||
notSelectModel: 'Lütfen bir model seçin',
|
||||
waitForImgUpload: 'Lütfen görüntünün yüklenmesini bekleyin',
|
||||
},
|
||||
chatSubTitle: 'Talimatlar',
|
||||
completionSubTitle: 'Ön Prompt',
|
||||
promptTip:
|
||||
'Promptlar, yapay zekayı talimatlar ve kısıtlamalarla yönlendirir. {{input}} gibi değişkenler ekleyin. Bu prompt, kullanıcılara görünmeyecek.',
|
||||
formattingChangedTitle: 'Biçimlendirme değiştirildi',
|
||||
formattingChangedText:
|
||||
'Biçimlendirmeyi değiştirmek hata ayıklama alanını sıfırlayacaktır, emin misiniz?',
|
||||
variableTitle: 'Değişkenler',
|
||||
variableTip:
|
||||
'Kullanıcılar değişkenleri bir formda doldurur ve otomatik olarak prompt içinde değişkenler değiştirilir.',
|
||||
notSetVar: 'Değişkenler, kullanıcıların form doldururken prompt kelimelerini veya açılış ifadelerini getirmesine izin verir. Prompt kelimelerine "{{input}}" yazmayı deneyebilirsiniz.',
|
||||
autoAddVar: 'Ön promptta referans verilen tanımlanmamış değişkenler, kullanıcı giriş formunda eklemek istiyor musunuz?',
|
||||
variableTable: {
|
||||
key: 'Değişken Anahtarı',
|
||||
name: 'Kullanıcı Giriş Alanı Adı',
|
||||
optional: 'İsteğe Bağlı',
|
||||
type: 'Giriş Tipi',
|
||||
action: 'Aksiyonlar',
|
||||
typeString: 'Metin',
|
||||
typeSelect: 'Seçim',
|
||||
},
|
||||
varKeyError: {
|
||||
canNoBeEmpty: 'Değişken anahtarı boş olamaz',
|
||||
tooLong: 'Değişken anahtarı: {{key}} çok uzun. 30 karakterden uzun olamaz',
|
||||
notValid: 'Değişken anahtarı: {{key}} geçersizdir. Sadece harfler, rakamlar ve altçizgiler içerebilir',
|
||||
notStartWithNumber: 'Değişken anahtarı: {{key}} bir rakamla başlamamalıdır',
|
||||
keyAlreadyExists: 'Değişken anahtarı: {{key}} zaten mevcut',
|
||||
},
|
||||
otherError: {
|
||||
promptNoBeEmpty: 'Prompt boş olamaz',
|
||||
historyNoBeEmpty: 'Konuşma geçmişi prompt\'ta ayarlanmalıdır',
|
||||
queryNoBeEmpty: 'Sorgu prompt\'ta ayarlanmalıdır',
|
||||
},
|
||||
variableConig: {
|
||||
addModalTitle: 'Giriş Alanı Ekle',
|
||||
editModalTitle: 'Giriş Alanı Düzenle',
|
||||
description: 'Değişken ayarı {{varName}}',
|
||||
fieldType: 'Alan türü',
|
||||
string: 'Kısa Metin',
|
||||
textInput: 'Kısa Metin',
|
||||
paragraph: 'Paragraf',
|
||||
select: 'Seçim',
|
||||
number: 'Numara',
|
||||
notSet: 'Ayarlanmamış, ön promptta {{input}} yazmayı deneyin',
|
||||
stringTitle: 'Form metin kutusu seçenekleri',
|
||||
maxLength: 'En uzunluk',
|
||||
options: 'Seçenekler',
|
||||
addOption: 'Seçenek ekle',
|
||||
apiBasedVar: 'API tabanlı Değişken',
|
||||
varName: 'Değişken Adı',
|
||||
labelName: 'Etiket Adı',
|
||||
inputPlaceholder: 'Lütfen girin',
|
||||
content: 'İçerik',
|
||||
required: 'Gerekli',
|
||||
errorMsg: {
|
||||
varNameRequired: 'Değişken adı gereklidir',
|
||||
labelNameRequired: 'Etiket adı gereklidir',
|
||||
varNameCanBeRepeat: 'Değişken adı tekrar edemez',
|
||||
atLeastOneOption: 'En az bir seçenek gereklidir',
|
||||
optionRepeat: 'Yinelenen seçenekler var',
|
||||
},
|
||||
},
|
||||
vision: {
|
||||
name: 'Görüş',
|
||||
description: 'Görüş etkinleştirildiğinde modelin görüntüleri almasını ve bunlarla ilgili soruları yanıtlamasını sağlar.',
|
||||
settings: 'Ayarlar',
|
||||
visionSettings: {
|
||||
title: 'Görüş Ayarları',
|
||||
resolution: 'Çözünürlük',
|
||||
resolutionTooltip: 'Düşük çözünürlük, modelin görüntünün düşük çözünürlüklü 512 x 512 versiyonunu almasını sağlar ve görüntüyü 65 token bütçesiyle temsil eder. Bu, API\'nin daha hızlı yanıtlar dönmesini ve daha az giriş tokeni tüketmesini sağlar ve bu yüksek detay gerektirmeyen kullanım durumları için uygundur.\nYüksek çözünürlük, modelin önce düşük çözünürlüklü görüntüyü görmesini sağlar ve ardından giriş görüntüsünün boyutuna göre 512 piksel kareler olarak detaylı kırpma işlemleri gerçekleştirir. Her bir detaylı kırpma işlemi toplamda 129 token bütçesi kullanır.',
|
||||
high: 'Yüksek',
|
||||
low: 'Düşük',
|
||||
uploadMethod: 'Yükleme Yöntemi',
|
||||
both: 'Her İkisi',
|
||||
localUpload: 'Yerel Yükleme',
|
||||
url: 'URL',
|
||||
uploadLimit: 'Yükleme Limiti',
|
||||
},
|
||||
},
|
||||
voice: {
|
||||
name: 'Konuşma',
|
||||
defaultDisplay: 'Varsayılan Ses',
|
||||
description: 'Metinden sese ses ayarları',
|
||||
settings: 'Ayarlar',
|
||||
voiceSettings: {
|
||||
title: 'Ses Ayarları',
|
||||
language: 'Dil',
|
||||
resolutionTooltip: 'Metinden sese ses destek dili.',
|
||||
voice: 'Ses',
|
||||
autoPlay: 'Otomatik Oynatma',
|
||||
autoPlayEnabled: 'Açık',
|
||||
autoPlayDisabled: 'Kapalı',
|
||||
},
|
||||
},
|
||||
openingStatement: {
|
||||
title: 'Konuşma Başlatıcı',
|
||||
add: 'Ekle',
|
||||
writeOpener: 'Başlangıç mesajı yaz',
|
||||
placeholder: 'Başlangıç mesajınızı buraya yazın, değişkenler kullanabilirsiniz, örneğin {{variable}} yazmayı deneyin.',
|
||||
openingQuestion: 'Açılış Soruları',
|
||||
noDataPlaceHolder:
|
||||
'Kullanıcı ile konuşmayı başlatmak, AI\'ın konuşma uygulamalarında onlarla daha yakın bir bağlantı kurmasına yardımcı olabilir.',
|
||||
varTip: 'Değişkenler kullanabilirsiniz, örneğin {{variable}} yazmayı deneyin',
|
||||
tooShort: 'Konuşma için açılış ifadeleri oluşturmak için en az 20 kelimelik başlangıç promptu gereklidir.',
|
||||
notIncludeKey: 'Başlangıç promptu değişkeni içermiyor: {{key}}. Lütfen bunu başlangıç promptuna ekleyin.',
|
||||
},
|
||||
modelConfig: {
|
||||
model: 'Model',
|
||||
setTone: 'Yanıtların tonunu ayarla',
|
||||
title: 'Model ve Parametreler',
|
||||
modeType: {
|
||||
chat: 'Sohbet',
|
||||
completion: 'Tamamlama',
|
||||
},
|
||||
},
|
||||
inputs: {
|
||||
title: 'Hata ayıklama ve Önizleme',
|
||||
noPrompt: 'Ön prompt girişine bazı promptlar yazmayı deneyin',
|
||||
userInputField: 'Kullanıcı Giriş Alanı',
|
||||
noVar: 'Yeni bir oturum başlatıldığında prompt kelimesinde otomatik olarak değiştirilecek değişkenin değerini doldurun.',
|
||||
chatVarTip: 'Yeni bir oturum başlatıldığında prompt kelimesinde otomatik olarak değiştirilecek değişkenin değerini doldurun',
|
||||
completionVarTip: 'Her soru gönderildiğinde prompt kelimelerinde otomatik olarak değiştirilecek değişkenin değerini doldurun.',
|
||||
previewTitle: 'Prompt önizleme',
|
||||
queryTitle: 'Sorgu içeriği',
|
||||
queryPlaceholder: 'Lütfen istek metnini girin.',
|
||||
run: 'ÇALIŞTIR',
|
||||
},
|
||||
result: 'Çıktı Metni',
|
||||
datasetConfig: {
|
||||
settingTitle: 'Geri Alım Ayarları',
|
||||
knowledgeTip: 'Bilgi eklemek için “+” düğmesine tıklayın',
|
||||
retrieveOneWay: {
|
||||
title: 'N-to-1 geri alım',
|
||||
description: 'Kullanıcı niyetine ve Bilgi tanımına dayanarak, Agent en iyi Bilgi\'yi sorgulamak için özerk bir şekilde seçer. Belirgin, sınırlı Bilgi bulunan uygulamalar için en iyisidir.',
|
||||
},
|
||||
retrieveMultiWay: {
|
||||
title: 'Çoklu yol geri alım',
|
||||
description: 'Kullanıcı niyetine dayanarak, tüm Bilgilerde sorgular, çoklu kaynaklardan ilgili metni alır ve yeniden sıraladıktan sonra kullanıcı sorgusuyla eşleşen en iyi sonuçları seçer.',
|
||||
},
|
||||
rerankModelRequired: 'Rerank modeli gereklidir',
|
||||
params: 'Parametreler',
|
||||
top_k: 'En İyi K',
|
||||
top_kTip: 'Kullanıcı sorularına en çok benzeyen parçaları filtrelemek için kullanılır. Sistem ayrıca en iyi K değerini, seçilen modelin max_tokens\'a göre dinamik olarak ayarlar.',
|
||||
score_threshold: 'Skor Eşiği',
|
||||
score_thresholdTip: 'Parça filtreleme için benzerlik eşiğini ayarlamak için kullanılır.',
|
||||
retrieveChangeTip: 'Dizin modunu ve geri alım modunu değiştirmek, bu Bilgi ile ilişkili uygulamaları etkileyebilir.',
|
||||
},
|
||||
debugAsSingleModel: 'Tek Model Olarak Hata Ayıkla',
|
||||
debugAsMultipleModel: 'Çoklu Model Olarak Hata Ayıkla',
|
||||
duplicateModel: 'Çoğalt',
|
||||
publishAs: 'Olarak Yayınla',
|
||||
assistantType: {
|
||||
name: 'Asistan Türü',
|
||||
chatAssistant: {
|
||||
name: 'Temel Asistan',
|
||||
description: 'Büyük Dil Modeli kullanarak sohbet tabanlı bir asistan oluşturun',
|
||||
},
|
||||
agentAssistant: {
|
||||
name: 'Agent Asistanı',
|
||||
description: 'Görevleri tamamlamak için araçları özerk bir şekilde seçebilen bir zeki Agent oluşturun',
|
||||
},
|
||||
},
|
||||
agent: {
|
||||
agentMode: 'Agent Modu',
|
||||
agentModeDes: 'Agent için çıkarım modunu ayarlayın',
|
||||
agentModeType: {
|
||||
ReACT: 'ReAct',
|
||||
functionCall: 'Fonksiyon Çağrısı',
|
||||
},
|
||||
setting: {
|
||||
name: 'Agent Ayarları',
|
||||
description: 'Agent Asistanı ayarları, Agent modunu ve yerleşik promptlar gibi gelişmiş özellikleri ayarlamanıza olanak tanır. Sadece Agent türünde kullanılabilir.',
|
||||
maximumIterations: {
|
||||
name: 'Maksimum Yineleme',
|
||||
description: 'Bir Agent asistanının gerçekleştirebileceği yineleme sayısını sınırlayın',
|
||||
},
|
||||
},
|
||||
buildInPrompt: 'Yerleşik Prompt',
|
||||
firstPrompt: 'İlk Prompt',
|
||||
nextIteration: 'Sonraki Yineleme',
|
||||
promptPlaceholder: 'Promptunuzu buraya yazın',
|
||||
tools: {
|
||||
name: 'Araçlar',
|
||||
description: 'Araçlar kullanmak, internette arama yapmak veya bilimsel hesaplamalar yapmak gibi LLM yeteneklerini genişletebilir',
|
||||
enabled: 'Etkinleştirildi',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
91
web/i18n/tr-TR/app-log.ts
Normal file
91
web/i18n/tr-TR/app-log.ts
Normal file
@ -0,0 +1,91 @@
|
||||
const translation = {
|
||||
title: 'Günlükler',
|
||||
description: 'Günlükler, kullanıcının girdileri ve AI tepkileri dahil olmak üzere uygulamanın çalışma durumunu kaydeder.',
|
||||
dateTimeFormat: 'GG/AA/YYYY ss:dd ÖÖ/ÖS',
|
||||
table: {
|
||||
header: {
|
||||
time: 'Zaman',
|
||||
endUser: 'Son Kullanıcı',
|
||||
input: 'Girdi',
|
||||
output: 'Çıktı',
|
||||
summary: 'Başlık',
|
||||
messageCount: 'Mesaj Sayısı',
|
||||
userRate: 'Kullanıcı Puanı',
|
||||
adminRate: 'Op. Puanı',
|
||||
startTime: 'BAŞLANGIÇ ZAMANI',
|
||||
status: 'DURUM',
|
||||
runtime: 'ÇALIŞMA SÜRESİ',
|
||||
tokens: 'TOKENLAR',
|
||||
user: 'SON KULLANICI',
|
||||
version: 'VERSİYON',
|
||||
},
|
||||
pagination: {
|
||||
previous: 'Önceki',
|
||||
next: 'Sonraki',
|
||||
},
|
||||
empty: {
|
||||
noChat: 'Henüz konuşma yok',
|
||||
noOutput: 'Çıktı yok',
|
||||
element: {
|
||||
title: 'Kimse var mı?',
|
||||
content: 'Son kullanıcılar ve AI uygulamaları arasındaki etkileşimleri gözlemleyin ve açıklamalar ekleyin, böylece AI doğruluğunu sürekli olarak artırabilirsiniz. Web Uygulamasını <shareLink>paylaşmayı</shareLink> veya <testLink>kendiniz test etmeyi</testLink> deneyebilir, ardından bu sayfaya geri dönebilirsiniz.',
|
||||
},
|
||||
},
|
||||
},
|
||||
detail: {
|
||||
time: 'Zaman',
|
||||
conversationId: 'Konuşma ID',
|
||||
promptTemplate: 'Prompt Şablonu',
|
||||
promptTemplateBeforeChat: 'Sohbet Öncesi Prompt Şablonu · Sistem Mesajı Olarak',
|
||||
annotationTip: '{{user}} tarafından işaretlenen iyileştirmeler',
|
||||
timeConsuming: 'Geçen Süre',
|
||||
second: 's',
|
||||
tokenCost: 'Token harcanan',
|
||||
loading: 'yükleniyor',
|
||||
operation: {
|
||||
like: 'beğeni',
|
||||
dislike: 'beğenmeme',
|
||||
addAnnotation: 'İyileştirme Ekle',
|
||||
editAnnotation: 'İyileştirme Düzenle',
|
||||
annotationPlaceholder: 'AI\'ın yanıtlamasını istediğiniz beklenen cevabı girin, bu, model ince ayarı ve metin üretim kalitesinin sürekli iyileştirilmesi için kullanılabilir.',
|
||||
},
|
||||
variables: 'Değişkenler',
|
||||
uploadImages: 'Yüklenen Görseller',
|
||||
},
|
||||
filter: {
|
||||
period: {
|
||||
today: 'Bugün',
|
||||
last7days: 'Son 7 Gün',
|
||||
last4weeks: 'Son 4 Hafta',
|
||||
last3months: 'Son 3 Ay',
|
||||
last12months: 'Son 12 Ay',
|
||||
monthToDate: 'Ay Başlangıcından İtibaren',
|
||||
quarterToDate: 'Çeyrek Başlangıcından İtibaren',
|
||||
yearToDate: 'Yıl Başlangıcından İtibaren',
|
||||
allTime: 'Tüm Zamanlar',
|
||||
},
|
||||
annotation: {
|
||||
all: 'Hepsi',
|
||||
annotated: 'Açıklamalı İyileştirmeler ({{count}} öğe)',
|
||||
not_annotated: 'Açıklanmamış',
|
||||
},
|
||||
},
|
||||
workflowTitle: 'Workflow Günlükleri',
|
||||
workflowSubtitle: 'Günlük, Automate\'in çalışmasını kaydetmiştir.',
|
||||
runDetail: {
|
||||
title: 'Konuşma Günlüğü',
|
||||
workflowTitle: 'Günlük Detayı',
|
||||
},
|
||||
promptLog: 'Prompt Günlüğü',
|
||||
agentLog: 'Agent Günlüğü',
|
||||
viewLog: 'Günlüğü Görüntüle',
|
||||
agentLogDetail: {
|
||||
agentMode: 'Agent Modu',
|
||||
toolUsed: 'Kullanılan Araç',
|
||||
iterations: 'Yinelemeler',
|
||||
iteration: 'Yineleme',
|
||||
finalProcessing: 'Son İşleme',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
156
web/i18n/tr-TR/app-overview.ts
Normal file
156
web/i18n/tr-TR/app-overview.ts
Normal file
@ -0,0 +1,156 @@
|
||||
const translation = {
|
||||
welcome: {
|
||||
firstStepTip: 'Başlamak için,',
|
||||
enterKeyTip: 'aşağıya OpenAI API Anahtarınızı girin',
|
||||
getKeyTip: 'OpenAI kontrol panelinden API Anahtarınızı alın',
|
||||
placeholder: 'API Anahtarınız (ör. sk-xxxx)',
|
||||
},
|
||||
apiKeyInfo: {
|
||||
cloud: {
|
||||
trial: {
|
||||
title: '{{providerName}} deneme kotasını kullanıyorsunuz.',
|
||||
description: 'Deneme kotası, test amaçlarınız için sağlanmıştır. Deneme kotası bitmeden önce kendi model sağlayıcınızı ayarlayın veya ek kota satın alın.',
|
||||
},
|
||||
exhausted: {
|
||||
title: 'Deneme kotanızı kullandınız, lütfen API Anahtarınızı ayarlayın.',
|
||||
description: 'Deneme kotanızı bitirdiniz. Lütfen kendi model sağlayıcınızı ayarlayın veya ek kota satın alın.',
|
||||
},
|
||||
},
|
||||
selfHost: {
|
||||
title: {
|
||||
row1: 'Başlamak için,',
|
||||
row2: 'model sağlayıcınızı ayarlayın.',
|
||||
},
|
||||
},
|
||||
callTimes: 'Çağrı süresi',
|
||||
usedToken: 'Kullanılan token',
|
||||
setAPIBtn: 'Model sağlayıcısını ayarlamaya git',
|
||||
tryCloud: 'Veya Dify\'nin bulut sürümünü ücretsiz kotayla deneyin',
|
||||
},
|
||||
overview: {
|
||||
title: 'Genel Bakış',
|
||||
appInfo: {
|
||||
explanation: 'Kullanıma hazır AI WebApp',
|
||||
accessibleAddress: 'Genel URL',
|
||||
preview: 'Önizleme',
|
||||
regenerate: 'Yeniden Oluştur',
|
||||
regenerateNotice: 'Genel URL\'yi yeniden oluşturmak istiyor musunuz?',
|
||||
preUseReminder: 'Devam etmeden önce WebApp\'i etkinleştirin.',
|
||||
settings: {
|
||||
entry: 'Ayarlar',
|
||||
title: 'WebApp Ayarları',
|
||||
webName: 'WebApp İsmi',
|
||||
webDesc: 'WebApp Açıklaması',
|
||||
webDescTip: 'Bu metin, uygulamanın nasıl kullanılacağına dair temel açıklamalar sağlar ve istemci tarafında görüntülenir',
|
||||
webDescPlaceholder: 'WebApp\'in açıklamasını girin',
|
||||
language: 'Dil',
|
||||
workflow: {
|
||||
title: 'Workflow Adımları',
|
||||
show: 'Göster',
|
||||
hide: 'Gizle',
|
||||
},
|
||||
chatColorTheme: 'Sohbet renk teması',
|
||||
chatColorThemeDesc: 'Sohbet botunun renk temasını ayarlayın',
|
||||
chatColorThemeInverted: 'Tersine çevrilmiş',
|
||||
invalidHexMessage: 'Geçersiz hex değeri',
|
||||
more: {
|
||||
entry: 'Daha fazla ayarı göster',
|
||||
copyright: 'Telif Hakkı',
|
||||
copyRightPlaceholder: 'Yazarın veya kuruluşun adını girin',
|
||||
privacyPolicy: 'Gizlilik Politikası',
|
||||
privacyPolicyPlaceholder: 'Gizlilik politikası bağlantısını girin',
|
||||
privacyPolicyTip: 'Ziyaretçilerin uygulamanın topladığı verileri anlamalarına yardımcı olur, Dify\'nin <privacyPolicyLink>Gizlilik Politikası</privacyPolicyLink>\'na bakın.',
|
||||
customDisclaimer: 'Özel İfşa',
|
||||
customDisclaimerPlaceholder: 'Özel ifşa metnini girin',
|
||||
customDisclaimerTip: 'Özel ifşa metni istemci tarafında görüntülenecek ve uygulama hakkında ek bilgiler sağlayacak',
|
||||
},
|
||||
},
|
||||
embedded: {
|
||||
entry: 'Gömülü',
|
||||
title: 'Siteye Yerleştir',
|
||||
explanation: 'Sohbet uygulamasını web sitenize yerleştirmenin yollarını seçin',
|
||||
iframe: 'Sohbet uygulamasını web sitenizin herhangi bir yerine eklemek için bu iframe\'i HTML kodunuza ekleyin.',
|
||||
scripts: 'Sohbet uygulamasını web sitenizin sağ alt köşesine eklemek için bu kodu HTML\'e ekleyin.',
|
||||
chromePlugin: 'Dify Chatbot Chrome Eklentisini Yükleyin',
|
||||
copied: 'Kopyalandı',
|
||||
copy: 'Kopyala',
|
||||
},
|
||||
qrcode: {
|
||||
title: 'Bağlantı QR Kodu',
|
||||
scan: 'Paylaşmak İçin Taramak',
|
||||
download: 'QR Kodu İndir',
|
||||
},
|
||||
customize: {
|
||||
way: 'yol',
|
||||
entry: 'Özelleştir',
|
||||
title: 'AI WebApp\'i Özelleştirin',
|
||||
explanation: 'Web Uygulamasının ön yüzünü senaryo ve stil ihtiyaçlarınıza uygun şekilde özelleştirebilirsiniz.',
|
||||
way1: {
|
||||
name: 'İstemci kodunu forklayarak değiştirin ve Vercel\'e dağıtın (önerilen)',
|
||||
step1: 'İstemci kodunu forklayarak değiştirin',
|
||||
step1Tip: 'Kaynak kodunu GitHub hesabınıza forklayarak değiştirmek için buraya tıklayın',
|
||||
step1Operation: 'Dify-WebClient',
|
||||
step2: 'Vercel\'e dağıtın',
|
||||
step2Tip: 'Depoyu Vercel\'e içe aktarmak ve dağıtmak için buraya tıklayın',
|
||||
step2Operation: 'Depo içe aktar',
|
||||
step3: 'Çevresel değişkenleri yapılandırın',
|
||||
step3Tip: 'Vercel\'de aşağıdaki çevresel değişkenleri ekleyin',
|
||||
},
|
||||
way2: {
|
||||
name: 'İstemci kodunu yazarak API\'yi çağırın ve bir sunucuya dağıtın',
|
||||
operation: 'Dokümantasyon',
|
||||
},
|
||||
},
|
||||
},
|
||||
apiInfo: {
|
||||
title: 'Arka Uç Servis API\'si',
|
||||
explanation: 'Kolayca uygulamanıza entegre edin',
|
||||
accessibleAddress: 'Servis API Uç Noktası',
|
||||
doc: 'API Referansı',
|
||||
},
|
||||
status: {
|
||||
running: 'Hizmette',
|
||||
disable: 'Devre Dışı',
|
||||
},
|
||||
},
|
||||
analysis: {
|
||||
title: 'Analiz',
|
||||
ms: 'ms',
|
||||
tokenPS: 'Token/s',
|
||||
totalMessages: {
|
||||
title: 'Toplam Mesajlar',
|
||||
explanation: 'Günlük AI etkileşim sayısı; prompt mühendisliği/hata ayıklama hariç.',
|
||||
},
|
||||
activeUsers: {
|
||||
title: 'Aktif Kullanıcılar',
|
||||
explanation: 'AI ile Soru-Cevap etkileşiminde bulunan benzersiz kullanıcılar; prompt mühendisliği/hata ayıklama hariç.',
|
||||
},
|
||||
tokenUsage: {
|
||||
title: 'Token Kullanımı',
|
||||
explanation: 'Uygulama için dil modelinin günlük token kullanımını yansıtır, maliyet kontrolü amacıyla faydalıdır.',
|
||||
consumed: 'Tüketilen',
|
||||
},
|
||||
avgSessionInteractions: {
|
||||
title: 'Ort. Oturum Etkileşimleri',
|
||||
explanation: 'Sohbete dayalı uygulamalar için sürekli kullanıcı-AI iletişim sayısı.',
|
||||
},
|
||||
avgUserInteractions: {
|
||||
title: 'Ort. Kullanıcı Etkileşimleri',
|
||||
explanation: 'Kullanıcıların günlük kullanım sıklığını yansıtır. Bu metrik, kullanıcı bağlılığını yansıtır.',
|
||||
},
|
||||
userSatisfactionRate: {
|
||||
title: 'Kullanıcı Memnuniyet Oranı',
|
||||
explanation: 'Her 1.000 mesajda alınan beğeni sayısı. Bu, kullanıcıların çok memnun olduğu cevapların oranını gösterir.',
|
||||
},
|
||||
avgResponseTime: {
|
||||
title: 'Ort. Yanıt Süresi',
|
||||
explanation: 'Metin tabanlı uygulamalar için AI\'ın işlem/yanıt süresi (ms).',
|
||||
},
|
||||
tps: {
|
||||
title: 'Token Çıktı Hızı',
|
||||
explanation: 'LLM\'nin performansını ölçün. İstekten çıktının tamamlanmasına kadar LLM\'nin Token çıktı hızını sayın.',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
126
web/i18n/tr-TR/app.ts
Normal file
126
web/i18n/tr-TR/app.ts
Normal file
@ -0,0 +1,126 @@
|
||||
const translation = {
|
||||
createApp: 'UYGULAMA OLUŞTUR',
|
||||
types: {
|
||||
all: 'Hepsi',
|
||||
chatbot: 'Chatbot',
|
||||
agent: 'Agent',
|
||||
workflow: 'Workflow',
|
||||
completion: 'Tamamlama',
|
||||
},
|
||||
duplicate: 'Çoğalt',
|
||||
duplicateTitle: 'Uygulamayı Çoğalt',
|
||||
export: 'DSL Dışa Aktar',
|
||||
exportFailed: 'DSL dışa aktarımı başarısız oldu.',
|
||||
importDSL: 'DSL dosyasını içe aktar',
|
||||
createFromConfigFile: 'DSL dosyasından oluştur',
|
||||
importFromDSL: 'DSL içe aktar',
|
||||
importFromDSLFile: 'DSL dosyasından',
|
||||
importFromDSLUrl: 'URL\'den',
|
||||
importFromDSLUrlPlaceholder: 'DSL bağlantısını buraya yapıştır',
|
||||
deleteAppConfirmTitle: 'Bu uygulamayı silmek istiyor musunuz?',
|
||||
deleteAppConfirmContent: 'Uygulamanın silinmesi geri alınamaz. Kullanıcılar artık uygulamanıza erişemeyecek ve tüm prompt yapılandırmaları ile loglar kalıcı olarak silinecektir.',
|
||||
appDeleted: 'Uygulama silindi',
|
||||
appDeleteFailed: 'Uygulama silinemedi',
|
||||
join: 'Topluluğa katıl',
|
||||
communityIntro: 'Farklı kanallarda takım üyeleri, katkıda bulunanlar ve geliştiricilerle tartışın.',
|
||||
roadmap: 'Yol haritamızı görün',
|
||||
newApp: {
|
||||
startFromBlank: 'Boş Oluştur',
|
||||
startFromTemplate: 'Şablondan Oluştur',
|
||||
captionAppType: 'Ne tür bir uygulama oluşturmak istiyorsunuz?',
|
||||
chatbotDescription: 'Sohbete dayalı bir uygulama oluşturun. Bu uygulama, çoklu turlar halinde sürekli konuşmaya izin veren bir soru-cevap formatı kullanır.',
|
||||
completionDescription: 'Prompt temelinde yüksek kaliteli metinler üreten bir uygulama oluşturun, örneğin makaleler, özetler, çeviriler ve daha fazlasını oluşturmak için.',
|
||||
completionWarning: 'Bu tür bir uygulama artık desteklenmeyecek.',
|
||||
agentDescription: 'Görevleri tamamlamak için araçları bağımsız olarak seçebilen bir zeki Agent oluşturun',
|
||||
workflowDescription: 'Yüksek derecede özelleştirilebilir bir workflow ile yüksek kaliteli metinler üreten bir uygulama oluşturun. Deneyimli kullanıcılar için uygundur.',
|
||||
workflowWarning: 'Şu anda beta aşamasında',
|
||||
chatbotType: 'Chatbot düzenleme yöntemi',
|
||||
basic: 'Temel',
|
||||
basicTip: 'Yeni başlayanlar için, daha sonra Chatflow\'a geçilebilir',
|
||||
basicFor: 'YENİ BAŞLAYANLAR İÇİN',
|
||||
basicDescription: 'Temel Orkestrasyon, yerleşik promptları değiştirme yeteneği olmadan, basit ayarlarla bir Chatbot uygulamasının orkestrasyonuna olanak tanır. Yeni başlayanlar için uygundur.',
|
||||
advanced: 'Chatflow',
|
||||
advancedFor: 'Gelişmiş kullanıcılar için',
|
||||
advancedDescription: 'Workflow Orkestrasyonu, yerleşik promptları düzenleme yeteneği de dahil olmak üzere yüksek derecede özelleştirme sunarak Chatbotları workflow formunda düzenler. Deneyimli kullanıcılar için uygundur.',
|
||||
captionName: 'Uygulama simgesi & ismi',
|
||||
appNamePlaceholder: 'Uygulamanıza bir isim verin',
|
||||
captionDescription: 'Açıklama',
|
||||
appDescriptionPlaceholder: 'Uygulamanın açıklamasını girin',
|
||||
useTemplate: 'Bu şablonu kullan',
|
||||
previewDemo: 'Önizleme demosu',
|
||||
chatApp: 'Asistan',
|
||||
chatAppIntro: 'Sohbete dayalı bir uygulama oluşturmak istiyorum. Bu uygulama, çoklu turlar halinde sürekli konuşmaya izin veren bir soru-cevap formatı kullanır.',
|
||||
agentAssistant: 'Yeni Agent Asistanı',
|
||||
completeApp: 'Metin Üretici',
|
||||
completeAppIntro: 'Promptlara dayalı olarak yüksek kaliteli metinler üreten bir uygulama oluşturmak istiyorum, örneğin makaleler, özetler, çeviriler ve daha fazlasını oluşturmak için.',
|
||||
showTemplates: 'Bir şablondan seçmek istiyorum',
|
||||
hideTemplates: 'Mod seçim ekranına geri dön',
|
||||
Create: 'Oluştur',
|
||||
Cancel: 'İptal',
|
||||
nameNotEmpty: 'İsim boş olamaz',
|
||||
appTemplateNotSelected: 'Lütfen bir şablon seçin',
|
||||
appTypeRequired: 'Lütfen bir uygulama türü seçin',
|
||||
appCreated: 'Uygulama oluşturuldu',
|
||||
appCreateFailed: 'Uygulama oluşturulamadı',
|
||||
},
|
||||
editApp: 'Bilgileri Düzenle',
|
||||
editAppTitle: 'Uygulama Bilgilerini Düzenle',
|
||||
editDone: 'Uygulama bilgileri güncellendi',
|
||||
editFailed: 'Uygulama bilgileri güncellenemedi',
|
||||
emoji: {
|
||||
ok: 'Tamam',
|
||||
cancel: 'İptal',
|
||||
},
|
||||
switch: 'Workflow Orkestrasyonuna Geç',
|
||||
switchTipStart: 'Sizin için yeni bir uygulama kopyası oluşturulacak ve yeni kopya Workflow Orkestrasyonuna geçecektir. Yeni kopya ',
|
||||
switchTip: 'izin vermeyecek',
|
||||
switchTipEnd: ' Temel Orkestrasyona geri dönmek.',
|
||||
switchLabel: 'Oluşturulacak uygulama kopyası',
|
||||
removeOriginal: 'Orijinal uygulamayı sil',
|
||||
switchStart: 'Geçişi Başlat',
|
||||
typeSelector: {
|
||||
all: 'ALL Types',
|
||||
chatbot: 'Chatbot',
|
||||
agent: 'Agent',
|
||||
workflow: 'Workflow',
|
||||
completion: 'Completion',
|
||||
},
|
||||
tracing: {
|
||||
title: 'Uygulama performansını izleme',
|
||||
description: 'Üçüncü taraf LLMOps sağlayıcısını yapılandırma ve uygulama performansını izleme.',
|
||||
config: 'Yapılandırma',
|
||||
collapse: 'Daralt',
|
||||
expand: 'Genişlet',
|
||||
tracing: 'İzleme',
|
||||
disabled: 'Devre Dışı',
|
||||
disabledTip: 'Lütfen önce sağlayıcıyı yapılandırın',
|
||||
enabled: 'Hizmette',
|
||||
tracingDescription: 'Uygulama yürütmesinin tam bağlamını, LLM çağrıları, bağlam, promptlar, HTTP istekleri ve daha fazlası dahil olmak üzere üçüncü taraf izleme platformuna yakalama.',
|
||||
configProviderTitle: {
|
||||
configured: 'Yapılandırıldı',
|
||||
notConfigured: 'İzlemeyi etkinleştirmek için sağlayıcıyı yapılandırın',
|
||||
moreProvider: 'Daha Fazla Sağlayıcı',
|
||||
},
|
||||
langsmith: {
|
||||
title: 'LangSmith',
|
||||
description: 'LLM destekli uygulama yaşam döngüsünün her adımı için her şeyi kapsayan bir geliştirici platformu.',
|
||||
},
|
||||
langfuse: {
|
||||
title: 'Langfuse',
|
||||
description: 'LLM uygulamanızı hata ayıklamak ve geliştirmek için izlemeler, değerlendirmeler, prompt yönetimi ve metrikler.',
|
||||
},
|
||||
inUse: 'Kullanımda',
|
||||
configProvider: {
|
||||
title: 'Yapılandırma',
|
||||
placeholder: '{{key}} bilgilerinizi girin',
|
||||
project: 'Proje',
|
||||
publicKey: 'Genel Anahtar',
|
||||
secretKey: 'Gizli Anahtar',
|
||||
viewDocsLink: '{{key}} dökümanlarını görüntüle',
|
||||
removeConfirmTitle: '{{key}} yapılandırmasını kaldır?',
|
||||
removeConfirmContent: 'Mevcut yapılandırma kullanımda, kaldırılması İzleme özelliğini kapatacaktır.',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
118
web/i18n/tr-TR/billing.ts
Normal file
118
web/i18n/tr-TR/billing.ts
Normal file
@ -0,0 +1,118 @@
|
||||
const translation = {
|
||||
currentPlan: 'Mevcut Plan',
|
||||
upgradeBtn: {
|
||||
plain: 'Planı Yükselt',
|
||||
encourage: 'Şimdi Yükselt',
|
||||
encourageShort: 'Yükselt',
|
||||
},
|
||||
viewBilling: 'Faturalandırma ve abonelikleri yönet',
|
||||
buyPermissionDeniedTip: 'Abone olmak için lütfen işletme yöneticinize başvurun',
|
||||
plansCommon: {
|
||||
title: 'Size uygun bir plan seçin',
|
||||
yearlyTip: 'Yıllık abonelikle 2 ay ücretsiz!',
|
||||
mostPopular: 'En Popüler',
|
||||
planRange: {
|
||||
monthly: 'Aylık',
|
||||
yearly: 'Yıllık',
|
||||
},
|
||||
month: 'ay',
|
||||
year: 'yıl',
|
||||
save: 'Tasarruf et ',
|
||||
free: 'Ücretsiz',
|
||||
currentPlan: 'Mevcut Plan',
|
||||
contractSales: 'Satışla iletişime geçin',
|
||||
contractOwner: 'Takım yöneticisine başvurun',
|
||||
startForFree: 'Ücretsiz Başla',
|
||||
getStartedWith: 'ile başlayın',
|
||||
contactSales: 'Satışlarla İletişime Geçin',
|
||||
talkToSales: 'Satışlarla Konuşun',
|
||||
modelProviders: 'Model Sağlayıcılar',
|
||||
teamMembers: 'Takım Üyeleri',
|
||||
annotationQuota: 'Ek Açıklama Kotası',
|
||||
buildApps: 'Uygulamalar Oluştur',
|
||||
vectorSpace: 'Vektör Alanı',
|
||||
vectorSpaceBillingTooltip: 'Her 1MB yaklaşık 1.2 milyon karakter vektörize veri depolayabilir (OpenAI Embeddings ile tahmin edilmiştir, modellere göre farklılık gösterebilir).',
|
||||
vectorSpaceTooltip: 'Vektör Alanı, LLM\'lerin verilerinizi anlaması için gerekli uzun süreli hafıza sistemidir.',
|
||||
documentsUploadQuota: 'Doküman Yükleme Kotası',
|
||||
documentProcessingPriority: 'Doküman İşleme Önceliği',
|
||||
documentProcessingPriorityTip: 'Daha yüksek doküman işleme önceliği için planınızı yükseltin.',
|
||||
documentProcessingPriorityUpgrade: 'Daha fazla veriyi daha yüksek doğrulukla ve daha hızlı işleyin.',
|
||||
priority: {
|
||||
'standard': 'Standart',
|
||||
'priority': 'Öncelikli',
|
||||
'top-priority': 'En Öncelikli',
|
||||
},
|
||||
logsHistory: 'Günlük Geçmişi',
|
||||
customTools: 'Özel Araçlar',
|
||||
unavailable: 'Mevcut Değil',
|
||||
days: 'gün',
|
||||
unlimited: 'Sınırsız',
|
||||
support: 'Destek',
|
||||
supportItems: {
|
||||
communityForums: 'Topluluk forumları',
|
||||
emailSupport: 'E-posta desteği',
|
||||
priorityEmail: 'Öncelikli e-posta ve sohbet desteği',
|
||||
logoChange: 'Logo değişikliği',
|
||||
SSOAuthentication: 'SSO kimlik doğrulama',
|
||||
personalizedSupport: 'Kişiselleştirilmiş destek',
|
||||
dedicatedAPISupport: 'Özel API desteği',
|
||||
customIntegration: 'Özel entegrasyon ve destek',
|
||||
ragAPIRequest: 'RAG API Talepleri',
|
||||
bulkUpload: 'Toplu doküman yükleme',
|
||||
agentMode: 'Agent Modu',
|
||||
workflow: 'Workflow',
|
||||
llmLoadingBalancing: 'LLM Yük Dengeleme',
|
||||
llmLoadingBalancingTooltip: 'Modellere birden fazla API anahtarı ekleyin, API hız sınırlarını etkili bir şekilde aşın.',
|
||||
},
|
||||
comingSoon: 'Yakında geliyor',
|
||||
member: 'Üye',
|
||||
memberAfter: 'Üye',
|
||||
messageRequest: {
|
||||
title: 'Mesaj Kredileri',
|
||||
tooltip: 'OpenAI modellerini (gpt4 hariç) kullanarak çeşitli planlar için mesaj çağrı kotaları. Limitin üzerindeki mesajlar OpenAI API Anahtarınızı kullanır.',
|
||||
},
|
||||
annotatedResponse: {
|
||||
title: 'Ek Açıklama Kota Sınırları',
|
||||
tooltip: 'Yanıtların elle düzenlenmesi ve ek açıklanması, uygulamalar için özelleştirilebilir yüksek kaliteli soru-cevap yetenekleri sağlar. (Sadece sohbet uygulamalarında geçerlidir)',
|
||||
},
|
||||
ragAPIRequestTooltip: 'Dify\'nin sadece bilgi tabanı işleme yeteneklerini çağıran API çağrıları sayısını ifade eder.',
|
||||
receiptInfo: 'Sadece takım sahibi ve takım yöneticisi abone olabilir ve faturalandırma bilgilerini görüntüleyebilir',
|
||||
},
|
||||
plans: {
|
||||
sandbox: {
|
||||
name: 'Sandbox',
|
||||
description: '200 kez GPT ücretsiz deneme',
|
||||
includesTitle: 'İçerdikleri:',
|
||||
},
|
||||
professional: {
|
||||
name: 'Profesyonel',
|
||||
description: 'Bireyler ve küçük takımlar için daha fazla güç açın.',
|
||||
includesTitle: 'Ücretsiz plandaki her şey, artı:',
|
||||
},
|
||||
team: {
|
||||
name: 'Takım',
|
||||
description: 'Sınırsız işbirliği ve en üst düzey performans.',
|
||||
includesTitle: 'Profesyonel plandaki her şey, artı:',
|
||||
},
|
||||
enterprise: {
|
||||
name: 'Kurumsal',
|
||||
description: 'Büyük ölçekli kritik sistemler için tam yetenekler ve destek.',
|
||||
includesTitle: 'Takım plandaki her şey, artı:',
|
||||
},
|
||||
},
|
||||
vectorSpace: {
|
||||
fullTip: 'Vektör Alanı dolu.',
|
||||
fullSolution: 'Daha fazla alan için planınızı yükseltin.',
|
||||
},
|
||||
apps: {
|
||||
fullTipLine1: 'Daha fazla uygulama oluşturmak için',
|
||||
fullTipLine2: 'planınızı yükseltin.',
|
||||
},
|
||||
annotatedResponse: {
|
||||
fullTipLine1: 'Daha fazla konuşmayı açıklamak için',
|
||||
fullTipLine2: 'planınızı yükseltin.',
|
||||
quotaTitle: 'Ek Açıklama Yanıtı Kotası',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
572
web/i18n/tr-TR/common.ts
Normal file
572
web/i18n/tr-TR/common.ts
Normal file
@ -0,0 +1,572 @@
|
||||
const translation = {
|
||||
api: {
|
||||
success: 'Başarılı',
|
||||
actionSuccess: 'İşlem başarılı',
|
||||
saved: 'Kaydedildi',
|
||||
create: 'Oluşturuldu',
|
||||
remove: 'Kaldırıldı',
|
||||
},
|
||||
operation: {
|
||||
create: 'Oluştur',
|
||||
confirm: 'Onayla',
|
||||
cancel: 'İptal',
|
||||
clear: 'Temizle',
|
||||
save: 'Kaydet',
|
||||
saveAndEnable: 'Kaydet ve Etkinleştir',
|
||||
edit: 'Düzenle',
|
||||
add: 'Ekle',
|
||||
added: 'Eklendi',
|
||||
refresh: 'Yeniden Başlat',
|
||||
reset: 'Sıfırla',
|
||||
search: 'Ara',
|
||||
change: 'Değiştir',
|
||||
remove: 'Kaldır',
|
||||
send: 'Gönder',
|
||||
copy: 'Kopyala',
|
||||
lineBreak: 'Satır sonu',
|
||||
sure: 'Eminim',
|
||||
download: 'İndir',
|
||||
delete: 'Sil',
|
||||
settings: 'Ayarlar',
|
||||
setup: 'Kurulum',
|
||||
getForFree: 'Ücretsiz edinin',
|
||||
reload: 'Yeniden Yükle',
|
||||
ok: 'Tamam',
|
||||
log: 'log',
|
||||
learnMore: 'Daha Fazla Bilgi',
|
||||
params: 'Parametreler',
|
||||
duplicate: 'Çoğalt',
|
||||
rename: 'Yeniden Adlandır',
|
||||
},
|
||||
errorMsg: {
|
||||
fieldRequired: '{{field}} gereklidir',
|
||||
urlError: 'URL http:// veya https:// ile başlamalıdır',
|
||||
},
|
||||
placeholder: {
|
||||
input: 'Lütfen girin',
|
||||
select: 'Lütfen seçin',
|
||||
},
|
||||
voice: {
|
||||
language: {
|
||||
zhHans: 'Chinese',
|
||||
zhHant: 'Traditional Chinese',
|
||||
enUS: 'English',
|
||||
deDE: 'German',
|
||||
frFR: 'French',
|
||||
esES: 'Spanish',
|
||||
itIT: 'Italian',
|
||||
thTH: 'Thai.',
|
||||
idID: 'Indonesian',
|
||||
jaJP: 'Japanese',
|
||||
koKR: 'Korean',
|
||||
ptBR: 'Portuguese',
|
||||
ruRU: 'Russian',
|
||||
ukUA: 'Ukrainian',
|
||||
viVN: 'Vietnamese',
|
||||
plPL: 'Polish',
|
||||
},
|
||||
},
|
||||
unit: {
|
||||
char: 'karakter',
|
||||
},
|
||||
actionMsg: {
|
||||
noModification: 'Şu an için değişiklik yok.',
|
||||
modifiedSuccessfully: 'Başarıyla değiştirildi',
|
||||
modifiedUnsuccessfully: 'Değiştirme başarısız oldu',
|
||||
copySuccessfully: 'Başarıyla kopyalandı',
|
||||
paySucceeded: 'Ödeme başarılı oldu',
|
||||
payCancelled: 'Ödeme iptal edildi',
|
||||
generatedSuccessfully: 'Başarıyla oluşturuldu',
|
||||
generatedUnsuccessfully: 'Oluşturma başarısız oldu',
|
||||
},
|
||||
model: {
|
||||
params: {
|
||||
temperature: 'Sıcaklık',
|
||||
temperatureTip:
|
||||
'Rastgeleliği kontrol eder: Sıcaklık düştükçe daha az rastgele tamamlamalar gerçekleşir. Sıcaklık sıfıra yaklaştıkça model deterministik ve tekrarlı hale gelir.',
|
||||
top_p: 'Top P',
|
||||
top_pTip:
|
||||
'Çeşitliliği nucleus örnekleme ile kontrol eder: 0.5, tüm olasılık ağırlıklı seçeneklerin yarısının dikkate alındığı anlamına gelir.',
|
||||
presence_penalty: 'Varlık cezası',
|
||||
presence_penaltyTip:
|
||||
'Şimdiye kadar metinde görünüp görünmediğine bağlı olarak yeni tokenları ne kadar cezalandıracağını belirler.\nModelin yeni konular hakkında konuşma olasılığını artırır.',
|
||||
frequency_penalty: 'Frekans cezası',
|
||||
frequency_penaltyTip:
|
||||
'Mevcut metindeki frekanslarına göre yeni tokenları ne kadar cezalandıracağını belirler.\nModelin aynı satırı aynen tekrarlama olasılığını azaltır.',
|
||||
max_tokens: 'Maksimum token',
|
||||
max_tokensTip:
|
||||
'Yanıtın maksimum uzunluğunu token cinsinden sınırlar.\nDaha büyük değerler prompt kelimeleri, sohbet kayıtları ve Bilgiler için bırakılacak alanı sınırlayabilir. \nİki üçün altında ayarlanması önerilir\ngpt-4-1106-preview, gpt-4-vision-preview maksimum token (giriş 128k, çıkış 4k).',
|
||||
maxTokenSettingTip: 'Maksimum token ayarınız yüksek, bu da promptlar, sorgular ve veriler için alanı sınırlayabilir. Bu değeri 2/3\'ün altında ayarlamayı düşünün.',
|
||||
setToCurrentModelMaxTokenTip: 'Maksimum token, mevcut modelin maksimum token\'ın %80\'ine {maxToken} olarak güncellendi.',
|
||||
stop_sequences: 'Stop sıraları',
|
||||
stop_sequencesTip: 'API, dört adede kadar sıra belirleyerek daha fazla token üretmeyi durduracaktır. Dönülen metin durdurma sırasını içermez.',
|
||||
stop_sequencesPlaceholder: 'Sıra girin ve Tab tuşuna basın',
|
||||
},
|
||||
tone: {
|
||||
Creative: 'Yaratıcı',
|
||||
Balanced: 'Dengeli',
|
||||
Precise: 'Kesin',
|
||||
Custom: 'Özel',
|
||||
},
|
||||
addMoreModel: 'Daha fazla model eklemek için ayarlara gidin',
|
||||
},
|
||||
menus: {
|
||||
status: 'beta',
|
||||
explore: 'Keşfet',
|
||||
apps: 'Studio',
|
||||
plugins: 'Eklentiler',
|
||||
pluginsTips: 'Üçüncü taraf eklentileri entegre edin veya ChatGPT uyumlu AI-Eklentileri oluşturun.',
|
||||
datasets: 'Bilgi',
|
||||
datasetsTips: 'YAKINDA: Kendi metin verilerinizi içe aktarın veya LLM bağlamını geliştirmek için Webhook aracılığıyla gerçek zamanlı veri yazın.',
|
||||
newApp: 'Yeni Uygulama',
|
||||
newDataset: 'Bilgi Oluştur',
|
||||
tools: 'Araçlar',
|
||||
},
|
||||
userProfile: {
|
||||
settings: 'Ayarlar',
|
||||
emailSupport: 'E-posta Desteği',
|
||||
workspace: 'Çalışma Alanı',
|
||||
createWorkspace: 'Çalışma Alanı Oluştur',
|
||||
helpCenter: 'Yardım',
|
||||
roadmapAndFeedback: 'Geri Bildirim',
|
||||
community: 'Topluluk',
|
||||
about: 'Hakkında',
|
||||
logout: 'Çıkış Yap',
|
||||
},
|
||||
settings: {
|
||||
accountGroup: 'HESAP',
|
||||
workplaceGroup: 'ÇALIŞMA ALANI',
|
||||
account: 'Hesabım',
|
||||
members: 'Üyeler',
|
||||
billing: 'Faturalandırma',
|
||||
integrations: 'Entegrasyonlar',
|
||||
language: 'Dil',
|
||||
provider: 'Model Sağlayıcı',
|
||||
dataSource: 'Veri Kaynağı',
|
||||
plugin: 'Eklentiler',
|
||||
apiBasedExtension: 'API Uzantısı',
|
||||
},
|
||||
account: {
|
||||
avatar: 'Avatar',
|
||||
name: 'İsim',
|
||||
email: 'E-posta',
|
||||
password: 'Şifre',
|
||||
passwordTip: 'Geçici giriş kodlarını kullanmak istemiyorsanız kalıcı bir şifre ayarlayabilirsiniz',
|
||||
setPassword: 'Şifre Ayarla',
|
||||
resetPassword: 'Şifreyi Sıfırla',
|
||||
currentPassword: 'Mevcut şifre',
|
||||
newPassword: 'Yeni şifre',
|
||||
confirmPassword: 'Şifreyi onayla',
|
||||
notEqual: 'İki şifre aynı değil.',
|
||||
langGeniusAccount: 'Dify hesabı',
|
||||
langGeniusAccountTip: 'Dify hesabınız ve ilişkili kullanıcı verileri.',
|
||||
editName: 'İsmi Düzenle',
|
||||
showAppLength: '{{length}} uygulamayı göster',
|
||||
delete: 'Hesabı Sil',
|
||||
deleteTip: 'Hesabınızı silmek tüm verilerinizi kalıcı olarak siler ve geri alınamaz.',
|
||||
deleteConfirmTip: 'Onaylamak için, kayıtlı e-postanızdan şu adrese e-posta gönderin: ',
|
||||
},
|
||||
members: {
|
||||
team: 'Takım',
|
||||
invite: 'Ekle',
|
||||
name: 'İSİM',
|
||||
lastActive: 'SON AKTİF',
|
||||
role: 'ROLLER',
|
||||
pending: 'Beklemede...',
|
||||
owner: 'Sahibi',
|
||||
admin: 'Yönetici',
|
||||
adminTip: 'Uygulama oluşturabilir ve takım ayarlarını yönetebilir',
|
||||
normal: 'Normal',
|
||||
normalTip: 'Sadece uygulamaları kullanabilir, uygulama oluşturamaz',
|
||||
builder: 'Oluşturucu',
|
||||
builderTip: 'Kendi uygulamalarını oluşturup düzenleyebilir',
|
||||
editor: 'Editör',
|
||||
editorTip: 'Uygulama oluşturabilir ve düzenleyebilir',
|
||||
datasetOperator: 'Bilgi Yöneticisi',
|
||||
datasetOperatorTip: 'Sadece bilgi tabanını yönetebilir',
|
||||
inviteTeamMember: 'Takım Üyesi Ekle',
|
||||
inviteTeamMemberTip: 'Giriş yaptıktan sonra takım verilerinize doğrudan erişebilirler.',
|
||||
email: 'E-posta',
|
||||
emailInvalid: 'Geçersiz E-posta Formatı',
|
||||
emailPlaceholder: 'Lütfen e-postaları girin',
|
||||
sendInvite: 'Davet Gönder',
|
||||
invitedAsRole: '{{role}} kullanıcısı olarak davet edildi',
|
||||
invitationSent: 'Davet gönderildi',
|
||||
invitationSentTip: 'Davet gönderildi, Dify\'ye giriş yaparak takım verilerinize erişebilirler.',
|
||||
invitationLink: 'Davet Linki',
|
||||
failedinvitationEmails: 'Aşağıdaki kullanıcılar başarıyla davet edilmedi',
|
||||
ok: 'Tamam',
|
||||
removeFromTeam: 'Takımdan Kaldır',
|
||||
removeFromTeamTip: 'Takım erişimi kaldırılacak',
|
||||
setAdmin: 'Yönetici olarak ayarla',
|
||||
setMember: 'Normal üye olarak ayarla',
|
||||
setBuilder: 'Oluşturucu olarak ayarla',
|
||||
setEditor: 'Editör olarak ayarla',
|
||||
disinvite: 'Davetiyeyi iptal et',
|
||||
deleteMember: 'Üyeyi Sil',
|
||||
you: '(Siz)',
|
||||
},
|
||||
integrations: {
|
||||
connected: 'Bağlandı',
|
||||
google: 'Google',
|
||||
googleAccount: 'Google hesabıyla giriş yap',
|
||||
github: 'GitHub',
|
||||
githubAccount: 'GitHub hesabıyla giriş yap',
|
||||
connect: 'Bağlan',
|
||||
},
|
||||
language: {
|
||||
displayLanguage: 'Görüntüleme Dili',
|
||||
timezone: 'Zaman Dilimi',
|
||||
},
|
||||
provider: {
|
||||
apiKey: 'API Anahtarı',
|
||||
enterYourKey: 'API anahtarınızı buraya girin',
|
||||
invalidKey: 'Geçersiz OpenAI API anahtarı',
|
||||
validatedError: 'Doğrulama hatası: ',
|
||||
validating: 'Anahtar doğrulanıyor...',
|
||||
saveFailed: 'API anahtarını kaydetme başarısız oldu',
|
||||
apiKeyExceedBill: 'Bu API ANAHTARININ kullanılabilir kotası yok, lütfen okuyun',
|
||||
addKey: 'Anahtar Ekle',
|
||||
comingSoon: 'Yakında',
|
||||
editKey: 'Düzenle',
|
||||
invalidApiKey: 'Geçersiz API anahtarı',
|
||||
azure: {
|
||||
apiBase: 'API Tabanı',
|
||||
apiBasePlaceholder: 'Azure OpenAI Endpoint\'inizin API Tabanı URL\'si.',
|
||||
apiKey: 'API Anahtarı',
|
||||
apiKeyPlaceholder: 'API anahtarınızı buraya girin',
|
||||
helpTip: 'Azure OpenAI Service hakkında bilgi edinin',
|
||||
},
|
||||
openaiHosted: {
|
||||
openaiHosted: 'Barındırılan OpenAI',
|
||||
onTrial: 'DENEMEDE',
|
||||
exhausted: 'KOTA DOLU',
|
||||
desc: 'Dify tarafından sağlanan OpenAI barındırma hizmeti, GPT-3.5 gibi modelleri kullanmanıza olanak tanır. Deneme kotanız bitmeden önce, diğer model sağlayıcılarını ayarlamanız gerekir.',
|
||||
callTimes: 'Çağrı süreleri',
|
||||
usedUp: 'Deneme kotası kullanıldı. Kendi Model Sağlayıcınızı ekleyin.',
|
||||
useYourModel: 'Şu anda kendi Model Sağlayıcınızı kullanıyorsunuz.',
|
||||
close: 'Kapat',
|
||||
},
|
||||
anthropicHosted: {
|
||||
anthropicHosted: 'Anthropic Claude',
|
||||
onTrial: 'DENEMEDE',
|
||||
exhausted: 'KOTA DOLU',
|
||||
desc: 'Güçlü model, karmaşık diyaloglar ve yaratıcı içerik üretiminden ayrıntılı yönlendirmeye kadar geniş bir görev yelpazesi konusunda mükemmeldir.',
|
||||
callTimes: 'Çağrı Süreleri',
|
||||
usedUp: 'Deneme kotası kullanıldı. Kendi Model Sağlayıcınızı ekleyin.',
|
||||
useYourModel: 'Şu anda kendi Model Sağlayıcınızı kullanıyorsunuz.',
|
||||
close: 'Kapat',
|
||||
},
|
||||
anthropic: {
|
||||
using: 'Yerleştirme yeteneği,',
|
||||
enableTip: 'Anthropic modelini etkinleştirmek için önce OpenAI veya Azure OpenAI hizmetine bağlanmanız gerekir.',
|
||||
notEnabled: 'Etkin değil',
|
||||
keyFrom: 'API anahtarınızı Anthropic\'ten edinin',
|
||||
},
|
||||
encrypted: {
|
||||
front: 'API ANAHTARINIZ şu kullanılarak şifrelenip saklanacak:',
|
||||
back: ' teknolojisi.',
|
||||
},
|
||||
},
|
||||
modelProvider: {
|
||||
notConfigured: 'Sistem modeli henüz tam olarak yapılandırılmadı ve bazı işlevler kullanılamayabilir.',
|
||||
systemModelSettings: 'Sistem Model Ayarları',
|
||||
systemModelSettingsLink: 'Sistem modelini ayarlamak neden gereklidir?',
|
||||
selectModel: 'Modelinizi seçin',
|
||||
setupModelFirst: 'Lütfen önce modelinizi ayarlayın',
|
||||
systemReasoningModel: {
|
||||
key: 'Sistem Çıkarım Modeli',
|
||||
tip: 'Uygulamalar oluşturmak ve diyalog adı oluşturma ve sonraki soru önerisi gibi özelliklerin otomatikleştirilmesi için kullanılacak varsayılan çıkarım modelini ayarlayın.',
|
||||
},
|
||||
embeddingModel: {
|
||||
key: 'Yerleştirme Modeli',
|
||||
tip: 'Bilginin belge yerleştirme işlemi için varsayılan modeli ayarlayın, Bilginin geri alımı ve içe aktarımı için bu Yerleştirme modeli kullanılarak vektörizasyon işlemleri yapılır. Değiştirilmesi, içe aktarılan Bilgilere ve sorulara arasındaki vektör boyutlarının tutarsız olmasına neden olarak geri alım hatasına yol açar. Geri alım hatasını önlemek için önce modeli keyfi olarak değiştirmeyin.',
|
||||
required: 'Yerleştirme Modeli gereklidir',
|
||||
},
|
||||
speechToTextModel: {
|
||||
key: 'Konuşmadan Metne Modeli',
|
||||
tip: 'Konuşmada konuşmadan metne giriş için varsayılan modeli ayarlayın.',
|
||||
},
|
||||
ttsModel: {
|
||||
key: 'Metinden Konuşmaya Modeli',
|
||||
tip: 'Konuşmada metinden konuşmaya giriş için varsayılan modeli ayarlayın.',
|
||||
},
|
||||
rerankModel: {
|
||||
key: 'Yeniden Sıralama Modeli',
|
||||
tip: 'Yeniden sıralama modeli, kullanıcı sorgusuyla anlam eşleştirmesine dayalı olarak aday belge listesini yeniden sıralayacak ve anlam sıralama sonuçlarını iyileştirecektir.',
|
||||
},
|
||||
apiKey: 'API-KEY',
|
||||
quota: 'Kota',
|
||||
searchModel: 'Model ara',
|
||||
noModelFound: '{{model}} için model bulunamadı',
|
||||
models: 'Modeller',
|
||||
showMoreModelProvider: 'Daha fazla model sağlayıcı göster',
|
||||
selector: {
|
||||
tip: 'Bu model kaldırıldı. Lütfen bir model ekleyin veya başka bir model seçin.',
|
||||
emptyTip: 'Kullanılabilir model yok',
|
||||
emptySetting: 'Lütfen ayarlara gidip yapılandırın',
|
||||
rerankTip: 'Lütfen Yeniden Sıralama modelini ayarlayın',
|
||||
},
|
||||
card: {
|
||||
quota: 'KOTA',
|
||||
onTrial: 'Deneme Sürümünde',
|
||||
paid: 'Ücretli',
|
||||
quotaExhausted: 'Kota Tükendi',
|
||||
callTimes: 'Çağrı Süreleri',
|
||||
tokens: 'Tokenler',
|
||||
buyQuota: 'Kota Satın Al',
|
||||
priorityUse: 'Öncelikli Kullan',
|
||||
removeKey: 'API Anahtarını Kaldır',
|
||||
tip: 'Öncelikle ücretli kota kullanılacaktır. Deneme kotası, ücretli kota tükendiğinde kullanılacaktır.',
|
||||
},
|
||||
item: {
|
||||
deleteDesc: '{{modelName}} şu anda sistem çıkarım modeli olarak kullanılmaktadır. Kaldırıldıktan sonra bazı işlevler kullanılamayabilir. Lütfen onaylayın.',
|
||||
freeQuota: 'ÜCRETSİZ KOTA',
|
||||
},
|
||||
addApiKey: 'API anahtarınızı ekleyin',
|
||||
invalidApiKey: 'Geçersiz API anahtarı',
|
||||
encrypted: {
|
||||
front: 'API ANAHTARINIZ şu kullanılarak şifrelenip saklanacak:',
|
||||
back: ' teknolojisi.',
|
||||
},
|
||||
freeQuota: {
|
||||
howToEarn: 'Nasıl kazanılır',
|
||||
},
|
||||
addMoreModelProvider: 'DAHA FAZLA MODEL SAĞLAYICI EKLEYİN',
|
||||
addModel: 'Model Ekle',
|
||||
modelsNum: '{{num}} Model',
|
||||
showModels: 'Modelleri Göster',
|
||||
showModelsNum: '{{num}} Modeli Göster',
|
||||
collapse: 'Daralt',
|
||||
config: 'Yapılandır',
|
||||
modelAndParameters: 'Model ve Parametreler',
|
||||
model: 'Model',
|
||||
featureSupported: '{{feature}} desteklenir',
|
||||
callTimes: 'Çağrı Süreleri',
|
||||
credits: 'Mesaj Kredileri',
|
||||
buyQuota: 'Kota Satın Al',
|
||||
getFreeTokens: 'Ücretsiz Token Al',
|
||||
priorityUsing: 'Öncelikli Kullanım',
|
||||
deprecated: 'Kullanım dışı',
|
||||
confirmDelete: 'silme onayı?',
|
||||
quotaTip: 'Kalan kullanılabilir ücretsiz tokenler',
|
||||
loadPresets: 'Hazır Ayarları Yükle',
|
||||
parameters: 'PARAMETRELER',
|
||||
loadBalancing: 'Yük dengeleme',
|
||||
loadBalancingDescription: 'Birden fazla kimlik bilgisi grubu ile baskıyı azaltın.',
|
||||
loadBalancingHeadline: 'Yük Dengeleme',
|
||||
configLoadBalancing: 'Yük Dengelemeyi Yapılandır',
|
||||
modelHasBeenDeprecated: 'Bu model kullanım dışıdır',
|
||||
providerManaged: 'Sağlayıcı tarafından yönetilen',
|
||||
providerManagedDescription: 'Model sağlayıcı tarafından sağlanan tek bir kimlik bilgisi grubunu kullanın.',
|
||||
defaultConfig: 'Varsayılan Yapılandırma',
|
||||
apiKeyStatusNormal: 'API Anahtarının durumu normal',
|
||||
apiKeyRateLimit: 'Hız sınırına ulaşıldı, {{seconds}} saniye sonra tekrar kullanılabilir',
|
||||
addConfig: 'Yapılandırma Ekle',
|
||||
editConfig: 'Yapılandırmayı Düzenle',
|
||||
loadBalancingLeastKeyWarning: 'Yük dengeleme etkinleştirmek için en az 2 anahtar etkinleştirilmelidir.',
|
||||
loadBalancingInfo: 'Varsayılan olarak, yük dengeleme Yuvarlakrobin stratejisini kullanır. Hız sınırlaması tetiklenirse, 1 dakikalık bir soğuma süresi uygulanacaktır.',
|
||||
upgradeForLoadBalancing: 'Yük Dengelemeyi etkinleştirmek için planınızı yükseltin.',
|
||||
},
|
||||
dataSource: {
|
||||
add: 'Bir veri kaynağı ekle',
|
||||
connect: 'Bağlan',
|
||||
configure: 'Yapılandır',
|
||||
notion: {
|
||||
title: 'Notion',
|
||||
description: 'Bilgi için veri kaynağı olarak Notion kullanma.',
|
||||
connectedWorkspace: 'Bağlı çalışma alanı',
|
||||
addWorkspace: 'Çalışma alanı ekle',
|
||||
connected: 'Bağlandı',
|
||||
disconnected: 'Bağlantı Kesildi',
|
||||
changeAuthorizedPages: 'Yetkilendirilen sayfaları değiştir',
|
||||
pagesAuthorized: 'Yetkilendirilen sayfalar',
|
||||
sync: 'Senkronize et',
|
||||
remove: 'Kaldır',
|
||||
selector: {
|
||||
pageSelected: 'Seçilen Sayfalar',
|
||||
searchPages: 'Sayfaları ara...',
|
||||
noSearchResult: 'Arama sonucu yok',
|
||||
addPages: 'Sayfa ekle',
|
||||
preview: 'ÖNİZLEME',
|
||||
},
|
||||
},
|
||||
website: {
|
||||
title: 'Web Sitesi',
|
||||
description: 'Web tarayıcı kullanarak web sitelerinden içerik içe aktarın.',
|
||||
with: 'İle',
|
||||
configuredCrawlers: 'Yapılandırılmış tarayıcılar',
|
||||
active: 'Aktif',
|
||||
inactive: 'Pasif',
|
||||
},
|
||||
},
|
||||
plugin: {
|
||||
serpapi: {
|
||||
apiKey: 'API Anahtarı',
|
||||
apiKeyPlaceholder: 'API anahtarınızı girin',
|
||||
keyFrom: 'SerpAPI Hesap Sayfasından SerpAPI anahtarınızı alın',
|
||||
},
|
||||
},
|
||||
apiBasedExtension: {
|
||||
title: 'API uzantıları merkezi API yönetimi sağlar, Dify\'nin uygulamaları arasında kolay kullanım için yapılandırmayı basitleştirir.',
|
||||
link: 'Kendi API Uzantınızı nasıl geliştireceğinizi öğrenin.',
|
||||
linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
|
||||
add: 'API Uzantısı Ekle',
|
||||
selector: {
|
||||
title: 'API Uzantısı',
|
||||
placeholder: 'Lütfen API uzantısını seçin',
|
||||
manage: 'API Uzantısını Yönet',
|
||||
},
|
||||
modal: {
|
||||
title: 'API Uzantısı Ekle',
|
||||
editTitle: 'API Uzantısını Düzenle',
|
||||
name: {
|
||||
title: 'Ad',
|
||||
placeholder: 'Lütfen adı girin',
|
||||
},
|
||||
apiEndpoint: {
|
||||
title: 'API Uç Noktası',
|
||||
placeholder: 'Lütfen API uç noktasını girin',
|
||||
},
|
||||
apiKey: {
|
||||
title: 'API anahtarı',
|
||||
placeholder: 'Lütfen API anahtarını girin',
|
||||
lengthError: 'API anahtarı uzunluğu 5 karakterden az olamaz',
|
||||
},
|
||||
},
|
||||
type: 'Tür',
|
||||
},
|
||||
about: {
|
||||
changeLog: 'Değişiklik Günlüğü',
|
||||
updateNow: 'Şimdi güncelle',
|
||||
nowAvailable: 'Dify {{version}} şimdi mevcut.',
|
||||
latestAvailable: 'Dify {{version}} en son mevcut sürüm.',
|
||||
},
|
||||
appMenus: {
|
||||
overview: 'İzleme',
|
||||
promptEng: 'Orchestrate',
|
||||
apiAccess: 'API Erişimi',
|
||||
logAndAnn: 'Günlükler & Anlamlandırmalar',
|
||||
logs: 'Günlükler',
|
||||
},
|
||||
environment: {
|
||||
testing: 'TEST',
|
||||
development: 'GELİŞTİRME',
|
||||
},
|
||||
appModes: {
|
||||
completionApp: 'Metin Üreteci',
|
||||
chatApp: 'Sohbet Uygulaması',
|
||||
},
|
||||
datasetMenus: {
|
||||
documents: 'Belgeler',
|
||||
hitTesting: 'Geri Alım Testi',
|
||||
settings: 'Ayarlar',
|
||||
emptyTip: 'Bilgi ilişkilendirilmemiş, ilişkilendirme işlemini tamamlamak için uygulama veya eklentiye gidin.',
|
||||
viewDoc: 'Dökümantasyon görüntüle',
|
||||
relatedApp: 'bağlantılı uygulamalar',
|
||||
},
|
||||
voiceInput: {
|
||||
speaking: 'Şimdi konuş...',
|
||||
converting: 'Metne dönüştürülüyor...',
|
||||
notAllow: 'mikrofon yetkilendirilmedi',
|
||||
},
|
||||
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: 'Konuşmayı Yeniden Adlandır',
|
||||
conversationName: 'Konuşma adı',
|
||||
conversationNamePlaceholder: 'Konuşma adını girin',
|
||||
conversationNameCanNotEmpty: 'Konuşma adı gereklidir',
|
||||
citation: {
|
||||
title: 'ALINTILAR',
|
||||
linkToDataset: 'Bilgiye Bağlantı',
|
||||
characters: 'Karakterler:',
|
||||
hitCount: 'Geri Alım Sayısı:',
|
||||
vectorHash: 'Vektör Hash:',
|
||||
hitScore: 'Geri Alım Skoru:',
|
||||
},
|
||||
},
|
||||
promptEditor: {
|
||||
placeholder: 'Prompt kelimenizi buraya yazın, değişken eklemek için \'{\' tuşuna, prompt içerik bloğu eklemek için \'/\' tuşuna basın',
|
||||
context: {
|
||||
item: {
|
||||
title: 'Bağlam',
|
||||
desc: 'Bağlam şablonunu ekle',
|
||||
},
|
||||
modal: {
|
||||
title: 'Bağlamda {{num}} Knowledge',
|
||||
add: 'Bağlam Ekle',
|
||||
footer: 'Bağlamları aşağıdaki Bağlam bölümünde yönetebilirsiniz.',
|
||||
},
|
||||
},
|
||||
history: {
|
||||
item: {
|
||||
title: 'Konuşma Geçmişi',
|
||||
desc: 'Tarihi mesaj şablonunu ekle',
|
||||
},
|
||||
modal: {
|
||||
title: 'ÖRNEK',
|
||||
user: 'Merhaba',
|
||||
assistant: 'Merhaba! Bugün size nasıl yardımcı olabilirim?',
|
||||
edit: 'Konuşma Rol İsimlerini Düzenle',
|
||||
},
|
||||
},
|
||||
variable: {
|
||||
item: {
|
||||
title: 'Değişkenler & Harici Araçlar',
|
||||
desc: 'Değişkenler & Harici Araçlar ekle',
|
||||
},
|
||||
outputToolDisabledItem: {
|
||||
title: 'Değişkenler',
|
||||
desc: 'Değişkenleri ekle',
|
||||
},
|
||||
modal: {
|
||||
add: 'Yeni değişken',
|
||||
addTool: 'Yeni araç',
|
||||
},
|
||||
},
|
||||
query: {
|
||||
item: {
|
||||
title: 'Sorgu',
|
||||
desc: 'Kullanıcı sorgu şablonunu ekle',
|
||||
},
|
||||
},
|
||||
existed: 'Zaten prompt içinde mevcut',
|
||||
},
|
||||
imageUploader: {
|
||||
uploadFromComputer: 'Bilgisayardan Yükle',
|
||||
uploadFromComputerReadError: 'Görüntü okuma başarısız oldu, lütfen tekrar deneyin.',
|
||||
uploadFromComputerUploadError: 'Görüntü yükleme başarısız oldu, lütfen tekrar yükleyin.',
|
||||
uploadFromComputerLimit: 'Yükleme görüntüleri {{size}} MB\'yi aşamaz',
|
||||
pasteImageLink: 'Görüntü bağlantısını yapıştır',
|
||||
pasteImageLinkInputPlaceholder: 'Görüntü bağlantısını buraya yapıştırın',
|
||||
pasteImageLinkInvalid: 'Geçersiz görüntü bağlantısı',
|
||||
imageUpload: 'Görüntü Yükleme',
|
||||
},
|
||||
tag: {
|
||||
placeholder: 'Tüm Etiketler',
|
||||
addNew: 'Yeni etiket ekle',
|
||||
noTag: 'Etiket yok',
|
||||
noTagYet: 'Henüz etiket yok',
|
||||
addTag: 'Etiket ekle',
|
||||
editTag: 'Etiketleri düzenle',
|
||||
manageTags: 'Etiketleri Yönet',
|
||||
selectorPlaceholder: 'Aramak veya oluşturmak için yazın',
|
||||
create: 'Oluştur',
|
||||
delete: 'Etiketi sil',
|
||||
deleteTip: 'Etiket kullanılıyor, silinsin mi?',
|
||||
created: 'Etiket başarıyla oluşturuldu',
|
||||
failed: 'Etiket oluşturma başarısız oldu',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
30
web/i18n/tr-TR/custom.ts
Normal file
30
web/i18n/tr-TR/custom.ts
Normal file
@ -0,0 +1,30 @@
|
||||
const translation = {
|
||||
custom: 'Özelleştirme',
|
||||
upgradeTip: {
|
||||
prefix: 'Markanızı özelleştirmek için planınızı yükseltin',
|
||||
suffix: '.',
|
||||
},
|
||||
webapp: {
|
||||
title: 'WebApp markasını özelleştir',
|
||||
removeBrand: 'Powered by Dify\'i kaldır',
|
||||
changeLogo: 'Powered by Brand Resmini Değiştir',
|
||||
changeLogoTip: 'SVG veya PNG formatında, en az 40x40px boyutunda',
|
||||
},
|
||||
app: {
|
||||
title: 'Uygulama başlığı markasını özelleştir',
|
||||
changeLogoTip: 'SVG veya PNG formatında, en az 80x80px boyutunda',
|
||||
},
|
||||
upload: 'Yükle',
|
||||
uploading: 'Yükleniyor',
|
||||
uploadedFail: 'Resim yükleme başarısız oldu, lütfen tekrar yükleyin.',
|
||||
change: 'Değiştir',
|
||||
apply: 'Uygula',
|
||||
restore: 'Varsayılan Ayarları Geri Yükle',
|
||||
customize: {
|
||||
contactUs: ' bizimle iletişime geçin ',
|
||||
prefix: 'Uygulama içindeki marka logosunu özelleştirmek için, lütfen',
|
||||
suffix: 'Enterprise sürümüne yükseltin.',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
161
web/i18n/tr-TR/dataset-creation.ts
Normal file
161
web/i18n/tr-TR/dataset-creation.ts
Normal file
@ -0,0 +1,161 @@
|
||||
const translation = {
|
||||
steps: {
|
||||
header: {
|
||||
creation: 'Bilgi Oluştur',
|
||||
update: 'Veri ekle',
|
||||
},
|
||||
one: 'Veri kaynağı seçin',
|
||||
two: 'Metin Ön İşleme ve Temizleme',
|
||||
three: 'Çalıştır ve Bitir',
|
||||
},
|
||||
error: {
|
||||
unavailable: 'Bu Bilgi kullanılamıyor',
|
||||
},
|
||||
firecrawl: {
|
||||
configFirecrawl: '🔥Firecrawl\'ı Yapılandır',
|
||||
apiKeyPlaceholder: 'firecrawl.dev\'den API anahtarı',
|
||||
getApiKeyLinkText: 'API anahtarınızı firecrawl.dev\'den alın',
|
||||
},
|
||||
stepOne: {
|
||||
filePreview: 'Dosya Önizleme',
|
||||
pagePreview: 'Sayfa Önizleme',
|
||||
dataSourceType: {
|
||||
file: 'Dosyadan içe aktar',
|
||||
notion: 'Notion\'dan senkronize et',
|
||||
web: 'Web sitesinden senkronize et',
|
||||
},
|
||||
uploader: {
|
||||
title: 'Dosya yükle',
|
||||
button: 'Dosyayı sürükleyip bırakın veya',
|
||||
browse: 'Göz atın',
|
||||
tip: 'Destekler {{supportTypes}}. Her biri en fazla {{size}}MB.',
|
||||
validation: {
|
||||
typeError: 'Dosya tipi desteklenmiyor',
|
||||
size: 'Dosya çok büyük. Maksimum {{size}} MB',
|
||||
count: 'Birden fazla dosya desteklenmiyor',
|
||||
filesNumber: 'Toplu yükleme sınırına ulaştınız, {{filesNumber}} dosya.',
|
||||
},
|
||||
cancel: 'İptal',
|
||||
change: 'Değiştir',
|
||||
failed: 'Yükleme başarısız',
|
||||
},
|
||||
notionSyncTitle: 'Notion bağlı değil',
|
||||
notionSyncTip: 'Notion ile senkronize etmek için önce Notion\'a bağlanılmalıdır.',
|
||||
connect: 'Bağlanmaya git',
|
||||
button: 'Sonraki',
|
||||
emptyDatasetCreation: 'Boş bir bilgi oluşturmak istiyorum',
|
||||
modal: {
|
||||
title: 'Boş bir bilgi oluştur',
|
||||
tip: 'Boş bir bilgi hiçbir belge içermeyecektir ve dilediğiniz zaman belge yükleyebilirsiniz.',
|
||||
input: 'Bilgi adı',
|
||||
placeholder: 'Lütfen girin',
|
||||
nameNotEmpty: 'Ad boş olamaz',
|
||||
nameLengthInvaild: 'Ad 1 ile 40 karakter arasında olmalıdır',
|
||||
cancelButton: 'İptal',
|
||||
confirmButton: 'Oluştur',
|
||||
failed: 'Oluşturma başarısız',
|
||||
},
|
||||
website: {
|
||||
fireCrawlNotConfigured: 'Firecrawl yapılandırılmamış',
|
||||
fireCrawlNotConfiguredDescription: 'Firecrawl\'ı kullanmak için API anahtarı ile yapılandırın.',
|
||||
configure: 'Yapılandır',
|
||||
run: 'Çalıştır',
|
||||
firecrawlTitle: '🔥Firecrawl ile web içeriğini çıkarın',
|
||||
firecrawlDoc: 'Firecrawl dokümanları',
|
||||
firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website',
|
||||
options: 'Seçenekler',
|
||||
crawlSubPage: 'Alt sayfaları tarayın',
|
||||
limit: 'Sınır',
|
||||
maxDepth: 'Maksimum derinlik',
|
||||
excludePaths: 'Yolları hariç tut',
|
||||
includeOnlyPaths: 'Yalnızca yolları dahil et',
|
||||
extractOnlyMainContent: 'Sadece ana içeriği çıkar (başlıklar, navigasyonlar, altbilgiler vb. yok)',
|
||||
exceptionErrorTitle: 'Firecrawl işi çalıştırılırken bir istisna meydana geldi:',
|
||||
unknownError: 'Bilinmeyen hata',
|
||||
totalPageScraped: 'Toplam kazınan sayfa:',
|
||||
selectAll: 'Hepsini Seç',
|
||||
resetAll: 'Hepsini Sıfırla',
|
||||
scrapTimeInfo: 'Toplam {{total}} sayfa {{time}}s içinde kazındı',
|
||||
preview: 'Önizleme',
|
||||
maxDepthTooltip: 'Girilen URL\'ye göre tarama için maksimum derinlik. Derinlik 0 sadece girilen url sayfasını kazır, derinlik 1 url ve girilen URL + bir / \'dan sonraki her şeyi kazır ve böyle devam eder.',
|
||||
},
|
||||
},
|
||||
stepTwo: {
|
||||
segmentation: 'Parçalanma ayarları',
|
||||
auto: 'Otomatik',
|
||||
autoDescription: 'Parçalanma ve ön işleme kurallarını otomatik olarak ayarlayın. Bilgisiz kullanıcıların bunu seçmesi önerilir.',
|
||||
custom: 'Özel',
|
||||
customDescription: 'Parçalanma kurallarını, parçalanma uzunluğunu ve ön işleme kurallarını kişiselleştirin.',
|
||||
separator: 'Parçalanma belirleyicisi',
|
||||
separatorPlaceholder: 'Örneğin, yeni satır (\\\\n) veya özel ayırıcı (örn. "***")',
|
||||
maxLength: 'Maksimum parça uzunluğu',
|
||||
overlap: 'Parça örtüşmesi',
|
||||
overlapTip: 'Parça örtüşmesini ayarlamak, aralarındaki anlamsal bağı koruyabilir, geri alım etkisini artırır. Maksimum parça boyutunun %10-%25\'ini ayarlamanız önerilir.',
|
||||
overlapCheck: 'parça örtüşmesi maksimum parça uzunluğundan büyük olmamalıdır',
|
||||
rules: 'Metin ön işleme kuralları',
|
||||
removeExtraSpaces: 'Art arda gelen boşlukları, yeni satırları ve sekmeleri değiştirin',
|
||||
removeUrlEmails: 'Tüm URL\'leri ve e-posta adreslerini silin',
|
||||
removeStopwords: '"a", "an", "the" gibi durdurma kelimelerini silin',
|
||||
preview: 'Onayla ve Önizleme',
|
||||
reset: 'Sıfırla',
|
||||
indexMode: 'Dizin modu',
|
||||
qualified: 'Yüksek Kalite',
|
||||
recommend: 'Önerilen',
|
||||
qualifiedTip: 'Kullanıcılar sorguladığında daha yüksek doğruluk sağlamak için varsayılan sistem yerleştirme arayüzünü çağırır.',
|
||||
warning: 'Lütfen önce model sağlayıcı API anahtarını ayarlayın.',
|
||||
click: 'Ayarlara git',
|
||||
economical: 'Ekonomik',
|
||||
economicalTip: 'Doğruluğu azaltmak için çevrimdışı vektör motorlarını, anahtar kelime dizinlerini vb. kullanın, token harcamadan',
|
||||
QATitle: 'Soru ve Yanıt formatında parçalama',
|
||||
QATip: 'Bu seçeneği etkinleştirmek daha fazla token tüketecektir',
|
||||
QALanguage: 'Kullanarak parçalara ayır',
|
||||
emstimateCost: 'Tahmin',
|
||||
emstimateSegment: 'Tahmini parçalar',
|
||||
segmentCount: 'parçalar',
|
||||
calculating: 'Hesaplanıyor...',
|
||||
fileSource: 'Belgeleri ön işleme',
|
||||
notionSource: 'Sayfaları ön işleme',
|
||||
websiteSource: 'Web sitesini ön işleme',
|
||||
other: 've diğer',
|
||||
fileUnit: ' dosyalar',
|
||||
notionUnit: ' sayfalar',
|
||||
webpageUnit: ' sayfalar',
|
||||
previousStep: 'Önceki adım',
|
||||
nextStep: 'Kaydet ve İşle',
|
||||
save: 'Kaydet ve İşle',
|
||||
cancel: 'İptal',
|
||||
sideTipTitle: 'Neden parçalanma ve ön işleme?',
|
||||
sideTipP1: 'Metin verileri işlerken, parçalama ve temizleme iki önemli ön işleme adımıdır.',
|
||||
sideTipP2: 'Parçalanma, uzun metinleri paragraflara böler, böylece modeller daha iyi anlayabilir. Bu, model sonuçlarının kalitesini ve alaka düzeyini artırır.',
|
||||
sideTipP3: 'Temizleme, gereksiz karakterleri ve formatları kaldırarak Bilginin daha temiz ve daha kolay analiz edilmesini sağlar.',
|
||||
sideTipP4: 'Uygun parçalama ve temizleme, model performansını iyileştirir, daha doğru ve değerli sonuçlar sağlar.',
|
||||
previewTitle: 'Önizleme',
|
||||
previewTitleButton: 'Önizleme',
|
||||
previewButton: 'Q&A formatına geçiş',
|
||||
previewSwitchTipStart: 'Geçerli parça önizlemesi metin formatındadır, soru ve yanıt formatına geçiş ek tüketir',
|
||||
previewSwitchTipEnd: 'token',
|
||||
characters: 'karakterler',
|
||||
indexSettedTip: 'Dizin yöntemini değiştirmek için, lütfen',
|
||||
retrivalSettedTip: 'Dizin yöntemini değiştirmek için, lütfen',
|
||||
datasetSettingLink: 'Bilgi ayarlarına gidin.',
|
||||
},
|
||||
stepThree: {
|
||||
creationTitle: '🎉 Bilgi oluşturuldu',
|
||||
creationContent: 'Bilginin adını otomatik olarak belirledik, dilediğiniz zaman değiştirebilirsiniz',
|
||||
label: 'Bilgi adı',
|
||||
additionTitle: '🎉 Belge yüklendi',
|
||||
additionP1: 'Belge Bilgi\'ye yüklendi',
|
||||
additionP2: ', bilgi listesinden bulabilirsiniz.',
|
||||
stop: 'İşlemeyi durdur',
|
||||
resume: 'İşlemeye devam et',
|
||||
navTo: 'Belgeye git',
|
||||
sideTipTitle: 'Sırada ne var',
|
||||
sideTipContent: 'Belge dizine ekleme işlemi bittikten sonra Bilgi, bağlam olarak uygulamaya entegre edilebilir. Prompt düzenleme sayfasında bağlam ayarlarını bulabilirsiniz. Ayrıca bağımsız bir ChatGPT dizinleme eklentisi olarak yayınlamak için de oluşturabilirsiniz.',
|
||||
modelTitle: 'Yerleştirmeyi durdurmak istediğinize emin misiniz?',
|
||||
modelContent: 'İşlemeye daha sonra devam etmeniz gerekirse, kaldığınız yerden devam edeceksiniz.',
|
||||
modelButtonConfirm: 'Onayla',
|
||||
modelButtonCancel: 'İptal',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
351
web/i18n/tr-TR/dataset-documents.ts
Normal file
351
web/i18n/tr-TR/dataset-documents.ts
Normal file
@ -0,0 +1,351 @@
|
||||
const translation = {
|
||||
list: {
|
||||
title: 'Belgeler',
|
||||
desc: 'Bilginin tüm dosyaları burada gösterilir ve Bilginin tamamı Dify alıntılarına veya Sohbet eklentisi üzerinden dizine eklenebilir.',
|
||||
addFile: 'Dosya Ekle',
|
||||
addPages: 'Sayfa Ekle',
|
||||
addUrl: 'URL Ekle',
|
||||
table: {
|
||||
header: {
|
||||
fileName: 'DOSYA ADI',
|
||||
words: 'KELİMELER',
|
||||
hitCount: 'GERİ ALIM SAYISI',
|
||||
uploadTime: 'YÜKLEME ZAMANI',
|
||||
status: 'DURUM',
|
||||
action: 'EYLEM',
|
||||
},
|
||||
rename: 'Yeniden Adlandır',
|
||||
name: 'Ad',
|
||||
},
|
||||
action: {
|
||||
uploadFile: 'Yeni dosya yükle',
|
||||
settings: 'Segment ayarları',
|
||||
addButton: 'Parça ekle',
|
||||
add: 'Bir parça ekle',
|
||||
batchAdd: 'Toplu ekle',
|
||||
archive: 'Arşivle',
|
||||
unarchive: 'Arşivden Çıkar',
|
||||
delete: 'Sil',
|
||||
enableWarning: 'Arşivlenmiş dosya etkinleştirilemez',
|
||||
sync: 'Senkronize et',
|
||||
},
|
||||
index: {
|
||||
enable: 'Etkinleştir',
|
||||
disable: 'Devre Dışı Bırak',
|
||||
all: 'Hepsi',
|
||||
enableTip: 'Dosya dizine eklenebilir',
|
||||
disableTip: 'Dosya dizine eklenemez',
|
||||
},
|
||||
status: {
|
||||
queuing: 'Kuyrukta',
|
||||
indexing: 'Dizine Ekleniyor',
|
||||
paused: 'Durduruldu',
|
||||
error: 'Hata',
|
||||
available: 'Kullanılabilir',
|
||||
enabled: 'Etkin',
|
||||
disabled: 'Devre Dışı',
|
||||
archived: 'Arşivlendi',
|
||||
},
|
||||
empty: {
|
||||
title: 'Henüz belge yok',
|
||||
upload: {
|
||||
tip: 'Dosya yükleyebilir, web sitesinden veya Notion, GitHub gibi web uygulamalarından senkronize edebilirsiniz.',
|
||||
},
|
||||
sync: {
|
||||
tip: 'Dify, Notion\'dan periyodik olarak dosyaları indirir ve işlemeyi tamamlar.',
|
||||
},
|
||||
},
|
||||
delete: {
|
||||
title: 'Silmek istediğinize emin misiniz?',
|
||||
content: 'İşlemeye daha sonra devam etmeniz gerekirse, kaldığınız yerden devam edeceksiniz',
|
||||
},
|
||||
batchModal: {
|
||||
title: 'Toplu parçalar ekle',
|
||||
csvUploadTitle: 'CSV dosyanızı buraya sürükleyip bırakın ya da ',
|
||||
browse: 'göz atın',
|
||||
tip: 'CSV dosyası şu yapıya uygun olmalıdır:',
|
||||
question: 'soru',
|
||||
answer: 'cevap',
|
||||
contentTitle: 'parça içeriği',
|
||||
content: 'içerik',
|
||||
template: 'Şablonu buradan indir',
|
||||
cancel: 'İptal',
|
||||
run: 'Toplu İşlemi Çalıştır',
|
||||
runError: 'Toplu işlem başarısız oldu',
|
||||
processing: 'Toplu işlemde',
|
||||
completed: 'İçe aktarma tamamlandı',
|
||||
error: 'İçe Aktarma Hatası',
|
||||
ok: 'Tamam',
|
||||
},
|
||||
},
|
||||
metadata: {
|
||||
title: 'Meta Veri',
|
||||
desc: 'Belgeler için meta veri etiketleme, AI\'ın bunlara zamanında erişmesini sağlar ve kullanıcılar için referansların kaynağını ortaya çıkarır.',
|
||||
dateTimeFormat: 'MMMM D, YYYY ss:dd ÖÖ/ÖS',
|
||||
docTypeSelectTitle: 'Lütfen bir belge türü seçin',
|
||||
docTypeChangeTitle: 'Belge türünü değiştir',
|
||||
docTypeSelectWarning: 'Belge türü değiştirilirse, şimdi doldurulan meta veriler artık korunmayacaktır',
|
||||
firstMetaAction: 'Hadi başlayalım',
|
||||
placeholder: {
|
||||
add: 'Ekle ',
|
||||
select: 'Seç ',
|
||||
},
|
||||
source: {
|
||||
upload_file: 'Dosya Yükle',
|
||||
notion: 'Notion\'dan Senkronize Et',
|
||||
github: 'GitHub\'dan Senkronize Et',
|
||||
},
|
||||
type: {
|
||||
book: 'Kitap',
|
||||
webPage: 'Web Sayfası',
|
||||
paper: 'Makale',
|
||||
socialMediaPost: 'Sosyal Medya Paylaşımı',
|
||||
personalDocument: 'Kişisel Belge',
|
||||
businessDocument: 'İş Belgesi',
|
||||
IMChat: 'IM Sohbet',
|
||||
wikipediaEntry: 'Wikipedia Girişi',
|
||||
notion: 'Notion\'dan Senkronize Et',
|
||||
github: 'GitHub\'dan Senkronize Et',
|
||||
technicalParameters: 'Teknik Parametreler',
|
||||
},
|
||||
field: {
|
||||
processRule: {
|
||||
processDoc: 'Belgeyi İşle',
|
||||
segmentRule: 'Parça Kuralı',
|
||||
segmentLength: 'Parça Uzunluğu',
|
||||
processClean: 'Metin İşleme Temizliği',
|
||||
},
|
||||
book: {
|
||||
title: 'Başlık',
|
||||
language: 'Dil',
|
||||
author: 'Yazar',
|
||||
publisher: 'Yayıncı',
|
||||
publicationDate: 'Yayın Tarihi',
|
||||
ISBN: 'ISBN',
|
||||
category: 'Kategori',
|
||||
},
|
||||
webPage: {
|
||||
title: 'Başlık',
|
||||
url: 'URL',
|
||||
language: 'Dil',
|
||||
authorPublisher: 'Yazar/Yayıncı',
|
||||
publishDate: 'Yayın Tarihi',
|
||||
topicsKeywords: 'Konular/Anahtar Kelimeler',
|
||||
description: 'Açıklama',
|
||||
},
|
||||
paper: {
|
||||
title: 'Başlık',
|
||||
language: 'Dil',
|
||||
author: 'Yazar',
|
||||
publishDate: 'Yayın Tarihi',
|
||||
journalConferenceName: 'Dergi/Konferans Adı',
|
||||
volumeIssuePage: 'Cilt/Sayı/Sayfa',
|
||||
DOI: 'DOI',
|
||||
topicsKeywords: 'Konular/Anahtar Kelimeler',
|
||||
abstract: 'Özet',
|
||||
},
|
||||
socialMediaPost: {
|
||||
platform: 'Platform',
|
||||
authorUsername: 'Yazar/Kullanıcı adı',
|
||||
publishDate: 'Yayın Tarihi',
|
||||
postURL: 'Gönderi URL\'si',
|
||||
topicsTags: 'Konular/Etiketler',
|
||||
},
|
||||
personalDocument: {
|
||||
title: 'Başlık',
|
||||
author: 'Yazar',
|
||||
creationDate: 'Oluşturma Tarihi',
|
||||
lastModifiedDate: 'Son Değiştirme Tarihi',
|
||||
documentType: 'Belge Türü',
|
||||
tagsCategory: 'Etiketler/Kategori',
|
||||
},
|
||||
businessDocument: {
|
||||
title: 'Başlık',
|
||||
author: 'Yazar',
|
||||
creationDate: 'Oluşturma Tarihi',
|
||||
lastModifiedDate: 'Son Değiştirme Tarihi',
|
||||
documentType: 'Belge Türü',
|
||||
departmentTeam: 'Bölüm/Takım',
|
||||
},
|
||||
IMChat: {
|
||||
chatPlatform: 'Sohbet Platformu',
|
||||
chatPartiesGroupName: 'Sohbet Tarafları/Grup Adı',
|
||||
participants: 'Katılımcılar',
|
||||
startDate: 'Başlangıç Tarihi',
|
||||
endDate: 'Bitiş Tarihi',
|
||||
topicsKeywords: 'Konular/Anahtar Kelimeler',
|
||||
fileType: 'Dosya Türü',
|
||||
},
|
||||
wikipediaEntry: {
|
||||
title: 'Başlık',
|
||||
language: 'Dil',
|
||||
webpageURL: 'Web Sayfası URL\'si',
|
||||
editorContributor: 'Editör/Katılımcı',
|
||||
lastEditDate: 'Son Düzenleme Tarihi',
|
||||
summaryIntroduction: 'Özet/Giriş',
|
||||
},
|
||||
notion: {
|
||||
title: 'Başlık',
|
||||
language: 'Dil',
|
||||
author: 'Yazar',
|
||||
createdTime: 'Oluşturulma Zamanı',
|
||||
lastModifiedTime: 'Son Değiştirilme Zamanı',
|
||||
url: 'URL',
|
||||
tag: 'Etiket',
|
||||
description: 'Açıklama',
|
||||
},
|
||||
github: {
|
||||
repoName: 'Depo Adı',
|
||||
repoDesc: 'Depo Açıklaması',
|
||||
repoOwner: 'Depo Sahibi',
|
||||
fileName: 'Dosya Adı',
|
||||
filePath: 'Dosya Yolu',
|
||||
programmingLang: 'Programlama Dili',
|
||||
url: 'URL',
|
||||
license: 'Lisans',
|
||||
lastCommitTime: 'Son Commit Zamanı',
|
||||
lastCommitAuthor: 'Son Commit Yazar',
|
||||
},
|
||||
originInfo: {
|
||||
originalFilename: 'Orijinal dosya adı',
|
||||
originalFileSize: 'Orijinal dosya boyutu',
|
||||
uploadDate: 'Yükleme tarihi',
|
||||
lastUpdateDate: 'Son güncelleme tarihi',
|
||||
source: 'Kaynak',
|
||||
},
|
||||
technicalParameters: {
|
||||
segmentSpecification: 'Parçalar spesifikasyonu',
|
||||
segmentLength: 'Parçalar uzunluğu',
|
||||
avgParagraphLength: 'Ort. paragraf uzunluğu',
|
||||
paragraphs: 'Paragraflar',
|
||||
hitCount: 'Geri alım sayısı',
|
||||
embeddingTime: 'Yerleştirme zamanı',
|
||||
embeddedSpend: 'Yerleştirme harcaması',
|
||||
},
|
||||
},
|
||||
languageMap: {
|
||||
zh: 'Çince',
|
||||
en: 'İngilizce',
|
||||
es: 'İspanyolca',
|
||||
fr: 'Fransızca',
|
||||
de: 'Almanca',
|
||||
ja: 'Japonca',
|
||||
ko: 'Korece',
|
||||
ru: 'Rusça',
|
||||
ar: 'Arapça',
|
||||
pt: 'Portekizce',
|
||||
it: 'İtalyanca',
|
||||
nl: 'Flemenkçe',
|
||||
pl: 'Lehçe',
|
||||
sv: 'İsveççe',
|
||||
tr: 'Türkçe',
|
||||
he: 'İbranice',
|
||||
hi: 'Hintçe',
|
||||
da: 'Danca',
|
||||
fi: 'Fince',
|
||||
no: 'Norveççe',
|
||||
hu: 'Macarca',
|
||||
el: 'Yunanca',
|
||||
cs: 'Çekçe',
|
||||
th: 'Tayca',
|
||||
id: 'Endonezce',
|
||||
},
|
||||
categoryMap: {
|
||||
book: {
|
||||
fiction: 'Kurgu',
|
||||
biography: 'Biyografi',
|
||||
history: 'Tarih',
|
||||
science: 'Bilim',
|
||||
technology: 'Teknoloji',
|
||||
education: 'Eğitim',
|
||||
philosophy: 'Felsefe',
|
||||
religion: 'Din',
|
||||
socialSciences: 'Sosyal Bilimler',
|
||||
art: 'Sanat',
|
||||
travel: 'Gezi',
|
||||
health: 'Sağlık',
|
||||
selfHelp: 'Kişisel Gelişim',
|
||||
businessEconomics: 'İş ve Ekonomi',
|
||||
cooking: 'Yemek',
|
||||
childrenYoungAdults: 'Çocuk ve Genç Yetişkin',
|
||||
comicsGraphicNovels: 'Çizgi Roman ve Grafik Roman',
|
||||
poetry: 'Şiir',
|
||||
drama: 'Drama',
|
||||
other: 'Diğer',
|
||||
},
|
||||
personalDoc: {
|
||||
notes: 'Notlar',
|
||||
blogDraft: 'Blog Taslağı',
|
||||
diary: 'Günlük',
|
||||
researchReport: 'Araştırma Raporu',
|
||||
bookExcerpt: 'Kitap Alıntısı',
|
||||
schedule: 'Takvim',
|
||||
list: 'Liste',
|
||||
projectOverview: 'Proje Genel Bakış',
|
||||
photoCollection: 'Fotoğraf Koleksiyonu',
|
||||
creativeWriting: 'Yaratıcı Yazma',
|
||||
codeSnippet: 'Kod Parçacığı',
|
||||
designDraft: 'Tasarım Taslağı',
|
||||
personalResume: 'Kişisel Özgeçmiş',
|
||||
other: 'Diğer',
|
||||
},
|
||||
businessDoc: {
|
||||
meetingMinutes: 'Toplantı Tutanakları',
|
||||
researchReport: 'Araştırma Raporu',
|
||||
proposal: 'Teklif',
|
||||
employeeHandbook: 'Çalışan El Kitabı',
|
||||
trainingMaterials: 'Eğitim Materyalleri',
|
||||
requirementsDocument: 'Gereksinim Dokümanı',
|
||||
designDocument: 'Tasarım Dokümanı',
|
||||
productSpecification: 'Ürün Spesifikasyonu',
|
||||
financialReport: 'Mali Rapor',
|
||||
marketAnalysis: 'Pazar Analizi',
|
||||
projectPlan: 'Proje Planı',
|
||||
teamStructure: 'Takım Yapısı',
|
||||
policiesProcedures: 'Politikalar ve Prosedürler',
|
||||
contractsAgreements: 'Sözleşmeler ve Anlaşmalar',
|
||||
emailCorrespondence: 'E-posta Yazışmaları',
|
||||
other: 'Diğer',
|
||||
},
|
||||
},
|
||||
},
|
||||
embedding: {
|
||||
processing: 'Yerleştirme işlemi...',
|
||||
paused: 'Yerleştirme duraklatıldı',
|
||||
completed: 'Yerleştirme tamamlandı',
|
||||
error: 'Yerleştirme hatası',
|
||||
docName: 'Belgeler işleniyor',
|
||||
mode: 'Segmentasyon kuralı',
|
||||
segmentLength: 'Parçalar uzunluğu',
|
||||
textCleaning: 'Metin önişleme ve temizlik',
|
||||
segments: 'Paragraflar',
|
||||
highQuality: 'Yüksek kaliteli mod',
|
||||
economy: 'Ekonomik mod',
|
||||
estimate: 'Tahmini tüketim',
|
||||
stop: 'İşlemi durdur',
|
||||
resume: 'İşleme devam et',
|
||||
automatic: 'Otomatik',
|
||||
custom: 'Özel',
|
||||
previewTip: 'Paragraf önizlemesi yerleştirme tamamlandıktan sonra kullanılabilir olacak',
|
||||
},
|
||||
segment: {
|
||||
paragraphs: 'Paragraflar',
|
||||
keywords: 'Anahtar Kelimeler',
|
||||
addKeyWord: 'Anahtar kelime ekle',
|
||||
keywordError: 'Anahtar kelimenin maksimum uzunluğu 20',
|
||||
characters: 'karakter',
|
||||
hitCount: 'Geri alım sayısı',
|
||||
vectorHash: 'Vektör hash: ',
|
||||
questionPlaceholder: 'soruyu buraya ekleyin',
|
||||
questionEmpty: 'Soru boş olamaz',
|
||||
answerPlaceholder: 'cevabı buraya ekleyin',
|
||||
answerEmpty: 'Cevap boş olamaz',
|
||||
contentPlaceholder: 'içeriği buraya ekleyin',
|
||||
contentEmpty: 'İçerik boş olamaz',
|
||||
newTextSegment: 'Yeni Metin Parçası',
|
||||
newQaSegment: 'Yeni Soru-Cevap Parçası',
|
||||
delete: 'Bu parçayı silmek istiyor musunuz?',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
28
web/i18n/tr-TR/dataset-hit-testing.ts
Normal file
28
web/i18n/tr-TR/dataset-hit-testing.ts
Normal file
@ -0,0 +1,28 @@
|
||||
const translation = {
|
||||
title: 'Geri Alım Testi',
|
||||
desc: 'Verilen sorgu metnine göre Bilginin isabet etkisini test edin.',
|
||||
dateTimeFormat: 'GG/AA/YYYY ss:dd ÖÖ/ÖS',
|
||||
recents: 'Sonuçlar',
|
||||
table: {
|
||||
header: {
|
||||
source: 'Kaynak',
|
||||
text: 'Metin',
|
||||
time: 'Zaman',
|
||||
},
|
||||
},
|
||||
input: {
|
||||
title: 'Kaynak metin',
|
||||
placeholder: 'Bir metin girin, kısa bir bildirim cümlesi önerilir.',
|
||||
countWarning: 'En fazla 200 karakter.',
|
||||
indexWarning: 'Yüksek kaliteli Bilgi sadece.',
|
||||
testing: 'Test Ediliyor',
|
||||
},
|
||||
hit: {
|
||||
title: 'GERİ ALINAN PARAGRAFLAR',
|
||||
emptyTip: 'Geri Alım Testi sonuçları burada gösterilecektir',
|
||||
},
|
||||
noRecentTip: 'Burada son sorgu sonuçları yok',
|
||||
viewChart: 'VEKTÖR GRAFİĞİNİ GÖRÜNTÜLE',
|
||||
}
|
||||
|
||||
export default translation
|
35
web/i18n/tr-TR/dataset-settings.ts
Normal file
35
web/i18n/tr-TR/dataset-settings.ts
Normal file
@ -0,0 +1,35 @@
|
||||
const translation = {
|
||||
title: 'Bilgi ayarları',
|
||||
desc: 'Burada Bilginin özelliklerini ve çalışma yöntemlerini değiştirebilirsiniz.',
|
||||
form: {
|
||||
name: 'Bilgi İsmi',
|
||||
namePlaceholder: 'Bilgi ismini girin',
|
||||
nameError: 'İsim boş olamaz',
|
||||
desc: 'Bilgi açıklaması',
|
||||
descInfo: 'Lütfen Bilginin içeriğini özetlemek için net bir metinsel açıklama yazın. Bu açıklama, çıkarım için birden fazla Bilgi arasından seçim yaparken eşleştirme temeli olarak kullanılacaktır.',
|
||||
descPlaceholder: 'Bu Bilginin içeriğini açıklayın. Ayrıntılı bir açıklama, AI\'nın Bilginin içeriğine zamanında erişmesini sağlar. Boş bırakılırsa, Dify varsayılan isabet stratejisini kullanır.',
|
||||
descWrite: 'İyi bir Bilgi açıklamasının nasıl yazılacağını öğrenin.',
|
||||
permissions: 'İzinler',
|
||||
permissionsOnlyMe: 'Sadece ben',
|
||||
permissionsAllMember: 'Tüm takım üyeleri',
|
||||
permissionsInvitedMembers: 'Bazı takım üyeleri',
|
||||
me: '(Siz)',
|
||||
indexMethod: 'Dizin Yöntemi',
|
||||
indexMethodHighQuality: 'Yüksek Kalite',
|
||||
indexMethodHighQualityTip: 'Kullanıcılar sorguladığında daha yüksek doğruluk sağlamak için Yerleştirme modelini çağırır.',
|
||||
indexMethodEconomy: 'Ekonomik',
|
||||
indexMethodEconomyTip: 'Doğruluğu azaltmak için çevrimdışı vektör motorları, anahtar kelime dizinleri vb. kullanın, token harcamadan',
|
||||
embeddingModel: 'Yerleştirme Modeli',
|
||||
embeddingModelTip: 'Yerleştirme modelini değiştirmek için, lütfen ',
|
||||
embeddingModelTipLink: 'Ayarlar\'a gidin',
|
||||
retrievalSetting: {
|
||||
title: 'Geri Alım Ayarı',
|
||||
learnMore: 'Daha fazla bilgi edinin',
|
||||
description: ' geri alım yöntemi hakkında.',
|
||||
longDescription: ' geri alım yöntemi hakkında, bunu Bilgi ayarlarında istediğiniz zaman değiştirebilirsiniz.',
|
||||
},
|
||||
save: 'Kaydet',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
73
web/i18n/tr-TR/dataset.ts
Normal file
73
web/i18n/tr-TR/dataset.ts
Normal file
@ -0,0 +1,73 @@
|
||||
const translation = {
|
||||
knowledge: 'Bilgi',
|
||||
documentCount: ' belge',
|
||||
wordCount: ' k kelime',
|
||||
appCount: ' bağlı uygulamalar',
|
||||
createDataset: 'Bilgi Oluştur',
|
||||
createDatasetIntro: 'Kendi metin verilerinizi içe aktarın veya Webhook aracılığıyla gerçek zamanlı olarak veri yazın, LLM bağlamını geliştirin.',
|
||||
deleteDatasetConfirmTitle: 'Bu Bilgi\'yi silmek istiyor musunuz?',
|
||||
deleteDatasetConfirmContent:
|
||||
'Bilginin silinmesi geri alınamaz. Kullanıcılar artık Bilginize erişemeyecek ve tüm prompt yapılandırmaları ve günlükler kalıcı olarak silinecektir.',
|
||||
datasetUsedByApp: 'Bilgi bazı uygulamalar tarafından kullanılıyor. Uygulamalar artık bu Bilgiyi kullanamayacak ve tüm prompt yapılandırmaları ve günlükler kalıcı olarak silinecektir.',
|
||||
datasetDeleted: 'Bilgi silindi',
|
||||
datasetDeleteFailed: 'Bilgi silinemedi',
|
||||
didYouKnow: 'Biliyor muydunuz?',
|
||||
intro1: 'Bilgi, Dify uygulamasına ',
|
||||
intro2: 'bağlam olarak',
|
||||
intro3: ' entegre edilebilir,',
|
||||
intro4: 'veya ',
|
||||
intro5: 'bağımsız bir ChatGPT dizin eklentisi olarak oluşturulabilir',
|
||||
intro6: ' ve yayınlanabilir.',
|
||||
unavailable: 'Kullanılamıyor',
|
||||
unavailableTip: 'Yerleştirme modeli mevcut değil, varsayılan yerleştirme modelinin yapılandırılması gerekiyor',
|
||||
datasets: 'BİLGİ',
|
||||
datasetsApi: 'API ERİŞİMİ',
|
||||
retrieval: {
|
||||
semantic_search: {
|
||||
title: 'Vektör Arama',
|
||||
description: 'Sorgu yerleştirmelerini oluşturun ve vektör temsiline en benzeyen metin parçasını arayın.',
|
||||
},
|
||||
full_text_search: {
|
||||
title: 'Tam Metin Arama',
|
||||
description: 'Belgelerdeki tüm terimleri dizinleyerek, kullanıcıların herhangi bir terimi aramasına ve bu terimleri içeren ilgili metin parçasını geri almasına olanak tanır.',
|
||||
},
|
||||
hybrid_search: {
|
||||
title: 'Hibrit Arama',
|
||||
description: 'Tam metin arama ve vektör aramalarını aynı anda çalıştırın, kullanıcı sorgusu için en iyi eşleşmeyi seçmek için yeniden sıralayın. Kullanıcılar ağırlıklar ayarlayabilir veya bir Yeniden Sıralama modeli yapılandırabilir.',
|
||||
recommend: 'Önerilir',
|
||||
},
|
||||
invertedIndex: {
|
||||
title: 'Ters Dizine Kayıt',
|
||||
description: 'Ters Dizine Kayıt, verimli geri alım için kullanılan bir yapıdır. Terimlere göre düzenlenir ve her terim, onu içeren belgelere veya web sayfalarına işaret eder.',
|
||||
},
|
||||
change: 'Değiştir',
|
||||
changeRetrievalMethod: 'Geri alma yöntemini değiştir',
|
||||
},
|
||||
docsFailedNotice: 'belgeler dizine eklenemedi',
|
||||
retry: 'Yeniden Dene',
|
||||
indexingTechnique: {
|
||||
high_quality: 'Yüksek Kalite',
|
||||
economy: 'Ekonomi',
|
||||
},
|
||||
indexingMethod: {
|
||||
semantic_search: 'VEKTÖR',
|
||||
full_text_search: 'TAM METİN',
|
||||
hybrid_search: 'HİBRİT',
|
||||
},
|
||||
mixtureHighQualityAndEconomicTip: 'Yüksek kaliteli ve ekonomik bilgi tabanlarının karışımı için Yeniden Sıralama modeli gereklidir.',
|
||||
inconsistentEmbeddingModelTip: 'Seçilen bilgi tabanlarının Yerleştirme modelleri tutarsızsa Yeniden Sıralama modeli gereklidir.',
|
||||
retrievalSettings: 'Geri Alım Ayarı',
|
||||
rerankSettings: 'Yeniden Sıralama Ayarı',
|
||||
weightedScore: {
|
||||
title: 'Ağırlıklı Puan',
|
||||
description: 'Verilen ağırlıkları ayarlayarak bu yeniden sıralama stratejisi, anlamsal mı yoksa anahtar kelime eşleştirmesini mi önceliklendireceğini belirler.',
|
||||
semanticFirst: 'Anlamsal Öncelikli',
|
||||
keywordFirst: 'Anahtar Kelime Öncelikli',
|
||||
customized: 'Özelleştirilmiş',
|
||||
semantic: 'Anlamsal',
|
||||
keyword: 'Anahtar Kelime',
|
||||
},
|
||||
nTo1RetrievalLegacy: 'Geri alım stratejisinin optimizasyonu ve yükseltilmesi nedeniyle, N-to-1 geri alımı Eylül ayında resmi olarak kullanım dışı kalacaktır. O zamana kadar normal şekilde kullanabilirsiniz.',
|
||||
}
|
||||
|
||||
export default translation
|
41
web/i18n/tr-TR/explore.ts
Normal file
41
web/i18n/tr-TR/explore.ts
Normal file
@ -0,0 +1,41 @@
|
||||
const translation = {
|
||||
title: 'Keşfet',
|
||||
sidebar: {
|
||||
discovery: 'Keşif',
|
||||
chat: 'Sohbet',
|
||||
workspace: 'Çalışma Alanı',
|
||||
action: {
|
||||
pin: 'Sabitle',
|
||||
unpin: 'Sabitlemeyi Kaldır',
|
||||
rename: 'Yeniden Adlandır',
|
||||
delete: 'Sil',
|
||||
},
|
||||
delete: {
|
||||
title: 'Uygulamayı sil',
|
||||
content: 'Bu uygulamayı silmek istediğinizden emin misiniz?',
|
||||
},
|
||||
},
|
||||
apps: {
|
||||
title: 'Dify Tarafından Keşfet Uygulamaları',
|
||||
description: 'Bu şablon uygulamalarını anında kullanın veya şablonlara dayalı kendi uygulamalarınızı özelleştirin.',
|
||||
allCategories: 'Önerilen',
|
||||
},
|
||||
appCard: {
|
||||
addToWorkspace: 'Çalışma Alanına Ekle',
|
||||
customize: 'Özelleştir',
|
||||
},
|
||||
appCustomize: {
|
||||
title: '{{name}} uygulamasından uygulama oluştur',
|
||||
subTitle: 'Uygulama simgesi ve ismi',
|
||||
nameRequired: 'Uygulama ismi gereklidir',
|
||||
},
|
||||
category: {
|
||||
Assistant: 'Asistan',
|
||||
Writing: 'Yazma',
|
||||
Translate: 'Çeviri',
|
||||
Programming: 'Programlama',
|
||||
HR: 'İK',
|
||||
},
|
||||
}
|
||||
|
||||
export default translation
|
3
web/i18n/tr-TR/layout.ts
Normal file
3
web/i18n/tr-TR/layout.ts
Normal file
@ -0,0 +1,3 @@
|
||||
const translation = {}
|
||||
|
||||
export default translation
|
75
web/i18n/tr-TR/login.ts
Normal file
75
web/i18n/tr-TR/login.ts
Normal file
@ -0,0 +1,75 @@
|
||||
const translation = {
|
||||
pageTitle: 'Hey, başlayalım!👋',
|
||||
welcome: 'Dify\'ye hoş geldiniz, devam etmek için lütfen giriş yapın.',
|
||||
email: 'E-posta adresi',
|
||||
emailPlaceholder: 'E-postanız',
|
||||
password: 'Şifre',
|
||||
passwordPlaceholder: 'Şifreniz',
|
||||
name: 'Kullanıcı adı',
|
||||
namePlaceholder: 'Kullanıcı adınız',
|
||||
forget: 'Şifrenizi mi unuttunuz?',
|
||||
signBtn: 'Giriş yap',
|
||||
sso: 'SSO ile devam et',
|
||||
installBtn: 'Kurulum',
|
||||
setAdminAccount: 'Yönetici hesabı ayarlama',
|
||||
setAdminAccountDesc: 'Yönetici hesabı için maksimum ayrıcalıklar, uygulama oluşturma ve LLM sağlayıcılarını yönetme gibi işlemler için kullanılabilir.',
|
||||
createAndSignIn: 'Oluştur ve giriş yap',
|
||||
oneMoreStep: 'Bir adım kaldı',
|
||||
createSample: 'Bu bilgilere dayanarak, sizin için örnek bir uygulama oluşturacağız',
|
||||
invitationCode: 'Davet Kodu',
|
||||
invitationCodePlaceholder: 'Davet kodunuz',
|
||||
interfaceLanguage: 'Arayüz Dili',
|
||||
timezone: 'Zaman dilimi',
|
||||
go: 'Dify\'ye git',
|
||||
sendUsMail: 'Tanıtımınızı e-posta ile gönderin, davet talebini işleme alalım.',
|
||||
acceptPP: 'Gizlilik politikasını okudum ve kabul ediyorum',
|
||||
reset: 'Şifrenizi sıfırlamak için şu komutu çalıştırın',
|
||||
withGitHub: 'GitHub ile devam et',
|
||||
withGoogle: 'Google ile devam et',
|
||||
rightTitle: 'LLM\'nin tam potansiyelini ortaya çıkarın',
|
||||
rightDesc: 'Görsel olarak çekici, çalışılabilir ve iyileştirilebilir AI uygulamaları oluşturun.',
|
||||
tos: 'Hizmet Şartları',
|
||||
pp: 'Gizlilik Politikası',
|
||||
tosDesc: 'Kaydolarak, Hizmet Şartlarımızı kabul etmiş olursunuz',
|
||||
goToInit: 'Hesabı başlatmadıysanız, lütfen başlatma sayfasına gidin',
|
||||
donthave: 'Sahip değil misiniz?',
|
||||
invalidInvitationCode: 'Geçersiz davet kodu',
|
||||
accountAlreadyInited: 'Hesap zaten başlatılmış',
|
||||
forgotPassword: 'Şifrenizi mi unuttunuz?',
|
||||
resetLinkSent: 'Sıfırlama bağlantısı gönderildi',
|
||||
sendResetLink: 'Sıfırlama bağlantısı gönder',
|
||||
backToSignIn: 'Girişe dön',
|
||||
forgotPasswordDesc: 'Şifrenizi sıfırlamak için e-posta adresinizi girin. Şifrenizi nasıl sıfırlayacağınıza dair talimatları içeren bir e-posta göndereceğiz.',
|
||||
checkEmailForResetLink: 'Şifrenizi sıfırlamak için bir bağlantı içeren e-postayı kontrol edin. Birkaç dakika içinde görünmezse, spam klasörünüzü kontrol ettiğinizden emin olun.',
|
||||
passwordChanged: 'Şimdi giriş yapın',
|
||||
changePassword: 'Şifre Değiştir',
|
||||
changePasswordTip: 'Hesabınız için yeni bir şifre girin',
|
||||
invalidToken: 'Geçersiz veya süresi dolmuş token',
|
||||
confirmPassword: 'Şifreyi Onayla',
|
||||
confirmPasswordPlaceholder: 'Yeni şifrenizi onaylayın',
|
||||
passwordChangedTip: 'Şifreniz başarıyla değiştirildi',
|
||||
error: {
|
||||
emailEmpty: 'E-posta adresi gereklidir',
|
||||
emailInValid: 'Geçerli bir e-posta adresi girin',
|
||||
nameEmpty: 'İsim gereklidir',
|
||||
passwordEmpty: 'Şifre gereklidir',
|
||||
passwordLengthInValid: 'Şifre en az 8 karakterden oluşmalıdır',
|
||||
passwordInvalid: 'Şifre harf ve rakamlardan oluşmalı ve uzunluğu 8 karakterden fazla olmalıdır',
|
||||
},
|
||||
license: {
|
||||
tip: 'Dify Community Edition\'ı başlatmadan önce GitHub\'daki',
|
||||
link: 'Açık Kaynak Lisansını',
|
||||
},
|
||||
join: 'Katıl',
|
||||
joinTipStart: 'Sizi',
|
||||
joinTipEnd: 'takımına davet ediyor',
|
||||
invalid: 'Bağlantı süresi doldu',
|
||||
explore: 'Dify\'yi Keşfet',
|
||||
activatedTipStart: 'Katıldınız',
|
||||
activatedTipEnd: 'takımına',
|
||||
activated: 'Şimdi giriş yapın',
|
||||
adminInitPassword: 'Yönetici başlangıç şifresi',
|
||||
validate: 'Doğrula',
|
||||
}
|
||||
|
||||
export default translation
|
3
web/i18n/tr-TR/register.ts
Normal file
3
web/i18n/tr-TR/register.ts
Normal file
@ -0,0 +1,3 @@
|
||||
const translation = {}
|
||||
|
||||
export default translation
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user