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)
This commit is contained in:
@@ -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]}"
|
||||
|
||||
Reference in New Issue
Block a user