Skip to content
Snippets Groups Projects
Commit 03227c19 authored by timothycarambat's avatar timothycarambat
Browse files

Merge branch 'master' of github.com:Mintplex-Labs/anything-llm

parents 875a582c 4b71dd10
No related branches found
No related tags found
No related merge requests found
......@@ -28,6 +28,7 @@ import Dutch from "./nl/common.js";
import Vietnamese from "./vn/common.js";
import TraditionalChinese from "./zh_TW/common.js";
import Farsi from "./fa/common.js";
import Turkish from "./tr/common.js";
export const defaultNS = "common";
export const resources = {
......@@ -73,4 +74,7 @@ export const resources = {
fa: {
common: Farsi,
},
tr: {
common: Turkish,
},
};
const TRANSLATIONS = {
common: {
"workspaces-name": "Çalışma Alanları Adı",
error: "hata",
success: "başarı",
user: "Kullanıcı",
selection: "Model Seçimi",
saving: "Kaydediliyor...",
save: "Değişiklikleri Kaydet",
previous: "Önceki Sayfa",
next: "Sonraki Sayfa",
},
// Setting Sidebar menu items.
settings: {
title: "Instance Ayarları",
system: "Genel Ayarlar",
invites: "Davetler",
users: "Kullanıcılar",
workspaces: "Çalışma Alanları",
"workspace-chats": "Çalışma Alanı Sohbetleri",
customization: "Özelleştirme",
"api-keys": "Geliştirici API",
llm: "LLM",
transcription: "Transkripsiyon",
embedder: "Gömme Aracı",
"text-splitting": "Metin Bölme & Parçalama",
"voice-speech": "Ses & Konuşma",
"vector-database": "Vektör Veritabanı",
embeds: "Sohbet Gömme",
"embed-chats": "Gömme Sohbet Geçmişi",
security: "Güvenlik",
"event-logs": "Olay Kayıtları",
privacy: "Gizlilik & Veri",
"ai-providers": "Yapay Zeka Sağlayıcıları",
"agent-skills": "Ajan Becerileri",
admin: "Yönetici",
tools: "Araçlar",
"experimental-features": "Deneysel Özellikler",
contact: "Destekle İletişime Geçin",
"browser-extension": "Tarayıcı Uzantısı",
},
// Page Definitions
login: {
"multi-user": {
welcome: "Hoş geldiniz",
"placeholder-username": "Kullanıcı Adı",
"placeholder-password": "Şifre",
login: "Giriş Yap",
validating: "Doğrulanıyor...",
"forgot-pass": "Şifremi Unuttum",
reset: "Sıfırla",
},
"sign-in": {
start: "Hesabınıza",
end: "giriş yapın.",
},
"password-reset": {
title: "Şifre Sıfırlama",
description: "Şifrenizi sıfırlamak için gerekli bilgileri aşağıya girin.",
"recovery-codes": "Kurtarma Kodları",
"recovery-code": "Kurtarma Kodu {{index}}",
"back-to-login": "Girişe Geri Dön",
},
},
welcomeMessage: {
part1:
"AnythingLLM'e hoş geldiniz. AnythingLLM, Mintplex Labs tarafından geliştirilen açık kaynaklı bir yapay zeka aracıdır ve her şeyi, sorgulayabileceğiniz ve sohbet edebileceğiniz eğitimli bir chatbota dönüştürür. AnythingLLM, BYOK (kendi anahtarlarınızı getirin) yazılımıdır; bu nedenle, kullanmak istediğiniz hizmetler dışında herhangi bir abonelik, ücret ya da ek masraf yoktur.",
part2:
"AnythingLLM, OpenAi, GPT-4, LangChain, PineconeDB, ChromaDB ve benzeri güçlü yapay zeka ürünlerini zahmetsizce, düzenli bir paket içinde bir araya getirmenin en kolay yoludur; böylece verimliliğinizi 100 kat artırabilirsiniz.",
part3:
"AnythingLLM tamamen yerel olarak makinenizde çok az kaynakla çalışabilir—orada olduğunu bile fark etmezsiniz! GPU gerekmez. Bulut veya şirket içi (on-premises) kurulum da mevcuttur.\nYapay zeka araç ekosistemi her geçen gün daha da güçleniyor. AnythingLLM bu gücü kolayca kullanmanızı sağlar.",
githubIssue: "Github'da bir sorun oluşturun",
user1: "Nasıl başlarım?!",
part4:
"Bu çok basit. Tüm koleksiyonlar, 'Çalışma Alanları' (Workspaces) adını verdiğimiz gruplar halinde düzenlenir. Çalışma Alanları; dosyalar, belgeler, resimler, PDF'ler ve diğer dosyaların LLM'lerin anlayabileceği ve sohbette kullanabileceği biçime dönüştürüleceği gruplardır.\n\nİstediğiniz zaman dosya ekleyip kaldırabilirsiniz.",
createWorkspace: "İlk çalışma alanınızı oluşturun",
user2:
"Bu bir tür yapay zeka Dropbox'ı gibi mi? Peki sohbet etmek nasıl? Bir chatbot değil mi?",
part5:
"AnythingLLM, sıradan bir Dropbox'tan çok daha fazlasıdır.\n\nAnythingLLM, verilerinizle etkileşime geçmenin iki yolunu sunar:\n\n<i>Sorgu (Query):</i> Sohbetleriniz, çalışma alanınızdaki belgelere erişip onlardan elde ettiği verileri veya çıkarımları size sunar. Çalışma Alanınıza daha fazla belge eklemek, onu daha akıllı hâle getirir!\n\n<i>Konuşma (Conversational):</i> Belgeleriniz ve devam eden sohbet geçmişiniz, aynı anda LLM'in bilgi tabanına katkıda bulunur. Bu, gerçek zamanlı metin bilgileri, düzeltmeler veya LLM'nin yanlış anlayabileceği noktaların düzeltilmesi için mükemmeldir.\n\nSohbet esnasında, <i>iki mod arasında istediğiniz an</i> geçiş yapabilirsiniz!",
user3: "Vay, harika görünüyor. Hemen denemek istiyorum!",
part6: "İyi eğlenceler!",
starOnGithub: "GitHub'da Yıldız Verin",
contact: "Mintplex Labs ile İletişime Geçin",
},
"new-workspace": {
title: "Yeni Çalışma Alanı",
placeholder: "Benim Çalışma Alanım",
},
// Workspace Settings menu items
"workspaces—settings": {
general: "Genel Ayarlar",
chat: "Sohbet Ayarları",
vector: "Vektör Veritabanı",
members: "Üyeler",
agent: "Ajan Yapılandırması",
},
// General Appearance
general: {
vector: {
title: "Vektör Sayısı",
description: "Vektör veritabanınızdaki toplam vektör sayısı.",
},
names: {
description:
"Bu, yalnızca çalışma alanınızın görüntü adını değiştirecektir.",
},
message: {
title: "Önerilen Sohbet Mesajları",
description:
"Çalışma alanı kullanıcılarınıza önerilecek sohbet mesajlarını özelleştirin.",
add: "Yeni mesaj ekle",
save: "Mesajları Kaydet",
heading: "Bana açıkla",
body: "AnythingLLM'nin faydalarını",
},
pfp: {
title: "Asistan Profil Görseli",
description:
"Bu çalışma alanı için asistanın profil resmini özelleştirin.",
image: "Çalışma Alanı Görseli",
remove: "Çalışma Alanı Görselini Kaldır",
},
delete: {
title: "Çalışma Alanını Sil",
description:
"Bu çalışma alanını ve tüm verilerini silin. Bu işlem, çalışma alanını tüm kullanıcılar için silecektir.",
delete: "Çalışma Alanını Sil",
deleting: "Çalışma Alanı Siliniyor...",
"confirm-start": "Tüm çalışma alanınızı silmek üzeresiniz",
"confirm-end":
". Bu, vektör veritabanınızdaki tüm vektör gömme verilerini kaldıracaktır.\n\nOrijinal kaynak dosyalar etkilenmeyecektir. Bu işlem geri alınamaz.",
},
},
// Chat Settings
chat: {
llm: {
title: "Çalışma Alanı LLM Sağlayıcısı",
description:
"Bu çalışma alanı için kullanılacak belirli LLM sağlayıcısı ve modeli. Varsayılan olarak sistem LLM sağlayıcısı ve ayarları kullanılır.",
search: "Tüm LLM sağlayıcılarını ara",
},
model: {
title: "Çalışma Alanı Sohbet Modeli",
description:
"Bu çalışma alanı için kullanılacak belirli sohbet modeli. Boş bırakılırsa, sistem LLM tercihi kullanılacaktır.",
wait: "-- modeller bekleniyor --",
},
mode: {
title: "Sohbet Modu",
chat: {
title: "Sohbet",
"desc-start": "LLM'nin genel bilgisiyle yanıtlar sunar",
and: "ve",
"desc-end": "bulunan belge bağlamını ekler.",
},
query: {
title: "Sorgu",
"desc-start": "yanıtları",
only: "sadece",
"desc-end": "belge bağlamı bulunduğunda sunar.",
},
},
history: {
title: "Sohbet Geçmişi",
"desc-start":
"Yanıta dahil edilecek önceki sohbetlerin sayısı (kısa süreli hafıza).",
recommend: "20 önerilir. ",
"desc-end":
"45'ten fazlası, mesaj boyutuna göre sürekli sohbet hatalarına yol açabilir.",
},
prompt: {
title: "Komut (Prompt)",
description:
"Bu çalışma alanında kullanılacak komut. Yapay zekanın yanıt üretmesi için bağlam ve talimatları tanımlayın. Uygun ve doğru yanıtlar almak için özenle hazırlanmış bir komut sağlamalısınız.",
},
refusal: {
title: "Sorgu Modu Ret Yanıtı",
"desc-start": "Eğer",
query: "sorgu",
"desc-end":
"modunda bağlam bulunamazsa, özel bir ret yanıtı döndürmek isteyebilirsiniz.",
},
temperature: {
title: "LLM Sıcaklığı",
"desc-start":
'Bu ayar, LLM yanıtlarının ne kadar "yaratıcı" olacağını kontrol eder.',
"desc-end":
"Sayı yükseldikçe yaratıcı yanıtlar artar. Bazı modeller için bu değer çok yüksek ayarlandığında anlamsız yanıtlar ortaya çıkabilir.",
hint:
"Çoğu LLM'in farklı kabul edilebilir değer aralıkları vardır. Ayrıntılar için LLM sağlayıcınıza danışın.",
},
},
// Vector Database
"vector-workspace": {
identifier: "Vektör veritabanı tanımlayıcısı",
snippets: {
title: "Maksimum Bağlam Parçacıkları",
description:
"Bu ayar, sohbet veya sorgu başına LLM'e gönderilecek maksimum bağlam parçacığı sayısını kontrol eder.",
recommend: "Önerilen: 4",
},
doc: {
title: "Belge benzerlik eşiği",
description:
"Bir kaynağın sohbetle ilişkili sayılabilmesi için gereken minimum benzerlik puanı. Sayı yükseldikçe, kaynağın sohbete benzerliği de o kadar yüksek olmalıdır.",
zero: "Kısıtlama yok",
low: "Düşük (benzerlik puanı ≥ .25)",
medium: "Orta (benzerlik puanı ≥ .50)",
high: "Yüksek (benzerlik puanı ≥ .75)",
},
reset: {
reset: "Vektör veritabanını sıfırla",
resetting: "Vektörler temizleniyor...",
confirm:
"Bu çalışma alanının vektör veritabanını sıfırlamak üzeresiniz. Bu işlem, hâlihazırda gömülü olan tüm vektör verilerini kaldıracaktır.\n\nOrijinal kaynak dosyalar etkilenmeyecektir. Bu işlem geri alınamaz.",
error: "Çalışma alanının vektör veritabanı sıfırlanamadı!",
success: "Çalışma alanının vektör veritabanı sıfırlandı!",
},
},
// Agent Configuration
agent: {
"performance-warning":
"Araç çağırmayı açıkça desteklemeyen LLM'lerin performansı, modelin yetenekleri ve doğruluğuna büyük ölçüde bağlıdır. Bazı beceriler kısıtlı veya işlevsiz olabilir.",
provider: {
title: "Çalışma Alanı Ajan LLM Sağlayıcısı",
description:
"Bu çalışma alanındaki @agent ajanı için kullanılacak spesifik LLM sağlayıcısı ve modeli.",
},
mode: {
chat: {
title: "Çalışma Alanı Ajan Sohbet Modeli",
description:
"Bu çalışma alanındaki @agent ajanı için kullanılacak spesifik sohbet modeli.",
},
title: "Çalışma Alanı Ajan Modeli",
description:
"Bu çalışma alanındaki @agent ajanı için kullanılacak spesifik LLM modeli.",
wait: "-- modeller bekleniyor --",
},
skill: {
title: "Varsayılan ajan becerileri",
description:
"Varsayılan ajanın doğal yeteneklerini, hazır oluşturulmuş bu becerilerle geliştirin. Bu yapılandırma tüm çalışma alanları için geçerlidir.",
rag: {
title: "RAG ve uzun vadeli hafıza",
description:
'Ajana, yerel belgelerinizi kullanarak soruları yanıtlatma veya bazı içerikleri "hatırlaması" için uzun vadeli hafıza kullanma izni verin.',
},
view: {
title: "Belgeleri görüntüleme & özetleme",
description:
"Ajana, çalışma alanında hâlihazırda gömülü olan dosyaları listeleyip özetleme izni verin.",
},
scrape: {
title: "Web sitelerini tarama",
description:
"Ajana, web sitelerini ziyaret edip içeriklerini tarama izni verin.",
},
generate: {
title: "Grafik oluşturma",
description:
"Varsayılan ajanın, sağlanan veya sohbette yer alan verilere göre çeşitli grafik türleri oluşturmasına izin verin.",
},
save: {
title: "Tarayıcıya dosya oluştur & kaydet",
description:
"Varsayılan ajanın, oluşturduğu dosyaları kaydetmesine ve tarayıcıda indirilebilir hale getirmesine izin verin.",
},
web: {
title: "Canlı web araması ve gezinme",
"desc-start":
"Ajanınızın, bir web arama (SERP) sağlayıcısına bağlanarak sorularınızı yanıtlamak için web üzerinde arama yapmasına izin verin.",
"desc-end":
"Ajan oturumlarında web araması, bu ayar etkinleştirilene kadar çalışmayacaktır.",
},
},
},
// Workspace Chats
recorded: {
title: "Çalışma Alanı Sohbetleri",
description:
"Bunlar, kullanıcılar tarafından gönderilen ve oluşturulma tarihlerine göre sıralanan tüm kayıtlı sohbetler ve mesajlardır.",
export: "Dışa Aktar",
table: {
id: "Id",
by: "Gönderen",
workspace: "Çalışma Alanı",
prompt: "Komut (Prompt)",
response: "Yanıt",
at: "Gönderilme Zamanı",
},
},
// Appearance
appearance: {
title: "Görünüm",
description: "Platformunuzun görünüm ayarlarını özelleştirin.",
logo: {
title: "Logoyu Özelleştir",
description:
"Özel bir logo yükleyerek chatbot'unuzu kendinize ait hale getirin.",
add: "Özel bir logo ekle",
recommended: "Önerilen boyut: 800 x 200",
remove: "Kaldır",
replace: "Değiştir",
},
message: {
title: "Mesajları Özelleştir",
description:
"Kullanıcılarınıza gösterilen otomatik mesajları özelleştirin.",
new: "Yeni",
system: "sistem",
user: "kullanıcı",
message: "mesaj",
assistant: "AnythingLLM Sohbet Asistanı",
"double-click": "Düzenlemek için çift tıklayın...",
save: "Mesajları Kaydet",
},
icons: {
title: "Özel Altbilgi Simgeleri",
description:
"Kenar çubuğunun altında görüntülenen altbilgi simgelerini özelleştirin.",
icon: "Simge",
link: "Bağlantı",
},
},
// API Keys
api: {
title: "API Anahtarları",
description:
"API anahtarları, bu AnythingLLM örneğine programatik olarak erişmeye ve yönetmeye olanak tanır.",
link: "API dokümantasyonunu okuyun",
generate: "Yeni API Anahtarı Oluştur",
table: {
key: "API Anahtarı",
by: "Oluşturan",
created: "Oluşturulma Tarihi",
},
},
llm: {
title: "LLM Tercihi",
description:
"Bu, tercih ettiğiniz LLM sohbet ve gömme sağlayıcısının kimlik bilgileri ile ayarlarıdır. Bu anahtarların güncel ve doğru olması önemlidir; aksi takdirde AnythingLLM doğru çalışmayacaktır.",
provider: "LLM Sağlayıcısı",
},
transcription: {
title: "Transkripsiyon Model Tercihi",
description:
"Bu, tercih ettiğiniz transkripsiyon modeli sağlayıcısının kimlik bilgileri ve ayarlarıdır. Anahtarların güncel ve doğru olması önemlidir; aksi takdirde medya dosyaları ve sesler transkribe edilemez.",
provider: "Transkripsiyon Sağlayıcısı",
"warn-start":
"Sınırlı RAM veya CPU'ya sahip makinelerde yerel Whisper modelini kullanmak, medya dosyalarını işlerken AnythingLLM'nin duraksamasına neden olabilir.",
"warn-recommend":
"En az 2GB RAM öneriyoruz ve 10MB üzerinde dosya yüklememeye dikkat edin.",
"warn-end":
"Yerleşik model, ilk kullanımda otomatik olarak indirilecektir.",
},
embedding: {
title: "Gömme (Embedding) Tercihi",
"desc-start":
"Yerel olarak gömme mekanizmasını desteklemeyen bir LLM kullanıyorsanız, metinleri gömmek için ek kimlik bilgileri girmeniz gerekebilir.",
"desc-end":
"Gömme, metni vektörlere dönüştürme sürecidir. Dosyalarınızın ve komutlarınızın işlenebilmesi için AnythingLLM, bu kimlik bilgilerine ihtiyaç duyar.",
provider: {
title: "Embedding Sağlayıcısı",
description:
"AnythingLLM'nin yerel gömme motoru kullanıldığında ek bir kurulum gerekmez.",
},
},
// Text Splitting & Chunking Preferences
text: {
title: "Metin Bölme & Parçalama Tercihleri",
"desc-start":
"Bazı durumlarda, yeni belgelerin vektör veritabanınıza eklenmeden önce hangi varsayılan yöntemle bölünüp parçalanacağını değiştirmek isteyebilirsiniz.",
"desc-end":
"Metin bölmenin nasıl çalıştığını ve olası yan etkilerini tam olarak bilmiyorsanız bu ayarı değiştirmemelisiniz.",
"warn-start": "Buradaki değişiklikler yalnızca",
"warn-center": "yeni eklenen belgeler",
"warn-end": "için geçerli olacak, mevcut belgelere uygulanmaz.",
size: {
title: "Metin Parça Boyutu",
description:
"Tek bir vektörde bulunabilecek maksimum karakter uzunluğunu ifade eder.",
recommend: "Gömme modelinin maksimum karakter uzunluğu",
},
overlap: {
title: "Metin Parçalama Örtüşmesi",
description:
"İki bitişik metin parçası arasındaki, parçalama sırasında oluşabilecek maksimum karakter örtüşme miktarını belirtir.",
},
},
// Vector Database
vector: {
title: "Vektör Veritabanı",
description:
"AnythingLLM örneğinizin nasıl çalışacağını belirleyen kimlik bilgileri ve ayarları burada bulunur. Bu anahtarların güncel ve doğru olması önemlidir.",
provider: {
title: "Vektör Veritabanı Sağlayıcısı",
description: "LanceDB için ek bir yapılandırma gerekmez.",
},
},
// Embeddable Chat Widgets
embeddable: {
title: "Gömülebilir Sohbet Widget'ları",
description:
"Gömülebilir sohbet widget'ları, herkese açık olan ve tek bir çalışma alanına bağlı sohbet arayüzleridir. Bu sayede oluşturduğunuz çalışma alanlarını dünyaya açık hâle getirebilirsiniz.",
create: "Gömme oluştur",
table: {
workspace: "Çalışma Alanı",
chats: "Gönderilen Sohbetler",
Active: "Aktif Alan Adları",
},
},
// Embed Chats
"embed-chats": {
title: "Gömme Sohbetler",
export: "Dışa Aktar",
description:
"Yayımladığınız herhangi bir gömme sohbetten gelen tüm kayıtlı sohbetler ve mesajlar burada bulunur.",
table: {
embed: "Gömme",
sender: "Gönderen",
message: "Mesaj",
response: "Yanıt",
at: "Gönderilme Zamanı",
},
},
// Multi-User Mode
multi: {
title: "Çoklu Kullanıcı Modu",
description:
"Takımınızı desteklemek için örneğinizi yapılandırın ve Çoklu Kullanıcı Modunu etkinleştirin.",
enable: {
"is-enable": "Çoklu Kullanıcı Modu Etkin",
enable: "Çoklu Kullanıcı Modunu Etkinleştir",
description:
"Varsayılan olarak tek yönetici sizsiniz. Yönetici olarak yeni kullanıcılar veya yöneticiler için hesap oluşturmanız gerekir. Şifrenizi kaybetmeyin çünkü yalnızca bir Yönetici kullanıcı şifreleri sıfırlayabilir.",
username: "Yönetici hesap kullanıcı adı",
password: "Yönetici hesap şifresi",
},
password: {
title: "Şifre Koruması",
description:
"AnythingLLM örneğinizi bir şifre ile koruyun. Bu şifreyi unutmanız hâlinde kurtarma yöntemi yoktur, bu yüzden mutlaka güvende saklayın.",
},
instance: {
title: "Örneği Şifreyle Koru",
description:
"Varsayılan olarak tek yönetici sizsiniz. Yönetici olarak yeni kullanıcılar veya yöneticiler için hesap oluşturmanız gerekir. Şifrenizi kaybetmeyin çünkü yalnızca bir Yönetici kullanıcı şifreleri sıfırlayabilir.",
password: "Örnek Şifresi",
},
},
// Event Logs
event: {
title: "Olay Kayıtları",
description:
"Bu örnek üzerinde gerçekleşen tüm eylem ve olayları izlemek için görüntüleyin.",
clear: "Olay Kayıtlarını Temizle",
table: {
type: "Olay Türü",
user: "Kullanıcı",
occurred: "Gerçekleşme Zamanı",
},
},
// Privacy & Data-Handling
privacy: {
title: "Gizlilik & Veri İşleme",
description:
"Bağlantılı üçüncü taraf sağlayıcılarla ve AnythingLLM ile verilerinizin nasıl ele alındığını burada yapılandırabilirsiniz.",
llm: "LLM Seçimi",
embedding: "Gömme Tercihi",
vector: "Vektör Veritabanı",
anonymous: "Anonim Telemetri Etkin",
},
};
export default TRANSLATIONS;
const { SystemSettings } = require("../../../../models/systemSettings");
const { TokenManager } = require("../../../helpers/tiktoken");
const tiktoken = new TokenManager();
const webBrowsing = {
name: "web-browsing",
......@@ -12,6 +14,11 @@ const webBrowsing = {
aibitat.function({
super: aibitat,
name: this.name,
countTokens: (string) =>
tiktoken
.countFromString(string)
.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ","),
description:
"Searches for a given query using a search engine to get better results for the user query.",
examples: [
......@@ -89,6 +96,18 @@ const webBrowsing = {
return await this[engine](query);
},
/**
* Utility function to truncate a string to a given length for debugging
* calls to the API while keeping the actual values mostly intact
* @param {string} str - The string to truncate
* @param {number} length - The length to truncate the string to
* @returns {string} The truncated string
*/
middleTruncate(str, length = 5) {
if (str.length <= length) return str;
return `${str.slice(0, length)}...${str.slice(-length)}`;
},
/**
* Use Google Custom Search Engines
* Free to set up, easy to use, 100 calls/day
......@@ -115,7 +134,12 @@ const webBrowsing = {
}"`
);
const data = await fetch(searchURL)
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ key: this.middleTruncate(process.env.AGENT_GSE_KEY, 5), cx: this.middleTruncate(process.env.AGENT_GSE_CTX, 5), q: query })}`
);
})
.then((searchResult) => searchResult?.items || [])
.then((items) => {
return items.map((item) => {
......@@ -127,16 +151,20 @@ const webBrowsing = {
});
})
.catch((e) => {
console.log(e);
this.super.handlerProps.log(
`${this.name}: Google Search Error: ${e.message}`
);
return [];
});
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
/**
......@@ -173,11 +201,17 @@ const webBrowsing = {
"X-SearchApi-Source": "AnythingLLM",
},
})
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_SEARCHAPI_API_KEY, 5), q: query })}`
);
})
.then((data) => {
return { response: data, error: null };
})
.catch((e) => {
this.super.handlerProps.log(`SearchApi Error: ${e.message}`);
return { response: null, error: e.message };
});
if (error)
......@@ -199,10 +233,12 @@ const webBrowsing = {
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
/**
......@@ -235,11 +271,17 @@ const webBrowsing = {
redirect: "follow",
}
)
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_SERPER_DEV_KEY, 5), q: query })}`
);
})
.then((data) => {
return { response: data, error: null };
})
.catch((e) => {
this.super.handlerProps.log(`Serper.dev Error: ${e.message}`);
return { response: null, error: e.message };
});
if (error)
......@@ -259,10 +301,12 @@ const webBrowsing = {
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
_bingWebSearch: async function (query) {
if (!process.env.AGENT_BING_SEARCH_API_KEY) {
......@@ -289,7 +333,12 @@ const webBrowsing = {
process.env.AGENT_BING_SEARCH_API_KEY,
},
})
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_BING_SEARCH_API_KEY, 5), q: query })}`
);
})
.then((data) => {
const searchResults = data.webPages?.value || [];
return searchResults.map((result) => ({
......@@ -299,16 +348,20 @@ const webBrowsing = {
}));
})
.catch((e) => {
console.log(e);
this.super.handlerProps.log(
`Bing Web Search Error: ${e.message}`
);
return [];
});
if (searchResponse.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(searchResponse);
this.super.introspect(
`${this.caller}: I found ${searchResponse.length} results - looking over them now.`
`${this.caller}: I found ${searchResponse.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(searchResponse);
return result;
},
_serplyEngine: async function (
query,
......@@ -353,20 +406,24 @@ const webBrowsing = {
"X-User-Agent": device_type,
},
})
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_SERPLY_API_KEY, 5), q: query })}`
);
})
.then((data) => {
if (data?.message === "Unauthorized") {
return {
response: null,
error:
"Unauthorized. Please double check your AGENT_SERPLY_API_KEY",
};
}
if (data?.message === "Unauthorized")
throw new Error(
"Unauthorized. Please double check your AGENT_SERPLY_API_KEY"
);
return { response: data, error: null };
})
.catch((e) => {
this.super.handlerProps.log(`Serply Error: ${e.message}`);
return { response: null, error: e.message };
});
if (error)
return `There was an error searching for content. ${error}`;
......@@ -382,10 +439,12 @@ const webBrowsing = {
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
_searXNGEngine: async function (query) {
let searchURL;
......@@ -421,11 +480,19 @@ const webBrowsing = {
"User-Agent": "anything-llm",
},
})
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ url: searchURL.toString() })}`
);
})
.then((data) => {
return { response: data, error: null };
})
.catch((e) => {
this.super.handlerProps.log(
`SearXNG Search Error: ${e.message}`
);
return { response: null, error: e.message };
});
if (error)
......@@ -444,10 +511,12 @@ const webBrowsing = {
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
_tavilySearch: async function (query) {
if (!process.env.AGENT_TAVILY_API_KEY) {
......@@ -474,11 +543,19 @@ const webBrowsing = {
query: query,
}),
})
.then((res) => res.json())
.then((res) => {
if (res.ok) return res.json();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ auth: this.middleTruncate(process.env.AGENT_TAVILY_API_KEY, 5), q: query })}`
);
})
.then((data) => {
return { response: data, error: null };
})
.catch((e) => {
this.super.handlerProps.log(
`Tavily Search Error: ${e.message}`
);
return { response: null, error: e.message };
});
......@@ -497,10 +574,12 @@ const webBrowsing = {
if (data.length === 0)
return `No information was found online for the search query.`;
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
_duckDuckGoEngine: async function (query) {
this.super.introspect(
......@@ -512,15 +591,23 @@ const webBrowsing = {
const searchURL = new URL("https://html.duckduckgo.com/html");
searchURL.searchParams.append("q", query);
const response = await fetch(searchURL.toString());
if (!response.ok) {
return `There was an error searching DuckDuckGo. Status: ${response.status}`;
}
const response = await fetch(searchURL.toString())
.then((res) => {
if (res.ok) return res.text();
throw new Error(
`${res.status} - ${res.statusText}. params: ${JSON.stringify({ url: searchURL.toString() })}`
);
})
.catch((e) => {
this.super.handlerProps.log(
`DuckDuckGo Search Error: ${e.message}`
);
return null;
});
const html = await response.text();
if (!response) return `There was an error searching DuckDuckGo.`;
const html = response;
const data = [];
const results = html.split('<div class="result results_links');
// Skip first element since it's before the first result
......@@ -556,11 +643,11 @@ const webBrowsing = {
return `No information was found online for the search query.`;
}
const result = JSON.stringify(data);
this.super.introspect(
`${this.caller}: I found ${data.length} results - looking over them now.`
`${this.caller}: I found ${data.length} results - reviewing the results now. (~${this.countTokens(result)} tokens)`
);
return JSON.stringify(data);
return result;
},
});
},
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment