Cloudflare Evaluate

Cloudflare Evaluate

Certified

Evaluate content with Cloudflare Clef decision models

Sends a state and a map of typed questions to a Clef decision model on Workers AI and returns one answer per question. Each answer carries calibrated probabilities instead of generated text, so a flow can route on a yes/no, a choice or a score without parsing LLM output.

yaml
type: io.kestra.plugin.cloudflare.ai.Evaluate

Route a support request to a team

yaml
id: cloudflare_triage_ticket
namespace: company.team

inputs:
  - id: message
    type: STRING

tasks:
  - id: classify
    type: io.kestra.plugin.cloudflare.ai.Evaluate
    accountId: "{{ secret('CLOUDFLARE_ACCOUNT_ID') }}"
    apiToken: "{{ secret('CLOUDFLARE_API_TOKEN') }}"
    model: CLEF_FLASH
    state: "{{ inputs.message }}"
    questions:
      team:
        type: CHOICE
        instructions: Which team should handle this request?
        criteria:
          billing: Payments, invoices, and refunds
          technical: Outages, errors, and configuration
          sales: Plans and upgrades

  - id: log_team
    type: io.kestra.plugin.core.log.Log
    message: "Route to {{ outputs.classify.answers.team.choice }}"

Escalate only urgent and severe incidents

yaml
id: cloudflare_incident_gate
namespace: company.team

inputs:
  - id: report
    type: STRING

tasks:
  - id: evaluate
    type: io.kestra.plugin.cloudflare.ai.Evaluate
    accountId: "{{ secret('CLOUDFLARE_ACCOUNT_ID') }}"
    apiToken: "{{ secret('CLOUDFLARE_API_TOKEN') }}"
    state: "{{ inputs.report }}"
    questions:
      urgent:
        type: NOUL
        instructions: Is this incident urgent?
      severity:
        type: SCORE
        instructions: How severe is the customer impact?
        criteria:
          - No impact
          - Minor
          - Major
          - Critical

  - id: escalate
    type: io.kestra.plugin.core.flow.If
    condition: "{{ outputs.evaluate.answers.urgent.noul > 0.8 and outputs.evaluate.answers.severity.score >= 2 }}"
    then:
      - id: notify
        type: io.kestra.plugin.core.log.Log
        message: "Escalating incident"

Evaluate every webhook payload as it arrives

yaml
id: cloudflare_webhook_moderation
namespace: company.team

triggers:
  - id: on_comment
    type: io.kestra.plugin.core.trigger.Webhook
    key: "{{ secret('WEBHOOK_KEY') }}"

tasks:
  - id: moderate
    type: io.kestra.plugin.cloudflare.ai.Evaluate
    accountId: "{{ secret('CLOUDFLARE_ACCOUNT_ID') }}"
    apiToken: "{{ secret('CLOUDFLARE_API_TOKEN') }}"
    state: "{{ trigger.body.comment }}"
    questions:
      abusive:
        type: NOUL
        instructions: Is this comment abusive?
Properties

Account ID

Cloudflare account identifier

Cloudflare API token

Your Cloudflare API token. Create one in the Cloudflare dashboard with the permissions required by the resources you manage (e.g. DNS, Workers, Workers AI, D1, cache, WAF, zones).

Questions

Typed questions keyed by an id you choose, 1 to 64 entries. Ids may use letters, digits, _, . and -, up to 100 characters. Answers come back under the same ids.

Definitions

A typed question evaluated against the state.

criteriaobjectarray

Criteria

Depends on the question type: CHOICE requires 2 to 255 options, either as a map of option name to description or as a list of option names when none needs a description. In a map, use an empty string for an option without a description: Kestra drops entries whose value is null. SCORE requires an ordered list of level descriptions, lowest first, with 2 to 10 levels. NOUL optionally takes a map with the keys true and false describing what a yes and a no mean.

instructionsstringobjectarray

Instructions

What the model should decide. A string, or an object or array holding the question in one field and the data it refers to in the others.

typeobject

State

The content to evaluate: a string, or structured data (object or array) such as records, chat logs or application state. Write structured data as a YAML map or list: its keys are kept as written and each value is rendered on its own, as text. An expression such as {{ trigger.body }} always renders to text, even when the result is valid JSON.

Assets this task consumes as inputs or produces as outputs, for lineage tracking and the asset graph (Enterprise Edition). A flow declaring this property on a task is rejected in the open-source edition.

Definitions
assetFailureBehaviorstring
Possible Values
IGNOREFAILWARN

Asset failure behavior

Behavior applied to the task state when a declared asset fails to render, emit, or be persisted (e.g. a lock conflict): FAIL escalates it to FAILED, WARN (default) warns it if it would otherwise succeed, IGNORE leaves the state untouched.

enableAutobooleanstring

Whether to auto-register assets referenced dynamically at runtime that are not statically declared in inputs or outputs.

inputsarray

The assets consumed as inputs.

id*string
Min length1
typestring
outputs

The assets produced as outputs.

id*string
Min length1
Max length150
type*object
descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
id*string
Min length1
Max length150
type*object
descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
id*string
Min length1
Max length150
type*object
descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
id*string
Min length1
Max length150
type*object
descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
id*string
Min length1
Max length150
type*object
descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
id*string
Min length1
Max length150
type*string
Min length1

Custom asset type

descriptionstring
displayNamestring
metadataobject
Default{}
namespacestring
Min length1
Max length150
Defaulthttps://api.cloudflare.com/client/v4

Cloudflare API base URL

Base URL for Cloudflare API. Usually you don't need to change this.

DefaultCLEF
Possible Values
CLEFCLEF_FLASH

Model

CLEF runs @cf/cloudflare/clef, CLEF_FLASH runs the smaller and faster @cf/cloudflare/clef-flash.

HTTP client options

Optional advanced HTTP settings like timeouts or proxy.

Definitions
allowFailedbooleanstring
Defaultfalse

If true, allow a failed response code (response code >= 400)

allowedResponseCodesarray
SubTypeinteger

List of response code allowed for this request

auth

The authentication to use.

type*object
passwordstring

The password for HTTP basic authentication.

usernamestring

The username for HTTP basic authentication.

type*object
tokenstring

The token for bearer token authentication.

type*object
passwordstring

The password for HTTP Digest authentication.

usernamestring

The username for HTTP Digest authentication.

defaultCharsetstring
DefaultUTF-8

The default charset for the request.

enabledTcpExtendedKeepAlivebooleanstring
Defaulttrue

Whether to enable TCP Keep-Alive extended socket options (TCP_KEEPIDLE, TCP_KEEPINTERVAL, TCP_KEEPCOUNT).

Set to false when running on Windows workers, as these extended socket options are not supported by the Windows JDK and will cause connection failures.

followRedirectsbooleanstring
Defaulttrue

Whether redirects should be followed automatically.

logsarray
SubTypestring
Possible Values
REQUEST_HEADERSREQUEST_BODYRESPONSE_HEADERSRESPONSE_BODY

The enabled log.

proxy

The proxy configuration.

addressstring

The address of the proxy server.

passwordstring

The password for proxy authentication.

portintegerstring

The port of the proxy server.

typestring
DefaultDIRECT
Possible Values
DIRECTHTTPSOCKS

The type of proxy to use.

usernamestring

The username for proxy authentication.

ssl

The SSL request options

insecureTrustAllCertificatesbooleanstring

Whether to disable checking of the remote SSL certificate.

Only applies if no trust store is configured. Note: This makes the SSL connection insecure and should only be used for testing. If you are using a self-signed certificate, set up a trust store instead.

timeout

The timeout configuration.

connectTimeoutstring

The time allowed to establish a connection to the server before failing.

readIdleTimeoutstring
DefaultPT5M

The time allowed for a read connection to remain idle before closing it.

Answers

One answer per question, keyed by the ids used in questions.

Definitions

The answer to one question. Only the fields matching the question type are set.

choicestring

Chosen option

Only for CHOICE: the option with the highest probability.

confidencenumber

Confidence

Only for CHOICE and SCORE: how certain the model is, from 0 to 1, derived from the probabilities.

legendobject

Legend

Only for SCORE: each level index mapped back to its description.

noulnumber

Yes probability

Only for NOUL: the probability that the answer is yes, from 0 (no) to 1 (yes).

probabilitiesobject
SubTypenumber

Probabilities

Only for CHOICE and SCORE: the probability of each option or level. Values sum to 1.

scorenumber

Score

Only for SCORE: the probability-weighted level, where 0 is the lowest level. It can land between two levels.

typeobject

Model

The model that performed the evaluation, as reported by Cloudflare.

Unittokens

Number of input tokens Cloudflare reported for the request.

Unittokens

Number of output tokens Cloudflare reported for the request.