diff --git a/locales/af-ZA.po b/locales/af-ZA.po index 067b51343..2a1a853a3 100644 --- a/locales/af-ZA.po +++ b/locales/af-ZA.po @@ -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" - diff --git a/locales/am-ET.po b/locales/am-ET.po index 04c9f1b94..634d669e9 100644 --- a/locales/am-ET.po +++ b/locales/am-ET.po @@ -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 "ዙሉ" - diff --git a/locales/ar-SA.po b/locales/ar-SA.po index 9b9fa303b..f67477d54 100644 --- a/locales/ar-SA.po +++ b/locales/ar-SA.po @@ -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 "الزولو" - diff --git a/locales/az-AZ.po b/locales/az-AZ.po index 76d8c972f..88fc11e8d 100644 --- a/locales/az-AZ.po +++ b/locales/az-AZ.po @@ -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" - diff --git a/locales/bg-BG.po b/locales/bg-BG.po index 85002f7a4..9999f2816 100644 --- a/locales/bg-BG.po +++ b/locales/bg-BG.po @@ -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 "Зулуски" - diff --git a/locales/bn-BD.po b/locales/bn-BD.po index c9585739f..898a7e5f9 100644 --- a/locales/bn-BD.po +++ b/locales/bn-BD.po @@ -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 "জুলু" - diff --git a/locales/ca-ES.po b/locales/ca-ES.po index d7fe0a51a..3f8dff76d 100644 --- a/locales/ca-ES.po +++ b/locales/ca-ES.po @@ -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ú" - diff --git a/locales/cs-CZ.po b/locales/cs-CZ.po index 6798190c2..b0e57b3d1 100644 --- a/locales/cs-CZ.po +++ b/locales/cs-CZ.po @@ -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" - diff --git a/locales/da-DK.po b/locales/da-DK.po index 2d9ebfc77..6abbef1c7 100644 --- a/locales/da-DK.po +++ b/locales/da-DK.po @@ -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" - diff --git a/locales/de-DE.po b/locales/de-DE.po index d382c141a..0a5ce8d60 100644 --- a/locales/de-DE.po +++ b/locales/de-DE.po @@ -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" - diff --git a/locales/el-GR.po b/locales/el-GR.po index b1737a856..d24119e79 100644 --- a/locales/el-GR.po +++ b/locales/el-GR.po @@ -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 "Ζουλού" - diff --git a/locales/en-GB.po b/locales/en-GB.po index 4ace49bee..5375b1962 100644 --- a/locales/en-GB.po +++ b/locales/en-GB.po @@ -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" - diff --git a/locales/en-US.po b/locales/en-US.po index cf04786bf..4ad049e71 100644 --- a/locales/en-US.po +++ b/locales/en-US.po @@ -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" diff --git a/locales/es-ES.po b/locales/es-ES.po index 6bdf855b1..e8e24851e 100644 --- a/locales/es-ES.po +++ b/locales/es-ES.po @@ -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ú" - diff --git a/locales/fa-IR.po b/locales/fa-IR.po index cb8df8455..c51e5271f 100644 --- a/locales/fa-IR.po +++ b/locales/fa-IR.po @@ -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 "زولو" - diff --git a/locales/fi-FI.po b/locales/fi-FI.po index 8849e2155..532b06023 100644 --- a/locales/fi-FI.po +++ b/locales/fi-FI.po @@ -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" - diff --git a/locales/fr-FR.po b/locales/fr-FR.po index c02dbfff7..a5578987e 100644 --- a/locales/fr-FR.po +++ b/locales/fr-FR.po @@ -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" - diff --git a/locales/he-IL.po b/locales/he-IL.po index b95659c6f..94dce24dd 100644 --- a/locales/he-IL.po +++ b/locales/he-IL.po @@ -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 "זולו" - diff --git a/locales/hi-IN.po b/locales/hi-IN.po index 1c0622d03..c3024dbd3 100644 --- a/locales/hi-IN.po +++ b/locales/hi-IN.po @@ -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 "ज़ुलु" - diff --git a/locales/hu-HU.po b/locales/hu-HU.po index ae93193c7..36a3d2ba7 100644 --- a/locales/hu-HU.po +++ b/locales/hu-HU.po @@ -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" - diff --git a/locales/id-ID.po b/locales/id-ID.po index 602dbe4bc..f60751ba3 100644 --- a/locales/id-ID.po +++ b/locales/id-ID.po @@ -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" - diff --git a/locales/it-IT.po b/locales/it-IT.po index 940f69f89..d44004808 100644 --- a/locales/it-IT.po +++ b/locales/it-IT.po @@ -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" - diff --git a/locales/ja-JP.po b/locales/ja-JP.po index 7064bae99..d7883ee93 100644 --- a/locales/ja-JP.po +++ b/locales/ja-JP.po @@ -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 "ズールー語" - diff --git a/locales/km-KH.po b/locales/km-KH.po index 9d1196528..1d1427807 100644 --- a/locales/km-KH.po +++ b/locales/km-KH.po @@ -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" - diff --git a/locales/kn-IN.po b/locales/kn-IN.po index ddb413d2f..e2017d0dc 100644 --- a/locales/kn-IN.po +++ b/locales/kn-IN.po @@ -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 "ಜೂಲೂ" - diff --git a/locales/ko-KR.po b/locales/ko-KR.po index aeb2cd096..d43d8866b 100644 --- a/locales/ko-KR.po +++ b/locales/ko-KR.po @@ -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 "줄루어" - diff --git a/locales/lt-LT.po b/locales/lt-LT.po index 4048ae820..7f57645f7 100644 --- a/locales/lt-LT.po +++ b/locales/lt-LT.po @@ -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ų" - diff --git a/locales/lv-LV.po b/locales/lv-LV.po index d7bbee72b..215355788 100644 --- a/locales/lv-LV.po +++ b/locales/lv-LV.po @@ -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" - diff --git a/locales/ml-IN.po b/locales/ml-IN.po index fcd688b4d..e83d00ab0 100644 --- a/locales/ml-IN.po +++ b/locales/ml-IN.po @@ -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 "സൂളു" - diff --git a/locales/mr-IN.po b/locales/mr-IN.po index b1e8427ef..a0b50ff6c 100644 --- a/locales/mr-IN.po +++ b/locales/mr-IN.po @@ -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 "झुलू" - diff --git a/locales/ms-MY.po b/locales/ms-MY.po index 2dae3a6a2..8f0e30893 100644 --- a/locales/ms-MY.po +++ b/locales/ms-MY.po @@ -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" - diff --git a/locales/ne-NP.po b/locales/ne-NP.po index 81090c1f9..3ec2a68ff 100644 --- a/locales/ne-NP.po +++ b/locales/ne-NP.po @@ -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 "जुलु" - diff --git a/locales/nl-NL.po b/locales/nl-NL.po index 28ae8a943..1c3283425 100644 --- a/locales/nl-NL.po +++ b/locales/nl-NL.po @@ -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" - diff --git a/locales/no-NO.po b/locales/no-NO.po index 1f6352498..622b88b8d 100644 --- a/locales/no-NO.po +++ b/locales/no-NO.po @@ -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" - diff --git a/locales/or-IN.po b/locales/or-IN.po index c48356bce..0ece13887 100644 --- a/locales/or-IN.po +++ b/locales/or-IN.po @@ -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 "ଜୁଲୁ" - diff --git a/locales/pl-PL.po b/locales/pl-PL.po index cab92d5ba..c903d992d 100644 --- a/locales/pl-PL.po +++ b/locales/pl-PL.po @@ -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" - diff --git a/locales/pt-BR.po b/locales/pt-BR.po index df6612cb4..8c34a775c 100644 --- a/locales/pt-BR.po +++ b/locales/pt-BR.po @@ -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" - diff --git a/locales/pt-PT.po b/locales/pt-PT.po index 93561a99c..3d0b166cf 100644 --- a/locales/pt-PT.po +++ b/locales/pt-PT.po @@ -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" - diff --git a/locales/ro-RO.po b/locales/ro-RO.po index de8b2f5e5..6511ee304 100644 --- a/locales/ro-RO.po +++ b/locales/ro-RO.po @@ -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" - diff --git a/locales/ru-RU.po b/locales/ru-RU.po index 62aa21a13..52e361591 100644 --- a/locales/ru-RU.po +++ b/locales/ru-RU.po @@ -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 "Зулу" - diff --git a/locales/sk-SK.po b/locales/sk-SK.po index 35023426b..782644453 100644 --- a/locales/sk-SK.po +++ b/locales/sk-SK.po @@ -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" - diff --git a/locales/sl-SI.po b/locales/sl-SI.po index 312ab3883..affef0cf9 100644 --- a/locales/sl-SI.po +++ b/locales/sl-SI.po @@ -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" - diff --git a/locales/sq-AL.po b/locales/sq-AL.po index 39d340d04..61bedb575 100644 --- a/locales/sq-AL.po +++ b/locales/sq-AL.po @@ -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" - diff --git a/locales/sr-SP.po b/locales/sr-SP.po index 81e51419e..36ca380fa 100644 --- a/locales/sr-SP.po +++ b/locales/sr-SP.po @@ -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 "Зулу" - diff --git a/locales/sv-SE.po b/locales/sv-SE.po index 7d1cee2db..042684e42 100644 --- a/locales/sv-SE.po +++ b/locales/sv-SE.po @@ -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" - diff --git a/locales/ta-IN.po b/locales/ta-IN.po index 3ff2385c4..00560c874 100644 --- a/locales/ta-IN.po +++ b/locales/ta-IN.po @@ -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 "ஜூலு" - diff --git a/locales/te-IN.po b/locales/te-IN.po index e09c275ca..20b1ce9ca 100644 --- a/locales/te-IN.po +++ b/locales/te-IN.po @@ -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 "జులు" - diff --git a/locales/th-TH.po b/locales/th-TH.po index ddab57c46..f16eba222 100644 --- a/locales/th-TH.po +++ b/locales/th-TH.po @@ -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 "ซูลู" - diff --git a/locales/tr-TR.po b/locales/tr-TR.po index c45e21f22..2abdf6cb5 100644 --- a/locales/tr-TR.po +++ b/locales/tr-TR.po @@ -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" - diff --git a/locales/uk-UA.po b/locales/uk-UA.po index a53ad7590..a3df351d3 100644 --- a/locales/uk-UA.po +++ b/locales/uk-UA.po @@ -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 "Зулу" - diff --git a/locales/uz-UZ.po b/locales/uz-UZ.po index e254285d1..e2767290b 100644 --- a/locales/uz-UZ.po +++ b/locales/uz-UZ.po @@ -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" - diff --git a/locales/vi-VN.po b/locales/vi-VN.po index 24c91d82f..3332cd559 100644 --- a/locales/vi-VN.po +++ b/locales/vi-VN.po @@ -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" - diff --git a/locales/zh-CN.po b/locales/zh-CN.po index 0fe76972d..67ce2dfa8 100644 --- a/locales/zh-CN.po +++ b/locales/zh-CN.po @@ -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 "祖鲁语" - diff --git a/locales/zh-TW.po b/locales/zh-TW.po index f5081192e..bc5a61324 100644 --- a/locales/zh-TW.po +++ b/locales/zh-TW.po @@ -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 "祖魯語" - diff --git a/locales/zu-ZA.po b/locales/zu-ZA.po index db903eccc..df468288d 100644 --- a/locales/zu-ZA.po +++ b/locales/zu-ZA.po @@ -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" diff --git a/package.json b/package.json index 9e23ff1e4..3acd3f552 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c48a0bda2..64e1801b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -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: {} diff --git a/src/integrations/ai/store.ts b/src/integrations/ai/store.ts index fef1714a2..382270968 100644 --- a/src/integrations/ai/store.ts +++ b/src/integrations/ai/store.ts @@ -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"; diff --git a/src/integrations/ai/types.ts b/src/integrations/ai/types.ts new file mode 100644 index 000000000..e292671be --- /dev/null +++ b/src/integrations/ai/types.ts @@ -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); diff --git a/src/integrations/orpc/services/ai.ts b/src/integrations/orpc/services/ai.ts index 9ed41bb6c..6ab8efac7 100644 --- a/src/integrations/orpc/services/ai.ts +++ b/src/integrations/orpc/services/ai.ts @@ -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) { return { ...data, sections: normalizedSections }; } -export const aiProviderSchema = z.enum(["ollama", "openai", "gemini", "anthropic", "vercel-ai-gateway"]); - -type AIProvider = z.infer; - type GetModelInput = { provider: AIProvider; model: string; @@ -220,16 +218,13 @@ const defaultProviderHosts: Record, 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(); } diff --git a/src/routes/dashboard/settings/ai.tsx b/src/routes/dashboard/settings/ai.tsx index 2ca802e3a..1bfecc4fb 100644 --- a/src/routes/dashboard/settings/ai.tsx +++ b/src/routes/dashboard/settings/ai.tsx @@ -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 & { 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 & { 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 & { 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", }, ];