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 ---| |
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.
| Parameter | Typ | Beschreibung |
|---|---|---|
callback | () => void | Funktion, 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;
});
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).
| Parameter | Typ | Beschreibung |
|---|---|---|
callback | () => void | Funktion, 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).
| Parameter | Typ | Beschreibung |
|---|---|---|
callback | () => void | Funktion, 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
key | string | Der 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).
| Parameter | Typ | Beschreibung |
|---|---|---|
key | string | Der Speicherschlüssel |
value | unknown | Der 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
key | string | Der 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.
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
limit | number | 50 | Maximale 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
text | string | Der zu sendende Nachrichtentext |
Rückgabe: Promise<boolean> – true bei Erfolg
await ais.chat.send("Fasse die letzten 5 Nachrichten zusammen");
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).
| Parameter | Typ | Beschreibung |
|---|---|---|
callback | (msg: ChatMessage) => void | Handler 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.
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
message | string | -- | Benachrichtigungstext (max. 200 Zeichen) |
duration | number | 3000 | Dauer 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
title | string | Dialog-Titel (max. 100 Zeichen) |
message | string | Dialog-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.
| Parameter | Typ | Beschreibung |
|---|---|---|
title | string | Titeltext (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
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.
| Parameter | Typ | Beschreibung |
|---|---|---|
provider | string | Anbietername (z.B. 'anthropic', 'openai') |
Rückgabe: Promise<string | null>
ais.secrets.set(provider, value)
Speichert einen API-Schlüssel für einen Anbieter.
| Parameter | Typ | Beschreibung |
|---|---|---|
provider | string | Anbietername |
value | string | API-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.
| Parameter | Typ | Beschreibung |
|---|---|---|
profiles | Profile[] | 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
settings | Record<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.
| Parameter | Typ | Beschreibung |
|---|---|---|
code | string | Pairing-Code |
type | 'offer' | 'answer' | SDP-Typ |
sdp | RTCSessionDescriptionInit | SDP-Daten |
Rückgabe: Promise<boolean>
ais.sync.pollSignal(code, type)
Pollt nach einem SDP-Offer/Answer vom API-Relay.
| Parameter | Typ | Beschreibung |
|---|---|---|
code | string | Pairing-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.
| Parameter | Typ | Beschreibung |
|---|---|---|
hookName | string | Hook-Name (z.B. 'chat:before-send') |
handler | (data: unknown) => void | Event-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.
| Parameter | Typ | Beschreibung |
|---|---|---|
hookName | string | Hook-Name zum Feuern |
data | unknown | Optionale 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.
| Parameter | Typ | Beschreibung |
|---|---|---|
slug | string | Gewü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.
| Parameter | Typ | Beschreibung |
|---|---|---|
specBase64 | string | Base64-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.
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"]
}