DeepSeek Harness deklarierte Abhängigkeiten: inject und integrierte Services
Zuvor haben wir Plugins kennengelernt, die unabhängig laufen, aber die meisten Plugins sind auf andere Fähigkeiten angewiesen: Tool-Registry, LLM, Agent.
In diesem Abschnitt führen wir ein, wie man Abhängigkeiten deklariert und wie das Framework sicherstellt, dass Abhängigkeiten bereit sind, bevor apply ausgeführt wird.
Was ist ein Service?
Ein Service ist eine benannte Fähigkeit, die ein Plugin anderen Plugins bereitstellt.
In Harness sind tools、llm、agents allesamt Services, sie werden in ctx geladen: ctx.t、llm、agents.
| Integrierter Service | Was ist es | Typische Verwendung |
|---|---|---|
| ctx.tools | Tool | Tools registrieren / aufrufen |
| ctx.llm | Dienst für große Sprachmodelle (LLM) | Adapter registrieren, Modellanfragen initiieren |
| ctx.agents | Agent-Dienst | Sub-Agenten verwalten |
Abhängigkeiten mit inject deklarieren
Wenn dein Plugin einen Dienst benötigt, schreibe ihn in das inject-Array.
Das Framework stellt sicher, dass dein Plugin erst geladen wird, nachdem diese Dienste bereit sind.
Beispiel
import type { Context } from '@deepseek-ai/cordis'
export const name = 'my-tool-plugin'
// Abhängigkeit deklarieren: erfordert tools-Dienst
export const inject = ['tools']
export function apply(ctx: Context) {
// Wenn wir hier ankommen, ist ctx.tools garantiert bereit.
ctx.tools.register(/* ... */)
}
Wenn apply ausgeführt wird, sind alle in inject deklarierten Dienste bereits bereit.
Dies wird vom Framework garantiert, du musst also in deinem Code auf nichts warten.
Abhängigkeit nicht bereit: Das Plugin wartet
Wenn ein Dienst nicht bereit ist, wird das Plugin nicht ausgeführt.
Seine Fiber bleibt im Zustand PENDING und wartet darauf, dass der Dienst erscheint.
Im Lebenszyklus bedeutet PENDING "deklariert, aber erforderliche Abhängigkeiten sind nicht bereit."
Wenn der Dienst nie erscheint, wartet das Plugin weiter; es wird keinen Fehler auslösen, und apply wird nicht ausgeführt.
Erforderliche Abhängigkeiten und optionale Abhängigkeiten
inject deklariert erforderliche Abhängigkeiten: Das Plugin wird nicht geladen, wenn der Dienst fehlt.
Wenn ein Dienst optional ist, verwende eine optionale Abhängigkeit: Nimm ihn nicht in inject auf und frage ihn mit ctx.get() am Verwendungspunkt ab.
Beispiel
import type { Context } from '@deepseek-ai/cordis'
export function apply(ctx: Context) {
// Der metrics-Dienst kann vorhanden sein oder auch nicht
const metrics = ctx.get('metrics')
// Optionale Verkettung: überspringen, falls nicht vorhanden, kein Fehler
metrics?.record('plugin_loaded', 1)
}
Was passiert, wenn ein Dienst verschwindet
Wenn ein erforderlicher Dienst zur Laufzeit verschwindet (z. B. wenn der Anbieter deinstalliert wird), passieren zwei Dinge.
Erstens werden Plugins, die davon abhängen, automatisch verworfen (Ressourcen freigegeben).
Zweitens: Wenn der Dienst wieder auftaucht, wird das Plugin automatisch neu geladen.
Dadurch wird verhindert, dass das Plugin einen Dienst aufruft, der nicht mehr existiert.
Tipp: Diese Regel funktioniert mit der automatischen Bereinigung – das Entladen löst den in Teil 8 beschriebenen Disposer aus.
Zusammenfassung und Selbsttest
Verwende inject, um erforderliche Dienste zu deklarieren, und das Framework garantiert, dass apply erst ausgeführt wird, nachdem die Dienste bereit sind; optionale Dienste fragst du mit ctx.get() ab.
Weitere Erweiterungen1. Was deklariert das inject-Array?
2. In welchem Zustand befindet sich das Plugin, wenn Dienste nicht bereit sind?
3. Wie sollten optionale Abhängigkeiten deklariert werden?