Prompts via de API¶
Het concept achter agents staat in Agents.
Op deze pagina sla je een promptsjabloon op met de API, voeg je versies toe en gebruik je de prompt in een verzoek. Met een opgeslagen prompt gebruik je dezelfde instructies bij meerdere aanroepen en werk je ze bij zonder je applicatie uit te rollen. Een verzoek kiest een vaste versie of de nieuwste, en het auditspoor legt de gebruikte versie vast.
Je sleutel heeft de capability prompts nodig. Hetzelfde doe je met de muis in
Prompts in de console.
Een prompt maken¶
curl -s -X POST "$CORE_URL/prompts" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"name": "triage",
"template": "Classificeer het ticket hieronder als facturatie, technisch of overig.\n\n{{ ticket }}",
"input_schema": {"properties": {"ticket": {"type": "string"}}, "required": ["ticket"]},
"role": "developer"}'
Een geslaagd verzoek geeft 201 en maakt de prompt met versie 1 aan.
| Veld | Wat het doet |
|---|---|
name |
uniek binnen je organisatie; waar een verzoek naar verwijst |
template |
de tekst, met {{ naam }} voor een variabele en {{ $naam }} voor een invulwaarde |
input_schema |
elke variabele die het sjabloon gebruikt, gedeclareerd als een JSON Schema-object — en niets anders: één item in properties per variabele, en onder required de namen die een aanroep moet invullen (hieronder) |
install_values |
optioneel: een waarde voor elke {{ $naam }}, zoals {"bedrijf": {"type": "string", "value": "Acme"}} (hieronder) |
role |
developer (de standaard) of delegate: het niveau waarop de gerenderde tekst binnenkomt |
metadata |
een eigen ondoorzichtig object, maximaal 16 KiB geserialiseerd; Core bewaart en geeft het terug en leest het nooit |
Sjablonen ondersteunen alleen het invullen van plaatshouders. Voorwaarden, filters en includes worden niet ondersteund.
Het invoerschema¶
input_schema is een JSON Schema-object, zodat elk hulpmiddel dat JSON Schema leest er een
formulier of een aanroep van kan maken. Elke property is één variabele:
| Sleutel | Wat hij zegt |
|---|---|
type |
string, number, integer of boolean: wat een aanroep ervoor moet meesturen |
description |
optioneel: wat de variabele bevat, voor wie de prompt aanroept |
enum |
optioneel: de enige toegestane waarden, elk van het eigen type van de variabele |
default of x-builtin |
optioneel: wat Core invult als een aanroep niets meestuurt (hieronder) |
required noemt de variabelen die een aanroep moet invullen. Een variabele met een standaard staat
daar nooit in. Andere JSON Schema-sleutels, zoals pattern of geneste objecten, worden geweigerd:
een waarde wordt altijd als tekst ingevoegd, dus er is niets voor ze om te beschrijven. Een getal
wordt ingevoegd zoals je het stuurde, zoals 3 of 2.5, en een boolean als true of false.
Invulwaarden¶
Een {{ $naam }} is een invulwaarde: een waarde die je één keer vastlegt in install_values en
die Core invult voordat het sjabloon wordt gelezen, zodat hij deel is van de instructies zelf. Een
variabele vult de aanroeper bij elke aanroep in. Elke invulwaarde zegt wat hij is, net zoals een
parameter van een gedeelde bundel:
{"bedrijf": {"type": "string", "value": "Acme"},
"max_items": {"type": "number", "value": 5, "description": "hoeveel items te noemen"},
"toon": {"type": "enum", "value": "formeel", "allowed": ["formeel", "informeel"]}}
type is string, number of enum; een enum noemt zijn toegestane waarden in allowed en
zijn value is daar een van. Deel je de prompt via een publicatie, dan wordt elke invulwaarde een
parameter van dat type met jouw waarde als standaard, en vult wie hem installeert zijn eigen waarde
in (Delen). Elke {{ $naam }}
heeft een waarde nodig, elke waarde moet worden gebruikt, een naam kan niet ook een variabele zijn,
en een waarde mag geen {{ of }} bevatten.
metadata hoort bij de prompt, niet bij één versie: een nieuwe versie die het veld weglaat, houdt
wat er staat, en {} wist het. Zet er neer wat je eigen applicatie nodig heeft — Core kijkt er
nooit in.
Een versie toevoegen¶
curl -s -X POST "$CORE_URL/prompts/prm_5Nj2.../versions" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"template": "Classificeer het ticket hieronder als facturatie, technisch, beveiliging of overig.\n\n{{ ticket }}",
"input_schema": {"properties": {"ticket": {"type": "string"}},
"required": ["ticket"]}}'
Versies worden genummerd vanaf 1 en kunnen na het aanmaken niet worden gewijzigd.
| Aanroep | Antwoordt |
|---|---|
GET /prompts |
je prompts, elk met de laatste versie voluit |
GET /prompts/{prompt_id} |
één prompt met zijn laatste versie |
GET /prompts/{prompt_id}/versions |
zijn versies, gepagineerd op versienummer, oudste eerst; voeg ?order=desc toe voor nieuwste eerst |
GET /prompts/{prompt_id}/versions/{version} |
één versie |
DELETE /prompts/{prompt_id} |
204; elke versie gaat mee |
Een prompt kopiëren¶
Wil je een nieuwe prompt beginnen vanuit een die je al hebt, kopieer hem dan onder een nieuwe naam:
curl -s -X POST "$CORE_URL/prompts/prm_8Kd1.../copy" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"name": "greeting-formal"}'
Het antwoord is 201 met de nieuwe prompt, op zijn eigen versie 1. Noem een version om die te
kopiëren in plaats van de laatste. De kopie neemt de template, het invoerschema, de rol en de
invulwaarden van die versie over, en de labels en metadata van de prompt. Vanaf dan is het je
eigen prompt: wat je eraan verandert, verandert het origineel niet. Een kopie die een publicatie
verzegeld installeerde, en een kopie waarvan de publicatie losmaken niet toestaat
('fork': false), hem voor haar eigen agents houdt of hergebruik niet toestaat, kun je niet
kopiëren: 403.
Een prompt gebruiken¶
{
"model": "<een model-id>",
"prompt": { "id": "triage", "variables": { "ticket": "Mijn kaart is twee keer belast." } }
}
Stel id in op de promptnaam of het prm_-id. Elke waarde in variables moet passen bij zijn
property in het invoerschema: een number neemt een JSON-getal, niet de tekst "3", en een enum
neemt een van zijn waarden. Laat version weg om de nieuwste versie op het
moment van aanroepen te gebruiken. Geef een versienummer op om die versie te blijven gebruiken nadat
er nieuwe zijn gepubliceerd.
Core plaatst de ingevulde prompt vóór de andere invoeritems. Opgeslagen gesprekken bewaren deze, zodat je in het gesprek kunt teruglezen welke instructies zijn gebruikt.
Een prompt invullen voor een tool¶
Een prompt kan ook de invoer van een tool zijn in plaats van die van een model. Zet een argument van
een tool-alias vast op {"$prompt": {"id": "banner"}}; elke aanroep van de alias vult dan de
prompt in met de tool_variables van de aanroeper en geeft de tekst door aan de tool, bijvoorbeeld
een afbeeldingsmodel. Zie Een argument vastzetten op een opgeslagen
prompt.
Templatevariabelen¶
Het sjabloon krijgt de autoriteit van de ingestelde rol. De waarde van een variabele krijgt het
label onvertrouwd en wordt niet opnieuw verwerkt op placeholders: een waarde met {{ ticket }}
blijft letterlijke tekst.
De waarde komt in de tekst van het sjabloon te staan, op de plek van de placeholder. Voor een
sleutel met trust_envelope verpakt Core haar daar in
<untrusted source="prompt-variable" name="...">, zodat het model te horen krijgt dat het gegevens
zijn. Voor een sleutel zonder die capability staat de waarde als gewone tekst in de instructie,
zoals in elk promptsjabloon, en kan het model haar niet onderscheiden van de woorden eromheen.
Gebruik variabelen voor inhoud van gebruikers en zet applicatie-instructies in het sjabloon.
Standaardwaarden voor variabelen¶
Een variabele kan een standaard hebben die Core invult als de beurt er geen waarde voor meestuurt. Geef in zijn property een van twee sleutels:
default: een vaste waarde van het eigen type van de variabele; als tekst maximaal 4096 tekens.x-builtin: de naam van een waarde die Core zelf kent op het moment van de beurt, zoalsdate.
curl -s -X POST "$CORE_URL/prompts" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"name": "helpdesk",
"template": "Vandaag is het {{ datum }}. Antwoord {{ toon }}.\n\n{{ vraag }}",
"input_schema": {
"properties": {"datum": {"type": "string", "x-builtin": "date"},
"toon": {"type": "string", "default": "kort en vriendelijk"},
"vraag": {"type": "string"}},
"required": ["vraag"]}}'
Een beurt die alleen vraag meestuurt, levert het model Vandaag is het 2026-09-24. Antwoord kort
en vriendelijk. gevolgd door de vraag. Per plaatshouder kiest Core de waarde in deze volgorde:
- de waarde in
prompt.variablesvan de beurt; - anders de
defaultofx-builtinvan de variabele; - anders niets: een verplichte variabele geeft dan
400, een optionele blijft leeg.
Laat de naam weg uit prompt.variables als je de standaard wilt. Een lege tekst is ook een waarde
en gaat voor de standaard.
Een variabele heeft hoogstens één standaard, en een variabele met een standaard staat nooit in
required. Een nieuwe versie declareert zijn variabelen op dezelfde manier. Elke leesroute geeft
het invoerschema terug zoals je het schreef, aangevuld met "type": "object",
"additionalProperties": false, en description als "" waar je die weggelaten had.
x-builtin |
Wat Core invult |
|---|---|
date |
de datum als JJJJ-MM-DD, bijvoorbeeld 2026-09-24 |
time |
de tijd als UU:MM, bijvoorbeeld 14:05 |
datetime |
datum en tijd in RFC 3339, met het verschil met UTC: 2026-09-24T14:05:31+02:00 |
weekday |
de dag van de week in het Engels, bijvoorbeeld Thursday |
organisation_name |
de naam van je organisatie |
agent_name |
de naam van de agent die de beurt noemt; leeg zonder agent |
model |
het model dat de beurt of haar agent noemt; ook als de beurt daarna terugvalt op een ander model |
subject_id |
het id van de persoon voor wie de beurt is; leeg zonder persoon |
subject_name |
het attribuut name dat je over de persoon meestuurt; leeg zonder dat attribuut |
subject.<attribuut> |
wat je over de persoon meestuurt voor dat attribuut, zoals subject.afdeling; meerdere waarden gescheiden door , |
thread_id |
het id van de thread waarop de beurt wordt opgeslagen; leeg voor een beurt zonder opslag |
run_id |
het id van de achtergrondrun; leeg voor een beurt waarop je wacht |
Wat een beurt niet heeft, blijft leeg; de beurt wordt er niet om geweigerd. Hoe je een persoon en zijn attributen meestuurt, staat in Bouwen voor personen.
De vier tijdwaarden worden gelezen in de eerste tijdzone die er is: timezone op het verzoek
(Verzoekvelden), de timezone van de planning die de
beurt afvuurt, de timezone van je organisatie (Tijdzone),
en anders UTC.
Een standaard en wat Core zelf bepaalt — de tijdwaarden, agent_name, model, thread_id en
run_id — krijgen het gewicht van het sjabloon. subject_id, subject_name en
subject.<attribuut> komen van de aanroeper en worden behandeld als de waarde van een variabele, net als
een waarde in prompt.variables (hierboven). Dat
geldt ook voor organisation_name, omdat anderen dan de schrijver van het sjabloon die naam kunnen wijzigen.
Een agent die de prompt vastzet, gebruikt dezelfde standaarden: agent.variables
hoeft een variabele met een standaard niet te noemen, en agent_name wordt de naam van die agent.
Fouten¶
| Status | Oorzaak |
|---|---|
404 |
geen zo'n prompt, geen zo'n vastgezette versie, een prompt die het beleid van je sleutel niet noemt, of prompts geldt niet voor je sleutel |
403 |
de naam die je aanmaakt, valt buiten wat het beleid van je sleutel noemt; er wordt niets opgeslagen |
409 |
de naam is al bezet |
422 op template |
een plaatshouder die je niet in input_schema declareerde |
422 op input_schema |
een gedeclareerde variabele die het sjabloon niet gebruikt, een naam in required die niet gedeclareerd is of twee keer staat, a variable has one fallback, an x-builtin or a default: <naam> (allebei gegeven), a variable with a fallback is not required: <naam> (een standaard en required), een standaard of enum-waarde die niet bij het type past, of not a built-in value: <builtin> (een naam buiten de tabel hierboven, of een attribuutnaam met iets anders dan letters, cijfers, ., _, : en -, of langer dan 64 tekens) |
422 op install_values |
een {{ $naam }} zonder waarde, een waarde die het sjabloon niet gebruikt, een naam die ook een variabele is, een waarde met {{ of }}, of een waarde die niet bij zijn type past |
400 op prompt.variables |
een verplichte variabele zonder waarde in een beurt, een waarde voor een variabele die de prompt niet declareert, of een waarde die niet bij zijn property past (<naam> must be a number, <naam> must be one of the values its enum lists) |
Een weigering in een beurt -- een verzoek dat een prompt noemt -- komt binnen in het foutobject
van OpenAI, met het veld in error.param; een weigering
bij het schrijven naar /prompts is problem+json, met het veld in errors.
De gebruikte versie terugvinden¶
Elke keer dat een prompt wordt ingevuld, ontstaat een auditgebeurtenis
prompt.rendered met het prompt-id, de naam en de versie. Bekijk deze bij onderzoek naar veranderd
modelgedrag.