@openrouter/sdk 0.3.2 → 0.3.10

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 (319) hide show
  1. package/.zed/settings.json +10 -0
  2. package/_speakeasy/.github/action-inputs-config.json +53 -0
  3. package/_speakeasy/.github/action-security-config.json +88 -0
  4. package/esm/core.js +1 -0
  5. package/esm/funcs/analyticsGetUserActivity.js +1 -0
  6. package/esm/funcs/apiKeysCreate.js +1 -0
  7. package/esm/funcs/apiKeysDelete.js +1 -0
  8. package/esm/funcs/apiKeysGet.js +1 -0
  9. package/esm/funcs/apiKeysGetCurrentKeyMetadata.js +1 -0
  10. package/esm/funcs/apiKeysList.js +1 -0
  11. package/esm/funcs/apiKeysUpdate.js +1 -0
  12. package/esm/funcs/betaResponsesSend.js +1 -0
  13. package/esm/funcs/call-model.d.ts +118 -0
  14. package/esm/funcs/call-model.js +137 -0
  15. package/esm/funcs/chatSend.js +1 -0
  16. package/esm/funcs/completionsGenerate.js +1 -0
  17. package/esm/funcs/creditsCreateCoinbaseCharge.js +1 -0
  18. package/esm/funcs/creditsGetCredits.js +1 -0
  19. package/esm/funcs/embeddingsGenerate.js +1 -0
  20. package/esm/funcs/embeddingsListModels.js +1 -0
  21. package/esm/funcs/endpointsList.js +1 -0
  22. package/esm/funcs/endpointsListZdrEndpoints.js +1 -0
  23. package/esm/funcs/generationsGetGeneration.js +1 -0
  24. package/esm/funcs/modelsCount.js +1 -0
  25. package/esm/funcs/modelsList.js +1 -0
  26. package/esm/funcs/modelsListForUser.js +1 -0
  27. package/esm/funcs/oAuthCreateAuthCode.js +1 -0
  28. package/esm/funcs/oAuthExchangeAuthCodeForAPIKey.js +1 -0
  29. package/esm/funcs/parametersGetParameters.js +1 -0
  30. package/esm/funcs/providersList.js +1 -0
  31. package/esm/hooks/hooks.js +1 -0
  32. package/esm/hooks/index.js +1 -0
  33. package/esm/hooks/types.js +1 -0
  34. package/esm/index.d.ts +20 -5
  35. package/esm/index.js +21 -4
  36. package/esm/lib/anthropic-compat.d.ts +50 -0
  37. package/esm/lib/anthropic-compat.js +223 -0
  38. package/esm/lib/anthropic-compat.test.d.ts +2 -0
  39. package/esm/lib/anthropic-compat.test.js +479 -0
  40. package/esm/lib/async-params.d.ts +53 -0
  41. package/esm/lib/async-params.js +76 -0
  42. package/esm/lib/base64.js +1 -0
  43. package/esm/lib/chat-compat.d.ts +46 -0
  44. package/esm/lib/chat-compat.js +112 -0
  45. package/esm/lib/chat-compat.test.d.ts +2 -0
  46. package/esm/lib/chat-compat.test.js +282 -0
  47. package/esm/lib/claude-constants.d.ts +22 -0
  48. package/esm/lib/claude-constants.js +20 -0
  49. package/esm/lib/claude-type-guards.d.ts +10 -0
  50. package/esm/lib/claude-type-guards.js +70 -0
  51. package/esm/lib/config.d.ts +2 -2
  52. package/esm/lib/config.js +3 -2
  53. package/esm/lib/dlv.js +1 -0
  54. package/esm/lib/encodings.js +1 -0
  55. package/esm/lib/env.js +1 -0
  56. package/esm/lib/event-streams.js +1 -0
  57. package/esm/lib/files.js +1 -0
  58. package/esm/lib/http.js +1 -0
  59. package/esm/lib/is-plain-object.js +1 -0
  60. package/esm/lib/logger.js +1 -0
  61. package/esm/lib/matchers.js +1 -0
  62. package/esm/lib/{response-wrapper.d.ts → model-result.d.ts} +29 -43
  63. package/esm/lib/{response-wrapper.js → model-result.js} +146 -175
  64. package/esm/lib/next-turn-params.d.ts +30 -0
  65. package/esm/lib/next-turn-params.js +129 -0
  66. package/esm/lib/primitives.js +1 -0
  67. package/esm/lib/retries.js +1 -0
  68. package/esm/lib/reusable-stream.js +10 -10
  69. package/esm/lib/schemas.js +1 -0
  70. package/esm/lib/sdks.js +1 -0
  71. package/esm/lib/security.js +1 -0
  72. package/esm/lib/stop-conditions.d.ts +80 -0
  73. package/esm/lib/stop-conditions.js +104 -0
  74. package/esm/lib/stream-transformers.d.ts +30 -4
  75. package/esm/lib/stream-transformers.js +467 -98
  76. package/esm/lib/stream-type-guards.d.ts +29 -0
  77. package/esm/lib/stream-type-guards.js +109 -0
  78. package/esm/lib/tool-executor.d.ts +7 -6
  79. package/esm/lib/tool-executor.js +4 -0
  80. package/esm/lib/tool-orchestrator.d.ts +7 -7
  81. package/esm/lib/tool-orchestrator.js +38 -10
  82. package/esm/lib/tool-types.d.ts +163 -29
  83. package/esm/lib/tool-types.js +6 -0
  84. package/esm/lib/tool.d.ts +99 -0
  85. package/esm/lib/tool.js +71 -0
  86. package/esm/lib/turn-context.d.ts +50 -0
  87. package/esm/lib/turn-context.js +59 -0
  88. package/esm/lib/url.js +1 -0
  89. package/esm/models/activityitem.js +1 -0
  90. package/esm/models/assistantmessage.js +1 -0
  91. package/esm/models/badgatewayresponseerrordata.js +1 -0
  92. package/esm/models/badrequestresponseerrordata.js +1 -0
  93. package/esm/models/chatcompletionfinishreason.js +1 -0
  94. package/esm/models/chaterror.js +1 -0
  95. package/esm/models/chatgenerationparams.js +1 -0
  96. package/esm/models/chatgenerationtokenusage.js +1 -0
  97. package/esm/models/chatmessagecontentitem.js +1 -0
  98. package/esm/models/chatmessagecontentitemaudio.js +1 -0
  99. package/esm/models/chatmessagecontentitemcachecontrol.js +1 -0
  100. package/esm/models/chatmessagecontentitemimage.js +1 -0
  101. package/esm/models/chatmessagecontentitemtext.js +1 -0
  102. package/esm/models/chatmessagecontentitemvideo.js +1 -0
  103. package/esm/models/chatmessagetokenlogprob.js +1 -0
  104. package/esm/models/chatmessagetokenlogprobs.js +1 -0
  105. package/esm/models/chatmessagetoolcall.js +1 -0
  106. package/esm/models/chatresponse.js +1 -0
  107. package/esm/models/chatresponsechoice.js +1 -0
  108. package/esm/models/chatstreamingchoice.js +1 -0
  109. package/esm/models/chatstreamingmessagechunk.js +1 -0
  110. package/esm/models/chatstreamingmessagetoolcall.js +1 -0
  111. package/esm/models/chatstreamingresponsechunk.js +1 -0
  112. package/esm/models/chatstreamoptions.js +1 -0
  113. package/esm/models/claude-message.d.ts +218 -0
  114. package/esm/models/claude-message.js +6 -0
  115. package/esm/models/completionchoice.js +1 -0
  116. package/esm/models/completioncreateparams.js +1 -0
  117. package/esm/models/completionlogprobs.js +1 -0
  118. package/esm/models/completionresponse.js +1 -0
  119. package/esm/models/completionusage.js +1 -0
  120. package/esm/models/createchargerequest.js +1 -0
  121. package/esm/models/datacollection.js +1 -0
  122. package/esm/models/defaultparameters.js +1 -0
  123. package/esm/models/edgenetworktimeoutresponseerrordata.js +1 -0
  124. package/esm/models/endpointstatus.js +1 -0
  125. package/esm/models/errors/badgatewayresponseerror.js +1 -0
  126. package/esm/models/errors/badrequestresponseerror.js +1 -0
  127. package/esm/models/errors/chaterror.js +1 -0
  128. package/esm/models/errors/edgenetworktimeoutresponseerror.js +1 -0
  129. package/esm/models/errors/forbiddenresponseerror.js +1 -0
  130. package/esm/models/errors/httpclienterrors.js +1 -0
  131. package/esm/models/errors/index.js +1 -0
  132. package/esm/models/errors/internalserverresponseerror.js +1 -0
  133. package/esm/models/errors/notfoundresponseerror.js +1 -0
  134. package/esm/models/errors/openrouterdefaulterror.js +1 -0
  135. package/esm/models/errors/openroutererror.js +1 -0
  136. package/esm/models/errors/payloadtoolargeresponseerror.js +1 -0
  137. package/esm/models/errors/paymentrequiredresponseerror.js +1 -0
  138. package/esm/models/errors/provideroverloadedresponseerror.js +1 -0
  139. package/esm/models/errors/requesttimeoutresponseerror.js +1 -0
  140. package/esm/models/errors/responsevalidationerror.js +1 -0
  141. package/esm/models/errors/sdkvalidationerror.js +1 -0
  142. package/esm/models/errors/serviceunavailableresponseerror.js +1 -0
  143. package/esm/models/errors/toomanyrequestsresponseerror.js +1 -0
  144. package/esm/models/errors/unauthorizedresponseerror.js +1 -0
  145. package/esm/models/errors/unprocessableentityresponseerror.js +1 -0
  146. package/esm/models/filecitation.js +1 -0
  147. package/esm/models/filepath.js +1 -0
  148. package/esm/models/forbiddenresponseerrordata.js +1 -0
  149. package/esm/models/imagegenerationstatus.js +1 -0
  150. package/esm/models/index.d.ts +1 -0
  151. package/esm/models/index.js +2 -0
  152. package/esm/models/inputmodality.js +1 -0
  153. package/esm/models/instructtype.js +1 -0
  154. package/esm/models/internalserverresponseerrordata.js +1 -0
  155. package/esm/models/jsonschemaconfig.js +1 -0
  156. package/esm/models/listendpointsresponse.js +1 -0
  157. package/esm/models/message.js +1 -0
  158. package/esm/models/model.js +1 -0
  159. package/esm/models/modelarchitecture.js +1 -0
  160. package/esm/models/modelgroup.js +1 -0
  161. package/esm/models/modelscountresponse.js +1 -0
  162. package/esm/models/modelslistresponse.js +1 -0
  163. package/esm/models/namedtoolchoice.js +1 -0
  164. package/esm/models/notfoundresponseerrordata.js +1 -0
  165. package/esm/models/openairesponsesannotation.js +1 -0
  166. package/esm/models/openairesponsesincludable.js +1 -0
  167. package/esm/models/openairesponsesincompletedetails.js +1 -0
  168. package/esm/models/openairesponsesinputunion.js +1 -0
  169. package/esm/models/openairesponsesprompt.js +1 -0
  170. package/esm/models/openairesponsesreasoningconfig.js +1 -0
  171. package/esm/models/openairesponsesreasoningeffort.js +1 -0
  172. package/esm/models/openairesponsesrefusalcontent.js +1 -0
  173. package/esm/models/openairesponsesresponsestatus.js +1 -0
  174. package/esm/models/openairesponsesservicetier.js +1 -0
  175. package/esm/models/openairesponsestoolchoiceunion.js +1 -0
  176. package/esm/models/openairesponsestruncation.js +1 -0
  177. package/esm/models/openresponseseasyinputmessage.js +1 -0
  178. package/esm/models/openresponseserrorevent.js +1 -0
  179. package/esm/models/openresponsesfunctioncalloutput.js +1 -0
  180. package/esm/models/openresponsesfunctiontoolcall.js +1 -0
  181. package/esm/models/openresponsesimagegencallcompleted.js +1 -0
  182. package/esm/models/openresponsesimagegencallgenerating.js +1 -0
  183. package/esm/models/openresponsesimagegencallinprogress.js +1 -0
  184. package/esm/models/openresponsesimagegencallpartialimage.js +1 -0
  185. package/esm/models/openresponsesinput.js +1 -0
  186. package/esm/models/openresponsesinputmessageitem.js +1 -0
  187. package/esm/models/openresponseslogprobs.js +1 -0
  188. package/esm/models/openresponsesnonstreamingresponse.js +1 -0
  189. package/esm/models/openresponsesreasoning.js +1 -0
  190. package/esm/models/openresponsesreasoningconfig.js +1 -0
  191. package/esm/models/openresponsesreasoningdeltaevent.js +1 -0
  192. package/esm/models/openresponsesreasoningdoneevent.js +1 -0
  193. package/esm/models/openresponsesreasoningsummarypartaddedevent.js +1 -0
  194. package/esm/models/openresponsesreasoningsummarytextdeltaevent.js +1 -0
  195. package/esm/models/openresponsesreasoningsummarytextdoneevent.js +1 -0
  196. package/esm/models/openresponsesrequest.js +1 -0
  197. package/esm/models/openresponsesresponsetext.js +1 -0
  198. package/esm/models/openresponsesstreamevent.js +1 -0
  199. package/esm/models/openresponsestoplogprobs.js +1 -0
  200. package/esm/models/openresponsesusage.js +1 -0
  201. package/esm/models/openresponseswebsearch20250826tool.js +1 -0
  202. package/esm/models/openresponseswebsearchpreview20250311tool.js +1 -0
  203. package/esm/models/openresponseswebsearchpreviewtool.js +1 -0
  204. package/esm/models/openresponseswebsearchtool.js +1 -0
  205. package/esm/models/operations/createauthkeyscode.js +1 -0
  206. package/esm/models/operations/createcoinbasecharge.js +1 -0
  207. package/esm/models/operations/createembeddings.js +1 -0
  208. package/esm/models/operations/createkeys.js +1 -0
  209. package/esm/models/operations/createresponses.js +1 -0
  210. package/esm/models/operations/deletekeys.js +1 -0
  211. package/esm/models/operations/exchangeauthcodeforapikey.js +1 -0
  212. package/esm/models/operations/getcredits.js +1 -0
  213. package/esm/models/operations/getcurrentkey.js +1 -0
  214. package/esm/models/operations/getgeneration.js +1 -0
  215. package/esm/models/operations/getkey.js +1 -0
  216. package/esm/models/operations/getmodels.js +1 -0
  217. package/esm/models/operations/getparameters.js +1 -0
  218. package/esm/models/operations/getuseractivity.js +1 -0
  219. package/esm/models/operations/index.js +1 -0
  220. package/esm/models/operations/list.js +1 -0
  221. package/esm/models/operations/listendpoints.js +1 -0
  222. package/esm/models/operations/listendpointszdr.js +1 -0
  223. package/esm/models/operations/listmodelsuser.js +1 -0
  224. package/esm/models/operations/listproviders.js +1 -0
  225. package/esm/models/operations/sendchatcompletionrequest.js +1 -0
  226. package/esm/models/operations/updatekeys.js +1 -0
  227. package/esm/models/outputitemimagegenerationcall.js +1 -0
  228. package/esm/models/outputmessage.js +1 -0
  229. package/esm/models/outputmodality.js +1 -0
  230. package/esm/models/parameter.js +1 -0
  231. package/esm/models/payloadtoolargeresponseerrordata.js +1 -0
  232. package/esm/models/paymentrequiredresponseerrordata.js +1 -0
  233. package/esm/models/pdfparserengine.js +1 -0
  234. package/esm/models/pdfparseroptions.js +1 -0
  235. package/esm/models/perrequestlimits.js +1 -0
  236. package/esm/models/providername.js +1 -0
  237. package/esm/models/provideroverloadedresponseerrordata.js +1 -0
  238. package/esm/models/providerpreferences.js +1 -0
  239. package/esm/models/providersort.js +1 -0
  240. package/esm/models/providersortconfig.js +1 -0
  241. package/esm/models/providersortunion.js +1 -0
  242. package/esm/models/publicendpoint.js +1 -0
  243. package/esm/models/publicpricing.js +1 -0
  244. package/esm/models/quantization.js +1 -0
  245. package/esm/models/reasoningsummarytext.js +1 -0
  246. package/esm/models/reasoningsummaryverbosity.js +1 -0
  247. package/esm/models/reasoningtextcontent.js +1 -0
  248. package/esm/models/requesttimeoutresponseerrordata.js +1 -0
  249. package/esm/models/responseformatjsonschema.js +1 -0
  250. package/esm/models/responseformattextconfig.js +1 -0
  251. package/esm/models/responseformattextgrammar.js +1 -0
  252. package/esm/models/responseinputaudio.js +1 -0
  253. package/esm/models/responseinputfile.js +1 -0
  254. package/esm/models/responseinputimage.js +1 -0
  255. package/esm/models/responseinputtext.js +1 -0
  256. package/esm/models/responseoutputtext.js +1 -0
  257. package/esm/models/responseserrorfield.js +1 -0
  258. package/esm/models/responsesformatjsonobject.js +1 -0
  259. package/esm/models/responsesformattext.js +1 -0
  260. package/esm/models/responsesformattextjsonschemaconfig.js +1 -0
  261. package/esm/models/responsesimagegenerationcall.js +1 -0
  262. package/esm/models/responsesoutputitem.js +1 -0
  263. package/esm/models/responsesoutputitemfilesearchcall.js +1 -0
  264. package/esm/models/responsesoutputitemfunctioncall.js +1 -0
  265. package/esm/models/responsesoutputitemreasoning.js +1 -0
  266. package/esm/models/responsesoutputmessage.js +1 -0
  267. package/esm/models/responsessearchcontextsize.js +1 -0
  268. package/esm/models/responseswebsearchcalloutput.js +1 -0
  269. package/esm/models/responseswebsearchuserlocation.js +1 -0
  270. package/esm/models/responsetextconfig.js +1 -0
  271. package/esm/models/schema0.js +1 -0
  272. package/esm/models/schema3.js +1 -0
  273. package/esm/models/security.js +1 -0
  274. package/esm/models/serviceunavailableresponseerrordata.js +1 -0
  275. package/esm/models/systemmessage.js +1 -0
  276. package/esm/models/toolcallstatus.js +1 -0
  277. package/esm/models/tooldefinitionjson.js +1 -0
  278. package/esm/models/toolresponsemessage.js +1 -0
  279. package/esm/models/toomanyrequestsresponseerrordata.js +1 -0
  280. package/esm/models/topproviderinfo.js +1 -0
  281. package/esm/models/unauthorizedresponseerrordata.js +1 -0
  282. package/esm/models/unprocessableentityresponseerrordata.js +1 -0
  283. package/esm/models/urlcitation.js +1 -0
  284. package/esm/models/usermessage.js +1 -0
  285. package/esm/models/websearchengine.js +1 -0
  286. package/esm/models/websearchpreviewtooluserlocation.js +1 -0
  287. package/esm/models/websearchstatus.js +1 -0
  288. package/esm/sdk/analytics.js +1 -0
  289. package/esm/sdk/apikeys.js +1 -0
  290. package/esm/sdk/beta.js +1 -0
  291. package/esm/sdk/chat.js +1 -0
  292. package/esm/sdk/completions.js +1 -0
  293. package/esm/sdk/credits.js +1 -0
  294. package/esm/sdk/embeddings.js +1 -0
  295. package/esm/sdk/endpoints.js +1 -0
  296. package/esm/sdk/generations.js +1 -0
  297. package/esm/sdk/index.js +1 -0
  298. package/esm/sdk/models.js +1 -0
  299. package/esm/sdk/oauth.js +1 -0
  300. package/esm/sdk/parameters.js +1 -0
  301. package/esm/sdk/providers.js +1 -0
  302. package/esm/sdk/responses.js +1 -0
  303. package/esm/sdk/sdk.d.ts +4 -10
  304. package/esm/sdk/sdk.js +2 -1
  305. package/esm/types/async.js +1 -0
  306. package/esm/types/blobs.js +1 -0
  307. package/esm/types/constdatetime.js +1 -0
  308. package/esm/types/discriminatedUnion.js +1 -0
  309. package/esm/types/enums.js +1 -0
  310. package/esm/types/fp.js +1 -0
  311. package/esm/types/index.js +1 -0
  312. package/esm/types/operations.js +1 -0
  313. package/esm/types/rfcdate.js +1 -0
  314. package/esm/types/streams.js +1 -0
  315. package/esm/types/unrecognized.js +1 -0
  316. package/jsr.json +1 -1
  317. package/package.json +6 -3
  318. package/esm/funcs/callModel.d.ts +0 -87
  319. package/esm/funcs/callModel.js +0 -215
@@ -0,0 +1,112 @@
1
+ import { OpenResponsesEasyInputMessageRoleUser, OpenResponsesEasyInputMessageRoleSystem, OpenResponsesEasyInputMessageRoleAssistant, OpenResponsesEasyInputMessageRoleDeveloper, } from "../models/openresponseseasyinputmessage.js";
2
+ import { OpenResponsesFunctionCallOutputType } from "../models/openresponsesfunctioncalloutput.js";
3
+ import { extractMessageFromResponse } from "./stream-transformers.js";
4
+ /**
5
+ * Type guard for ToolResponseMessage
6
+ */
7
+ function isToolResponseMessage(msg) {
8
+ return msg.role === "tool";
9
+ }
10
+ /**
11
+ * Type guard for AssistantMessage
12
+ */
13
+ function isAssistantMessage(msg) {
14
+ return msg.role === "assistant";
15
+ }
16
+ /**
17
+ * Maps chat role strings to OpenResponses role types
18
+ */
19
+ function mapChatRole(role) {
20
+ switch (role) {
21
+ case "user":
22
+ return OpenResponsesEasyInputMessageRoleUser.User;
23
+ case "system":
24
+ return OpenResponsesEasyInputMessageRoleSystem.System;
25
+ case "assistant":
26
+ return OpenResponsesEasyInputMessageRoleAssistant.Assistant;
27
+ case "developer":
28
+ return OpenResponsesEasyInputMessageRoleDeveloper.Developer;
29
+ default: {
30
+ const exhaustiveCheck = role;
31
+ throw new Error(`Unhandled role type: ${exhaustiveCheck}`);
32
+ }
33
+ }
34
+ }
35
+ /**
36
+ * Convert message content to a string representation.
37
+ * Handles string, null, undefined, and object content types.
38
+ */
39
+ function contentToString(content) {
40
+ if (typeof content === "string") {
41
+ return content;
42
+ }
43
+ if (content === null || content === undefined) {
44
+ return "";
45
+ }
46
+ return JSON.stringify(content);
47
+ }
48
+ /**
49
+ * Convert OpenAI chat-style messages to OpenResponses input format.
50
+ *
51
+ * This function transforms Message[] (OpenAI chat format) to OpenResponsesInput
52
+ * format that can be passed directly to callModel().
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * import { fromChatMessages } from '@openrouter/sdk';
57
+ *
58
+ * const chatMessages = [
59
+ * { role: "system", content: "You are a helpful assistant." },
60
+ * { role: "user", content: "Hello!" },
61
+ * ];
62
+ *
63
+ * const response = openrouter.callModel({
64
+ * model: "openai/gpt-4",
65
+ * input: fromChatMessages(chatMessages),
66
+ * });
67
+ * ```
68
+ */
69
+ export function fromChatMessages(messages) {
70
+ return messages.map((msg) => {
71
+ if (isToolResponseMessage(msg)) {
72
+ return {
73
+ type: OpenResponsesFunctionCallOutputType.FunctionCallOutput,
74
+ callId: msg.toolCallId,
75
+ output: contentToString(msg.content),
76
+ };
77
+ }
78
+ if (isAssistantMessage(msg)) {
79
+ return {
80
+ role: mapChatRole("assistant"),
81
+ content: contentToString(msg.content),
82
+ };
83
+ }
84
+ // System, user, developer messages
85
+ return {
86
+ role: mapChatRole(msg.role),
87
+ content: contentToString(msg.content),
88
+ };
89
+ });
90
+ }
91
+ /**
92
+ * Convert an OpenResponses response to OpenAI chat message format.
93
+ *
94
+ * This function transforms OpenResponsesNonStreamingResponse to AssistantMessage
95
+ * (OpenAI chat format) for compatibility with code expecting chat responses.
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * import { toChatMessage } from '@openrouter/sdk';
100
+ *
101
+ * const response = await openrouter.callModel({
102
+ * model: "openai/gpt-4",
103
+ * input: "Hello!",
104
+ * });
105
+ *
106
+ * const openResponsesResult = await response.getResponse();
107
+ * const chatMessage = toChatMessage(openResponsesResult);
108
+ * // chatMessage is now { role: "assistant", content: "..." }
109
+ * ```
110
+ */
111
+ export const toChatMessage = extractMessageFromResponse;
112
+ //# sourceMappingURL=chat-compat.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat-compat.test.d.ts.map
@@ -0,0 +1,282 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { fromChatMessages, toChatMessage } from "./chat-compat.js";
3
+ /**
4
+ * Creates a properly typed mock OpenResponsesNonStreamingResponse for testing.
5
+ * This factory provides all required fields with sensible defaults.
6
+ */
7
+ function createMockResponse(overrides) {
8
+ return {
9
+ id: "resp_test",
10
+ object: "response",
11
+ createdAt: Date.now(),
12
+ model: "openai/gpt-4",
13
+ status: "completed",
14
+ error: null,
15
+ incompleteDetails: null,
16
+ temperature: null,
17
+ topP: null,
18
+ metadata: null,
19
+ tools: [],
20
+ toolChoice: "auto",
21
+ parallelToolCalls: false,
22
+ ...overrides,
23
+ };
24
+ }
25
+ describe("fromChatMessages", () => {
26
+ describe("basic message conversion", () => {
27
+ it("converts user message with string content", () => {
28
+ const messages = [
29
+ { role: "user", content: "Hello, how are you?" },
30
+ ];
31
+ const result = fromChatMessages(messages);
32
+ expect(result).toEqual([
33
+ { role: "user", content: "Hello, how are you?" },
34
+ ]);
35
+ });
36
+ it("converts assistant message with string content", () => {
37
+ const messages = [
38
+ { role: "assistant", content: "I am doing well, thank you!" },
39
+ ];
40
+ const result = fromChatMessages(messages);
41
+ expect(result).toEqual([
42
+ { role: "assistant", content: "I am doing well, thank you!" },
43
+ ]);
44
+ });
45
+ it("converts system message with string content", () => {
46
+ const messages = [
47
+ { role: "system", content: "You are a helpful assistant." },
48
+ ];
49
+ const result = fromChatMessages(messages);
50
+ expect(result).toEqual([
51
+ { role: "system", content: "You are a helpful assistant." },
52
+ ]);
53
+ });
54
+ it("converts developer message with string content", () => {
55
+ const messages = [
56
+ { role: "developer", content: "Developer instructions here." },
57
+ ];
58
+ const result = fromChatMessages(messages);
59
+ expect(result).toEqual([
60
+ { role: "developer", content: "Developer instructions here." },
61
+ ]);
62
+ });
63
+ it("converts multiple messages in conversation", () => {
64
+ const messages = [
65
+ { role: "system", content: "You are helpful." },
66
+ { role: "user", content: "Hi" },
67
+ { role: "assistant", content: "Hello!" },
68
+ { role: "user", content: "How are you?" },
69
+ ];
70
+ const result = fromChatMessages(messages);
71
+ expect(result).toEqual([
72
+ { role: "system", content: "You are helpful." },
73
+ { role: "user", content: "Hi" },
74
+ { role: "assistant", content: "Hello!" },
75
+ { role: "user", content: "How are you?" },
76
+ ]);
77
+ });
78
+ });
79
+ describe("tool response message conversion", () => {
80
+ it("converts tool message to function_call_output", () => {
81
+ const messages = [
82
+ {
83
+ role: "tool",
84
+ content: "The weather is sunny and 72F",
85
+ toolCallId: "call_abc123",
86
+ },
87
+ ];
88
+ const result = fromChatMessages(messages);
89
+ expect(result).toEqual([
90
+ {
91
+ type: "function_call_output",
92
+ callId: "call_abc123",
93
+ output: "The weather is sunny and 72F",
94
+ },
95
+ ]);
96
+ });
97
+ it("converts tool message with object content by stringifying", () => {
98
+ const messages = [
99
+ {
100
+ role: "tool",
101
+ content: [{ type: "text", text: "Structured response" }],
102
+ toolCallId: "call_def456",
103
+ },
104
+ ];
105
+ const result = fromChatMessages(messages);
106
+ expect(result).toEqual([
107
+ {
108
+ type: "function_call_output",
109
+ callId: "call_def456",
110
+ output: JSON.stringify([{ type: "text", text: "Structured response" }]),
111
+ },
112
+ ]);
113
+ });
114
+ });
115
+ describe("content array handling", () => {
116
+ it("stringifies array content for user messages", () => {
117
+ const messages = [
118
+ {
119
+ role: "user",
120
+ content: [{ type: "text", text: "Hello from array" }],
121
+ },
122
+ ];
123
+ const result = fromChatMessages(messages);
124
+ expect(result).toEqual([
125
+ {
126
+ role: "user",
127
+ content: JSON.stringify([{ type: "text", text: "Hello from array" }]),
128
+ },
129
+ ]);
130
+ });
131
+ it("stringifies array content for assistant messages", () => {
132
+ const messages = [
133
+ {
134
+ role: "assistant",
135
+ content: [{ type: "text", text: "Response in array" }],
136
+ },
137
+ ];
138
+ const result = fromChatMessages(messages);
139
+ expect(result).toEqual([
140
+ {
141
+ role: "assistant",
142
+ content: JSON.stringify([{ type: "text", text: "Response in array" }]),
143
+ },
144
+ ]);
145
+ });
146
+ });
147
+ describe("null and empty content handling", () => {
148
+ it("handles null content in assistant message", () => {
149
+ const messages = [
150
+ { role: "assistant", content: null },
151
+ ];
152
+ const result = fromChatMessages(messages);
153
+ expect(result).toEqual([{ role: "assistant", content: "" }]);
154
+ });
155
+ it("handles empty string content", () => {
156
+ const messages = [{ role: "user", content: "" }];
157
+ const result = fromChatMessages(messages);
158
+ expect(result).toEqual([{ role: "user", content: "" }]);
159
+ });
160
+ it("handles empty messages array", () => {
161
+ const result = fromChatMessages([]);
162
+ expect(result).toEqual([]);
163
+ });
164
+ });
165
+ });
166
+ describe("toChatMessage", () => {
167
+ describe("basic message conversion", () => {
168
+ it("converts response with text output to AssistantMessage", () => {
169
+ const response = createMockResponse({
170
+ id: "resp_123",
171
+ output: [
172
+ {
173
+ id: "msg_1",
174
+ type: "message",
175
+ role: "assistant",
176
+ status: "completed",
177
+ content: [
178
+ {
179
+ type: "output_text",
180
+ text: "Hello! How can I help you?",
181
+ annotations: [],
182
+ },
183
+ ],
184
+ },
185
+ ],
186
+ usage: {
187
+ inputTokens: 10,
188
+ outputTokens: 20,
189
+ totalTokens: 30,
190
+ inputTokensDetails: { cachedTokens: 0 },
191
+ outputTokensDetails: { reasoningTokens: 0 },
192
+ },
193
+ });
194
+ const result = toChatMessage(response);
195
+ expect(result).toEqual({
196
+ role: "assistant",
197
+ content: "Hello! How can I help you?",
198
+ });
199
+ });
200
+ it("combines multiple text parts into single content string", () => {
201
+ const response = createMockResponse({
202
+ id: "resp_456",
203
+ output: [
204
+ {
205
+ id: "msg_1",
206
+ type: "message",
207
+ role: "assistant",
208
+ status: "completed",
209
+ content: [
210
+ { type: "output_text", text: "Part 1. ", annotations: [] },
211
+ { type: "output_text", text: "Part 2.", annotations: [] },
212
+ ],
213
+ },
214
+ ],
215
+ usage: {
216
+ inputTokens: 5,
217
+ outputTokens: 10,
218
+ totalTokens: 15,
219
+ inputTokensDetails: { cachedTokens: 0 },
220
+ outputTokensDetails: { reasoningTokens: 0 },
221
+ },
222
+ });
223
+ const result = toChatMessage(response);
224
+ expect(result).toEqual({
225
+ role: "assistant",
226
+ content: "Part 1. Part 2.",
227
+ });
228
+ });
229
+ it("returns null content when message has no text", () => {
230
+ const response = createMockResponse({
231
+ id: "resp_789",
232
+ output: [
233
+ {
234
+ id: "msg_1",
235
+ type: "message",
236
+ role: "assistant",
237
+ status: "completed",
238
+ content: [],
239
+ },
240
+ ],
241
+ usage: {
242
+ inputTokens: 5,
243
+ outputTokens: 0,
244
+ totalTokens: 5,
245
+ inputTokensDetails: { cachedTokens: 0 },
246
+ outputTokensDetails: { reasoningTokens: 0 },
247
+ },
248
+ });
249
+ const result = toChatMessage(response);
250
+ expect(result).toEqual({
251
+ role: "assistant",
252
+ content: null,
253
+ });
254
+ });
255
+ });
256
+ describe("error handling", () => {
257
+ it("throws error when no message found in output", () => {
258
+ const response = createMockResponse({
259
+ id: "resp_err",
260
+ output: [
261
+ {
262
+ type: "function_call",
263
+ callId: "call_1",
264
+ name: "test_tool",
265
+ arguments: "{}",
266
+ id: "fc_1",
267
+ status: "completed",
268
+ },
269
+ ],
270
+ usage: {
271
+ inputTokens: 5,
272
+ outputTokens: 10,
273
+ totalTokens: 15,
274
+ inputTokensDetails: { cachedTokens: 0 },
275
+ outputTokensDetails: { reasoningTokens: 0 },
276
+ },
277
+ });
278
+ expect(() => toChatMessage(response)).toThrow("No message found in response output");
279
+ });
280
+ });
281
+ });
282
+ //# sourceMappingURL=chat-compat.test.js.map
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Claude-specific content block types
3
+ * Used for detecting Claude message format
4
+ */
5
+ export declare const ClaudeContentBlockType: {
6
+ readonly Text: "text";
7
+ readonly Image: "image";
8
+ readonly ToolUse: "tool_use";
9
+ readonly ToolResult: "tool_result";
10
+ };
11
+ export type ClaudeContentBlockType = (typeof ClaudeContentBlockType)[keyof typeof ClaudeContentBlockType];
12
+ /**
13
+ * Message roles that are NOT supported in Claude format
14
+ * Used for distinguishing Claude vs OpenAI format
15
+ */
16
+ export declare const NonClaudeMessageRole: {
17
+ readonly System: "system";
18
+ readonly Developer: "developer";
19
+ readonly Tool: "tool";
20
+ };
21
+ export type NonClaudeMessageRole = (typeof NonClaudeMessageRole)[keyof typeof NonClaudeMessageRole];
22
+ //# sourceMappingURL=claude-constants.d.ts.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Claude-specific content block types
3
+ * Used for detecting Claude message format
4
+ */
5
+ export const ClaudeContentBlockType = {
6
+ Text: "text",
7
+ Image: "image",
8
+ ToolUse: "tool_use",
9
+ ToolResult: "tool_result",
10
+ };
11
+ /**
12
+ * Message roles that are NOT supported in Claude format
13
+ * Used for distinguishing Claude vs OpenAI format
14
+ */
15
+ export const NonClaudeMessageRole = {
16
+ System: "system",
17
+ Developer: "developer",
18
+ Tool: "tool",
19
+ };
20
+ //# sourceMappingURL=claude-constants.js.map
@@ -0,0 +1,10 @@
1
+ import type * as models from "../models/index.js";
2
+ /**
3
+ * Check if input is in Claude message format
4
+ * Uses structural analysis to detect Claude-specific patterns
5
+ *
6
+ * @param input - Input to check
7
+ * @returns True if input appears to be Claude format
8
+ */
9
+ export declare function isClaudeStyleMessages(input: unknown): input is models.ClaudeMessageParam[];
10
+ //# sourceMappingURL=claude-type-guards.d.ts.map
@@ -0,0 +1,70 @@
1
+ import { ClaudeContentBlockType, NonClaudeMessageRole, } from "./claude-constants.js";
2
+ function isRecord(value) {
3
+ return value !== null && typeof value === "object" && !Array.isArray(value);
4
+ }
5
+ function isNonClaudeRole(role) {
6
+ return (role === NonClaudeMessageRole.System ||
7
+ role === NonClaudeMessageRole.Developer ||
8
+ role === NonClaudeMessageRole.Tool);
9
+ }
10
+ function isClaudeToolResultBlock(block) {
11
+ if (!isRecord(block))
12
+ return false;
13
+ return block["type"] === ClaudeContentBlockType.ToolResult;
14
+ }
15
+ function isClaudeImageBlockWithSource(block) {
16
+ if (!isRecord(block))
17
+ return false;
18
+ return (block["type"] === ClaudeContentBlockType.Image &&
19
+ "source" in block &&
20
+ isRecord(block["source"]));
21
+ }
22
+ function isClaudeToolUseBlockWithId(block) {
23
+ if (!isRecord(block))
24
+ return false;
25
+ return (block["type"] === ClaudeContentBlockType.ToolUse &&
26
+ "id" in block &&
27
+ typeof block["id"] === "string");
28
+ }
29
+ function hasClaudeSpecificBlocks(content) {
30
+ for (const block of content) {
31
+ if (isClaudeToolResultBlock(block))
32
+ return true;
33
+ if (isClaudeImageBlockWithSource(block))
34
+ return true;
35
+ if (isClaudeToolUseBlockWithId(block))
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ /**
41
+ * Check if input is in Claude message format
42
+ * Uses structural analysis to detect Claude-specific patterns
43
+ *
44
+ * @param input - Input to check
45
+ * @returns True if input appears to be Claude format
46
+ */
47
+ export function isClaudeStyleMessages(input) {
48
+ if (!Array.isArray(input) || input.length === 0) {
49
+ return false;
50
+ }
51
+ for (const msg of input) {
52
+ if (!isRecord(msg))
53
+ continue;
54
+ if (!("role" in msg))
55
+ continue;
56
+ if ("type" in msg)
57
+ continue; // Claude messages don't have top-level "type"
58
+ // If we find a non-Claude role, it's not Claude format
59
+ if (isNonClaudeRole(msg["role"])) {
60
+ return false;
61
+ }
62
+ // If we find Claude-specific content blocks, it's Claude format
63
+ const content = msg["content"];
64
+ if (Array.isArray(content) && hasClaudeSpecificBlocks(content)) {
65
+ return true;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ //# sourceMappingURL=claude-type-guards.js.map
@@ -45,8 +45,8 @@ export declare function serverURLFromOptions(options: SDKOptions): URL | null;
45
45
  export declare const SDK_METADATA: {
46
46
  readonly language: "typescript";
47
47
  readonly openapiDocVersion: "1.0.0";
48
- readonly sdkVersion: "0.3.2";
48
+ readonly sdkVersion: "0.3.9";
49
49
  readonly genVersion: "2.788.4";
50
- readonly userAgent: "speakeasy-sdk/typescript 0.3.2 2.788.4 1.0.0 @openrouter/sdk";
50
+ readonly userAgent: "speakeasy-sdk/typescript 0.3.9 2.788.4 1.0.0 @openrouter/sdk";
51
51
  };
52
52
  //# sourceMappingURL=config.d.ts.map
package/esm/lib/config.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: 320761608fb3
3
4
  */
4
5
  import { pathToFunc } from "./url.js";
5
6
  /**
@@ -25,8 +26,8 @@ export function serverURLFromOptions(options) {
25
26
  export const SDK_METADATA = {
26
27
  language: "typescript",
27
28
  openapiDocVersion: "1.0.0",
28
- sdkVersion: "0.3.2",
29
+ sdkVersion: "0.3.9",
29
30
  genVersion: "2.788.4",
30
- userAgent: "speakeasy-sdk/typescript 0.3.2 2.788.4 1.0.0 @openrouter/sdk",
31
+ userAgent: "speakeasy-sdk/typescript 0.3.9 2.788.4 1.0.0 @openrouter/sdk",
31
32
  };
32
33
  //# sourceMappingURL=config.js.map
package/esm/lib/dlv.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: b1988214835a
3
4
  */
4
5
  /*
5
6
  MIT License
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: 3bd8ead98afd
3
4
  */
4
5
  import { bytesToBase64 } from "./base64.js";
5
6
  import { isPlainObject } from "./is-plain-object.js";
package/esm/lib/env.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: c52972a3b198
3
4
  */
4
5
  import * as z from "zod/v4";
5
6
  import { dlv } from "./dlv.js";
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: 3f731f808a79
3
4
  */
4
5
  export class EventStream extends ReadableStream {
5
6
  constructor(responseBody, parse) {
package/esm/lib/files.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: e5efa54fcb95
3
4
  */
4
5
  /**
5
6
  * Consumes a stream and returns a concatenated array buffer. Useful in
package/esm/lib/http.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: 63a80782d37e
3
4
  */
4
5
  const DEFAULT_FETCHER = (input, init) => {
5
6
  // If input is a Request and init is undefined, Bun will discard the method,
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: b9862591096a
3
4
  */
4
5
  /*
5
6
  MIT License
package/esm/lib/logger.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: 7ee7741a02bf
3
4
  */
4
5
  export {};
5
6
  //# sourceMappingURL=logger.js.map
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ * @generated-id: d54b2253b719
3
4
  */
4
5
  import { OpenRouterDefaultError } from "../models/errors/openrouterdefaulterror.js";
5
6
  import { ResponseValidationError } from "../models/errors/responsevalidationerror.js";