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 ServiceWas ist esTypische Verwendung
ctx.toolsToolTools registrieren / aufrufen
ctx.llmDienst für große Sprachmodelle (LLM)Adapter registrieren, Modellanfragen initiieren
ctx.agentsAgent-DienstSub-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

// Dateipfad: scratch-plugin/src/my-tool-plugin.ts
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

// Optionale Abhängigkeit: inject weglassen, ctx.get() zum Abfragen verwenden
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.

1. 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?

Weitere Erweiterungen