# agent.py (Python 3.11, single file, no external deps)
import sys, os, json, traceback
from datetime import datetime
# ── Where to put credentials:
# Dashboard → Agent → <your agent> → Credentials → Add "AGENT_OPENAI_KEY" (for example)
# Your code reads them from os.environ or the "secrets" dict below.
def now(): return datetime.now().strftime('%H:%M:%S')
GREEN, RED, RESET = "\033[92m", "\033[91m", "\033[0m"
def log(msg, col=GREEN): print(f"{col}[{now()}] {msg}{RESET}", flush=True)
def parse_input(raw: str):
raw = (raw or "").strip()
if not raw: return {"text": "", "json": None}
try:
if raw[:1] in "{[":
return {"text": raw, "json": json.loads(raw)}
except Exception: pass
return {"text": raw, "json": None}
def run_task(user_input: str, secrets: dict):
data = parse_input(user_input)
# Example: reading a dashboard secret
openai_key = secrets.get("AGENT_OPENAI_KEY") or os.environ.get("AGENT_OPENAI_KEY")
# Use: if openai_key: call your API. Never print secret values.
result = {
"received": data["text"],
"parsed_json": data["json"],
"available_secrets": sorted([k for k in (secrets or {}).keys() if k.startswith("AGENT_")]),
}
print(json.dumps(result, indent=2), flush=True)
def main():
log("Agent started. Waiting for input…")
try:
user_input = sys.stdin.readline().rstrip("\n")
secrets = {k:v for k,v in os.environ.items() if k.startswith('AGENT_')}
if user_input.lower() == 'exit':
log('Exit command received. Stopping agent.'); return
run_task(user_input, secrets)
# No need to print "Done." — the Playground shows an idle spinner automatically.
except Exception as e:
log(f"[ERROR] {e}", RED); traceback.print_exc()
if __name__ == '__main__': main()
Advanced (optional): self‑describe the input field.
Add this at module level, and we’ll call your agent with
PLAYGROUND_DESCRIBE=1
to fetch UI hints.
META = {
"schema": 1,
"playground": { "input": { "type": "text", "placeholder": "Type a command" } }
}
def _describe_if_requested():
import os, sys, json
if os.environ.get("PLAYGROUND_DESCRIBE") == "1" or (len(sys.argv) > 1 and sys.argv[1] == "--describe"):
print(json.dumps(META)); sys.exit(0)
Tip: Keep it simple: use the Python standard library and HTTPS APIs.
Dashboard‑managed secrets appear as AGENT_*
env‑vars. The Playground
streams whatever you print with flush=True
, shows a server‑driven
Loading… spinner during work and Waiting for next input… after.