Friday, September 11, 2026

codigo python para crear solucion local en dotnet

Estoy probando que el sistema cree solo el codigo.

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.

🤖 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