Skip to content

Commit b00500e

Browse files
authored
Merge pull request #7 from tornado404/opencode/tidy-panda
fix: multiple bug fixes for URL, JSON parsing, and API parameters
2 parents 646d348 + 02eedba commit b00500e

File tree

4 files changed

+452
-370
lines changed

4 files changed

+452
-370
lines changed

oho/cmd/configcmd/config.go

Lines changed: 179 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -21,147 +21,186 @@ var Cmd = &cobra.Command{
2121
}
2222

2323
var (
24-
getCmd = &cobra.Command{
25-
Use: "get",
26-
Short: "获取配置",
27-
RunE: func(cmd *cobra.Command, args []string) error {
28-
c := client.NewClient()
29-
ctx := context.Background()
30-
31-
resp, err := c.Get(ctx, "/config")
32-
if err != nil {
33-
return err
34-
}
35-
36-
var cfg types.Config
37-
if err := json.Unmarshal(resp, &cfg); err != nil {
38-
return err
39-
}
40-
41-
if config.Get().JSON {
42-
data, _ := json.MarshalIndent(cfg, "", " ")
43-
fmt.Println(string(data))
44-
return nil
45-
}
46-
47-
fmt.Println("当前配置:")
48-
fmt.Printf(" 默认模型:%s\n", cfg.DefaultModel)
49-
fmt.Printf(" 主题:%s\n", cfg.Theme)
50-
fmt.Printf(" 语言:%s\n", cfg.Language)
51-
fmt.Printf(" 最大 Token:%d\n", cfg.MaxTokens)
52-
fmt.Printf(" 温度:%.2f\n", cfg.Temperature)
53-
if len(cfg.AutoApprove) > 0 {
54-
fmt.Printf(" 自动批准:%s\n", strings.Join(cfg.AutoApprove, ", "))
55-
}
56-
return nil
57-
},
58-
}
59-
60-
setCmd = &cobra.Command{
61-
Use: "set",
62-
Short: "更新配置",
63-
RunE: func(cmd *cobra.Command, args []string) error {
64-
c := client.NewClient()
65-
ctx := context.Background()
66-
67-
// 构建更新请求
68-
updates := make(map[string]interface{})
69-
70-
if theme != "" {
71-
updates["theme"] = theme
72-
}
73-
if language != "" {
74-
updates["language"] = language
75-
}
76-
if defaultModel != "" {
77-
updates["defaultModel"] = defaultModel
78-
}
79-
if maxTokens > 0 {
80-
updates["maxTokens"] = maxTokens
81-
}
82-
if temperature > 0 {
83-
updates["temperature"] = temperature
84-
}
85-
if len(autoApprove) > 0 {
86-
updates["autoApprove"] = autoApprove
87-
}
88-
89-
if len(updates) == 0 {
90-
return fmt.Errorf("请提供至少一个要更新的配置项")
91-
}
92-
93-
resp, err := c.Patch(ctx, "/config", updates)
94-
if err != nil {
95-
return err
96-
}
97-
98-
var cfg types.Config
99-
if err := json.Unmarshal(resp, &cfg); err != nil {
100-
return err
101-
}
102-
103-
fmt.Println("配置已更新")
104-
return nil
105-
},
106-
}
107-
108-
providersCmd = &cobra.Command{
109-
Use: "providers",
110-
Short: "列出提供商和默认模型",
111-
RunE: func(cmd *cobra.Command, args []string) error {
112-
c := client.NewClient()
113-
ctx := context.Background()
114-
115-
resp, err := c.Get(ctx, "/config/providers")
116-
if err != nil {
117-
return err
118-
}
119-
120-
var result struct {
121-
Providers []types.Provider `json:"providers"`
122-
Default map[string]string `json:"default"`
123-
}
124-
if err := json.Unmarshal(resp, &result); err != nil {
125-
return err
126-
}
127-
128-
if config.Get().JSON {
129-
data, _ := json.MarshalIndent(result, "", " ")
130-
fmt.Println(string(data))
131-
return nil
132-
}
133-
134-
fmt.Println("可用提供商:")
135-
for _, p := range result.Providers {
136-
fmt.Printf(" - %s (%s)\n", p.Name, p.ID)
137-
}
138-
139-
fmt.Println("\n默认模型:")
140-
for provider, model := range result.Default {
141-
fmt.Printf(" %s: %s\n", provider, model)
142-
}
143-
144-
return nil
145-
},
146-
}
147-
148-
theme string
149-
language string
150-
defaultModel string
151-
maxTokens int
152-
temperature float64
153-
autoApprove []string
24+
getCmd = &cobra.Command{
25+
Use: "get",
26+
Short: "获取配置",
27+
RunE: func(cmd *cobra.Command, args []string) error {
28+
c := client.NewClient()
29+
ctx := context.Background()
30+
31+
resp, err := c.Get(ctx, "/config")
32+
if err != nil {
33+
return err
34+
}
35+
36+
var cfg types.Config
37+
if err := json.Unmarshal(resp, &cfg); err != nil {
38+
return fmt.Errorf("解析配置失败:%w", err)
39+
}
40+
41+
if config.Get().JSON {
42+
data, _ := json.MarshalIndent(cfg, "", " ")
43+
fmt.Println(string(data))
44+
return nil
45+
}
46+
47+
fmt.Println("当前配置:")
48+
fmt.Printf(" 默认模型:%s\n", cfg.DefaultModel)
49+
fmt.Printf(" 主题:%s\n", cfg.Theme)
50+
fmt.Printf(" 语言:%s\n", cfg.Language)
51+
fmt.Printf(" 最大 Token:%d\n", cfg.MaxTokens)
52+
fmt.Printf(" 温度:%.2f\n", cfg.Temperature)
53+
if len(cfg.AutoApprove) > 0 {
54+
fmt.Printf(" 自动批准:%s\n", strings.Join(cfg.AutoApprove, ", "))
55+
}
56+
return nil
57+
},
58+
}
59+
60+
setCmd = &cobra.Command{
61+
Use: "set",
62+
Short: "更新配置",
63+
RunE: func(cmd *cobra.Command, args []string) error {
64+
c := client.NewClient()
65+
ctx := context.Background()
66+
67+
// 构建更新请求
68+
updates := make(map[string]interface{})
69+
70+
if theme != "" {
71+
updates["theme"] = theme
72+
}
73+
if language != "" {
74+
updates["language"] = language
75+
}
76+
if defaultModel != "" {
77+
updates["defaultModel"] = defaultModel
78+
}
79+
if maxTokens > 0 {
80+
updates["maxTokens"] = maxTokens
81+
}
82+
if temperature > 0 {
83+
updates["temperature"] = temperature
84+
}
85+
if len(autoApprove) > 0 {
86+
updates["autoApprove"] = autoApprove
87+
}
88+
89+
if len(updates) == 0 {
90+
return fmt.Errorf("请提供至少一个要更新的配置项")
91+
}
92+
93+
resp, err := c.Patch(ctx, "/config", updates)
94+
if err != nil {
95+
return err
96+
}
97+
98+
var cfg types.Config
99+
if err := json.Unmarshal(resp, &cfg); err != nil {
100+
return fmt.Errorf("解析响应失败:%w", err)
101+
}
102+
103+
fmt.Println("配置已更新")
104+
return nil
105+
},
106+
}
107+
108+
providersCmd = &cobra.Command{
109+
Use: "providers",
110+
Short: "列出提供商和默认模型",
111+
RunE: func(cmd *cobra.Command, args []string) error {
112+
c := client.NewClient()
113+
ctx := context.Background()
114+
115+
resp, err := c.Get(ctx, "/config/providers")
116+
if err != nil {
117+
return err
118+
}
119+
120+
// 尝试多种 JSON 结构
121+
var providers []types.Provider
122+
var defaultMap map[string]string
123+
124+
// 尝试解析为完整结构
125+
var result1 struct {
126+
Providers []types.Provider `json:"providers"`
127+
Default map[string]string `json:"default"`
128+
}
129+
if err := json.Unmarshal(resp, &result1); err == nil {
130+
providers = result1.Providers
131+
defaultMap = result1.Default
132+
} else {
133+
// 尝试解析为 map
134+
var result2 map[string]interface{}
135+
if err := json.Unmarshal(resp, &result2); err == nil {
136+
if v, ok := result2["providers"].([]interface{}); ok {
137+
for _, item := range v {
138+
if data, err := json.Marshal(item); err == nil {
139+
var p types.Provider
140+
if err := json.Unmarshal(data, &p); err == nil {
141+
providers = append(providers, p)
142+
}
143+
}
144+
}
145+
}
146+
if v, ok := result2["default"].(map[string]interface{}); ok {
147+
defaultMap = make(map[string]string)
148+
for k, val := range v {
149+
if s, ok := val.(string); ok {
150+
defaultMap[k] = s
151+
}
152+
}
153+
}
154+
} else {
155+
// 尝试直接解析为 providers 数组
156+
if err := json.Unmarshal(resp, &providers); err != nil {
157+
return fmt.Errorf("解析提供商列表失败:%w", err)
158+
}
159+
}
160+
}
161+
162+
if config.Get().JSON {
163+
data, _ := json.MarshalIndent(map[string]interface{}{
164+
"providers": providers,
165+
"default": defaultMap,
166+
}, "", " ")
167+
fmt.Println(string(data))
168+
return nil
169+
}
170+
171+
fmt.Println("可用提供商:")
172+
for _, p := range providers {
173+
fmt.Printf(" - %s (%s)\n", p.Name, p.ID)
174+
}
175+
176+
if len(defaultMap) > 0 {
177+
fmt.Println("\n默认模型:")
178+
for provider, model := range defaultMap {
179+
fmt.Printf(" %s: %s\n", provider, model)
180+
}
181+
}
182+
183+
return nil
184+
},
185+
}
186+
187+
theme string
188+
language string
189+
defaultModel string
190+
maxTokens int
191+
temperature float64
192+
autoApprove []string
154193
)
155194

156195
func init() {
157-
Cmd.AddCommand(getCmd)
158-
Cmd.AddCommand(setCmd)
159-
Cmd.AddCommand(providersCmd)
160-
161-
setCmd.Flags().StringVar(&theme, "theme", "", "主题名称")
162-
setCmd.Flags().StringVar(&language, "language", "", "语言设置")
163-
setCmd.Flags().StringVar(&defaultModel, "model", "", "默认模型")
164-
setCmd.Flags().IntVar(&maxTokens, "max-tokens", 0, "最大 Token 数")
165-
setCmd.Flags().Float64Var(&temperature, "temperature", 0, "温度参数")
166-
setCmd.Flags().StringSliceVar(&autoApprove, "auto-approve", nil, "自动批准的工具列表")
196+
Cmd.AddCommand(getCmd)
197+
Cmd.AddCommand(setCmd)
198+
Cmd.AddCommand(providersCmd)
199+
200+
setCmd.Flags().StringVar(&theme, "theme", "", "主题名称")
201+
setCmd.Flags().StringVar(&language, "language", "", "语言设置")
202+
setCmd.Flags().StringVar(&defaultModel, "model", "", "默认模型")
203+
setCmd.Flags().IntVar(&maxTokens, "max-tokens", 0, "最大 Token 数")
204+
setCmd.Flags().Float64Var(&temperature, "temperature", 0, "温度参数")
205+
setCmd.Flags().StringSliceVar(&autoApprove, "auto-approve", nil, "自动批准的工具列表")
167206
}

0 commit comments

Comments
 (0)