Zum Inhalt springen
rdlabo.devdocs

Chat

Chat-Lebenszyklus, Streaming, Abbruch und Warmup. Zugehörige Anleitungen: Verfügbarkeit, Bilder, Ereignisse, Fehlerbehandlung.

Chat-Lebenszyklus

Erstellen Sie einen vom Plugin verwalteten Chat, generieren Sie darin Text und löschen Sie ihn nach Abschluss. Pro Chat kann jeweils nur eine Generierung gleichzeitig laufen.

import { LocalLLM } from '@rdlabo/capacitor-local-llm';

const { status } = await LocalLLM.getAvailability();
if (status !== 'available') {
  throw new Error(`Model not ready: ${status}`);
}

const { id: chatId } = await LocalLLM.createChat({
  instructions: 'You are a helpful assistant.',
  history: { maxMessages: 20, maxCharacters: 12000 }, // Alle Plattformen; iOS kürzt das Foundation-Models-Transkript
});

const { text } = await LocalLLM.generateText({
  chatId,
  prompt: 'What is the capital of France?',
  // Nur nativ: options: { temperature: 0.2, maxOutputTokens: 256 },
});

const followUp = await LocalLLM.generateText({
  chatId,
  prompt: 'What is the population of that city?',
});

console.log(text, followUp.text);

await LocalLLM.deleteChat({ id: chatId });

Streaming mit textChunk

streamText() sendet fortlaufend Textabschnitte über das Ereignis textChunk und wird nach Abschluss mit dem vollständigen Text aufgelöst.

import { LocalLLM } from '@rdlabo/capacitor-local-llm';

const { id: chatId } = await LocalLLM.createChat();

let streamedText = '';
const chunkListener = await LocalLLM.addListener('textChunk', (event) => {
  if (event.chatId !== chatId) return;
  streamedText += event.text;
  console.log(streamedText); // Durch eine Aktualisierung der App-UI ersetzen
});

try {
  const { text, generationId } = await LocalLLM.streamText({
    chatId,
    prompt: 'Summarize the theory of relativity in one paragraph.',
  });
  console.log('\ncomplete:', text, generationId);
} finally {
  await chunkListener.remove();
  await LocalLLM.deleteChat({ id: chatId });
}

Eine laufende Generierung abbrechen

import { LocalLLM } from '@rdlabo/capacitor-local-llm';

const stateListener = await LocalLLM.addListener('generationStateChange', (event) => {
  if (event.chatId === chatId && event.state === 'started') {
    void LocalLLM.cancelGeneration({ chatId, generationId: event.generationId });
  }
});

const streamPromise = LocalLLM.streamText({ chatId, prompt: 'Write a long essay.' });

try {
  await streamPromise;
} catch (err) {
  // LOCAL_LLM_GENERATION_CANCELLED auf allen Plattformen, sobald der Abbruch erkannt wird
} finally {
  await stateListener.remove();
}

generationStateChange wird sowohl für generateText() als auch für streamText() ausgelöst. Sobald das Plugin eine Generierung annimmt, meldet es noch vor dem ersten Textabschnitt started. Danach folgt genau ein Endzustand: completed, cancelled oder failed. Verwenden Sie die zugehörige generationId, um gezielt diese Generierung abzubrechen. deleteChat() bricht ebenfalls jede aktive Generierung dieses Chats ab.

Die Wartezeit bis zur ersten Antwort durch Warmup verkürzen

import { LocalLLM } from '@rdlabo/capacitor-local-llm';

const { id: chatId } = await LocalLLM.createChat({
  instructions: 'You are a customer support agent for Acme Corp.',
});

// iOS: Diesen Chat vorwärmen. Android: Globales Modell-Warmup (chatId wird ignoriert).
// Web: Eine temporäre Sitzung mit diesem Chat erstellen und freigeben (promptPrefix wird ignoriert).
await LocalLLM.warmup({ chatId, promptPrefix: 'You are a customer support agent for Acme Corp.' });