parseInterruptConfig 解析审核配置
(toolName string, cfg any)
| 117 | |
| 118 | // parseInterruptConfig 解析审核配置 |
| 119 | func (m *HumanInTheLoopMiddleware) parseInterruptConfig(toolName string, cfg any) *InterruptConfig { |
| 120 | switch v := cfg.(type) { |
| 121 | case bool: |
| 122 | if !v { |
| 123 | return nil // 禁用审核 |
| 124 | } |
| 125 | // 启用默认审核配置 |
| 126 | return &InterruptConfig{ |
| 127 | Enabled: true, |
| 128 | AllowedDecisions: m.defaultAllowedDecisions, |
| 129 | Message: fmt.Sprintf("Tool '%s' requires approval before execution", toolName), |
| 130 | } |
| 131 | |
| 132 | case map[string]any: |
| 133 | // 自定义配置 |
| 134 | interruptCfg := &InterruptConfig{ |
| 135 | Enabled: true, |
| 136 | } |
| 137 | |
| 138 | // 解析 allowed_decisions |
| 139 | if decisions, ok := v["allowed_decisions"].([]any); ok { |
| 140 | interruptCfg.AllowedDecisions = make([]DecisionType, 0, len(decisions)) |
| 141 | for _, d := range decisions { |
| 142 | if ds, ok := d.(string); ok { |
| 143 | interruptCfg.AllowedDecisions = append(interruptCfg.AllowedDecisions, DecisionType(ds)) |
| 144 | } |
| 145 | } |
| 146 | } |
| 147 | if len(interruptCfg.AllowedDecisions) == 0 { |
| 148 | interruptCfg.AllowedDecisions = m.defaultAllowedDecisions |
| 149 | } |
| 150 | |
| 151 | // 解析 message |
| 152 | if msg, ok := v["message"].(string); ok { |
| 153 | interruptCfg.Message = msg |
| 154 | } else { |
| 155 | interruptCfg.Message = fmt.Sprintf("Tool '%s' requires approval before execution", toolName) |
| 156 | } |
| 157 | |
| 158 | return interruptCfg |
| 159 | |
| 160 | case *InterruptConfig: |
| 161 | return v |
| 162 | |
| 163 | default: |
| 164 | hitlLog.Warn(context.Background(), "invalid interrupt config", map[string]any{"tool": toolName, "type": fmt.Sprintf("%T", cfg)}) |
| 165 | return nil |
| 166 | } |
| 167 | } |
| 168 | |
| 169 | // WrapToolCall 拦截工具调用,请求人工审核 |
| 170 | func (m *HumanInTheLoopMiddleware) WrapToolCall(ctx context.Context, req *ToolCallRequest, handler ToolCallHandler) (*ToolCallResponse, error) { |
no test coverage detected