$ 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()