@@ -12,7 +12,7 @@ vitest.mock("../utils/timeout-config", () => ({
1212 getApiRequestTimeout : vitest . fn ( ) . mockReturnValue ( 300_000 ) ,
1313} ) )
1414
15- const MOCK_TIMEOUT_MS = 300_000
15+ const MOCK_TIMEOUT_MS = 600_000
1616
1717const mockCreate = vitest . fn ( )
1818
@@ -840,6 +840,51 @@ describe("OpenAiHandler", () => {
840840 const callOptions = mockCreate . mock . calls [ 0 ] [ 1 ]
841841 expect ( callOptions ?. signal ) . toBe ( controller . signal )
842842 } )
843+
844+ it ( "should pass abort signal through to client in non-streaming createMessage" , async ( ) => {
845+ const handler = new OpenAiHandler ( {
846+ ...mockOptions ,
847+ openAiStreamingEnabled : false ,
848+ } )
849+
850+ const controller = new AbortController ( )
851+ const stream = handler . createMessage ( systemPrompt , messages , {
852+ taskId : "test-task" ,
853+ abortSignal : controller . signal as any ,
854+ } )
855+ for await ( const _ of stream ) {
856+ // consume stream
857+ }
858+
859+ expect ( mockCreate ) . toHaveBeenCalledWith (
860+ expect . any ( Object ) ,
861+ expect . objectContaining ( { signal : controller . signal } ) ,
862+ )
863+ } )
864+
865+ it ( "should pass abort signal with path for Azure AI Inference in non-streaming createMessage" , async ( ) => {
866+ const localAzureOptions = {
867+ ...mockOptions ,
868+ openAiBaseUrl : "https://test.services.ai.azure.com" ,
869+ openAiModelId : "deepseek-v3" ,
870+ azureApiVersion : "2024-05-01-preview" ,
871+ }
872+ const azureHandler = new OpenAiHandler ( localAzureOptions )
873+
874+ const controller = new AbortController ( )
875+ const stream = azureHandler . createMessage ( systemPrompt , messages , {
876+ taskId : "test-task" ,
877+ abortSignal : controller . signal ,
878+ } )
879+ for await ( const _ of stream ) {
880+ // consume stream
881+ }
882+
883+ expect ( mockCreate ) . toHaveBeenCalledWith (
884+ expect . objectContaining ( { model : localAzureOptions . openAiModelId } ) ,
885+ expect . objectContaining ( { path : "/models/chat/completions" , signal : controller . signal } ) ,
886+ )
887+ } )
843888 } )
844889 } )
845890
@@ -1538,6 +1583,87 @@ describe("OpenAiHandler", () => {
15381583 { path : "/models/chat/completions" } ,
15391584 )
15401585 } )
1586+
1587+ it ( "should pass abort signal through to client in O3 streaming createMessage" , async ( ) => {
1588+ const o3Handler = new OpenAiHandler ( o3Options )
1589+ const controller = new AbortController ( )
1590+ const systemPrompt = "You are a helpful assistant."
1591+ const messages : Anthropic . Messages . MessageParam [ ] = [
1592+ {
1593+ role : "user" ,
1594+ content : "Hello!" ,
1595+ } ,
1596+ ]
1597+
1598+ const stream = o3Handler . createMessage ( systemPrompt , messages , {
1599+ taskId : "test-task" ,
1600+ abortSignal : controller . signal as any ,
1601+ } )
1602+ for await ( const _ of stream ) {
1603+ // consume stream
1604+ }
1605+
1606+ expect ( mockCreate ) . toHaveBeenCalledWith (
1607+ expect . any ( Object ) ,
1608+ expect . objectContaining ( { signal : controller . signal } ) ,
1609+ )
1610+ } )
1611+
1612+ it ( "should pass abort signal with path for O3 model with Azure AI Inference" , async ( ) => {
1613+ const o3AzureHandler = new OpenAiHandler ( {
1614+ ...o3Options ,
1615+ openAiBaseUrl : "https://test.services.ai.azure.com" ,
1616+ } )
1617+ const controller = new AbortController ( )
1618+ const systemPrompt = "You are a helpful assistant."
1619+ const messages : Anthropic . Messages . MessageParam [ ] = [
1620+ {
1621+ role : "user" ,
1622+ content : "Hello!" ,
1623+ } ,
1624+ ]
1625+
1626+ const stream = o3AzureHandler . createMessage ( systemPrompt , messages , {
1627+ taskId : "test-task" ,
1628+ abortSignal : controller . signal ,
1629+ } )
1630+ for await ( const _ of stream ) {
1631+ // consume stream
1632+ }
1633+
1634+ expect ( mockCreate ) . toHaveBeenCalledWith (
1635+ expect . objectContaining ( { model : "o3-mini" } ) ,
1636+ expect . objectContaining ( { path : "/models/chat/completions" , signal : controller . signal } ) ,
1637+ )
1638+ } )
1639+
1640+ it ( "should pass abort signal through to client in O3 non-streaming createMessage" , async ( ) => {
1641+ const o3Handler = new OpenAiHandler ( {
1642+ ...o3Options ,
1643+ openAiStreamingEnabled : false ,
1644+ } )
1645+ const controller = new AbortController ( )
1646+ const systemPrompt = "You are a helpful assistant."
1647+ const messages : Anthropic . Messages . MessageParam [ ] = [
1648+ {
1649+ role : "user" ,
1650+ content : "Hello!" ,
1651+ } ,
1652+ ]
1653+
1654+ const stream = o3Handler . createMessage ( systemPrompt , messages , {
1655+ taskId : "test-task" ,
1656+ abortSignal : controller . signal as any ,
1657+ } )
1658+ for await ( const _ of stream ) {
1659+ // consume stream
1660+ }
1661+
1662+ expect ( mockCreate ) . toHaveBeenCalledWith (
1663+ expect . any ( Object ) ,
1664+ expect . objectContaining ( { signal : controller . signal } ) ,
1665+ )
1666+ } )
15411667 } )
15421668} )
15431669
0 commit comments