USAMA BHATTI
Feat: Added Visual Search, API Key Auth, and Docker Optimization
ba2fc46
# backend/src/services/tools/cms_agent.py
import json
from langchain.agents import create_agent
from backend.src.services.llm.factory import get_llm_model
from backend.src.services.tools.cms_tool import CMSQueryTool
from typing import Optional, Dict
# --- THE CMS EXPERT PROMPT (ANTI-YAP VERSION 🤐) ---
CMS_SYSTEM_PROMPT = """You are a Sanity GROQ Query Generator.
Your goal is to query the database based on the user's request.
--- KNOWLEDGE BASE (SCHEMA) ---
{schema_map}
--- RULES (READ CAREFULLY) ---
1. **NO EXPLANATIONS:** Do NOT say "Here is the query" or "I will search for...".
2. **JUST THE QUERY:** Directly call the 'cms_query_tool' with the GROQ string.
3. **USE THE SCHEMA:** Look at the schema map above. If `price` is inside `variants`, use `variants[].price`.
4. **SYNTAX:** `*[_type == "product" && title match "Blue*"]`
--- ERROR HANDLING ---
If the query fails or returns empty, just say: "No products found matching your criteria."
Do NOT make up fake products from Amazon or other websites.
User Input: {input}
"""
# --- AGENT ADAPTER ---
class AgentAdapter:
def __init__(self, agent):
self.agent = agent
async def ainvoke(self, input_dict):
# Hum input ko thoda modify karke bhejenge taake AI focus kare
user_text = input_dict.get("input", "")
# Force instruction appended to user query
strict_input = f"{user_text} (Return ONLY the GROQ query tool call. Do not explain.)"
payload = {"messages": [("user", strict_input)]}
result = await self.agent.ainvoke(payload)
last_message = result["messages"][-1]
return {"output": last_message.content}
# --- DYNAMIC AGENT FACTORY ---
def get_cms_agent(
user_id: str,
schema_map: dict,
llm_credentials: Optional[Dict[str, str]] = None
):
# 1. Load User's LLM
llm = get_llm_model(credentials=llm_credentials)
# 2. Initialize Tool
tool = CMSQueryTool(user_id=str(user_id))
tools = [tool]
# Convert schema to string
schema_str = json.dumps(schema_map, indent=2)
# 3. Create Agent
agent_runnable = create_agent(
model=llm,
tools=tools,
system_prompt=CMS_SYSTEM_PROMPT.format(schema_map=schema_str, input="{input}")
)
return AgentAdapter(agent_runnable)