Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Hyperlight is de momenteel gedocumenteerde back-end voor CodeAct in Agent Framework. Het maakt een execute_code hulpprogramma beschikbaar dat wordt ondersteund door een geïsoleerde sandbox-runtime en kan hosthulpprogramma's in eigendom van de provider aanroepen via call_tool(...).
Zie CodeAct voor het overzicht op patroonniveau.
Waarom Hyperlight CodeAct
Moderne agents worden vaak meer beperkt door overhead bij het oproepen van tools dan door het model zelf. Een taak die gegevens leest, lichte berekeningen uitvoert en een resultaat samenstelt, kan eenvoudig worden omgezet in een keten van model - tool ->> model -> interactie tussen hulpprogramma's, zelfs wanneer elke afzonderlijke stap eenvoudig is.
CodeAct met Hyperlight-ondersteuning vouwt de lus samen. Het model schrijft één kort Python-programma, de sandbox voert het eenmaal uit en hulpprogramma's die eigendom zijn van de provider worden bereikt vanuit de sandbox met call_tool(...). In representatieve werkbelastingen met veel tools kan die verschuiving de latentie ongeveer halveren en het tokengebruik met meer dan 60% verminderen, terwijl de uitvoering geïsoleerd en controleerbaar blijft.
Installeer het pakket
dotnet add package Microsoft.Agents.AI.Hyperlight --prerelease
Microsoft.Agents.AI.Hyperlight wordt los van de kernabstracties geleverd, dus u neemt alleen de sandbox-runtime op wanneer u deze nodig hebt.
Important
Het .NET-pakket is in de previewfase. Het is afhankelijk van het Hyperlight.HyperlightSandbox.Api NuGet-pakket van hyperlight-dev/hyperlight-sandbox; totdat die afhankelijkheid op nuget.org is gepubliceerd, kan het project niet worden hersteld. Houd de upstream-sandboxrepository bij om de beschikbaarheid te controleren.
Opmerking
Hyperlight vereist hardwarevirtualisatie op de host: KVM op Linux of het Windows Hypervisor Platform (WHP) op Windows. De back-end Wasm vereist bovendien een Hyperlight Python-gastmodule — stel HYPERLIGHT_PYTHON_GUEST_PATH vóór het uitvoeren in op het absolute pad ervan.
Gebruik HyperlightCodeActProvider
HyperlightCodeActProvider is het aanbevolen toegangspunt wanneer u CodeAct automatisch wilt toevoegen voor elke uitvoering. Het is een AIContextProvider dat tot een run beperkte CodeAct-instructies en de execute_code-tool injecteert, terwijl tools van de provider buiten de directe toolinterface van de agent worden gehouden. De provider past momentopname/herstel per uitvoering toe, zodat de gast begint met een bekende schone status bij elke aanroep.
Gebruik de HyperlightCodeActProviderOptions.CreateForWasm(modulePath) factory om de op Wasm gebaseerde Python-gastomgeving te gebruiken die in de voorbeelden wordt gebruikt; CreateForJavaScript() is ook beschikbaar voor de JavaScript-backend.
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Hyperlight;
using OpenAI.Chat;
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-5.4-mini";
var guestPath = Environment.GetEnvironmentVariable("HYPERLIGHT_PYTHON_GUEST_PATH")
?? throw new InvalidOperationException("HYPERLIGHT_PYTHON_GUEST_PATH is not set.");
using var codeAct = new HyperlightCodeActProvider(
HyperlightCodeActProviderOptions.CreateForWasm(guestPath));
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsAIAgent(new ChatClientAgentOptions()
{
ChatOptions = new()
{
Instructions = "You are a helpful assistant. When the user asks something quantitative, "
+ "write Python and call `execute_code` instead of guessing.",
},
AIContextProviders = [codeAct],
});
Console.WriteLine(await agent.RunAsync("What is the 20th Fibonacci number?"));
Opmerking
Er kan slechts één HyperlightCodeActProvider aan een specifieke agent worden gekoppeld. De provider gebruikt een vaste statussleutel, zodat ChatClientAgentde uniekheidsvalidatie van de statussleutel dubbele registraties weigert.
HyperlightCodeActProvider implementeert IDisposable; gebruik een using declaratie zodat de onderliggende sandbox wordt vrijgegeven wanneer de agent niet meer nodig is.
Hulpprogramma's, bestandskoppelingen en uitgaande vermeldingen op de allow-list kunnen vooraf worden opgegeven via HyperlightCodeActProviderOptions (Tools, FileMounts, AllowedDomains, HostInputDirectory) of tijdens runtime worden beheerd via de AddTools(...), RemoveTools(...), ClearTools(), AddFileMounts(...) en AddAllowedDomains(...) van de provider, en de overeenkomende Get*-accessors.
Hoe goedkeuringen en hosthulpprogramma's werken
Agent Framework-hulpprogramma's bevatten goedkeuringsmetagegevens die bepalen of ze automatisch kunnen worden aangeroepen of moeten worden onderbroken voor goedkeuring van de gebruiker. In .NET moet goedkeuring expliciet worden ingeschakeld door een AIFunction in een ApprovalRequiredAIFunction te plaatsen.
Het belangrijkste verschil tussen het registreren van een hulpprogramma HyperlightCodeActProvider en het rechtstreeks registreren op de agent is de manier waarop het hulpprogramma wordt aangeroepen, niet waar de functie uiteindelijk wordt uitgevoerd:
- Geregistreerde hulpprogramma's op
HyperlightCodeActProviderOptions.Toolszijn verborgen voor het model als directe tools. Het model bereikt ze door code te schrijven diecall_tool("name", ...)aanroept binnenexecute_code. - Hulpprogramma's die rechtstreeks op de agent zijn geregistreerd (bijvoorbeeld via
AsAIAgent(tools: [...])) worden weergegeven in het model als eersteklas hulpprogramma's en elke directe aanroep eert de eigen goedkeuringsmetagegevens van dat hulpprogramma.
call_tool(...) is een brug terug naar host-callbacks; het is geen in-sandbox herimplementatie van het hulpprogramma. Dit betekent dat hulpprogramma's die eigendom zijn van de provider nog steeds worden uitgevoerd in het hostproces, met elk bestandssysteem, netwerk en referenties waartoe het hostproces zelf toegang heeft.
De CodeActApprovalMode opsomming bepaalt hoe het execute_code hulpprogramma zelf wordt goedgekeurd:
-
CodeActApprovalMode.NeverRequire(standaard): goedkeuring wordt doorgegeven vanuit de geregistreerde hulpprogramma's. Als een hulpprogramma in het register is ingesloten inApprovalRequiredAIFunction, vereistexecute_codeook goedkeuring; anders niet. -
CodeActApprovalMode.AlwaysRequire:execute_codevereist altijd goedkeuring van de gebruiker voordat u aanroept.
Vuistregel:
- Plaats goedkope, deterministische, veilig te koppelen hulpprogramma's op de provider, zodat het model veel aanroepen binnen één
execute_codecyclus kan samenstellen. - Plaats bewerkingen met neveneffecten of gevoelige bewerkingen in
ApprovalRequiredAIFunction(en overweeg om ze in plaats daarvan direct als agenttools te houden), zodat elke aanroep afzonderlijk zichtbaar en goed te keuren blijft.
Het volgende voorbeeld registreert twee veilige hulpprogramma's (fetch_docs, query_data) plus een gevoelig send_email hulpmiddel dat is verpakt in ApprovalRequiredAIFunction. Omdat ten minste één geregistreerde tool goedkeuring vereist, zorgt de standaardmodus NeverRequire ervoor dat execute_code zelf goedkeuring vereist wanneer deze wordt aangeroepen.
AIFunction fetchDocs = AIFunctionFactory.Create(
(string topic) => $"Docs for {topic}: (...)",
name: "fetch_docs",
description: "Fetch documentation for a given topic.");
AIFunction queryData = AIFunctionFactory.Create(
(string query) => $"Rows for `{query}`: []",
name: "query_data",
description: "Run a read-only SQL-like query against the sample store.");
AIFunction sendEmail = new ApprovalRequiredAIFunction(
AIFunctionFactory.Create(
(string to, string subject) => $"Sent '{subject}' to {to}.",
name: "send_email",
description: "Send an email on behalf of the user."));
var options = HyperlightCodeActProviderOptions.CreateForWasm(guestPath);
options.Tools = [fetchDocs, queryData, sendEmail];
using var codeAct = new HyperlightCodeActProvider(options);
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsAIAgent(new ChatClientAgentOptions()
{
ChatOptions = new()
{
Instructions = "You are a helpful assistant. Prefer orchestrating your work in a single "
+ "`execute_code` block using `call_tool(...)` over issuing many direct tool calls.",
},
AIContextProviders = [codeAct],
});
Omdat hosthulpprogramma's buiten de sandbox worden uitgevoerd, beperken FileMounts en AllowedDomains de code in de sandbox zelf, niet de callback van de host achter call_tool(...). Wanneer u gecontroleerde toegang tot een gevoelige resource nodig hebt, geeft u de voorkeur aan een beperkte hosttool boven het verruimen van sandbox-machtigingen.
Gebruiken HyperlightExecuteCodeFunction voor directe bedrading
Wanneer u execute_code moet combineren met hulpprogramma's die alleen direct werken op dezelfde agent, of als de sandbox-configuratie vastligt gedurende de levensduur van de agent, gebruikt u HyperlightExecuteCodeFunction in plaats van de provider. Het is een zelfstandige versie AIFunction die één momentopname van de opgegeven opties tijdens de bouw vastlegt en opnieuw gebruikt voor elke aanroep.
Anders dan bij HyperlightCodeActProvider injecteert de losstaande functie niet automatisch promptinstructies, dus moet u zelf de uitvoer van BuildInstructions(...) aan de agentinstructies toevoegen. Geef door toolsVisibleToModel: false wanneer de geregistreerde hulpprogramma's alleen bereikbaar zijn via call_tool(...)en true wanneer dezelfde hulpprogramma's ook rechtstreeks aan het model worden blootgesteld.
AIFunction calculate = AIFunctionFactory.Create(
(double a, double b) => a * b,
name: "multiply",
description: "Multiply two numbers.");
var options = HyperlightCodeActProviderOptions.CreateForWasm(guestPath);
options.Tools = [calculate];
using var executeCode = new HyperlightExecuteCodeFunction(options);
var instructions =
"You are a helpful assistant. When math is involved, solve it by writing Python "
+ "and calling `execute_code` instead of computing values yourself.\n\n"
+ executeCode.BuildInstructions(toolsVisibleToModel: false);
AIAgent agent = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsAIAgent(instructions: instructions, tools: [executeCode]);
HyperlightExecuteCodeFunction implementeert ook IDisposable. Wanneer de configuratie goedkeuring vereist (volgens ApprovalMode of omdat een geconfigureerd hulpprogramma zelf in ApprovalRequiredAIFunction is verpakt), stelt het exemplaar via ApprovalRequiredAIFunction een AITool.GetService(...)-proxy beschikbaar; zo stelt de rest van het framework vast dat goedkeuring is vereist.
Configureer bestanden en uitgaande toegang
Hyperlight kan een structuur met het kenmerk Alleen-lezen /input weergeven plus een beschrijfbaar /output gebied voor gegenereerde artefacten.
- Gebruik
HostInputDirectoryom een map op de host beschikbaar te maken onder/input/. - Gebruik
FileMountsom specifieke hostpaden in de sandbox te koppelen vianew FileMount(hostPath, mountPath). - Gebruik
AllowedDomainsom uitgaande toegang alleen voor specifieke doelen of methoden vianew AllowedDomain(target, methods)in te schakelen.
var options = HyperlightCodeActProviderOptions.CreateForWasm(guestPath);
options.Tools = [compute];
options.FileMounts =
[
new FileMount("/host/data", "/input/data"),
new FileMount("/host/models", "/sandbox/models"),
];
options.AllowedDomains =
[
new AllowedDomain("https://api.github.com"),
new AllowedDomain("https://internal.api.example.com", ["GET"]),
];
using var codeAct = new HyperlightCodeActProvider(options);
Dezelfde FileMounts verzamelingen en AllowedDomains verzamelingen, plus hulpprogramma's, kunnen ook tijdens runtime worden gewijzigd via AddFileMounts(...), RemoveFileMounts(...), AddAllowedDomains(...)en RemoveAllowedDomains(...) aan HyperlightCodeActProvider.
Richtlijnen voor uitvoer
Als u tekst wilt weergeven van execute_code, beëindigt u de gastcode met print(...); Hyperlight retourneert niet automatisch de waarde van de laatste expressie.
Wanneer de toegang tot het bestandssysteem is ingeschakeld, sla dan grotere objecten op in /output/<filename>. Geretourneerde bestanden worden gekoppeld aan het resultaat van het hulpprogramma, terwijl bestanden onder /input beschikbaar zijn om te lezen in de sandbox.
Huidige beperkingen
Dit pakket is nog in preview en er zijn een paar beperkingen waar u bij de planning rekening mee moet houden:
- Het pakket is afhankelijk van
Hyperlight.HyperlightSandbox.Api, dat nog niet is gepubliceerd op nuget.org. Totdat dat gebeurt, mislukt het herstellen van het project. - Platformondersteuning volgt de gepubliceerde Hyperlight-back-endpakketten: ondersteunde Linux-omgevingen (KVM) en Windows (WHP). Niet-ondersteunde platforms of ontbrekende back-ends voor virtualisatie mislukken bij het maken van de sandbox.
- De huidige Wasm-back-end voert een Python gastmodule uit die is opgegeven door
HYPERLIGHT_PYTHON_GUEST_PATH. De JavaScript-back-end (CreateForJavaScript()) is beschikbaar voor gastcode in JavaScript. - De toestand van de in-memory interpreter blijft niet behouden bij aparte
execute_codeaanroepen. Gebruik gekoppelde bestanden en/outputartefacten wanneer gegevens moeten blijven bestaan tussen aanroepen. - Goedkeuring is van toepassing op de
execute_codeaanroep als geheel, niet op elke persooncall_tool(...)in hetzelfde codeblok. - Beschrijvingen van hulpprogramma's, parameteraantekeningen en de vorm van retourwaarden zijn hier belangrijker omdat het model code schrijft op basis van dat contract in plaats van voor geïsoleerde directe hulpprogramma-oproepen te kiezen.
- Er is nog geen .NET equivalent van het Python benchmark-voorbeeld. Zie het tabblad Python voor het gepubliceerde vergelijkingsharnas.
Installeer het pakket
pip install agent-framework-hyperlight --pre
agent-framework-hyperlight wordt afzonderlijk geleverd van agent-framework-core, zodat u alleen de sandbox-runtime opneemt wanneer u deze nodig hebt.
Opmerking
Het pakket is afhankelijk van onderdelen van de Hyperlight-sandbox. Als de back-end nog niet is gepubliceerd voor uw huidige platform, execute_code mislukt bij het maken van de sandbox.
Gebruik HyperlightCodeActProvider
HyperlightCodeActProvider is het aanbevolen toegangspunt wanneer u CodeAct automatisch wilt toevoegen voor elke uitvoering. Het injecteert run-scoped CodeAct-instructies plus execute_code tool, terwijl de provider-eigen tools buiten het directe bereik van de agent houden.
import os
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from agent_framework.hyperlight import HyperlightCodeActProvider
from azure.identity import AzureCliCredential
# 1. Create the Hyperlight-backed provider and register sandbox tools on it.
codeact = HyperlightCodeActProvider(
tools=[compute, fetch_data],
approval_mode="never_require",
)
# 2. Create the client and the agent.
agent = Agent(
client=FoundryChatClient(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
model=os.environ["FOUNDRY_MODEL"],
credential=AzureCliCredential(),
),
name="HyperlightCodeActProviderAgent",
instructions="You are a helpful assistant.",
context_providers=[codeact],
)
# 3. Run a request that should use execute_code plus provider-owned tools.
query = (
"Fetch all users, find admins, multiply 7*(3*2), and print the users, "
"admins, and multiplication result. Use execute_code and call_tool(...) "
"inside the sandbox."
)
result = await agent.run(query)
print(result.text)
Hulpprogramma's geregistreerd op de provider zijn beschikbaar in de sandbox via call_tool(...), maar worden niet weergegeven als direct beschikbare agenthulpprogramma's. De provider maakt ook CRUD-stijlbeheer beschikbaar voor tools, bestandkoppelingen en uitgaande allow-list-vermeldingen via methoden zoals add_tools(...), remove_tool(...), add_file_mounts(...) en add_allowed_domains(...).
Hoe goedkeuringen en hosthulpprogramma's werken
Agent Framework-hulpprogramma's bevatten een approval_mode die bepaalt of ze automatisch kunnen worden aangeroepen of moeten worden onderbroken voor goedkeuring van de gebruiker.
Het belangrijkste verschil tussen het registreren van een hulpprogramma HyperlightCodeActProvider en het rechtstreeks Agent(tools=...) registreren ervan is hoe het hulpprogramma wordt aangeroepen, niet waar de Python-functie uiteindelijk wordt uitgevoerd:
- Geregistreerde hulpprogramma's op
HyperlightCodeActProvider(tools=...)zijn verborgen voor het model als directe tools. Het model bereikt ze door code te schrijven diecall_tool("name", ...)aanroept binnenexecute_code. - Hulpprogramma's die zijn geregistreerd op
Agent(tools=...), worden als eersteklas hulpprogramma's weergegeven aan het model en bij elke directe aanroep wordt de eigenapproval_modegerespecteerd.
call_tool(...) is een brug terug naar host-callbacks; het is geen in-sandbox herimplementatie van het hulpprogramma. Dit betekent dat hulpprogramma's die eigendom zijn van de provider nog steeds worden uitgevoerd in het hostproces, met elk bestandssysteem, netwerk en referenties waartoe het hostproces zelf toegang heeft.
Vuistregel:
- Plaats goedkope, deterministische, veilig te koppelen hulpprogramma's op de provider, zodat het model veel aanroepen binnen één
execute_codecyclus kan samenstellen. - Houd side-effect-inducerende of goedkeuringsgebonden bewerkingen als directe agenttools en vaak met
approval_mode="always_require", zodat elke aanroep afzonderlijk zichtbaar en keurbaar blijft.
Omdat hosthulpprogramma's buiten de sandbox worden uitgevoerd, beperken file_mounts en allowed_domains de code in de sandbox zelf, niet de callback van de host achter call_tool(...). Wanneer u gecontroleerde toegang tot een gevoelige resource nodig hebt, geeft u de voorkeur aan een beperkte hosttool boven het verruimen van sandbox-machtigingen.
Opmerking
Hulpprogramma's die worden aangeroepen via call_tool(...) retourneren hun systeemeigen Python waarde (dict, list, primitief of aangepast object) rechtstreeks aan de gast. Elke result_parser configuratie op een FunctionTool is bedoeld voor LLM-gebruikers en wordt niet uitgevoerd op het sandboxpad. Pas opmaak toe in de functie zelf van het hulpprogramma als u deze nodig hebt voor in-sandbox-consumenten.
Gebruiken HyperlightExecuteCodeTool voor directe bedrading
Gebruik execute_code in plaats van de provider wanneer u HyperlightExecuteCodeTool moet combineren met hulpprogramma's voor direct-only op dezelfde agent. Voor vaste configuraties kunt u de CodeAct-instructies eenmaal compileren en het hulpprogramma rechtstreeks bedraden:
from agent_framework.hyperlight import HyperlightExecuteCodeTool
execute_code = HyperlightExecuteCodeTool(
tools=[compute],
approval_mode="never_require",
)
codeact_instructions = execute_code.build_instructions(tools_visible_to_model=False)
Dit patroon is handig wanneer het CodeAct-oppervlak gefixeerd is en de levenscyclus van de provider niet bij elke uitvoering nodig is. In tegenstelling tot HyperlightCodeActProvider injecteert het zelfstandige hulpprogramma promptrichtlijnen niet automatisch, dus u bent zelf verantwoordelijk voor het toevoegen van de build_instructions(...) uitvoer aan de agentinstructies.
Configureer bestanden en uitgaande toegang
Hyperlight kan een structuur met het kenmerk Alleen-lezen /input weergeven plus een beschrijfbaar /output gebied voor gegenereerde artefacten.
- Gebruik
workspace_rootdit om een werkruimte beschikbaar te maken onder/input/. - Gebruik
file_mountsom specifieke hostpaden naar de sandbox te mappen. - Gebruik
allowed_domainsdit om uitgaande toegang alleen in te schakelen voor specifieke doelen of methoden.
file_mounts accepteert een verkorte notatie, een expliciet (host_path, mount_path) paar of een FileMount genoemde tuple.
allowed_domains accepteert een doelstring, een expliciet (target, method-or-methods) paar of een AllowedDomain tuple met naam.
from agent_framework.hyperlight import HyperlightCodeActProvider
codeact = HyperlightCodeActProvider(
tools=[compute],
file_mounts=[
"/host/data",
("/host/models", "/sandbox/models"),
],
allowed_domains=[
"api.github.com",
("internal.api.example.com", "GET"),
],
)
Richtlijnen voor uitvoer
Om tekst uit execute_code weer te geven, beëindig de code met print(...); Hyperlight retourneert de waarde van de laatste expressie niet automatisch.
Wanneer de toegang tot het bestandssysteem is ingeschakeld, sla dan grotere objecten op in /output/<filename>. Geretourneerde bestanden worden gekoppeld aan het resultaat van het hulpprogramma, terwijl bestanden onder /input beschikbaar zijn om te lezen in de sandbox.
CodeAct en directe hulpprogramma-aanroepen vergelijken
De conceptuele vergelijking komt overeen met die voor elke CodeAct-backend: dezelfde client, hetzelfde model, tools, prompt en hetzelfde schema voor gestructureerde uitvoer kunnen worden gekoppeld via traditionele tool-calling of via door Hyperlight ondersteunde CodeAct. Het enige verschil is het gereedschapoppervlak : directe hulpmiddelen versus één execute_code gereedschap dat wordt ondersteund door HyperlightCodeActProvider:
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from agent_framework.hyperlight import HyperlightCodeActProvider
# Direct tool calling: the model picks one tool at a time per turn.
direct = Agent(
client=FoundryChatClient(...),
instructions="...",
tools=[fetch_data, compute],
)
# Hyperlight-backed CodeAct: the model writes one program per turn that
# orchestrates the same tools through call_tool(...).
codeact = Agent(
client=FoundryChatClient(...),
instructions="...",
context_providers=[
HyperlightCodeActProvider(
tools=[fetch_data, compute],
approval_mode="never_require",
),
],
)
Voor workloads die totalen over een dataset berekenen door herhaaldelijk gegevens op te zoeken en beperkte berekeningen uit te voeren — veel kleine, aaneenschakelbare stappen — kan CodeAct orkestratie-overhead wegnemen. Verpakt beide uitvoeringen met een stopwatch en inspecteer de geretourneerde ChatResponse.usage waarden om het verstreken tijd- en tokengebruik in uw eigen omgeving te vergelijken.
Huidige beperkingen
Dit pakket bevindt zich nog steeds in de alfafase en het is verstandig om met een paar beperkingen rekening te houden.
- Platformondersteuning volgt de gepubliceerde Hyperlight-back-endpakketten. Tegenwoordig betekent dit ondersteunde Linux- en Windows-omgevingen; niet-ondersteunde platforms mislukken bij het maken van de sandbox.
- De huidige integratie voert Python-gastcode uit.
- De toestand van de in-memory interpreter blijft niet behouden bij aparte
execute_codeaanroepen. Gebruik gekoppelde bestanden en/outputartefacten wanneer gegevens moeten blijven bestaan tussen aanroepen. - Goedkeuring is van toepassing op de
execute_codeaanroep als geheel, niet op elke persooncall_tool(...)in hetzelfde codeblok. - Beschrijvingen van hulpprogramma's, parameteraantekeningen en de vorm van retourwaarden zijn hier belangrijker omdat het model code schrijft op basis van dat contract in plaats van voor geïsoleerde directe hulpprogramma-oproepen te kiezen.