diff --git a/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations.go b/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations.go index 86cf1fdf79e..a9e29b83118 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations.go +++ b/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations.go @@ -363,6 +363,11 @@ func (c *AgentClient) CreateAgentVersion(ctx context.Context, agentName string, return nil, fmt.Errorf("failed to create request: %w", err) } + // Opt-in to the hosted-agents preview feature. The Foundry v1 endpoint + // gates POST /agents/{name}/versions with definition.kind=="hosted" behind + // this header and returns HTTP 403 (preview_feature_required) without it. + req.Raw().Header.Set("Foundry-Features", "HostedAgents=V1Preview") + if err := req.SetBody(streaming.NopCloser(bytes.NewReader(payload)), "application/json"); err != nil { return nil, fmt.Errorf("failed to set request body: %w", err) } diff --git a/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations_test.go b/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations_test.go index 945a17547fe..0bd745b8efc 100644 --- a/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations_test.go +++ b/cli/azd/extensions/azure.ai.agents/internal/pkg/agents/agent_api/operations_test.go @@ -772,3 +772,39 @@ func TestZipDeployRequest_NoAgentNameHeader_OnUpdate(t *testing.T) { require.Equal(t, "CodeAgents=V1Preview,HostedAgents=V1Preview", transport.lastReq.Header.Get("Foundry-Features")) require.Equal(t, "sha", transport.lastReq.Header.Get("x-ms-code-zip-sha256")) } + +func TestCreateAgentVersion_SetsHostedAgentsPreviewHeader(t *testing.T) { + // The Foundry v1 endpoint gates POST /agents/{name}/versions on the + // HostedAgents=V1Preview opt-in header and returns 403 preview_feature_required + // without it. Make sure the client always sends the header so callers don't + // silently regress to the pre-v1 (preview-API-version) behavior. + versionResp := `{ + "object": "agent.version", + "id": "test-agent:1", + "name": "test-agent", + "version": "1" + }` + transport := &capturingTransport{statusCode: http.StatusCreated, respBody: versionResp} + client := newTestClient("https://test.example.com/api/projects/proj", transport) + + desc := "test desc" + req := &CreateAgentVersionRequest{Description: &desc} + + _, err := client.CreateAgentVersion(context.Background(), "test-agent", req, "v1") + require.NoError(t, err) + + require.NotNil(t, transport.lastReq, "expected request to be captured") + require.Equal(t, http.MethodPost, transport.lastReq.Method) + require.Equal( + t, + "https://test.example.com/api/projects/proj/agents/test-agent/versions", + transport.lastReq.URL.Scheme+"://"+transport.lastReq.URL.Host+transport.lastReq.URL.Path, + ) + require.Equal(t, "v1", transport.lastReq.URL.Query().Get("api-version")) + require.Equal( + t, + "HostedAgents=V1Preview", + transport.lastReq.Header.Get("Foundry-Features"), + "CreateAgentVersion must opt in to HostedAgents=V1Preview on the v1 endpoint", + ) +}