/* * Copyright 2025 CloudWeGo Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package subagents import ( "context" "log" "github.com/cloudwego/eino/components/tool" "github.com/cloudwego/eino/components/tool/utils" "github.com/cloudwego/eino/compose" ) type askForClarificationOptions struct { NewInput *string } func WithNewInput(input string) tool.Option { return tool.WrapImplSpecificOptFn(func(t *askForClarificationOptions) { t.NewInput = &input }) } type AskForClarificationInput struct { Question string `json:"question" jsonschema:"description=The specific question you want to ask the user to get the missing information"` } func NewAskForClarificationTool() tool.InvokableTool { t, err := utils.InferOptionableTool( "ask_for_clarification", "Call this tool when the user's request is ambiguous or lacks the necessary information to proceed. Use it to ask a follow-up question to get the details you need, such as the book's genre, before you can use other tools effectively.", func(ctx context.Context, input *AskForClarificationInput, opts ...tool.Option) (output string, err error) { o := tool.GetImplSpecificOptions[askForClarificationOptions](nil, opts...) if o.NewInput == nil { return "", compose.NewInterruptAndRerunErr(input.Question) } output = *o.NewInput o.NewInput = nil return output, nil }) if err != nil { log.Fatal(err) } return t }