Zum Hauptinhalt springen

SDK-Referenz

Das Mini-Programm SDK ist eine ~2 KB JavaScript-Bibliothek, die in jeden Mini-Programm-iframe injiziert wird. Es stellt den window.ais-Namespace mit Methoden zur Interaktion mit der AISCouncil Plattform über eine sichere postMessage-Bridge bereit.

Wie das SDK funktioniert

Das SDK wird als <script>-Tag vor Ihrem App-HTML im srcdoc des iframes injiziert. Sie müssen es nicht selbst einbinden – es ist immer als window.ais verfügbar, wenn Ihr Code ausgeführt wird.

Jeder Methodenaufruf (außer platform.*-Eigenschaften) sendet eine Nachricht an die Host-Seite und gibt ein Promise zurück. Der Host validiert Berechtigungen, führt die Anfrage aus und sendet das Ergebnis zurück.

Ihr App-Code               SDK                    Host-Plattform
| | |
|-- ais.chat.send("hi")-->| |
| |-- postMessage({ |
| | method: "chat.send", |
| | args: {text: "hi"} |
| | }) ---------------------->|
| | |-- Berechtigungen prüfen
| | |-- AIS.Chat.send() ausführen
| |<-- postMessage({result}) --|
|<-- Promise wird aufgelöst ---| |
Info

Alle SDK-Methoden sind synchron als Funktionsreferenzen verfügbar, geben aber Promises zurück, die asynchron aufgelöst werden. Verwenden Sie immer await oder .then(), um Ergebnisse zu erhalten.

TypeScript-Unterstützung

TypeScript-Typdefinitionen sind in sdk/ais.d.ts verfügbar. Fügen Sie eine Referenz zu Ihrem Projekt hinzu:

/// <reference path="./ais.d.ts" />

ais.ready(async () => {
const history = await ais.chat.getHistory(10);
// history ist als ais.ChatMessage[] typisiert
});

Oder kopieren Sie die AisManifest- und AisPermission-Typen für Manifest-Validierung in Ihren Build-Tools.


Lebenszyklus

ais.ready(callback)

Registriert einen Callback, der ausgelöst wird, wenn die Plattform-Bridge verbunden und bereit ist. Dies ist der Einstiegspunkt für Ihre App – wickeln Sie alle Initialisierungslogik in diesen Callback.

ParameterTypBeschreibung
callback() => voidFunktion, die aufgerufen wird, wenn die Bridge bereit ist
ais.ready(async function () {
// Plattform ist verbunden, SDK-Aufrufe funktionieren jetzt
const user = await ais.auth.getUser();
document.getElementById("greeting").textContent = "Hallo, " + user.name;
});
Vorsicht

Rufen Sie keine anderen ais.*-Methoden auf, bevor ais.ready() ausgelöst wurde. Die postMessage-Bridge ist möglicherweise noch nicht eingerichtet, und Aufrufe werden unbegrenzt hängen.

ais.onShow(callback)

Registriert einen Callback, der jedes Mal ausgelöst wird, wenn das Mini-Programm sichtbar wird (z.B. Benutzer schaltet zurück zum App-Tab).

ParameterTypBeschreibung
callback() => voidFunktion, die bei Anzeige aufgerufen wird
ais.onShow(function () {
// Daten aktualisieren, wenn Benutzer zur App zurückkehrt
refreshDashboard();
});

ais.onHide(callback)

Registriert einen Callback, der ausgelöst wird, wenn das Mini-Programm ausgeblendet wird (z.B. Benutzer wechselt zu Chat oder einer anderen App).

ParameterTypBeschreibung
callback() => voidFunktion, die bei Ausblendung aufgerufen wird
ais.onHide(function () {
// Teure Operationen pausieren
stopPolling();
});

ais.close()

Schließt das Mini-Programm und kehrt zur Chat-Ansicht zurück. Der iframe wird nach diesem Aufruf zerstört.

Rückgabe: Promise<boolean>

document.getElementById("done-btn").addEventListener("click", function () {
ais.close();
});

Speicher

Pro-App isolierter Schlüssel-Wert-Speicher, unterstützt durch IndexedDB. Schlüssel werden automatisch mit mp:{app-name}: vorangestellt, sodass Apps nicht auf die Daten anderer Apps zugreifen können.

Berechtigung: Immer erlaubt – keine Berechtigung erforderlich.

ais.storage.get(key)

Ruft einen Wert anhand des Schlüssels ab. Gibt undefined zurück, wenn der Schlüssel nicht existiert.

ParameterTypBeschreibung
keystringDer Speicherschlüssel

Rückgabe: Promise<unknown> – der gespeicherte Wert oder undefined

const count = await ais.storage.get("visit-count");
console.log("Besuche:", count); // number, string, object, array oder undefined

ais.storage.set(key, value)

Speichert ein Schlüssel-Wert-Paar. Der Wert kann jeder JSON-serialisierbare Typ sein (string, number, boolean, object, array, null).

ParameterTypBeschreibung
keystringDer Speicherschlüssel
valueunknownDer zu speichernde Wert (muss JSON-serialisierbar sein)

Rückgabe: Promise<boolean>true bei Erfolg

await ais.storage.set("visit-count", 42);
await ais.storage.set("preferences", { theme: "dark", fontSize: 16 });

ais.storage.remove(key)

Löscht einen Schlüssel aus dem Speicher.

ParameterTypBeschreibung
keystringDer zu entfernende Schlüssel

Rückgabe: Promise<boolean>true bei Erfolg

await ais.storage.remove("temporary-data");

ais.storage.keys()

Listet alle von diesem Mini-Programm gespeicherten Schlüssel auf (ohne das interne mp:{name}:-Präfix).

Rückgabe: Promise<string[]>

const keys = await ais.storage.keys();
console.log("Gespeicherte Schlüssel:", keys); // ['visit-count', 'preferences']

Chat

Chat-Verlauf lesen, Nachrichten senden und neue Nachrichten in der aktiven Konversation abonnieren.

Erforderliche Berechtigungen: chat:read zum Lesen, chat:write zum Senden.

ais.chat.getHistory(limit?)

Holt aktuelle Nachrichten aus der aktiven Chat-Sitzung.

ParameterTypStandardBeschreibung
limitnumber50Maximale Anzahl der zurückzugebenden Nachrichten

Rückgabe: Promise<ChatMessage[]>

interface ChatMessage {
role: "user" | "assistant" | "system";
content: string;
timestamp?: number;
}
const messages = await ais.chat.getHistory(20);
messages.forEach(function (msg) {
console.log(msg.role + ": " + msg.content);
});

ais.chat.send(text)

Sendet eine Nachricht als Benutzer. Dies löst aus, dass das aktive KI-Modell eine Antwort generiert.

ParameterTypBeschreibung
textstringDer zu sendende Nachrichtentext

Rückgabe: Promise<boolean>true bei Erfolg

await ais.chat.send("Fasse die letzten 5 Nachrichten zusammen");
Warnung

Der Aufruf von ais.chat.send() löst einen tatsächlichen API-Aufruf an den konfigurierten KI-Anbieter des Benutzers aus. Dies verbraucht Tokens und kann Kosten verursachen. Verwenden Sie es verantwortungsvoll und informieren Sie den Benutzer immer, bevor Sie Nachrichten programmatisch senden.

ais.chat.onMessage(callback)

Abonniert neue Chat-Nachrichten. Der Callback wird für jede neue Nachricht ausgelöst (sowohl Benutzer als auch Assistant).

ParameterTypBeschreibung
callback(msg: ChatMessage) => voidHandler für eingehende Nachrichten
ais.chat.onMessage(function (msg) {
if (msg.role === "assistant") {
// KI-Modell hat geantwortet
updateResponseDisplay(msg.content);
}
});

Config

Liest die Konfiguration des aktiven Bots (Anbieter, Modell, System-Prompt, etc.).

Erforderliche Berechtigung: config:read

ais.config.get()

Holt das vollständige Bot-Konfigurationsobjekt.

Rückgabe: Promise<BotConfig>

interface BotConfig {
n?: string; // Bot-Name
p?: string; // Anbieter-ID (z.B. 'anthropic', 'openai', 'gemini')
m?: string; // Modell-ID (z.B. 'claude-sonnet-4-20250514')
s?: string; // System-Prompt
t?: number; // Temperatur (0.0 - 2.0)
x?: number; // Max. Output-Tokens
[key: string]: unknown;
}
const config = await ais.config.get();
console.log("Verwendetes Modell:", config.m);
console.log("System-Prompt:", config.s);

ais.config.getProvider()

Holt die aktive Anbieter-ID.

Rückgabe: Promise<string> – z.B. 'anthropic', 'openai', 'gemini', 'xai', 'openrouter', 'ollama'

const provider = await ais.config.getProvider();
if (provider === "ollama") {
showLocalModelBanner();
}

ais.config.getModel()

Holt die aktive Modell-ID.

Rückgabe: Promise<string> – z.B. 'claude-sonnet-4-20250514', 'gpt-4o', 'gemini-2.5-flash'

const model = await ais.config.getModel();
document.getElementById("model-name").textContent = model;

UI

Benachrichtigungen anzeigen, Bestätigungsdialoge zeigen und den Titel des Apps-Panels aktualisieren.

ais.ui.toast(message, duration?)

Zeigt eine temporäre Toast-Benachrichtigung in der Plattform-UI.

ParameterTypStandardBeschreibung
messagestring--Benachrichtigungstext (max. 200 Zeichen)
durationnumber3000Dauer in Millisekunden

Rückgabe: Promise<boolean>

Berechtigung: ui:toast (empfohlen, aber nicht strikt erzwungen – Toast ist wenig invasiv)

await ais.ui.toast("Datei erfolgreich gespeichert!");
await ais.ui.toast("Verarbeite...", 5000); // 5-Sekunden-Toast

ais.ui.confirm(title, message)

Zeigt einen Bestätigungsdialog und wartet auf die Antwort des Benutzers.

ParameterTypBeschreibung
titlestringDialog-Titel (max. 100 Zeichen)
messagestringDialog-Text (max. 500 Zeichen)

Rückgabe: Promise<boolean>true wenn Benutzer OK geklickt hat, false bei Abbruch

Erforderliche Berechtigung: ui:modal

const confirmed = await ais.ui.confirm(
"Alle Daten löschen?",
"Dies entfernt dauerhaft alle gespeicherten Elemente. Diese Aktion kann nicht rückgängig gemacht werden.",
);
if (confirmed) {
await clearAllData();
}

ais.ui.setTitle(title)

Setzt den Text, der in der Titelleiste des Apps-Panels angezeigt wird.

ParameterTypBeschreibung
titlestringTiteltext (max. 100 Zeichen)

Rückgabe: Promise<boolean>

ais.ui.setTitle("Wortzähler - 1.234 Wörter");

Auth

Liest Informationen über den aktuell angemeldeten Benutzer.

Erforderliche Berechtigung: auth:read

ais.auth.getUser()

Holt die Profilinformationen des aktuellen Benutzers.

Rückgabe: Promise<UserInfo | null>null wenn nicht angemeldet

interface UserInfo {
name: string; // Anzeigename
email: string; // E-Mail-Adresse
picture: string; // Profilfoto-URL
}
const user = await ais.auth.getUser();
if (user) {
document.getElementById("avatar").src = user.picture;
document.getElementById("name").textContent = user.name;
} else {
document.getElementById("name").textContent = "Gast";
}

ais.auth.getTier()

Holt das Abonnement-Level des Benutzers.

Rückgabe: Promise<string> – z.B. 'free', 'pro', 'team'

const tier = await ais.auth.getTier();
if (tier === "free") {
showUpgradePrompt();
}

Secrets

Liest und schreibt API-Schlüssel für Gerät-zu-Gerät-Übertragungsszenarien. Dies ist eine privilegierte API, die von Apps wie Geräte-Sync verwendet wird.

Erforderliche Berechtigung: secrets:sync

Vorsicht

Die secrets:sync-Berechtigung gewährt Zugriff auf die gespeicherten API-Schlüssel des Benutzers. Fordern Sie diese Berechtigung nur an, wenn Ihre App tatsächlich Credentials übertragen oder sichern muss. Benutzer sehen eine klare Warnung im Berechtigungsdialog.

ais.secrets.list()

Listet Anbieternamen auf, die gespeicherte API-Schlüssel haben.

Rückgabe: Promise<string[]> – z.B. ['anthropic', 'openai', 'gemini']

ais.secrets.get(provider)

Holt einen API-Schlüsselwert anhand des Anbieternamens.

ParameterTypBeschreibung
providerstringAnbietername (z.B. 'anthropic', 'openai')

Rückgabe: Promise<string | null>

ais.secrets.set(provider, value)

Speichert einen API-Schlüssel für einen Anbieter.

ParameterTypBeschreibung
providerstringAnbietername
valuestringAPI-Schlüsselwert (max. 1024 Zeichen)

Rückgabe: Promise<boolean>


Sync

Synchronisiert Profile, Einstellungen und WebRTC-Signalisierung für Gerät-zu-Gerät-Übertragung.

Erforderliche Berechtigung: secrets:sync

ais.sync.getProfiles()

Holt alle Benutzerprofile von der Host-Plattform.

Rückgabe: Promise<Profile[]>

ais.sync.setProfiles(profiles)

Importiert Profile in die Host-Plattform.

ParameterTypBeschreibung
profilesProfile[]Array von Profilobjekten zum Importieren

Rückgabe: Promise<number> – Anzahl importierter Profile

ais.sync.getSettings()

Holt App-Einstellungen (Theme, Locale, etc.) vom Host.

Rückgabe: Promise<Record<string, string>>

ais.sync.setSettings(settings)

Schreibt App-Einstellungen zum Host.

ParameterTypBeschreibung
settingsRecord<string, string>Schlüssel-Wert-Einstellungen zum Schreiben

Rückgabe: Promise<boolean>

ais.sync.signal(code, type, sdp)

Postet ein SDP-Offer/Answer zum API-Relay für WebRTC-Signalisierung.

ParameterTypBeschreibung
codestringPairing-Code
type'offer' | 'answer'SDP-Typ
sdpRTCSessionDescriptionInitSDP-Daten

Rückgabe: Promise<boolean>

ais.sync.pollSignal(code, type)

Pollt nach einem SDP-Offer/Answer vom API-Relay.

ParameterTypBeschreibung
codestringPairing-Code
type'offer' | 'answer'SDP-Typ, nach dem gepollt werden soll

Rückgabe: Promise<RTCSessionDescriptionInit | null>


Hooks

Registriert und feuert benutzerdefinierte Hook-Events, um Plattform-Verhalten zu erweitern oder zwischen Apps zu kommunizieren.

Erforderliche Berechtigungen: hooks:action zum Feuern von Events, hooks:filter zum Registrieren von Filter-Handlern.

ais.hooks.on(hookName, handler)

Hört auf ein benanntes Hook-Event.

ParameterTypBeschreibung
hookNamestringHook-Name (z.B. 'chat:before-send')
handler(data: unknown) => voidEvent-Handler

Rückgabe: Promise<boolean>

ais.hooks.on("chat:before-send", function (data) {
console.log("Nachricht wird gesendet:", data);
});

ais.hooks.fire(hookName, data?)

Feuert ein benanntes Hook-Event. Alle registrierten Handler für diesen Hook werden aufgerufen.

ParameterTypBeschreibung
hookNamestringHook-Name zum Feuern
dataunknownOptionale Daten-Payload

Rückgabe: Promise<unknown>

await ais.hooks.fire("my-app:data-updated", { count: 42 });

Pages

Veröffentlicht Webseiten auf bcz.co mit einem benutzerdefinierten Slug. Wird vom App Builder Mini-Programm verwendet.

Erforderliche Berechtigung: pages:publish

ais.pages.getInfo()

Holt Informationen über die veröffentlichte Seite des Benutzers.

Rückgabe: Promise<PageInfo>

interface PageInfo {
slug: string | null;
url: string | null;
title: string | null;
updatedAt: number | null;
hasPage: boolean;
}

ais.pages.claim(slug)

Beansprucht einen Slug (Benutzername) für bcz.co/@slug.

ParameterTypBeschreibung
slugstringGewünschter Slug

Rückgabe: Promise<{ slug: string; url: string }>

ais.pages.publish(specBase64, opts?)

Veröffentlicht oder aktualisiert eine Seite. Die spec ist ein base64-kodiertes PDL-Dokument.

ParameterTypBeschreibung
specBase64stringBase64-kodierte Page-Spec
opts{ title?: string; description?: string }Optionale Metadaten

Rückgabe: Promise<PublishResult>

ais.pages.unpublish()

Entfernt die Veröffentlichung und gibt den Slug frei.

Rückgabe: Promise<boolean>


Plattform-Info

Schreibgeschützte Eigenschaften mit Plattform-Metadaten. Diese sind synchron – kein Promise, keine Berechtigung erforderlich.

ais.platform.version

Die Plattform-Versionszeichenfolge (semver).

Typ: string – aktuell '1.0.0'

ais.platform.abi

Die ABI-Versionsnummer. Wird verwendet, um die Kompatibilität zwischen SDK und Host-Plattform zu verifizieren.

Typ: number – aktuell 1

if (ais.platform.abi !== 1) {
ais.ui.toast("Diese App erfordert ABI-Version 1");
ais.close();
}

Fehlerbehandlung

Alle SDK-Aufrufe, die Berechtigungen erfordern, lehnen mit einem PermissionDenied-Fehler ab, wenn die App nicht die erforderliche Berechtigung hat:

try {
const history = await ais.chat.getHistory();
} catch (err) {
if (err.message.includes("PermissionDenied")) {
console.log("App hat keine chat:read-Berechtigung");
}
}

Unbekannte Methoden geben einen Fehler mit der Nachricht Unknown method: {method} zurück.

Wenn die Host-Plattform auf einen unerwarteten Fehler stößt, lehnt das Promise mit der Fehlermeldungszeichenfolge ab.

Tipp

Wickeln Sie SDK-Aufrufe immer in try/catch-Blöcke ein, insbesondere bei berechtigungsgesteuerten APIs. Dies macht Ihre App robust, selbst wenn die Plattform-Version des Benutzers von der, die Sie getestet haben, abweicht.


Vollständiges Beispiel

Eine minimale App, die mehrere SDK-Funktionen verwendet:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
body {
font-family: system-ui;
padding: 16px;
color: #e0e0e0;
background: #1a1a2e;
}
button {
min-height: 48px;
padding: 8px 16px;
font-size: 16px;
border: 1px solid #444;
border-radius: 6px;
background: #2a2a4e;
color: #e0e0e0;
cursor: pointer;
}
button:hover {
background: #3a3a5e;
}
pre {
background: #111;
padding: 12px;
border-radius: 6px;
overflow: auto;
}
</style>
</head>
<body>
<h2>Chat-Inspektor</h2>
<button id="load">Verlauf laden</button>
<button id="close">Schließen</button>
<pre id="output">Klicken Sie auf "Verlauf laden", um zu beginnen...</pre>

<script>
ais.ready(async function () {
// Zeige welches Modell aktiv ist
var model = await ais.config.getModel();
ais.ui.setTitle("Chat-Inspektor - " + model);

document
.getElementById("load")
.addEventListener("click", async function () {
var messages = await ais.chat.getHistory(25);
var output = messages
.map(function (m) {
return "[" + m.role + "] " + m.content.slice(0, 100);
})
.join("\n");
document.getElementById("output").textContent =
output || "(keine Nachrichten)";
ais.ui.toast(messages.length + " Nachrichten geladen");
});

document.getElementById("close").addEventListener("click", function () {
ais.close();
});

// Abonniere neue Nachrichten in Echtzeit
ais.chat.onMessage(function (msg) {
var el = document.getElementById("output");
el.textContent += "\n[" + msg.role + "] " + msg.content.slice(0, 100);
});
});
</script>
</body>
</html>

Manifest für dieses Beispiel:

{
"name": "chat-inspector",
"version": "1.0.0",
"abi": 1,
"type": "mini-program",
"description": "Chat-Verlauf anzeigen und überwachen",
"entry": "index.html",
"base_url": "https://your-cdn.com/chat-inspector/",
"permissions": ["chat:read", "config:read", "ui:toast"]
}