Setting the file. One moment.
Initial Prompt · Foundry Iq · microsoft/azure-skills · Skills Docs
ContentsBack to the top of the page File Cu Canary
Bundled file
helpers/ _initial_prompt.py
Python · 181 lines · 13 KB
except
ImportError
:
11 import prompt_connect, _cleanup_dependencies as dependencies, _cleanup_receipts as receipts
12 from _common import HelperFailure, canonical_bytes, digest, reject_secrets, require_allowed_fields, sdk_error_status, sdk_error_metadata
13
14
15 def fail (code, message):
16 return HelperFailure(code, message, blocked_at = "initial-prompt-creation" )
17
18
19 def validate (plan):
20 reject_secrets(plan)
21 require_allowed_fields(plan, { "operation" , "sdk_major" , "project_resource_id" , "project_endpoint" ,
22 "agent" , "owner" , "cleanup_approved" , "inventory_limits" , "absence_inventory_digest" ,
23 "prerequisites" }, label = "Initial Prompt creation" )
24 prompt_connect._project_identity(plan)
25 if (plan.get( "operation" ) != "create-initial-prompt-agent" or plan.get( "sdk_major" ) != 2
26 or plan.get( "cleanup_approved" ) is not False or not isinstance (plan.get( "owner" ), str ) or not plan[ "owner" ].strip()):
27 raise fail( "input-schema-invalid" , "Initial Prompt creation needs separate approved creation intent and owner." )
28 agent = plan.get( "agent" )
29 if not isinstance (agent, dict ) or set (agent) != { "name" , "definition" }:
30 raise fail( "input-schema-invalid" , "Select one exact initial agent name and complete definition." )
31 if not isinstance (agent[ "name" ], str ) or not re.fullmatch( r " [ A-Za-z0-9 ](?:[ A-Za-z0-9- ] {0,61} [ A-Za-z0-9 ]) ? " , agent[ "name" ]):
32 raise fail( "input-schema-invalid" , "Select a v1 agent name, never a suffix or latest." )
33 definition = agent[ "definition" ]
34 if ( not isinstance (definition, dict ) or set (definition) != { "kind" , "model" , "instructions" , "tools" }
35 or definition[ "kind" ] != "prompt" or not isinstance (definition[ "model" ], str ) or not definition[ "model" ].strip()
36 or not isinstance (definition[ "instructions" ], str ) or definition[ "tools" ] != []):
37 raise fail( "input-schema-invalid" , "Initial creation permits only an explicit Prompt model/instructions with no tools." )
38 prerequisites = plan.get( "prerequisites" )
39 if ( not isinstance (prerequisites, dict ) or set (prerequisites) != { "project" , "model" , "identity" , "network" }
40 or any ( not isinstance (v, str ) or not v.strip() for v in prerequisites.values())):
41 raise fail( "initial-prerequisites-unverified" , "Retain the existing local-creation procedure's project/model/identity/network evidence." )
42 dependencies.limits(plan.get( "inventory_limits" ))
43 if not isinstance (plan.get( "absence_inventory_digest" ), str ) or not dependencies. SHA .fullmatch(plan[ "absence_inventory_digest" ]):
44 raise fail( "input-schema-invalid" , "The complete scoped absence inventory must be fingerprinted." )
45
46
47 def absence (plan, sdk_loader):
48 Client, _, _, _, extras = sdk_loader()
49 Credential, AzureError = extras
50 client = Client( endpoint = plan[ "project_endpoint" ], credential = Credential())
51 try :
52 names = []
53 for item in dependencies._paged(client.agents.list(), dependencies.limits(plan[ "inventory_limits" ])):
54 name = getattr (item, "name" , None )
55 if not isinstance (name, str ) or not name.strip() or name in names:
56 raise fail( "initial-inventory-incomplete" , "Agent absence needs a complete, unambiguous project inventory." )
57 names.append(name)
58 if plan[ "agent" ][ "name" ] in names:
59 raise fail( "initial-agent-exists" , "Retain the existing agent; return to Connect rather than creating a version." )
60 try :
61 client.agents.get( agent_name = plan[ "agent" ][ "name" ])
62 except AzureError as exc:
63 if sdk_error_status(exc) == 404 :
64 return digest( sorted (names))
65 raise
66 raise fail( "initial-agent-exists" , "Exact agent GET found an existing identity." )
67 except AzureError as exc:
68 raise HelperFailure( message = "Complete initial-agent absence discovery failed." , blocked_at = "initial-prompt-creation" ,
69 ** sdk_error_metadata(exc, "initial-inventory-failed" )) from exc
70 except ( AttributeError , TypeError , ValueError ) as exc:
71 raise fail( "initial-api-unavailable" , "SDK complete agent listing and exact agent GET are required." ) from exc
72 finally :
73 client.close()
74
75
76 def plan (request, sdk_loader):
77 if not isinstance (request, dict ):
78 raise fail( "input-schema-invalid" , "Initial creation request must be a closed object." )
79 require_allowed_fields(request, { "schema_version" , "project_resource_id" , "project_endpoint" , "agent" ,
80 "owner" , "inventory_limits" , "prerequisites" }, label = "Initial Prompt request" )
81 if request.get( "schema_version" ) != "1.0" :
82 raise fail( "input-schema-invalid" , "Initial request requires schema_version 1.0." )
83 proposed = {k: v for k, v in request.items() if k != "schema_version" }
84 proposed.update( operation = "create-initial-prompt-agent" , sdk_major = 2 , cleanup_approved = False ,
85 inventory_limits = dependencies.limits(request.get( "inventory_limits" )),
86 absence_inventory_digest = "sha256:" + "0" * 64 )
87 validate(proposed)
88 proposed[ "absence_inventory_digest" ] = absence(proposed, sdk_loader)
89 fingerprint = digest(proposed)
90 return { "status" : "planned" , "outcome" : "create-initial-prompt-agent" , "plan_fingerprint" : fingerprint,
91 "execution_required" : True , "mutation_approval_required" : True ,
92 "execution_input" : { "schema_version" : "1.0" , "plan" : proposed,
93 "approval" : { "confirmed" : False , "fingerprint" : fingerprint}},
94 "approval_summary" : { "create" : [proposed[ "agent" ][ "name" ]], "retain" : [ "existing agents" , "projects" , "models" , "grants" ],
95 "model_readiness" : "Provided prerequisite evidence must be independently verified before approval." ,
96 "invocation" : "not performed" , "cleanup" : "separate owned-version approval; container retained" }}
97
98
99 def verify_created (plan, target, birth, sdk_loader):
100 Client, _, _, _, extras = sdk_loader()
101 Credential, AzureError = extras
102 client = Client( endpoint = plan[ "project_endpoint" ], credential = Credential())
103 try :
104 agent = client.agents.get( agent_name = target[ "name" ])
105 if agent.name != target[ "name" ]:
106 raise fail( "initial-readback-invalid" , "Initial agent identity readback changed." )
107 versions = [
108 str (item.version) for item in dependencies._paged(
109 client.agents.list_versions( agent_name = target[ "name" ], include_drafts = True ),
110 dependencies.limits(plan[ "inventory_limits" ]))
111 ]
112 if versions != [target[ "version" ]]:
113 raise fail( "initial-version-inventory-changed" , "Initial creation must retain exactly its acknowledged version, with no duplicates or unexpected versions." )
114 current = client.agents.get_version( agent_name = target[ "name" ], agent_version = target[ "version" ])
115 if (current.name != target[ "name" ] or str (current.version) != target[ "version" ]
116 or current.definition.as_dict() != plan[ "agent" ][ "definition" ]
117 or receipts.version_identity(current) != birth):
118 raise fail( "definition-drift" , "Exact initial version differs from its native birth snapshot." )
119 except AzureError as exc:
120 raise HelperFailure( message = "Initial agent/version verification failed." , blocked_at = "initial-prompt-creation" ,
121 ** sdk_error_metadata(exc, "initial-readback-failed" )) from exc
122 except ( AttributeError , TypeError , ValueError ) as exc:
123 raise fail( "initial-api-unavailable" , "Complete draft-inclusive agent/version readback is required." ) from exc
124 finally :
125 client.close()
126
127
128 def execute (document, * , capture, token_provider, transport, sdk_loader):
129 plan = document[ "plan" ]
130 validate(plan)
131 if capture is None or capture.plan_digest != document[ "_computed_fingerprint" ] or capture.owner != plan[ "owner" ]:
132 raise fail( "cleanup-receipt-required" , "Initial creation requires its original approved input and protected receipt directory." )
133 if absence(plan, sdk_loader) != plan[ "absence_inventory_digest" ]:
134 raise fail( "initial-inventory-drift" , "Project inventory changed; replan rather than weakening absence protection." )
135 token = token_provider( "https://ai.azure.com/" )
136 url = plan[ "project_endpoint" ].rstrip( "/" ) + "/agents?api-version=v1"
137 target = receipts.project_target(plan, "prompt-agent-version" , name = plan[ "agent" ][ "name" ], version = "unverified" )
138 try :
139 result = transport( "POST" , url, token, body = canonical_bytes(plan[ "agent" ]), headers = { "Content-Type" : "application/json" })
140 except HelperFailure as failure:
141 if failure.http_status in ( None , 408 , 429 ) or (failure.http_status or 0 ) >= 500 :
142 failure.partial = True
143 failure.warnings.append( "Initial creation outcome unproven; no replay, ownership adoption or automatic cleanup." )
144 raise
145 write = { "action" : "created" , "type" : "prompt-agent-version" , "name" : plan[ "agent" ][ "name" ]}
146 if result.status != 200 :
147 raise HelperFailure( "initial-create-failed" , "Create-agent returned an unexpected status; no replay or ownership adoption." ,
148 blocked_at = "initial-prompt-creation" , status = result.status,
149 request_id = result.request_id, partial = ( 200 <= result.status < 300 or result.status in ( 408 , 429 ) or result.status >= 500 ))
150 try :
151 if not isinstance (result.body, dict ):
152 raise fail( "initial-create-response-invalid" , "Foundry v1 create-agent did not return the documented HTTP 200 AgentObject." )
153 versions = result.body.get( "versions" )
154 latest = versions.get( "latest" ) if isinstance (versions, dict ) else None
155 latest = latest if isinstance (latest, dict ) else {}
156 target[ "version" ] = latest.get( "version" , "unverified" )
157 capture.start(target, { "operation" : "agents.create" , "status" : result.status, "request_id" : result.request_id,
158 "definition_digest" : digest(latest.get( "definition" )), "version" : target[ "version" ],
159 "etag_evidence" : None , "generated" : None , "version_identity" : receipts.version_identity(latest)})
160 if (result.body.get( "name" ) != plan[ "agent" ][ "name" ] or latest.get( "name" ) != plan[ "agent" ][ "name" ]
161 or not isinstance (target[ "version" ], str ) or not re.fullmatch( r " [ 1-9 ][ 0-9 ] * " , target[ "version" ])
162 or latest.get( "definition" ) != plan[ "agent" ][ "definition" ] or receipts.version_identity(latest) is None ):
163 raise fail( "initial-create-response-invalid" , "Native created agent/version differs from approved initial intent." )
164 write[ "version" ] = target[ "version" ]
165 readback = transport( "GET" , plan[ "project_endpoint" ].rstrip( "/" ) + "/agents/" + quote(target[ "name" ], safe = "" )
166 + "/versions/" + quote(target[ "version" ], safe = "" ) + "?api-version=v1" , token)
167 if (readback.status != 200 or not isinstance (readback.body, dict )
168 or readback.body.get( "name" ) != target[ "name" ] or readback.body.get( "version" ) != target[ "version" ]
169 or readback.body.get( "definition" ) != latest[ "definition" ]):
170 raise fail( "definition-drift" , "Initial version readback differs from the original successful create-agent response." )
171 verify_created(plan, target, receipts.version_identity(latest), sdk_loader)
172 capture.finish(target, { "definition_digest" : digest(latest[ "definition" ]), "etag" : None , "generated" : [],
173 "version_identity" : receipts.version_identity(readback.body)})
174 except HelperFailure as failure:
175 failure.partial = True
176 failure.writes.insert( 0 , write)
177 raise
178 return { "status" : "completed" , "outcome" : "create-initial-prompt-agent" ,
179 "approved_plan" : document[ "approval" ], "resources" : { "created" : [target], "reused" : []},
180 "ownership" : { "owner" : plan[ "owner" ], "run_owned" : [target], "reused_not_owned" : []},
181 "agent_invocation" : "not-run" , "cleanup" : "separate version-only approval; never delete the container" }