$ cat node-template.py

Agent Executor

// Runs an Emblema agent with a given prompt and returns the results. Supports specialized agents (e.g., Survey Stats for Odoo data) and RAG agents (with knowledge base context). Returns formatted text data and raw tool results for downstream use.

Process
LLM
template.py
1import os2import sys3import json4import traceback56try:7    import requests8except ImportError:9    import subprocess10    subprocess.check_call([sys.executable, "-m", "pip", "install", "requests"])11    import requests1213# Environment14EMBLEMA_API_BASE_URL = os.getenv("EMBLEMA_API_BASE_URL", "http://localhost:3000")15USER_TOKEN = os.getenv("USER_TOKEN")16AGENT_EXECUTE_TIMEOUT = int(os.getenv("AGENT_EXECUTE_TIMEOUT", "300"))  # 5 minutes171819def execute_agent(agent_id, prompt, context_item_ids=None, lang="en"):20    """Call the agent execute API endpoint."""21    url = f"{EMBLEMA_API_BASE_URL}/api/v2/agents/{agent_id}/execute"2223    headers = {"Content-Type": "application/json"}24    if USER_TOKEN:25        headers["Authorization"] = f"Bearer {USER_TOKEN}"2627    payload = {28        "agentId": agent_id,29        "prompt": prompt,30        "params": {"lang": lang},31    }3233    if context_item_ids:34        payload["contextItemIds"] = context_item_ids3536    print(f"Calling agent: {agent_id}", file=sys.stderr)37    print(f"Prompt: {prompt[:200]}{'...' if len(prompt) > 200 else ''}", file=sys.stderr)38    print(f"URL: {url}", file=sys.stderr)3940    response = requests.post(41        url,42        headers=headers,43        json=payload,44        timeout=AGENT_EXECUTE_TIMEOUT,45    )4647    if response.status_code != 200:48        try:49            error_detail = response.json()50            error_msg = error_detail.get("message", response.text)51            error_code = error_detail.get("errorCode", "UNKNOWN")52        except Exception:53            error_msg = response.text54            error_code = "HTTP_ERROR"55        raise RuntimeError(56            f"Agent API returned {response.status_code} ({error_code}): {error_msg}"57        )5859    return response.json()606162def main():63    try:64        input_json = sys.stdin.read()65        execution_input = json.loads(input_json)66        inputs = execution_input.get("inputs", {})6768        agent_id = inputs.get("agentId", "survey-stats")69        prompt = inputs.get("prompt", "")70        context_item_ids_raw = inputs.get("contextItemIds", "")71        lang = inputs.get("lang", "en")7273        if not prompt or not prompt.strip():74            raise ValueError("Prompt is required")7576        # Parse context item IDs from comma-separated string77        context_item_ids = None78        if context_item_ids_raw and context_item_ids_raw.strip():79            context_item_ids = [80                cid.strip()81                for cid in context_item_ids_raw.split(",")82                if cid.strip()83            ]8485        # Execute agent86        result = execute_agent(agent_id, prompt, context_item_ids, lang)8788        data = result.get("data", "")89        text = result.get("text", "")90        tool_results = result.get("toolResults", [])91        steps = result.get("steps", 0)9293        print(f"Agent completed in {steps} steps", file=sys.stderr)94        print(f"Data length: {len(data)} chars", file=sys.stderr)95        print(f"Tool results: {len(tool_results)} items", file=sys.stderr)9697        # Output98        output = {99            "data": data,100            "text": text,101            "toolResults": json.dumps(tool_results, indent=2, ensure_ascii=False),102        }103        print(json.dumps(output, indent=2, ensure_ascii=False))104105    except Exception as e:106        error_output = {107            "error": str(e),108            "errorType": type(e).__name__,109            "traceback": traceback.format_exc(),110        }111        print(json.dumps(error_output), file=sys.stderr)112        sys.exit(1)113114115if __name__ == "__main__":116    main()