Agents

OpenAPI tool operations

The operation list stored for an imported API, the per-operation auth modes and fixed values, the enable switch, and the path a call takes through the portal.

Importing a document gives you one record per operation. Look here for what each record holds, how an operation authenticates, how to stop the agent calling one, and what your API receives when it does. To import a document in the first place, see OpenAPI tools.

The operation list

Open the tool from an agent's Tools tab or from the Tool Library page, then open its Endpoints tab. It has a rail of operations on the left and the selected operation's contract on the right.

The rail is a flat list headed "Endpoints (N)", with a tally such as "12 Enabled, 3 Disabled" beside it and a search box placeholdered "Search endpoints". Each row shows the method, the path and the description, with its switch. An empty search result reads "No endpoints match your filter." An operation the document marks as changing state shows a mutating badge in its contract pane.

Clicking a row opens its contract. Parameters is a table with the columns Name, In, Type, Required and Description, and the request body appears under a heading carrying its content type, for example Body (application/json). An operation with neither reads "No parameters" and "No documented fields".

What each operation carries

Field Meaning
name The identifier the enable route uses and the agent calls
method Upper case
path With {curly} placeholders intact
description From the document, or the replacement you supplied at import
tags From the document. Shown as chips in the contract pane
mutating Whether the document marks the operation as changing state. Drives the badge
parameters Name, location, required, type, description
requestBody Required flag, content type, top level fields
fieldValues Fixed constants and secret references set at import
authMode Set at import. Absent means inherit
authConnectionId Only with authMode set to connection
enabled The enable switch. Absent reads as enabled

Contracts are read one level deep: a local $ref is followed once, application/json wins when an operation declares several body media types, and a part that cannot be read is skipped rather than failing the import. An operation whose parameters could not be read still imports and still works; its contract simply shows nothing. A tool imported before contracts were kept reads "Endpoint details aren't stored for this tool."

Auth modes

An imported tool has one auth connection for the whole API, chosen at import. Each operation may override it, and inherit is the default.

Mode What the call uses
inherit The tool's connection, or no credential when the tool has none
none No credential, even when the tool has one
connection The named connection, for this operation only

The contract pane labels the outcome on the operation's header line: auth: <name> for the tool's connection, auth override: <name> for a per-operation one and no auth when neither applies.

Whatever the mode, a connection arrives at your API as an Authorization header. Four kinds exist: basic, bearer, OAuth2 client credentials and OAuth2 JWT. That header is written last, so it replaces any header of the same name a fixed value set, comparing names without regard to case.

The import dialog does not offer a per-operation mode. Each operation uses the tool's connection unless it was set up otherwise at import.

Fixed field values

A field the document declares can be pinned to a value the agent never sees. There are two kinds:

Kind Where it can go What is kept
Constant Path, query, header, cookie or a body field The literal value, up to 2000 characters
Secret Header parameters only A reference to a workspace secret

A pinned field is taken out of the operation before the agent ever sees it, so the agent is not told it exists, and it is put back when the call is made. If the agent supplies an argument whose name matches a pinned field, that argument is thrown away before the request is built. A secret's value is read when the call is made, placed into a header, never logged and never echoed back.

Neither is set in the import dialog. Both are set at import and checked against the operation's real contract, and three refusals are possible:

Message When
fieldValues reference "apiKey", which is not a declared header parameter of operation "getOrder" The pinned field is not in the operation's contract
Secret values are only allowed on header parameters (operation "getOrder", field "apiKey") A secret was pinned somewhere other than a header
Referenced secret not found for operation "getOrder" The secret does not exist in this workspace

In the contract pane an operation with pinned fields gains a Value column, and a secret-backed row is marked with a Secret chip instead of a value.

Call it well

Anything the agent can fill, the agent can fill wrongly. Pin the values that never change, and leave the agent only the fields a caller actually supplies.

Recommended

apiKey     header  pinned to a workspace secret
tenantId   query   pinned constant "acme"
orderId    path    filled by the agent from what the caller said

Less effective

apiKey     header  filled by the agent
tenantId   query   filled by the agent
orderId    path    filled by the agent

Enabling and disabling an operation

Each rail row carries a switch. Turning it off stops the agent calling that operation, and the change is written immediately rather than on a save button.

A switched-off operation can still surface in a search, so it may appear in the retrieval bench. The call itself is refused before anything reaches your API, and the agent gets operation_disabled back instead of a result. The change takes effect at once, including in a conversation already running. An operation you have never switched counts as enabled.

What your API receives

Every call goes to the base URL you set on the tool. Pinned path constants are substituted first, then {curly} placeholders are filled from what the agent supplied and URL encoded; a placeholder with no value is left as it is. Remaining values are placed by method: GET, HEAD and DELETE put them in the query string, and every other method puts them in a JSON body with Content-Type: application/json. Pinned constants and secrets go on next, and the Authorization header is written last.

Your API sees an ordinary request. There is no EchoNova signature on it, and nothing on it identifies the conversation it came from. Take an operation GET /orders/{orderId}, a caller asking about order 4512, a pinned query constant locale and a bearer auth connection:

GET /orders/4512?locale=en HTTP/1.1
Host: api.example.com
Authorization: Bearer <resolved from the auth connection>

You can reproduce that request against your own API while you are checking an import:

curl "https://api.example.com/orders/4512?locale=en" \
  -H "Authorization: Bearer $MY_API_TOKEN"

Your reply comes back to the agent as a status, an ok flag and a body, and the agent reads it and keeps talking.

When a call fails

A failed call comes back to the agent as a tool result rather than as an HTTP failure, so the agent can read it and respond. Each one carries a status and an error string.

Status Error When
404 tool_not_found The tool no longer exists in this workspace
403 operation_disabled The operation's switch is off
502 no_base_url The tool has no base URL and the path was not absolute
502 Target URL must use https The assembled URL was not HTTPS
502 Target URL must be a public host — loopback, private, and link-local addresses are not allowed The assembled URL pointed at a blocked host
502 auth_resolution_failed The auth connection could not be resolved
502 request_failed_or_timed_out Your API did not answer inside 15 seconds, or the connection failed
502 response_too_large Your API declared a response above 256 KB

A non-success status from your own API is not in that table. It is passed through as it stands, with your response body, so a 404 from your service reaches the agent as a 404.

One retry exists. When your API answers 401 and the call used an OAuth2 connection, EchoNova fetches a fresh token and sends the request once more.

Limits

Limit Value
Call timeout 15 seconds, not configurable
Response size 256 KB
Redirects Not followed
Operations reached per turn 5, at a score threshold of 0.5
Constant value length 2000 characters
Pinned fields per operation 50
Operations per imported tool 2000

FAQ

How do I stop the agent calling one operation?

Switch it off in the rail. The change applies at once, and the agent is told the operation is unavailable instead of your API being called.

Can I give one operation a different credential from the rest of the API?

Not from the import dialog. Each operation uses the tool's connection unless it was set up otherwise at import, and the contract pane shows which applies as auth: <name>, auth override: <name> or no auth.

Can the agent see a pinned API key?

No. A pinned field is removed from the operation before the agent sees it and put back when the call is made, and a secret's value is never returned by any screen or response.

Why did my API get a request with an unfilled {placeholder}?

The agent supplied no value for that path parameter. Mark the parameter required in the document, or pin it to a constant if it never varies.

Does my API get told which conversation a call belongs to?

No. The request carries only the credential and the values you configured.