in pkg/agent/conversation.go [68:117]
func (s *Conversation) Init(ctx context.Context, doc *ui.Document) error {
log := klog.FromContext(ctx)
// Create a temporary working directory
workDir, err := os.MkdirTemp("", "agent-workdir-*")
if err != nil {
log.Error(err, "Failed to create temporary working directory")
return err
}
log.Info("Created temporary working directory", "workDir", workDir)
systemPrompt, err := s.generatePrompt(ctx, defaultSystemPromptTemplate, PromptData{
Tools: s.Tools,
EnableToolUseShim: s.EnableToolUseShim,
})
if err != nil {
return fmt.Errorf("generating system prompt: %w", err)
}
// Start a new chat session
s.llmChat = gollm.NewRetryChat(
s.LLM.StartChat(systemPrompt, s.Model),
gollm.RetryConfig{
MaxAttempts: 3,
InitialBackoff: 10 * time.Second,
MaxBackoff: 60 * time.Second,
BackoffFactor: 2,
Jitter: true,
},
)
if !s.EnableToolUseShim {
var functionDefinitions []*gollm.FunctionDefinition
for _, tool := range s.Tools.AllTools() {
functionDefinitions = append(functionDefinitions, tool.FunctionDefinition())
}
// Sort function definitions to help KV cache reuse
sort.Slice(functionDefinitions, func(i, j int) bool {
return functionDefinitions[i].Name < functionDefinitions[j].Name
})
if err := s.llmChat.SetFunctionDefinitions(functionDefinitions); err != nil {
return fmt.Errorf("setting function definitions: %w", err)
}
}
s.workDir = workDir
s.doc = doc
return nil
}