Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions changai/changai/api/v2/ai_translate.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import anthropic
import frappe
from frappe import _
from anthropic import Anthropic
Expand All @@ -7,11 +8,12 @@ def get_meta(doc:str):
return frappe.get_meta(doc)
def get_doctype(doc:str,docname: str):
return frappe.get_doc(doc, docname)
def get_settings(doc:str):
def get_settings():
return frappe.get_single("ChangAI Settings")

@frappe.whitelist(allow_guest=False)
def translate_and_store(docname: str, doctype: str, from_field: str, to_field: str, text: str, to_language: str): """
def translate_and_store(docname: str, doctype: str, from_field: str, to_field: str, text: str, to_language: str):
"""
Translates text and stores it in a dynamically created field
"""
meta = get_meta(doctype)
Expand All @@ -23,7 +25,7 @@ def translate_and_store(docname: str, doctype: str, from_field: str, to_field: s
)
if not text:
frappe.throw(_("No text to translate"))
settings = get_settings(doctype)
settings = get_settings()
try:
api_key = settings.claude_api_key
except Exception:
Expand All @@ -43,11 +45,11 @@ def translate_and_store(docname: str, doctype: str, from_field: str, to_field: s
try:
client = Anthropic(api_key=api_key)
prompt = f"""
Translate the following text into {to_language}.
Return ONLY the translated text.
Text:
{text}
"""
Translate the following text into {to_language}.
Return ONLY the translated text.
Text:
{text}
"""
response = client.messages.create(
model="claude-3-haiku-20240307",
max_tokens=1024,
Expand Down
1 change: 1 addition & 0 deletions changai/changai/api/v2/auto_gen_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ def update_masterdata():
"message":"Master Data update running in RQ Job"
}


def sync_master_data_smart() -> Dict[str, Any]:
file_name = "master_data.yaml"
payload = _read_filedoctype(file_name, RAG_FOLDER)
Expand Down
26 changes: 24 additions & 2 deletions changai/changai/api/v2/schema_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import yaml
from pathlib import Path


def _safe_join(base: Path, rel: str) -> Path:
"""
Prevent path traversal. Only allow reading inside base directory.
Expand Down Expand Up @@ -116,6 +115,23 @@ def validate_sql_schema(sql: str, dialect: str = "mysql") -> dict:
except sqlglot.errors.ParseError as e:
return {"ok": False, "error": str(e)}

from frappe.utils import add_to_date, today, date_diff, days_diff

@frappe.whitelist(allow_guest=False)
def checkmaster_updates():
file_name = "master_data.yaml"
payload = _read_filedoctype(file_name, RAG_FOLDER)
if not payload:
return {"update": False, "data": False}
if not payload.get("data") or not payload.get("_meta"):
return {"data": False}
meta = payload.get("_meta") or {}
lastdate = meta["last_sync"]
docs = frappe.get_all("DocType",filters={"modified":[">",lastdate]})
if len(docs)>0:
return {"update": False,"data":True,"days": days_diff(today(),lastdate)}
return {"update": True,"data":True}


@frappe.whitelist()
def convert_yaml_schema_to_sqlglot_meta() -> dict:
Expand Down Expand Up @@ -147,4 +163,10 @@ def convert_yaml_schema_to_sqlglot_meta() -> dict:
"ok": False,
"message": str(e)
}


from frappe import _
@frappe.whitelist(allow_guest=False)
def test():
res=checkmaster_updates()
if not res.get("update"):
frappe.throw(_("Please update master data for entity recognition to work. Click on Update Master Data button in Training tab in ChangAI Settings.<br>Check Quick Start Guide Here 👇"))
20 changes: 12 additions & 8 deletions changai/changai/api/v2/text2sql_pipeline_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@
from langchain_huggingface import HuggingFaceEmbeddings
from google import genai
from google.genai import types
from changai.changai.api.v2.schema_utils import validate_sql_schema,_load_mapping_data
from changai.changai.api.v2.schema_utils import validate_sql_schema,_load_mapping_data,checkmaster_updates
from google.oauth2 import service_account

from werkzeug.wrappers import Response
from changai.changai.api.v2.helpdesk_api import(
create_helpdesk_ticket,
Expand Down Expand Up @@ -157,7 +158,6 @@ def read_asset(file_name: str, base: str = "assets") -> Any:
FILTER_TABLES = read_asset("filter_tables.txt", base="prompts")
filter_fields = read_asset("filter_fields.txt", base="prompts")


@frappe.whitelist(allow_guest=False)
def download_model():
frappe.enqueue(
Expand Down Expand Up @@ -1167,11 +1167,6 @@ def generate_sql(state:SQLState) -> SQLState:
else:
prompt=fill_sql_prompt(formatted_q,state["context"])
try:
# publish_pipeline_update(
# request_id,
# "sql_generation",
# "Generating SQL query"
# )
response=call_model(prompt)
if not response:
return {**state, "error": "Empty response from LLM", "sql_prompt": prompt}
Expand Down Expand Up @@ -1347,18 +1342,27 @@ def repair_sqlquery(state: SQLState) -> SQLState:
def detect_specific_entities(state: SQLState) -> SQLState:
if not state.get("contains_values"):
return {**state, "entity_cards": [], "entity_raw": None}

q = (state.get("formatted_q") or "").strip()
if not q:
return {**state, "entity_cards": [], "entity_raw": None}

try:
res=checkmaster_updates()
if not res.get("data"):
frappe.throw(_("Master Data do not exist. Bcs of that result may not come accurate. For better accuracy please update by clicking on <b>Update Master Data</b> button in Training tab in ChangAI Settings.<br>Check Quick Start Guide Here 👇:\n"
"<a href='{1}' target='_blank' rel='noopener noreferrer' style='color: #1e90ff;'>Click here</a>").format(res.get("days"), CHANGAI_GUIDE_LINK))
if not res.get("update") and res.get("days")>0:
frappe.throw(_("Your master data is {0} days old. Bcs of that result may not come accurate. For better accuracy please update by clicking on <b>Update Master Data</b> button in Training tab in ChangAI Settings.<br>Check Quick Start Guide Here 👇:\n"
"<a href='{1}' target='_blank' rel='noopener noreferrer' style='color: #1e90ff;'>Click here</a>").format(res.get("days"), CHANGAI_GUIDE_LINK))
out = call_entity_retriever(q)
return {
**state,
"entity_cards": out.get("cards") or [],
"entity_raw": out.get("raw"),
}
except frappe.exceptions.ValidationError:
raise
except Exception as e:
frappe.log_error(f"Entity retriever failed: {e}", "ChangAI Entity Gate")
return {**state, "entity_cards": [], "entity_raw": {"error": str(e)}}
Expand Down
Loading
Loading