Teknisk reference
Denne side er til udviklere, der vil forstå, hvad assistenten skriver, eller læse og rette en miniapps kode. Du behøver den ikke for at bygge eller bruge en miniapp.
En miniapp er ét HTML-dokument med sin egen CSS og JavaScript. Før dens egen kode kører, sætter AgentBase tre ting ind øverst i <head>: et stylesheet med organisationens farver, listen over miniappens apps og en lille klient, der giver koden window.agentbase.
window.agentbase
Den eneste vej fra miniappen til AgentBase. Objektet er låst (kan ikke overskrives), og alle kald returnerer et Promise, der afvises med en Error, hvis message er en dansk besked, der kan vises direkte for brugeren.
window.agentbase.apps
// Miniappens apps:
// [{ id, name, description, inputs, outputs, gated, accessible, ... }]
// inputs er et JSON Schema; outputs er [{ name, type, label }].
await window.agentbase.runApp(appIdEllerNavn, inputs)
// Kører appen som den, der bruger miniappen. Svarer med { outputnavn: værdi }.
await window.agentbase.ask(prompt, { system, schema })
// Spørger organisationens sprogmodel. Uden schema: en tekst.
// Med et JSON Schema (type "object"): et objekt, der overholder det.
await window.agentbase.fileFromInput(inputElement)
// Uploader filerne fra et <input type="file"> som brugerens egne og svarer med
// [{ filename, mime_type, data: "", file_id }] — den form, en apps fil-input
// tager imod. Send værdien videre til runApp, som den er.
await window.agentbase.download(fil)
// Gemmer en fil hos brugeren: en apps outputfil { filename, mime_type, data },
// en fil fra fileFromInput (med file_id) eller en data:-URL.
apps
| Felt | Betydning |
|---|---|
id, name, description | Appen. runApp tager både id og navn (navnet uden forskel på store og små bogstaver). |
inputs | Appens input som JSON Schema |
outputs | [{ name, type, label }] — svaret fra runApp har én nøgle pr. output-name |
accessible | false, når den, der bruger miniappen, ikke må køre appen. Så har posten kun navnet, ikke felterne. |
missing | Appen eller dens låste version findes ikke længere |
follows_current | Appen er ikke låst til en version og følger den nuværende |
version_label | Den låste version, fx v2.0 |
gated | Appen har et godkendelsestrin (kan ikke køres fra en miniapp) |
En god miniapp tjekker accessible og viser en forklaring i stedet for en knap, der vil fejle.
runApp
const button = document.querySelector('#kør')
button.disabled = true
status.textContent = 'Kører …'
try {
const filer = await window.agentbase.fileFromInput(document.querySelector('#kontrakt'))
const svar = await window.agentbase.runApp('Kontrakttjek', { kontrakt: filer[0] })
vis(svar.fund)
} catch (err) {
fejl.textContent = err.message
} finally {
button.disabled = false
}
- Kun apps, der er erklæret i miniappen (står i
apps), kan køres. Andre afvises, før der sendes noget. - I kladden i Chat køres appens nuværende version; fra en delt miniapp den version, den delte version er låst til.
- Kaldet venter, til kørslen er færdig. Der er ingen ventende kørsler — apps med godkendelsestrin afvises.
ask
const svar = await window.agentbase.ask(tekst, {
system: 'Opsummer henvendelsen i tre punkter på dansk.',
})
const data = await window.agentbase.ask(tekst, {
schema: {
type: 'object',
properties: { emne: { type: 'string' }, haster: { type: 'boolean' } },
required: ['emne', 'haster'],
},
})
// data.emne, data.haster
Modellen er den samme som i Chat, på organisationens egen nøgle, hvis den har en. Et schema kontrolleres på samme måde som i byggeklodsen Struktureret output, og svaret valideres mod det: koden får enten et objekt, der passer, eller en fejl.
Udseende
Et stylesheet med organisationens farver og skriften Inter er allerede indlæst, og det følger lyst og mørkt tema.
| Klasse | Til |
|---|---|
ab-stack | Lodret stak med luft imellem |
ab-row | Vandret række, der ombryder |
ab-card | Kort med kant og baggrund |
ab-button, ab-button secondary | Primær og sekundær knap |
ab-input | Tekstfelt, valgliste og textarea |
ab-table | Tabel |
ab-muted | Dæmpet tekst |
ab-error | Fejltekst |
Farvevariabler: var(--primary), var(--primary-foreground), var(--foreground), var(--muted-foreground), var(--border), var(--card), var(--radius).
Grænser
| Hvad | Grænse |
|---|---|
| Miniappens kode | 200.000 tegn |
| Miniappens navn | 200 tegn |
ask — spørgsmål | 100.000 tegn |
ask — system og schema | 20.000 tegn hver |
| Én forespørgsel fra miniappen | 60 MB |
| Uploadede filer | Samme grænse som andre uploads i AgentBase |
| Fejl, der sendes med til assistenten | 20 pr. tur, 2.000 tegn hver |
Der er ingen grænse for, hvor mange kald en miniapp må lave.
Fejl i koden
Fejl i siden (error, ubehandlede Promise-afvisninger og console.error) opsamles og sendes med til assistenten på næste tur sammen med de seneste svar fra apps og sprogmodel. Linjenumre gælder miniappens egen kode, ikke det, AgentBase har sat ind foran.
Rammen
Miniappen vises i et <iframe> med srcdoc og sandbox="allow-scripts allow-forms allow-modals allow-downloads allow-popups allow-popups-to-escape-sandbox" — aldrig allow-same-origin eller allow-top-navigation. Rammen har derfor ingen oprindelse: localStorage, sessionStorage og cookies virker ikke, og koden kan ikke læse AgentBase-siden. Al kommunikation går som postMessage til AgentBase-siden, som kun svarer på beskeder fra netop denne ramme. Se Sikkerhed og data.
Kørsler
En appkørsel fra en miniapp har triggeren Miniapp i kørselsloggen og tilhører den, der brugte miniappen. Den tæller med i appens hukommelse og byggeklodsernes hukommelse mellem kørsler som andre kørsler i drift.