Verbeteringen via de API¶
Het concept achter verbeteranalyses staat in Inzicht.
Met de routes onder /improvements zet je verbeteranalyses aan, lees je de voorstellen die ze
schrijven, beslis je erover en pas je ze toe, vanuit je eigen backend. Een beheerder doet hetzelfde
in Verbeteringen in de console. De velden van elk verzoek en antwoord
staan in de API-referentie; deze pagina legt uit wat je ermee doet.
Wat je nodig hebt¶
- De installatie draait verbeteranalyses. Je operator zet ze aan voor de hele installatie
(
CORE_IMPROVEMENTS_ENABLED); standaard staan ze uit. Tot dan antwoordt elke route hier404. - De capability
improvementsin het plafond van je organisatie en op je sleutel (Capabilities). Met alleenimprovementslees je de instellingen en de analyses, beslis je over voorstellen en start je een analyse. - Ook
managementom de instellingen te wijzigen, omdat analyses aanzetten geld van de organisatie uitgeeft. Houdt de organisatie erboven het sleutelbeheer bij zich, dan krijgt die wijziging403(Voorbehouden sleutelbeheer). agents,promptsofskillsom een voorstel over een agent, prompt of skill toe te passen, zoals de routes van die agent, prompt of skill dat zelf ook vragen.
Een analyse is van de organisatie, niet van één persoon. Een
subjecttoken
krijgt geen toegang tot deze routes, en een verzoek met de header X-Core-Subject krijgt 403.
Elke route hier is ook een tool op het MCP-endpoint van je sleutel (Beheren via MCP).
Analyses aanzetten en instellen¶
GET /improvements/settings geeft de instellingen van je organisatie: of analyses aanstaan, de
klok, de periode, elke controle met haar drempels, de pseudonimisering, het maximum aan
modelaanroepen, wanneer de volgende analyse draait (next_run_at) en wat de analyses van vorige
maand deden (last_month).
Zet analyses aan met PATCH /improvements/settings. Je stuurt alleen wat verandert:
curl -s -X PATCH "$CORE_URL/improvements/settings" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"enabled": true, "cron": "0 3 * * 1-5", "timezone": "Europe/Amsterdam"}'
Aanzetten is de toestemming van je organisatie: vanaf dan leest het analysemodel haar gesprekken, gepseudonimiseerd, en kost elke analyse modelaanroepen die meetellen voor de maandlimiet.
| Veld | Standaard | Wat het zegt |
|---|---|---|
enabled |
false |
of analyses draaien |
cron, timezone |
0 3 * * *, de tijdzone van je organisatie |
wanneer een analyse draait: een cron-patroon van vijf velden in een IANA-tijdzone |
window_days |
7 |
hoeveel dagen een analyse terugleest, 1 tot 30; nooit verder dan je organisatie traces bewaart |
checks |
de zes oudere controles aan, de vijf van Skills, evaluaties en slankere agents uit | per controle enabled, threshold, min_turns, sample_size (hoogstens 50) en, voor een controle die mensen telt (episode_patterns, shared_procedure, evaluation_drafts), min_people; een controle die je niet noemt houdt wat ze heeft |
trial_key_id |
null |
de sleutel van je organisatie waarmee de uitvoeringen van een proef draaien, en wiens maandplafond het budget van de proeven is; null start geen proef (Proeven) |
pseudonymisation |
de standaard van de capability pseudonymisation |
language, entities en score_threshold: wat wordt vervangen. Of er wordt vervangen is geen keuze: altijd |
max_model_calls |
40 |
hoeveel modelaanroepen één analyse mag doen |
dismiss_quiet_days |
30 |
hoeveel dagen een genegeerd voorstel wegblijft, tenzij het probleem verdubbelt |
apply_level |
elke soort propose |
per soort, hoe ver een analyse de voorstellen zelf toepast, zonder dat iemand ze beoordeelt: propose, draft of publish; voor memory_shared_fact wint de eigen promotion.apply_without_review van een geheugenopslag als die on (publish) of off (propose) zegt (Toepassen zonder beoordeling) |
De controles in checks, met hun standaarddrempel:
| Controle | threshold |
|---|---|
repeated_first_call |
0.8: het aandeel beurten van een agentversie dat met dezelfde toolaanroep begint |
missing_tool |
0.2: het aandeel gelezen gesprekken waarin dezelfde ontbrekende tool terugkomt |
failing_skill |
1.5: hoeveel keer vaker beurten met de skill mislukken dan de beurten van dezelfde agent zonder |
off_purpose_agent |
0.25: het aandeel gelezen gesprekken over één onderwerp dat de instructies niet dekken |
shared_fact |
niet gebruikt: de controle stelt een feit uit het eigen geheugen van mensen voor als gedeeld geheugenrecord, in elke geheugenopslag waar promotion aanstaat; hoeveel mensen het moeten hebben, zegt promotion.min_people van de opslag (Een persoonlijk feit van de organisatie maken). Ze leest geheugen, geen traces, en draait dus ook met traces uit |
unused_skill |
niet gebruikt: min_turns (50) telt |
instruction_procedure |
4.0: vanaf hoeveel duizend tekens aan instructies de controle zoekt naar een werkwijze |
shared_procedure |
niet gebruikt: min_turns (15) beurten van minstens twee agents en min_people (2) mensen delen een reeks tools |
evaluation_drafts |
niet gebruikt: een agent heeft min_turns (30) beurten nodig, en sample_size (10) gesprekken worden tot scenario’s opgesteld |
leaner_agent |
2.0: vanaf hoeveel duizend tekens aan instructies een kortere versie wordt geprobeerd; min_turns is 100 |
episode_patterns |
0.8: hoe gelijk, als cosinusgelijkenis, sessies moeten zijn om als één patroon te tellen. De controle leest de episodes, de samenvattingen die geheugenextractie van elke afgeronde sessie schrijft, van sessies die duidelijk goed of duidelijk slecht gingen: minstens min_turns (3) gelijke sessies van minstens min_people (2, nooit minder) mensen vormen een les, geschreven als nieuwe skill of toegevoegd aan de skill die haar dekt (Een skill geleerd uit sessies). Ze leest geheugen, geen traces, en draait dus ook met traces uit |
curl -s -X PATCH "$CORE_URL/improvements/settings" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"checks": {"off_purpose_agent": {"enabled": false}, "missing_tool": {"threshold": 0.3}}}'
Gesprekken lezen kan alleen als traces aanstaan voor je organisatie (tracing_enabled,
Je eigen organisatie). Staan ze uit, dan berekenen
missing_tool, failing_skill en off_purpose_agent alleen de cijfers, en slaan
repeated_first_call, shared_procedure en evaluation_drafts zich helemaal over: die schrijven
dan niets (skipped_no_tracing). unused_skill, instruction_procedure en leaner_agent lezen
geen traces.
Het analysemodel¶
GET /improvements/model zegt welk model analyses nu gebruiken:
{"object": "improvement_model", "model": "claude-sonnet-5", "source": "deployment"}
source is organisation als je organisatie zelf een model koos, deployment als ze de standaard
van de installatie volgt, en null als er geen model is. Zonder model leveren
missing_tool, failing_skill en off_purpose_agent alleen cijfers, zonder uitleg en zonder
voorgestelde wijziging, en stellen shared_fact en episode_patterns niets voor;
repeated_first_call leest zonder model en stelt nog steeds een instructions_addition voor.
Core valt nooit terug op het hulpmodel (assist_model).
Kies een model met analysis_model op PATCH /organisation, met management en onder dezelfde
regels als assist_model: een chatmodel uit de catalogus van je organisatie, geen router. null
volgt weer de standaard van de installatie
(Je eigen organisatie).
Voorstellen lezen¶
curl -s "$CORE_URL/improvements/proposals?status=open&check=failing_skill" \
-H "Authorization: Bearer $CORE_KEY"
GET /improvements/proposals is een lijst met cursor,
te filteren op status, check, target_kind (agent, prompt, skill, evaluation of memory_store) en target_id.
GET /improvements/proposals/{id} geeft één voorstel met evidence: de beurten waar de bevinding
op rust, hoogstens twintig, de nieuwste eerst. Elk bewijsstuk is alleen ids (response_id,
thread_id, subject_id) en een tijdstip; met response_id lees je de
trace van die beurt, onder de gewone regels voor traces. Een voorstel van de
controle shared_fact of episode_patterns rust in plaats daarvan op geheugenrecords: daar is
memory_id gevuld en response_id leeg (null), en je leest het record met
GET /memory/{memory_id}.
{
"object": "improvement_proposal",
"id": "prop_01M4…",
"check": "repeated_first_call",
"kind": "agent_version",
"status": "open",
"target_kind": "agent",
"target_id": "agt_01M2…",
"target_name": "support-agent",
"target_version": 3,
"title": "support-agent begint bijna elk gesprek met get_opening_hours",
"summary": "…",
"rationale": "…",
"figures": {"tool": "get_opening_hours", "share": 0.86, "turns": 412,
"calls_saved_per_month": 1650, "tokens_saved_per_month": 2900000},
"change": {"instructions_addition": "…"},
"has_placeholders": false,
"evidence": [{"response_id": "resp_01M4…", "memory_id": null, "thread_id": null, "subject_id": "cust-118",
"observed_at": "2026-10-11T08:14:03Z"}]
}
Een sleutel ziet alleen voorstellen over wat hij zelf bereikt: noemen de regels van je sleutel
alleen bepaalde agents, prompts of skills (Sleutels, capabilities en policy),
dan ziet hij geen voorstel over een andere, en is zo'n voorstel 404.
Wat change bevat¶
kind zegt wat voor wijziging het voorstel draagt. change is null als het voorstel alleen
cijfers heeft, bijvoorbeeld omdat er geen analysemodel was.
kind |
change |
Toepassen maakt |
|---|---|---|
agent_version |
instructions_addition (tekst achter de instructies) of instructions_replacement (de hele nieuwe instructies, nooit allebei), add_tools (tools van je organisatie), add_skills en remove_skills (op id of naam) |
een nieuwe conceptversie van de agent |
prompt_version |
template_addition (tekst achter het sjabloon) |
een nieuwe conceptversie van de prompt |
agent_create |
name, description, instructions |
een nieuwe agent, zonder tools en skills, met een concept als eerste versie |
skill_rewrite |
skill_md: de herschreven SKILL.md |
een nieuwe conceptversie van de skill, met de bestanden, labels en metadata van de skill ongewijzigd; een agent die een versie vastzet, houdt die (Skills via de API) |
skill_create |
skill_md: de SKILL.md van een nieuwe skill |
een nieuwe skill met een concept als eerste versie; geen agent laadt hem tot hij gepubliceerd is en je het agent_version-voorstel ernaast toepast, en dat past een analyse nooit zelf toe tenzij jij de skill toepaste en publiceerde (Een skill geleerd uit sessies) |
skill_retire |
geen: het voorstel draagt alleen cijfers (turns, loads, days) |
niets; een skill verwijderen is aan jou, en een analyse past het nooit toe |
evaluation_create |
name, judge_model (null als er geen paste; de figures van het voorstel zeggen dan needs_judge) en scenarios, opgesteld uit gesprekken en herschreven met verzonnen details |
een nieuwe evaluatie voor de agent, eraan gekoppeld, met een concept als eerste versie; er wordt geen uitvoering in de wachtrij gezet en geen sleutel genoemd |
evaluation_scenarios |
scenarios, als hierboven |
de volgende versie van de evaluatie als concept, met haar gepubliceerde scenario’s en de opgestelde |
agent_trimmed |
model, remove_tools (namen van tool- en toolset-onderdelen) en instructions_replacement, wat de proef ook veranderde |
publiceert het concept dat de proef mat, als nieuwste versie van de agent (Proeven) |
connector_request |
name, description: wat de koppeling moet doen |
niets; iemand moet de koppeling bouwen |
memory_shared_fact |
type, text, metadata (om te beginnen de promotion.labels van de geheugenopslag) |
een gedeeld geheugenrecord in de opslag, van niemand in het bijzonder, of de bevestiging van het gedeelde record dat het al zegt |
Een opgesteld scenario is title, steps (elk een input-bericht met zijn checks) en
variables. Het noemt geen persoon, beurt of gesprek, dus een persoon wissen raakt het niet. Een
skill_create die shared_procedure schrijft komt met een agent_version voor elke agent in wiens
beurten de werkwijze te zien was (Een skill geleerd uit sessies werkt net zo).
Tekst die het model schreef, kan plaatshouders bevatten zoals <PERSON_1>, omdat het alleen
gepseudonimiseerde gesprekken las. has_placeholders is dan true. Core vult ze nooit in.
Over een voorstel beslissen¶
curl -s -X PATCH "$CORE_URL/improvements/proposals/prop_01M4…" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"status": "accepted", "note": "Pakken we volgende sprint op"}'
status is de nieuwe status, note een optionele toelichting van hoogstens 1.000 tekens. Het
antwoord is het voorstel met decided_by en decided_at. decided_by is het id van de sleutel
die besliste, of auto als een analyse het voorstel zelf toepaste.
| Van | Naar |
|---|---|
open |
accepted, dismissed, applied |
accepted |
applied, dismissed |
dismissed |
open |
applied, resolved |
niets meer |
resolved zet alleen een analyse: een latere analyse die het probleem niet meer vindt. Een
dismissed voorstel komt dismiss_quiet_days dagen niet terug, tenzij het aandeel erachter
verdubbelt. applied met PATCH is voor een wijziging die je zelf maakte, zoals een koppeling die
je bouwde; de route hieronder zet het zelf.
Core weigert met 409:
- A proposal cannot move from dismissed to applied. — de overgang staat niet in de tabel.
- A newer proposal of the same finding is open; act on that one. — je heropent een voorstel waarvan een latere analyse dezelfde bevinding al opnieuw voorstelde.
Een voorstel toepassen¶
curl -s -i -X POST "$CORE_URL/improvements/proposals/prop_01M4…/apply" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"change": {"instructions_addition": "Openingstijden: ma-vr 9:00-17:00."}}'
Toepassen schrijft de wijziging via de eigen route van de agent, prompt of skill, met jouw sleutel
en dus onder elke controle die die route doet. Er wordt niets overschreven: het maakt een nieuwe
versie of een nieuwe agent, en wie een vaste versie gebruikt houdt die. Een nieuwe agent-, prompt-
of skillversie is een concept, en dat is ook wat een voorstel evaluation_create of
evaluation_scenarios schrijft (een conceptversie van een evaluatie, die een beheerder in de console
publiceert; een sleutel leest haar niet). Een voorstel agent_trimmed is de uitzondering en
publiceert meteen (Proeven). Je sleutels blijven de gepubliceerde versie gebruiken tot een
beheerder het concept publiceert, en applied_ref zegt "draft": true. Een agentversie houdt de
skillversie die ze vastzette, dus een nieuwe skillversie verandert een agent pas als een nieuwe
agentversie haar vastzet. Een verzoek dat de skill zelf noemt zonder versie, in skills, gebruikt
de nieuwe skillversie zodra die gepubliceerd is. Verandert de herschreven SKILL.md de omschrijving,
dan kiest laden door zoeken de
gepubliceerde skill niet meer voor zo'n verzoek, tot er een versie via de eigen route van de skill
is geschreven.
De body is optioneel. Zonder change past Core de uitgewerkte wijziging toe. Met change stuur je
een wijziging van dezelfde soort, die in de plaats komt en op dezelfde manier wordt gecontroleerd;
zo vervang je een plaatshouder of herschrijf je een zin.
Het antwoord is 201 met het voorstel, nu applied, met applied_ref, en een Location-header
naar wat er is gemaakt (/api/v1/memory/{id}). Een nieuwe agent-, prompt- of skillversie, of een
nieuwe agent of skill, is een concept dat je sleutel niet kan lezen: dan is er geen Location, en
zegt applied_ref "draft": true zonder versienummer, of het id van een nieuwe agent of
skill. Twee keer tegelijk toepassen schrijft één keer;
de tweede krijgt 409.
Core weigert in deze volgorde en schrijft dan niets. Elke weigering is een
conflict of een andere soort, en de zin in detail zegt welke:
| Status | detail |
Wat je doet |
|---|---|---|
404 |
je sleutel bereikt het voorstel niet | |
409 |
A proposal cannot move from … to applied. | het voorstel is al toegepast, opgelost of genegeerd; heropen een genegeerd voorstel eerst |
409 |
Core does not apply this proposal: its kind has no change Core can make, or it carries none. Make the change by hand and mark the proposal applied. | een connector_request of een voorstel zonder change: maak de wijziging zelf en zet het voorstel met PATCH op applied |
422 |
het eerste veld van change dat niet klopt |
herstel dat veld |
409 |
The change still holds a placeholder such as <PERSON_1>. Send the change with each placeholder replaced. | stuur change met elke plaatshouder vervangen |
404 |
je sleutel mist agents, prompts of skills |
|
409 |
The target has a newer version than the one this proposal was made against, and applying it would drop what that version changed. The next analysis refreshes the proposal. | wacht op de volgende analyse, of maak de wijziging zelf op de nieuwe versie |
409 |
The version this proposal was made against was installed sealed, so a new version cannot be built on words this caller may not read. Write the new version by hand. | schrijf de nieuwe versie zelf |
Een wijziging die niets zou veranderen, zoals een tool die de agent al heeft of een skill die hij
niet laadt, is 422. Daarna beslist de route van de agent, prompt of skill zoals altijd: 403 voor
een naam die de regels van je sleutel niet noemen, 404 voor een doel dat weg is of buiten bereik,
409 voor een gekoppelde kopie, een naam die al bestaat of een SKILL.md met een andere naam dan de
skill, en 422 voor een definitie die ze weigert.
Toepassen zonder beoordeling¶
Een analyse kan voorstellen zelf toepassen, zonder dat iemand ze leest, voor de soorten die je
organisatie kiest. Wat dat per soort betekent staat in
Inzicht. De keuze is apply_level in de
instellingen: per kind propose (de standaard), draft (de analyse schrijft een concept dat een
beheerder publiceert) of publish (ze schrijft het concept en publiceert het). GET
/improvements/settings noemt elke soort en haar niveau. agent_version, prompt_version,
agent_create, skill_rewrite en skill_create kennen alle drie; memory_shared_fact kent
propose of publish; connector_request, skill_retire, evaluation_create,
evaluation_scenarios en agent_trimmed alleen propose.
curl -s -X PATCH "$CORE_URL/improvements/settings" \
-H "Authorization: Bearer $CORE_KEY" -H "Content-Type: application/json" \
-d '{"apply_level": {"agent_create": "draft", "skill_rewrite": "publish"}}'
Een soort die je niet noemt, houdt wat ze heeft. Een niveau dat een soort niet kent, of een naam die
Core niet kent, is 422 op apply_level.<soort> en er verandert niets. Een agentversie die de hele
instructies vervangt, publiceert een analyse nooit: bij publish wacht ze op jou, bij draft
wordt ze als concept geschreven. Net als de rest van de instellingen vraagt dit
management.
Wat een analyse doet. Na elke controle past ze elk open voorstel van een gekozen soort toe dat
ze in die analyse schreef of ververste. Ze doet dat als de organisatie, zonder sleutel: met de
capabilities van de organisatie en onder de hele policy van de
organisatie en de organisaties erboven. Het is dezelfde toepassing als die van de route hierboven,
met dezelfde weigeringen. Een voorstel dat accepted of dismissed is, past ze nooit toe.
Toegepast. Het voorstel is applied, met decided_by "auto" en in applied_ref wat er is
gemaakt. Het auditspoor heeft een gebeurtenis improvements.proposal.applied met auto: true.
Geweigerd. Er is niets geschreven en het voorstel blijft open, met in auto_apply_refused
waarom. Daarna beslist een persoon of een sleutel erover zoals over elk open voorstel; een
volgende analyse die dezelfde bevinding vindt, probeert het opnieuw.
auto_apply_refused |
Wat je doet |
|---|---|
has_placeholders |
pas het voorstel zelf toe met een change zonder plaatshouders |
target_changed |
wacht op de volgende analyse, die het voorstel ververst |
policy_denied |
een regel in de policy van je organisatie weigert de wijziging; pas de regel aan of beslis zelf |
capability_off |
het plafond van je organisatie mist agents, prompts of skills |
usage_cap_reached |
de maandlimiet is bereikt |
conflict |
er bestaat al iets met die naam, het doel is een gekoppelde kopie, of de SKILL.md noemt een andere skill |
not_found |
het doel bestaat niet meer |
sealed |
de versie waar het voorstel over gaat is verzegeld; schrijf de nieuwe versie zelf |
not_applicable |
het voorstel heeft geen uitgewerkte wijziging (change is null), bijvoorbeeld omdat er geen analysemodel was; stel een analysemodel in, of maak de wijziging zelf en zet het voorstel met PATCH op applied |
Een andere waarde is de soort weigering die de route van het doel gaf, zoals
unprocessable_content, of refused als die route geen soort noemde. auto_apply_refused is null als geen analyse het voorstel probeerde, of
zodra het is toegepast.
Tellen. Een analyse noemt per controle in checks ook auto_applied en auto_apply_refused:
hoeveel voorstellen ze zelf toepaste en hoeveel ze open liet. Elke controle die draaide heeft ze,
met 0 als geen soort gekozen is; bij failed, interrupted en skipped_no_tracing en bij
analyses van voor deze functie ontbreken ze.
Terugdraaien. Toepassen overschrijft niets. Een nieuwe agentversie of promptversie draai je
terug door de vorige versie vast te zetten waar die wordt gebruikt
(Agents via de API,
Prompts via de API); een nieuwe agent verwijder je. Een nieuwe
skillversie is een concept, dat een beheerder weggooit; eenmaal gepubliceerd verandert ze geen agent
zolang geen agentversie haar vastzet, en een verzoek dat de skill zelf noemt, zet je terug door de
vorige versie te noemen, als naam@N.
Een skill geleerd uit sessies¶
Vindt episode_patterns een nieuwe les, dan schrijft de controle twee soorten voorstellen: een
skill_create met de nieuwe skill, en een agent_version voor elke agent in wiens sessies de les
naar voren kwam, met de nieuwe skill in add_skills. De agentversie heeft de skill nodig, dus pas
eerst de skill_create toe; daarvoor antwoordt het toepassen van de agentversie 409
(not_applicable). Een geleerde skill komt uit wat mensen in hun sessies zeiden en wordt een
instructie op de agents van hun collega's, en de controles van Core vangen namen,
contactgegevens en ids, geen instructies. Dus ook als je beide soorten op publish
zet in apply_level, past een analyse de nieuwe skill toe maar laat ze de agentversie voor jou
open, tenzij je de skill zelf toepaste en hij gepubliceerd is. Ook bij draft wacht de
agentversie op jou. Dekt een bestaande skill de les al, dan krijg je in plaats daarvan een skill_rewrite
van die skill. Een geleerde skill gaat over het werk van je organisatie: een concept dat een
persoon noemt, of een e-mailadres, telefoonnummer of link bevat, wordt nooit voorgesteld.
Analyses¶
De klok in de instellingen start analyses vanzelf. Start er een meteen met:
curl -s -X POST "$CORE_URL/improvements/analyses" -H "Authorization: Bearer $CORE_KEY"
Het antwoord is 202 met de analyse: status queued, trigger manual. Core weigert met 409:
- Improvement analyses are off for this organisation; turn them on in its settings.
- An analysis of this organisation is already queued or running.
GET /improvements/analyses geeft de analyses, de nieuwste eerst, met cursor gepagineerd.
GET /improvements/analyses/{id} geeft er één, met de periode die ze werkelijk las en per
controle in checks een outcome met de aantallen, waaronder auto_applied en
auto_apply_refused (Toepassen zonder beoordeling). Een analyse is partial als minstens één
controle niet alles kon lezen, en een cancelled analyse zegt in reason waarom ze niet draaide.
outcome |
Betekenis |
|---|---|
ok |
de controle is gedraaid |
skipped_no_tracing |
traces staan uit; alleen de cijfers, en van repeated_first_call niets |
no_model |
geen analysemodel; alleen de cijfers |
pseudonymisation_unavailable |
de dienst die gegevens vervangt was niet bereikbaar; Core las geen gesprekken |
cap_exceeded |
de maandlimiet is bereikt; de rest van de analyse is overgeslagen |
budget_exhausted |
max_model_calls is bereikt; wat overbleef komt bij de volgende analyse eerst |
window_too_short |
unused_skill heeft een periode van minstens 14 dagen nodig |
failed, interrupted |
de volgende analyse probeert het opnieuw |
Naast outcome noemt een controle aantallen van wat ze deed en wat ze wegliet, elk een getal en
afwezig als er geen is: bij leaner_agent queued, no_judge, no_cost_history, no_trial_key,
trial_key_gone, trial_key_uncapped, budget_exhausted, trial_not_permitted, trial_limit, window_too_short,
too_few_turns, all_tools_used, no_model_named, names_a_router, no_token_history,
current_unpriced, no_cheaper_model, not_shorter, markers_lost, en per proef proposed,
not_better, running, target_changed, run_failed en agent_deleted; bij de controles die
tekst opstellen about_a_person, too_close_to_source, not_a_scenario, too_few_kept,
too_few_read, too_few_agents, no_answer, no_draft, no_procedure, no_lesson en
not_rewritable. Lees ze als namen, niet als een fout.
Een analyse schrijft alleen een voorstel dat je organisatie op dat moment zou kunnen toepassen:
voordat ze er een schrijft, stelt Core dezelfde vragen als bij het toepassen, bijvoorbeeld of het
beleid van je organisatie de naam van de agent toestaat en of de capability aanstaat, zonder iets
te veranderen. Wat ze weglaat, telt ze per controle in not_permitted, per reden, bijvoorbeeld
{"policy_denied": 2}. Bij het toepassen vraagt Core het opnieuw, dus een voorstel dat je beleid
inmiddels niet meer toestaat, wordt dan alsnog geweigerd. Verandert je beleid terug, dan stelt de
volgende analyse het opnieuw voor.
Skills, evaluaties en slankere agents¶
Vijf controles meer, alle uit tot je ze aanzet in checks:
| Controle | Zoekt naar | Stelt voor (kind) |
|---|---|---|
unused_skill |
een skill die een agent aanbiedt en die in geen van zijn beurten werd geladen, over minstens 14 dagen | agent_version die de skill weghaalt; skill_retire voor een skill die niets laadt |
instruction_procedure |
een werkwijze in lange instructies die een minderheid van de gesprekken nodig heeft | skill_create en een agent_version met instructions_replacement |
shared_procedure |
een reeks van minstens drie tools, herhaald bij minstens twee agents en min_people mensen |
skill_rewrite, of skill_create en een agent_version per agent |
evaluation_drafts |
een agent zonder evaluatie, of met een evaluatie van minder dan 32 scenario’s, en gesprekken ermee die goed gingen | evaluation_create of evaluation_scenarios |
leaner_agent |
een agent met een evaluatie van minstens vijf scenario’s en een beoordelingsmodel | agent_trimmed, zodra een proef slaagde |
Een scenario van evaluation_drafts valt af als het een plaatshouder, een contactgegeven of een id
bevat, of als een stap te dicht bij het bericht zit waar hij vandaan komt; dat wordt geteld en nooit
aan jou overgelaten om op te ruimen.
Proeven¶
leaner_agent probeert één wijziging van een agent, eerst minder tools, dan een goedkoper model,
dan kortere instructies, als twee uitvoeringen van de eigen evaluatie van de agent: de gepubliceerde
versie van de agent en een concept met de wijziging, over dezelfde scenario’s met hetzelfde
beoordelingsmodel. De volgende analyse vergelijkt ze. Ze schrijft alleen een voorstel agent_trimmed
als de score van de kandidaat minstens die van de basis is, geen stap die de basis haalde mislukte,
en de kosten of de latentie minstens 10% lager zijn. Tot dan staat de proef open; per analyse starten
hoogstens drie, per agent een tegelijk, en een agent wordt eenmaal per gepubliceerde versie
geprobeerd. Er is geen route om een proef te lezen: je leest zijn uitkomst via het voorstel en zijn
aantal in de analyse.
De proefsleutel. Proeven draaien als de sleutel die je noemt in trial_key_id, nooit als de
eigen sleutel van de evaluatie. PATCH /improvements/settings neemt elke sleutel van je organisatie
(422 op trial_key_id voor een andere) en null om er geen te noemen; het vraagt management
naast improvements, omdat het bepaalt wiens geld proeven uitgeven. Zonder proefsleutel start er
geen proef (no_trial_key), en een sleutel die inmiddels is verwijderd, uitgezet of verlopen start er
ook geen (trial_key_gone).
Zijn maandplafond is het budget. Elke beurt van beide uitvoeringen en elke aanroep van het
beoordelingsmodel wordt op de proefsleutel geboekt, dus monthly_cost_cap_eur van de sleutel
begrenst de proeven, binnen het plafond van je organisatie zelf. Een sleutel zonder plafond start
geen proef (trial_key_uncapped). Voordat een proef in de wachtrij komt schat Core twee keer wat de
laatst afgeronde uitvoering van die evaluatie door die agent kostte, beoordeling inbegrepen; is dat
meer dan de maand nog heeft, dan komt er niets in de wachtrij (budget_exhausted). Het beleid van de
sleutel moet de agent en het kandidaatmodel bereiken; doet het dat niet, dan komt de proef niet in
de wachtrij (trial_not_permitted).
Een proef gebruikt de echte tools van de agent. Een proefuitvoering roept dezelfde tools aan als
een echt gesprek, dus een tool die verstuurt, schrijft of boekt, doet dat tijdens de proef echt, in
beide uitvoeringen. Zet leaner_agent alleen aan voor agents van wie je het goed vindt dat hun tools
worden aangeroepen.
Het voorstel. Een voorstel agent_trimmed noemt de wijziging en draagt in figures beide
uitvoeringen (candidate en baseline, elk met run_id, score, mean_score, cost_eur en
mean_latency_ms), monthly_saving_eur (null als het niet te schatten is), turns_per_month,
scenarios, trial_id, draft_version en cannot_show: A trial shows one thing: on these …
scenarios, graded by this judge, the leaner agent did not do worse. It cannot show how the agent
behaves on topics the evaluation lacks, whether a tool needed once a quarter is still needed,
whether the tone drifted in a way the judge does not check, or that the result would repeat: each
side is one run. De console toont die zin in het Nederlands: Een proef laat één ding zien: op deze
… scenario’s, beoordeeld door dit beoordelingsmodel, deed de slankere agent het niet slechter. Een
proef laat niet zien hoe de agent zich gedraagt bij onderwerpen die de evaluatie mist, of een tool
die één keer per kwartaal nodig is nog nodig is, of de toon is verschoven op een manier die het
beoordelingsmodel niet controleert, of dat de uitkomst zich herhaalt: elke kant is één
uitvoering. POST .../apply publiceert het concept dat is gemeten
als nieuwste versie van de agent, dus elke aanroep zonder vastgezette versie draait het meteen; een
concept dat iemand weggooide wordt opnieuw geschreven en gepubliceerd. Een analyse stelt het alleen
voor: zijn apply_level is propose. De evidence van het voorstel is leeg, want het rust op
uitvoeringen.
Een agent zonder evaluatie van minstens vijf scenario’s wordt niet geprobeerd, en geen aantal noemt hem; de
voorstellen van evaluation_drafts stellen er een op.
Kosten en sporen¶
Elke modelaanroep van een analyse is een regel model_tokens in je verbruik,
zonder sleutel, en elke analyse die begint één regel improvement_analysis. De uitvoeringen van een
proef worden op de proefsleutel geboekt, zoals elke uitvoering van die sleutel. Wat Core naar het model
stuurde staat als trace bij je organisatie, leesbaar met je sleutel of in de console. Het
auditspoor houdt bij wie wat deed, met gebeurtenissen als improvements.settings.updated,
improvements.proposal.updated en improvements.proposal.applied, zonder tekst.
Wil je niet steeds de lijst lezen, volg dan de events improvements.proposal.created en
improvements.analysis.finished (Events volgen).
Beheerroutes¶
Elke route hier heeft een tweeling onder /tenants/{tenant_id}/improvements/... voor een beheerder
die met de console is ingelogd, met dezelfde verzoeken en antwoorden. Een tweeling ziet elk voorstel
van die organisatie, en de Location van een toepassing staat dan onder /tenants/{tenant_id}.
Het analysemodel zet een beheerder met analysis_model op PATCH /tenants/{id}.