From 086e4ffdb63b002d3d6549ac3f5a58c15ba9dcdb Mon Sep 17 00:00:00 2001 From: Kujtim Hoxha Date: Fri, 24 Oct 2025 09:50:31 +0200 Subject: [PATCH] fix: prompt prefix --- internal/agent/agent.go | 7 +++++++ internal/agent/common_test.go | 2 +- internal/agent/coordinator.go | 15 +++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/internal/agent/agent.go b/internal/agent/agent.go index a672708c414545b8e61e4d6ece8940e9a7e1c679..d5b0f6487362795d48c70c1600ab1e24a852e7e2 100644 --- a/internal/agent/agent.go +++ b/internal/agent/agent.go @@ -68,6 +68,7 @@ type Model struct { type sessionAgent struct { largeModel Model smallModel Model + systemPromptPrefix string systemPrompt string tools []fantasy.AgentTool sessions session.Service @@ -82,6 +83,7 @@ type sessionAgent struct { type SessionAgentOptions struct { LargeModel Model SmallModel Model + SystemPromptPrefix string SystemPrompt string DisableAutoSummarize bool IsYolo bool @@ -96,6 +98,7 @@ func NewSessionAgent( return &sessionAgent{ largeModel: opts.LargeModel, smallModel: opts.SmallModel, + systemPromptPrefix: opts.SystemPromptPrefix, systemPrompt: opts.SystemPrompt, sessions: opts.Sessions, messages: opts.Messages, @@ -225,6 +228,10 @@ func (a *sessionAgent) Run(ctx context.Context, call SessionAgentCall) (*fantasy } } + if a.systemPromptPrefix != "" { + prepared.Messages = append([]fantasy.Message{fantasy.NewSystemMessage(a.systemPromptPrefix)}, prepared.Messages...) + } + var assistantMsg message.Message assistantMsg, err = a.messages.Create(callContext, call.SessionID, message.CreateMessageParams{ Role: message.Assistant, diff --git a/internal/agent/common_test.go b/internal/agent/common_test.go index 84300cf8cff06bad554af233576896a4bddcf6e6..b266be20852af5bc0eacb336f29fd59943df7439 100644 --- a/internal/agent/common_test.go +++ b/internal/agent/common_test.go @@ -145,7 +145,7 @@ func testSessionAgent(env env, large, small fantasy.LanguageModel, systemPrompt DefaultMaxTokens: 10000, }, } - agent := NewSessionAgent(SessionAgentOptions{largeModel, smallModel, systemPrompt, false, true, env.sessions, env.messages, tools}) + agent := NewSessionAgent(SessionAgentOptions{largeModel, smallModel, "", systemPrompt, false, true, env.sessions, env.messages, tools}) return agent } diff --git a/internal/agent/coordinator.go b/internal/agent/coordinator.go index 2458f3bb0fdf1b089aaa9b312ffea92514223d3e..061d70b85f715ae682ac7adc25a61f5b75dd3ca4 100644 --- a/internal/agent/coordinator.go +++ b/internal/agent/coordinator.go @@ -276,11 +276,12 @@ func (c *coordinator) buildAgent(ctx context.Context, prompt *prompt.Prompt, age return nil, err } + largeProviderCfg, _ := c.cfg.Providers.Get(large.ModelCfg.Provider) tools, err := c.buildTools(ctx, agent) if err != nil { return nil, err } - return NewSessionAgent(SessionAgentOptions{large, small, systemPrompt, c.cfg.Options.DisableAutoSummarize, c.permissions.SkipRequests(), c.sessions, c.messages, tools}), nil + return NewSessionAgent(SessionAgentOptions{large, small, largeProviderCfg.SystemPromptPrefix, systemPrompt, c.cfg.Options.DisableAutoSummarize, c.permissions.SkipRequests(), c.sessions, c.messages, tools}), nil } func (c *coordinator) buildTools(ctx context.Context, agent config.Agent) ([]fantasy.AgentTool, error) { @@ -450,11 +451,17 @@ func (c *coordinator) buildAnthropicProvider(baseURL, apiKey string, headers map break } } - if hasBearerAuth { - apiKey = "" // clear apiKey to avoid using X-Api-Key header - } + + isBearerToken := strings.HasPrefix(apiKey, "Bearer ") var opts []anthropic.Option + if apiKey != "" && !hasBearerAuth { + if isBearerToken { + slog.Debug("API key starts with 'Bearer ', using as Authorization header") + headers["Authorization"] = apiKey + apiKey = "" // clear apiKey to avoid using X-Api-Key header + } + } if apiKey != "" { // Use standard X-Api-Key header