fix: prompt prefix

Kujtim Hoxha created

Change summary

internal/agent/agent.go       |  7 +++++++
internal/agent/common_test.go |  2 +-
internal/agent/coordinator.go | 15 +++++++++++----
3 files changed, 19 insertions(+), 5 deletions(-)

Detailed changes

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,

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
 }
 

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