Publiceren en installeren via de API¶
Het concept achter publicaties staat in Delen en hergebruik.
Een sleutel met de capability management doet alles wat een beheerder in de console doet met een
bundel: publiceren, installeren, synchroniseren en een gekopieerd onderdeel losmaken
(Organisaties beheren via de API laat zien hoe je die
capability aanzet). De routes hier komen in dezelfde twee vormen: een pad zonder organisatie erin
gaat over je eigen organisatie, en een pad dat er een noemt (/organisations/{id}/...) gaat over
een organisatie onder je.
Voor een bundel die als bestanden in een repository staat, roept het commando artific deze
routes voor je aan: Een bundel uitbrengen met het artific-commando.
Publiceren¶
POST /publications maakt het aanbod aan — een naam, wie hem mag zien (visibility) en of hij
meteen listed is:
curl -s -X POST "$CORE_URL/publications" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"name": "starter-bundel", "visibility": "subtree", "status": "listed"}'
PATCH /publications/{pid} wijzigt de beschrijving en alleen de beschrijving: de naam en de
zichtbaarheid blijven zoals ze waren, en een body die er een noemt wordt geweigerd. Bij een app die
al in de marktplaats staat verschijnt de nieuwe tekst als pending_description in je eigen reads
en gaat hij live zodra Artific na zijn beoordeling de eerstvolgende versie van de app vrijgeeft.
POST /publications/{pid}/versions publiceert een versie — uit rijen van je eigen bibliotheek, of
als kant-en-klaar manifest:
curl -s -X POST "$CORE_URL/publications/pub_4Kd9.../versions" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"members": [{"kind": "prompt", "id": "prm_9Fb2..."}]}'
GET /publications, GET /publications/{pid} en de covers ernaast beantwoorden precies wat de
console over jouw eigen aanbod laat zien; GET /publications/{pid}/entitlements laat zien wie er
recht op heeft. POST .../submit vraagt Artific om een catalogue-publicatie te beoordelen; het
beoordelen zelf blijft aan Artific, net als de recensie-wachtrij van GET /catalogue.
Installeren¶
GET /available-publications toont wat je organisatie mag installeren; POST /subscriptions
installeert er een:
curl -s -X POST "$CORE_URL/subscriptions" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"publication_id": "pub_4Kd9..."}'
Ontbreekt er een verplichte parameterwaarde, dan komt het abonnement op needs_configuration te
staan in plaats van te weigeren; PATCH /subscriptions/{sid} levert de waarde na, en
PATCH .../secrets een credential apart. Een bundel die mensen laat inloggen via een
OAuth-applicatie die deze installatie niet heeft ingesteld, wacht ook op needs_configuration, met
last_error unconfigured_client:<naam> (de preview noemt de naam onder
clients.unconfigured); vraag je beheerder die applicatie in te stellen en stuur daarna
PATCH /subscriptions/{sid} met de body {} om opnieuw te controleren en de installatie te
starten. GET /subscriptions, GET .../{sid} en
POST .../preview (wat installeren zou betekenen, zonder iets te schrijven) werken hetzelfde als
in de console.
Synchroniseren en losmaken¶
POST /subscriptions/{sid}/sync vraagt direct om de synchronisatie die een nieuwe versie, een
nieuwe config of een nieuwe credential anders zelf in gang zou zetten:
curl -s -X POST "$CORE_URL/subscriptions/sub_1Ac7.../sync" \
-H "Authorization: Bearer $CORE_KEY"
Staat het abonnement niet op linked, diverged of stale, dan antwoordt dit 409 met een vaste
code (sync_not_now:<status>) in plaats van een zin. POST .../members/{member}/fork maakt één
onderdeel los van de publicatie, zodat jouw organisatie het zelf mag wijzigen; de naam is die van
het onderdeel in het manifest, niet zijn id. DELETE /subscriptions/{sid} zegt het abonnement op.
Prompts in een bundel¶
De definitie van een promptlid is de body van POST /prompts/{id}/versions: template,
input_schema, role en install_values, plus de eigen metadata van de prompt. Een veld
labels wordt geaccepteerd en genegeerd; de kopie komt zonder labels binnen.
Publiceren vanuit rijen ({"kind": "prompt", "id": "prm_..."} in members) neemt de laatste
gepubliceerde versie van de prompt, nooit een concept, en maakt van de invulwaarden parameters van de
bundel, met jouw eigen waarde als standaard voor wie installeert.
Wat een geïnstalleerde promptkopie meeneemt¶
- Naam. Het
prefixvan het abonnement, gevolgd door de naam van het onderdeel. - Metadata. Die van de uitgever. Elke synchronisatie die de kopie schrijft (een nieuwe
publicatieversie, of een gewijzigde
config) vervangt demetadatavan de kopie in zijn geheel door die van het onderdeel; een onderdeel zonder metadata laat{}achter. Zolang de kopie gekoppeld is, kun je die zelf niet wijzigen: een nieuwe versie van een gekoppelde kopie is409. - Labels. Geen. Labels reizen nooit mee: de kopie komt ongeclassificeerd binnen, en geen synchronisatie schrijft haar labels.
- Versies. Een eigen reeks. Elke synchronisatie die de kopie schrijft, voegt haar volgende versie toe (1, 2, 3), welke publicatieversie die ook opleverde.
Een verzegelde promptkopie¶
Verbergt de uitgever de inhoud, dan verbergt het zegel de template en de variabelen van elke versie
die eronder is geïnstalleerd, en verder niets. GET /prompts/{id} en de versieroutes geven zo'n
versie terug met:
| Veld | Waarde |
|---|---|
sealed |
true |
template |
null |
input_schema |
leeg: {"type": "object", "properties": {}, "required": [], "additionalProperties": false} |
install_values |
{} |
role, version, state |
zoals geïnstalleerd |
Ook de name, de metadata en de origin van de prompt blijven leesbaar. Een beurt rendert de
versie ongewijzigd, dus een verzegelde prompt kun je draaien maar niet lezen. Een verzegelde kopie
kun je niet losmaken, en POST /prompts/{id}/copy weigert haar met 403.
Scripts in een bundel¶
Een script kan lid zijn van een bundel, net als een prompt of een
koppeling. Wie installeert, krijgt een kopie in de eigen bibliotheek, die aan de eigen modellen wordt
aangeboden als script__<voorvoegsel><naam>.
Wat een scriptlid bevat¶
De definitie van een scriptlid is de body van POST /scripts zonder name en labels: een kopie
komt ongeclassificeerd aan, zoals elke kopie. De bestanden van het script reizen niet in het
manifest mee. Elk item van files noemt een bestand met path, size_bytes en sha256, en de
bytes worden naast de publicatie bewaard, op digest:
curl -s -X PUT "$CORE_URL/publications/pub_4Kd9.../files/$(sha256sum sjabloon.pptx | cut -d' ' -f1)" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/octet-stream" \
--data-binary @sjabloon.pptx
De route controleert of de bytes de digest uit het pad hebben (anders 422 op sha256), en
hetzelfde bestand nog eens aanbieden schrijft niets. GET op hetzelfde pad zegt of de publicatie het
bestand al heeft; 404 betekent dat je het nog moet uploaden. De grenzen:
- één bestand hoogstens 32 MiB; een grotere upload geeft
413; - de scriptbestanden en meegebrachte pakketten van één versie samen hoogstens 128 MiB; daarboven
geeft de versie
422opmembers; - alle bestanden van één publicatie samen hoogstens 1 GiB; daarboven geeft een upload of een
publicatie
409.
Je operator kan ze aanpassen.
Met de hand uploaden hoeft zelden:
- Publiceren vanuit rijen (
{"kind": "script", "id": "scr_..."}inmembers) neemt de laatste versie van het script en kopieert de bestanden zelf naar de publicatie. - Een manifest publiceren vraagt dat elk bestand eerst geüpload is. Een item waarvan de publicatie
de digest niet heeft, geeft
422opmembers.<i>.definition.files.<j>.sha256.
Een toolset, alias of agent in dezelfde bundel noemt het script als
{"$member": "huisstijl_presentatie", "kind": "script"}, wat de eigen kopie van de abonnee wordt. De
bestanden van een gepubliceerde versie lees je terug via
GET /publications/{pid}/versions/{v}/members/script/{member}/files/{path}.
Pakketten in een bundel¶
Wat er met een pakket gebeurt dat een script noemt, hangt af van wie het goedkeurde:
- Een bibliotheek uit de image, of een pakket dat je operator voor de installatie goedkeurde, reist alleen op naam mee. De abonnee zit op dezelfde installatie, dus de kopie vindt dezelfde goedkeuring.
- Een pakket dat alleen jouw organisatie goedkeurde, reist met de bundel mee: het lid noemt het
met zijn bestand (
ecosystem,name,version,filename,size_bytes,sha256), en het bestand wordt naast de publicatie bewaard, net als de eigen bestanden van het script. Publiceren vanuit rijen kopieert het voor je.
De abonnee ziet deze pakketten vóór het installeren: packages in de preview noemt elk pakket met
ecosysteem, naam, versie, bestand en digest, ook als de bundel zijn inhoud verbergt. Installeren is
de goedkeuring. Het pakket wordt alleen voor dat gekopieerde script geïnstalleerd, staat op de
versies van de kopie als approval: bundle, en komt nooit in de eigen lijst met goedgekeurde
pakketten van de abonnee. Diens beheerders beslissen nog steeds zelf wat hun eigen scripts mogen
gebruiken.
Een latere versie waarin een script een pakket meebrengt dat het eerder niet meebracht (een nieuwe
naam, een nieuwe versie, of andere bytes), wacht op de abonnee, net als gewijzigde voorwaarden: het
abonnement gaat naar needs_acceptance en de kopie blijft draaien wat ze draaide. Bekijk die versie
eerst, met de eigen prefix en config van het abonnement zodat het rapport bij je installatie
past, en accepteer dan:
curl -s -X POST "$CORE_URL/subscriptions/preview" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"publication_id": "pub_4Kd9...", "follow": "pinned", "pinned_version": 4,
"prefix": "acme-", "config": {"bedrijf": "Acme"}}'
curl -s -X PATCH "$CORE_URL/subscriptions/sub_1Ac7..." \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"accept_terms_version": 4}'
Een versie die een pakket laat vallen, of alleen al geaccepteerde pakketten meebrengt, installeert zoals elke andere.
Een script installeren¶
Een bundel met een script vraagt tooling en computer in de organisatie van de abonnee. Staat de
organisatie computer niet toe, dan wordt het abonnement geweigerd met 422: geen sleutel daar zou
het script kunnen draaien.
- Gekoppeld. Zolang de kopie de publicatie volgt, verandert alleen de publicatie haar: een
nieuwe versie of het verwijderen van de kopie is
409, met de naam van de publicatie. Elke nieuwe publicatieversie die verandert wat het script draait, wordt een nieuwe versie van de kopie. - Losgemaakt.
POST .../members/{member}/forkmaakt de kopie los, als de voorwaarden dat toestaan. Vanaf dan is het een gewoon script van jou en volgt het geen nieuwe versies. - Verzegeld. Verbergt de uitgever de inhoud, dan kun je de kopie draaien maar niet lezen: de
leesroutes geven de naam, de beschrijving en de parameters, met
entrypointalsnullenfilesleeg, en de bestandsroute geeft404. Een verzegelde kopie kun je niet losmaken en niet opnieuw publiceren. In een beurt draait ze op een eigen computer, los van de computer die de shell-tools van het model gebruiken, zodat niets in de beurt haar bestanden kan lezen; die tweede computer kost sandboxtijd zoals de eerste.
Voor een organisatie onder je¶
Elke route hierboven bestaat ook onder /organisations/{id}/..., voor een organisatie die je met
management bereikt:
curl -s -X POST "$CORE_URL/organisations/ten_9Fb2.../subscriptions" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"publication_id": "pub_4Kd9..."}'
Dit is een beheershandeling over de bibliotheek van die organisatie — net als het aanmaken van een sleutel daar — en geen manier om haar prompts, skills of kennis rechtstreeks te lezen: dat blijft een sleutel die je in die organisatie registreert (Werken in een organisatie onder je).
De marktplaats¶
GET /marketplace toont wat Artific voor de hele installatie heeft goedgekeurd — het pad heet
anders dan de console's GET /catalogue, omdat elke route hier één padruimte deelt en dat pad al
bestaat. De recensiewachtrij zelf (?status=submitted in de console) is er niet: die is aan
Artific alleen.