Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions references/free-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,3 @@ curl -sS -X POST https://api.beatapi.io/v1/capabilities/search \
(its id is not always the free id minus `-free`).
- Free models are a limited-time offer: callable right after signup, with no
top-up and no card required.
- A decision model is among them: `model:jev-1.13-free`. It takes `state` and
`questions` instead of a prompt:
<https://beatapi.io/skill-refs/recipes/decide-with-jev.md>.
8 changes: 4 additions & 4 deletions references/recipes/decide-with-jev.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ JEV is a decision model: give it the current state and typed questions, get back
typed answers with probabilities. It writes no prose, so there is nothing to
parse. Use it to pick one option, score something on a scale, or answer yes/no.

References: `model:jev-1.13-free` (free, rate limited until the account's first
top-up) and `model:jev-1.13` (paid, billed per input token; output is free).
Inspect either for the full schema.
References: `model:jev-1.13` and `model:jev-1.14` (paid, billed per input token;
output is free). Both follow the latest JEV release. Inspect either for the full
schema. There is no free JEV model.

## Run

```json
{
"reference": "model:jev-1.13-free",
"reference": "model:jev-1.13",
"input": {
"state": "We sell a $29/month writing tool. Three landing-page headlines are drafted below. Audience: freelance marketers.\n1) Write faster\n2) Your drafts, done by lunch\n3) AI writing for marketers",
"questions": {
Expand Down
2 changes: 1 addition & 1 deletion references/run.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Over MCP, pass the same JSON to `capabilities_run`.
- **Text models** run the same way: `{"reference":"model:<id>","input":{"input":"<prompt>"}}`
returns `output_text`; `usage` token counts may include upstream system prompts
and are not comparable across models. **Decision model** JEV:
`{"reference":"model:jev-1.13-free","input":{"state":"…","questions":{…}}}` returns
`{"reference":"model:jev-1.13","input":{"state":"…","questions":{…}}}` returns
typed answers with probabilities (question types `noul`, `choice`, `score`;
a `noul` needs `instructions`, the yes/no question; `score` takes
at most 10 criteria). To rank many candidates use **one** call:
Expand Down
3 changes: 0 additions & 3 deletions skills/beatapi-video/references/free-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,3 @@ curl -sS -X POST https://api.beatapi.io/v1/capabilities/search \
(its id is not always the free id minus `-free`).
- Free models are a limited-time offer: callable right after signup, with no
top-up and no card required.
- A decision model is among them: `model:jev-1.13-free`. It takes `state` and
`questions` instead of a prompt:
<https://beatapi.io/skill-refs/recipes/decide-with-jev.md>.
8 changes: 4 additions & 4 deletions skills/beatapi-video/references/recipes/decide-with-jev.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ JEV is a decision model: give it the current state and typed questions, get back
typed answers with probabilities. It writes no prose, so there is nothing to
parse. Use it to pick one option, score something on a scale, or answer yes/no.

References: `model:jev-1.13-free` (free, rate limited until the account's first
top-up) and `model:jev-1.13` (paid, billed per input token; output is free).
Inspect either for the full schema.
References: `model:jev-1.13` and `model:jev-1.14` (paid, billed per input token;
output is free). Both follow the latest JEV release. Inspect either for the full
schema. There is no free JEV model.

## Run

```json
{
"reference": "model:jev-1.13-free",
"reference": "model:jev-1.13",
"input": {
"state": "We sell a $29/month writing tool. Three landing-page headlines are drafted below. Audience: freelance marketers.\n1) Write faster\n2) Your drafts, done by lunch\n3) AI writing for marketers",
"questions": {
Expand Down
2 changes: 1 addition & 1 deletion skills/beatapi-video/references/run.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Over MCP, pass the same JSON to `capabilities_run`.
- **Text models** run the same way: `{"reference":"model:<id>","input":{"input":"<prompt>"}}`
returns `output_text`; `usage` token counts may include upstream system prompts
and are not comparable across models. **Decision model** JEV:
`{"reference":"model:jev-1.13-free","input":{"state":"…","questions":{…}}}` returns
`{"reference":"model:jev-1.13","input":{"state":"…","questions":{…}}}` returns
typed answers with probabilities (question types `noul`, `choice`, `score`;
a `noul` needs `instructions`, the yes/no question; `score` takes
at most 10 criteria). To rank many candidates use **one** call:
Expand Down
7 changes: 4 additions & 3 deletions test/setup-walkthrough.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ test('one loop for every capability, driven by the next field', () => {
// Text and decision models run through the same Run call.
assert.match(run, /"reference":"model:<id>","input":\{"input":"<prompt>"\}/);
assert.match(run, /output_text/);
assert.match(run, /model:jev-1\.13-free/);
assert.match(run, /model:jev-1\.13"/);
assert.doesNotMatch(run, /jev-1\.1[34]-free/);
assert.match(run, /at most 10 criteria/);
for (const [path, text] of everything) {
assert.doesNotMatch(text, /\/v1\/capabilities\/run\/status/, path);
Expand Down Expand Up @@ -144,7 +145,7 @@ test('free models are discovered at run time, never hardcoded', () => {
assert.match(free, /Read the numbers from Inspect/);
assert.match(free, /rate_limit_exceeded/);
assert.match(free, /limited-time offer/);
// The one id the page may name is the decision model its recipe covers.
// Free ids change; the page names none of them.
const ids = new Set([...free.matchAll(/model:([a-z0-9.-]+-free)/g)].map((match) => match[1]));
assert.deepEqual([...ids], ['jev-1.13-free']);
assert.deepEqual([...ids], []);
});
Loading