@@ -16,6 +16,19 @@ type PayloadCapture = {
1616 payload ?: Record < string , unknown > ;
1717} ;
1818
19+ type ThinkingPayload = {
20+ type ?: unknown ;
21+ } ;
22+
23+ type ReplayToolCall = {
24+ id ?: unknown ;
25+ type ?: unknown ;
26+ function ?: {
27+ name ?: unknown ;
28+ arguments ?: unknown ;
29+ } ;
30+ } ;
31+
1932type RegisteredProvider = Awaited < ReturnType < typeof registerSingleProviderPlugin > > ;
2033
2134const emptyUsage = {
@@ -140,6 +153,23 @@ function requireThinkingWrapper(
140153 return wrapper ;
141154}
142155
156+ function readThinking ( payload : Record < string , unknown > | undefined ) : ThinkingPayload | undefined {
157+ return payload ?. thinking as ThinkingPayload | undefined ;
158+ }
159+
160+ function readPayloadMessage (
161+ capture : PayloadCapture ,
162+ index : number ,
163+ ) : Record < string , unknown > | undefined {
164+ return ( capture . payload ?. messages as Array < Record < string , unknown > > | undefined ) ?. [ index ] ;
165+ }
166+
167+ function readFirstToolCall (
168+ message : Record < string , unknown > | undefined ,
169+ ) : ReplayToolCall | undefined {
170+ return ( message ?. tool_calls as ReplayToolCall [ ] | undefined ) ?. [ 0 ] ;
171+ }
172+
143173describe ( "deepseek provider plugin" , ( ) => {
144174 it ( "registers DeepSeek with api-key auth wizard metadata" , async ( ) => {
145175 const provider = await registerSingleProviderPlugin ( deepseekPlugin ) ;
@@ -152,10 +182,11 @@ describe("deepseek provider plugin", () => {
152182 expect ( provider . label ) . toBe ( "DeepSeek" ) ;
153183 expect ( provider . envVars ) . toEqual ( [ "DEEPSEEK_API_KEY" ] ) ;
154184 expect ( provider . auth ) . toHaveLength ( 1 ) ;
155- expect ( resolved ) . toMatchObject ( {
156- provider : { id : "deepseek" } ,
157- method : { id : "api-key" } ,
158- } ) ;
185+ if ( ! resolved ) {
186+ throw new Error ( "expected DeepSeek api-key auth choice" ) ;
187+ }
188+ expect ( resolved . provider . id ) . toBe ( "deepseek" ) ;
189+ expect ( resolved . method . id ) . toBe ( "api-key" ) ;
159190 } ) ;
160191
161192 it ( "builds the static DeepSeek model catalog" , async ( ) => {
@@ -184,14 +215,11 @@ describe("deepseek provider plugin", () => {
184215 it ( "owns OpenAI-compatible replay policy" , async ( ) => {
185216 const provider = await registerSingleProviderPlugin ( deepseekPlugin ) ;
186217
187- expect ( provider . buildReplayPolicy ?.( { modelApi : "openai-completions" } as never ) ) . toMatchObject (
188- {
189- sanitizeToolCallIds : true ,
190- toolCallIdMode : "strict" ,
191- validateGeminiTurns : true ,
192- validateAnthropicTurns : true ,
193- } ,
194- ) ;
218+ const replayPolicy = provider . buildReplayPolicy ?.( { modelApi : "openai-completions" } as never ) ;
219+ expect ( replayPolicy ?. sanitizeToolCallIds ) . toBe ( true ) ;
220+ expect ( replayPolicy ?. toolCallIdMode ) . toBe ( "strict" ) ;
221+ expect ( replayPolicy ?. validateGeminiTurns ) . toBe ( true ) ;
222+ expect ( replayPolicy ?. validateAnthropicTurns ) . toBe ( true ) ;
195223 } ) ;
196224
197225 it ( "advertises max thinking levels for DeepSeek V4 models only" , async ( ) => {
@@ -256,7 +284,7 @@ describe("deepseek provider plugin", () => {
256284 { } ,
257285 ) ;
258286
259- expect ( capturedPayload ) . toMatchObject ( { thinking : { type : "disabled" } } ) ;
287+ expect ( readThinking ( capturedPayload ) ?. type ) . toBe ( "disabled" ) ;
260288 expect ( capturedPayload ) . not . toHaveProperty ( "reasoning_effort" ) ;
261289
262290 const wrapThinkingXhigh = requireThinkingWrapper (
@@ -273,10 +301,8 @@ describe("deepseek provider plugin", () => {
273301 { } ,
274302 ) ;
275303
276- expect ( capturedPayload ) . toMatchObject ( {
277- thinking : { type : "enabled" } ,
278- reasoning_effort : "max" ,
279- } ) ;
304+ expect ( readThinking ( capturedPayload ) ?. type ) . toBe ( "enabled" ) ;
305+ expect ( capturedPayload ?. reasoning_effort ) . toBe ( "max" ) ;
280306 } ) ;
281307
282308 it ( "preserves replayed reasoning_content when DeepSeek V4 thinking is enabled" , async ( ) => {
@@ -291,24 +317,16 @@ describe("deepseek provider plugin", () => {
291317 ) ;
292318 await wrapThinkingHigh ( model , context , { } ) ;
293319
294- expect ( capture . payload ) . toMatchObject ( {
295- thinking : { type : "enabled" } ,
296- reasoning_effort : "high" ,
297- } ) ;
298- expect ( ( capture . payload ?. messages as Array < Record < string , unknown > > ) [ 1 ] ) . toMatchObject ( {
299- role : "assistant" ,
300- reasoning_content : "call reasoning" ,
301- tool_calls : [
302- {
303- id : "call_1" ,
304- type : "function" ,
305- function : {
306- name : "read" ,
307- arguments : "{}" ,
308- } ,
309- } ,
310- ] ,
311- } ) ;
320+ expect ( readThinking ( capture . payload ) ?. type ) . toBe ( "enabled" ) ;
321+ expect ( capture . payload ?. reasoning_effort ) . toBe ( "high" ) ;
322+ const assistantMessage = readPayloadMessage ( capture , 1 ) ;
323+ expect ( assistantMessage ?. role ) . toBe ( "assistant" ) ;
324+ expect ( assistantMessage ?. reasoning_content ) . toBe ( "call reasoning" ) ;
325+ const toolCall = readFirstToolCall ( assistantMessage ) ;
326+ expect ( toolCall ?. id ) . toBe ( "call_1" ) ;
327+ expect ( toolCall ?. type ) . toBe ( "function" ) ;
328+ expect ( toolCall ?. function ?. name ) . toBe ( "read" ) ;
329+ expect ( toolCall ?. function ?. arguments ) . toBe ( "{}" ) ;
312330 } ) ;
313331
314332 it ( "adds blank reasoning_content for replayed tool calls from non-DeepSeek turns" , async ( ) => {
@@ -330,20 +348,14 @@ describe("deepseek provider plugin", () => {
330348 ) ;
331349 await wrapThinkingHigh ( model , context , { } ) ;
332350
333- expect ( ( capture . payload ?. messages as Array < Record < string , unknown > > ) [ 1 ] ) . toMatchObject ( {
334- role : "assistant" ,
335- reasoning_content : "" ,
336- tool_calls : [
337- {
338- id : "call_1" ,
339- type : "function" ,
340- function : {
341- name : "read" ,
342- arguments : "{}" ,
343- } ,
344- } ,
345- ] ,
346- } ) ;
351+ const assistantMessage = readPayloadMessage ( capture , 1 ) ;
352+ expect ( assistantMessage ?. role ) . toBe ( "assistant" ) ;
353+ expect ( assistantMessage ?. reasoning_content ) . toBe ( "" ) ;
354+ const toolCall = readFirstToolCall ( assistantMessage ) ;
355+ expect ( toolCall ?. id ) . toBe ( "call_1" ) ;
356+ expect ( toolCall ?. type ) . toBe ( "function" ) ;
357+ expect ( toolCall ?. function ?. name ) . toBe ( "read" ) ;
358+ expect ( toolCall ?. function ?. arguments ) . toBe ( "{}" ) ;
347359 } ) ;
348360
349361 it ( "adds blank reasoning_content for replayed plain assistant messages" , async ( ) => {
@@ -369,11 +381,10 @@ describe("deepseek provider plugin", () => {
369381 ) ;
370382 await wrapThinkingHigh ( model , context , { } ) ;
371383
372- expect ( ( capture . payload ?. messages as Array < Record < string , unknown > > ) [ 1 ] ) . toMatchObject ( {
373- role : "assistant" ,
374- content : "Hello." ,
375- reasoning_content : "" ,
376- } ) ;
384+ const assistantMessage = readPayloadMessage ( capture , 1 ) ;
385+ expect ( assistantMessage ?. role ) . toBe ( "assistant" ) ;
386+ expect ( assistantMessage ?. content ) . toBe ( "Hello." ) ;
387+ expect ( assistantMessage ?. reasoning_content ) . toBe ( "" ) ;
377388 } ) ;
378389
379390 it ( "strips replayed reasoning_content when DeepSeek V4 thinking is disabled" , async ( ) => {
@@ -388,7 +399,7 @@ describe("deepseek provider plugin", () => {
388399 ) ;
389400 await wrapThinkingNone ( model , context , { } ) ;
390401
391- expect ( capture . payload ) . toMatchObject ( { thinking : { type : "disabled" } } ) ;
402+ expect ( readThinking ( capture . payload ) ?. type ) . toBe ( "disabled" ) ;
392403 expect ( capture . payload ) . not . toHaveProperty ( "reasoning_effort" ) ;
393404 expect ( ( capture . payload ?. messages as Array < Record < string , unknown > > ) [ 1 ] ) . not . toHaveProperty (
394405 "reasoning_content" ,
0 commit comments