"""Run the Memrail quickstart in an isolated development project.""" import argparse import asyncio import json from memrail import AsyncAMIClient from memrail.atoms import state from memrail.models import InvokeOptions, TraceOptions from memrail.tools import ToolRegistry TOOL_SCHEMA = { "type": "object", "properties": {"name": {"type": "string", "minLength": 1, "maxLength": 80}}, "required": ["name"], "additionalProperties": False, } registry = ToolRegistry() @registry.tool( name="format_greeting", description="Format a greeting locally; no external side effects", schema=TOOL_SCHEMA, projects=["docs-demo"], ) async def format_greeting(args: dict) -> dict: name = args.get("name") if set(args) != {"name"} or not isinstance(name, str) or not 1 <= len(name) <= 80: raise ValueError("Expected one name between 1 and 80 characters") return {"greeting": f"Hello, {name}!"} async def run(client, *, tier="enterprise", execute=False): client.register_tool( name="format_greeting", description="Format a greeting locally; no external side effects", schema=TOOL_SCHEMA, projects=["docs-demo"], handler=format_greeting, ) return await client.decide_and_execute( decision_point="support.greeting", context=[state("customer.name", "Ada"), state("customer.tier", tier)], options=InvokeOptions(dry_run=not execute), trace=TraceOptions(enable=True), auto_ack=True, ) async def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--tier", choices=["enterprise", "free"], default="enterprise") parser.add_argument("--execute", action="store_true", help="Execute the local greeting tool") args = parser.parse_args() async with AsyncAMIClient(workspace="development", project="docs-demo") as client: result = await run(client, tier=args.tier, execute=args.execute) print(json.dumps({ "selected": [item.emu_key for item in result.invoke_result.selected], "trace": result.invoke_result.trace, "executions": [ {"executed": item.was_executed, "success": item.success, "output": item.output, "error": item.error} for item in result.execution_results ], "acks": [ {"activation_id": item.activation_id, "success": item.success, "error": item.error} for item in result.ack_results ], }, indent=2, default=str)) if any(not item.success for item in [*result.execution_results, *result.ack_results]): raise SystemExit(1) if __name__ == "__main__": asyncio.run(main())