SPB Git forge

spb/polyllm

Public
15commits 1branches 0releases
2.2 MBsize
maindefault branch
13 days agolast push
TypeScript 97.4% SQL 1% JavaScript 0.9% CSS 0.6%
6.9 KB · 136 lines typescript
Raw Blame History
1import { chat, save, MODELS, short } from "./lib.ts";23const base = (model: string) => ({4  model,5  messages: [{ role: "user", content: "Reply with the single word: pong" }],6  max_completion_tokens: 40,7});89const tool = {10  type: "function",11  function: {12    name: "get_weather",13    description: "Get weather for a city",14    parameters: { type: "object", properties: { city: { type: "string" } }, required: ["city"], additionalProperties: false },15  },16};1718const variants: Record<string, (m: string) => Record<string, unknown>> = {19  temperature_0_5: (m) => ({ ...base(m), temperature: 0.5 }),20  temperature_2: (m) => ({ ...base(m), temperature: 2 }),21  temperature_2_5: (m) => ({ ...base(m), temperature: 2.5 }),22  top_p: (m) => ({ ...base(m), top_p: 0.9 }),23  top_k: (m) => ({ ...base(m), top_k: 40 }),24  max_tokens: (m) => ({ model: m, messages: base(m).messages, max_tokens: 40 }),25  both_max: (m) => ({ ...base(m), max_tokens: 40 }),26  min_tokens: (m) => ({ ...base(m), min_completion_tokens: 5 }),27  stop: (m) => ({ ...base(m), stop: ["\n", "END"] }),28  seed: (m) => ({ ...base(m), seed: 42 }),29  frequency_penalty: (m) => ({ ...base(m), frequency_penalty: 0.5 }),30  presence_penalty: (m) => ({ ...base(m), presence_penalty: 0.5 }),31  logit_bias: (m) => ({ ...base(m), logit_bias: { "1234": 5 } }),32  logprobs: (m) => ({ ...base(m), logprobs: true, top_logprobs: 2 }),33  n_2: (m) => ({ ...base(m), n: 2 }),34  reasoning_effort_none: (m) => ({ ...base(m), reasoning_effort: "none" }),35  reasoning_effort_low: (m) => ({ ...base(m), reasoning_effort: "low" }),36  reasoning_effort_medium: (m) => ({ ...base(m), reasoning_effort: "medium" }),37  reasoning_effort_high: (m) => ({ ...base(m), reasoning_effort: "high" }),38  reasoning_effort_minimal: (m) => ({ ...base(m), reasoning_effort: "minimal" }),39  disable_reasoning: (m) => ({ ...base(m), disable_reasoning: true }),40  reasoning_format_parsed: (m) => ({ ...base(m), reasoning_format: "parsed" }),41  reasoning_format_raw: (m) => ({ ...base(m), reasoning_format: "raw" }),42  reasoning_format_hidden: (m) => ({ ...base(m), reasoning_format: "hidden" }),43  clear_thinking: (m) => ({ ...base(m), clear_thinking: true }),44  json_object: (m) => ({45    model: m,46    messages: [{ role: "user", content: "Return a JSON object with key answer = 4." }],47    max_completion_tokens: 60,48    response_format: { type: "json_object" },49  }),50  json_object_stream: (m) => ({51    model: m,52    messages: [{ role: "user", content: "Return a JSON object with key answer = 4." }],53    max_completion_tokens: 60,54    response_format: { type: "json_object" },55    stream: true,56  }),57  json_schema_strict: (m) => ({58    model: m,59    messages: [{ role: "user", content: "Give the sum of 2 and 2." }],60    max_completion_tokens: 60,61    response_format: {62      type: "json_schema",63      json_schema: {64        name: "sum",65        strict: true,66        schema: { type: "object", properties: { answer: { type: "integer" } }, required: ["answer"], additionalProperties: false },67      },68    },69  }),70  tools_auto: (m) => ({ ...base(m), messages: [{ role: "user", content: "Weather in Montreal?" }], max_completion_tokens: 100, tools: [tool], tool_choice: "auto" }),71  tools_required: (m) => ({ ...base(m), messages: [{ role: "user", content: "Weather in Montreal?" }], max_completion_tokens: 100, tools: [tool], tool_choice: "required" }),72  tools_named: (m) => ({ ...base(m), messages: [{ role: "user", content: "Weather in Montreal?" }], max_completion_tokens: 100, tools: [tool], tool_choice: { type: "function", function: { name: "get_weather" } } }),73  tools_parallel_false: (m) => ({ ...base(m), messages: [{ role: "user", content: "Weather in Montreal and Paris?" }], max_completion_tokens: 100, tools: [tool], parallel_tool_calls: false }),74  tools_strict: (m) => ({ ...base(m), messages: [{ role: "user", content: "Weather in Montreal?" }], max_completion_tokens: 100, tools: [{ ...tool, function: { ...tool.function, strict: true } }] }),75  tools_plus_json_schema: (m) => ({76    ...base(m),77    messages: [{ role: "user", content: "Weather in Montreal?" }],78    max_completion_tokens: 100,79    tools: [tool],80    response_format: { type: "json_schema", json_schema: { name: "x", strict: true, schema: { type: "object", properties: { a: { type: "string" } }, required: ["a"], additionalProperties: false } } },81  }),82  developer_role: (m) => ({ ...base(m), messages: [{ role: "developer", content: "Be terse." }, ...base(m).messages] }),83  system_role: (m) => ({ ...base(m), messages: [{ role: "system", content: "Be terse." }, ...base(m).messages] }),84  unknown_param: (m) => ({ ...base(m), foo_bar: 1 }),85  user_field: (m) => ({ ...base(m), user: "probe-user" }),86  service_tier_priority: (m) => ({ ...base(m), service_tier: "priority" }),87  prompt_cache_key: (m) => ({ ...base(m), prompt_cache_key: "polyllm-probe" }),88  logprobs_alone: (m) => ({ ...base(m), logprobs: true }),89  max_completion_tokens_5: (m) => ({ ...base(m), messages: [{ role: "user", content: "Write 3 sentences about Montreal." }], max_completion_tokens: 5 }),90};9192const out: Record<string, Record<string, unknown>> = {};93for (const model of MODELS) {94  out[model] = {};95  for (const [name, mk] of Object.entries(variants)) {96    const payload = mk(model);97    let r: any;98    if (payload.stream) {99      // streaming variant: just record status + first event/body100      const res = await fetch("https://api.cerebras.ai/v1/chat/completions", {101        method: "POST",102        headers: { "Content-Type": "application/json", Authorization: `Bearer ${process.env.CEREBRAS_API_KEY}` },103        body: JSON.stringify(payload),104      });105      const text = await res.text();106      let body: unknown = text;107      try {108        body = JSON.parse(text);109      } catch {}110      r = { status: res.status, body: typeof body === "string" ? short(body, 500) : body };111    } else {112      r = await chat(payload);113    }114    const b: any = r.body;115    const msg = b?.choices?.[0]?.message;116    const summary = {117      status: r.status,118      finish: b?.choices?.[0]?.finish_reason,119      content: short(msg?.content, 160),120      reasoning: msg?.reasoning !== undefined ? short(msg.reasoning, 100) : undefined,121      reasoningLen: typeof msg?.reasoning === "string" ? msg.reasoning.length : undefined,122      tool_calls: msg?.tool_calls ? short(msg.tool_calls, 200) : undefined,123      usage: b?.usage,124      logprobs: b?.choices?.[0]?.logprobs ? short(b.choices[0].logprobs, 200) : undefined,125      nChoices: b?.choices?.length,126      error: r.status !== 200 ? b : undefined,127      system_fingerprint: b?.system_fingerprint,128      service_tier: b?.service_tier,129      service_tier_used: b?.service_tier_used,130    };131    out[model][name] = summary;132    console.log(`${model} | ${name} | ${r.status} | ${summary.finish ?? ""} | ${short(summary.error ?? summary.content, 200)}${summary.reasoningLen !== undefined ? ` | reasoningLen=${summary.reasoningLen} rt=${b?.usage?.completion_tokens_details?.reasoning_tokens}` : ""}`);133  }134}135save("02-params.json", out);136