from fastapi import FastAPI, Query from pydantic import BaseModel from typing import List, Optional from src.ontology.matcher import ConceptMatcher from src.parser.parser import Parser from src.enrichment.enricher import Enricher from src.prompt_builder.builder import PromptBuilder from src.embeddings.engine import EmbeddingEngine from src.ontology.models import PromptIR from src.knowledge.engine import KnowledgeEngine from src.runtime.onnx_runtime import ONNXEmbeddingEngine app = FastAPI(title="Prompt Compiler API v3.3") # Initialize components ONTOLOGY_DIR = "data/ontology" INDEX_PATH = "data/faiss_indices_onnx" KNOWLEDGE_DB = "data/knowledge/build/knowledge.db" matcher = ConceptMatcher(ONTOLOGY_DIR) knowledge_engine = KnowledgeEngine(KNOWLEDGE_DB) embedding_engine = ONNXEmbeddingEngine(index_dir=INDEX_PATH) embedding_engine.load_index() class CompileRequest(BaseModel): text: str safe_mode: bool = True semantic: bool = True profile: str = "generic" language: str = "es" # Default to 'es' to enable the Always-English translator class CompileResponse(BaseModel): ir: PromptIR prompt: dict @app.post("/compile", response_model=CompileResponse) async def compile_prompt(request: CompileRequest): # Select parser based on semantic flag and language # We create a new parser instance or use a cached one to handle the translation state current_parser = Parser(matcher, embedding_engine=embedding_engine, language=request.language) enricher = Enricher(matcher, knowledge_engine=knowledge_engine) builder = PromptBuilder(profile_name=request.profile) ir = current_parser.parse(request.text, safe_mode=request.safe_mode) ir = enricher.enrich(ir) prompt = builder.build(ir) return CompileResponse(ir=ir, prompt=prompt) @app.get("/health") async def health(): return {"status": "ok"}