Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Způsob, jakým model Foundry agenta zpracovává požadavky za běhu, můžete přizpůsobit pomocí strukturovaných vstupů. Strukturované vstupy jsou zástupné symboly definované v agentu podle syntaxe šablony handlebars ({{variableName}}). Za běhu zadáte skutečné hodnoty, které dynamicky přizpůsobí pokyny agenta, konfigurace prostředků nástrojů a parametry odpovědi – bez nutnosti vytvářet samostatné verze agenta pro každou konfiguraci.
V tomto článku se naučíte:
- Definování strukturovaných vstupů v definici agenta
- Použití šablon úchytů v pokynech agenta
- Dynamické konfigurace prostředků nástrojů, jako je interpret kódu a vyhledávání souborů
- Předávání strukturovaných vstupních hodnot za běhu prostřednictvím rozhraní API pro odpovědi
Požadavky
- Základní nebo standardní prostředí agenta.
- Nejnovější balíček sady SDK pro váš jazyk. Postup instalace najdete v rychlém startu .
- Azure přihlašovací údaje nakonfigurované pro ověřování (například
DefaultAzureCredential). - Adresa URL koncového bodu vašeho projektu Foundry a název nasazení modelu
Co jsou strukturované vstupy?
Strukturované vstupy používají syntaxi šablony úchytů ({{variableName}}) k vytvoření parametrizovaných definic agentů. V definici agenta definujete vstupní schémata, structured_inputskde každý vstup má název, popis, typ a volitelnou výchozí hodnotu. Za běhu zadejte skutečné hodnoty, které nahrazují zástupné symboly šablony před tím, než agent zpracuje požadavek.
Strukturované vstupy podporují dvě kategorie přetížení:
- Přepsání instrukcí: Parametrické řízení instrukcí agenta, instrukcí na úrovni odpovědí a systémových nebo vývojářských zpráv.
-
Přepisování prostředků nástroje: Dynamická konfigurace vlastností nástroje za běhu, včetně:
- ID úložiště vektorů pro vyhledávání souborů
- ID souborů a kontejnery interpretu kódu
- Adresy URL a hlavičky serveru PROTOKOLU MCP (Model Context Protocol)
Pro pole jako file_ids a vector_store_idssystém automaticky odebere prázdné řetězcové hodnoty za běhu. Tato funkce umožňuje flexibilní počty vstupů – definujte více slotů šablon, než je potřeba, a nechte nepoužívané sloty prázdné.
Podporované vlastnosti strukturovaného vstupu
Následující tabulka uvádí vlastnosti definice agenta, které podporují šablony úchytů:
| Kategorie | Vlastnost | Popis |
|---|---|---|
| Pokyny | Agent instructions |
Text instrukce na úrovni agenta |
| Pokyny | Reakce instructions |
Pokyny předané v požadavku rozhraní API pro odpovědi |
| Pokyny | Zpráva o systému nebo vývojáři content |
Obsah zprávy ve vstupním poli |
| Hledání souborů | vector_store_ids |
Pole ID vektorových úložišť (prázdné hodnoty odstraněny) |
| Interpretér kódu |
container (řetězec) |
ID kontejneru pro předkonfigurovaný kontejner |
| Interpretér kódu |
container.file_ids (matice) |
ID souborů v automatickém kontejneru (prázdné hodnoty se odstraňují) |
| MCP | server_label |
Popisek pro server MCP |
| MCP | server_url |
Adresa URL koncového bodu serveru MCP |
| MCP |
headers (hodnoty) |
Hodnoty hlaviček HTTP jako páry klíč-hodnota |
| Azure AI Vyhledávač | filter |
Výraz filtru OData použitý u indexu vyhledávání |
Používejte strukturované vstupy s instrukcemi agenta
Nejjednodušším použitím strukturovaných vstupů je parametrizovat instrukce agenta. Definujte šablony úchytů instructions v poli a zadejte hodnoty za běhu. Tento přístup umožňuje přizpůsobit chování agenta pro různé uživatele nebo kontexty bez vytváření více verzí agentů.
Následující příklady vytvoří agenta, jehož pokyny obsahují podrobnosti specifické pro uživatele, a pak tyto hodnoty při vytváření odpovědi zadejte.
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, StructuredInputDefinition
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Create agent with handlebar templates in instructions
agent = project.agents.create_version(
agent_name="structured-input-agent",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions=(
"You are a helpful assistant. "
"The user's name is {{userName}} and their role is {{userRole}}. "
"Greet them and confirm their details."
),
structured_inputs={
"userName": StructuredInputDefinition(
description="The user's name", required=True, schema={"type": "string"},
),
"userRole": StructuredInputDefinition(
description="The user's role", required=True, schema={"type": "string"},
),
},
),
)
print(f"Agent created: {agent.name}, version: {agent.version}")
# Create conversation and send request with runtime values
conversation = openai.conversations.create()
response = openai.responses.create(
conversation=conversation.id,
input="Hello! Can you confirm my details?",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {"userName": "Alice Smith", "userRole": "Senior Developer"},
},
)
print(response.output_text)
Očekávaný výstup
Agent created: structured-input-agent, version: 1
Hello Alice Smith! I can confirm your details: your name is Alice Smith and your role is Senior Developer. How can I help you today?
Agent před zpracováním žádosti v pokynech nahradí zástupné symboly {{userName}} a {{userRole}} s "Alice Smith" a "Senior Developer".
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using OpenAI.Responses;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
// Create project client to call Foundry API
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Create agent with handlebar templates in instructions
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful assistant. "
+ "The user's name is {{userName}} and their role is {{userRole}}. "
+ "Greet them and confirm their details.",
StructuredInputs =
{
["userName"] = new StructuredInputDefinition
{ Description = "The user's name", IsRequired = true },
["userRole"] = new StructuredInputDefinition
{ Description = "The user's role", IsRequired = true }
}
};
AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "structured-input-agent", options: new(agentDefinition));
// Send response with runtime structured input values
AgentReference agentRef = new(name: agent.Name, version: agent.Version);
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentRef);
CreateResponseOptions responseOptions = new()
{
Input = [ResponseItem.CreateUserMessageItem("Hello! Can you confirm my details?")]
};
responseOptions.Patch.Set(
"$.structured_inputs[\"userName\"]"u8,
BinaryData.FromObjectAsJson("Alice Smith"));
responseOptions.Patch.Set(
"$.structured_inputs[\"userRole\"]"u8,
BinaryData.FromObjectAsJson("Senior Developer"));
ResponseResult response = responseClient.CreateResponse(responseOptions);
Console.WriteLine(response.GetOutputText());
// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
agentName: agent.Name, agentVersion: agent.Version);
Očekávaný výstup
Hello Alice Smith! I can confirm your details: your name is Alice Smith and your role is Senior Developer. How can I help you today?
Slovník StructuredInputs v definici agenta mapuje názvy šablon na jejich schémata. Za běhu použijte metodu Patch.SetCreateResponseOptions k zadání skutečných hodnot prostřednictvím $.structured_inputs cesty JSON.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
export async function main(): Promise<void> {
// Create clients to call Foundry API
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Create agent with handlebar templates in instructions
const agent = await project.agents.createVersion("structured-input-agent", {
kind: "prompt",
model: "gpt-5-mini",
instructions:
"You are a helpful assistant. " +
"The user's name is {{userName}} and their role is {{userRole}}. " +
"Greet them and confirm their details.",
structured_inputs: {
userName: { description: "The user's name", required: true },
userRole: { description: "The user's role", required: true },
},
});
console.log(`Agent created: ${agent.name}, version: ${agent.version}`);
// Create conversation and send request with runtime values
const conversation = await openai.conversations.create();
const response = await openai.responses.create(
{
conversation: conversation.id,
input: "Hello! Can you confirm my details?",
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
structured_inputs: { userName: "Alice Smith", userRole: "Senior Developer" },
},
},
);
console.log(response.output_text);
// Clean up
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch(console.error);
Očekávaný výstup
Agent created: structured-input-agent, version: 1
Hello Alice Smith! I can confirm your details: your name is Alice Smith and your role is Senior Developer. How can I help you today?
Definice agenta používá structured_inputs k deklaraci schémat šablony. Za běhu předejte skutečné hodnoty v parametru body spolu s parametrem agent_reference.
Přidejte závislost do svého pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.0.0</version>
</dependency>
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.AgentsServiceVersion;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.ai.agents.models.StructuredInputDefinition;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.LinkedHashMap;
import java.util.Map;
public class StructuredInputInstructionsExample {
public static void main(String[] args) {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.serviceVersion(AgentsServiceVersion.getLatest());
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Define structured input schemas
Map<String, StructuredInputDefinition> inputDefs = new LinkedHashMap<>();
inputDefs.put("userName",
new StructuredInputDefinition().setDescription("The user's name").setRequired(true));
inputDefs.put("userRole",
new StructuredInputDefinition().setDescription("The user's role").setRequired(true));
// Create agent with handlebar templates in instructions
AgentVersionDetails agent = agentsClient.createAgentVersion(
"structured-input-agent",
new PromptAgentDefinition("gpt-5-mini")
.setInstructions("You are a helpful assistant. "
+ "The user's name is {{userName}} and their role is {{userRole}}. "
+ "Greet them and confirm their details.")
.setStructuredInputs(inputDefs));
// Supply structured input values at runtime
Map<String, BinaryData> inputValues = new LinkedHashMap<>();
inputValues.put("userName", BinaryData.fromObject("Alice Smith"));
inputValues.put("userRole", BinaryData.fromObject("Senior Developer"));
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions()
.setAgentReference(
new AgentReference(agent.getName()).setVersion(agent.getVersion()))
.setStructuredInputs(inputValues),
ResponseCreateParams.builder()
.input("Hello! Can you confirm my details?"));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Očekávaný výstup
Response: Hello Alice Smith! I can confirm your details: your name is Alice Smith and your role is Senior Developer. How can I help you today?
Sada JAVA SDK používá StructuredInputDefinition pro schéma agenta a Map<String, BinaryData> pro hodnoty modulu runtime předávané prostřednictvím AzureCreateResponseOptions.
Vytvoření agenta se strukturovanými vstupy
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "structured-input-agent",
"definition": {
"kind": "prompt",
"model": "<MODEL_DEPLOYMENT>",
"instructions": "You are a helpful assistant. The user'\''s name is {{userName}} and their role is {{userRole}}. Greet them and confirm their details.",
"structured_inputs": {
"userName": {
"type": "string",
"description": "The user'\''s name",
"default_value": "Unknown"
},
"userRole": {
"type": "string",
"description": "The user'\''s role",
"default_value": "User"
}
}
}
}'
Vytvoření odpovědi se strukturovanými vstupními hodnotami
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {
"type": "agent_reference",
"name": "structured-input-agent"
},
"input": [
{
"type": "message",
"role": "user",
"content": "Hello! Can you confirm my details?"
}
],
"structured_inputs": {
"userName": "Alice Smith",
"userRole": "Senior Developer"
}
}'
Objekt definice structured_inputs agenta deklaruje schémata s popisy a výchozími hodnotami. Žádost structured_inputs odpovědi poskytuje skutečné hodnoty modulu runtime, které nahrazují šablony {{userName}} a {{userRole}}.
Použití strukturovaných vstupů s interpretem kódu
Pomocí strukturovaných vstupů můžete dynamicky nakonfigurovat soubory a kontejnery, které nástroj Interpret kódu používá za běhu. Definujte šablony handlebar ve vlastnostech nástroje file_ids nebo container a při vytváření odpovědi pak zadejte skutečná ID.
from io import BytesIO
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
PromptAgentDefinition,
CodeInterpreterTool,
AutoCodeInterpreterToolParam,
StructuredInputDefinition,
)
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Upload a CSV file for the code interpreter
csv_file = BytesIO(b"x\n1\n2\n3\n")
csv_file.name = "numbers.csv"
uploaded = openai.files.create(purpose="assistants", file=csv_file)
print(f"File uploaded (id: {uploaded.id})")
# Create agent with a template placeholder for the file ID
tool = CodeInterpreterTool(
container=AutoCodeInterpreterToolParam(file_ids=["{{analysis_file_id}}"])
)
agent = project.agents.create_version(
agent_name="code-interp-structured",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions="You are a helpful data analyst.",
tools=[tool],
structured_inputs={
"analysis_file_id": StructuredInputDefinition(
description="File ID for the code interpreter",
required=True,
schema={"type": "string"},
),
},
),
)
# Supply the actual file ID at runtime
conversation = openai.conversations.create()
response = openai.responses.create(
conversation=conversation.id,
input="Read numbers.csv and return the sum of x.",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {"analysis_file_id": uploaded.id},
},
tool_choice="required",
)
print(response.output_text)
Očekávaný výstup
File uploaded (id: <file-id>)
The sum of x in numbers.csv is 6.
Zástupný {{analysis_file_id}} symbol v poli nástroje file_ids se nahradí skutečným ID souboru za běhu. Pomocí tohoto přístupu můžete pro každý požadavek znovu použít stejnou definici agenta s různými soubory.
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using OpenAI.Responses;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
// Create project client to call Foundry API
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Create agent with a structured input placeholder for the file ID
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful data analyst.",
Tools = {
ResponseTool.CreateCodeInterpreterTool(
new CodeInterpreterToolContainer(
CodeInterpreterToolContainerConfiguration
.CreateAutomaticContainerConfiguration(
fileIds: ["{{analysis_file_id}}"])))
},
StructuredInputs =
{
["analysis_file_id"] = new StructuredInputDefinition
{ Description = "File ID for the code interpreter", IsRequired = true }
}
};
AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "code-interp-structured", options: new(agentDefinition));
// Supply the actual file ID at runtime
AgentReference agentRef = new(name: agent.Name, version: agent.Version);
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentRef);
CreateResponseOptions responseOptions = new()
{
Input = [ResponseItem.CreateUserMessageItem(
"Read numbers.csv and return the sum of x.")]
};
responseOptions.Patch.Set(
"$.structured_inputs[\"analysis_file_id\"]"u8,
BinaryData.FromObjectAsJson("<uploaded-file-id>"));
ResponseResult response = responseClient.CreateResponse(responseOptions);
Console.WriteLine(response.GetOutputText());
// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
agentName: agent.Name, agentVersion: agent.Version);
Očekávaný výstup
The sum of x in numbers.csv is 6.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
export async function main(): Promise<void> {
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Upload a file for code interpreter
const file = new File(["x\n1\n2\n3\n"], "numbers.csv");
const uploaded = await openai.files.create({ file, purpose: "assistants" });
console.log(`File uploaded (id: ${uploaded.id})`);
// Create agent with a template placeholder for the file ID
const agent = await project.agents.createVersion("code-interp-structured", {
kind: "prompt",
model: "gpt-5-mini",
instructions: "You are a helpful data analyst.",
tools: [
{
type: "code_interpreter",
container: { type: "auto", file_ids: ["{{analysis_file_id}}"] },
},
],
structured_inputs: {
analysis_file_id: {
description: "File ID for the code interpreter",
required: true,
},
},
});
// Supply the actual file ID at runtime
const conversation = await openai.conversations.create();
const response = await openai.responses.create(
{
conversation: conversation.id,
input: "Read numbers.csv and return the sum of x.",
tool_choice: "required",
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
structured_inputs: { analysis_file_id: uploaded.id },
},
},
);
console.log(response.output_text);
// Clean up
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch(console.error);
Očekávaný výstup
File uploaded (id: <file-id>)
The sum of x in numbers.csv is 6.
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.AgentsServiceVersion;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.*;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
public class CodeInterpreterStructuredInputExample {
public static void main(String[] args) {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.serviceVersion(AgentsServiceVersion.getLatest());
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Create code interpreter tool with a template placeholder
CodeInterpreterTool tool = new CodeInterpreterTool()
.setContainer(new AutoCodeInterpreterToolParameter()
.setFileIds(Arrays.asList("{{analysis_file_id}}")));
Map<String, StructuredInputDefinition> inputDefs = new LinkedHashMap<>();
inputDefs.put("analysis_file_id",
new StructuredInputDefinition()
.setDescription("File ID for the code interpreter")
.setRequired(true));
AgentVersionDetails agent = agentsClient.createAgentVersion(
"code-interp-structured",
new PromptAgentDefinition("gpt-5-mini")
.setInstructions("You are a helpful data analyst.")
.setTools(Arrays.asList(tool))
.setStructuredInputs(inputDefs));
// Supply the actual file ID at runtime
Map<String, BinaryData> inputValues = new LinkedHashMap<>();
inputValues.put("analysis_file_id",
BinaryData.fromObject("<uploaded-file-id>"));
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions()
.setAgentReference(
new AgentReference(agent.getName()).setVersion(agent.getVersion()))
.setStructuredInputs(inputValues),
ResponseCreateParams.builder()
.input("Read numbers.csv and return the sum of x."));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Očekávaný výstup
Response: The sum of x in numbers.csv is 6.
Vytvoření agenta s dynamickými soubory interpretu kódu
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "code-interp-structured",
"definition": {
"kind": "prompt",
"model": "<MODEL_DEPLOYMENT>",
"instructions": "You are a helpful data analyst.",
"tools": [
{
"type": "code_interpreter",
"container": {
"type": "auto",
"file_ids": ["{{analysis_file_id}}"]
}
}
],
"structured_inputs": {
"analysis_file_id": {
"description": "File ID for the code interpreter",
"required": true,
"schema": {"type": "string"}
}
}
}
}'
Vytvoření odpovědi s ID souboru
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {
"type": "agent_reference",
"name": "code-interp-structured"
},
"input": [
{
"type": "message",
"role": "user",
"content": "Read numbers.csv and return the sum of x."
}
],
"structured_inputs": {
"analysis_file_id": "<FILE_ID>"
},
"tool_choice": "required"
}'
Šablona {{analysis_file_id}} v file_ids je nahrazena skutečným ID souboru za běhu. Můžete definovat více zástupných symbolů ID souboru a ponechat nepoužité prázdné. Prázdné hodnoty se automaticky odeberou z pole.
Použijte strukturované vstupy s vyhledáváním souborů
Pomocí strukturovaných vstupů můžete dynamicky nakonfigurovat, které vektory ukládají dotazy nástroje Pro vyhledávání souborů za běhu. Definujte zástupné symboly šablony v vector_store_ids poli a při vytváření odpovědi zadejte ID skutečného úložiště vektorů.
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
PromptAgentDefinition,
FileSearchTool,
StructuredInputDefinition,
)
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Create a vector store and upload a file
vector_store = openai.vector_stores.create(name="ProductInfoStore")
with open("product_info.md", "rb") as f:
file = openai.vector_stores.files.upload_and_poll(
vector_store_id=vector_store.id, file=f
)
print(f"Vector store created (id: {vector_store.id})")
# Create agent with a template placeholder for vector store ID
tool = FileSearchTool(vector_store_ids=["{{vector_store_id}}"])
agent = project.agents.create_version(
agent_name="file-search-structured",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions="You are a helpful assistant that searches product information.",
tools=[tool],
structured_inputs={
"vector_store_id": StructuredInputDefinition(
description="Vector store ID for file search",
required=True,
schema={"type": "string"},
),
},
),
)
# Supply the actual vector store ID at runtime
conversation = openai.conversations.create()
response = openai.responses.create(
conversation=conversation.id,
input="Tell me about Contoso products",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {"vector_store_id": vector_store.id},
},
)
print(response.output_text)
Očekávaný výstup
Vector store created (id: <vector-store-id>)
Based on the product information, Contoso offers several product lines including...
Zástupný {{vector_store_id}} symbol se nahradí skutečným ID úložiště vektorů za běhu. Můžete definovat více zástupců úložišť vektorů, které umožňují vrstvené nebo kontextově specifické znalostní báze.
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using OpenAI.Responses;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Create agent with a template placeholder for vector store ID
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful assistant that searches product information.",
Tools = {
ResponseTool.CreateFileSearchTool(
vectorStoreIds: ["{{vector_store_id}}"])
},
StructuredInputs =
{
["vector_store_id"] = new StructuredInputDefinition
{ Description = "Vector store ID for file search", IsRequired = true }
}
};
AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "file-search-structured", options: new(agentDefinition));
// Supply the actual vector store ID at runtime
AgentReference agentRef = new(name: agent.Name, version: agent.Version);
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentRef);
CreateResponseOptions responseOptions = new()
{
Input = [ResponseItem.CreateUserMessageItem("Tell me about Contoso products")]
};
responseOptions.Patch.Set(
"$.structured_inputs[\"vector_store_id\"]"u8,
BinaryData.FromObjectAsJson("<vector-store-id>"));
ResponseResult response = responseClient.CreateResponse(responseOptions);
Console.WriteLine(response.GetOutputText());
// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
agentName: agent.Name, agentVersion: agent.Version);
Očekávaný výstup
Based on the product information, Contoso offers several product lines including...
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
export async function main(): Promise<void> {
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Create a vector store (assumes file already uploaded)
const vectorStore = await openai.vectorStores.create({ name: "ProductInfoStore" });
console.log(`Vector store created (id: ${vectorStore.id})`);
// Create agent with a template placeholder for vector store ID
const agent = await project.agents.createVersion("file-search-structured", {
kind: "prompt",
model: "gpt-5-mini",
instructions: "You are a helpful assistant that searches product information.",
tools: [
{
type: "file_search",
vector_store_ids: ["{{vector_store_id}}"],
},
],
structured_inputs: {
vector_store_id: {
description: "Vector store ID for file search",
required: true,
},
},
});
// Supply the actual vector store ID at runtime
const conversation = await openai.conversations.create();
const response = await openai.responses.create(
{
conversation: conversation.id,
input: "Tell me about Contoso products",
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
structured_inputs: { vector_store_id: vectorStore.id },
},
},
);
console.log(response.output_text);
// Clean up
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch(console.error);
Očekávaný výstup
Vector store created (id: <vector-store-id>)
Based on the product information, Contoso offers several product lines including...
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.AgentsServiceVersion;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.FileSearchTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.ai.agents.models.StructuredInputDefinition;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
public class FileSearchStructuredInputExample {
public static void main(String[] args) {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.serviceVersion(AgentsServiceVersion.getLatest());
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Create agent with a template placeholder for vector store ID
FileSearchTool tool = new FileSearchTool()
.setVectorStoreIds(Arrays.asList("{{vector_store_id}}"));
Map<String, StructuredInputDefinition> inputDefs = new LinkedHashMap<>();
inputDefs.put("vector_store_id",
new StructuredInputDefinition()
.setDescription("Vector store ID for file search")
.setRequired(true));
AgentVersionDetails agent = agentsClient.createAgentVersion(
"file-search-structured",
new PromptAgentDefinition("gpt-5-mini")
.setInstructions(
"You are a helpful assistant that searches product information.")
.setTools(Arrays.asList(tool))
.setStructuredInputs(inputDefs));
// Supply the actual vector store ID at runtime
Map<String, BinaryData> inputValues = new LinkedHashMap<>();
inputValues.put("vector_store_id",
BinaryData.fromObject("<vector-store-id>"));
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions()
.setAgentReference(
new AgentReference(agent.getName()).setVersion(agent.getVersion()))
.setStructuredInputs(inputValues),
ResponseCreateParams.builder()
.input("Tell me about Contoso products"));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Očekávaný výstup
Response: Based on the product information, Contoso offers several product lines including...
Vytvořte agenta s dynamickými úložišti vektorových dat pro vyhledávání souborů.
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "file-search-structured",
"definition": {
"kind": "prompt",
"model": "<MODEL_DEPLOYMENT>",
"instructions": "You are a helpful assistant that searches product information.",
"tools": [
{
"type": "file_search",
"vector_store_ids": [
"vs_base_kb",
"{{tier_specific_kb}}"
]
}
],
"structured_inputs": {
"tier_specific_kb": {
"description": "Vector store ID for customer tier",
"required": true,
"schema": {"type": "string"}
}
}
}
}'
Vytvořte odpověď s ID úložiště vektorů
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {
"type": "agent_reference",
"name": "file-search-structured"
},
"input": [
{
"type": "message",
"role": "user",
"content": "Tell me about Contoso products"
}
],
"structured_inputs": {
"tier_specific_kb": "vs_premium_kb_2024"
}
}'
Tento příklad kombinuje úložiště statických vektorů (vs_base_kb) s dynamickým úložištěm ({{tier_specific_kb}}). Zástupný symbol šablony se nahradí za běhu a proces automaticky odebere všechny prázdné řetězcové hodnoty v poli.
Použití strukturovaných vstupů s Azure AI Vyhledávač
Pomocí strukturovaných vstupů můžete dynamicky konfigurovat index nástroje Azure AI Vyhledávačfilter za běhu. Definujte šablonu Handlebars ve výrazu filtru OData a poté při vytváření odpovědi zadejte skutečnou hodnotu filtru. Tento vzor umožňuje, aby jedna definice agenta sloužila uživatelům, jejichž dotazy musí být omezeny na různé podmnožiny indexu, aniž by bylo nutné vytvářet samostatnou verzi agenta pro každou hodnotu filtru.
import os
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
AISearchIndexResource,
AzureAISearchQueryType,
AzureAISearchTool,
AzureAISearchToolResource,
PromptAgentDefinition,
StructuredInputDefinition,
)
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Create the AI Search tool with a handlebar template inside the filter expression
tool = AzureAISearchTool(
azure_ai_search=AzureAISearchToolResource(
indexes=[
AISearchIndexResource(
project_connection_id=os.environ["AI_SEARCH_PROJECT_CONNECTION_ID"],
index_name=os.environ["AI_SEARCH_INDEX_NAME"],
query_type=AzureAISearchQueryType.SIMPLE,
filter="search.ismatchscoring('{{userFilter}}')",
),
]
)
)
# Create the agent with a structured input that supplies the filter value
agent = project.agents.create_version(
agent_name="aisearch-agent-structured-input",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions=(
"You are a helpful assistant. You must always provide citations for "
"answers using the tool and render them as: "
"`\u3010message_idx:search_idx\u2020source\u3011`."
),
tools=[tool],
structured_inputs={
"userFilter": StructuredInputDefinition(
description="The user's search filter",
required=True,
schema={"type": "string"},
),
},
),
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")
# Supply the actual filter value at runtime
stream_response = openai.responses.create(
stream=True,
tool_choice="required",
input="What outdoor gear do you have?",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {"userFilter": "boots"},
},
)
for event in stream_response:
if event.type == "response.completed":
print(f"Agent response: {event.response.output_text}")
Očekávaný výstup
Agent created (id: <agent-id>, name: aisearch-agent-structured-input, version: 1)
Agent response: Based on the index, the available outdoor boots include ...
Symbol zástupného textu {{userFilter}} uvnitř výrazu filter se před spuštěním vyhledávání nahradí hodnotou boots za běhu. Pro každý požadavek můžete zadat různé hodnoty filtru a omezit tak výsledky bez vytvoření nové verze agenta.
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using OpenAI.Responses;
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
var searchConnectionName = "my-search-connection";
var searchIndexName = "my-search-index";
AIProjectClient projectClient = new(
endpoint: new Uri(projectEndpoint),
tokenProvider: new DefaultAzureCredential());
// Resolve the project connection ID from the connection name
AIProjectConnection aiSearchConnection =
projectClient.Connections.GetConnection(connectionName: searchConnectionName);
// Define the search index with a handlebar template inside the filter expression
AzureAISearchToolIndex index = new()
{
ProjectConnectionId = aiSearchConnection.Id,
IndexName = searchIndexName,
QueryType = AzureAISearchQueryType.Simple,
Filter = "search.ismatchscoring('{{userFilter}}')"
};
// Create the agent with a structured input that supplies the filter value
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
Instructions = "You are a helpful assistant. You must always provide citations for "
+ "answers using the tool and render them as: "
+ "`\u3010message_idx:search_idx\u2020source\u3011`.",
Tools = { new AzureAISearchTool(new AzureAISearchToolOptions(indexes: [index])) },
StructuredInputs =
{
["userFilter"] = new StructuredInputDefinition
{ Description = "The user's search filter", IsRequired = true }
}
};
AgentVersion agent = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "aisearch-agent-structured-input",
options: new(agentDefinition));
// Supply the actual filter value at runtime
AgentReference agentRef = new(name: agent.Name, version: agent.Version);
ProjectResponsesClient responseClient =
projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentRef);
CreateResponseOptions responseOptions = new()
{
Input = [ResponseItem.CreateUserMessageItem("What outdoor gear do you have?")]
};
responseOptions.Patch.Set(
"$.structured_inputs[\"userFilter\"]"u8,
BinaryData.FromObjectAsJson("boots"));
ResponseResult response = responseClient.CreateResponse(responseOptions);
Console.WriteLine(response.GetOutputText());
// Clean up
projectClient.AgentAdministrationClient.DeleteAgentVersion(
agentName: agent.Name, agentVersion: agent.Version);
Očekávaný výstup
Based on the index, the available outdoor boots include ...
Vlastnost Filter v AzureAISearchToolIndex přijímá šablony Handlebars, které se vyhodnocují za běhu. Použijte Patch.Set u CreateResponseOptions k zadání hodnoty filtru prostřednictvím cesty JSON $.structured_inputs.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const SEARCH_CONNECTION_NAME = "my-search-connection";
const SEARCH_INDEX_NAME = "my-search-index";
export async function main(): Promise<void> {
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
// Resolve the project connection ID from the connection name
const aiSearchConnection = await project.connections.get(SEARCH_CONNECTION_NAME);
// Create the agent with a handlebar template inside the filter expression
const agent = await project.agents.createVersion("aisearch-agent-structured-input", {
kind: "prompt",
model: "gpt-5-mini",
instructions:
"You are a helpful assistant. You must always provide citations for " +
"answers using the tool and render them as: `[message_idx:search_idx†source]`.",
tools: [
{
type: "azure_ai_search",
azure_ai_search: {
indexes: [
{
project_connection_id: aiSearchConnection.id,
index_name: SEARCH_INDEX_NAME,
query_type: "simple",
filter: "search.ismatchscoring('{{userFilter}}')",
},
],
},
},
],
structured_inputs: {
userFilter: { description: "The user's search filter", required: true },
},
});
console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);
// Supply the actual filter value at runtime
const response = await openai.responses.create(
{
input: "What outdoor gear do you have?",
tool_choice: "required",
},
{
body: {
agent_reference: { name: agent.name, type: "agent_reference" },
structured_inputs: { userFilter: "boots" },
},
},
);
console.log(response.output_text);
// Clean up
await project.agents.deleteVersion(agent.name, agent.version);
}
main().catch(console.error);
Očekávaný výstup
Agent created (id: <agent-id>, name: aisearch-agent-structured-input, version: 1)
Based on the index, the available outdoor boots include ...
import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.AgentsServiceVersion;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AISearchIndexResource;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureAISearchQueryType;
import com.azure.ai.agents.models.AzureAISearchTool;
import com.azure.ai.agents.models.AzureAISearchToolResource;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.ai.agents.models.StructuredInputDefinition;
import com.azure.core.util.BinaryData;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
public class AzureAISearchStructuredInputExample {
public static void main(String[] args) {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
String projectEndpoint = "your_project_endpoint";
String searchConnectionId = "your-search-connection-id";
String searchIndexName = "my-search-index";
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(projectEndpoint)
.serviceVersion(AgentsServiceVersion.getLatest());
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Create the AI Search tool with a handlebar template inside the filter expression
AzureAISearchTool tool = new AzureAISearchTool(
new AzureAISearchToolResource(Arrays.asList(
new AISearchIndexResource()
.setProjectConnectionId(searchConnectionId)
.setIndexName(searchIndexName)
.setQueryType(AzureAISearchQueryType.SIMPLE)
.setFilter("search.ismatchscoring('{{userFilter}}')")
))
);
Map<String, StructuredInputDefinition> inputDefs = new LinkedHashMap<>();
inputDefs.put("userFilter",
new StructuredInputDefinition()
.setDescription("The user's search filter")
.setRequired(true));
AgentVersionDetails agent = agentsClient.createAgentVersion(
"aisearch-agent-structured-input",
new PromptAgentDefinition("gpt-5-mini")
.setInstructions("You are a helpful assistant. Always provide citations.")
.setTools(Arrays.asList(tool))
.setStructuredInputs(inputDefs));
// Supply the actual filter value at runtime
Map<String, BinaryData> inputValues = new LinkedHashMap<>();
inputValues.put("userFilter", BinaryData.fromObject("boots"));
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions()
.setAgentReference(
new AgentReference(agent.getName()).setVersion(agent.getVersion()))
.setStructuredInputs(inputValues),
ResponseCreateParams.builder()
.input("What outdoor gear do you have?"));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Očekávaný výstup
Response: Based on the index, the available outdoor boots include ...
Vytvoření agenta s dynamickým filtrem Azure AI Vyhledávač
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "aisearch-agent-structured-input",
"definition": {
"kind": "prompt",
"model": "<MODEL_DEPLOYMENT>",
"instructions": "You are a helpful assistant. Always provide citations.",
"tools": [
{
"type": "azure_ai_search",
"azure_ai_search": {
"indexes": [
{
"project_connection_id": "$AZURE_AI_SEARCH_CONNECTION_ID",
"index_name": "$AI_SEARCH_INDEX_NAME",
"query_type": "simple",
"filter": "search.ismatchscoring('\''{{userFilter}}'\'')"
}
]
}
}
],
"structured_inputs": {
"userFilter": {
"description": "The user's search filter",
"required": true,
"schema": {"type": "string"}
}
}
}
}'
Vytvořte odpověď s hodnotou filtru
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {
"type": "agent_reference",
"name": "aisearch-agent-structured-input"
},
"input": [
{
"type": "message",
"role": "user",
"content": "What outdoor gear do you have?"
}
],
"structured_inputs": {
"userFilter": "boots"
},
"tool_choice": "required"
}'
Šablona {{userFilter}} uvnitř výrazu filter je za běhu nahrazena výrazem boots. Sekvence '\'' v těle příkazu create-agent je standardní escapovací sekvence v Bashi pro doslovný apostrof uvnitř řetězce uzavřeného do jednoduchých uvozovek. Pokud váš shell zpracovává uvozovky jinak, poskytněte místo toho obsah JSON ze souboru.
Použití strukturovaných vstupů se servery MCP
Pomocí strukturovaných vstupů můžete dynamicky konfigurovat připojení serveru MCP za běhu. Můžete nastavit adresu URL serveru, hlavičky ověřování a popisek serveru. Pomocí tohoto přístupu se může jedna definice agenta připojit k různým serverům MCP v závislosti na kontextu.
Následující KÓD JSON ukazuje text požadavku pro operaci vytvoření verze agenta (POST /agents?api-version=v1). Definice agenta zahrnuje vlastnosti nástroje MCP s Handlebar šablonami jako zástupnými symboly:
{
"name": "mcp-dynamic-agent",
"definition": {
"kind": "prompt",
"model": "gpt-4o",
"instructions": "You are a development assistant for {{project_name}}.",
"tools": [
{
"type": "mcp",
"server_label": "{{server_label}}",
"server_url": "{{server_url}}",
"require_approval": "never",
"headers": {
"Authorization": "{{auth_token}}",
"X-Project-ID": "{{project_id}}"
}
}
],
"structured_inputs": {
"project_name": {
"description": "Project name",
"required": true
},
"server_label": {
"description": "MCP server label",
"required": true,
"schema": {"type": "string"}
},
"server_url": {
"description": "MCP server URL",
"required": true,
"schema": {"type": "string"}
},
"auth_token": {
"description": "Authentication token",
"required": true,
"schema": {"type": "string"}
},
"project_id": {
"description": "Project identifier",
"required": true,
"schema": {"type": "string"}
}
}
}
}
Za běhu zadejte do textu požadavku skutečné hodnoty konfigurace serveru pro operaci Vytvoření odpovědi (POST /openai/v1/responses):
{
"agent_reference": {
"type": "agent_reference",
"name": "mcp-dynamic-agent"
},
"input": [{"type": "message", "role": "user", "content": "List recent commits"}],
"structured_inputs": {
"project_name": "CloudSync API",
"server_label": "cloudsync-repo",
"server_url": "https://gitmcp.io/myorg/cloudsync-api",
"auth_token": "Bearer ghp_xxxxxxxxxxxx",
"project_id": "proj_12345"
}
}
Vzory sady SDK pro strukturované vstupy MCP se řídí stejným přístupem uvedeným v předchozích příkladech. Definujte zástupné symboly šablony ve vlastnostech nástroje MCP, deklarujte schémata strukturovaného vstupu v definici agenta a zadejte hodnoty za běhu.
Následující Python příklad ukazuje úplný vzor:
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
MCPTool,
PromptAgentDefinition,
StructuredInputDefinition,
)
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Create MCP tool with template placeholders
tool = MCPTool(
server_label="{{server_label}}",
server_url="{{server_url}}",
require_approval="never",
headers={"Authorization": "{{auth_token}}", "X-Project-ID": "{{project_id}}"},
)
# Create agent with structured inputs for MCP configuration
agent = project.agents.create_version(
agent_name="mcp-dynamic-agent",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions="You are a helpful development assistant for {{project_name}}.",
tools=[tool],
structured_inputs={
"project_name": StructuredInputDefinition(
description="Project name", required=True, schema={"type": "string"},
),
"server_label": StructuredInputDefinition(
description="MCP server label", required=True, schema={"type": "string"},
),
"server_url": StructuredInputDefinition(
description="MCP server URL", required=True, schema={"type": "string"},
),
"auth_token": StructuredInputDefinition(
description="Authentication token", required=True, schema={"type": "string"},
),
"project_id": StructuredInputDefinition(
description="Project identifier", required=True, schema={"type": "string"},
),
},
),
)
# Supply MCP server configuration at runtime
conversation = openai.conversations.create()
response = openai.responses.create(
conversation=conversation.id,
input="List recent commits",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {
"project_name": "CloudSync API",
"server_label": "cloudsync-repo",
"server_url": "https://gitmcp.io/myorg/cloudsync-api",
"auth_token": "Bearer ghp_xxxxxxxxxxxx",
"project_id": "proj_12345",
},
},
)
print(response.output_text)
Další informace o připojení k serverům MCP najdete v tématu Připojení agentů k serverům MCP.
Použití strukturovaných vstupů v rozhraní API pro odpovědi
Handlebar šablony můžete použít přímo ve voláních API rozhraní odpovědí bez nutnosti jejich definování v definici agenta. Tento přístup funguje pro pokyny na úrovni odpovědí a pro zprávy systému nebo vývojáře ve vstupním poli.
Instrukce na úrovni odpovědi se strukturovanými vstupy
Předání strukturovaných vstupů spolu s instructions požadavkem na odpověď pro přizpůsobení systémového dotazu:
{
"instructions": "You are assisting {{customerName}} from {{companyName}} located in {{location}}.",
"input": [
{
"type": "message",
"role": "user",
"content": "Hello, who am I?"
}
],
"structured_inputs": {
"customerName": "Bob Johnson",
"companyName": "Tech Corp",
"location": "San Francisco"
},
"model": "gpt-4o"
}
Zprávy systému a vývojářů se strukturovanými vstupy
Pomocí šablon úchytů v obsahu zpráv systému a vývojářů můžete do kontextu konverzace vkládat hodnoty modulu runtime:
{
"instructions": "You are a helpful assistant.",
"input": [
{
"type": "message",
"role": "system",
"content": "The user's name is {{userName}} and they work in {{department}}."
},
{
"type": "message",
"role": "developer",
"content": [
{
"type": "input_text",
"text": "User role: {{userRole}}. Always be professional."
}
]
},
{
"type": "message",
"role": "user",
"content": "Hello, can you confirm my details?"
}
],
"structured_inputs": {
"userName": "Sarah Connor",
"department": "Engineering",
"userRole": "Tech Lead"
},
"model": "gpt-4o"
}
V kódu sady SDK předejte tyto hodnoty pomocí stejných vzorů extra_body (Python), body (TypeScript) nebo AzureCreateResponseOptions (Java/C#) zobrazených v předchozích příkladech.
Následující Python příklad ukazuje, jak používat instrukce na úrovni odpovědi se strukturovanými vstupy:
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Pass structured inputs with response-level instructions
response = openai.responses.create(
model="gpt-5-mini",
instructions="You are assisting {{customerName}} from {{companyName}} located in {{location}}.",
input=[
{
"type": "message",
"role": "user",
"content": "Hello, who am I?",
}
],
extra_body={
"structured_inputs": {
"customerName": "Bob Johnson",
"companyName": "Tech Corp",
"location": "San Francisco",
},
},
)
print(response.output_text)
Pokročilá syntaxe šablony
Strukturované vstupy podporují plnou syntaxi šablon Handlebars nad rámec prostého nahrazení proměnných. K vytvoření dynamické instrukční logiky v rámci jedné definice agenta můžete použít podmíněné výrazy, smyčky a další integrované pomocné rutiny.
Následující příklad vytvoří pomocníka pro počasí, jehož chování se přizpůsobí na základě vstupů za běhu. Šablona pokynů používá {{#if}} pro podmíněné oddíly a {{#each}} pro iteraci seznamu uživatelských předvoleb:
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, StructuredInputDefinition
from azure.identity import DefaultAzureCredential
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
# Create clients to call Foundry API
project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=DefaultAzureCredential())
openai = project.get_openai_client()
# Define instructions with conditionals and loops
instructions = """You are a weather assistant. Provide a helpful weather summary for the user.
The user asked about: {{location}}
Use the following units: {{units}}
{{#if includeForecast}}
Include a brief multi-day forecast in your response.
{{else}}
Focus only on the current conditions.
{{/if}}
{{#if preferences}}
The user has these additional preferences:
{{#each preferences}}
- {{this}}
{{/each}}
{{/if}}
Keep the final answer clear and easy to read."""
agent = project.agents.create_version(
agent_name="weather-assistant",
definition=PromptAgentDefinition(
model="gpt-5-mini",
instructions=instructions,
structured_inputs={
"location": StructuredInputDefinition(
description="City or region to check weather for",
required=True,
schema={"type": "string"},
),
"units": StructuredInputDefinition(
description="Temperature units (Celsius or Fahrenheit)",
default_value="Celsius",
schema={"type": "string"},
),
"includeForecast": StructuredInputDefinition(
description="Whether to include a multi-day forecast",
default_value="false",
schema={"type": "boolean"},
),
"preferences": StructuredInputDefinition(
description="Additional user preferences",
schema={"type": "array"},
),
},
),
)
# Supply values at runtime — conditionals and loops resolve automatically
conversation = openai.conversations.create()
response = openai.responses.create(
conversation=conversation.id,
input="What's the weather like?",
extra_body={
"agent_reference": {"name": agent.name, "type": "agent_reference"},
"structured_inputs": {
"location": "Seattle, WA",
"units": "Fahrenheit",
"includeForecast": True,
"preferences": ["Highlight UV index", "Include wind speed"],
},
},
)
print(response.output_text)
Při použití těchto hodnot se vyřešené pokyny stanou:
Jste asistentka pro počasí. Poskytněte uživateli užitečný přehled počasí.
Uživatel se zeptal: Seattle, WA
Použijte následující jednotky: Fahrenheit
Do odpovědi zahrňte stručnou vícedenní prognózu.
Uživatel má tyto další předvolby:
- Zvýraznění UV indexu
- Zahrnout rychlost větru
Konečná odpověď je přehledná a čitelná.
Následující tabulka shrnuje podporované helpery:
| Pomocník | Syntaxe | Popis |
|---|---|---|
| Podmíněné | {{#if value}}...{{else}}...{{/if}} |
Vykreslení obsahu na základě pravdivých nebo falšovaných hodnot |
| Negace | {{#unless value}}...{{/unless}} |
Vykreslení obsahu, když je hodnota nepravdivá |
| Cyklus | {{#each array}}{{this}}{{/each}} |
Iterace nad položkami pole |
| Poslední kontrola položky | {{#unless @last}}, {{/unless}} |
Podmíněné zobrazení oddělovačů mezi položkami smyčky |