|  | using System;
 | 
						
						
						
							|  | using System.Collections.Generic;
 | 
						
						
						
							|  | using System.IO;
 | 
						
						
						
							|  | using System.Text.Json;
 | 
						
						
						
							|  | using System.Text.Json.Nodes;
 | 
						
						
						
							|  | using System.Text.Json.Serialization;
 | 
						
						
						
							|  | using System.Threading.Tasks;
 | 
						
						
						
							|  | using Microsoft.AspNetCore.Builder;
 | 
						
						
						
							|  | using Microsoft.AspNetCore.Http;
 | 
						
						
						
							|  | using Microsoft.Extensions.FileProviders;
 | 
						
						
						
							|  | using Microsoft.Extensions.Hosting;
 | 
						
						
						
							|  | using AISApp;
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  | namespace AISApp
 | 
						
						
						
							|  | {
 | 
						
						
						
							|  |     internal static class ProgramEntry
 | 
						
						
						
							|  |     {
 | 
						
						
						
							|  |         // Minimal REST server + static file serving
 | 
						
						
						
							|  |         private sealed class ChatInput
 | 
						
						
						
							|  |         {
 | 
						
						
						
							|  |             [JsonPropertyName("message")] public string? Message { get; set; }
 | 
						
						
						
							|  |         }
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |         public static async Task Main(string[] args)
 | 
						
						
						
							|  |         {
 | 
						
						
						
							|  |             var builder = WebApplication.CreateBuilder(args);
 | 
						
						
						
							|  |             var app = builder.Build();
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             // Prepare static directory (relative to app base)
 | 
						
						
						
							|  |             var staticRoot = Path.Combine(builder.Environment.ContentRootPath, "static");
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             if (!Directory.Exists(staticRoot)) Directory.CreateDirectory(staticRoot);
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             // Serve index.html at "/" and other assets from /static
 | 
						
						
						
							|  |             var fileProvider = new PhysicalFileProvider(staticRoot);
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             var defaultFiles = new DefaultFilesOptions
 | 
						
						
						
							|  |             {
 | 
						
						
						
							|  |                 FileProvider = fileProvider,
 | 
						
						
						
							|  |                 RequestPath = ""
 | 
						
						
						
							|  |             };
 | 
						
						
						
							|  |             defaultFiles.DefaultFileNames.Clear();
 | 
						
						
						
							|  |             defaultFiles.DefaultFileNames.Add("index.html");
 | 
						
						
						
							|  |             app.UseDefaultFiles(defaultFiles);
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             app.UseStaticFiles(new StaticFileOptions
 | 
						
						
						
							|  |             {
 | 
						
						
						
							|  |                 FileProvider = fileProvider,
 | 
						
						
						
							|  |                 RequestPath = ""
 | 
						
						
						
							|  |             });
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             // Load system message from prompt.txt
 | 
						
						
						
							|  |             string systemMessage = System.IO.File.ReadAllText("prompt.txt");
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             // Single AIS instance for the app
 | 
						
						
						
							|  |             var ai = new AIS(model: "gemma", safeMode: false, systemMessage: systemMessage);
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             // Minimal chat endpoint
 | 
						
						
						
							|  |             app.MapPost("/api/chat", async (HttpContext ctx) =>
 | 
						
						
						
							|  |             {
 | 
						
						
						
							|  |                 try
 | 
						
						
						
							|  |                 {
 | 
						
						
						
							|  |                     var input = await JsonSerializer.DeserializeAsync<ChatInput>(ctx.Request.Body);
 | 
						
						
						
							|  |                     var prompt = input?.Message ?? string.Empty;
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |                     var result = await ai.ChatAsync(prompt);
 | 
						
						
						
							|  |                     object replyPayload = result is JsonNode jn ? jn : (object)(result?.ToString() ?? "");
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |                     await ctx.Response.WriteAsJsonAsync(new { ok = true, reply = replyPayload });
 | 
						
						
						
							|  |                 }
 | 
						
						
						
							|  |                 catch (Exception ex)
 | 
						
						
						
							|  |                 {
 | 
						
						
						
							|  |                     ctx.Response.StatusCode = 400;
 | 
						
						
						
							|  |                     await ctx.Response.WriteAsJsonAsync(new { ok = false, error = ex.Message });
 | 
						
						
						
							|  |                 }
 | 
						
						
						
							|  |             });
 | 
						
						
						
							|  | 
 | 
						
						
						
							|  |             await app.RunAsync();
 | 
						
						
						
							|  |         }
 | 
						
						
						
							|  |     }
 | 
						
						
						
							|  | }
 |