Who is Caller Quick Start for?
It is for agent teams that want to call an external capability through CALL ANYTHING without deploying the full platform first. The page uses Local Mode to prove the minimum caller loop with a real result package.
Start from the published delexec-ops package, run one local Hotline call, and inspect one real result_package. The source install path is kept later for contributors.
What this page gets you to
New users should start from the published @delexec/ops package. No superproject clone or monorepo context is required for the first local call.
npm install -g @delexec/ops
delexec-ops bootstrap --email [email protected] --text "Summarize this bootstrap request."
delexec-ops status
delexec-ops run-example --text "Summarize this follow-up request." SUCCEEDED means the minimum Caller loop is working.git clone --recursive https://github.com/hejiajiudeeyu/delegated-execution-dev.git
cd delegated-execution-dev
corepack pnpm installcd repos/client
npm install repos/client.If you are contributing code or debugging HTTP details, start the supervisor from source. First-time users can stay with delexec-ops bootstrap above.
export DELEXEC_HOME="$HOME/.delexec-quickstart-en"
export OPS_PORT_SUPERVISOR=8179
DELEXEC_HOME="$DELEXEC_HOME" OPS_PORT_SUPERVISOR="$OPS_PORT_SUPERVISOR" npm run ops -- start supervisor listening on 127.0.0.1:8179 the runtime is ready.The first supervisor boot needs setup. After that, every admin request is scoped by the X-Ops-Session token.
BASE="http://127.0.0.1:${OPS_PORT_SUPERVISOR:-8079}"
curl -s -X POST "$BASE/setup" -H 'content-type: application/json' -d '{}'
SESSION=$(curl -s -X POST "$BASE/auth/session/setup" -H 'content-type: application/json' -d '{"passphrase":"client-localtest-123"}' | jq -r '.token')
echo "$SESSION"
export OPS_SESSION="$SESSION" repos/client/docs/current/guides/local-mode-onboarding.md.Even in Local Mode the protocol keeps Caller identity explicit. This step writes a local account into your DELEXEC_HOME runtime state.
npm run ops -- auth register --local --email [email protected]curl -s -X POST "$BASE/auth/register-caller" -H 'content-type: application/json' -H "X-Ops-Session: $OPS_SESSION" -d '{ "contact_email": "[email protected]" }'Local Mode lets the same machine act as both Caller and Responder. That keeps the first verification loop small before you integrate any real capability.
curl -s -X POST "$BASE/responder/enable" -H 'content-type: application/json' -H "X-Ops-Session: $OPS_SESSION" -d '{}'
curl -s -X POST "$BASE/responder/hotlines/example" -H 'content-type: application/json' -H "X-Ops-Session: $OPS_SESSION" -d '{}'Catalog is the key Caller-side API. It defines which Hotlines are currently available to the agent runtime.
curl -s "$BASE/catalog/hotlines" -H "X-Ops-Session: $OPS_SESSION" | jqlocal.delegated-execution.workspace-summary.v1 in the list.At this point the runtime is live. The next request simulates the first external capability call an agent would make.
REQ=$(curl -s -X POST "$BASE/requests/example" -H 'content-type: application/json' -H "X-Ops-Session: $OPS_SESSION" -d '{}')
echo "$REQ"
REQUEST_ID=$(echo "$REQ" | jq -r '.request_id')npm run ops -- run-example --text "summarize my workspace"The protocol-level result envelope is the main thing to learn. Once your agent understands one result_package, it can reuse that outer shape across many Hotlines.
curl -s "$BASE/requests/$REQUEST_ID/result" -H "X-Ops-Session: $OPS_SESSION" | jq{
"request_id": "req_xxx",
"status": "SUCCEEDED",
"result_package": {
"request_id": "req_xxx",
"responder_id": "responder_xxx",
"hotline_id": "local.delegated-execution.workspace-summary.v1",
"status": "ok",
"output": {
"summary": "..."
},
"timing": {
"elapsed_ms": 123
}
}
}{
"request_id": "req_xxx",
"status": "FAILED",
"result_package": {
"hotline_id": "local.delegated-execution.workspace-summary.v1",
"status": "error",
"error": {
"code": "AUTH_TOKEN_INVALID",
"message": "task token is missing or invalid"
}
}
}Fields your agent should inspect first:
status: request lifecycle statusresult_package.status: protocol-level success or errorhotline_id: the exact capability version you calledoutput: the capability-specific payloadtiming.elapsed_ms: runtime duration for observability and pricingThis is not required for the local quick start. It is the public production rehearsal path: register a hosted Platform Caller, ask the operator to recharge that tenant, then let delexec-ops call-hotline handle billing consent, dispatch, result polling, and settlement evidence.
PLATFORM="https://callanything.xyz/platform"
RELAY="https://callanything.xyz/relay"
CALLER_EMAIL="caller-opc0"@"example.com"
export DELEXEC_HOME="$HOME/.delexec-caller-public-en"
export OPS_PORT_SUPERVISOR=8279
export OPS_PORT_CALLER=8281
export TRANSPORT_TYPE="relay_http"
export TRANSPORT_BASE_URL="$RELAY"
# delexec-ops auth register calls $PLATFORM/v1/users/register and stores the API key locally.
CALLER_JSON=$(delexec-ops auth register --platform "$PLATFORM" --email "$CALLER_EMAIL")
echo "$CALLER_JSON" | jq
CALLER_API_KEY=$(echo "$CALLER_JSON" | jq -r '.api_key')
CALLER_TENANT_ID=$(echo "$CALLER_JSON" | jq -r '.user_id')
export CALLER_API_KEY CALLER_TENANT_ID
# Run this in a second terminal, or keep it alive with nohup. The Caller
# controller consumes the result and reports the billing-settlement event.
nohup env DELEXEC_HOME="$DELEXEC_HOME" OPS_PORT_SUPERVISOR="$OPS_PORT_SUPERVISOR" OPS_PORT_CALLER="$OPS_PORT_CALLER" TRANSPORT_TYPE="relay_http" TRANSPORT_BASE_URL="$RELAY" delexec-ops start > "$DELEXEC_HOME/caller-public-relay.log" 2>&1 &
CALLER_BASE="http://127.0.0.1:$OPS_PORT_CALLER"
# Send CALLER_TENANT_ID to the operator. Continue after tenant creation and manual recharge.
curl -s "$PLATFORM/v1/tenants/me/balance" -H "Authorization: Bearer $CALLER_API_KEY" | jqHOTLINE_ID="your.namespace.tool-name.v1"
RESPONDER_ID="responder_xxx"
REQUEST_ID="req_opc0_$(date +%s)"
MAX_CHARGE_CENTS=500
curl -s "$PLATFORM/v1/catalog/hotlines/$HOTLINE_ID" | jq
CALL_RESULT=$(delexec-ops call-hotline --platform "$PLATFORM" --caller-base-url "$CALLER_BASE" --request-id "$REQUEST_ID" --responder-id "$RESPONDER_ID" --hotline-id "$HOTLINE_ID" --text "Summarize this paid public relay request." --max-charge-cents "$MAX_CHARGE_CENTS" --poll-interval-ms 2000 --timeout-ms 60000)
echo "$CALL_RESULT" | tee /tmp/delexec-call-hotline.json | jq
echo "$CALL_RESULT" | jq '{request_id, task_token_present, task_token_claims, delivery_meta, dispatch, inbox, result, events, balance, ledger}'# call-hotline already wraps these steps:
# /v1/tokens/task
# /v1/requests/$REQUEST_ID/delivery-meta
# /controller/requests
# /controller/requests/$REQUEST_ID/dispatch
# $RELAY/v1/messages/send
# /controller/inbox/pull
# /controller/requests/$REQUEST_ID/result
# /v1/tenants/me/balance
# /v1/tenants/me/ledger
# /v1/requests/$REQUEST_ID/events
echo "$CALL_RESULT" | jq '{task_token_claims, delivery_meta, dispatch, inbox, result, events, balance, ledger}'call-hotline exits 0 and returnstask_token_claims, delivery_meta,dispatch, result, events,balance, and ledger; and/v1/tenants/me/balance plus/v1/tenants/me/ledger reconcile againstmax_charge_cents and actual usage. The low-level APIs remain visible for diagnostics.You now have the minimum Caller-side loop. From here, either expand the set of Hotlines your agent can call or switch to the seller-side path and publish one yourself.
Expand the agent surface
Open the Console and Marketplace to see discovery, approvals, and runtime history from the team side.
Publish a capability
The same supervisor can also host a Responder. Switch to the seller-side path to publish your own Hotline.
Caller FAQ
These are the three questions most likely to block the first caller-side integration, and they are also emitted as English FAQ schema for answer engines.
It is for agent teams that want to call an external capability through CALL ANYTHING without deploying the full platform first. The page uses Local Mode to prove the minimum caller loop with a real result package.
Because it reduces debugging scope. You first prove that Caller, supervisor, and Responder can complete one stable loop before you spend time integrating a real business capability.
Inspect the result_package shape: request status, hotline_id, output, and timing. That is the shared contract your agent will parse across many Hotlines.