71 lines
2.4 KiB
V
71 lines
2.4 KiB
V
module escalayer
|
|
|
|
import log
|
|
import freeflowuniverse.herolib.clients.openai
|
|
|
|
// UnitTask represents a single step in the task
|
|
pub struct UnitTask {
|
|
pub mut:
|
|
name string
|
|
prompt_function fn(string) string
|
|
callback_function fn(string)! string
|
|
base_model ModelConfig
|
|
retry_model ModelConfig
|
|
retry_count int
|
|
}
|
|
|
|
// Execute the unit task
|
|
pub fn (mut ut UnitTask) execute(input string)! string {
|
|
// Generate the prompt using the prompt function
|
|
prompt := ut.prompt_function(input)
|
|
|
|
// Try with the base model first
|
|
mut current_model := ut.base_model
|
|
mut attempts := 0
|
|
mut max_attempts := ut.retry_count + 1 // +1 for the initial attempt
|
|
mut absolute_max_attempts := 1 // Hard limit on total attempts
|
|
mut last_error := ''
|
|
|
|
for attempts < max_attempts && attempts < absolute_max_attempts {
|
|
attempts++
|
|
|
|
// If we've exhausted retries with the base model, switch to the retry model
|
|
if attempts > ut.retry_count {
|
|
log.error('Escalating to more powerful model: ${ut.retry_model.name}')
|
|
current_model = ut.retry_model
|
|
// Calculate remaining attempts but don't exceed absolute max
|
|
max_attempts = attempts + ut.retry_count
|
|
if max_attempts > absolute_max_attempts {
|
|
max_attempts = absolute_max_attempts
|
|
}
|
|
}
|
|
|
|
log.error('Attempt ${attempts} with model ${current_model.name}')
|
|
|
|
// Prepare the prompt with error feedback if this is a retry
|
|
mut current_prompt := prompt
|
|
if last_error != '' {
|
|
current_prompt = 'Previous attempt failed with error: ${last_error}\n\n${prompt}'
|
|
}
|
|
|
|
// Call the AI model
|
|
response := call_ai_model(current_prompt, current_model) or {
|
|
log.error('AI call failed: ${err}')
|
|
last_error = err.str()
|
|
continue // Try again
|
|
}
|
|
|
|
// Process the response with the callback function
|
|
result := ut.callback_function(response) or {
|
|
// If callback returns an error, retry with the error message
|
|
log.error('Callback returned error: ${err}')
|
|
last_error = err.str()
|
|
continue // Try again
|
|
}
|
|
|
|
// If we get here, the callback was successful
|
|
return result
|
|
}
|
|
|
|
return error('Failed to execute unit task after ${attempts} attempts. Last error: ${last_error}')
|
|
} |