






















@@ -492,6 +492,7 @@ describe("applyExtraParamsToAgent", () => {
492492cfg?: Record<string, unknown>;
493493extraParamsOverride?: Record<string, unknown>;
494494payload?: Record<string, unknown>;
495+thinkingLevel?: Parameters<typeof applyExtraParamsToAgent>[5];
495496}) {
496497const payload = params.payload ?? { store: false };
497498const baseStreamFn: StreamFn = (model, _context, options) => {
@@ -505,6 +506,7 @@ describe("applyExtraParamsToAgent", () => {
505506params.applyProvider,
506507params.applyModelId,
507508params.extraParamsOverride,
509+params.thinkingLevel,
508510);
509511const context: Context = { messages: [] };
510512void agent.streamFn?.(params.model, context, params.options ?? {});
@@ -825,6 +827,159 @@ describe("applyExtraParamsToAgent", () => {
825827expect(payload).not.toHaveProperty("store");
826828});
827829830+it("forwards chat_template_kwargs params as top-level openai-completions payload fields", () => {
831+const payload = runResponsesPayloadMutationCase({
832+applyProvider: "vllm",
833+applyModelId: "nemotron-3-super",
834+cfg: {
835+agents: {
836+defaults: {
837+models: {
838+"vllm/nemotron-3-super": {
839+params: {
840+chat_template_kwargs: {
841+enable_thinking: false,
842+force_nonempty_content: true,
843+},
844+},
845+},
846+},
847+},
848+},
849+},
850+model: {
851+api: "openai-completions",
852+provider: "vllm",
853+id: "nemotron-3-super",
854+baseUrl: "http://127.0.0.1:8000/v1",
855+} as Model<"openai-completions">,
856+payload: {
857+messages: [],
858+},
859+});
860+861+expect(payload.chat_template_kwargs).toEqual({
862+enable_thinking: false,
863+force_nonempty_content: true,
864+});
865+});
866+867+it("injects vLLM Nemotron chat_template_kwargs when thinking is off", () => {
868+const payload = runResponsesPayloadMutationCase({
869+applyProvider: "vllm",
870+applyModelId: "nemotron-3-super",
871+model: {
872+api: "openai-completions",
873+provider: "vllm",
874+id: "nemotron-3-super",
875+baseUrl: "http://127.0.0.1:8000/v1",
876+} as Model<"openai-completions">,
877+payload: {
878+messages: [],
879+},
880+thinkingLevel: "off",
881+});
882+883+expect(payload.chat_template_kwargs).toEqual({
884+enable_thinking: false,
885+force_nonempty_content: true,
886+});
887+});
888+889+it("does not inject vLLM Nemotron chat_template_kwargs when thinking is enabled", () => {
890+const payload = runResponsesPayloadMutationCase({
891+applyProvider: "vllm",
892+applyModelId: "nemotron-3-super",
893+model: {
894+api: "openai-completions",
895+provider: "vllm",
896+id: "nemotron-3-super",
897+baseUrl: "http://127.0.0.1:8000/v1",
898+} as Model<"openai-completions">,
899+payload: {
900+messages: [],
901+},
902+thinkingLevel: "low",
903+});
904+905+expect(payload).not.toHaveProperty("chat_template_kwargs");
906+});
907+908+it("lets extra_body override generated vLLM Nemotron chat_template_kwargs", () => {
909+const payload = runResponsesPayloadMutationCase({
910+applyProvider: "vllm",
911+applyModelId: "nemotron-3-super",
912+cfg: {
913+agents: {
914+defaults: {
915+models: {
916+"vllm/nemotron-3-super": {
917+params: {
918+extra_body: {
919+chat_template_kwargs: {
920+enable_thinking: true,
921+},
922+},
923+},
924+},
925+},
926+},
927+},
928+},
929+model: {
930+api: "openai-completions",
931+provider: "vllm",
932+id: "nemotron-3-super",
933+baseUrl: "http://127.0.0.1:8000/v1",
934+} as Model<"openai-completions">,
935+payload: {
936+messages: [],
937+},
938+thinkingLevel: "off",
939+});
940+941+expect(payload.chat_template_kwargs).toEqual({
942+enable_thinking: true,
943+});
944+});
945+946+it("warns and skips invalid chat_template_kwargs params", () => {
947+const warnSpy = vi.spyOn(log, "warn").mockImplementation(() => {});
948+try {
949+const payload = runResponsesPayloadMutationCase({
950+applyProvider: "vllm",
951+applyModelId: "nemotron-3-super",
952+cfg: {
953+agents: {
954+defaults: {
955+models: {
956+"vllm/nemotron-3-super": {
957+params: { chat_template_kwargs: "not-an-object" },
958+},
959+},
960+},
961+},
962+},
963+model: {
964+api: "openai-completions",
965+provider: "vllm",
966+id: "nemotron-3-super",
967+baseUrl: "http://127.0.0.1:8000/v1",
968+} as Model<"openai-completions">,
969+payload: {
970+messages: [],
971+},
972+});
973+974+expect(payload).not.toHaveProperty("chat_template_kwargs");
975+expect(warnSpy).toHaveBeenCalledWith(
976+"ignoring invalid chat_template_kwargs param: not-an-object",
977+);
978+} finally {
979+warnSpy.mockRestore();
980+}
981+});
982+828983it("warns and skips invalid extra_body params", () => {
829984const warnSpy = vi.spyOn(log, "warn").mockImplementation(() => {});
830985try {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。