Files
Cyrene_v2/internal/capability/transcode/tool_args.go
T
AskaEth 4a2d276881
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled
feat(capability): 转码能力包(vendor 纯 Go AMR-NB 解码器 + 黄金向量逐样本对照 + 8 哨兵 + 注册面)
2026-10-05 13:02:28 +08:00

57 lines
1.8 KiB
Go

package transcode
import (
"encoding/base64"
"fmt"
)
// 本文件解析工具面入参(sdk.Tool.Execute 的 args)。它与 SDK 的「args 是一个
// JSON 对象」约定对齐:非对象、缺字段、类型不对一律 ErrBadArgs,绝不猜测。
// 参数名在 tool.go 的常量块里统一定义。
// toolRequest 把工具入参解成一次转码请求。
//
// source 可省略(留空 ⇒ 由 engine 按魔数嗅探);data_base64 与 target 必填。
// base64 用标准字母表(与 Execute 输出同一份编码,往返无损)。
func toolRequest(args any) (Request, error) {
m, ok := args.(map[string]any)
if !ok {
return Request{}, fmt.Errorf("transcode: %w: args must be an object", ErrBadArgs)
}
data, err := toolDataArg(m)
if err != nil {
return Request{}, err
}
target := FormatOf(toolStringArg(m, toolArgTarget))
if target == "" {
return Request{}, fmt.Errorf("transcode: %w: missing %s", ErrBadArgs, toolArgTarget)
}
return Request{
Data: data,
Source: FormatOf(toolStringArg(m, toolArgSource)),
Target: target,
}, nil
}
// toolStringArg 读一个字符串字段;字段缺失或不是字符串都算空串。
func toolStringArg(m map[string]any, key string) string {
s, _ := m[key].(string)
return s
}
// toolDataArg 解出源字节:Base64 标准字母表,空串/非法 Base64/空字节都拒。
func toolDataArg(m map[string]any) ([]byte, error) {
raw := toolStringArg(m, toolArgData)
if raw == "" {
return nil, fmt.Errorf("transcode: %w: missing %s", ErrBadArgs, toolArgData)
}
data, err := base64.StdEncoding.DecodeString(raw)
if err != nil {
return nil, fmt.Errorf("transcode: %w: %s is not valid base64: %v", ErrBadArgs, toolArgData, err)
}
if len(data) == 0 {
return nil, fmt.Errorf("transcode: %w: %s decodes to zero bytes", ErrBadArgs, toolArgData)
}
return data, nil
}