From 0e8e082b1aecc1e316b9813aa9249ceba3c81fa0 Mon Sep 17 00:00:00 2001 From: nogueiraguh Date: Wed, 11 Mar 2026 03:20:04 -0300 Subject: [PATCH] feat: auto-resolve GenAI config for consult embeddings endpoint - Build GenAI config from OCI credentials when no genai_configs exist - Uses GPT-4.1 as default model with RAG system prompt - Fixes _call_genai signature (system_prompt via gc dict, not kwarg) --- backend/app.py | 48 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/backend/app.py b/backend/app.py index ca9f313..850f5f2 100644 --- a/backend/app.py +++ b/backend/app.py @@ -3390,24 +3390,46 @@ async def consult_embeddings(req: ConsultQuery, u=Depends(current_user)): # Build context and call GenAI rag_context = _build_rag_context(top_docs) augmented = RAG_CONTEXT_TEMPLATE.format(context=rag_context, question=req.query) - # Get GenAI config for answering + # Get GenAI config for answering — try saved config first, then auto-resolve from OCI + gc = None with db() as c: gc_row = c.execute("SELECT * FROM genai_configs WHERE is_default=1 ORDER BY created_at DESC").fetchone() if not gc_row: gc_row = c.execute("SELECT * FROM genai_configs ORDER BY created_at DESC").fetchone() - if not gc_row: - # No GenAI config — return raw documents formatted as answer - parts = [] - for i, d in enumerate(top_docs, 1): - content = d.get("content", "") - if len(content) > 800: content = content[:800] + "..." - parts.append(f"**Documento {i}** — `{d.get('source', '?')}` (distância: {d.get('distance', 0):.4f})\n\n{content}") - raw_answer = "**Resultados da busca vetorial** (sem GenAI configurado para sumarizar):\n\n---\n\n" + "\n\n---\n\n".join(parts) - doc_list = [{"content": d.get("content", "")[:500], "source": d.get("source", ""), "distance": round(d.get("distance", 0), 4), "metadata": d.get("metadata", "")} for d in top_docs] - return {"answer": raw_answer, "documents": doc_list, "total": len(all_docs)} - gc = dict(gc_row) + if gc_row: + gc = dict(gc_row) + else: + # Auto-resolve: build GenAI config from OCI credentials + default model + try: + resolved = _resolve_embed_config() + gc = { + "oci_config_id": resolved["oci_config_id"], + "endpoint": resolved.get("endpoint", f"https://inference.generativeai.{resolved.get('genai_region','us-ashburn-1')}.oci.oraclecloud.com"), + "compartment_id": resolved.get("compartment_id", ""), + "genai_region": resolved.get("genai_region", "us-ashburn-1"), + "model_id": "openai.gpt-4.1", + "model_ocid": "", + "serving_type": "ON_DEMAND", + "temperature": 0.3, + "max_tokens": 4000, + "top_p": 0.9, + "top_k": 1, + "frequency_penalty": 0, + "presence_penalty": 0, + } + log.info(f"Consult: auto-resolved GenAI config from OCI, model=openai.gpt-4.1") + except Exception as e: + log.warning(f"Consult: no GenAI config available: {e}") + doc_list = [{"content": d.get("content", "")[:500], "source": d.get("source", ""), "distance": round(d.get("distance", 0), 4), "metadata": d.get("metadata", "")} for d in top_docs] + parts = [] + for i, d in enumerate(top_docs, 1): + content = d.get("content", "") + if len(content) > 800: content = content[:800] + "..." + parts.append(f"**Documento {i}** — `{d.get('source', '?')}` (distância: {d.get('distance', 0):.4f})\n\n{content}") + return {"answer": "\n\n---\n\n".join(parts), "documents": doc_list, "total": len(all_docs)} try: - answer, _, _ = _call_genai(gc, [{"role": "user", "content": augmented}], system_prompt=RAG_DEFAULT_SYSTEM_PROMPT) + gc["system_prompt"] = RAG_DEFAULT_SYSTEM_PROMPT + answer, _, _ = _call_genai(gc, augmented) except Exception as e: log.error(f"Consult GenAI error: {e}") answer = f"Erro ao consultar GenAI: {str(e)[:300]}"