Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/browser-extension/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"superjson": "^2.2.1",
"tailwind-merge": "^2.2.1",
"tailwindcss-animate": "^1.0.7",
"zod": "^3.24.2"
"zod": "^3.25.0"
},
"devDependencies": {
"@crxjs/vite-plugin": "2.2.0",
Expand Down
2 changes: 1 addition & 1 deletion apps/mcp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,6 @@
"@karakeep/sdk": "workspace:*",
"@modelcontextprotocol/sdk": "^1.9.0",
"turndown": "^7.2.0",
"zod": "^3.24.2"
"zod": "^3.25.0"
}
}
2 changes: 1 addition & 1 deletion apps/mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
"react-native-webview": "^13.13.5",
"sonner-native": "^0.22.2",
"tailwind-merge": "^2.2.1",
"zod": "^3.24.2",
"zod": "^3.25.0",
"zustand": "^5.0.5"
},
"devDependencies": {
Expand Down
97 changes: 96 additions & 1 deletion apps/web/components/settings/AISettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ import { api } from "@/lib/trpc";
import { useUserSettings } from "@/lib/userSettings";
import { cn } from "@/lib/utils";
import { zodResolver } from "@hookform/resolvers/zod";
import { Info, Plus, Save, Trash2 } from "lucide-react";
import { Bot, Cpu, Image, Info, Plus, Save, Trash2 } from "lucide-react";
import { Controller, useForm } from "react-hook-form";
import { z } from "zod";

Expand Down Expand Up @@ -82,6 +82,98 @@ function SettingsSection({
);
}

const providerDisplayNames: Record<string, string> = {
openai: "OpenAI",
anthropic: "Anthropic Claude",
google: "Google Gemini",
ollama: "Ollama (Local)",
};

function ProviderInfoItem({
icon,
label,
value,
}: {
icon: React.ReactNode;
label: string;
value: string;
}) {
return (
<div className="flex items-center gap-3">
<div
className="flex h-8 w-8 items-center justify-center rounded-md bg-muted"
aria-hidden="true"
>
{icon}
</div>
<div className="flex flex-col">
<span className="text-xs text-muted-foreground">{label}</span>
<span className="text-sm font-medium">{value}</span>
</div>
</div>
);
}

export function ProviderIndicator() {
const { t } = useTranslation();
const clientConfig = useClientConfig();

const { provider, textModel, imageModel, embeddingProvider, embeddingModel } =
clientConfig.inference;

if (!provider) {
return (
<SettingsSection title={t("settings.ai.provider_status")}>
<div className="flex items-start gap-2 rounded-md bg-amber-50 p-4 text-sm text-amber-800 dark:bg-amber-950 dark:text-amber-200">
<Info className="size-4 flex-shrink-0" />
<p>{t("settings.ai.no_provider_configured")}</p>
</div>
</SettingsSection>
);
}

const providerName = providerDisplayNames[provider] ?? provider;
const embeddingProviderName = embeddingProvider
? (providerDisplayNames[embeddingProvider] ?? embeddingProvider)
: null;

return (
<SettingsSection
title={t("settings.ai.provider_status")}
description={t("settings.ai.provider_status_description")}
>
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
<ProviderInfoItem
icon={<Bot className="size-4 text-muted-foreground" />}
label={t("settings.ai.provider")}
value={providerName}
/>
{providerName && textModel && (
<ProviderInfoItem
icon={<Cpu className="size-4 text-muted-foreground" />}
label={t("settings.ai.text_model")}
value={textModel}
/>
)}
{providerName && imageModel && (
<ProviderInfoItem
icon={<Image className="size-4 text-muted-foreground" />}
label={t("settings.ai.image_model")}
value={imageModel}
/>
)}
{embeddingProviderName && embeddingModel && (
<ProviderInfoItem
icon={<Cpu className="size-4 text-muted-foreground" />}
label={t("settings.ai.embeddings")}
value={`${embeddingProviderName} / ${embeddingModel}`}
/>
)}
</div>
</SettingsSection>
);
}

export function AIPreferences() {
const { t } = useTranslation();
const clientConfig = useClientConfig();
Expand Down Expand Up @@ -677,6 +769,9 @@ export default function AISettings() {
{t("settings.ai.ai_settings")}
</h2>

{/* Provider Status */}
<ProviderIndicator />

{/* AI Preferences */}
<AIPreferences />

Expand Down
5 changes: 5 additions & 0 deletions apps/web/lib/clientConfig.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ export const ClientConfigCtx = createContext<ClientConfig>({
inferredTagLang: "english",
enableAutoTagging: false,
enableAutoSummarization: false,
provider: null,
textModel: "",
imageModel: "",
embeddingProvider: null,
embeddingModel: "",
},
serverVersion: undefined,
disableNewReleaseCheck: true,
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/ar/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,14 @@
"tag_style_description": "اختر كيف ينبغي تنسيق علاماتك التي تم إنشاؤها تلقائيًا.",
"auto_tagging_description": "إنشاء علامات تلقائيًا لعلاماتك المرجعية باستخدام الذكاء الاصطناعي.",
"camelCase": "camelCase",
"auto_summarization": "التلخيص التلقائي"
"auto_summarization": "التلخيص التلقائي",
"provider_status": "حالة المزود",
"provider_status_description": "مزود الذكاء الاصطناعي والنماذج المكونة حاليًا لهذا المثيل.",
"no_provider_configured": "لم يتم تكوين مزود للذكاء الاصطناعي. اتصل بالمسؤول لإعداد استدلال الذكاء الاصطناعي.",
"provider": "المزود",
"text_model": "نموذج النص",
"image_model": "نموذج الصورة",
"embeddings": "التضمينات"
},
"feeds": {
"rss_subscriptions": "اشتراكات RSS",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/cs/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,14 @@
"tag_style_description": "Vyber si, jakým způsobem se mají automaticky generované štítky formátovat.",
"auto_tagging_description": "Automaticky generovat štítky pro tvoje záložky pomocí umělý inteligence.",
"camelCase": "camelCase",
"auto_summarization": "Automatický shrnutí"
"auto_summarization": "Automatický shrnutí",
"provider_status": "Stav poskytovatele",
"provider_status_description": "Poskytovatel AI a modely aktuálně nakonfigurované pro tuto instanci.",
"no_provider_configured": "Není nakonfigurován žádný poskytovatel AI. Kontaktujte administrátora pro nastavení AI inference.",
"provider": "Poskytovatel",
"text_model": "Textový model",
"image_model": "Obrazový model",
"embeddings": "Vložení"
},
"webhooks": {
"webhooks": "Webhooky",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/da/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,14 @@
"tag_style_description": "Vælg, hvordan dine automatisk genererede tags skal formateres.",
"auto_tagging_description": "Generér automatisk tags til dine bogmærker ved hjælp af AI.",
"camelCase": "camelCase",
"auto_summarization": "Automatisk opsummering"
"auto_summarization": "Automatisk opsummering",
"provider_status": "Udbyderstatus",
"provider_status_description": "AI-udbyderen og modellerne, der aktuelt er konfigureret for denne instans.",
"no_provider_configured": "Ingen AI-udbyder er konfigureret. Kontakt din administrator for at konfigurere AI-inferens.",
"provider": "Udbyder",
"text_model": "Tekstmodel",
"image_model": "Billedmodel",
"embeddings": "Indlejringer"
},
"broken_links": {
"crawling_status": "Gennemsøgningsstatus",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/de/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,14 @@
"tag_style_description": "Wähle, wie deine automatisch generierten Tags formatiert werden sollen.",
"auto_tagging_description": "Automatische Tag-Generierung für deine Lesezeichen mithilfe von KI.",
"camelCase": "camelCase",
"auto_summarization": "Automatische Zusammenfassung"
"auto_summarization": "Automatische Zusammenfassung",
"provider_status": "Anbieterstatus",
"provider_status_description": "Der KI-Anbieter und die Modelle, die derzeit für diese Instanz konfiguriert sind.",
"no_provider_configured": "Kein KI-Anbieter ist konfiguriert. Kontaktiere deinen Administrator, um KI-Inferenz einzurichten.",
"provider": "Anbieter",
"text_model": "Textmodell",
"image_model": "Bildmodell",
"embeddings": "Einbettungen"
},
"feeds": {
"rss_subscriptions": "RSS-Abonnements",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/el/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,14 @@
"tag_style_description": "Διάλεξε πώς να μορφοποιηθούν οι αυτόματα δημιουργημένες ετικέτες σου.",
"auto_tagging_description": "Δημιουργήστε αυτόματα ετικέτες για τους σελιδοδείκτες σας χρησιμοποιώντας AI.",
"camelCase": "camelCase",
"auto_summarization": "Αυτόματη δημιουργία περιλήψεων"
"auto_summarization": "Αυτόματη δημιουργία περιλήψεων",
"provider_status": "Κατάσταση παρόχου",
"provider_status_description": "Ο πάροχος AI και τα μοντέλα που έχουν ρυθμιστεί για αυτήν την εγκατάσταση.",
"no_provider_configured": "Δεν έχει ρυθμιστεί πάροχος AI. Επικοινωνήστε με τον διαχειριστή σας για να ρυθμίσετε την AI εξαγωγή συμπερασμάτων.",
"provider": "Πάροχος",
"text_model": "Μοντέλο κειμένου",
"image_model": "Μοντέλο εικόνας",
"embeddings": "Ενσωματώσεις"
},
"feeds": {
"rss_subscriptions": "Συνδρομές RSS",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,14 @@
"camelCase": "camelCase",
"no_preference": "No preference",
"inference_language": "Inference Language",
"inference_language_description": "Choose language for AI-generated tags and summaries."
"inference_language_description": "Choose language for AI-generated tags and summaries.",
"provider_status": "Provider Status",
"provider_status_description": "The AI provider and models currently configured for this instance.",
"no_provider_configured": "No AI provider is configured. Contact your administrator to set up AI inference.",
"provider": "Provider",
"text_model": "Text Model",
"image_model": "Image Model",
"embeddings": "Embeddings"
},
"feeds": {
"rss_subscriptions": "RSS Subscriptions",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/en_US/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,14 @@
"tag_style_description": "Choose how your auto-generated tags should be formatted.",
"auto_tagging_description": "Automatically generate tags for your bookmarks using AI.",
"camelCase": "camelCase",
"auto_summarization": "Auto-summarization"
"auto_summarization": "Auto-summarization",
"provider_status": "Provider Status",
"provider_status_description": "The AI provider and models currently configured for this instance.",
"no_provider_configured": "No AI provider is configured. Contact your administrator to set up AI inference.",
"provider": "Provider",
"text_model": "Text Model",
"image_model": "Image Model",
"embeddings": "Embeddings"
},
"feeds": {
"rss_subscriptions": "RSS Subscriptions",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/es/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,14 @@
"tag_style_description": "Elige cómo quieres que se formateen las etiquetas que se generan automáticamente.",
"auto_tagging_description": "Genera etiquetas automáticamente para tus marcadores usando IA.",
"camelCase": "camelCase",
"auto_summarization": "Resumen automático"
"auto_summarization": "Resumen automático",
"provider_status": "Estado del proveedor",
"provider_status_description": "El proveedor de IA y los modelos configurados actualmente para esta instancia.",
"no_provider_configured": "No hay ningún proveedor de IA configurado. Contacta a tu administrador para configurar la inferencia de IA.",
"provider": "Proveedor",
"text_model": "Modelo de texto",
"image_model": "Modelo de imagen",
"embeddings": "Incrustaciones"
},
"user_settings": "Ajustes de usuario",
"feeds": {
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/fa/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,14 @@
"tag_style_description": "انتخاب کنید که برچسب‌های تولیدشده خودکار شما چگونه قالب‌بندی شوند.",
"auto_tagging_description": "به‌طور خودکار با استفاده از هوش مصنوعی برای نشانک‌هایت برچسب تولید کن.",
"camelCase": "camelCase",
"auto_summarization": "خلاصه‌سازی خودکار"
"auto_summarization": "خلاصه‌سازی خودکار",
"provider_status": "وضعیت ارائه‌دهنده",
"provider_status_description": "ارائه‌دهنده هوش مصنوعی و مدل‌های پیکربندی شده برای این نمونه.",
"no_provider_configured": "هیچ ارائه‌دهنده هوش مصنوعی پیکربندی نشده است. برای راه‌اندازی استنتاج هوش مصنوعی با مدیر خود تماس بگیرید.",
"provider": "ارائه‌دهنده",
"text_model": "مدل متن",
"image_model": "مدل تصویر",
"embeddings": "جاسازی‌ها"
},
"feeds": {
"feed_enabled": "خوراک RSS فعال شد",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/fi/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,14 @@
"tag_style_description": "Valitse, miten automaattisesti luotujen tunnisteiden muoto tulisi olla.",
"auto_tagging_description": "Luo kirjanmerkeillesi automaattisesti tägejä tekoälyn avulla.",
"camelCase": "camelCase",
"auto_summarization": "Automaattinen tiivistys"
"auto_summarization": "Automaattinen tiivistys",
"provider_status": "Palveluntarjoajan tila",
"provider_status_description": "Tällä hetkellä tälle instanssille määritetty tekoälypalveluntarjoaja ja mallit.",
"no_provider_configured": "Tekoälypalveluntarjoajaa ei ole määritetty. Ota yhteyttä ylläpitäjään tekoälypäättelyn käyttöönottamiseksi.",
"provider": "Palveluntarjoaja",
"text_model": "Tekstimalli",
"image_model": "Kuvamalli",
"embeddings": "Upotukset"
},
"feeds": {
"rss_subscriptions": "RSS-tilaukset",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/fr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,14 @@
"tag_style_description": "Choisissez le format de vos balises générées automatiquement.",
"auto_tagging_description": "Générez automatiquement des balises pour vos favoris à l’aide de l’IA.",
"camelCase": "camelCase",
"auto_summarization": "Résumés automatiques"
"auto_summarization": "Résumés automatiques",
"provider_status": "Statut du fournisseur",
"provider_status_description": "Le fournisseur d'IA et les modèles actuellement configurés pour cette instance.",
"no_provider_configured": "Aucun fournisseur d'IA n'est configuré. Contactez votre administrateur pour configurer l'inférence IA.",
"provider": "Fournisseur",
"text_model": "Modèle de texte",
"image_model": "Modèle d'image",
"embeddings": "Embeddings"
},
"feeds": {
"rss_subscriptions": "Abonnements RSS",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/ga/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,14 @@
"tag_style_description": "Roghnaigh conas ar cheart do chlibeanna uathghinte a bheith formáidithe.",
"auto_tagging_description": "Clibeanna a ghiniúint go huathoibríoch do do leabharmharcanna ag úsáid AI.",
"camelCase": "camelCase",
"auto_summarization": "Uathachoimriú"
"auto_summarization": "Uathachoimriú",
"provider_status": "Stádas an tSoláthraí",
"provider_status_description": "An soláthraí AI agus na samhlacha atá cumraithe faoi láthair don ásc seo.",
"no_provider_configured": "Níl aon soláthraí AI cumraithe. Déan teagmháil le do riarthóir chun tátal AI a shocrú.",
"provider": "Soláthraí",
"text_model": "Samhail Téacs",
"image_model": "Samhail Íomhá",
"embeddings": "Leabuithe"
},
"webhooks": {
"webhooks": "Crúcaí Gréasáin",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/gl/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,14 @@
"tag_style_description": "Elixe como se deben formatar as etiquetas xeradas automaticamente.",
"auto_tagging_description": "Xera automaticamente etiquetas para os teus marcadores usando a intelixencia artificial.",
"camelCase": "camelCase (a primeira palabra en minúsculas e as seguintes en maiúsculas)",
"auto_summarization": "Resumo automático"
"auto_summarization": "Resumo automático",
"provider_status": "Estado do provedor",
"provider_status_description": "O provedor de IA e os modelos configurados actualmente para esta instancia.",
"no_provider_configured": "Non hai ningún provedor de IA configurado. Contacta co teu administrador para configurar a inferencia de IA.",
"provider": "Provedor",
"text_model": "Modelo de texto",
"image_model": "Modelo de imaxe",
"embeddings": "Incrustacións"
},
"feeds": {
"rss_subscriptions": "Subscricións RSS",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/hr/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,14 @@
"tag_style_description": "Odaberi kako će tvoje automatski generirane oznake biti formatirane.",
"auto_tagging_description": "Automatski generiraj oznake za svoje knjižne oznake pomoću AI-ja.",
"camelCase": "camelCase",
"auto_summarization": "Automatsko sažimanje"
"auto_summarization": "Automatsko sažimanje",
"provider_status": "Status pružatelja",
"provider_status_description": "AI pružatelj i modeli trenutno konfigurirani za ovu instancu.",
"no_provider_configured": "Nije konfiguriran nijedan AI pružatelj. Kontaktirajte svog administratora za postavljanje AI zaključivanja.",
"provider": "Pružatelj",
"text_model": "Tekstualni model",
"image_model": "Model slike",
"embeddings": "Ugradnje"
},
"import": {
"import_bookmarks_from_html_file": "Import knjižnih oznaka iz HTML datoteke",
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/i18n/locales/hu/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,14 @@
"tag_style_description": "Válaszd ki, hogyan legyenek formázva az automatikusan létrehozott címkék.",
"auto_tagging_description": "A MI használatával automatikusan címkéket generálhatsz a könyvjelzőidhez.",
"camelCase": "camelCase",
"auto_summarization": "Automatikus összefoglalás"
"auto_summarization": "Automatikus összefoglalás",
"provider_status": "Szolgáltató állapota",
"provider_status_description": "A jelenleg ehhez a példányhoz konfigurált MI szolgáltató és modellek.",
"no_provider_configured": "Nincs MI szolgáltató konfigurálva. Lépjen kapcsolatba a rendszergazdával az MI következtetés beállításához.",
"provider": "Szolgáltató",
"text_model": "Szöveg modell",
"image_model": "Kép modell",
"embeddings": "Beágyazások"
},
"api_keys": {
"new_api_key": "Új API kulcs",
Expand Down
Loading