// param_concat.go package crypt import ( "context" "github.com/sashabaranov/go-openai" "github.com/sashabaranov/go-openai/jsonschema" ) type ParamConcatTool struct{} func (t *ParamConcatTool) Name() string { return "param_concat" } func (t *ParamConcatTool) Description() string { return "参数拼接规范。生成签名或加密前的参数拼接规则,包含字典序排序、空值处理、嵌套对象展开等" } func (t *ParamConcatTool) GetFunctionDefinition() openai.FunctionDefinition { return openai.FunctionDefinition{ Name: t.Name(), Description: t.Description(), Parameters: jsonschema.Definition{ Type: jsonschema.Object, Properties: map[string]jsonschema.Definition{}, Required: []string{}, }, } } func (t *ParamConcatTool) GetDetail(ctx context.Context, params map[string]string) (string, error) { return ` ### 参数拼接规范 **常见拼接方式**: 1. **字典序排序**:按key字典序排序后拼接 ` + "`key=value&key2=value2`" + ` 2. **固定顺序**:按文档指定顺序拼接 3. **JSON字符串**:整个请求体作为签名串 **代码模板**: ` + "```go" + ` package crypto import ( "fmt" "sort" "strings" ) // BuildSignString 方式1:字典序排序拼接 func BuildSignString(params map[string]string) string { keys := make([]string, 0, len(params)) for k, v := range params { if v != "" && k != "sign" && k != "signature" { keys = append(keys, k) } } sort.Strings(keys) var parts []string for _, k := range keys { parts = append(parts, fmt.Sprintf("%s=%s", k, params[k])) } return strings.Join(parts, "&") } // BuildSignStringOrdered 方式2:固定顺序拼接 func BuildSignStringOrdered(params map[string]string, orderedKeys []string) string { var parts []string for _, k := range orderedKeys { if v, ok := params[k]; ok && v != "" { parts = append(parts, fmt.Sprintf("%s=%s", k, v)) } } return strings.Join(parts, "&") } ` + "```" + ` **注意事项**: - 确认文档指定的排序规则(字典序/固定顺序) - 确认空值是否要包含(通常排除空值) - 确认是否需要URL编码 - 注意排除签名字段本身 `, nil } func (t *ParamConcatTool) Execute(ctx context.Context, params map[string]string) (string, error) { return t.GetDetail(ctx, params) }