@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.
Files changed (442) hide show
  1. package/dist/commonjs/funcs/betaResponsesSend.d.ts +2 -2
  2. package/dist/commonjs/funcs/betaResponsesSend.d.ts.map +1 -1
  3. package/dist/commonjs/funcs/betaResponsesSend.js +1 -1
  4. package/dist/commonjs/funcs/betaResponsesSend.js.map +1 -1
  5. package/dist/commonjs/funcs/chatSend.js +1 -1
  6. package/dist/commonjs/funcs/chatSend.js.map +1 -1
  7. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.d.ts +43 -0
  8. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.d.ts.map +1 -0
  9. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.js +50 -0
  10. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.js.map +1 -0
  11. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts +2 -0
  12. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts.map +1 -0
  13. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.js +213 -0
  14. package/dist/commonjs/funcs/custom/oAuthCreateAuthorizationUrl.test.js.map +1 -0
  15. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts +35 -0
  16. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts.map +1 -0
  17. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.js +75 -0
  18. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.js.map +1 -0
  19. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts +2 -0
  20. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts.map +1 -0
  21. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js +164 -0
  22. package/dist/commonjs/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js.map +1 -0
  23. package/dist/commonjs/funcs/modelsList.js +1 -1
  24. package/dist/commonjs/funcs/modelsList.js.map +1 -1
  25. package/dist/commonjs/lib/config.d.ts +3 -3
  26. package/dist/commonjs/lib/config.js +3 -3
  27. package/dist/commonjs/lib/config.js.map +1 -1
  28. package/dist/commonjs/models/chatgenerationparams.d.ts +16 -42
  29. package/dist/commonjs/models/chatgenerationparams.d.ts.map +1 -1
  30. package/dist/commonjs/models/chatgenerationparams.js +27 -6
  31. package/dist/commonjs/models/chatgenerationparams.js.map +1 -1
  32. package/dist/commonjs/models/chatmessagecontentitemaudio.d.ts +6 -22
  33. package/dist/commonjs/models/chatmessagecontentitemaudio.d.ts.map +1 -1
  34. package/dist/commonjs/models/chatmessagecontentitemaudio.js +10 -2
  35. package/dist/commonjs/models/chatmessagecontentitemaudio.js.map +1 -1
  36. package/dist/commonjs/models/chatmessagecontentitemimage.d.ts +6 -14
  37. package/dist/commonjs/models/chatmessagecontentitemimage.d.ts.map +1 -1
  38. package/dist/commonjs/models/chatmessagecontentitemimage.js +10 -2
  39. package/dist/commonjs/models/chatmessagecontentitemimage.js.map +1 -1
  40. package/dist/commonjs/models/chatresponsechoice.d.ts +6 -18
  41. package/dist/commonjs/models/chatresponsechoice.d.ts.map +1 -1
  42. package/dist/commonjs/models/chatresponsechoice.js +10 -2
  43. package/dist/commonjs/models/chatresponsechoice.js.map +1 -1
  44. package/dist/commonjs/models/chatstreamingchoice.d.ts +6 -18
  45. package/dist/commonjs/models/chatstreamingchoice.d.ts.map +1 -1
  46. package/dist/commonjs/models/chatstreamingchoice.js +10 -2
  47. package/dist/commonjs/models/chatstreamingchoice.js.map +1 -1
  48. package/dist/commonjs/models/completionfinishreason.d.ts +6 -14
  49. package/dist/commonjs/models/completionfinishreason.d.ts.map +1 -1
  50. package/dist/commonjs/models/completionfinishreason.js +10 -2
  51. package/dist/commonjs/models/completionfinishreason.js.map +1 -1
  52. package/dist/commonjs/models/createapikeydata.d.ts +120 -0
  53. package/dist/commonjs/models/createapikeydata.d.ts.map +1 -0
  54. package/dist/commonjs/models/createapikeydata.js +134 -0
  55. package/dist/commonjs/models/createapikeydata.js.map +1 -0
  56. package/dist/commonjs/models/endpointslist.d.ts +21 -269
  57. package/dist/commonjs/models/endpointslist.d.ts.map +1 -1
  58. package/dist/commonjs/models/endpointslist.js +37 -8
  59. package/dist/commonjs/models/endpointslist.js.map +1 -1
  60. package/dist/commonjs/models/errorresponse.d.ts +6 -148
  61. package/dist/commonjs/models/errorresponse.d.ts.map +1 -1
  62. package/dist/commonjs/models/errorresponse.js +10 -2
  63. package/dist/commonjs/models/errorresponse.js.map +1 -1
  64. package/dist/commonjs/models/getapikeydata.d.ts +120 -0
  65. package/dist/commonjs/models/getapikeydata.d.ts.map +1 -0
  66. package/dist/commonjs/models/getapikeydata.js +134 -0
  67. package/dist/commonjs/models/getapikeydata.js.map +1 -0
  68. package/dist/commonjs/models/index.d.ts +4 -0
  69. package/dist/commonjs/models/index.d.ts.map +1 -1
  70. package/dist/commonjs/models/index.js +4 -0
  71. package/dist/commonjs/models/index.js.map +1 -1
  72. package/dist/commonjs/models/keyinfo.d.ts +8 -8
  73. package/dist/commonjs/models/listapikeysdata.d.ts +117 -0
  74. package/dist/commonjs/models/listapikeysdata.d.ts.map +1 -0
  75. package/dist/commonjs/models/listapikeysdata.js +134 -0
  76. package/dist/commonjs/models/listapikeysdata.js.map +1 -0
  77. package/dist/commonjs/models/modelslist.d.ts +26 -178
  78. package/dist/commonjs/models/modelslist.d.ts.map +1 -1
  79. package/dist/commonjs/models/modelslist.js +46 -11
  80. package/dist/commonjs/models/modelslist.js.map +1 -1
  81. package/dist/commonjs/models/operations/addcoinbasecharge.d.ts +6 -14
  82. package/dist/commonjs/models/operations/addcoinbasecharge.d.ts.map +1 -1
  83. package/dist/commonjs/models/operations/addcoinbasecharge.js +9 -2
  84. package/dist/commonjs/models/operations/addcoinbasecharge.js.map +1 -1
  85. package/dist/commonjs/models/operations/create.d.ts +35 -68
  86. package/dist/commonjs/models/operations/create.d.ts.map +1 -1
  87. package/dist/commonjs/models/operations/create.js +39 -54
  88. package/dist/commonjs/models/operations/create.js.map +1 -1
  89. package/dist/commonjs/models/operations/createauthorizationcode.d.ts +6 -12
  90. package/dist/commonjs/models/operations/createauthorizationcode.d.ts.map +1 -1
  91. package/dist/commonjs/models/operations/createauthorizationcode.js +9 -2
  92. package/dist/commonjs/models/operations/createauthorizationcode.js.map +1 -1
  93. package/dist/commonjs/models/operations/exchangeauthorizationcode.d.ts +6 -12
  94. package/dist/commonjs/models/operations/exchangeauthorizationcode.d.ts.map +1 -1
  95. package/dist/commonjs/models/operations/exchangeauthorizationcode.js +9 -2
  96. package/dist/commonjs/models/operations/exchangeauthorizationcode.js.map +1 -1
  97. package/dist/commonjs/models/operations/generate.d.ts +37 -569
  98. package/dist/commonjs/models/operations/generate.d.ts.map +1 -1
  99. package/dist/commonjs/models/operations/generate.js +55 -12
  100. package/dist/commonjs/models/operations/generate.js.map +1 -1
  101. package/dist/commonjs/models/operations/getapikey.d.ts +3 -68
  102. package/dist/commonjs/models/operations/getapikey.d.ts.map +1 -1
  103. package/dist/commonjs/models/operations/getapikey.js +4 -55
  104. package/dist/commonjs/models/operations/getapikey.js.map +1 -1
  105. package/dist/commonjs/models/operations/getmetadata.d.ts +6 -12
  106. package/dist/commonjs/models/operations/getmetadata.d.ts.map +1 -1
  107. package/dist/commonjs/models/operations/getmetadata.js +9 -2
  108. package/dist/commonjs/models/operations/getmetadata.js.map +1 -1
  109. package/dist/commonjs/models/operations/getparameters.d.ts +11 -189
  110. package/dist/commonjs/models/operations/getparameters.d.ts.map +1 -1
  111. package/dist/commonjs/models/operations/getparameters.js +19 -4
  112. package/dist/commonjs/models/operations/getparameters.js.map +1 -1
  113. package/dist/commonjs/models/operations/list.d.ts +21 -125
  114. package/dist/commonjs/models/operations/list.d.ts.map +1 -1
  115. package/dist/commonjs/models/operations/list.js +36 -8
  116. package/dist/commonjs/models/operations/list.js.map +1 -1
  117. package/dist/commonjs/models/operations/listapikeys.d.ts +3 -65
  118. package/dist/commonjs/models/operations/listapikeys.d.ts.map +1 -1
  119. package/dist/commonjs/models/operations/listapikeys.js +4 -54
  120. package/dist/commonjs/models/operations/listapikeys.js.map +1 -1
  121. package/dist/commonjs/models/operations/previewzdr.d.ts +21 -269
  122. package/dist/commonjs/models/operations/previewzdr.d.ts.map +1 -1
  123. package/dist/commonjs/models/operations/previewzdr.js +38 -9
  124. package/dist/commonjs/models/operations/previewzdr.js.map +1 -1
  125. package/dist/commonjs/models/operations/sendresponsesrequest.d.ts +57 -621
  126. package/dist/commonjs/models/operations/sendresponsesrequest.d.ts.map +1 -1
  127. package/dist/commonjs/models/operations/sendresponsesrequest.js +88 -20
  128. package/dist/commonjs/models/operations/sendresponsesrequest.js.map +1 -1
  129. package/dist/commonjs/models/operations/update.d.ts +35 -68
  130. package/dist/commonjs/models/operations/update.d.ts.map +1 -1
  131. package/dist/commonjs/models/operations/update.js +39 -54
  132. package/dist/commonjs/models/operations/update.js.map +1 -1
  133. package/dist/commonjs/models/responsefunctioncallstatus.d.ts +6 -14
  134. package/dist/commonjs/models/responsefunctioncallstatus.d.ts.map +1 -1
  135. package/dist/commonjs/models/responsefunctioncallstatus.js +10 -2
  136. package/dist/commonjs/models/responsefunctioncallstatus.js.map +1 -1
  137. package/dist/commonjs/models/responseimagegenerationcallstatus.d.ts +6 -16
  138. package/dist/commonjs/models/responseimagegenerationcallstatus.d.ts.map +1 -1
  139. package/dist/commonjs/models/responseimagegenerationcallstatus.js +10 -2
  140. package/dist/commonjs/models/responseimagegenerationcallstatus.js.map +1 -1
  141. package/dist/commonjs/models/responseincludable.d.ts +6 -18
  142. package/dist/commonjs/models/responseincludable.d.ts.map +1 -1
  143. package/dist/commonjs/models/responseincludable.js +10 -2
  144. package/dist/commonjs/models/responseincludable.js.map +1 -1
  145. package/dist/commonjs/models/responseinputimagedetail.d.ts +6 -14
  146. package/dist/commonjs/models/responseinputimagedetail.d.ts.map +1 -1
  147. package/dist/commonjs/models/responseinputimagedetail.js +10 -2
  148. package/dist/commonjs/models/responseinputimagedetail.js.map +1 -1
  149. package/dist/commonjs/models/responsereasoningconfig.d.ts +6 -16
  150. package/dist/commonjs/models/responsereasoningconfig.d.ts.map +1 -1
  151. package/dist/commonjs/models/responsereasoningconfig.js +10 -2
  152. package/dist/commonjs/models/responsereasoningconfig.js.map +1 -1
  153. package/dist/commonjs/models/responsereasoningsummarymode.d.ts +6 -14
  154. package/dist/commonjs/models/responsereasoningsummarymode.d.ts.map +1 -1
  155. package/dist/commonjs/models/responsereasoningsummarymode.js +10 -2
  156. package/dist/commonjs/models/responsereasoningsummarymode.js.map +1 -1
  157. package/dist/commonjs/models/responsesincompletedetails.d.ts +6 -12
  158. package/dist/commonjs/models/responsesincompletedetails.d.ts.map +1 -1
  159. package/dist/commonjs/models/responsesincompletedetails.js +10 -2
  160. package/dist/commonjs/models/responsesincompletedetails.js.map +1 -1
  161. package/dist/commonjs/models/responsesnonstreamingresponse.d.ts +21 -61
  162. package/dist/commonjs/models/responsesnonstreamingresponse.d.ts.map +1 -1
  163. package/dist/commonjs/models/responsesnonstreamingresponse.js +35 -8
  164. package/dist/commonjs/models/responsesnonstreamingresponse.js.map +1 -1
  165. package/dist/commonjs/models/responsesoutputitemfilesearchcall.d.ts +6 -16
  166. package/dist/commonjs/models/responsesoutputitemfilesearchcall.d.ts.map +1 -1
  167. package/dist/commonjs/models/responsesoutputitemfilesearchcall.js +9 -2
  168. package/dist/commonjs/models/responsesoutputitemfilesearchcall.js.map +1 -1
  169. package/dist/commonjs/models/responsesoutputitemreasoning.d.ts +7 -14
  170. package/dist/commonjs/models/responsesoutputitemreasoning.d.ts.map +1 -1
  171. package/dist/commonjs/models/responsesoutputitemreasoning.js +11 -2
  172. package/dist/commonjs/models/responsesoutputitemreasoning.js.map +1 -1
  173. package/dist/commonjs/models/responsesstreamchunkunion.d.ts +31 -81
  174. package/dist/commonjs/models/responsesstreamchunkunion.d.ts.map +1 -1
  175. package/dist/commonjs/models/responsesstreamchunkunion.js +55 -12
  176. package/dist/commonjs/models/responsesstreamchunkunion.js.map +1 -1
  177. package/dist/commonjs/models/responseswebsearchcalloutput.d.ts +6 -16
  178. package/dist/commonjs/models/responseswebsearchcalloutput.d.ts.map +1 -1
  179. package/dist/commonjs/models/responseswebsearchcalloutput.js +10 -2
  180. package/dist/commonjs/models/responseswebsearchcalloutput.js.map +1 -1
  181. package/dist/commonjs/models/responsetextverbosity.d.ts +6 -14
  182. package/dist/commonjs/models/responsetextverbosity.d.ts.map +1 -1
  183. package/dist/commonjs/models/responsetextverbosity.js +10 -2
  184. package/dist/commonjs/models/responsetextverbosity.js.map +1 -1
  185. package/dist/commonjs/models/updateapikeydata.d.ts +120 -0
  186. package/dist/commonjs/models/updateapikeydata.d.ts.map +1 -0
  187. package/dist/commonjs/models/updateapikeydata.js +134 -0
  188. package/dist/commonjs/models/updateapikeydata.js.map +1 -0
  189. package/dist/commonjs/sdk/oauth.d.ts +27 -0
  190. package/dist/commonjs/sdk/oauth.d.ts.map +1 -1
  191. package/dist/commonjs/sdk/oauth.js +43 -0
  192. package/dist/commonjs/sdk/oauth.js.map +1 -1
  193. package/dist/commonjs/sdk/responses.d.ts +2 -2
  194. package/dist/commonjs/sdk/responses.d.ts.map +1 -1
  195. package/dist/esm/funcs/betaResponsesSend.d.ts +2 -2
  196. package/dist/esm/funcs/betaResponsesSend.d.ts.map +1 -1
  197. package/dist/esm/funcs/betaResponsesSend.js +1 -1
  198. package/dist/esm/funcs/betaResponsesSend.js.map +1 -1
  199. package/dist/esm/funcs/chatSend.js +1 -1
  200. package/dist/esm/funcs/chatSend.js.map +1 -1
  201. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.d.ts +43 -0
  202. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.d.ts.map +1 -0
  203. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.js +44 -0
  204. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.js.map +1 -0
  205. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts +2 -0
  206. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.d.ts.map +1 -0
  207. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.js +211 -0
  208. package/dist/esm/funcs/custom/oAuthCreateAuthorizationUrl.test.js.map +1 -0
  209. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts +35 -0
  210. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.d.ts.map +1 -0
  211. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.js +69 -0
  212. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.js.map +1 -0
  213. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts +2 -0
  214. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.d.ts.map +1 -0
  215. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js +162 -0
  216. package/dist/esm/funcs/custom/oAuthCreateSHA256CodeChallenge.test.js.map +1 -0
  217. package/dist/esm/funcs/modelsList.js +1 -1
  218. package/dist/esm/funcs/modelsList.js.map +1 -1
  219. package/dist/esm/lib/config.d.ts +3 -3
  220. package/dist/esm/lib/config.js +3 -3
  221. package/dist/esm/lib/config.js.map +1 -1
  222. package/dist/esm/models/chatgenerationparams.d.ts +16 -42
  223. package/dist/esm/models/chatgenerationparams.d.ts.map +1 -1
  224. package/dist/esm/models/chatgenerationparams.js +27 -6
  225. package/dist/esm/models/chatgenerationparams.js.map +1 -1
  226. package/dist/esm/models/chatmessagecontentitemaudio.d.ts +6 -22
  227. package/dist/esm/models/chatmessagecontentitemaudio.d.ts.map +1 -1
  228. package/dist/esm/models/chatmessagecontentitemaudio.js +10 -2
  229. package/dist/esm/models/chatmessagecontentitemaudio.js.map +1 -1
  230. package/dist/esm/models/chatmessagecontentitemimage.d.ts +6 -14
  231. package/dist/esm/models/chatmessagecontentitemimage.d.ts.map +1 -1
  232. package/dist/esm/models/chatmessagecontentitemimage.js +10 -2
  233. package/dist/esm/models/chatmessagecontentitemimage.js.map +1 -1
  234. package/dist/esm/models/chatresponsechoice.d.ts +6 -18
  235. package/dist/esm/models/chatresponsechoice.d.ts.map +1 -1
  236. package/dist/esm/models/chatresponsechoice.js +10 -2
  237. package/dist/esm/models/chatresponsechoice.js.map +1 -1
  238. package/dist/esm/models/chatstreamingchoice.d.ts +6 -18
  239. package/dist/esm/models/chatstreamingchoice.d.ts.map +1 -1
  240. package/dist/esm/models/chatstreamingchoice.js +10 -2
  241. package/dist/esm/models/chatstreamingchoice.js.map +1 -1
  242. package/dist/esm/models/completionfinishreason.d.ts +6 -14
  243. package/dist/esm/models/completionfinishreason.d.ts.map +1 -1
  244. package/dist/esm/models/completionfinishreason.js +10 -2
  245. package/dist/esm/models/completionfinishreason.js.map +1 -1
  246. package/dist/esm/models/createapikeydata.d.ts +120 -0
  247. package/dist/esm/models/createapikeydata.d.ts.map +1 -0
  248. package/dist/esm/models/createapikeydata.js +96 -0
  249. package/dist/esm/models/createapikeydata.js.map +1 -0
  250. package/dist/esm/models/endpointslist.d.ts +21 -269
  251. package/dist/esm/models/endpointslist.d.ts.map +1 -1
  252. package/dist/esm/models/endpointslist.js +37 -8
  253. package/dist/esm/models/endpointslist.js.map +1 -1
  254. package/dist/esm/models/errorresponse.d.ts +6 -148
  255. package/dist/esm/models/errorresponse.d.ts.map +1 -1
  256. package/dist/esm/models/errorresponse.js +10 -2
  257. package/dist/esm/models/errorresponse.js.map +1 -1
  258. package/dist/esm/models/getapikeydata.d.ts +120 -0
  259. package/dist/esm/models/getapikeydata.d.ts.map +1 -0
  260. package/dist/esm/models/getapikeydata.js +96 -0
  261. package/dist/esm/models/getapikeydata.js.map +1 -0
  262. package/dist/esm/models/index.d.ts +4 -0
  263. package/dist/esm/models/index.d.ts.map +1 -1
  264. package/dist/esm/models/index.js +4 -0
  265. package/dist/esm/models/index.js.map +1 -1
  266. package/dist/esm/models/keyinfo.d.ts +8 -8
  267. package/dist/esm/models/listapikeysdata.d.ts +117 -0
  268. package/dist/esm/models/listapikeysdata.d.ts.map +1 -0
  269. package/dist/esm/models/listapikeysdata.js +96 -0
  270. package/dist/esm/models/listapikeysdata.js.map +1 -0
  271. package/dist/esm/models/modelslist.d.ts +26 -178
  272. package/dist/esm/models/modelslist.d.ts.map +1 -1
  273. package/dist/esm/models/modelslist.js +46 -11
  274. package/dist/esm/models/modelslist.js.map +1 -1
  275. package/dist/esm/models/operations/addcoinbasecharge.d.ts +6 -14
  276. package/dist/esm/models/operations/addcoinbasecharge.d.ts.map +1 -1
  277. package/dist/esm/models/operations/addcoinbasecharge.js +9 -2
  278. package/dist/esm/models/operations/addcoinbasecharge.js.map +1 -1
  279. package/dist/esm/models/operations/create.d.ts +35 -68
  280. package/dist/esm/models/operations/create.d.ts.map +1 -1
  281. package/dist/esm/models/operations/create.js +38 -51
  282. package/dist/esm/models/operations/create.js.map +1 -1
  283. package/dist/esm/models/operations/createauthorizationcode.d.ts +6 -12
  284. package/dist/esm/models/operations/createauthorizationcode.d.ts.map +1 -1
  285. package/dist/esm/models/operations/createauthorizationcode.js +9 -2
  286. package/dist/esm/models/operations/createauthorizationcode.js.map +1 -1
  287. package/dist/esm/models/operations/exchangeauthorizationcode.d.ts +6 -12
  288. package/dist/esm/models/operations/exchangeauthorizationcode.d.ts.map +1 -1
  289. package/dist/esm/models/operations/exchangeauthorizationcode.js +9 -2
  290. package/dist/esm/models/operations/exchangeauthorizationcode.js.map +1 -1
  291. package/dist/esm/models/operations/generate.d.ts +37 -569
  292. package/dist/esm/models/operations/generate.d.ts.map +1 -1
  293. package/dist/esm/models/operations/generate.js +55 -12
  294. package/dist/esm/models/operations/generate.js.map +1 -1
  295. package/dist/esm/models/operations/getapikey.d.ts +3 -68
  296. package/dist/esm/models/operations/getapikey.d.ts.map +1 -1
  297. package/dist/esm/models/operations/getapikey.js +3 -52
  298. package/dist/esm/models/operations/getapikey.js.map +1 -1
  299. package/dist/esm/models/operations/getmetadata.d.ts +6 -12
  300. package/dist/esm/models/operations/getmetadata.d.ts.map +1 -1
  301. package/dist/esm/models/operations/getmetadata.js +9 -2
  302. package/dist/esm/models/operations/getmetadata.js.map +1 -1
  303. package/dist/esm/models/operations/getparameters.d.ts +11 -189
  304. package/dist/esm/models/operations/getparameters.d.ts.map +1 -1
  305. package/dist/esm/models/operations/getparameters.js +19 -4
  306. package/dist/esm/models/operations/getparameters.js.map +1 -1
  307. package/dist/esm/models/operations/list.d.ts +21 -125
  308. package/dist/esm/models/operations/list.d.ts.map +1 -1
  309. package/dist/esm/models/operations/list.js +36 -8
  310. package/dist/esm/models/operations/list.js.map +1 -1
  311. package/dist/esm/models/operations/listapikeys.d.ts +3 -65
  312. package/dist/esm/models/operations/listapikeys.d.ts.map +1 -1
  313. package/dist/esm/models/operations/listapikeys.js +3 -51
  314. package/dist/esm/models/operations/listapikeys.js.map +1 -1
  315. package/dist/esm/models/operations/previewzdr.d.ts +21 -269
  316. package/dist/esm/models/operations/previewzdr.d.ts.map +1 -1
  317. package/dist/esm/models/operations/previewzdr.js +38 -9
  318. package/dist/esm/models/operations/previewzdr.js.map +1 -1
  319. package/dist/esm/models/operations/sendresponsesrequest.d.ts +57 -621
  320. package/dist/esm/models/operations/sendresponsesrequest.d.ts.map +1 -1
  321. package/dist/esm/models/operations/sendresponsesrequest.js +88 -20
  322. package/dist/esm/models/operations/sendresponsesrequest.js.map +1 -1
  323. package/dist/esm/models/operations/update.d.ts +35 -68
  324. package/dist/esm/models/operations/update.d.ts.map +1 -1
  325. package/dist/esm/models/operations/update.js +38 -51
  326. package/dist/esm/models/operations/update.js.map +1 -1
  327. package/dist/esm/models/responsefunctioncallstatus.d.ts +6 -14
  328. package/dist/esm/models/responsefunctioncallstatus.d.ts.map +1 -1
  329. package/dist/esm/models/responsefunctioncallstatus.js +10 -2
  330. package/dist/esm/models/responsefunctioncallstatus.js.map +1 -1
  331. package/dist/esm/models/responseimagegenerationcallstatus.d.ts +6 -16
  332. package/dist/esm/models/responseimagegenerationcallstatus.d.ts.map +1 -1
  333. package/dist/esm/models/responseimagegenerationcallstatus.js +10 -2
  334. package/dist/esm/models/responseimagegenerationcallstatus.js.map +1 -1
  335. package/dist/esm/models/responseincludable.d.ts +6 -18
  336. package/dist/esm/models/responseincludable.d.ts.map +1 -1
  337. package/dist/esm/models/responseincludable.js +10 -2
  338. package/dist/esm/models/responseincludable.js.map +1 -1
  339. package/dist/esm/models/responseinputimagedetail.d.ts +6 -14
  340. package/dist/esm/models/responseinputimagedetail.d.ts.map +1 -1
  341. package/dist/esm/models/responseinputimagedetail.js +10 -2
  342. package/dist/esm/models/responseinputimagedetail.js.map +1 -1
  343. package/dist/esm/models/responsereasoningconfig.d.ts +6 -16
  344. package/dist/esm/models/responsereasoningconfig.d.ts.map +1 -1
  345. package/dist/esm/models/responsereasoningconfig.js +10 -2
  346. package/dist/esm/models/responsereasoningconfig.js.map +1 -1
  347. package/dist/esm/models/responsereasoningsummarymode.d.ts +6 -14
  348. package/dist/esm/models/responsereasoningsummarymode.d.ts.map +1 -1
  349. package/dist/esm/models/responsereasoningsummarymode.js +10 -2
  350. package/dist/esm/models/responsereasoningsummarymode.js.map +1 -1
  351. package/dist/esm/models/responsesincompletedetails.d.ts +6 -12
  352. package/dist/esm/models/responsesincompletedetails.d.ts.map +1 -1
  353. package/dist/esm/models/responsesincompletedetails.js +10 -2
  354. package/dist/esm/models/responsesincompletedetails.js.map +1 -1
  355. package/dist/esm/models/responsesnonstreamingresponse.d.ts +21 -61
  356. package/dist/esm/models/responsesnonstreamingresponse.d.ts.map +1 -1
  357. package/dist/esm/models/responsesnonstreamingresponse.js +35 -8
  358. package/dist/esm/models/responsesnonstreamingresponse.js.map +1 -1
  359. package/dist/esm/models/responsesoutputitemfilesearchcall.d.ts +6 -16
  360. package/dist/esm/models/responsesoutputitemfilesearchcall.d.ts.map +1 -1
  361. package/dist/esm/models/responsesoutputitemfilesearchcall.js +9 -2
  362. package/dist/esm/models/responsesoutputitemfilesearchcall.js.map +1 -1
  363. package/dist/esm/models/responsesoutputitemreasoning.d.ts +7 -14
  364. package/dist/esm/models/responsesoutputitemreasoning.d.ts.map +1 -1
  365. package/dist/esm/models/responsesoutputitemreasoning.js +11 -2
  366. package/dist/esm/models/responsesoutputitemreasoning.js.map +1 -1
  367. package/dist/esm/models/responsesstreamchunkunion.d.ts +31 -81
  368. package/dist/esm/models/responsesstreamchunkunion.d.ts.map +1 -1
  369. package/dist/esm/models/responsesstreamchunkunion.js +55 -12
  370. package/dist/esm/models/responsesstreamchunkunion.js.map +1 -1
  371. package/dist/esm/models/responseswebsearchcalloutput.d.ts +6 -16
  372. package/dist/esm/models/responseswebsearchcalloutput.d.ts.map +1 -1
  373. package/dist/esm/models/responseswebsearchcalloutput.js +10 -2
  374. package/dist/esm/models/responseswebsearchcalloutput.js.map +1 -1
  375. package/dist/esm/models/responsetextverbosity.d.ts +6 -14
  376. package/dist/esm/models/responsetextverbosity.d.ts.map +1 -1
  377. package/dist/esm/models/responsetextverbosity.js +10 -2
  378. package/dist/esm/models/responsetextverbosity.js.map +1 -1
  379. package/dist/esm/models/updateapikeydata.d.ts +120 -0
  380. package/dist/esm/models/updateapikeydata.d.ts.map +1 -0
  381. package/dist/esm/models/updateapikeydata.js +96 -0
  382. package/dist/esm/models/updateapikeydata.js.map +1 -0
  383. package/dist/esm/sdk/oauth.d.ts +27 -0
  384. package/dist/esm/sdk/oauth.d.ts.map +1 -1
  385. package/dist/esm/sdk/oauth.js +43 -0
  386. package/dist/esm/sdk/oauth.js.map +1 -1
  387. package/dist/esm/sdk/responses.d.ts +2 -2
  388. package/dist/esm/sdk/responses.d.ts.map +1 -1
  389. package/docs/sdks/apikeys/README.md +4 -0
  390. package/jsr.json +1 -1
  391. package/package.json +3 -2
  392. package/src/funcs/betaResponsesSend.ts +3 -3
  393. package/src/funcs/chatSend.ts +1 -1
  394. package/src/funcs/custom/oAuthCreateAuthorizationUrl.test.ts +265 -0
  395. package/src/funcs/custom/oAuthCreateAuthorizationUrl.ts +66 -0
  396. package/src/funcs/custom/oAuthCreateSHA256CodeChallenge.test.ts +189 -0
  397. package/src/funcs/custom/oAuthCreateSHA256CodeChallenge.ts +90 -0
  398. package/src/funcs/modelsList.ts +1 -1
  399. package/src/lib/config.ts +3 -3
  400. package/src/models/chatgenerationparams.ts +59 -20
  401. package/src/models/chatmessagecontentitemaudio.ts +23 -8
  402. package/src/models/chatmessagecontentitemimage.ts +16 -6
  403. package/src/models/chatresponsechoice.ts +23 -8
  404. package/src/models/chatstreamingchoice.ts +23 -8
  405. package/src/models/completionfinishreason.ts +23 -8
  406. package/src/models/createapikeydata.ts +222 -0
  407. package/src/models/endpointslist.ts +77 -25
  408. package/src/models/errorresponse.ts +23 -8
  409. package/src/models/getapikeydata.ts +218 -0
  410. package/src/models/index.ts +4 -0
  411. package/src/models/keyinfo.ts +8 -8
  412. package/src/models/listapikeysdata.ts +217 -0
  413. package/src/models/modelslist.ts +95 -32
  414. package/src/models/operations/addcoinbasecharge.ts +17 -6
  415. package/src/models/operations/create.ts +64 -123
  416. package/src/models/operations/createauthorizationcode.ts +20 -6
  417. package/src/models/operations/exchangeauthorizationcode.ts +23 -6
  418. package/src/models/operations/generate.ts +114 -41
  419. package/src/models/operations/getapikey.ts +5 -124
  420. package/src/models/operations/getmetadata.ts +17 -6
  421. package/src/models/operations/getparameters.ts +41 -15
  422. package/src/models/operations/list.ts +77 -25
  423. package/src/models/operations/listapikeys.ts +5 -122
  424. package/src/models/operations/previewzdr.ts +70 -25
  425. package/src/models/operations/sendresponsesrequest.ts +179 -63
  426. package/src/models/operations/update.ts +64 -123
  427. package/src/models/responsefunctioncallstatus.ts +23 -8
  428. package/src/models/responseimagegenerationcallstatus.ts +23 -8
  429. package/src/models/responseincludable.ts +23 -8
  430. package/src/models/responseinputimagedetail.ts +23 -8
  431. package/src/models/responsereasoningconfig.ts +23 -8
  432. package/src/models/responsereasoningsummarymode.ts +23 -8
  433. package/src/models/responsesincompletedetails.ts +23 -8
  434. package/src/models/responsesnonstreamingresponse.ts +78 -25
  435. package/src/models/responsesoutputitemfilesearchcall.ts +24 -8
  436. package/src/models/responsesoutputitemreasoning.ts +25 -8
  437. package/src/models/responsesstreamchunkunion.ts +114 -43
  438. package/src/models/responseswebsearchcalloutput.ts +24 -8
  439. package/src/models/responsetextverbosity.ts +23 -8
  440. package/src/models/updateapikeydata.ts +222 -0
  441. package/src/sdk/oauth.ts +60 -0
  442. 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
+ }
@@ -96,7 +96,7 @@ async function $do(
96
96
  });
97
97
 
98
98
  const headers = new Headers(compactMap({
99
- Accept: "application/json;q=1",
99
+ Accept: "application/json;q=1, application/rss+xml;q=0",
100
100
  }));
101
101
 
102
102
  const secConfig = await extractSecurity(client._options.apiKey);
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.37",
63
- genVersion: "2.723.2",
62
+ sdkVersion: "0.0.0-beta.39",
63
+ genVersion: "2.723.11",
64
64
  userAgent:
65
- "speakeasy-sdk/typescript 0.0.0-beta.37 2.723.2 1.0.0 @openrouter/sdk",
65
+ "speakeasy-sdk/typescript 0.0.0-beta.39 2.723.11 1.0.0 @openrouter/sdk",
66
66
  } as const;