Final Code (
generador_desde_ollama.py)import os
import re
import ollama
# 1. Target local model configuration updated to 3b
MODELO_IA = "qwen2.5-coder:3b"
PROMPT_SISTEMA = """
Eres un asistente experto que genera fragmentos exclusivos de código C# listo para usar.
"""
# Using raw string r"" to instantly bypass all Python SyntaxWarning escape sequence bugs
PROMPT_USUARIO = r"""
Necesito que crees un fragmento de código de un bucle 'for' en C# para .NET 10.
El bucle debe contar del 1 al 10.
Dentro del bucle debe hacer exactamente esto:
Console.WriteLine($"Número: {i}");
log.Info($"Número: {i}");
REGLA ESTRICTA: Devuelve ÚNICAMENTE el bloque de código C# del bucle for dentro de un bloque markdown ```csharp ... ```. No escribas introducciones, inicializaciones de log, ni saludos.
"""
print(f"🤖 Conectando a Ollama local usando el modelo: {MODELO_IA}...")
try:
# 2. Call the Ollama local instance
response = ollama.generate(
model=MODELO_IA,
prompt=f"{PROMPT_SISTEMA}\n\n{PROMPT_USUARIO}"
)
respuesta_ia = response['response']
# Calculate execution metrics
tiempo_total = response.get('total_duration', 0) / 1e9
tokens_generados = response.get('eval_count', 0)
velocidad_tokens = tokens_generados / tiempo_total if tiempo_total > 0 else 0
# 3. Print the formatting metrics block
print("\n" + "-"*60)
print(f"⏱️ [Tiempo total de respuesta]: {tiempo_total:.2f} segundos")
print(f"📊 [Velocidad de generación]: {velocidad_tokens:.2f} tokens por segundo")
print("-"*60 + "\n")
# 4. Extract the C# core loop block using regex
match = re.search(r"```csharp(.*?)```", respuesta_ia, re.DOTALL)
if match:
codigo_bucle_csharp = match.group(1).strip()
else:
codigo_bucle_csharp = respuesta_ia.strip()
# 5. Pack 'ReplyFromGoogle.py' with explicit folder management and compilation routines
contenido_reply_script = f"""import os
import subprocess
print("🚀 [ReplyFromGoogle] Iniciando la automatización de la compilación...")
# Paso 1: Crear directorio de ejecución aislado
os.makedirs('./ProyectoDotNet', exist_ok=True)
# Paso 2: Cambiar directorio de contexto para .NET CLI
os.chdir('./ProyectoDotNet')
# Paso 3 y 4: Inicializar proyecto .NET y descargar versión segura mitigando vulnerabilidades NU1902
print("📦 Inicializando proyecto de consola .NET y descargando log4net 3.3.0...")
subprocess.run(['dotnet', 'new', 'console', '--force'], check=True, stdout=subprocess.DEVNULL)
subprocess.run(['dotnet', 'add', 'package', 'log4net', '--version', '3.3.0'], check=True, stdout=subprocess.DEVNULL)
# Paso 5: Escribir Program.cs estructurado con usings fijos al inicio para prevenir error CS1529
codigo_final_csharp = \"\"\"using System;
using System.IO;
using System.Reflection;
using log4net;
using log4net.Config;
using log4net.Appender;
using log4net.Layout;
using log4net.Repository.Hierarchy;
var hierarchy = (Hierarchy)LogManager.GetRepository(Assembly.GetEntryAssembly()!);
var layout = new PatternLayout("%date [%thread] %-5level - %message%newline");
layout.ActivateOptions();
var logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt");
var appender = new FileAppender {{
File = logPath,
AppendToFile = true,
Layout = layout
}};
appender.ActivateOptions();
hierarchy.Root.AddAppender(appender);
hierarchy.Root.Level = log4net.Core.Level.All;
BasicConfigurator.Configure(hierarchy);
ILog log = LogManager.GetLogger(typeof(Program));
// --- Código del Bucle Generado por la IA ---
{codigo_bucle_csharp}
// ------------------------------------------
\"\"\"
with open('Program.cs', 'w', encoding='utf-8') as f:
f.write(codigo_final_csharp)
print("⚡ Compilando y ejecutando el programa .NET...")
resultado = subprocess.run(['dotnet', 'run'], capture_output=True, text=True)
print("\\n--- 🖥️ SALIDA DE LA CONSOLA .NET ---")
print(resultado.stdout)
if resultado.stderr:
print(resultado.stderr)
# Paso 7: Leer y mostrar el archivo de log binario generado en la ruta interna
archivo_log = os.path.join("bin", "Debug", "net10.0", "log.txt")
if os.path.exists(archivo_log):
print("\\n--- 📄 CONTENIDO DEL ARCHIVO LOG LOCAL (log.txt) ---")
with open(archivo_log, "r") as f:
print(f.read())
else:
print("\\n❌ Error: El archivo de log no se generó en la ruta esperada.")
"""
# 6. Save the structural recipe file locally
archivo_salida = "ReplyFromGoogle.py"
with open(archivo_salida, "w", encoding="utf-8") as f:
f.write(contenido_reply_script)
print(f"✨ ¡Éxito! Receta empaquetada de manera segura en: {archivo_salida}")
print(f"Para iniciar la compilación completa de .NET, ejecuta: python3 {archivo_salida}")
except Exception as e:
print(f"❌ Ocurrió un error en el proceso: {e}")
y para llamar
# 1. Download the 3B model inside your Ollama environment
ollama pull qwen2.5-coder:3b
# 2. Clear old run targets
rm -rf ./ProyectoDotNet
rm -f ReplyFromGoogle.py
# 3. Generate the script using the 3B model
python3 generador_desde_ollama.py
# 4. Fire the newly written recipe
python3 ReplyFromGoogle.py
quise inicialmente usar google, pero al crear la API Key iba a cobrar, por eso volvi al modelo local
esta termino siendo la salida.
esta termino siendo la salida.
🤖 Conectando a Ollama local usando el modelo: qwen2.5-coder:3b...
------------------------------------------------------------
⏱️ [Tiempo total de respuesta]: 9.03 segundos
📊 [Velocidad de generación]: 4.65 tokens por segundo
------------------------------------------------------------
✨ ¡Éxito! Receta empaquetada de manera segura en: ReplyFromGoogle.py
Para iniciar la compilación completa de .NET, ejecuta: python3 ReplyFromGoogle.py
🚀 [ReplyFromGoogle] Iniciando la automatización de la compilación...
📦 Inicializando proyecto de consola .NET y descargando log4net 3.3.0...
⚡ Compilando y ejecutando el programa .NET...
--- 🖥️ SALIDA DE LA CONSOLA .NET ---
Número: 1
133 [1] INFO Program (null) - Número: 1
Número: 2
160 [1] INFO Program (null) - Número: 2
Número: 3
160 [1] INFO Program (null) - Número: 3
Número: 4
160 [1] INFO Program (null) - Número: 4
Número: 5
160 [1] INFO Program (null) - Número: 5
Número: 6
160 [1] INFO Program (null) - Número: 6
Número: 7
160 [1] INFO Program (null) - Número: 7
Número: 8
160 [1] INFO Program (null) - Número: 8
Número: 9
160 [1] INFO Program (null) - Número: 9
Número: 10
160 [1] INFO Program (null) - Número: 10
--- 📄 CONTENIDO DEL ARCHIVO LOG LOCAL (log.txt) ---
2026-09-12 03:15:19,729 [1] INFO - Número: 1
2026-09-12 03:15:19,757 [1] INFO - Número: 2
2026-09-12 03:15:19,757 [1] INFO - Número: 3
2026-09-12 03:15:19,757 [1] INFO - Número: 4
2026-09-12 03:15:19,757 [1] INFO - Número: 5
2026-09-12 03:15:19,757 [1] INFO - Número: 6
2026-09-12 03:15:19,757 [1] INFO - Número: 7
2026-09-12 03:15:19,757 [1] INFO - Número: 8
2026-09-12 03:15:19,757 [1] INFO - Número: 9
2026-09-12 03:15:19,757 [1] INFO - Número: 10
No comments:
Post a Comment