// (i)(j) reasoning: effort levels vs reasoning_tokens (max_tokens 2000), truncation semantics (does max_tokens include reasoning?), // multi-turn replay of reasoning_content without tools (ignored?), cache hit on repeated prefix. import { raw, save } from "./lib.ts"; const out: Record = {}; const m = "deepseek-v4-flash"; const q = "A bat and a ball cost $1.10 in total. The bat costs $1.00 more than the ball. How much does the ball cost? Answer with the number only."; for (const effort of ["low", "high", "max"]) { const t0 = Date.now(); const r = await raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, messages: [{ role: "user", content: q }], max_tokens: 2000, reasoning_effort: effort }) }); const b: any = r.body; out[`effort=${effort}`] = { status: r.status, ms: Date.now() - t0, finish: b.choices?.[0]?.finish_reason, content: b.choices?.[0]?.message?.content, reasoning_len: b.choices?.[0]?.message?.reasoning_content?.length, usage: b.usage }; console.log("effort", effort, r.status, Date.now() - t0, "ms", JSON.stringify(b.usage), "→", b.choices?.[0]?.message?.content); } // truncation: max_tokens 20 in thinking mode — does the cap include reasoning tokens? const rt = await raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, messages: [{ role: "user", content: q }], max_tokens: 20, reasoning_effort: "high" }) }); const bt: any = rt.body; out["max_tokens=20 thinking"] = { status: rt.status, finish: bt.choices?.[0]?.finish_reason, content: bt.choices?.[0]?.message?.content, reasoning_len: bt.choices?.[0]?.message?.reasoning_content?.length, usage: bt.usage }; console.log("max_tokens=20 thinking →", rt.status, bt.choices?.[0]?.finish_reason, JSON.stringify(bt.usage), "reasoning_len", bt.choices?.[0]?.message?.reasoning_content?.length, "content", JSON.stringify(bt.choices?.[0]?.message?.content)); const rt2 = await raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, messages: [{ role: "user", content: "Write a 300 word essay on rivers." }], max_tokens: 20, thinking: { type: "disabled" } }) }); const bt2: any = rt2.body; out["max_tokens=20 non-thinking"] = { status: rt2.status, finish: bt2.choices?.[0]?.finish_reason, usage: bt2.usage }; console.log("max_tokens=20 non-thinking →", rt2.status, bt2.choices?.[0]?.finish_reason, JSON.stringify(bt2.usage)); // multi-turn: replay reasoning_content without tools (docs: ignored) + measure cache hit; then bogus reasoning_content const sys = { role: "system", content: "You are a terse assistant. " + "Context filler sentence for caching purposes. ".repeat(40) }; const r1 = await raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, messages: [sys, { role: "user", content: "Remember the word 'pamplemousse'. Reply OK." }], max_tokens: 300, reasoning_effort: "low" }) }); const b1: any = r1.body; const a1 = b1.choices?.[0]?.message; console.log("turn1", r1.status, JSON.stringify(b1.usage), "reasoning_len", a1?.reasoning_content?.length); const turn2 = (assistant: any) => raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, messages: [sys, { role: "user", content: "Remember the word 'pamplemousse'. Reply OK." }, assistant, { role: "user", content: "Which word did I ask you to remember?" }], max_tokens: 300, reasoning_effort: "low" }) }); const r2a = await turn2({ role: "assistant", content: a1?.content, reasoning_content: a1?.reasoning_content }); const r2b = await turn2({ role: "assistant", content: a1?.content }); const r2c = await turn2({ role: "assistant", content: a1?.content, reasoning_content: "BOGUS reasoning that says the word was 'banana'." }); for (const [k, r] of Object.entries({ with_reasoning: r2a, without_reasoning: r2b, bogus_reasoning: r2c })) { const b: any = r.body; out[`turn2:${k}`] = { status: r.status, content: b.choices?.[0]?.message?.content, usage: b.usage, error: r.status !== 200 ? b : undefined }; console.log("turn2", k, r.status, JSON.stringify(b.usage), "→", JSON.stringify(b.choices?.[0]?.message?.content ?? b).slice(0, 200)); } out.turn1 = { status: r1.status, usage: b1.usage, content: a1?.content, reasoning_len: a1?.reasoning_content?.length }; // assistant message with reasoning_content but thinking disabled → accepted? const r3 = await raw("/chat/completions", { method: "POST", body: JSON.stringify({ model: m, thinking: { type: "disabled" }, messages: [{ role: "user", content: "Say A" }, { role: "assistant", content: "A", reasoning_content: "thinking..." }, { role: "user", content: "Say B" }], max_tokens: 20 }) }); out["reasoning_content_with_thinking_disabled"] = { status: r3.status, body: r3.body }; console.log("reasoning_content with thinking disabled →", r3.status, JSON.stringify(r3.body).slice(0, 200)); save("07-reasoning.json", out);