Skip to content

Commit 79140af

Browse files
authored
Merge pull request #1810 from dgageot/freeze-v5
Freeze v5 (and a few refactoring)
2 parents 9c8db20 + 4c51150 commit 79140af

26 files changed

Lines changed: 2755 additions & 223 deletions

agent-schema.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@
1414
"2",
1515
"3",
1616
"4",
17-
"5"
17+
"5",
18+
"6"
1819
],
1920
"examples": [
2021
"0",
2122
"1",
2223
"2",
2324
"3",
2425
"4",
25-
"5"
26+
"5",
27+
"6"
2628
]
2729
},
2830
"providers": {

pkg/config/config.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func CheckRequiredEnvVars(ctx context.Context, cfg *latest.Config, modelsGateway
7070
}
7171

7272
func parseCurrentVersion(data []byte, version string) (any, error) {
73-
parsers := Parsers()
73+
parsers, _ := versions()
7474
parser, found := parsers[version]
7575
if !found {
7676
return nil, fmt.Errorf("unsupported config version: %v (valid versions: %s)", version, strings.Join(slices.Sorted(maps.Keys(parsers)), ", "))
@@ -81,7 +81,8 @@ func parseCurrentVersion(data []byte, version string) (any, error) {
8181
func migrateToLatestConfig(c any, raw []byte) (latest.Config, error) {
8282
var err error
8383

84-
for _, upgrade := range Upgrades() {
84+
_, upgraders := versions()
85+
for _, upgrade := range upgraders {
8586
c, err = upgrade(c, raw)
8687
if err != nil {
8788
return latest.Config{}, err

pkg/config/latest/parse.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
11
package latest
22

3-
import "github.com/goccy/go-yaml"
3+
import (
4+
"github.com/goccy/go-yaml"
45

5-
func Parse(data []byte) (Config, error) {
6+
"github.com/docker/cagent/pkg/config/types"
7+
previous "github.com/docker/cagent/pkg/config/v5"
8+
)
9+
10+
func Register(parsers map[string]func([]byte) (any, error), upgraders *[]func(any, []byte) (any, error)) {
11+
parsers[Version] = func(d []byte) (any, error) { return parse(d) }
12+
*upgraders = append(*upgraders, upgradeIfNeeded)
13+
}
14+
15+
func parse(data []byte) (Config, error) {
616
var cfg Config
717
err := yaml.UnmarshalWithOptions(data, &cfg, yaml.Strict())
818
return cfg, err
919
}
20+
21+
func upgradeIfNeeded(c any, _ []byte) (any, error) {
22+
old, ok := c.(previous.Config)
23+
if !ok {
24+
return c, nil
25+
}
26+
27+
var config Config
28+
types.CloneThroughJSON(old, &config)
29+
return config, nil
30+
}

pkg/config/latest/types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/docker/cagent/pkg/config/types"
1414
)
1515

16-
const Version = "5"
16+
const Version = "6"
1717

1818
// Config represents the entire configuration file
1919
type Config struct {

pkg/config/latest/types_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ agents:
133133
instructions: "You are a helpful assistant."
134134
`)
135135

136-
_, err := Parse(input)
136+
_, err := parse(input)
137137
require.Error(t, err)
138138
require.Contains(t, err.Error(), "instructions")
139139
}
@@ -148,7 +148,7 @@ agents:
148148
instruction: "You are a helpful assistant."
149149
`)
150150

151-
cfg, err := Parse(input)
151+
cfg, err := parse(input)
152152
require.NoError(t, err)
153153
require.Len(t, cfg.Agents, 1)
154154
require.Equal(t, "root", cfg.Agents[0].Name)

pkg/config/latest/upgrade.go

Lines changed: 0 additions & 17 deletions
This file was deleted.

pkg/config/v0/parse.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@ package v0
22

33
import "github.com/goccy/go-yaml"
44

5-
func Parse(data []byte) (Config, error) {
5+
func Register(parsers map[string]func([]byte) (any, error), upgraders *[]func(any, []byte) (any, error)) {
6+
parsers[Version] = func(d []byte) (any, error) { return parse(d) }
7+
*upgraders = append(*upgraders, upgradeIfNeeded)
8+
}
9+
10+
func parse(data []byte) (Config, error) {
611
var cfg Config
712
err := yaml.UnmarshalWithOptions(data, &cfg, yaml.Strict())
813
return cfg, err
914
}
15+
16+
func upgradeIfNeeded(old any, _ []byte) (any, error) {
17+
return old, nil
18+
}

pkg/config/v0/upgrade.go

Lines changed: 0 additions & 5 deletions
This file was deleted.

pkg/config/v1/parse.go

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,72 @@
11
package v1
22

3-
import "github.com/goccy/go-yaml"
3+
import (
4+
"github.com/goccy/go-yaml"
45

5-
func Parse(data []byte) (Config, error) {
6+
"github.com/docker/cagent/pkg/config/types"
7+
previous "github.com/docker/cagent/pkg/config/v0"
8+
)
9+
10+
func Register(parsers map[string]func([]byte) (any, error), upgraders *[]func(any, []byte) (any, error)) {
11+
parsers[Version] = func(d []byte) (any, error) { return parse(d) }
12+
*upgraders = append(*upgraders, upgradeIfNeeded)
13+
}
14+
15+
func parse(data []byte) (Config, error) {
616
var cfg Config
717
err := yaml.UnmarshalWithOptions(data, &cfg, yaml.Strict())
818
return cfg, err
919
}
20+
21+
func upgradeIfNeeded(c any, _ []byte) (any, error) {
22+
old, ok := c.(previous.Config)
23+
if !ok {
24+
return c, nil
25+
}
26+
27+
var config Config
28+
types.CloneThroughJSON(old, &config)
29+
30+
// model.Type --> model.Provider
31+
for name := range old.Models {
32+
oldModel := old.Models[name]
33+
newModel := config.Models[name]
34+
35+
newModel.Provider = oldModel.Type
36+
config.Models[name] = newModel
37+
}
38+
39+
// todo:true --> toolsets: [{type: todo}]
40+
// think:true --> toolsets: [{type: think}]
41+
// memory:{path: PATH} --> toolsets: [{type: memory, path: PATH}]
42+
for name := range old.Agents {
43+
oldAgent := old.Agents[name]
44+
newAgent := config.Agents[name]
45+
46+
var toolsets []Toolset
47+
48+
if oldAgent.Todo.Enabled {
49+
toolsets = append(toolsets, Toolset{
50+
Type: "todo",
51+
Shared: oldAgent.Todo.Shared,
52+
})
53+
}
54+
if oldAgent.Think {
55+
toolsets = append(toolsets, Toolset{
56+
Type: "think",
57+
})
58+
}
59+
if oldAgent.MemoryConfig.Path != "" {
60+
toolsets = append(toolsets, Toolset{
61+
Type: "memory",
62+
Path: oldAgent.MemoryConfig.Path,
63+
})
64+
}
65+
66+
toolsets = append(toolsets, newAgent.Toolsets...)
67+
newAgent.Toolsets = toolsets
68+
config.Agents[name] = newAgent
69+
}
70+
71+
return config, nil
72+
}

pkg/config/v1/upgrade.go

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)