@openrouter/sdk 0.0.0-beta.37 → 0.0.0-beta.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/funcs/betaResponsesSend.d.ts +2 -2
- package/dist/commonjs/funcs/betaResponsesSend.d.ts.map +1 -1
- package/dist/commonjs/funcs/betaResponsesSend.js +1 -1
- package/dist/commonjs/funcs/betaResponsesSend.js.map +1 -1
- package/dist/commonjs/funcs/chatSend.js +1 -1
- package/dist/commonjs/funcs/chatSend.js.map +1 -1
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.d.ts +43 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.d.ts.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.js +50 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.js.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts +2 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.js +213 -0
- package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.js.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts +35 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.js +75 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.js.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts +2 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts.map +1 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js +164 -0
- package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js.map +1 -0
- package/dist/commonjs/funcs/modelsList.js +1 -1
- package/dist/commonjs/funcs/modelsList.js.map +1 -1
- package/dist/commonjs/lib/config.d.ts +3 -3
- package/dist/commonjs/lib/config.js +3 -3
- package/dist/commonjs/lib/config.js.map +1 -1
- package/dist/commonjs/models/chatgenerationparams.d.ts +16 -42
- package/dist/commonjs/models/chatgenerationparams.d.ts.map +1 -1
- package/dist/commonjs/models/chatgenerationparams.js +27 -6
- package/dist/commonjs/models/chatgenerationparams.js.map +1 -1
- package/dist/commonjs/models/chatmessagecontentitemaudio.d.ts +6 -22
- package/dist/commonjs/models/chatmessagecontentitemaudio.d.ts.map +1 -1
- package/dist/commonjs/models/chatmessagecontentitemaudio.js +10 -2
- package/dist/commonjs/models/chatmessagecontentitemaudio.js.map +1 -1
- package/dist/commonjs/models/chatmessagecontentitemimage.d.ts +6 -14
- package/dist/commonjs/models/chatmessagecontentitemimage.d.ts.map +1 -1
- package/dist/commonjs/models/chatmessagecontentitemimage.js +10 -2
- package/dist/commonjs/models/chatmessagecontentitemimage.js.map +1 -1
- package/dist/commonjs/models/chatresponsechoice.d.ts +6 -18
- package/dist/commonjs/models/chatresponsechoice.d.ts.map +1 -1
- package/dist/commonjs/models/chatresponsechoice.js +10 -2
- package/dist/commonjs/models/chatresponsechoice.js.map +1 -1
- package/dist/commonjs/models/chatstreamingchoice.d.ts +6 -18
- package/dist/commonjs/models/chatstreamingchoice.d.ts.map +1 -1
- package/dist/commonjs/models/chatstreamingchoice.js +10 -2
- package/dist/commonjs/models/chatstreamingchoice.js.map +1 -1
- package/dist/commonjs/models/completionfinishreason.d.ts +6 -14
- package/dist/commonjs/models/completionfinishreason.d.ts.map +1 -1
- package/dist/commonjs/models/completionfinishreason.js +10 -2
- package/dist/commonjs/models/completionfinishreason.js.map +1 -1
- package/dist/commonjs/models/createapikeydata.d.ts +120 -0
- package/dist/commonjs/models/createapikeydata.d.ts.map +1 -0
- package/dist/commonjs/models/createapikeydata.js +134 -0
- package/dist/commonjs/models/createapikeydata.js.map +1 -0
- package/dist/commonjs/models/endpointslist.d.ts +21 -269
- package/dist/commonjs/models/endpointslist.d.ts.map +1 -1
- package/dist/commonjs/models/endpointslist.js +37 -8
- package/dist/commonjs/models/endpointslist.js.map +1 -1
- package/dist/commonjs/models/errorresponse.d.ts +6 -148
- package/dist/commonjs/models/errorresponse.d.ts.map +1 -1
- package/dist/commonjs/models/errorresponse.js +10 -2
- package/dist/commonjs/models/errorresponse.js.map +1 -1
- package/dist/commonjs/models/getapikeydata.d.ts +120 -0
- package/dist/commonjs/models/getapikeydata.d.ts.map +1 -0
- package/dist/commonjs/models/getapikeydata.js +134 -0
- package/dist/commonjs/models/getapikeydata.js.map +1 -0
- package/dist/commonjs/models/index.d.ts +4 -0
- package/dist/commonjs/models/index.d.ts.map +1 -1
- package/dist/commonjs/models/index.js +4 -0
- package/dist/commonjs/models/index.js.map +1 -1
- package/dist/commonjs/models/keyinfo.d.ts +8 -8
- package/dist/commonjs/models/listapikeysdata.d.ts +117 -0
- package/dist/commonjs/models/listapikeysdata.d.ts.map +1 -0
- package/dist/commonjs/models/listapikeysdata.js +134 -0
- package/dist/commonjs/models/listapikeysdata.js.map +1 -0
- package/dist/commonjs/models/modelslist.d.ts +26 -178
- package/dist/commonjs/models/modelslist.d.ts.map +1 -1
- package/dist/commonjs/models/modelslist.js +46 -11
- package/dist/commonjs/models/modelslist.js.map +1 -1
- package/dist/commonjs/models/operations/addcoinbasecharge.d.ts +6 -14
- package/dist/commonjs/models/operations/addcoinbasecharge.d.ts.map +1 -1
- package/dist/commonjs/models/operations/addcoinbasecharge.js +9 -2
- package/dist/commonjs/models/operations/addcoinbasecharge.js.map +1 -1
- package/dist/commonjs/models/operations/create.d.ts +35 -68
- package/dist/commonjs/models/operations/create.d.ts.map +1 -1
- package/dist/commonjs/models/operations/create.js +39 -54
- package/dist/commonjs/models/operations/create.js.map +1 -1
- package/dist/commonjs/models/operations/createauthorizationcode.d.ts +6 -12
- package/dist/commonjs/models/operations/createauthorizationcode.d.ts.map +1 -1
- package/dist/commonjs/models/operations/createauthorizationcode.js +9 -2
- package/dist/commonjs/models/operations/createauthorizationcode.js.map +1 -1
- package/dist/commonjs/models/operations/exchangeauthorizationcode.d.ts +6 -12
- package/dist/commonjs/models/operations/exchangeauthorizationcode.d.ts.map +1 -1
- package/dist/commonjs/models/operations/exchangeauthorizationcode.js +9 -2
- package/dist/commonjs/models/operations/exchangeauthorizationcode.js.map +1 -1
- package/dist/commonjs/models/operations/generate.d.ts +37 -569
- package/dist/commonjs/models/operations/generate.d.ts.map +1 -1
- package/dist/commonjs/models/operations/generate.js +55 -12
- package/dist/commonjs/models/operations/generate.js.map +1 -1
- package/dist/commonjs/models/operations/getapikey.d.ts +3 -68
- package/dist/commonjs/models/operations/getapikey.d.ts.map +1 -1
- package/dist/commonjs/models/operations/getapikey.js +4 -55
- package/dist/commonjs/models/operations/getapikey.js.map +1 -1
- package/dist/commonjs/models/operations/getmetadata.d.ts +6 -12
- package/dist/commonjs/models/operations/getmetadata.d.ts.map +1 -1
- package/dist/commonjs/models/operations/getmetadata.js +9 -2
- package/dist/commonjs/models/operations/getmetadata.js.map +1 -1
- package/dist/commonjs/models/operations/getparameters.d.ts +11 -189
- package/dist/commonjs/models/operations/getparameters.d.ts.map +1 -1
- package/dist/commonjs/models/operations/getparameters.js +19 -4
- package/dist/commonjs/models/operations/getparameters.js.map +1 -1
- package/dist/commonjs/models/operations/list.d.ts +21 -125
- package/dist/commonjs/models/operations/list.d.ts.map +1 -1
- package/dist/commonjs/models/operations/list.js +36 -8
- package/dist/commonjs/models/operations/list.js.map +1 -1
- package/dist/commonjs/models/operations/listapikeys.d.ts +3 -65
- package/dist/commonjs/models/operations/listapikeys.d.ts.map +1 -1
- package/dist/commonjs/models/operations/listapikeys.js +4 -54
- package/dist/commonjs/models/operations/listapikeys.js.map +1 -1
- package/dist/commonjs/models/operations/previewzdr.d.ts +21 -269
- package/dist/commonjs/models/operations/previewzdr.d.ts.map +1 -1
- package/dist/commonjs/models/operations/previewzdr.js +38 -9
- package/dist/commonjs/models/operations/previewzdr.js.map +1 -1
- package/dist/commonjs/models/operations/sendresponsesrequest.d.ts +57 -621
- package/dist/commonjs/models/operations/sendresponsesrequest.d.ts.map +1 -1
- package/dist/commonjs/models/operations/sendresponsesrequest.js +88 -20
- package/dist/commonjs/models/operations/sendresponsesrequest.js.map +1 -1
- package/dist/commonjs/models/operations/update.d.ts +35 -68
- package/dist/commonjs/models/operations/update.d.ts.map +1 -1
- package/dist/commonjs/models/operations/update.js +39 -54
- package/dist/commonjs/models/operations/update.js.map +1 -1
- package/dist/commonjs/models/responsefunctioncallstatus.d.ts +6 -14
- package/dist/commonjs/models/responsefunctioncallstatus.d.ts.map +1 -1
- package/dist/commonjs/models/responsefunctioncallstatus.js +10 -2
- package/dist/commonjs/models/responsefunctioncallstatus.js.map +1 -1
- package/dist/commonjs/models/responseimagegenerationcallstatus.d.ts +6 -16
- package/dist/commonjs/models/responseimagegenerationcallstatus.d.ts.map +1 -1
- package/dist/commonjs/models/responseimagegenerationcallstatus.js +10 -2
- package/dist/commonjs/models/responseimagegenerationcallstatus.js.map +1 -1
- package/dist/commonjs/models/responseincludable.d.ts +6 -18
- package/dist/commonjs/models/responseincludable.d.ts.map +1 -1
- package/dist/commonjs/models/responseincludable.js +10 -2
- package/dist/commonjs/models/responseincludable.js.map +1 -1
- package/dist/commonjs/models/responseinputimagedetail.d.ts +6 -14
- package/dist/commonjs/models/responseinputimagedetail.d.ts.map +1 -1
- package/dist/commonjs/models/responseinputimagedetail.js +10 -2
- package/dist/commonjs/models/responseinputimagedetail.js.map +1 -1
- package/dist/commonjs/models/responsereasoningconfig.d.ts +6 -16
- package/dist/commonjs/models/responsereasoningconfig.d.ts.map +1 -1
- package/dist/commonjs/models/responsereasoningconfig.js +10 -2
- package/dist/commonjs/models/responsereasoningconfig.js.map +1 -1
- package/dist/commonjs/models/responsereasoningsummarymode.d.ts +6 -14
- package/dist/commonjs/models/responsereasoningsummarymode.d.ts.map +1 -1
- package/dist/commonjs/models/responsereasoningsummarymode.js +10 -2
- package/dist/commonjs/models/responsereasoningsummarymode.js.map +1 -1
- package/dist/commonjs/models/responsesincompletedetails.d.ts +6 -12
- package/dist/commonjs/models/responsesincompletedetails.d.ts.map +1 -1
- package/dist/commonjs/models/responsesincompletedetails.js +10 -2
- package/dist/commonjs/models/responsesincompletedetails.js.map +1 -1
- package/dist/commonjs/models/responsesnonstreamingresponse.d.ts +21 -61
- package/dist/commonjs/models/responsesnonstreamingresponse.d.ts.map +1 -1
- package/dist/commonjs/models/responsesnonstreamingresponse.js +35 -8
- package/dist/commonjs/models/responsesnonstreamingresponse.js.map +1 -1
- package/dist/commonjs/models/responsesoutputitemfilesearchcall.d.ts +6 -16
- package/dist/commonjs/models/responsesoutputitemfilesearchcall.d.ts.map +1 -1
- package/dist/commonjs/models/responsesoutputitemfilesearchcall.js +9 -2
- package/dist/commonjs/models/responsesoutputitemfilesearchcall.js.map +1 -1
- package/dist/commonjs/models/responsesoutputitemreasoning.d.ts +7 -14
- package/dist/commonjs/models/responsesoutputitemreasoning.d.ts.map +1 -1
- package/dist/commonjs/models/responsesoutputitemreasoning.js +11 -2
- package/dist/commonjs/models/responsesoutputitemreasoning.js.map +1 -1
- package/dist/commonjs/models/responsesstreamchunkunion.d.ts +31 -81
- package/dist/commonjs/models/responsesstreamchunkunion.d.ts.map +1 -1
- package/dist/commonjs/models/responsesstreamchunkunion.js +55 -12
- package/dist/commonjs/models/responsesstreamchunkunion.js.map +1 -1
- package/dist/commonjs/models/responseswebsearchcalloutput.d.ts +6 -16
- package/dist/commonjs/models/responseswebsearchcalloutput.d.ts.map +1 -1
- package/dist/commonjs/models/responseswebsearchcalloutput.js +10 -2
- package/dist/commonjs/models/responseswebsearchcalloutput.js.map +1 -1
- package/dist/commonjs/models/responsetextverbosity.d.ts +6 -14
- package/dist/commonjs/models/responsetextverbosity.d.ts.map +1 -1
- package/dist/commonjs/models/responsetextverbosity.js +10 -2
- package/dist/commonjs/models/responsetextverbosity.js.map +1 -1
- package/dist/commonjs/models/updateapikeydata.d.ts +120 -0
- package/dist/commonjs/models/updateapikeydata.d.ts.map +1 -0
- package/dist/commonjs/models/updateapikeydata.js +134 -0
- package/dist/commonjs/models/updateapikeydata.js.map +1 -0
- package/dist/commonjs/sdk/oauth.d.ts +27 -0
- package/dist/commonjs/sdk/oauth.d.ts.map +1 -1
- package/dist/commonjs/sdk/oauth.js +43 -0
- package/dist/commonjs/sdk/oauth.js.map +1 -1
- package/dist/commonjs/sdk/responses.d.ts +2 -2
- package/dist/commonjs/sdk/responses.d.ts.map +1 -1
- package/dist/esm/funcs/betaResponsesSend.d.ts +2 -2
- package/dist/esm/funcs/betaResponsesSend.d.ts.map +1 -1
- package/dist/esm/funcs/betaResponsesSend.js +1 -1
- package/dist/esm/funcs/betaResponsesSend.js.map +1 -1
- package/dist/esm/funcs/chatSend.js +1 -1
- package/dist/esm/funcs/chatSend.js.map +1 -1
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.d.ts +43 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.d.ts.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.js +44 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.js.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts +2 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.js +211 -0
- package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.js.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts +35 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.js +69 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.js.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts +2 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts.map +1 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js +162 -0
- package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js.map +1 -0
- package/dist/esm/funcs/modelsList.js +1 -1
- package/dist/esm/funcs/modelsList.js.map +1 -1
- package/dist/esm/lib/config.d.ts +3 -3
- package/dist/esm/lib/config.js +3 -3
- package/dist/esm/lib/config.js.map +1 -1
- package/dist/esm/models/chatgenerationparams.d.ts +16 -42
- package/dist/esm/models/chatgenerationparams.d.ts.map +1 -1
- package/dist/esm/models/chatgenerationparams.js +27 -6
- package/dist/esm/models/chatgenerationparams.js.map +1 -1
- package/dist/esm/models/chatmessagecontentitemaudio.d.ts +6 -22
- package/dist/esm/models/chatmessagecontentitemaudio.d.ts.map +1 -1
- package/dist/esm/models/chatmessagecontentitemaudio.js +10 -2
- package/dist/esm/models/chatmessagecontentitemaudio.js.map +1 -1
- package/dist/esm/models/chatmessagecontentitemimage.d.ts +6 -14
- package/dist/esm/models/chatmessagecontentitemimage.d.ts.map +1 -1
- package/dist/esm/models/chatmessagecontentitemimage.js +10 -2
- package/dist/esm/models/chatmessagecontentitemimage.js.map +1 -1
- package/dist/esm/models/chatresponsechoice.d.ts +6 -18
- package/dist/esm/models/chatresponsechoice.d.ts.map +1 -1
- package/dist/esm/models/chatresponsechoice.js +10 -2
- package/dist/esm/models/chatresponsechoice.js.map +1 -1
- package/dist/esm/models/chatstreamingchoice.d.ts +6 -18
- package/dist/esm/models/chatstreamingchoice.d.ts.map +1 -1
- package/dist/esm/models/chatstreamingchoice.js +10 -2
- package/dist/esm/models/chatstreamingchoice.js.map +1 -1
- package/dist/esm/models/completionfinishreason.d.ts +6 -14
- package/dist/esm/models/completionfinishreason.d.ts.map +1 -1
- package/dist/esm/models/completionfinishreason.js +10 -2
- package/dist/esm/models/completionfinishreason.js.map +1 -1
- package/dist/esm/models/createapikeydata.d.ts +120 -0
- package/dist/esm/models/createapikeydata.d.ts.map +1 -0
- package/dist/esm/models/createapikeydata.js +96 -0
- package/dist/esm/models/createapikeydata.js.map +1 -0
- package/dist/esm/models/endpointslist.d.ts +21 -269
- package/dist/esm/models/endpointslist.d.ts.map +1 -1
- package/dist/esm/models/endpointslist.js +37 -8
- package/dist/esm/models/endpointslist.js.map +1 -1
- package/dist/esm/models/errorresponse.d.ts +6 -148
- package/dist/esm/models/errorresponse.d.ts.map +1 -1
- package/dist/esm/models/errorresponse.js +10 -2
- package/dist/esm/models/errorresponse.js.map +1 -1
- package/dist/esm/models/getapikeydata.d.ts +120 -0
- package/dist/esm/models/getapikeydata.d.ts.map +1 -0
- package/dist/esm/models/getapikeydata.js +96 -0
- package/dist/esm/models/getapikeydata.js.map +1 -0
- package/dist/esm/models/index.d.ts +4 -0
- package/dist/esm/models/index.d.ts.map +1 -1
- package/dist/esm/models/index.js +4 -0
- package/dist/esm/models/index.js.map +1 -1
- package/dist/esm/models/keyinfo.d.ts +8 -8
- package/dist/esm/models/listapikeysdata.d.ts +117 -0
- package/dist/esm/models/listapikeysdata.d.ts.map +1 -0
- package/dist/esm/models/listapikeysdata.js +96 -0
- package/dist/esm/models/listapikeysdata.js.map +1 -0
- package/dist/esm/models/modelslist.d.ts +26 -178
- package/dist/esm/models/modelslist.d.ts.map +1 -1
- package/dist/esm/models/modelslist.js +46 -11
- package/dist/esm/models/modelslist.js.map +1 -1
- package/dist/esm/models/operations/addcoinbasecharge.d.ts +6 -14
- package/dist/esm/models/operations/addcoinbasecharge.d.ts.map +1 -1
- package/dist/esm/models/operations/addcoinbasecharge.js +9 -2
- package/dist/esm/models/operations/addcoinbasecharge.js.map +1 -1
- package/dist/esm/models/operations/create.d.ts +35 -68
- package/dist/esm/models/operations/create.d.ts.map +1 -1
- package/dist/esm/models/operations/create.js +38 -51
- package/dist/esm/models/operations/create.js.map +1 -1
- package/dist/esm/models/operations/createauthorizationcode.d.ts +6 -12
- package/dist/esm/models/operations/createauthorizationcode.d.ts.map +1 -1
- package/dist/esm/models/operations/createauthorizationcode.js +9 -2
- package/dist/esm/models/operations/createauthorizationcode.js.map +1 -1
- package/dist/esm/models/operations/exchangeauthorizationcode.d.ts +6 -12
- package/dist/esm/models/operations/exchangeauthorizationcode.d.ts.map +1 -1
- package/dist/esm/models/operations/exchangeauthorizationcode.js +9 -2
- package/dist/esm/models/operations/exchangeauthorizationcode.js.map +1 -1
- package/dist/esm/models/operations/generate.d.ts +37 -569
- package/dist/esm/models/operations/generate.d.ts.map +1 -1
- package/dist/esm/models/operations/generate.js +55 -12
- package/dist/esm/models/operations/generate.js.map +1 -1
- package/dist/esm/models/operations/getapikey.d.ts +3 -68
- package/dist/esm/models/operations/getapikey.d.ts.map +1 -1
- package/dist/esm/models/operations/getapikey.js +3 -52
- package/dist/esm/models/operations/getapikey.js.map +1 -1
- package/dist/esm/models/operations/getmetadata.d.ts +6 -12
- package/dist/esm/models/operations/getmetadata.d.ts.map +1 -1
- package/dist/esm/models/operations/getmetadata.js +9 -2
- package/dist/esm/models/operations/getmetadata.js.map +1 -1
- package/dist/esm/models/operations/getparameters.d.ts +11 -189
- package/dist/esm/models/operations/getparameters.d.ts.map +1 -1
- package/dist/esm/models/operations/getparameters.js +19 -4
- package/dist/esm/models/operations/getparameters.js.map +1 -1
- package/dist/esm/models/operations/list.d.ts +21 -125
- package/dist/esm/models/operations/list.d.ts.map +1 -1
- package/dist/esm/models/operations/list.js +36 -8
- package/dist/esm/models/operations/list.js.map +1 -1
- package/dist/esm/models/operations/listapikeys.d.ts +3 -65
- package/dist/esm/models/operations/listapikeys.d.ts.map +1 -1
- package/dist/esm/models/operations/listapikeys.js +3 -51
- package/dist/esm/models/operations/listapikeys.js.map +1 -1
- package/dist/esm/models/operations/previewzdr.d.ts +21 -269
- package/dist/esm/models/operations/previewzdr.d.ts.map +1 -1
- package/dist/esm/models/operations/previewzdr.js +38 -9
- package/dist/esm/models/operations/previewzdr.js.map +1 -1
- package/dist/esm/models/operations/sendresponsesrequest.d.ts +57 -621
- package/dist/esm/models/operations/sendresponsesrequest.d.ts.map +1 -1
- package/dist/esm/models/operations/sendresponsesrequest.js +88 -20
- package/dist/esm/models/operations/sendresponsesrequest.js.map +1 -1
- package/dist/esm/models/operations/update.d.ts +35 -68
- package/dist/esm/models/operations/update.d.ts.map +1 -1
- package/dist/esm/models/operations/update.js +38 -51
- package/dist/esm/models/operations/update.js.map +1 -1
- package/dist/esm/models/responsefunctioncallstatus.d.ts +6 -14
- package/dist/esm/models/responsefunctioncallstatus.d.ts.map +1 -1
- package/dist/esm/models/responsefunctioncallstatus.js +10 -2
- package/dist/esm/models/responsefunctioncallstatus.js.map +1 -1
- package/dist/esm/models/responseimagegenerationcallstatus.d.ts +6 -16
- package/dist/esm/models/responseimagegenerationcallstatus.d.ts.map +1 -1
- package/dist/esm/models/responseimagegenerationcallstatus.js +10 -2
- package/dist/esm/models/responseimagegenerationcallstatus.js.map +1 -1
- package/dist/esm/models/responseincludable.d.ts +6 -18
- package/dist/esm/models/responseincludable.d.ts.map +1 -1
- package/dist/esm/models/responseincludable.js +10 -2
- package/dist/esm/models/responseincludable.js.map +1 -1
- package/dist/esm/models/responseinputimagedetail.d.ts +6 -14
- package/dist/esm/models/responseinputimagedetail.d.ts.map +1 -1
- package/dist/esm/models/responseinputimagedetail.js +10 -2
- package/dist/esm/models/responseinputimagedetail.js.map +1 -1
- package/dist/esm/models/responsereasoningconfig.d.ts +6 -16
- package/dist/esm/models/responsereasoningconfig.d.ts.map +1 -1
- package/dist/esm/models/responsereasoningconfig.js +10 -2
- package/dist/esm/models/responsereasoningconfig.js.map +1 -1
- package/dist/esm/models/responsereasoningsummarymode.d.ts +6 -14
- package/dist/esm/models/responsereasoningsummarymode.d.ts.map +1 -1
- package/dist/esm/models/responsereasoningsummarymode.js +10 -2
- package/dist/esm/models/responsereasoningsummarymode.js.map +1 -1
- package/dist/esm/models/responsesincompletedetails.d.ts +6 -12
- package/dist/esm/models/responsesincompletedetails.d.ts.map +1 -1
- package/dist/esm/models/responsesincompletedetails.js +10 -2
- package/dist/esm/models/responsesincompletedetails.js.map +1 -1
- package/dist/esm/models/responsesnonstreamingresponse.d.ts +21 -61
- package/dist/esm/models/responsesnonstreamingresponse.d.ts.map +1 -1
- package/dist/esm/models/responsesnonstreamingresponse.js +35 -8
- package/dist/esm/models/responsesnonstreamingresponse.js.map +1 -1
- package/dist/esm/models/responsesoutputitemfilesearchcall.d.ts +6 -16
- package/dist/esm/models/responsesoutputitemfilesearchcall.d.ts.map +1 -1
- package/dist/esm/models/responsesoutputitemfilesearchcall.js +9 -2
- package/dist/esm/models/responsesoutputitemfilesearchcall.js.map +1 -1
- package/dist/esm/models/responsesoutputitemreasoning.d.ts +7 -14
- package/dist/esm/models/responsesoutputitemreasoning.d.ts.map +1 -1
- package/dist/esm/models/responsesoutputitemreasoning.js +11 -2
- package/dist/esm/models/responsesoutputitemreasoning.js.map +1 -1
- package/dist/esm/models/responsesstreamchunkunion.d.ts +31 -81
- package/dist/esm/models/responsesstreamchunkunion.d.ts.map +1 -1
- package/dist/esm/models/responsesstreamchunkunion.js +55 -12
- package/dist/esm/models/responsesstreamchunkunion.js.map +1 -1
- package/dist/esm/models/responseswebsearchcalloutput.d.ts +6 -16
- package/dist/esm/models/responseswebsearchcalloutput.d.ts.map +1 -1
- package/dist/esm/models/responseswebsearchcalloutput.js +10 -2
- package/dist/esm/models/responseswebsearchcalloutput.js.map +1 -1
- package/dist/esm/models/responsetextverbosity.d.ts +6 -14
- package/dist/esm/models/responsetextverbosity.d.ts.map +1 -1
- package/dist/esm/models/responsetextverbosity.js +10 -2
- package/dist/esm/models/responsetextverbosity.js.map +1 -1
- package/dist/esm/models/updateapikeydata.d.ts +120 -0
- package/dist/esm/models/updateapikeydata.d.ts.map +1 -0
- package/dist/esm/models/updateapikeydata.js +96 -0
- package/dist/esm/models/updateapikeydata.js.map +1 -0
- package/dist/esm/sdk/oauth.d.ts +27 -0
- package/dist/esm/sdk/oauth.d.ts.map +1 -1
- package/dist/esm/sdk/oauth.js +43 -0
- package/dist/esm/sdk/oauth.js.map +1 -1
- package/dist/esm/sdk/responses.d.ts +2 -2
- package/dist/esm/sdk/responses.d.ts.map +1 -1
- package/docs/sdks/apikeys/README.md +4 -0
- package/jsr.json +1 -1
- package/package.json +3 -2
- package/src/funcs/betaResponsesSend.ts +3 -3
- package/src/funcs/chatSend.ts +1 -1
- package/src/funcs/custom/oAuthCreateAuthorizationUrl.test.ts +265 -0
- package/src/funcs/custom/oAuthCreateAuthorizationUrl.ts +66 -0
- package/src/funcs/custom/oAuthCreateSHA256CodeChallenge.test.ts +189 -0
- package/src/funcs/custom/oAuthCreateSHA256CodeChallenge.ts +90 -0
- package/src/funcs/modelsList.ts +1 -1
- package/src/lib/config.ts +3 -3
- package/src/models/chatgenerationparams.ts +59 -20
- package/src/models/chatmessagecontentitemaudio.ts +23 -8
- package/src/models/chatmessagecontentitemimage.ts +16 -6
- package/src/models/chatresponsechoice.ts +23 -8
- package/src/models/chatstreamingchoice.ts +23 -8
- package/src/models/completionfinishreason.ts +23 -8
- package/src/models/createapikeydata.ts +222 -0
- package/src/models/endpointslist.ts +77 -25
- package/src/models/errorresponse.ts +23 -8
- package/src/models/getapikeydata.ts +218 -0
- package/src/models/index.ts +4 -0
- package/src/models/keyinfo.ts +8 -8
- package/src/models/listapikeysdata.ts +217 -0
- package/src/models/modelslist.ts +95 -32
- package/src/models/operations/addcoinbasecharge.ts +17 -6
- package/src/models/operations/create.ts +64 -123
- package/src/models/operations/createauthorizationcode.ts +20 -6
- package/src/models/operations/exchangeauthorizationcode.ts +23 -6
- package/src/models/operations/generate.ts +114 -41
- package/src/models/operations/getapikey.ts +5 -124
- package/src/models/operations/getmetadata.ts +17 -6
- package/src/models/operations/getparameters.ts +41 -15
- package/src/models/operations/list.ts +77 -25
- package/src/models/operations/listapikeys.ts +5 -122
- package/src/models/operations/previewzdr.ts +70 -25
- package/src/models/operations/sendresponsesrequest.ts +179 -63
- package/src/models/operations/update.ts +64 -123
- package/src/models/responsefunctioncallstatus.ts +23 -8
- package/src/models/responseimagegenerationcallstatus.ts +23 -8
- package/src/models/responseincludable.ts +23 -8
- package/src/models/responseinputimagedetail.ts +23 -8
- package/src/models/responsereasoningconfig.ts +23 -8
- package/src/models/responsereasoningsummarymode.ts +23 -8
- package/src/models/responsesincompletedetails.ts +23 -8
- package/src/models/responsesnonstreamingresponse.ts +78 -25
- package/src/models/responsesoutputitemfilesearchcall.ts +24 -8
- package/src/models/responsesoutputitemreasoning.ts +25 -8
- package/src/models/responsesstreamchunkunion.ts +114 -43
- package/src/models/responseswebsearchcalloutput.ts +24 -8
- package/src/models/responsetextverbosity.ts +23 -8
- package/src/models/updateapikeydata.ts +222 -0
- package/src/sdk/oauth.ts +60 -0
- package/src/sdk/responses.ts +2 -2
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { OpenRouterCore } from "../../core.js";
|
|
3
|
+
import { oAuthCreateAuthorizationUrl } from "./oAuthCreateAuthorizationUrl.js";
|
|
4
|
+
|
|
5
|
+
describe("oAuthCreateAuthorizationUrl", () => {
|
|
6
|
+
const createMockClient = (serverURL?: string) => {
|
|
7
|
+
return new OpenRouterCore({ serverURL });
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
it("should generate authorization URL with callback URL", () => {
|
|
11
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
12
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
13
|
+
callbackUrl: "https://example.com/callback",
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
expect(result.ok).toBe(true);
|
|
17
|
+
if (result.ok) {
|
|
18
|
+
const url = new URL(result.value);
|
|
19
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
20
|
+
"https://example.com/callback",
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("should generate authorization URL with URL object as callback", () => {
|
|
26
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
27
|
+
const callbackUrl = new URL("https://example.com/callback");
|
|
28
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
29
|
+
callbackUrl,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(result.ok).toBe(true);
|
|
33
|
+
if (result.ok) {
|
|
34
|
+
const url = new URL(result.value);
|
|
35
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
36
|
+
"https://example.com/callback",
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should include code challenge with S256 method", () => {
|
|
42
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
43
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
44
|
+
callbackUrl: "https://example.com/callback",
|
|
45
|
+
codeChallenge: "test-code-challenge-abc123",
|
|
46
|
+
codeChallengeMethod: "S256",
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
expect(result.ok).toBe(true);
|
|
50
|
+
if (result.ok) {
|
|
51
|
+
const url = new URL(result.value);
|
|
52
|
+
expect(url.searchParams.get("code_challenge")).toBe(
|
|
53
|
+
"test-code-challenge-abc123",
|
|
54
|
+
);
|
|
55
|
+
expect(url.searchParams.get("code_challenge_method")).toBe("S256");
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should include code challenge with plain method", () => {
|
|
60
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
61
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
62
|
+
callbackUrl: "https://example.com/callback",
|
|
63
|
+
codeChallenge: "plain-code-challenge",
|
|
64
|
+
codeChallengeMethod: "plain",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
expect(result.ok).toBe(true);
|
|
68
|
+
if (result.ok) {
|
|
69
|
+
const url = new URL(result.value);
|
|
70
|
+
expect(url.searchParams.get("code_challenge")).toBe(
|
|
71
|
+
"plain-code-challenge",
|
|
72
|
+
);
|
|
73
|
+
expect(url.searchParams.get("code_challenge_method")).toBe("plain");
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should include limit parameter when provided", () => {
|
|
78
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
79
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
80
|
+
callbackUrl: "https://example.com/callback",
|
|
81
|
+
limit: 100,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect(result.ok).toBe(true);
|
|
85
|
+
if (result.ok) {
|
|
86
|
+
const url = new URL(result.value);
|
|
87
|
+
expect(url.searchParams.get("limit")).toBe("100");
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should handle callback URL with query parameters", () => {
|
|
92
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
93
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
94
|
+
callbackUrl: "https://example.com/callback?state=abc123&redirect=true",
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
expect(result.ok).toBe(true);
|
|
98
|
+
if (result.ok) {
|
|
99
|
+
const url = new URL(result.value);
|
|
100
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
101
|
+
"https://example.com/callback?state=abc123&redirect=true",
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("should handle callback URL with special characters", () => {
|
|
107
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
108
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
109
|
+
callbackUrl: "https://example.com/callback?data=hello%20world",
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
expect(result.ok).toBe(true);
|
|
113
|
+
if (result.ok) {
|
|
114
|
+
const url = new URL(result.value);
|
|
115
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
116
|
+
"https://example.com/callback?data=hello%20world",
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("should return error for invalid callback URL string", () => {
|
|
122
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
123
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
124
|
+
callbackUrl: "not-a-valid-url" as any,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
expect(result.ok).toBe(false);
|
|
128
|
+
if (!result.ok) {
|
|
129
|
+
expect(result.error).toBeDefined();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("should handle callback URL with localhost", () => {
|
|
134
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
135
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
136
|
+
callbackUrl: "http://localhost:3000/callback",
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
expect(result.ok).toBe(true);
|
|
140
|
+
if (result.ok) {
|
|
141
|
+
const url = new URL(result.value);
|
|
142
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
143
|
+
"http://localhost:3000/callback",
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("should use default production server when no serverURL provided", () => {
|
|
149
|
+
const client = createMockClient();
|
|
150
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
151
|
+
callbackUrl: "https://example.com/callback",
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(result.ok).toBe(true);
|
|
155
|
+
if (result.ok) {
|
|
156
|
+
const url = new URL(result.value);
|
|
157
|
+
expect(url.origin).toBe("https://openrouter.ai");
|
|
158
|
+
expect(url.pathname).toBe("/auth");
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("should use custom server URL when provided", () => {
|
|
163
|
+
const client = createMockClient("https://custom.example.com/api");
|
|
164
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
165
|
+
callbackUrl: "https://example.com/callback",
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
expect(result.ok).toBe(true);
|
|
169
|
+
if (result.ok) {
|
|
170
|
+
const url = new URL(result.value);
|
|
171
|
+
expect(url.origin).toBe("https://custom.example.com");
|
|
172
|
+
expect(url.pathname).toBe("/auth");
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it("should preserve all parameters with PKCE", () => {
|
|
177
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
178
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
179
|
+
callbackUrl: "https://example.com/callback?state=xyz",
|
|
180
|
+
codeChallenge: "challenge123",
|
|
181
|
+
codeChallengeMethod: "S256",
|
|
182
|
+
limit: 50,
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
expect(result.ok).toBe(true);
|
|
186
|
+
if (result.ok) {
|
|
187
|
+
const url = new URL(result.value);
|
|
188
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
189
|
+
"https://example.com/callback?state=xyz",
|
|
190
|
+
);
|
|
191
|
+
expect(url.searchParams.get("code_challenge")).toBe("challenge123");
|
|
192
|
+
expect(url.searchParams.get("code_challenge_method")).toBe("S256");
|
|
193
|
+
expect(url.searchParams.get("limit")).toBe("50");
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("should handle callback URL with fragment", () => {
|
|
198
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
199
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
200
|
+
callbackUrl: "https://example.com/callback#section",
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
expect(result.ok).toBe(true);
|
|
204
|
+
if (result.ok) {
|
|
205
|
+
const url = new URL(result.value);
|
|
206
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
207
|
+
"https://example.com/callback#section",
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it("should return error for invalid input types", () => {
|
|
213
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
214
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
215
|
+
callbackUrl: 12345 as any,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
expect(result.ok).toBe(false);
|
|
219
|
+
if (!result.ok) {
|
|
220
|
+
expect(result.error).toBeDefined();
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("should handle URL with port number in callback", () => {
|
|
225
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
226
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
227
|
+
callbackUrl: "https://example.com:8443/callback",
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
expect(result.ok).toBe(true);
|
|
231
|
+
if (result.ok) {
|
|
232
|
+
const url = new URL(result.value);
|
|
233
|
+
expect(url.searchParams.get("callback_url")).toBe(
|
|
234
|
+
"https://example.com:8443/callback",
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("should not omit limit parameter when value is 0", () => {
|
|
240
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
241
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
242
|
+
callbackUrl: "https://example.com/callback",
|
|
243
|
+
limit: 0,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
expect(result.ok).toBe(true);
|
|
247
|
+
if (result.ok) {
|
|
248
|
+
const url = new URL(result.value);
|
|
249
|
+
expect(url.searchParams.get("limit")).toBe("0");
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("should omit limit parameter when not provided", () => {
|
|
254
|
+
const client = createMockClient("https://openrouter.ai/api/v1");
|
|
255
|
+
const result = oAuthCreateAuthorizationUrl(client, {
|
|
256
|
+
callbackUrl: "https://example.com/callback",
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
expect(result.ok).toBe(true);
|
|
260
|
+
if (result.ok) {
|
|
261
|
+
const url = new URL(result.value);
|
|
262
|
+
expect(url.searchParams.has("limit")).toBe(false);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import z from "zod/v3";
|
|
2
|
+
import { OpenRouterCore } from "../../core.js";
|
|
3
|
+
import { serverURLFromOptions } from "../../lib/config.js";
|
|
4
|
+
import { Result } from "../../types/fp.js";
|
|
5
|
+
|
|
6
|
+
const CreateAuthorizationUrlBaseSchema = z.object({
|
|
7
|
+
callbackUrl: z.union([z.string().url(), z.instanceof(URL)]),
|
|
8
|
+
limit: z.number().optional(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const CreateAuthorizationurlParamsSchema = z.union([
|
|
12
|
+
CreateAuthorizationUrlBaseSchema.extend({
|
|
13
|
+
codeChallengeMethod: z.enum(["S256", "plain"]),
|
|
14
|
+
codeChallenge: z.string(),
|
|
15
|
+
}),
|
|
16
|
+
CreateAuthorizationUrlBaseSchema,
|
|
17
|
+
]);
|
|
18
|
+
|
|
19
|
+
export type CreateAuthorizationUrlRequest = z.infer<
|
|
20
|
+
typeof CreateAuthorizationurlParamsSchema
|
|
21
|
+
>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Generate a OAuth2 authorization URL
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* Generates a URL to redirect users to for authorizing your application. The
|
|
28
|
+
* URL includes the provided callback URL and, if applicable, the code
|
|
29
|
+
* challenge parameters for PKCE.
|
|
30
|
+
*
|
|
31
|
+
* @see {@link https://openrouter.ai/docs/use-cases/oauth-pkce}
|
|
32
|
+
*/
|
|
33
|
+
export function oAuthCreateAuthorizationUrl(
|
|
34
|
+
client: OpenRouterCore,
|
|
35
|
+
params: CreateAuthorizationUrlRequest,
|
|
36
|
+
): Result<string> {
|
|
37
|
+
const parsedParams = CreateAuthorizationurlParamsSchema.safeParse(params);
|
|
38
|
+
if (!parsedParams.success) return { ok: false, error: parsedParams.error };
|
|
39
|
+
|
|
40
|
+
const baseURL = serverURLFromOptions(client._options);
|
|
41
|
+
if (!baseURL) {
|
|
42
|
+
return { ok: false, error: new Error("No server URL configured") };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Clone the URL to avoid mutating the original
|
|
46
|
+
const authURL = new URL("/auth", baseURL);
|
|
47
|
+
|
|
48
|
+
authURL.searchParams.set(
|
|
49
|
+
"callback_url",
|
|
50
|
+
parsedParams.data.callbackUrl.toString(),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
if ("codeChallengeMethod" in parsedParams.data) {
|
|
54
|
+
authURL.searchParams.set("code_challenge", parsedParams.data.codeChallenge);
|
|
55
|
+
authURL.searchParams.set(
|
|
56
|
+
"code_challenge_method",
|
|
57
|
+
parsedParams.data.codeChallengeMethod,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (parsedParams.data.limit !== undefined) {
|
|
62
|
+
authURL.searchParams.set("limit", parsedParams.data.limit.toString());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return { ok: true, value: authURL.toString() };
|
|
66
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { oAuthCreateSHA256CodeChallenge } from "./oAuthCreateSHA256CodeChallenge.js";
|
|
3
|
+
|
|
4
|
+
describe("oAuthCreateSHA256CodeChallenge", () => {
|
|
5
|
+
it("should generate code challenge from provided code verifier", async () => {
|
|
6
|
+
// Use RFC 7636 compliant verifier (43 chars minimum)
|
|
7
|
+
const codeVerifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk";
|
|
8
|
+
const result = await oAuthCreateSHA256CodeChallenge({ codeVerifier });
|
|
9
|
+
|
|
10
|
+
expect(result.ok).toBe(true);
|
|
11
|
+
if (result.ok) {
|
|
12
|
+
expect(result.value.codeVerifier).toBe(codeVerifier);
|
|
13
|
+
expect(result.value.codeChallenge).toBeTruthy();
|
|
14
|
+
expect(typeof result.value.codeChallenge).toBe("string");
|
|
15
|
+
// Code challenge should be base64url encoded (no +, /, or = characters)
|
|
16
|
+
expect(result.value.codeChallenge).not.toMatch(/[+/=]/);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should generate consistent code challenge for same verifier", async () => {
|
|
21
|
+
// RFC compliant verifier (43+ chars)
|
|
22
|
+
const codeVerifier = "a".repeat(43);
|
|
23
|
+
const result1 = await oAuthCreateSHA256CodeChallenge({ codeVerifier });
|
|
24
|
+
const result2 = await oAuthCreateSHA256CodeChallenge({ codeVerifier });
|
|
25
|
+
|
|
26
|
+
expect(result1.ok).toBe(true);
|
|
27
|
+
expect(result2.ok).toBe(true);
|
|
28
|
+
if (result1.ok && result2.ok) {
|
|
29
|
+
expect(result1.value.codeChallenge).toBe(result2.value.codeChallenge);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should generate RFC 7636 compliant random code verifier when not provided", async () => {
|
|
34
|
+
const result = await oAuthCreateSHA256CodeChallenge();
|
|
35
|
+
|
|
36
|
+
expect(result.ok).toBe(true);
|
|
37
|
+
if (result.ok) {
|
|
38
|
+
expect(result.value.codeVerifier).toBeTruthy();
|
|
39
|
+
expect(result.value.codeChallenge).toBeTruthy();
|
|
40
|
+
expect(typeof result.value.codeVerifier).toBe("string");
|
|
41
|
+
// RFC 7636: verifier should be exactly 43 characters (32 bytes base64url encoded)
|
|
42
|
+
expect(result.value.codeVerifier.length).toBe(43);
|
|
43
|
+
// Should only contain base64url characters
|
|
44
|
+
expect(result.value.codeVerifier).toMatch(/^[A-Za-z0-9_-]+$/);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should generate different code verifiers on successive calls", async () => {
|
|
49
|
+
const result1 = await oAuthCreateSHA256CodeChallenge();
|
|
50
|
+
const result2 = await oAuthCreateSHA256CodeChallenge();
|
|
51
|
+
|
|
52
|
+
expect(result1.ok).toBe(true);
|
|
53
|
+
expect(result2.ok).toBe(true);
|
|
54
|
+
if (result1.ok && result2.ok) {
|
|
55
|
+
expect(result1.value.codeVerifier).not.toBe(result2.value.codeVerifier);
|
|
56
|
+
expect(result1.value.codeChallenge).not.toBe(result2.value.codeChallenge);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should generate base64url encoded challenge (RFC 7636)", async () => {
|
|
61
|
+
const codeVerifier = "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk";
|
|
62
|
+
const result = await oAuthCreateSHA256CodeChallenge({ codeVerifier });
|
|
63
|
+
|
|
64
|
+
expect(result.ok).toBe(true);
|
|
65
|
+
if (result.ok) {
|
|
66
|
+
// Should be base64url encoded (no standard base64 chars)
|
|
67
|
+
expect(result.value.codeChallenge).not.toMatch(/\+/);
|
|
68
|
+
expect(result.value.codeChallenge).not.toMatch(/\//);
|
|
69
|
+
expect(result.value.codeChallenge).not.toMatch(/=/);
|
|
70
|
+
// Should only contain base64url characters
|
|
71
|
+
expect(result.value.codeChallenge).toMatch(/^[A-Za-z0-9_-]+$/);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("should handle invalid input type", async () => {
|
|
76
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
77
|
+
codeVerifier: 123 as any,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
expect(result.ok).toBe(false);
|
|
81
|
+
if (!result.ok) {
|
|
82
|
+
expect(result.error).toBeDefined();
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should produce SHA-256 hash of correct length", async () => {
|
|
87
|
+
const codeVerifier = "a".repeat(43); // RFC compliant length
|
|
88
|
+
const result = await oAuthCreateSHA256CodeChallenge({ codeVerifier });
|
|
89
|
+
|
|
90
|
+
expect(result.ok).toBe(true);
|
|
91
|
+
if (result.ok) {
|
|
92
|
+
// SHA-256 produces 256 bits = 32 bytes
|
|
93
|
+
// Base64url encoding of 32 bytes should be 43 characters (no padding)
|
|
94
|
+
expect(result.value.codeChallenge.length).toBe(43);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("should reject empty string code verifier (RFC 7636 violation)", async () => {
|
|
99
|
+
const result = await oAuthCreateSHA256CodeChallenge({ codeVerifier: "" });
|
|
100
|
+
|
|
101
|
+
expect(result.ok).toBe(false);
|
|
102
|
+
if (!result.ok) {
|
|
103
|
+
expect(result.error).toBeDefined();
|
|
104
|
+
expect((result.error as Error).message).toContain("at least 43 characters");
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should reject code verifier shorter than 43 characters", async () => {
|
|
109
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
110
|
+
codeVerifier: "too-short",
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
expect(result.ok).toBe(false);
|
|
114
|
+
if (!result.ok) {
|
|
115
|
+
expect(result.error).toBeDefined();
|
|
116
|
+
expect((result.error as Error).message).toContain("at least 43 characters");
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("should reject code verifier longer than 128 characters (RFC 7636)", async () => {
|
|
121
|
+
const longVerifier = "a".repeat(129);
|
|
122
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
123
|
+
codeVerifier: longVerifier,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
expect(result.ok).toBe(false);
|
|
127
|
+
if (!result.ok) {
|
|
128
|
+
expect(result.error).toBeDefined();
|
|
129
|
+
expect((result.error as Error).message).toContain("at most 128 characters");
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("should accept code verifier at maximum length (128 characters)", async () => {
|
|
134
|
+
const maxVerifier = "a".repeat(128);
|
|
135
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
136
|
+
codeVerifier: maxVerifier,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
expect(result.ok).toBe(true);
|
|
140
|
+
if (result.ok) {
|
|
141
|
+
expect(result.value.codeVerifier).toBe(maxVerifier);
|
|
142
|
+
expect(result.value.codeChallenge).toBeTruthy();
|
|
143
|
+
// SHA-256 always produces same length output regardless of input length
|
|
144
|
+
expect(result.value.codeChallenge.length).toBe(43);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("should accept RFC 7636 unreserved characters in code verifier", async () => {
|
|
149
|
+
// RFC 7636 allows: [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~"
|
|
150
|
+
const validVerifier = "aZ09-._~" + "a".repeat(35); // 43 chars total
|
|
151
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
152
|
+
codeVerifier: validVerifier,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
expect(result.ok).toBe(true);
|
|
156
|
+
if (result.ok) {
|
|
157
|
+
expect(result.value.codeVerifier).toBe(validVerifier);
|
|
158
|
+
expect(result.value.codeChallenge).toBeTruthy();
|
|
159
|
+
expect(result.value.codeChallenge.length).toBe(43);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("should reject code verifier with invalid characters", async () => {
|
|
164
|
+
// Contains invalid characters like ! @ # $ etc.
|
|
165
|
+
const invalidVerifier = "test!@#$%^&*()+=[]{}|;:',.<>?/`" + "a".repeat(13);
|
|
166
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
167
|
+
codeVerifier: invalidVerifier,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
expect(result.ok).toBe(false);
|
|
171
|
+
if (!result.ok) {
|
|
172
|
+
expect(result.error).toBeDefined();
|
|
173
|
+
expect((result.error as Error).message).toContain("unreserved characters");
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("should reject code verifier with spaces", async () => {
|
|
178
|
+
const verifierWithSpaces = "test verifier with spaces" + "a".repeat(18);
|
|
179
|
+
const result = await oAuthCreateSHA256CodeChallenge({
|
|
180
|
+
codeVerifier: verifierWithSpaces,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
expect(result.ok).toBe(false);
|
|
184
|
+
if (!result.ok) {
|
|
185
|
+
expect(result.error).toBeDefined();
|
|
186
|
+
expect((result.error as Error).message).toContain("unreserved characters");
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import z from "zod/v3";
|
|
2
|
+
import { Result } from "../../types/fp.js";
|
|
3
|
+
|
|
4
|
+
const CreateSHA256CodeChallengeRequestSchema = z.object({
|
|
5
|
+
/**
|
|
6
|
+
* If not provided, a random code verifier will be generated.
|
|
7
|
+
* If provided, must be 43-128 characters and contain only unreserved
|
|
8
|
+
* characters [A-Za-z0-9-._~] per RFC 7636.
|
|
9
|
+
*/
|
|
10
|
+
codeVerifier: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(43, "Code verifier must be at least 43 characters")
|
|
13
|
+
.max(128, "Code verifier must be at most 128 characters")
|
|
14
|
+
.regex(
|
|
15
|
+
/^[A-Za-z0-9\-._~]+$/,
|
|
16
|
+
"Code verifier must only contain unreserved characters: [A-Za-z0-9-._~]",
|
|
17
|
+
)
|
|
18
|
+
.optional(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export type CreateSHA256CodeChallengeRequest = z.infer<
|
|
22
|
+
typeof CreateSHA256CodeChallengeRequestSchema
|
|
23
|
+
>;
|
|
24
|
+
|
|
25
|
+
export type CreateSHA256CodeChallengeResponse = {
|
|
26
|
+
codeChallenge: string;
|
|
27
|
+
codeVerifier: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Convert a Uint8Array to base64url encoding (RFC 4648)
|
|
32
|
+
*/
|
|
33
|
+
function arrayBufferToBase64Url(buffer: Uint8Array): string {
|
|
34
|
+
let binary = "";
|
|
35
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
36
|
+
binary += String.fromCharCode(buffer[i]!);
|
|
37
|
+
}
|
|
38
|
+
return btoa(binary)
|
|
39
|
+
.replace(/\+/g, "-")
|
|
40
|
+
.replace(/\//g, "_")
|
|
41
|
+
.replace(/=+$/, "");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generate a cryptographically random code verifier per RFC 7636
|
|
46
|
+
*/
|
|
47
|
+
function generateCodeVerifier(): string {
|
|
48
|
+
// RFC 7636 recommends 32 octets of random data, base64url encoded = 43 chars
|
|
49
|
+
const randomBytes = crypto.getRandomValues(new Uint8Array(32));
|
|
50
|
+
return arrayBufferToBase64Url(randomBytes);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Generate a SHA-256 code challenge for PKCE
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* Generates a SHA-256 code challenge and corresponding code verifier for use
|
|
58
|
+
* in the PKCE extension to OAuth2. If no code verifier is provided, a random
|
|
59
|
+
* one will be generated according to RFC 7636 (32 random bytes, base64url
|
|
60
|
+
* encoded). If a code verifier is provided, it must be 43-128 characters and
|
|
61
|
+
* contain only unreserved characters [A-Za-z0-9-._~].
|
|
62
|
+
*
|
|
63
|
+
* @see {@link https://openrouter.ai/docs/use-cases/oauth-pkce}
|
|
64
|
+
* @see {@link https://datatracker.ietf.org/doc/html/rfc7636}
|
|
65
|
+
*/
|
|
66
|
+
export async function oAuthCreateSHA256CodeChallenge(
|
|
67
|
+
params: CreateSHA256CodeChallengeRequest = {},
|
|
68
|
+
): Promise<Result<CreateSHA256CodeChallengeResponse>> {
|
|
69
|
+
const parsedParams = CreateSHA256CodeChallengeRequestSchema.safeParse(params);
|
|
70
|
+
if (!parsedParams.success) return { ok: false, error: parsedParams.error };
|
|
71
|
+
|
|
72
|
+
const { codeVerifier = generateCodeVerifier() } = parsedParams.data;
|
|
73
|
+
|
|
74
|
+
// Generate SHA-256 hash
|
|
75
|
+
const encoder = new TextEncoder();
|
|
76
|
+
const data = encoder.encode(codeVerifier);
|
|
77
|
+
const hash = await crypto.subtle.digest("SHA-256", data);
|
|
78
|
+
|
|
79
|
+
// Convert hash to base64url
|
|
80
|
+
const hashArray = new Uint8Array(hash);
|
|
81
|
+
const codeChallenge = arrayBufferToBase64Url(hashArray);
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
ok: true,
|
|
85
|
+
value: {
|
|
86
|
+
codeChallenge,
|
|
87
|
+
codeVerifier,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
package/src/funcs/modelsList.ts
CHANGED
package/src/lib/config.ts
CHANGED
|
@@ -59,8 +59,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
|
|
|
59
59
|
export const SDK_METADATA = {
|
|
60
60
|
language: "typescript",
|
|
61
61
|
openapiDocVersion: "1.0.0",
|
|
62
|
-
sdkVersion: "0.0.0-beta.
|
|
63
|
-
genVersion: "2.723.
|
|
62
|
+
sdkVersion: "0.0.0-beta.39",
|
|
63
|
+
genVersion: "2.723.11",
|
|
64
64
|
userAgent:
|
|
65
|
-
"speakeasy-sdk/typescript 0.0.0-beta.
|
|
65
|
+
"speakeasy-sdk/typescript 0.0.0-beta.39 2.723.11 1.0.0 @openrouter/sdk",
|
|
66
66
|
} as const;
|