sdk_generate/internal/prompts/tools/crypt/param_concat.go

92 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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)
}