Przejdź do głównej treści

Helpery runtime pluginów

Dokumentacja referencyjna obiektu api.runtime, wstrzykiwanego do każdego pluginu podczas rejestracji. Używaj tych helperów zamiast bezpośrednio importować wewnętrzne elementy hosta.
Szukasz przewodnika krok po kroku? Zobacz Pluginy kanałów lub Pluginy providerów, aby zapoznać się z instrukcjami krok po kroku, które pokazują te helpery w kontekście.
register(api) {
  const runtime = api.runtime;
}

Przestrzenie nazw runtime

api.runtime.agent

Tożsamość agenta, katalogi i zarządzanie sesjami.
// Ustal katalog roboczy agenta
const agentDir = api.runtime.agent.resolveAgentDir(cfg);

// Ustal workspace agenta
const workspaceDir = api.runtime.agent.resolveAgentWorkspaceDir(cfg);

// Pobierz tożsamość agenta
const identity = api.runtime.agent.resolveAgentIdentity(cfg);

// Pobierz domyślny poziom myślenia
const thinking = api.runtime.agent.resolveThinkingDefault(cfg, provider, model);

// Pobierz limit czasu agenta
const timeoutMs = api.runtime.agent.resolveAgentTimeoutMs(cfg);

// Upewnij się, że workspace istnieje
await api.runtime.agent.ensureAgentWorkspace(cfg);

// Uruchom osadzonego agenta Pi
const agentDir = api.runtime.agent.resolveAgentDir(cfg);
const result = await api.runtime.agent.runEmbeddedPiAgent({
  sessionId: "my-plugin:task-1",
  runId: crypto.randomUUID(),
  sessionFile: path.join(agentDir, "sessions", "my-plugin-task-1.jsonl"),
  workspaceDir: api.runtime.agent.resolveAgentWorkspaceDir(cfg),
  prompt: "Summarize the latest changes",
  timeoutMs: api.runtime.agent.resolveAgentTimeoutMs(cfg),
});
Helpery magazynu sesji znajdują się pod api.runtime.agent.session:
const storePath = api.runtime.agent.session.resolveStorePath(cfg);
const store = api.runtime.agent.session.loadSessionStore(cfg);
await api.runtime.agent.session.saveSessionStore(cfg, store);
const filePath = api.runtime.agent.session.resolveSessionFilePath(cfg, sessionId);

api.runtime.agent.defaults

Domyślne stałe modelu i providera:
const model = api.runtime.agent.defaults.model; // np. "anthropic/claude-sonnet-4-6"
const provider = api.runtime.agent.defaults.provider; // np. "anthropic"

api.runtime.subagent

Uruchamiaj i zarządzaj uruchomieniami subagentów w tle.
// Rozpocznij uruchomienie subagenta
const { runId } = await api.runtime.subagent.run({
  sessionKey: "agent:main:subagent:search-helper",
  message: "Expand this query into focused follow-up searches.",
  provider: "openai", // opcjonalne nadpisanie
  model: "gpt-4.1-mini", // opcjonalne nadpisanie
  deliver: false,
});

// Poczekaj na zakończenie
const result = await api.runtime.subagent.waitForRun({ runId, timeoutMs: 30000 });

// Odczytaj wiadomości sesji
const { messages } = await api.runtime.subagent.getSessionMessages({
  sessionKey: "agent:main:subagent:search-helper",
  limit: 10,
});

// Usuń sesję
await api.runtime.subagent.deleteSession({
  sessionKey: "agent:main:subagent:search-helper",
});
Nadpisania modelu (provider/model) wymagają zgody operatora przez plugins.entries.<id>.subagent.allowModelOverride: true w konfiguracji. Niezaufane pluginy nadal mogą uruchamiać subagentów, ale żądania nadpisania są odrzucane.

api.runtime.taskFlow

Powiąż runtime Task Flow z istniejącym kluczem sesji OpenClaw lub zaufanym kontekstem narzędzia, a następnie twórz i zarządzaj Task Flows bez przekazywania ownera przy każdym wywołaniu.
const taskFlow = api.runtime.taskFlow.fromToolContext(ctx);

const created = taskFlow.createManaged({
  controllerId: "my-plugin/review-batch",
  goal: "Review new pull requests",
});

const child = taskFlow.runTask({
  flowId: created.flowId,
  runtime: "acp",
  childSessionKey: "agent:main:subagent:reviewer",
  task: "Review PR #123",
  status: "running",
  startedAt: Date.now(),
});

const waiting = taskFlow.setWaiting({
  flowId: created.flowId,
  expectedRevision: created.revision,
  currentStep: "await-human-reply",
  waitJson: { kind: "reply", channel: "telegram" },
});
Użyj bindSession({ sessionKey, requesterOrigin }), gdy masz już zaufany klucz sesji OpenClaw z własnej warstwy powiązań. Nie wykonuj powiązania na podstawie surowego wejścia użytkownika.

api.runtime.tts

Synteza mowy z tekstu.
// Standardowe TTS
const clip = await api.runtime.tts.textToSpeech({
  text: "Hello from OpenClaw",
  cfg: api.config,
});

// TTS zoptymalizowane pod telefonię
const telephonyClip = await api.runtime.tts.textToSpeechTelephony({
  text: "Hello from OpenClaw",
  cfg: api.config,
});

// Wyświetl dostępne głosy
const voices = await api.runtime.tts.listVoices({
  provider: "elevenlabs",
  cfg: api.config,
});
Używa głównej konfiguracji messages.tts i wyboru providera. Zwraca bufor audio PCM + częstotliwość próbkowania.

api.runtime.mediaUnderstanding

Analiza obrazów, dźwięku i wideo.
// Opisz obraz
const image = await api.runtime.mediaUnderstanding.describeImageFile({
  filePath: "/tmp/inbound-photo.jpg",
  cfg: api.config,
  agentDir: "/tmp/agent",
});

// Transkrybuj audio
const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
  filePath: "/tmp/inbound-audio.ogg",
  cfg: api.config,
  mime: "audio/ogg", // opcjonalne, gdy nie da się ustalić MIME
});

// Opisz wideo
const video = await api.runtime.mediaUnderstanding.describeVideoFile({
  filePath: "/tmp/inbound-video.mp4",
  cfg: api.config,
});

// Ogólna analiza pliku
const result = await api.runtime.mediaUnderstanding.runFile({
  filePath: "/tmp/inbound-file.pdf",
  cfg: api.config,
});
Zwraca { text: undefined }, gdy nie powstanie żaden wynik (np. przy pominiętym wejściu).
api.runtime.stt.transcribeAudioFile(...) pozostaje aliasem zgodności dla api.runtime.mediaUnderstanding.transcribeAudioFile(...).

api.runtime.imageGeneration

Generowanie obrazów.
const result = await api.runtime.imageGeneration.generate({
  prompt: "A robot painting a sunset",
  cfg: api.config,
});

const providers = api.runtime.imageGeneration.listProviders({ cfg: api.config });

api.runtime.webSearch

Wyszukiwanie w sieci.
const providers = api.runtime.webSearch.listProviders({ config: api.config });

const result = await api.runtime.webSearch.search({
  config: api.config,
  args: { query: "OpenClaw plugin SDK", count: 5 },
});

api.runtime.media

Niskopoziomowe narzędzia do pracy z mediami.
const webMedia = await api.runtime.media.loadWebMedia(url);
const mime = await api.runtime.media.detectMime(buffer);
const kind = api.runtime.media.mediaKindFromMime("image/jpeg"); // "image"
const isVoice = api.runtime.media.isVoiceCompatibleAudio(filePath);
const metadata = await api.runtime.media.getImageMetadata(filePath);
const resized = await api.runtime.media.resizeToJpeg(buffer, { maxWidth: 800 });

api.runtime.config

Wczytywanie i zapisywanie konfiguracji.
const cfg = await api.runtime.config.loadConfig();
await api.runtime.config.writeConfigFile(cfg);

api.runtime.system

Narzędzia na poziomie systemu.
await api.runtime.system.enqueueSystemEvent(event);
api.runtime.system.requestHeartbeatNow();
const output = await api.runtime.system.runCommandWithTimeout(cmd, args, opts);
const hint = api.runtime.system.formatNativeDependencyHint(pkg);

api.runtime.events

Subskrypcje zdarzeń.
api.runtime.events.onAgentEvent((event) => {
  /* ... */
});
api.runtime.events.onSessionTranscriptUpdate((update) => {
  /* ... */
});

api.runtime.logging

Logowanie.
const verbose = api.runtime.logging.shouldLogVerbose();
const childLogger = api.runtime.logging.getChildLogger({ plugin: "my-plugin" }, { level: "debug" });

api.runtime.modelAuth

Rozwiązywanie uwierzytelniania modeli i providerów.
const auth = await api.runtime.modelAuth.getApiKeyForModel({ model, cfg });
const providerAuth = await api.runtime.modelAuth.resolveApiKeyForProvider({
  provider: "openai",
  cfg,
});

api.runtime.state

Ustalanie katalogu stanu.
const stateDir = api.runtime.state.resolveStateDir();

api.runtime.tools

Fabryki narzędzi pamięci i CLI.
const getTool = api.runtime.tools.createMemoryGetTool(/* ... */);
const searchTool = api.runtime.tools.createMemorySearchTool(/* ... */);
api.runtime.tools.registerMemoryCli(/* ... */);

api.runtime.channel

Helpery runtime specyficzne dla kanału (dostępne, gdy załadowany jest plugin kanału).

Przechowywanie referencji do runtime

Użyj createPluginRuntimeStore, aby przechować referencję runtime do użycia poza callbackiem register:
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
import type { PluginRuntime } from "openclaw/plugin-sdk/runtime-store";

const store = createPluginRuntimeStore<PluginRuntime>("my-plugin runtime not initialized");

// In your entry point
export default defineChannelPluginEntry({
  id: "my-plugin",
  name: "My Plugin",
  description: "Example",
  plugin: myPlugin,
  setRuntime: store.setRuntime,
});

// In other files
export function getRuntime() {
  return store.getRuntime(); // throws if not initialized
}

export function tryGetRuntime() {
  return store.tryGetRuntime(); // returns null if not initialized
}

Inne pola najwyższego poziomu api

Poza api.runtime obiekt API udostępnia również:
PoleTypOpis
api.idstringIdentyfikator pluginu
api.namestringNazwa wyświetlana pluginu
api.configOpenClawConfigBieżąca migawka konfiguracji (aktywny snapshot runtime w pamięci, gdy jest dostępny)
api.pluginConfigRecord<string, unknown>Konfiguracja specyficzna dla pluginu z plugins.entries.<id>.config
api.loggerPluginLoggerLogger o odpowiednim zakresie (debug, info, warn, error)
api.registrationModePluginRegistrationModeBieżący tryb ładowania; "setup-runtime" to lekkie okno startu/setupu przed pełnym entry
api.resolvePath(input)(string) => stringUstal ścieżkę względną względem katalogu głównego pluginu

Powiązane