// Probe (c): which parameters are accepted vs rejected per model (exact error bodies). import { CHAT_MODELS, raw, save, short } from "./lib.ts"; const base = { messages: [{ role: "user", content: "Reply with the single word: ok" }] }; const variants: Record = { temperature: { temperature: 0.3, max_completion_tokens: 50 }, top_p: { top_p: 0.9, max_completion_tokens: 50 }, frequency_penalty: { frequency_penalty: 0.5, max_completion_tokens: 50 }, presence_penalty: { presence_penalty: 0.5, max_completion_tokens: 50 }, seed: { seed: 42, max_completion_tokens: 50 }, stop: { stop: ["\n"], max_completion_tokens: 50 }, max_tokens: { max_tokens: 50 }, max_completion_tokens: { max_completion_tokens: 50 }, "reasoning_effort:none": { reasoning_effort: "none", max_completion_tokens: 50 }, "reasoning_effort:low": { reasoning_effort: "low", max_completion_tokens: 200 }, "reasoning_effort:medium": { reasoning_effort: "medium", max_completion_tokens: 200 }, "reasoning_effort:high": { reasoning_effort: "high", max_completion_tokens: 400 }, "reasoning_effort:xhigh": { reasoning_effort: "xhigh", max_completion_tokens: 400 }, "reasoning_effort:minimal": { reasoning_effort: "minimal", max_completion_tokens: 50 }, "response_format:json_object": { response_format: { type: "json_object" }, messages: [{ role: "user", content: 'Return JSON {"ok":true}' }], max_completion_tokens: 100, }, top_k: { top_k: 40, max_completion_tokens: 50 }, logprobs: { logprobs: true, top_logprobs: 2, max_completion_tokens: 20 }, n2: { n: 2, max_completion_tokens: 20 }, developer_role: { messages: [{ role: "developer", content: "Be terse." }, { role: "user", content: "ok?" }], max_completion_tokens: 20 }, unknown_param: { foo_bar: 1, max_completion_tokens: 20 }, }; const results: Record> = {}; for (const model of CHAT_MODELS) { results[model] = {}; const jobs = Object.entries(variants).map(async ([name, v]) => { const payload = { model, ...base, ...v }; const r = await raw("/chat/completions", { method: "POST", body: JSON.stringify(payload) }); const b: any = r.body; const summary = r.status === 200 ? { status: 200, finish: b.choices?.[0]?.finish_reason, content: short(b.choices?.[0]?.message?.content, 60), reasoning_tokens: b.usage?.completion_tokens_details?.reasoning_tokens, completion_tokens: b.usage?.completion_tokens, n_choices: b.choices?.length, system_fingerprint: b.system_fingerprint, has_logprobs: b.choices?.[0]?.logprobs != null, } : { status: r.status, error: b }; results[model][name] = summary; console.log(model.padEnd(30), name.padEnd(28), r.status, r.status === 200 ? `rt=${summary.reasoning_tokens} ct=${summary.completion_tokens} ${summary.content}` : short(b, 220)); }); await Promise.all(jobs); } save("02-params.json", results);