Recipe catalog / outcome-framing
Identify gain and loss framing
Label whether wording presents a specified outcome through gains, losses, both, or neither.
You need to label gain and loss wording in a decision prompt or research stimulus.
Explore this recipe interactively ยท Source and implementation guide
Use outcome-framing in TypeScript
Install with npm install jev-recipes. Requires Node.js 22.9 or newer and ES modules. Set TYPESAFE_API_KEY in your server environment for live calls, which send input to TypeSafe and use API quota. See the installation guide.
import { outcomeFraming } from 'jev-recipes/outcome-framing';
const result = await outcomeFraming({
"text": "You keep 80 of your 100 points.",
"outcome": "The player's points after the round; more points are better."
});
console.log(result);
Input contract
| Field | Type | Needed |
|---|---|---|
| text | string | Required |
| outcome | string | Required |
| context | string | Optional |
| minConfidence | number | Optional |
Full input and result schemas
{
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The wording presented to the decision maker."
},
"outcome": {
"type": "string",
"description": "One focal outcome, including whose outcome it is and what counts as a benefit or harm."
},
"context": {
"type": "string",
"description": "Supplied references or baseline information needed to interpret the wording."
},
"minConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"text",
"outcome"
]
},
"result": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"input_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"output_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"input_tokens",
"output_tokens"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"review"
]
},
"verdict": {
"type": "string",
"enum": [
"gain",
"loss",
"mixed",
"neutral",
"unclear"
]
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"probabilities": {
"type": "object",
"propertyNames": {
"type": "string",
"enum": [
"gain",
"loss",
"mixed",
"neutral",
"unclear"
]
},
"additionalProperties": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"required": [
"gain",
"loss",
"mixed",
"neutral",
"unclear"
]
}
},
"required": [
"model",
"usage",
"status",
"verdict",
"confidence",
"probabilities"
],
"additionalProperties": false
}
}Saved example result
This hand-authored response demonstrates the contract. It is not a model accuracy measurement. Run it without an API key: npx jev-recipes demo outcome-framing.
{
"model": "demo-fixture",
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"status": "ready",
"verdict": "gain",
"confidence": 0.96,
"probabilities": {
"gain": 0.96,
"loss": 0.01,
"mixed": 0.01,
"neutral": 0.01,
"unclear": 0.01
}
}
Evaluation evidence
No verified live accuracy measurement is available. Evaluate representative cases before using this decision in your workflow.
Use the evaluation guide to measure this decision on your own labeled cases.
Limitations
- Labels wording about one supplied outcome; it does not calculate utility or verify equivalence between descriptions.
- A frame label does not establish loss aversion, a cognitive bias, or a causal effect on choices.
- A bare amount can be neutral even when the caller knows it represents an actual gain or loss.
Related recipes
- question-leading: Use question-leading to assess pressure toward a supplied answer, rather than gain or loss framing.
- question-assumption: Use question-assumption to check whether a question takes a specified claim for granted.
- choose-action: Use choose-action to select among supplied eligible actions; outcome-framing only labels wording.