feat: add OpenRouter as AI provider (#2906)

Co-authored-by: Amruth Pillai <im.amruth@gmail.com>
This commit is contained in:
iago macedo
2026-04-25 19:00:14 -03:00
committed by GitHub
parent 9b3916d43e
commit 77ad14b359
61 changed files with 378 additions and 132 deletions
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Oopbron"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zoem uit"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zoeloe"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "ክፍት ምንጭ"
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "አጉር"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ዙሉ"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "مفتوح المصدر"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "تصغير"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "الزولو"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Açıq Mənbə"
msgid "OpenAI"
msgstr "Açıq AI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Uzaqlaşdır"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Отворен код"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Намаляване"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Зулуски"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "মুক্ত উৎস"
msgid "OpenAI"
msgstr "ওপেনএআই"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "জুম আউট"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "জুলু"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Codi obert"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Allunya"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulú"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Oddálit"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zoom ud"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Herauszoomen"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Ανοικτού κώδικα"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Σμίκρυνση"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Ζουλού"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zoom out"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5
View File
@@ -2335,6 +2335,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr "OpenRouter"
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Código abierto"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Alejar"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulú"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "متن‌باز"
msgid "OpenAI"
msgstr "اوپن‌ای‌آی"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "کوچک‌نمایی"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "زولو"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Avoin lähdekoodi"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Loitonna"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zoom arrière"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zoulou"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "קוד פתוח"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "התרחקות"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "זולו"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "खुला स्त्रोत"
msgid "OpenAI"
msgstr "ओपनएआई"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "ज़ूम आउट"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ज़ुलु"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Nyílt forráskódú"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Kicsinyítés"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Sumber Terbuka"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Perkecil"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Rimpicciolisci"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "オープンソース"
msgid "OpenAI"
msgstr "オープンAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "ズームアウト"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ズールー語"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "បើក​ប្រភព"
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "បង្រួម"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "ಮುಕ್ತ ಸಂಪನ್ಮೂಲ"
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "ಗಾತ್ರ ಕುಗ್ಗಿಸಿ"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ಜೂಲೂ"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "오픈 소스"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "축소"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "줄루어"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Atviro kodo"
msgid "OpenAI"
msgstr "\"OpenAI\""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Tolinti"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulų"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Atvērtā pirmkoda"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Tālināt"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "ഓപ്പൺ സോഴ്‌സ്"
msgid "OpenAI"
msgstr "ഓപ്പൺഎഐ"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "സൂം ഔട്ട് ചെയ്യുക"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "സൂളു"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "मुक्त स्रोत"
msgid "OpenAI"
msgstr "ओपनएआय"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "बाहेर झूम करा"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "झुलू"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Sumber Terbuka"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zum keluar"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "खुला-स्रोत"
msgid "OpenAI"
msgstr "ओपनएआई"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "जूम आउट"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "जुलु"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Uitzoomen"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Åpen kildekode"
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zoom ut"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "ଖୋଲା‑ମୂଳ"
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "ଜୁମ୍ ଆଉଟ୍ କରନ୍ତୁ"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ଜୁଲୁ"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Pomniejsz"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Código Aberto"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Diminuir zoom"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Código aberto"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Afastar"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Sursă publică"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Micșorează"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Открытый исходный код"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Уменьшить"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Зулу"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Oddialiť"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Odprta koda"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Oddalji"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zuluščina"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Open Source"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zvogëlo"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Отворени код"
msgid "OpenAI"
msgstr "ОпенАИ"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Умањи"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Зулу"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Öppen källkod"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Zooma ut"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "திறந்த மூல"
msgid "OpenAI"
msgstr "ஓப்பன்ஏஐ"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "சிறிதாக்கு"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ஜூலு"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "ఓపెన్ సోర్స్"
msgid "OpenAI"
msgstr "ఓపెన్ఏఐ"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "జూమ్ అవుట్ చేయండి"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "జులు"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "โอเพนซอร์ส"
msgid "OpenAI"
msgstr "โอเพ่นเอไอ"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "ซูมออก"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "ซูลู"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Açık Kaynak"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Uzaklaştır"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Опен-сорс"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Зменшити"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Зулу"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Ochiq kodli"
msgid "OpenAI"
msgstr "Ochiq AI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Kichraytirish"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "Mã nguồn mở"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "Thu nhỏ"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "Zulu"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "开源"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "缩小"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "祖鲁语"
+5 -1
View File
@@ -2340,6 +2340,11 @@ msgstr "開放原始碼"
msgid "OpenAI"
msgstr "OpenAI"
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
@@ -3929,4 +3934,3 @@ msgstr "縮小"
#: src/utils/locale.ts
msgid "Zulu"
msgstr "祖魯語"
+5
View File
@@ -2335,6 +2335,11 @@ msgstr ""
msgid "OpenAI"
msgstr ""
#. AI provider option label in dashboard AI settings
#: src/routes/dashboard/settings/ai.tsx
msgid "OpenRouter"
msgstr ""
#: src/routes/_home/-sections/donate.tsx
#: src/routes/_home/-sections/footer.tsx
msgid "opens in new tab"
+4 -3
View File
@@ -38,6 +38,7 @@
"@ai-sdk/anthropic": "^3.0.71",
"@ai-sdk/google": "^3.0.64",
"@ai-sdk/openai": "^3.0.53",
"@ai-sdk/openai-compatible": "^2.0.41",
"@aws-sdk/client-s3": "^3.1037.0",
"@base-ui/react": "^1.4.1",
"@better-auth/api-key": "^1.6.9",
@@ -67,7 +68,7 @@
"@t3-oss/env-core": "^0.13.11",
"@tanstack/react-query": "^5.100.5",
"@tanstack/react-router": "^1.168.24",
"@tanstack/react-router-ssr-query": "^1.166.11",
"@tanstack/react-router-ssr-query": "^1.166.12",
"@tanstack/react-start": "^1.167.49",
"@tanstack/zod-adapter": "^1.166.9",
"@tiptap/extension-highlight": "^3.22.4",
@@ -79,7 +80,6 @@
"@uiw/color-convert": "^2.10.1",
"@uiw/react-color-colorful": "^2.10.1",
"ai": "^6.0.168",
"ai-sdk-ollama": "^3.8.3",
"bcrypt": "^6.0.0",
"better-auth": "^1.6.9",
"class-variance-authority": "^0.7.1",
@@ -99,6 +99,7 @@
"monaco-editor": "^0.55.1",
"motion": "^12.38.0",
"nodemailer": "^8.0.6",
"ollama-ai-provider-v2": "^3.5.0",
"pg": "^8.20.0",
"puppeteer-core": "^24.42.0",
"qrcode.react": "^4.2.0",
@@ -152,7 +153,7 @@
"nitro": "3.0.260415-beta",
"node-addon-api": "^8.7.0",
"node-gyp": "^12.3.0",
"npm-check-updates": "^22.0.0",
"npm-check-updates": "^22.0.1",
"vite": "npm:@voidzero-dev/vite-plus-core@^0.1.19",
"vite-plugin-pwa": "^1.2.0",
"vite-plus": "^0.1.19",
+47 -46
View File
@@ -29,6 +29,9 @@ importers:
'@ai-sdk/openai':
specifier: ^3.0.53
version: 3.0.53(zod@4.3.6)
'@ai-sdk/openai-compatible':
specifier: ^2.0.41
version: 2.0.41(zod@4.3.6)
'@aws-sdk/client-s3':
specifier: ^3.1037.0
version: 3.1037.0
@@ -117,8 +120,8 @@ importers:
specifier: ^1.168.24
version: 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@tanstack/react-router-ssr-query':
specifier: ^1.166.11
version: 1.166.11(@tanstack/query-core@5.100.5)(@tanstack/react-query@5.100.5(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
specifier: ^1.166.12
version: 1.166.12(@tanstack/query-core@5.100.5)(@tanstack/react-query@5.100.5(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@tanstack/react-start':
specifier: ^1.167.49
version: 1.167.49(@voidzero-dev/vite-plus-core@0.1.19(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3))(crossws@0.4.5(srvx@0.11.15))(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
@@ -152,9 +155,6 @@ importers:
ai:
specifier: ^6.0.168
version: 6.0.168(zod@4.3.6)
ai-sdk-ollama:
specifier: ^3.8.3
version: 3.8.3(ai@6.0.168(zod@4.3.6))(zod@4.3.6)
bcrypt:
specifier: ^6.0.0
version: 6.0.0
@@ -212,6 +212,9 @@ importers:
nodemailer:
specifier: ^8.0.6
version: 8.0.6
ollama-ai-provider-v2:
specifier: ^3.5.0
version: 3.5.0(ai@6.0.168(zod@4.3.6))(zod@4.3.6)
pg:
specifier: ^8.20.0
version: 8.20.0
@@ -367,8 +370,8 @@ importers:
specifier: ^12.3.0
version: 12.3.0
npm-check-updates:
specifier: ^22.0.0
version: 22.0.0
specifier: ^22.0.1
version: 22.0.1
vite:
specifier: npm:@voidzero-dev/vite-plus-core@^0.1.19
version: '@voidzero-dev/vite-plus-core@0.1.19(@types/node@25.6.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.8.3)'
@@ -402,6 +405,12 @@ packages:
peerDependencies:
zod: ^3.25.76 || ^4.1.8
'@ai-sdk/openai-compatible@2.0.41':
resolution: {integrity: sha512-kNAGINk71AlOXx10Dq/PXw4t/9XjdK8uxfpVElRwtSFMdeSiLVt58p9TPx4/FJD+hxZuVhvxYj9r42osxWq79g==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
'@ai-sdk/openai@3.0.53':
resolution: {integrity: sha512-Wld+Rbc05KaUn08uBt06eEuwcgalcIFtIl32Yp+GxuZXUQwOb6YeAuq+C6da4ch6BurFoqEaLemJVwjBb7x+PQ==}
engines: {node: '>=18'}
@@ -3464,8 +3473,8 @@ packages:
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router-ssr-query@1.166.11':
resolution: {integrity: sha512-i81a5avRWgTjSKH5VYttbQ/Y86Il8GIkdcrIlyYUys0Lt1zMCxkTGHH9lBN5ZmhBe3mzwQ+9jOlx9xSxj8Kx0w==}
'@tanstack/react-router-ssr-query@1.166.12':
resolution: {integrity: sha512-yDUIoEh+PimAcWmk/2BE0EkI8TwLVeToNzoIuwahmTtBUR+ptZPWbtiPjudO8JZ0BhT3odHtuOn1eBOK0/4NAQ==}
engines: {node: '>=20.19'}
peerDependencies:
'@tanstack/query-core': '>=5.90.0'
@@ -3567,8 +3576,8 @@ packages:
webpack:
optional: true
'@tanstack/router-ssr-query-core@1.167.1':
resolution: {integrity: sha512-sJNRHa36lfuHw04akO9C6KU1P1Ncam2Azsk5XlgdQHMFgOtSlFAsuwqAHpyYSwu5Jyxj6P3PmyKYMIm4u8dI7Q==}
'@tanstack/router-ssr-query-core@1.168.0':
resolution: {integrity: sha512-5yBUAF1d9z2kOFKoz1spvpvkMSTmRnRXEwi+bGKfrXYmt7CfHu3Pk8KUFMln67uQoKQ9VTkcd5tLkjJVrZ2/AQ==}
engines: {node: '>=20.19'}
peerDependencies:
'@tanstack/query-core': '>=5.90.0'
@@ -4186,12 +4195,6 @@ packages:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
ai-sdk-ollama@3.8.3:
resolution: {integrity: sha512-KId/S++eb0CgTPFTtHzCGCrO73kXZLK+hyyZx5k8LVqU2XOEHYKVbIwDiQ+hm3okHjnsGehn4zR4QNm14SUM3Q==}
engines: {node: '>=22'}
peerDependencies:
ai: ^6.0.154
ai@6.0.168:
resolution: {integrity: sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ==}
engines: {node: '>=18'}
@@ -4366,8 +4369,8 @@ packages:
bare-url@2.4.2:
resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==}
baseline-browser-mapping@2.10.21:
resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==}
baseline-browser-mapping@2.10.22:
resolution: {integrity: sha512-6qruVrb5rse6WylFkU0FhBKKGuecWseqdpQfhkawn6ztyk2QlfwSRjsDxMCLJrkfmfN21qvhl9ABgaMeRkuwww==}
engines: {node: '>=6.0.0'}
hasBin: true
@@ -6178,8 +6181,8 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
npm-check-updates@22.0.0:
resolution: {integrity: sha512-GaxO5Ags6tGWVPc6lHL5WB6xZ8RzRk/QRX/2SyAg/vheW992csn4hMPLExltFBlDeprMIkwZtAPk8Hg1TyLWnw==}
npm-check-updates@22.0.1:
resolution: {integrity: sha512-K8PDu7l9v7UKIwDSxLnqA9LHT76Mu4eCjGjp0JwSeSsyKWmX/YZY+AoBxw4oVdKwQLthWbzg1g+OKysHYGQCjQ==}
engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: '>=10.0.0'}
hasBin: true
@@ -6226,8 +6229,12 @@ packages:
ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
ollama@0.6.3:
resolution: {integrity: sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==}
ollama-ai-provider-v2@3.5.0:
resolution: {integrity: sha512-+s/aYIYa91z2Vk3AkGAz3BaPAQ0flS2eFZD3BN2mD/N6W6YQbcookyu6pc2cbc8SP5VGpNB857WJ0eHDjKXsXw==}
engines: {node: '>=18'}
peerDependencies:
ai: ^5.0.0 || ^6.0.0
zod: ^4.0.16
on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
@@ -7478,9 +7485,6 @@ packages:
engines: {node: '>=18'}
deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
whatwg-fetch@3.6.20:
resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
whatwg-mimetype@3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
@@ -7722,6 +7726,12 @@ snapshots:
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
zod: 4.3.6
'@ai-sdk/openai-compatible@2.0.41(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
zod: 4.3.6
'@ai-sdk/openai@3.0.53(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
@@ -10964,12 +10974,12 @@ snapshots:
'@tanstack/query-core': 5.100.5
react: 19.2.5
'@tanstack/react-router-ssr-query@1.166.11(@tanstack/query-core@5.100.5)(@tanstack/react-query@5.100.5(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
'@tanstack/react-router-ssr-query@1.166.12(@tanstack/query-core@5.100.5)(@tanstack/react-query@5.100.5(react@19.2.5))(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies:
'@tanstack/query-core': 5.100.5
'@tanstack/react-query': 5.100.5(react@19.2.5)
'@tanstack/react-router': 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@tanstack/router-ssr-query-core': 1.167.1(@tanstack/query-core@5.100.5)(@tanstack/router-core@1.168.16)
'@tanstack/router-ssr-query-core': 1.168.0(@tanstack/query-core@5.100.5)(@tanstack/router-core@1.168.16)
react: 19.2.5
react-dom: 19.2.5(react@19.2.5)
transitivePeerDependencies:
@@ -11097,7 +11107,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-ssr-query-core@1.167.1(@tanstack/query-core@5.100.5)(@tanstack/router-core@1.168.16)':
'@tanstack/router-ssr-query-core@1.168.0(@tanstack/query-core@5.100.5)(@tanstack/router-core@1.168.16)':
dependencies:
'@tanstack/query-core': 5.100.5
'@tanstack/router-core': 1.168.16
@@ -11689,16 +11699,6 @@ snapshots:
agent-base@7.1.4: {}
ai-sdk-ollama@3.8.3(ai@6.0.168(zod@4.3.6))(zod@4.3.6):
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
ai: 6.0.168(zod@4.3.6)
jsonrepair: 3.14.0
ollama: 0.6.3
transitivePeerDependencies:
- zod
ai@6.0.168(zod@4.3.6):
dependencies:
'@ai-sdk/gateway': 3.0.104(zod@4.3.6)
@@ -11873,7 +11873,7 @@ snapshots:
dependencies:
bare-path: 3.0.0
baseline-browser-mapping@2.10.21: {}
baseline-browser-mapping@2.10.22: {}
basic-ftp@5.3.0: {}
@@ -11956,7 +11956,7 @@ snapshots:
browserslist@4.28.2:
dependencies:
baseline-browser-mapping: 2.10.21
baseline-browser-mapping: 2.10.22
caniuse-lite: 1.0.30001790
electron-to-chromium: 1.5.344
node-releases: 2.0.38
@@ -13576,7 +13576,7 @@ snapshots:
normalize-path@3.0.0: {}
npm-check-updates@22.0.0: {}
npm-check-updates@22.0.1: {}
npm-run-path@4.0.1:
dependencies:
@@ -13618,9 +13618,12 @@ snapshots:
ohash@2.0.11: {}
ollama@0.6.3:
ollama-ai-provider-v2@3.5.0(ai@6.0.168(zod@4.3.6))(zod@4.3.6):
dependencies:
whatwg-fetch: 3.6.20
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
ai: 6.0.168(zod@4.3.6)
zod: 4.3.6
on-finished@2.4.1:
dependencies:
@@ -15080,8 +15083,6 @@ snapshots:
dependencies:
iconv-lite: 0.6.3
whatwg-fetch@3.6.20: {}
whatwg-mimetype@3.0.0: {}
whatwg-mimetype@4.0.0: {}
+1 -1
View File
@@ -4,7 +4,7 @@ import { createJSONStorage, persist } from "zustand/middleware";
import { immer } from "zustand/middleware/immer";
import { create } from "zustand/react";
export type AIProvider = "vercel-ai-gateway" | "openai" | "gemini" | "anthropic" | "ollama";
import type { AIProvider } from "./types";
type TestStatus = "unverified" | "success" | "failure";
+7
View File
@@ -0,0 +1,7 @@
import { z } from "zod";
export const AI_PROVIDERS = ["openai", "anthropic", "gemini", "vercel-ai-gateway", "openrouter", "ollama"] as const;
export type AIProvider = (typeof AI_PROVIDERS)[number];
export const aiProviderSchema = z.enum(AI_PROVIDERS);
+19 -15
View File
@@ -3,6 +3,7 @@ import type { ModelMessage } from "ai";
import { createAnthropic } from "@ai-sdk/anthropic";
import { createGoogleGenerativeAI } from "@ai-sdk/google";
import { createOpenAI } from "@ai-sdk/openai";
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { streamToEventIterator } from "@orpc/server";
import {
convertToModelMessages,
@@ -14,8 +15,8 @@ import {
tool,
type UIMessage,
} from "ai";
import { createOllama } from "ai-sdk-ollama";
import { jsonrepair } from "jsonrepair";
import { createOllama } from "ollama-ai-provider-v2";
import { match } from "ts-pattern";
import z, { flattenError, ZodError } from "zod";
@@ -34,9 +35,10 @@ import {
patchResumeDescription,
patchResumeInputSchema,
} from "@/integrations/ai/tools/patch-resume";
import { aiProviderSchema, type AIProvider } from "@/integrations/ai/types";
import { resumeAnalysisSchema, type ResumeAnalysis } from "@/schema/resume/analysis";
import { defaultResumeData, resumeDataSchema } from "@/schema/resume/data";
import { type TailorOutput, tailorOutputSchema } from "@/schema/tailor";
import { tailorOutputSchema, type TailorOutput } from "@/schema/tailor";
import { buildAiExtractionTemplate } from "@/utils/ai-template";
import { env } from "@/utils/env";
import { isObject } from "@/utils/sanitize";
@@ -201,10 +203,6 @@ function normalizeResumeDataForSchema(data: Record<string, unknown>) {
return { ...data, sections: normalizedSections };
}
export const aiProviderSchema = z.enum(["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"]);
type AIProvider = z.infer<typeof aiProviderSchema>;
type GetModelInput = {
provider: AIProvider;
model: string;
@@ -220,16 +218,13 @@ const defaultProviderHosts: Record<Exclude<AIProvider, "ollama">, string[]> = {
anthropic: ["api.anthropic.com"],
gemini: ["generativelanguage.googleapis.com"],
"vercel-ai-gateway": ["gateway.ai.vercel.com"],
openrouter: ["openrouter.ai"],
};
function resolveBaseUrl(input: GetModelInput) {
function resolveBaseUrl(input: GetModelInput): string {
const baseURL = input.baseURL?.trim();
if (!baseURL) {
if (input.provider === "ollama") {
throw new Error("INVALID_AI_BASE_URL");
}
return undefined;
}
if (!baseURL) throw new Error("INVALID_AI_BASE_URL");
const providerHosts = input.provider === "ollama" ? [] : defaultProviderHosts[input.provider];
const allowedHosts = new Set([...providerHosts, ...adminAllowedBaseUrls]);
@@ -246,10 +241,19 @@ function getModel(input: GetModelInput) {
return match(provider)
.with("openai", () => createOpenAI({ apiKey, baseURL }).chat(model))
.with("ollama", () => createOllama({ apiKey, baseURL }).languageModel(model))
.with("anthropic", () => createAnthropic({ apiKey, baseURL }).languageModel(model))
.with("vercel-ai-gateway", () => createGateway({ apiKey, baseURL }).languageModel(model))
.with("gemini", () => createGoogleGenerativeAI({ apiKey, baseURL }).languageModel(model))
.with("vercel-ai-gateway", () => createGateway({ apiKey, baseURL }).languageModel(model))
.with("openrouter", () => createOpenAICompatible({ name: "openrouter", apiKey, baseURL }).languageModel(model))
.with("ollama", () => {
const ollama = createOllama({
name: "ollama",
baseURL,
headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,
});
return ollama.languageModel(model);
})
.exhaustive();
}
+25 -14
View File
@@ -8,6 +8,8 @@ import { useMemo } from "react";
import { toast } from "sonner";
import { useIsClient } from "usehooks-ts";
import type { AIProvider } from "@/integrations/ai/types";
import { Button } from "@/components/ui/button";
import { Combobox, type ComboboxOption } from "@/components/ui/combobox";
import { Input } from "@/components/ui/input";
@@ -15,7 +17,7 @@ import { Label } from "@/components/ui/label";
import { Separator } from "@/components/ui/separator";
import { Spinner } from "@/components/ui/spinner";
import { Switch } from "@/components/ui/switch";
import { type AIProvider, useAIStore } from "@/integrations/ai/store";
import { useAIStore } from "@/integrations/ai/store";
import { orpc } from "@/integrations/orpc/client";
import { getOrpcErrorMessage } from "@/utils/error-message";
import { cn } from "@/utils/style";
@@ -36,15 +38,6 @@ const providerOptions: (ComboboxOption<AIProvider> & { defaultBaseURL: string })
keywords: ["openai", "gpt", "chatgpt"],
defaultBaseURL: "https://api.openai.com/v1",
},
{
value: "ollama",
label: t({
comment: "AI provider option label in dashboard AI settings",
message: "Ollama",
}),
keywords: ["ollama", "ai", "local"],
defaultBaseURL: "http://localhost:11434",
},
{
value: "anthropic",
label: t({
@@ -54,6 +47,15 @@ const providerOptions: (ComboboxOption<AIProvider> & { defaultBaseURL: string })
keywords: ["anthropic", "claude", "ai"],
defaultBaseURL: "https://api.anthropic.com/v1",
},
{
value: "gemini",
label: t({
comment: "AI provider option label in dashboard AI settings",
message: "Google Gemini",
}),
keywords: ["gemini", "google", "bard"],
defaultBaseURL: "https://generativelanguage.googleapis.com/v1beta",
},
{
value: "vercel-ai-gateway",
label: t({
@@ -64,13 +66,22 @@ const providerOptions: (ComboboxOption<AIProvider> & { defaultBaseURL: string })
defaultBaseURL: "https://ai-gateway.vercel.sh/v1/ai",
},
{
value: "gemini",
value: "openrouter",
label: t({
comment: "AI provider option label in dashboard AI settings",
message: "Google Gemini",
message: "OpenRouter",
}),
keywords: ["gemini", "google", "bard"],
defaultBaseURL: "https://generativelanguage.googleapis.com/v1beta",
keywords: ["openrouter", "router", "multi", "proxy"],
defaultBaseURL: "https://openrouter.ai/api/v1",
},
{
value: "ollama",
label: t({
comment: "AI provider option label in dashboard AI settings",
message: "Ollama",
}),
keywords: ["ollama", "ai", "local"],
defaultBaseURL: "https://ollama.com/api",
},
];