fix(reply): force replying without using tools (#131)

Signed-off-by: mudler <mudler@localai.io>
This commit is contained in:
Ettore Di Giacinto
2025-05-05 18:33:53 +02:00
committed by GitHub
parent 5e5224da25
commit 02c6b5ad4e

View File

@@ -818,29 +818,7 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
// At this point can only be a reply action
xlog.Info("Computing reply", "agent", a.Character.Name)
// decode the response
replyResponse := action.ReplyResponse{}
if err := actionParams.Unmarshal(&replyResponse); err != nil {
job.Result.Conversation = conv
job.Result.Finish(fmt.Errorf("error unmarshalling reply response: %w", err))
return
}
// If we have already a reply from the action, just return it.
// Otherwise generate a full conversation to get a proper message response
// if chosenAction.Definition().Name.Is(action.ReplyActionName) {
// replyResponse := action.ReplyResponse{}
// if err := params.actionParams.Unmarshal(&replyResponse); err != nil {
// job.Result.Finish(fmt.Errorf("error unmarshalling reply response: %w", err))
// return
// }
// if replyResponse.Message != "" {
// job.Result.SetResponse(replyResponse.Message)
// job.Result.Finish(nil)
// return
// }
// }
forceResponsePrompt := "Reply to the user without using any tools or function calls. Just reply with the message."
// If we have a hud, display it when answering normally
if a.options.enableHUD {
@@ -856,39 +834,19 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
Role: "system",
Content: prompt,
},
{
Role: "system",
Content: forceResponsePrompt,
},
}, conv...)
}
}
// Generate a human-readable response
// resp, err := a.client.CreateChatCompletion(ctx,
// openai.ChatCompletionRequest{
// Model: a.options.LLMAPI.Model,
// Messages: append(conv,
// openai.ChatCompletionMessage{
// Role: "system",
// Content: "Assistant thought: " + replyResponse.Message,
// },
// ),
// },
// )
if replyResponse.Message != "" {
xlog.Info("Return reply message", "reply", replyResponse.Message, "agent", a.Character.Name)
msg := openai.ChatCompletionMessage{
Role: "assistant",
Content: a.cleanupLLMResponse(replyResponse.Message),
}
conv = append(conv, msg)
job.Result.Conversation = conv
job.Result.SetResponse(msg.Content)
job.Result.AddFinalizer(func(conv []openai.ChatCompletionMessage) {
a.saveCurrentConversation(conv)
})
job.Result.Finish(nil)
return
} else {
conv = append([]openai.ChatCompletionMessage{
{
Role: "system",
Content: forceResponsePrompt,
},
}, conv...)
}
xlog.Info("Reasoning, ask LLM for a reply", "agent", a.Character.Name)
@@ -901,16 +859,22 @@ func (a *Agent) reply(job *types.Job, role string, conv Messages, actionParams t
return
}
// If we didn't got any message, we can use the response from the action
if chosenAction.Definition().Name.Is(action.ReplyActionName) && msg.Content == "" {
xlog.Info("No output returned from conversation, using the action response as a reply " + replyResponse.Message)
msg.Content = a.cleanupLLMResponse(msg.Content)
msg = openai.ChatCompletionMessage{
Role: "assistant",
Content: a.cleanupLLMResponse(replyResponse.Message),
if msg.Content == "" {
// If we didn't got any message, we can use the response from the action (it should be a reply)
replyResponse := action.ReplyResponse{}
if err := actionParams.Unmarshal(&replyResponse); err != nil {
job.Result.Conversation = conv
job.Result.Finish(fmt.Errorf("error unmarshalling reply response: %w", err))
return
}
if chosenAction.Definition().Name.Is(action.ReplyActionName) && replyResponse.Message != "" {
xlog.Info("No output returned from conversation, using the action response as a reply " + replyResponse.Message)
msg.Content = a.cleanupLLMResponse(replyResponse.Message)
}
} else {
msg.Content = a.cleanupLLMResponse(msg.Content)
}
conv = append(conv, msg)