diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index 808d12c07..3f770f90c 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -2817,7 +2817,11 @@ turnLoop: if finalContent == "" { if ts.currentIteration() >= ts.agent.MaxIterations && ts.agent.MaxIterations > 0 { finalContent = toolLimitResponse - } else { + } else if ts.currentIteration() == 0 { + // Only show "empty response" fallback when no tool calls were made. + // If the model executed tool calls but returned empty text afterward, + // the work was already communicated via tool results — sending a + // technical error message to the user is confusing and unhelpful. finalContent = ts.opts.DefaultResponse } } diff --git a/pkg/providers/factory_provider.go b/pkg/providers/factory_provider.go index ab7277fae..291fe3d25 100644 --- a/pkg/providers/factory_provider.go +++ b/pkg/providers/factory_provider.go @@ -342,6 +342,13 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err } return NewCodexCliProvider(workspace), modelID, nil + case "hermes-acp", "hermesacp": + workspace := cfg.Workspace + if workspace == "" { + workspace = "." + } + return NewHermesACPProvider(workspace), modelID, nil + case "github-copilot", "copilot": apiBase := cfg.APIBase if apiBase == "" {