File size: 2,723 Bytes
50f886a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from langchain_core.messages import SystemMessage
from models.fallback import get_model_with_fallback
from agents.chat_agent import AgentState
from agents.tools import get_coding_tools

from core.router import TASK_MODEL_MAP

def coding_agent_node(state: AgentState):
    primary_model = TASK_MODEL_MAP.get("coding", "qwen/qwen2.5-coder-32b-instruct")
    primary_llm = get_model_with_fallback(primary_model)
    fallback_llm = get_model_with_fallback("groq/llama-3.3-70b-versatile")
    
    messages = list(state["messages"])
    
    if not any(isinstance(m, SystemMessage) for m in messages):
        from core.prompts import FORMATTING_DIRECTIVE
        sys_msg = SystemMessage(content=(
            "You are an expert software engineer. You have access to a Python REPL tool, local File Management tools, and a GitHub Search tool. "
            f"{FORMATTING_DIRECTIVE}\n"
            "CRITICAL RULES: "
            "1. CODE GENERATION: When asked to write or generate code, simply output the complete code in standard markdown blocks (e.g. ```python). Do NOT invoke the execution tools automatically. "
            "2. ENGAGEMENT: After providing the code, always ask the user an engaging follow-up question (e.g., 'Should I explain this in more detail?', 'Would you like me to execute this to verify it works?', or 'Are there any specific edge cases we should handle?'). "
            "3. HUMAN-IN-THE-LOOP FOR DEBUGGING: ONLY use the Python REPL or file modification tools when you need to actively debug an issue, test a script, or if the user explicitly asks you to 'execute', 'run', or 'save' the code. "
            "4. TOOL USAGE: When you DO use tools, use the proper tool-calling API. Never output the tool call as raw JSON text in your message."
        ))
        messages = [sys_msg] + messages
        
    all_tools = get_coding_tools()
    
    # Bind tools to primary, and fall back to Qwen (without tools) if primary fails
    llm_with_tools = primary_llm.bind_tools(all_tools).with_fallbacks([fallback_llm])
    
    trace = state.get("agent_trace", []) + ["coding_agent"]
    
    # High-Resolution Self-Correction: Inject feedback if we are in a retry loop
    feedback = state.get("eval_feedback")
    if feedback and state.get("retry_count", 0) > 0:
        from langchain_core.messages import HumanMessage
        messages = list(messages)
        messages.append(HumanMessage(content=(
            f"⚠️ YOUR PREVIOUS RESPONSE FAILED QUALITY AUDIT.\n"
            f"{feedback}\n"
            "Please regenerate your response and fix ALL the issues mentioned above."
        )))

    response = llm_with_tools.invoke(messages)
    
    return {"messages": [response], "agent_trace": trace}