Skip to content

Commit 6afbcaf

Browse files
Adds support for custom ServiceConfig settings for extensions (#6013)
* Updates proto models to add config * Adds support for custom service config types in extensions * Fixes linter issues * Updates paths in go.work * Adds JSON schema for custom service target config * Adds the schema * Fixes build issue * Updates test file path generation --------- Co-authored-by: Rajesh Kamal <[email protected]>
1 parent f3f6654 commit 6afbcaf

File tree

16 files changed

+659
-68
lines changed

16 files changed

+659
-68
lines changed

cli/azd/.vscode/cspell.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ words:
2626
- proto
2727
- protobuf
2828
- protoc
29-
- protoreflect
3029
- protoimpl
30+
- protojson
31+
- protoreflect
32+
- structpb
3133
- Retryable
3234
- runcontext
3335
- surveyterm

cli/azd/extensions/azure.ai.agents/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ require (
1717
github.com/mark3labs/mcp-go v0.41.1
1818
github.com/spf13/cobra v1.10.1
1919
go.yaml.in/yaml/v3 v3.0.4
20+
google.golang.org/protobuf v1.36.10
2021
gopkg.in/yaml.v3 v3.0.1
2122
)
2223

@@ -93,5 +94,4 @@ require (
9394
golang.org/x/text v0.30.0 // indirect
9495
google.golang.org/genproto/googleapis/rpc v0.0.0-20251007200510-49b9836ed3ff // indirect
9596
google.golang.org/grpc v1.76.0 // indirect
96-
google.golang.org/protobuf v1.36.10 // indirect
9797
)

cli/azd/extensions/azure.ai.agents/internal/cmd/listen.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package cmd
55

66
import (
7+
"context"
78
"fmt"
89

910
"azureaiagent/internal/project"
@@ -33,7 +34,37 @@ func newListenCommand() *cobra.Command {
3334
WithServiceTarget(AiAgentHost, func() azdext.ServiceTargetProvider {
3435
return project.NewAgentServiceTargetProvider(azdClient)
3536
}).
36-
WithProjectEventHandler("preprovision", projectParser.SetIdentity).
37+
WithProjectEventHandler("preprovision", func(ctx context.Context, args *azdext.ProjectEventArgs) error {
38+
if err := projectParser.SetIdentity(ctx, args); err != nil {
39+
return fmt.Errorf("failed to set identity: %w", err)
40+
}
41+
42+
// TODO: Move this function into its own file
43+
for _, svc := range args.Project.Services {
44+
if svc.Host != "foundry.containeragent" {
45+
continue
46+
}
47+
48+
var foundryAgentConfig *project.ServiceTargetAgentConfig
49+
if err := project.UnmarshalStruct(svc.Config, &foundryAgentConfig); err != nil {
50+
return fmt.Errorf("failed to parse foundry agent config: %w", err)
51+
}
52+
53+
currentEnvResponse, err := azdClient.Environment().GetCurrent(ctx, &azdext.EmptyRequest{})
54+
if err != nil {
55+
return err
56+
}
57+
58+
// TODO: Generate and update any missing environment variables needed by the agent
59+
azdClient.Environment().SetValue(ctx, &azdext.SetEnvRequest{
60+
EnvName: currentEnvResponse.Environment.Name,
61+
Key: "MISSING_KEY",
62+
Value: "MISSING_VALUE",
63+
})
64+
}
65+
66+
return nil
67+
}).
3768
WithProjectEventHandler("postdeploy", projectParser.CoboPostDeploy)
3869

3970
// Start listening for events
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package project
5+
6+
import (
7+
"encoding/json"
8+
9+
"google.golang.org/protobuf/encoding/protojson"
10+
"google.golang.org/protobuf/types/known/structpb"
11+
)
12+
13+
// ServiceTargetAgentConfig provides custom configuration for the Azure AI Service target
14+
type ServiceTargetAgentConfig struct {
15+
Environment map[string]string `json:"env,omitempty"`
16+
Scale *ScaleSettings `json:"scale,omitempty"`
17+
}
18+
19+
// ScaleSettings provides scaling configuration for the Azure AI Service target
20+
type ScaleSettings struct {
21+
MinReplicas int `json:"minReplicas,omitempty"`
22+
MaxReplicas int `json:"maxReplicas,omitempty"`
23+
Memory string `json:"memory,omitempty"`
24+
Cpu string `json:"cpu,omitempty"`
25+
}
26+
27+
// UnmarshalStruct converts a structpb.Struct to a Go struct of type T
28+
func UnmarshalStruct[T any](s *structpb.Struct, out *T) error {
29+
structBytes, err := protojson.Marshal(s)
30+
if err != nil {
31+
return err
32+
}
33+
34+
return json.Unmarshal(structBytes, out)
35+
}

cli/azd/extensions/azure.ai.agents/internal/project/service_target_agent.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,15 @@ func (p *AgentServiceTargetProvider) Deploy(
233233
azdEnv[kval.Key] = kval.Value
234234
}
235235

236+
var serviceTargetConfig *ServiceTargetAgentConfig
237+
if err := UnmarshalStruct(serviceConfig.Config, &serviceTargetConfig); err != nil {
238+
return nil, fmt.Errorf("failed to parse service target config: %w", err)
239+
}
240+
241+
if serviceTargetConfig != nil {
242+
fmt.Println("Loaded custom service target configuration")
243+
}
244+
236245
// Load and validate the agent manifest
237246
data, err := os.ReadFile(p.agentDefinitionPath)
238247
if err != nil {
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-07/schema#",
3+
"title": "Azure AI Agent Service Target Configuration",
4+
"description": "Custom configuration for the Azure AI Agent Service target",
5+
"type": "object",
6+
"properties": {
7+
"env": {
8+
"type": "object",
9+
"description": "Environment variables as key-value pairs",
10+
"additionalProperties": {
11+
"type": "string"
12+
}
13+
},
14+
"scale": {
15+
"$ref": "#/definitions/ScaleSettings"
16+
}
17+
},
18+
"additionalProperties": false,
19+
"definitions": {
20+
"ScaleSettings": {
21+
"type": "object",
22+
"description": "Scaling configuration for the Azure AI Agent Service target",
23+
"properties": {
24+
"minReplicas": {
25+
"type": "integer",
26+
"description": "Minimum number of replicas",
27+
"minimum": 0
28+
},
29+
"maxReplicas": {
30+
"type": "integer",
31+
"description": "Maximum number of replicas",
32+
"minimum": 1
33+
},
34+
"memory": {
35+
"type": "string",
36+
"description": "Memory allocation (e.g., '1Gi', '512Mi')",
37+
"pattern": "^[0-9]+(\\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|k|M|G|T|P|E)?$"
38+
},
39+
"cpu": {
40+
"type": "string",
41+
"description": "CPU allocation (e.g., '1', '500m')",
42+
"pattern": "^[0-9]+(\\.[0-9]+)?m?$"
43+
}
44+
},
45+
"additionalProperties": false
46+
}
47+
}
48+
}

cli/azd/extensions/azure.coding-agent/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ require (
3939
github.com/charmbracelet/x/exp/slice v0.0.0-20251008171431-5d3777519489 // indirect
4040
github.com/charmbracelet/x/term v0.2.1 // indirect
4141
github.com/clipperhouse/uax29/v2 v2.2.0 // indirect
42-
github.com/davecgh/go-spew v1.1.1 // indirect
42+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
4343
github.com/dlclark/regexp2 v1.11.5 // indirect
4444
github.com/drone/envsubst v1.0.3 // indirect
4545
github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 // indirect
@@ -65,7 +65,7 @@ require (
6565
github.com/muesli/termenv v0.16.0 // indirect
6666
github.com/nathan-fiscaletti/consolesize-go v0.0.0-20220204101620-317176b6684d // indirect
6767
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
68-
github.com/pmezard/go-difflib v1.0.0 // indirect
68+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
6969
github.com/rivo/uniseg v0.4.7 // indirect
7070
github.com/sethvargo/go-retry v0.3.0 // indirect
7171
github.com/theckman/yacspin v0.13.12 // indirect

cli/azd/extensions/azure.coding-agent/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6N
8181
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
8282
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
8383
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
84-
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
8584
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
85+
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
8686
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
8787
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
8888
github.com/drone/envsubst v1.0.3 h1:PCIBwNDYjs50AsLZPYdfhSATKaRg/FJmDc2D6+C2x8g=
@@ -167,8 +167,8 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
167167
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
168168
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
169169
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
170-
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
171170
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
171+
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
172172
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
173173
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
174174
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=

cli/azd/go.work

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
go 1.25.0
2+
3+
use (
4+
../../
5+
./extensions/azure.coding-agent
6+
./extensions/azure.ai.agents
7+
)

0 commit comments

Comments
 (0)