from __future__ import annotations
import json
import os
from typing import Any
from a1.passport import PassportClient, a1_guard, PassportError
GATEWAY_URL = os.getenv("A1_GATEWAY_URL", "http://localhost:8080")
AGENT_PK_HEX: str = os.getenv("AGENT_PK_HEX", "aa" * 32)
SIGNED_CHAIN: dict = json.loads(
os.getenv(
"AGENT_SIGNED_CHAIN",
'{"version":1,"principal_pk":"","principal_scope":"","certs":[]}',
)
)
client = PassportClient(GATEWAY_URL)
@a1_guard(client=client, capability="trade.equity")
def execute_trade(
*,
signed_chain: dict,
executor_pk_hex: str,
symbol: str,
qty: int,
) -> str:
result = {"status": "filled", "symbol": symbol, "qty": qty}
print(f"[broker] BUY {qty} × {symbol}")
return json.dumps(result)
@a1_guard(client=client, capability="portfolio.read")
def read_portfolio(
*,
signed_chain: dict,
executor_pk_hex: str,
) -> str:
positions = [{"symbol": "AAPL", "qty": 100}, {"symbol": "GOOG", "qty": 50}]
return json.dumps(positions)
def make_function_definitions() -> list[dict]:
return [
{
"type": "function",
"function": {
"name": "execute_trade",
"description": (
"Execute an equity trade on behalf of the authorized principal. "
"Requires a valid a1 delegation chain with trade.equity capability."
),
"parameters": {
"type": "object",
"properties": {
"symbol": {
"type": "string",
"description": "Ticker symbol, e.g. AAPL",
},
"qty": {
"type": "integer",
"description": "Number of shares to buy",
},
},
"required": ["symbol", "qty"],
},
},
},
{
"type": "function",
"function": {
"name": "read_portfolio",
"description": "Read the current portfolio positions.",
"parameters": {"type": "object", "properties": {}},
},
},
]
def dispatch_tool_call(name: str, arguments: dict[str, Any]) -> str:
shared = {"signed_chain": SIGNED_CHAIN, "executor_pk_hex": AGENT_PK_HEX}
try:
if name == "execute_trade":
return execute_trade(**shared, **arguments)
if name == "read_portfolio":
return read_portfolio(**shared)
return json.dumps({"error": f"unknown tool: {name}"})
except PassportError as e:
return json.dumps({"error": str(e), "error_code": e.error_code})
def main() -> None:
print("a1 passport + OpenAI Agents demo")
print(f"Gateway: {GATEWAY_URL}")
print()
print("Simulating execute_trade tool call...")
result = dispatch_tool_call("execute_trade", {"symbol": "AAPL", "qty": 10})
print(f"Result: {result}")
print()
print("Simulating read_portfolio tool call...")
result = dispatch_tool_call("read_portfolio", {})
print(f"Result: {result}")
print()
print("Function definitions for OpenAI API:")
print(json.dumps(make_function_definitions(), indent=2))
if __name__ == "__main__":
main()