Merge pull request #13 from cheikh2shift/improve-stability

Improve stability
This commit is contained in:
Cheikh Seck authored and GitHub committed 2026-04-04 09:02:31 +00:00
commit bb40b2acbd
5 files changed
+101 -14

No files matched your search

+16 -2
View File
@@ -872,7 +872,7 @@ promptLoop:
if hasFinal {
output = finalResp
} else {
cprompt := fmt.Sprintf("The assistant gave the following response:\n%s\n\nSince there are no tool calls to execute, please provide a final answer based on this response.", resp)
cprompt := fmt.Sprintf("The assistant gave the following response:\n%s\n\nSince there are no tool calls to execute, please provide a final answer based on this response. Don't mention you already provided a previous answer", resp)
fullPrompt = buildContinuePrompt(llmProvider, servers, fullPrompt, cprompt, round+1, maxToolRounds)
continue
}
@@ -1693,6 +1693,16 @@ func getServerNames(servers []MCPServer) []string {
return names
}
func isOllamaPromptTooLong(err error) bool {
if err == nil {
return false
}
msg := err.Error()
return strings.Contains(msg, "ollama responded with 400") &&
strings.Contains(msg, "prompt too long") &&
strings.Contains(msg, "max context length")
}
func runSinglePrompt(ctx context.Context, provider *config.Provider, prompt string, autoConfirm bool, servers []MCPServer) error {
tree, _ := godexcontext.BuildTree(".")
wd, _ := os.Getwd()
@@ -1829,6 +1839,10 @@ func runToolLoop(ctx context.Context, provider *config.Provider, servers []MCPSe
default:
}
if err != nil {
if isOllamaPromptTooLong(err) {
fmt.Println("\n[Ollama] Prompt exceeded the model context limit.")
fmt.Println("Switch to a larger model to continue, or run `/commit`, then `/clear-context`, then `/commit-pull` to resume with a clean context window.")
}
return "", err
}
@@ -1869,7 +1883,7 @@ func runToolLoop(ctx context.Context, provider *config.Provider, servers []MCPSe
}
fmt.Printf("\n[No valid tool calls detected, asking for final answer...]\n")
}
continuePrompt := fmt.Sprintf("You provided the following response:\n%s\n\nHowever, I couldn't find any valid tool calls in it. Please provide your FINAL_ANSWER now based on the information you have. Do NOT call any tools, just provide the final answer.", resp)
continuePrompt := fmt.Sprintf("You provided the following response:\n%s\n\nHowever, I couldn't find any valid tool calls in it. Please provide your FINAL_ANSWER now based on the information you have. Do NOT call any tools, just provide the final answer.Don't mention you already provided a previous answer", resp)
fullPrompt = buildContinuePrompt(llmProvider, servers, input, continuePrompt, round+1, maxToolRounds)
+33 -4
View File
@@ -30,6 +30,7 @@ type ollamaProvider struct {
cfg *config.Provider
temperature *float64
client *http.Client
systemPrompt string
messages []map[string]string
mu sync.Mutex
sendMu sync.Mutex
@@ -217,10 +218,22 @@ func (o *ollamaProvider) Send(ctx context.Context, prompt string) (string, error
defer o.sendMu.Unlock()
o.mu.Lock()
o.messages = append(o.messages, map[string]string{
"role": "user",
"content": prompt,
})
systemPrompt, userInput := splitSystemUserPrompt(prompt)
if systemPrompt != "" {
o.systemPrompt = systemPrompt
}
if o.systemPrompt != "" {
o.ensureSystemMessage(o.systemPrompt)
}
if userInput == "" {
userInput = strings.TrimSpace(prompt)
}
if userInput != "" {
o.messages = append(o.messages, map[string]string{
"role": "user",
"content": userInput,
})
}
ctx, cancel := context.WithCancel(ctx)
o.cancelGen++
@@ -297,6 +310,22 @@ func (o *ollamaProvider) Send(ctx context.Context, prompt string) (string, error
return response, nil
}
func (o *ollamaProvider) ensureSystemMessage(system string) {
if strings.TrimSpace(system) == "" {
return
}
if len(o.messages) > 0 {
if role := o.messages[0]["role"]; role == "system" {
if o.messages[0]["content"] == system {
return
}
o.messages[0]["content"] = system
return
}
}
o.messages = append([]map[string]string{{"role": "system", "content": system}}, o.messages...)
}
type sendResult struct {
response string
totalPromptTokens int
+18 -7
View File
@@ -68,6 +68,7 @@ type openRouterProvider struct {
apiKey string
temperature *float64
client *http.Client
systemPrompt string
messages []map[string]interface{}
pendingToolCalls map[string]string // tool_call_id -> function_name for tracking
tools []map[string]interface{}
@@ -155,15 +156,22 @@ func newOpenRouterProvider(cfg *config.Provider) (Provider, error) {
}
func (p *openRouterProvider) Send(ctx context.Context, prompt string) (string, error) {
// Extract the actual user input from the prompt (everything after "User request:" or "User asked:")
userInput := extractUserInput(prompt)
systemPrompt, userInput := splitSystemUserPrompt(prompt)
if userInput == "" {
userInput = strings.TrimSpace(prompt)
}
p.mu.Lock()
if systemPrompt != "" {
p.systemPrompt = systemPrompt
}
// Track only the user input in history
p.messages = append(p.messages, map[string]interface{}{
"role": "user",
"content": userInput,
})
if userInput != "" {
p.messages = append(p.messages, map[string]interface{}{
"role": "user",
"content": userInput,
})
}
// Sliding window: keep only the last N messages (negative = unlimited)
maxHistory := getMaxHistoryMessages()
if maxHistory > 0 && len(p.messages) > maxHistory {
@@ -173,7 +181,10 @@ func (p *openRouterProvider) Send(ctx context.Context, prompt string) (string, e
copy(messages, p.messages)
p.mu.Unlock()
systemMsg := buildSystemWorkingDirMessage(prompt)
systemMsg := p.systemPrompt
if systemMsg == "" {
systemMsg = buildSystemWorkingDirMessage(prompt)
}
if systemMsg != "" {
messages = prependSystemMessage(messages, systemMsg)
}
+33
View File
@@ -0,0 +1,33 @@
package providers
import "strings"
const (
userRequestMarker = "User request:"
userAskedMarker = "User asked:"
)
func splitSystemUserPrompt(prompt string) (string, string) {
prompt = strings.TrimSpace(prompt)
if prompt == "" {
return "", ""
}
idx := -1
marker := ""
if i := strings.Index(prompt, userRequestMarker); i != -1 {
idx = i
marker = userRequestMarker
}
if i := strings.Index(prompt, userAskedMarker); i != -1 && (idx == -1 || i < idx) {
idx = i
marker = userAskedMarker
}
if idx == -1 {
return "", prompt
}
system := strings.TrimSpace(prompt[:idx])
user := strings.TrimSpace(prompt[idx+len(marker):])
return system, user
}
+1 -1
View File
@@ -192,7 +192,7 @@ func RunWizard(destination string) error {
provider.Description, _ = prompt(reader, "Description", getDefault("description", "This model is red"))
tempStr, _ := prompt(reader, "Temperature (0.0-1.0). The higher the value, the more random the output.", getDefault("temperature", "0.5"))
tempStr, _ := prompt(reader, "Temperature (0.0-1.0). The higher the value, the more random the output.", getDefault("temperature", "0.2"))
if tempStr != "" {
if val, err := strconv.ParseFloat(tempStr, 64); err == nil {
provider.Temperature = &val