Signal · guide

Which model, and what it can do

Signal knows what each model it was measured on can do, and tells you before any request is made. This file asks no model and needs no key.

Install it
pnpm add @niscorp/signal zod
Step 1 of 5

A client, described

describe says which model a client will call and what that model can do. It makes no request, so it needs no key.

A client, described
import { SignalError, createSignal, modelRegistry } from '@niscorp/signal';

const signal = createSignal('groq');
const { model, modelKnown, capabilities } = signal.describe();
console.log(model, '· measured:', modelKnown, '· JSON Schema:', capabilities.nativeJsonSchema);
Step 2 of 5

Another model

model gives a client for another model on the same provider. What it can do is read from that model’s own row.

Another model
const larger = signal.model('openai/gpt-oss-120b').describe();
console.log(larger.model, '· measured:', larger.modelKnown, '· JSON Schema:', larger.capabilities.nativeJsonSchema);
Step 3 of 5

The measured rows

modelRegistry is the table those answers come from: a row for each model on each provider it was measured on, with the day. A model on two providers has two rows.

A model with no row still runs. It is taken not to follow a JSON Schema sent with the request.

The measured rows
console.log(Object.keys(modelRegistry).length, 'rows');
const unknown = signal.model('someone/new-model').describe();
console.log(unknown.model, '· measured:', unknown.modelKnown, '· JSON Schema:', unknown.capabilities.nativeJsonSchema);
Step 4 of 5

A reasoning effort the model does not take

How hard a model reasons is the provider’s scale, and it differs from model to model. One that a measured model does not take is refused when the client is made. For a model with no row it is sent unchecked.

A reasoning effort the model does not take
try {
  createSignal('groq', { options: { reasoningEffort: 'minimal' } });
} catch (error) {
  if (!(error instanceof SignalError)) throw error;
  console.log(error.message);
}
Step 5 of 5

An endpoint of your own

Any endpoint that speaks the OpenAI protocol is a provider: give its address, a key, a model, and what it can do. What you say it can do decides how a schema is sent to it, and whether tools are refused.

An endpoint of your own
const local = createSignal({
  baseUrl: 'http://localhost:11434/v1',
  apiKey: 'none',
  model: 'llama3.2',
  capabilities: { nativeTools: true, nativeJsonMode: true },
});
console.log(local.describe().model, '· tools:', local.describe().capabilities.nativeTools);
Then

Run it.

No request was made. The first two lines are two models on Groq: only one of them was measured to follow a JSON Schema sent with the request, so the other one is sent the schema in JSON mode, with the schema in a message.

Run it
npx tsx models.mts
It prints
qwen/qwen3.8-27b · measured: true · JSON Schema: false
openai/gpt-oss-120b · measured: true · JSON Schema: true
14 rows
someone/new-model · measured: false · JSON Schema: false
reasoningEffort "minimal" is not accepted by groq qwen/qwen3.8-27b (accepts: none, default, low, medium, high; measured 2026-09-24)
llama3.2 · tools: true