This commit is contained in:
2025-03-31 21:30:54 +02:00
parent d8c9b07a51
commit de4583691c

View File

@@ -7,12 +7,11 @@ import json
pub fn convert_pug(mydir string)! { pub fn convert_pug(mydir string)! {
mut d:=pathlib.get_dir(path: mydir, create:false)! mut d := pathlib.get_dir(path: mydir, create: false)!
list := d.list(regex:[r'.*\.pug$'],include_links:false,files_only:true)! list := d.list(regex: [r'.*\.pug$'], include_links: false, files_only: true)!
for item in list.paths{ for item in list.paths {
convert_pug_file(item.path)! convert_pug_file(item.path)!
} }
} }
// extract_template parses AI response content to extract just the template // extract_template parses AI response content to extract just the template
@@ -87,16 +86,20 @@ pub fn convert_pug_file(myfile string)! {
attempts++ attempts++
mut system_content := texttools.dedent(base_instruction) + "\n" + l.jet() mut system_content := texttools.dedent(base_instruction) + "\n" + l.jet()
// Generate the user prompt based on whether this is initial attempt or retry
mut user_prompt := '' mut user_prompt := ''
// Create different prompts for first attempt vs retries
if attempts == 1 { if attempts == 1 {
// First attempt - use original pug content // First attempt - convert from PUG
user_prompt = texttools.dedent(base_user_prompt) + "\n" + content user_prompt = texttools.dedent(base_user_prompt) + "\n" + content
println('First attempt: Converting from Pug to Jet')
// Print what we're sending to the AI service
println('Sending to OpenAI for conversion:')
println('--------------------------------')
println(content)
println('--------------------------------')
} else { } else {
// Retry - focus on fixing the template errors // Retries - focus on fixing the previous errors
println('Attempt ${attempts}: Retrying with error feedback') println('Attempt ${attempts}: Retrying with error feedback')
user_prompt = ' user_prompt = '
The previous Jet template conversion had the following error: The previous Jet template conversion had the following error:
@@ -106,200 +109,87 @@ pub fn convert_pug_file(myfile string)! {
``` ```
${template} ${template}
``` ```
Please fix the template and try again. Return only the corrected Jet template.'
}
module aitools
import freeflowuniverse.herolib.clients.openai The original pug input was was
import freeflowuniverse.herolib.core.texttools
import freeflowuniverse.herolib.core.pathlib
import json
pub fn convert_pug(mydir string)! {
mut d:=pathlib.get_dir(path: mydir, create:false)!
list := d.list(regex:[r'.*\.pug$'],include_links:false,files_only:true)!
for item in list.paths{
convert_pug_file(item.path)!
}
}
// extract_template parses AI response content to extract just the template
fn extract_template(raw_content string) string {
mut content := raw_content
// First check for </think> tag
if content.contains('</think>') {
content = content.split('</think>')[1].trim_space()
}
// Look for ```jet code block
if content.contains('```jet') {
parts := content.split('```jet')
if parts.len > 1 {
end_parts := parts[1].split('```')
if end_parts.len > 0 {
content = end_parts[0].trim_space()
}
}
} else if content.contains('```') {
// If no ```jet, look for regular ``` code block
parts := content.split('```')
if parts.len >= 2 {
// Take the content between the first set of ```
// This handles both ```content``` and cases where there's only an opening ```
content = parts[1].trim_space()
// If we only see an opening ``` but no closing, cleanup any remaining backticks
// to avoid incomplete formatting markers
if !content.contains('```') {
content = content.replace('`', '')
}
}
}
return content
}
pub fn convert_pug_file(myfile string)! {
println(myfile)
mut content_path := pathlib.get_file(path: myfile, create: false)!
content := content_path.read()!
mut l := loader()
mut client := openai.get()!
base_instruction := '
You are a template language converter. You convert Pug templates to Jet templates.
The target template language, Jet, is defined as follows:
'
base_user_prompt := '
Convert this following Pug template to Jet:
only output the resulting template, no explanation, no steps, just the jet template
'
// Create new file path by replacing .pug extension with .jet
jet_file := myfile.replace('.pug', '.jet')
// We'll retry up to 5 times if validation fails
max_attempts := 5
mut attempts := 0
mut is_valid := false
mut error_message := ''
mut template := ''
for attempts < max_attempts && !is_valid {
attempts++
module aitools
import freeflowuniverse.herolib.clients.openai
import freeflowuniverse.herolib.core.texttools
import freeflowuniverse.herolib.core.pathlib
import json
pub fn convert_pug(mydir string)! {
mut d:=pathlib.get_dir(path: mydir, create:false)!
list := d.list(regex:[r'.*\.pug$'],include_links:false,files_only:true)!
for item in list.paths{
convert_pug_file(item.path)!
}
}
// extract_template parses AI response content to extract just the template
fn extract_template(raw_content string) string {
mut content := raw_content
// First check for </think> tag
if content.contains('</think>') {
content = content.split('</think>')[1].trim_space()
}
// Look for ```jet code block
if content.contains('```jet') {
parts := content.split('```jet')
if parts.len > 1 {
end_parts := parts[1].split('```')
if end_parts.len > 0 {
content = end_parts[0].trim_space()
}
}
} else if content.contains('```') {
// If no ```jet, look for regular ``` code block
parts := content.split('```')
if parts.len >= 2 {
// Take the content between the first set of ```
// This handles both ```content``` and cases where there's only an opening ```
content = parts[1].trim_space()
// If we only see an opening ``` but no closing, cleanup any remaining backticks
// to avoid incomplete formatting markers
if !content.contains('```') {
content = content.replace('`', '')
}
}
}
return content
}
pub fn convert_pug_file(myfile string)! {
println(myfile)
mut content_path := pathlib.get_file(path: myfile, create: false)!
content := content_path.read()!
mut l := loader()
mut client := openai.get()!
base_instruction := '
You are a template language converter. You convert Pug templates to Jet templates.
The target template language, Jet, is defined as follows:
'
base_user_prompt := '
Convert this following Pug template to Jet:
only output the resulting template, no explanation, no steps, just the jet template
'
// Create new file path by replacing .pug extension with .jet
jet_file := myfile.replace('.pug', '.jet')
// We'll retry up to 5 times if validation fails
max_attempts := 5
mut attempts := 0
mut is_valid := false
mut error_message := ''
mut template := ''
for attempts < max_attempts && !is_valid {
attempts++
mut system_content := texttools.dedent(base_instruction) + "\n" + l.jet()
mut user_prompt := texttools.dedent(base_user_prompt) + "\n" + content
// If this is a retry, add the error information to the prompt
if attempts > 1 {
println('Attempt ${attempts}: Retrying with error feedback')
user_prompt = '
The previous template conversion had the following error:
ERROR: ${error_message}
Here was the template that had errors:
``` ```
${template} ${content}
``` ```
Please fix the template and try again. Return only the corrected template. Please fix the template and try again. Learn from feedback and check which jet template was created.
' + user_prompt Return only the corrected Jet template.
Dont send back more information than the fix, make sure its in jet format.
'
// Print what we're sending for the retry
println('Sending to OpenAI for correction:')
println('--------------------------------')
println(user_prompt)
println('--------------------------------')
} }
mut m := openai.Messages{
messages: [
openai.Message{
role: .system
content: system_content
},
openai.Message{
role: .user
content: user_prompt
},
]}
// Create a chat completion request
res := client.chat_completion(msgs: m, model: "deepseek-r1-distill-llama-70b", max_completion_tokens: 64000)!
println("-----")
// Print AI response before extraction
println('Response received from AI:')
println('--------------------------------')
println(res.choices[0].message.content)
println('--------------------------------')
// Extract the template from the AI response
template = extract_template(res.choices[0].message.content)
println('Extracted template:')
println('--------------------------------')
println(template)
println('--------------------------------')
// Validate the template
validation_result := jetvaliditycheck(template) or {
// If validation service is unavailable, we'll just proceed with the template
println('Warning: Template validation service unavailable: ${err}')
break
}
// Check if template is valid
if validation_result.is_valid {
is_valid = true
println('Template validation successful!')
} else {
error_message = validation_result.error
println('Template validation failed: ${error_message}')
}
}
// Report the validation outcome
if is_valid {
println('Successfully converted template after ${attempts} attempt(s)')
// Create the file and write the processed content
println("Converted to: ${jet_file}")
mut jet_path := pathlib.get_file(path: jet_file, create: true)!
jet_path.write(template)!
} else if attempts >= max_attempts {
println('Warning: Could not validate template after ${max_attempts} attempts')
println('Using best attempt despite validation errors: ${error_message}')
jet_file2:=jet_file.replace(".jet","_error.jet")
mut jet_path2 := pathlib.get_file(path: jet_file2, create: true)!
jet_path2.write(template)!
exit(0)
}
}