Μετάβαση στο κύριο περιεχόμενο

Plugins

Το Libre WebUI χρησιμοποιεί plugin για εξωτερικούς παρόχους και capabilities δίπλα σε τοπικό Ollama.

Τύποι plugin

ΤύποςΣκοπός
Chat/completionΜοντέλα κειμένου/chat από provider APIs
EmbeddingsVector embeddings για έγγραφα και μνήμη
Image generationImage models και ComfyUI backends
Text-to-speechΠάροχοι σύνθεσης φωνής
Speech-to-textΠάροχοι μεταγραφής
Audio generationΠάροχοι ήχου
Video generationAsync πάροχοι video

Τα plugin εκθέτουν static model maps και, όπου υποστηρίζεται, ανανεώνουν μοντέλα από APIs.

Ενσωματωμένες οικογένειες παρόχων

Περιλαμβάνονται ορισμοί για:

  • OpenAI και OpenAI-compatible APIs
  • Anthropic
  • Google Gemini
  • Groq
  • Kimi Code από Moonshot AI
  • Mistral
  • OpenRouter
  • Hugging Face
  • GitHub Models
  • MLX LM για τοπικό Apple Silicon inference
  • ComfyUI
  • ElevenLabs

Οι κατάλογοι αλλάζουν συχνά. Με live discovery, το UI είναι η πηγή αλήθειας.

Ιδιοκτησία και εξουσιοδότηση

Οι ορισμοί είναι shared instance config. Κάθε /api/plugins απαιτεί auth και μόνο admins κάνουν upload/install/update/delete. Activation είναι ανά authenticated account και αποθηκεύεται SQLite, επιβιώνοντας restart χωρίς επίδραση σε άλλους.

Στο upgrade, το global .status.json αντιγράφεται μία φορά σε υπάρχοντες λογαριασμούς, μόνο για definitions που ταιριάζουν ακριβώς compiled trust anchors. Legacy custom/shadow μένουν quarantine/inactive. Νέοι λογαριασμοί ξεκινούν χωρίς active plugins.

Bundled definition είναι trusted μόνο όταν normalized content ταιριάζει compiled hash. Writable definitions εγκρίνονται SQLite από normalized source path/full hash. Admin install/update/re-import καταγράφει approval, direct edit το ακυρώνει. Approval/update καθαρίζει activation όλων πριν αντικατάσταση, άρα reactivation ανά user. Pre-upgrade custom χρειάζεται admin re-import πριν catalog, discovery, credentials ή capability.

Οι μεταβλητές χωρίζονται. Μόνο admins αποθηκεύουν recognized connection-routing:

endpoint, base_url, api_path, models_endpoint, api_url, image_endpoint, embedding_endpoint, stt_endpoint, tts_endpoint, voice_clone_endpoint, api_mode, model, model_id. Δηλωμένα config.endpoint_variable, config.models_endpoint_variable ή config.voice_clone_endpoint_variable είναι επίσης routing, ανεξάρτητα ονόματος.

Μη admins αποθηκεύουν generation όπως temperature/streaming. Παλιές routing rows αγνοούνται, δεν επιστρέφονται και αφαιρούνται σε full reset, ώστε role promotion να μην αναβιώσει σιωπηρά dormant route.

Διαπιστευτήρια

Προέρχονται από environment ή user settings.

Παραδείγματα:

OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GROQ_API_KEY=gsk_...
GEMINI_API_KEY=...
MISTRAL_API_KEY=...
OPENROUTER_API_KEY=sk-or-...
KIMI_API_KEY=...
GITHUB_API_KEY=github_pat_...
ELEVENLABS_API_KEY=...

Σε shared εγκατάσταση προτιμώνται user credentials για billing/limits. Environment keys για single-user, demo ή managed.

Environment key είναι fallback μόνο με routing/auth projection unshadowed bundled definition. Import, writable shadow ή admin routing override απαιτεί credential ίδιου account. Το Libre συγκρίνει root, auth fields, capability endpoints/selectors και routing definitions/defaults. Compiled manifest hash παραμένει authoritative ακόμη όταν legacy/bundled directories μοιράζονται path· overwritten package manifest δεν αυτο-εμπιστεύεται.

Ισχύει σε discovery, Chat, Work, availability και catalogs, εμποδίζοντας custom endpoint ή pre-upgrade manifest να λάβει operator secret.

User credentials δένονται σε effective source, full hash, auth contract, capability endpoints/selectors και routing κατά το save. Αλλαγή τα κάνει unavailable μέχρι review/re-save. Legacy unbound γίνονται δεκτά μόνο σε exact anchored bundled route και πρώτο successful use γράφει binding πριν decrypted key.

OpenAI-compatible πάροχοι

Ένα plugin μπορεί να ορίσει:

  • Πλήρες endpoint URL, environment key, Chat behavior, embeddings, discovery και fallback map.

Χωρίς live discovery χρησιμοποιείται model map. Imported JSON υποστηρίζει OpenAI Chat, Responses, Anthropic ή Gemini. Δεν μεταφράζει arbitrary proprietary protocol· διαφορετικό request/stream/tool/response χρειάζεται backend adapter.

Δημιουργία εικόνας OpenAI

Ο bundled OpenAI εκθέτει https://api.openai.com/v1/images/generations με current gpt-image-2. Παλιά gpt-image-1.5, gpt-image-1, gpt-image-1-mini μένουν για συμβατότητα.

Χρησιμοποιείται ίδιο effective credential με Chat: user key ή trusted environment fallback. Ξεχωριστό image_endpoint εμποδίζει custom Chat να λάβει εικόνες. Κενό κληρονομεί bundled.

Οι επιλογές είναι provider-qualified. Ίδιο ID σε δύο plugins στέλνεται μόνο στον επιλεγμένο. Base64 μετατρέπεται και αποθηκεύεται στη gallery. Routes απαιτούν auth και direct requests pluginId και model. n integer 1–10, όχι string/fraction.

API modes Chat Completions και Responses

Χρησιμοποιούν chat_completions ή responses, με επιλογή στο Settings → Plugins.

Σειρά επίλυσης:

  1. Πλήρες endpoint override.
  2. base_url + optional api_path.
  3. Legacy endpoint.

Ακριβής ισότητα με manifest θεωρείται default, όχι override, ώστε παλιό stored default να μη σκιάζει νέο Base URL. Πραγματικό custom full endpoint υπερισχύει.

Default /chat/completions ή /responses. base_url root όπως https://api.example.com/v1, api_path για άλλο relative operation. Full endpoint περιλαμβάνει πλήρες path και υπερισχύει. Γνωστό suffix καθορίζει semantics, custom κρατά api_mode.

Imported JSON μπορεί να δώσει τα ίδια defaults:

{
"endpoint": "https://api.example.com/v1/chat/completions",
"api_mode": "responses",
"base_url": "https://api.example.com/v1",
"api_path": "/responses"
}

Responses requests χρησιμοποιούν input, max_output_tokens, flattened function tools, store: false και encrypted reasoning για stateless continuation. Completed και streamed output κανονικοποιείται σε Chat/Work events. Replay κρατείται μόνο με πλήρες ordered Item array έως 64 Items/90 KB, ακριβές χωρίς field truncation. Replayable Items θέλουν unique non-empty IDs/types και validated message/reasoning/function structures. Oversized Chat χρησιμοποιεί visible history και απορρίπτει raw function-call Items επειδή δεν κρατά tool outputs. Work με tools χωρίς bounded exact replay απορρίπτεται πριν side effect.

Το SQLite Chat κρυπτογραφεί state με το μήνυμα· Work αποθηκεύει tool-only state σε hidden rows που APIs δεν επιστρέφουν. Hashed scope δένει replay σε provider, model, Responses mode, final endpoint και one-way fingerprint credential. Αλλαγή, μαζί με key rotation, πέφτει σε normalized history αντί provider Items πέρα από auth boundary. Active Work fingerprintάρει routing/credential πριν κάθε round και αλλαγή σταματά πριν άλλο request λάβει παλιό state. Tool state πρέπει να χωρά replay και full 100 KB metadata wrapper πριν side effect. Interrupted batch επαναφέρει missing result με exact call ID και outcome-unknown warning για inspection αντί blind repeat. Incomplete Responses δεν είναι successful turn και κρατά incomplete_details.reason.

Discovery παράγει /models από operation, π.χ. το https://api.example.com/v1/responses αναζητά στο https://api.example.com/v1/models. Χωρίς compatible list χρησιμοποιείται model_map. Scope σε variables/credentials χρήστη και αποτελέσματα per-user, όχι shared manifest. Τρέχει μετά activation, refresh, key/connection changes και reset, όχι άσχετο generation save.

Reading plugin list ξανακάνει discovery όταν catalog λείπει/παλιότερο από PLUGIN_MODEL_DISCOVERY_TTL_MS. Per-provider backoff αποφεύγει probe κάθε request και deadline αποτρέπει καθυστέρηση· αργό refresh φαίνεται στο επόμενο. Final URL ελέγχεται πριν credential/header, ακόμη από imported manifest. Discovery/capabilities δεν ακολουθούν redirects. Ρυθμίστε final Chat, Work, model-list, image, embedding, transcription, speech, voice-clone, audio, video endpoint ώστε credentials να μη μεταφερθούν σε unvalidated redirect.

Endpoints HTTP/HTTPS· HTTP χωρίς transport encryption μόνο trusted gateway, προτίμηση HTTPS/TLS. Requests από backend: σε container service URL όπως http://ai-gateway:8080/v1, ενώ localhost είναι το Libre container. Capability routes επιλύουν variables/credentials του authenticated requester. Δεν υπάρχει unauthenticated single-user mode.

Endpoints ανά δυνατότητα

Chat override απομονώνεται από image, embedding, transcription, TTS, audio, video. Multi-capability plugin εκθέτει image_endpoint, embedding_endpoint, stt_endpoint, tts_endpoint ή variable config.endpoint_variable. Voice clone μπορεί config.voice_clone_endpoint_variable. Κενά χρησιμοποιούν δηλωμένο endpoint· γενικό Chat endpoint ποτέ capability override.

GitHub Models κληρονομεί models.github.ai/inference/chat/completions με κενό override. Hugging Face χρησιμοποιεί task-specific hf-inference/models/{model} routes/payloads για embeddings, images, TTS, όχι Chat endpoint.

Παρακάμψεις endpoint

endpoint είναι πλήρες URL με operation, π.χ. https://provider.example/v1/chat/completions, όχι μόνο https://provider.example. Legacy import μπορεί api_url, αλλά non-empty endpoint υπερισχύει.

Absolute HTTP/HTTPS δέχονται, άλλα protocols όχι. HTTP μόνο trusted self-hosted επειδή στέλνει credentials/content χωρίς encryption. HTTPS εκτός private boundary. Κενό override χρησιμοποιεί definition· explicit invalid απορρίπτεται χωρίς silent default.

Provider requests δεν ακολουθούν redirects. Final validated URL απευθείας· redirect αναφέρεται error αντί forwarding credentials/content.

Requests από backend. Σε container localhost είναι το container, όχι host/service. Χρησιμοποιήστε service name ή host.docker.internal όπου παρέχεται.

Ανακάλυψη μοντέλων

Το Settings → Plugins έχει Provider connections. Αναζητήστε αριστερά και ελέγξτε active state/catalog δεξιά. Η διαμόρφωση μένει collapsed μέχρι Configure, κρύβοντας endpoint, credential και advanced generation από default view.

Για chat/completion, Refresh models κάνει discovery και reload catalog/Chat list. Catalog read-only από user IDs και capability maps. Labels δείχνουν route, όχι health. Fallback/manual IDs μόνο στο JSON model_map.

Activation κάνει discovery με effective endpoint/credential account. Admin custom route χρειάζεται ίδιο account, environment fallback μόνο trusted manifest. URL προκύπτει:

  • URL που τελειώνει /models όπως είναι·
  • γνωστά /chat/completions, /completions, /responses, /embeddings, /messages αντικαθίστανται·
  • αλλιώς προστίθεται /models.

Plugin μπορεί explicit models_endpoint, που υπερισχύει, έχει ίδιο outbound policy και χωρίς redirects. Save/reset endpoint, api_url, models_endpoint, base_url, api_path, api_mode καθαρίζει/ανανεώνει catalog πριν UI reload.

Custom routes επιλύονται/ελέγχονται πριν credential. Δεν επιτρέπεται server env key για stored custom route· ορίστε per-user. Environment fallback μόνο trusted definition.

Αναμένεται OpenAI-compatible data. Activation περιμένει ώστε πρώτο refresh να έχει catalog. Αποτελέσματα per-user, χωρίς rewrite JSON ή έκθεση σε άλλο account. Χωρίς compatible endpoint, unreachable ή άλλο shape, normal activation κρατά previous. Σκόπιμη connection change καθαρίζει παλιό και failure χρησιμοποιεί model_map.

Save/reset routing καθαρίζει previous catalog ώστε παλιά destination models να μη μένουν μετά αλλαγή.

Status, Work availability, catalogs και routes χρησιμοποιούν ίδιο user context/credential boundary. Image models, variables, credentials επιλύονται για requester.

Ακριβής επιλογή παρόχου στο Chat

IDs δεν είναι global unique. Ollama και πολλά plugins μπορεί example-model. Το Chat κρατά raw ID και optional identity:

  • providerType: "ollama" για Ollama·
  • providerType: "plugin" + providerId για exact plugin.

URL-encoded qualified values είναι collision-safe keys μόνο. Requests στέλνουν raw ID. Duplicates μένουν ξεχωριστά και reopening αποκαθιστά exact επιλογή.

Explicit identity fail closed. Deactivated/removed/missing model μένει visible unavailable, χωρίς silent switch. Re-activate ή επιλέξτε άλλο.

Legacy sessions μπορεί providerType/providerId unset ή null και κρατούν name-only routing επειδή provider δεν ανακατασκευάζεται. Εμφανίζονται "provider not recorded". Concrete επιλογή γράφει exact provider. Νέες personas κρατούν persona:<id> και Ollama backing.

Ρυθμίσεις παρόχου και κληρονόμηση

Ανοίξτε Settings → Plugins και Configure. Panels closed default. Admins ελέγχουν definitions/routing. Άλλοι ενεργοποιούν, σώζουν keys και generation, χωρίς UI για upload/install/export/delete/routing.

Admins βλέπουν overrides πρώτα. Sampling στο κλειστό Advanced parameters. Inherited values είναι blank με hint· άνοιγμα panel δεν αντιγράφει manifest defaults σε account.

Save στέλνει μόνο changed fields. Clearing non-sensitive αφαιρεί override και επαναφέρει default· blank masked sensitive δεν αλλάζει. Reset to Defaults αφαιρεί allowed overrides. Failure κρατά unsaved values για retry.

Για custom endpoint, admin αφήνει κενό για bundled URL ή εισάγει πλήρες compatible URL.

Plugins στο Work

Work χρησιμοποιεί active completion/chat μαζί με Ollama μόνο όταν:

  • plugin active, model στο catalog/map και admin credentials διαθέσιμα.

Work κρατά provider type/ID σε task/run, άρα routing exact provider, όχι name. Ίδιο plugin name δεν redirectάρει υπάρχον task.

Work προσαρμόζει tools μέσω OpenAI, Anthropic, Gemini. Model πρέπει να υποστηρίζει tools. Απόρριψη ή incompatible response αποτυγχάνει χωρίς fallback.

Remote run κάνει πολλά requests και πάροχος λαμβάνει system prompt, context, tool definitions/results που μπορεί να περιέχουν source, directories ή output. Το Libre δείχνει disclosure ανά user, αλλά operators πρέπει να ελέγξουν pricing/retention/training.

Embeddings

Embedding plugins εμφανίζονται στις ρυθμίσεις εγγράφων. Το Libre ανιχνεύει Ollama όπως nomic-embed-text, bge, e5, gte.

Χωρίς discovery, UI χρησιμοποιεί local default candidate nomic-embed-text.

Σημειώσεις ανάπτυξης plugin

Ο ορισμός περιγράφει καθαρά capability χωρίς ψευδή features. Κρατήστε maps μικρά ως fallback και προτιμήστε discovery με αξιόπιστο list API.

Κατά την προσθήκη παρόχου:

  1. Προσθέστε definition και credential fields.
  2. Υλοποιήστε discovery αν υπάρχει list endpoint.
  3. Προσθέστε mapping για chat, embeddings, image, TTS, STT.
  4. Δοκιμάστε missing/bad key και provider errors.

Σχετική τεκμηρίωση