Skip to content

Commit f564c67

Browse files
authored
Fix crd agent creation (#169)
* fix-crd-agent-creation * not necessary * remove log * tools are gettable via UI/CLI now * oops
1 parent f133c44 commit f564c67

File tree

14 files changed

+134
-30
lines changed

14 files changed

+134
-30
lines changed

.github/workflows/ci.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ jobs:
5656
cluster_name: kagent
5757

5858
- name: Install Kagent
59-
run: make helm-install
6059
env:
6160
OPENAI_API_KEY: sk-fake-openai-api-key
61+
run: |
62+
make helm-install
63+
kubectl wait --for=condition=Accepted agents.kagent.dev -n kagent --all --timeout=60s
6264
6365
python-test:
6466
runs-on: ubuntu-latest

Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ helm-install: helm-version check-openai-key kind-load-docker-images
8888
helm upgrade --install kagent helm/ \
8989
--namespace kagent \
9090
--create-namespace \
91+
--wait \
9192
--set controller.image.tag=$(CONTROLLER_IMAGE_TAG) \
9293
--set ui.image.tag=$(UI_IMAGE_TAG) \
9394
--set app.image.tag=$(APP_IMAGE_TAG) \

go/autogen/api/types.go

+8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ type Component struct {
1414
Config map[string]interface{} `json:"config"`
1515
}
1616

17+
func (c *Component) ToConfig() (map[string]interface{}, error) {
18+
if c == nil {
19+
return nil, nil
20+
}
21+
22+
return toConfig(c)
23+
}
24+
1725
func MustToConfig(c ComponentConfig) map[string]interface{} {
1826
config, err := c.ToConfig()
1927
if err != nil {

go/autogen/client/tools.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package client
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
func (c *Client) ListTools(userID string) ([]*Tool, error) {
8+
var tools []*Tool
9+
err := c.doRequest("GET", fmt.Sprintf("/tools/?user_id=%s", userID), nil, &tools)
10+
return tools, err
11+
}
12+
13+
func (c *Client) GetTool(provider string, userID string) (*Tool, error) {
14+
allTools, err := c.ListTools(userID)
15+
if err != nil {
16+
return nil, err
17+
}
18+
19+
for _, tool := range allTools {
20+
if tool.Component.Provider == provider {
21+
return tool, nil
22+
}
23+
}
24+
25+
return nil, nil
26+
}

go/autogen/client/types.go

+9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ type Team struct {
1616
Id int `json:"id,omitempty"`
1717
}
1818

19+
type Tool struct {
20+
Id *int `json:"id,omitempty"`
21+
Component api.Component `json:"component"`
22+
CreatedAt *string `json:"created_at,omitempty"`
23+
UpdatedAt *string `json:"updated_at,omitempty"`
24+
UserID *string `json:"user_id,omitempty"`
25+
Version *string `json:"version,omitempty"`
26+
}
27+
1928
type ModelsUsage struct {
2029
PromptTokens int `json:"prompt_tokens"`
2130
CompletionTokens int `json:"completion_tokens"`

go/cli/cmd/kagent/main.go

+14
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,20 @@ Examples:
158158
Func: cli.GetAgentCmd,
159159
})
160160

161+
getCmd.AddCmd(&ishell.Cmd{
162+
Name: "tool",
163+
Aliases: []string{"t", "tools"},
164+
Help: "get a tool.",
165+
LongHelp: `get a tool.
166+
167+
If no resource name is provided, then a list of available resources will be returned.
168+
Examples:
169+
get tool [tool_name]
170+
get tool
171+
`,
172+
Func: cli.GetToolCmd,
173+
})
174+
161175
shell.AddCmd(getCmd)
162176

163177
shell.NotFound(func(c *ishell.Context) {

go/cli/internal/cli/get.go

+35
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,41 @@ func GetSessionCmd(c *ishell.Context) {
117117
}
118118
}
119119

120+
func GetToolCmd(c *ishell.Context) {
121+
var resourceName string
122+
if len(c.Args) > 0 {
123+
resourceName = c.Args[0]
124+
}
125+
client := config.GetClient(c)
126+
cfg := config.GetCfg(c)
127+
if resourceName == "" {
128+
toolList, err := client.ListTools(cfg.UserID)
129+
if err != nil {
130+
c.Printf("Failed to get tools: %v\n", err)
131+
return
132+
}
133+
if err := printTools(toolList); err != nil {
134+
c.Printf("Failed to print tools: %v\n", err)
135+
return
136+
}
137+
}
138+
}
139+
140+
func printTools(tools []*autogen_client.Tool) error {
141+
headers := []string{"#", "ID", "PROVIDER", "LABEL", "CREATED"}
142+
rows := make([][]string, len(tools))
143+
for i, tool := range tools {
144+
rows[i] = []string{
145+
strconv.Itoa(i),
146+
strconv.Itoa(*tool.Id),
147+
tool.Component.Provider,
148+
*tool.Component.Label,
149+
*tool.CreatedAt,
150+
}
151+
}
152+
153+
return printOutput(tools, headers, rows)
154+
}
120155
func printRuns(runs []*autogen_client.Run) error {
121156
headers := []string{"#", "ID", "CONTENT", "MESSAGES", "STATUS", "CREATED"}
122157
rows := make([][]string, len(runs))

go/cli/internal/config/config.go

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77

8+
"github.com/spf13/pflag"
89
"github.com/spf13/viper"
910
)
1011

@@ -31,13 +32,17 @@ func Init() error {
3132
viper.SetConfigFile(configFile)
3233
viper.SetConfigType("yaml")
3334

35+
pflag.StringVar(&configFile, "config", configFile, "config file (default is $HOME/.kagent/config.yaml)")
36+
3437
// Set default values
3538
viper.SetDefault("api_url", "http://localhost:8081/api")
3639
viper.SetDefault("ws_url", "ws://localhost:8081/api/ws")
3740
viper.SetDefault("user_id", "[email protected]")
3841
viper.SetDefault("output_format", "table")
3942
viper.SetDefault("namespace", "kagent")
4043

44+
viper.MustBindEnv("USER_ID")
45+
4146
if err := viper.ReadInConfig(); err != nil {
4247
// If config file doesn't exist, create it with defaults
4348
if _, ok := err.(viper.ConfigFileNotFoundError); ok || os.IsNotExist(err) {

go/controller/api/v1alpha1/autogenagent_types.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type AgentSpec struct {
3232
// +kubebuilder:validation:MinLength=1
3333
SystemMessage string `json:"systemMessage,omitempty"`
3434
// +kubebuilder:validation:MaxItems=20
35-
Tools []Tool `json:"tools,omitempty"`
35+
Tools []*Tool `json:"tools,omitempty"`
3636
}
3737

3838
type Tool struct {

go/controller/api/v1alpha1/zz_generated.deepcopy.go

+6-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

go/controller/internal/autogen/autogen_api_translator.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -369,16 +369,15 @@ func translateAssistantAgent(
369369
if tool.Description != "" {
370370
description = makePtr(tool.Description)
371371
}
372-
tool := &api.Component{
372+
373+
tools = append(tools, &api.Component{
373374
Provider: tool.Provider,
374375
Description: description,
375376
ComponentType: "tool",
376377
Version: makePtr(1),
377378
Config: api.GenericToolConfig(toolConfig),
378379
Label: makePtr(toolLabel),
379-
}
380-
381-
tools = append(tools, tool)
380+
})
382381
}
383382

384383
sysMsgPtr := makePtr(agentSpec.SystemMessage + "\n" + defaultSystemMessageSuffix)
@@ -406,7 +405,7 @@ func translateAssistantAgent(
406405
}, nil
407406
}
408407

409-
func convertToolConfig(config interface{}) (map[string]interface{}, error) {
408+
func convertToolConfig(config map[string]v1alpha1.AnyType) (map[string]interface{}, error) {
410409
// convert to map[string]interface{} to allow kubebuilder schemaless validation
411410
// see https://github.com/kubernetes-sigs/controller-tools/issues/636 for more info
412411
// must unmarshal to interface{} to avoid json.RawMessage
@@ -554,11 +553,12 @@ func addModelClientToConfig(
554553
if *toolConfig == nil {
555554
*toolConfig = make(map[string]interface{})
556555
}
557-
modelClientConfig, err := convertToolConfig(modelClient.Config)
556+
557+
cfg, err := modelClient.ToConfig()
558558
if err != nil {
559559
return err
560560
}
561561

562-
(*toolConfig)["model_client"] = modelClientConfig
562+
(*toolConfig)["model_client"] = cfg
563563
return nil
564564
}

helm/templates/observability-agent.yaml

+7-7
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ spec:
8080
- provider: kagent.tools.k8s.GetAvailableAPIResources
8181
- provider: kagent.tools.prometheus.QueryTool
8282
config:
83-
base_url: {{ .Values.contrib.agents.observability.prometheus.url }}
84-
username: {{ .Values.contrib.agents.observability.prometheus.username }}
85-
password: {{ .Values.contrib.agents.observability.prometheus.password }}
83+
base_url: {{ .Values.contrib.agents.observability.prometheus.url | default "prometheus.kagent:9090" | quote }}
84+
username: {{ .Values.contrib.agents.observability.prometheus.username | default "" | quote }}
85+
password: {{ .Values.contrib.agents.observability.prometheus.password | default "" | quote }}
8686
- provider: kagent.tools.prometheus.GeneratePromQLTool
8787
- provider: kagent.tools.grafana.DashboardManagementTool
8888
config:
89-
base_url: {{ .Values.contrib.agents.observability.grafana.url }}
90-
username: {{ .Values.contrib.agents.observability.grafana.username }}
91-
password: {{ .Values.contrib.agents.observability.grafana.password }}
92-
api_key: {{ .Values.contrib.agents.observability.grafana.apiKey }}
89+
base_url: {{ .Values.contrib.agents.observability.grafana.url | default "grafana.kagent:3000" | quote }}
90+
username: {{ .Values.contrib.agents.observability.grafana.username | default "" | quote }}
91+
password: {{ .Values.contrib.agents.observability.grafana.password | default "" | quote }}
92+
api_key: {{ .Values.contrib.agents.observability.grafana.apiKey | default "" | quote }}
9393
{{- end }}

python/pyproject.toml

+4-4
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ kagent-engine = "kagent.cli:run"
4646
tool_gen = "kagent.tools.utils.tool_gen:main"
4747

4848
[tool.uv.sources]
49-
autogenstudio = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-studio", rev = "21acedd4a97579a2194514746039e2198fe95104" }
50-
autogen-agentchat = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-agentchat", rev = "21acedd4a97579a2194514746039e2198fe95104" }
51-
autogen-ext = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-ext", rev = "21acedd4a97579a2194514746039e2198fe95104" }
52-
autogen-core = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-core", rev = "21acedd4a97579a2194514746039e2198fe95104" }
49+
autogenstudio = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-studio", rev = "2f804d74ff68b2d020fe6b68526c33abecb72c07" }
50+
autogen-agentchat = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-agentchat", rev = "2f804d74ff68b2d020fe6b68526c33abecb72c07" }
51+
autogen-ext = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-ext", rev = "2f804d74ff68b2d020fe6b68526c33abecb72c07" }
52+
autogen-core = { git = "https://github.com/kagent-dev/autogen.git", subdirectory = "python/packages/autogen-core", rev = "2f804d74ff68b2d020fe6b68526c33abecb72c07" }
5353
kagent = { workspace = true }
5454

5555
[tool.ruff]

python/uv.lock

+8-8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)