|
|
from .codeact.core.codeact import CodeActAgent |
|
|
from src.database.candidates.client import SessionLocal |
|
|
from src.database.candidates.models import ( |
|
|
Candidate, |
|
|
CVScreeningResult, |
|
|
VoiceScreeningResult, |
|
|
InterviewScheduling, |
|
|
FinalDecision, |
|
|
) |
|
|
from langchain_core.tools import tool |
|
|
from typing import Dict, Any |
|
|
from src.prompts import get_prompt |
|
|
from src.database.candidates import evaluate_cv_screening_decision |
|
|
from src.state.candidate import CandidateStatus, InterviewStatus, DecisionStatus |
|
|
|
|
|
|
|
|
SYSTEM_PROMPT = get_prompt( |
|
|
template_name="DB_Executor", |
|
|
latest_version=True |
|
|
) |
|
|
|
|
|
|
|
|
@tool |
|
|
def db_executor(query: str) -> str: |
|
|
""" |
|
|
Consumes a natural-language query as input which is being translated into |
|
|
SQLAlchemy ORM code by the coding agent. Finally, the code is executed against |
|
|
the database and the result is returned. |
|
|
|
|
|
Args: |
|
|
query (str): Natural-language database query. |
|
|
Returns: |
|
|
str: The natural language summary of the result or error. |
|
|
""" |
|
|
|
|
|
session = SessionLocal() |
|
|
context = { |
|
|
"session": session, |
|
|
"Candidate": Candidate, |
|
|
"CVScreeningResult": CVScreeningResult, |
|
|
"VoiceScreeningResult": VoiceScreeningResult, |
|
|
"InterviewScheduling": InterviewScheduling, |
|
|
"FinalDecision": FinalDecision, |
|
|
"CandidateStatus": CandidateStatus, |
|
|
"InterviewStatus": InterviewStatus, |
|
|
"DecisionStatus": DecisionStatus, |
|
|
} |
|
|
|
|
|
try: |
|
|
|
|
|
agent = CodeActAgent( |
|
|
model_name="gpt-4o", |
|
|
model_provider="openai", |
|
|
tools=[evaluate_cv_screening_decision], |
|
|
eval_fn=CodeActAgent.default_eval, |
|
|
system_prompt=SYSTEM_PROMPT, |
|
|
bind_tools=True, |
|
|
memory=False, |
|
|
) |
|
|
|
|
|
|
|
|
messages = [{"role": "user", "content": query}] |
|
|
final_state = agent.generate(messages, context=context) |
|
|
|
|
|
|
|
|
|
|
|
output_msg = final_state["messages"][-1].content if final_state.get("messages") else "" |
|
|
|
|
|
return output_msg |
|
|
|
|
|
except Exception as e: |
|
|
import traceback |
|
|
error_trace = traceback.format_exc() |
|
|
print(f"\n❌ Error in db_executor: {e}\n{error_trace}") |
|
|
|
|
|
|
|
|
return f"The DB Executor encountered an internal error: {str(e)}" |
|
|
|
|
|
finally: |
|
|
session.close() |
|
|
|
|
|
|
|
|
|
|
|
|