92 lines
2.4 KiB
Go
92 lines
2.4 KiB
Go
// 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)
|
||
}
|