Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 0 additions & 29 deletions pkg/config/mcp.go

This file was deleted.

22 changes: 0 additions & 22 deletions pkg/config/models.go

This file was deleted.

8 changes: 5 additions & 3 deletions pkg/oci/Dockerfile.template
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# syntax=docker/dockerfile:1

FROM {{ .BaseImage }}
LABEL com.docker.agent.mcp-servers="{{ .McpServers }}"
LABEL com.docker.agent.models="{{ .Models }}"
LABEL com.docker.agent.packaging.version="v0.0.1"

LABEL com.docker.agent.packaging.version="v0.0.2"
LABEL com.docker.agent.runtime="cagent"
LABEL com.docker.agent.secrets.models="{{ .ModelSecrets }}"
LABEL com.docker.agent.secrets.tools="{{ .ToolSecrets }}"

LABEL org.opencontainers.image.author="{{ .Metadata.Author }}"
LABEL org.opencontainers.image.created="{{ .BuildDate }}"
LABEL org.opencontainers.image.description="{{ .Description }}"
Expand Down
22 changes: 13 additions & 9 deletions pkg/oci/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"time"

"github.com/docker/cagent/pkg/config"
"github.com/docker/cagent/pkg/secrets"
)

//go:embed Dockerfile.template
Expand All @@ -40,8 +41,11 @@ func BuildDockerImage(ctx context.Context, agentFilePath, dockerImageName string
}

// Analyze the config to find which secrets are needed
modelNames := config.GatherModelNames(cfg)
mcpServers := config.GatherMCPServerReferences(cfg)
modelSecrets := secrets.GatherEnvVarsForModels(cfg)
toolSecrets, err := secrets.GatherEnvVarsForTools(ctx, cfg)
if err != nil {
return err
}

// Find which base image to use
baseImage := "docker/cagent"
Expand All @@ -54,13 +58,13 @@ func BuildDockerImage(ctx context.Context, agentFilePath, dockerImageName string

tpl := template.Must(template.New("Dockerfile").Parse(dockerfileTemplate))
if err := tpl.Execute(&dockerfileBuf, map[string]any{
"BaseImage": baseImage,
"AgentConfig": string(agentYaml),
"BuildDate": time.Now().UTC().Format(time.RFC3339),
"Description": cfg.Agents["root"].Description,
"McpServers": strings.Join(mcpServers, ","),
"Metadata": cfg.Metadata,
"Models": strings.Join(modelNames, ","),
"BaseImage": baseImage,
"AgentConfig": string(agentYaml),
"BuildDate": time.Now().UTC().Format(time.RFC3339),
"Description": cfg.Agents["root"].Description,
"Metadata": cfg.Metadata,
"ModelSecrets": strings.Join(modelSecrets, ","),
"ToolSecrets": strings.Join(toolSecrets, ","),
}); err != nil {
return err
}
Expand Down
24 changes: 23 additions & 1 deletion pkg/secrets/gather.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func GatherEnvVarsForModels(cfg *latest.Config) []string {
func GatherEnvVarsForTools(ctx context.Context, cfg *latest.Config) ([]string, error) {
requiredEnv := map[string]bool{}

for _, ref := range config.GatherMCPServerReferences(cfg) {
for _, ref := range gatherMCPServerReferences(cfg) {
mcpServerName := gateway.ParseServerRef(ref)
if mcpServerURL := os.Getenv(mcp.ENV_DOCKER_MCP_URL_PREFIX + mcpServerName); mcpServerURL != "" {
// This MCP server is configured at runtime to be remote. We don't need to know its secrets.
Expand All @@ -98,6 +98,28 @@ func GatherEnvVarsForTools(ctx context.Context, cfg *latest.Config) ([]string, e
return mcpToSortedList(requiredEnv), nil
}

func gatherMCPServerReferences(cfg *latest.Config) []string {
servers := map[string]bool{}

for _, agent := range cfg.Agents {
for i := range agent.Toolsets {
toolSet := agent.Toolsets[i]

if toolSet.Type == "mcp" && toolSet.Ref != "" {
servers[toolSet.Ref] = true
}
}
}

var list []string
for e := range servers {
list = append(list, e)
}
sort.Strings(list)

return list
}

func mcpToSortedList(requiredEnv map[string]bool) []string {
var requiredEnvList []string

Expand Down