@omnicross/core 0.1.0 → 0.1.2

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 (272) hide show
  1. package/dist/ApiConverter.cjs +24 -0
  2. package/dist/ApiConverter.d.cts +82 -0
  3. package/dist/ApiConverter.d.ts +82 -0
  4. package/dist/ApiConverter.js +24 -0
  5. package/dist/BuiltinToolExecutor-BluWyeob.d.ts +81 -0
  6. package/dist/BuiltinToolExecutor-CS2WpXhM.d.cts +81 -0
  7. package/dist/CompletionService-D3a47vdU.d.cts +213 -0
  8. package/dist/CompletionService-DdWaAxq0.d.ts +213 -0
  9. package/dist/{ProviderProxy-f_8ziIhW.d.cts → ProviderProxy-C-xqrkKi.d.ts} +7 -2
  10. package/dist/{ProviderProxy-vjt8sQQk.d.ts → ProviderProxy-CnMQYN59.d.cts} +7 -2
  11. package/dist/auth/GeminiCodeAssistProjectResolver.cjs +27 -60
  12. package/dist/auth/GeminiCodeAssistProjectResolver.js +5 -9
  13. package/dist/builtin-web-fetch-77JZUZGM.cjs +100 -0
  14. package/dist/builtin-web-fetch-IGLBX2XY.js +100 -0
  15. package/dist/chunk-2DCNB7DF.cjs +514 -0
  16. package/dist/chunk-2FEVTJWG.js +4400 -0
  17. package/dist/chunk-3MEACFK3.js +193 -0
  18. package/dist/chunk-3OPYJG76.cjs +266 -0
  19. package/dist/chunk-46RLHI7D.js +0 -0
  20. package/dist/chunk-46ZIFWYG.cjs +277 -0
  21. package/dist/chunk-4NBS6KPV.cjs +43 -0
  22. package/dist/chunk-4VAVYUZS.cjs +991 -0
  23. package/dist/chunk-5ERIZW3D.js +44 -0
  24. package/dist/chunk-5HTVET6E.js +514 -0
  25. package/dist/chunk-5ZQBEOMD.js +764 -0
  26. package/dist/chunk-6VIXXLMX.cjs +14 -0
  27. package/dist/chunk-745DV5FL.js +147 -0
  28. package/dist/chunk-74TMJA7Z.js +53 -0
  29. package/dist/chunk-7VU7V2E4.js +0 -0
  30. package/dist/chunk-7YN22L2H.cjs +87 -0
  31. package/dist/chunk-A2YMUCBT.cjs +105 -0
  32. package/dist/chunk-AQ5TNQB7.js +13 -0
  33. package/dist/chunk-AVYJ4YBN.js +58 -0
  34. package/dist/chunk-C72S6TTV.cjs +49 -0
  35. package/dist/chunk-C7PSERMH.js +87 -0
  36. package/dist/chunk-CDHS2QDC.js +179 -0
  37. package/dist/chunk-DK4A7DLE.js +266 -0
  38. package/dist/chunk-DRWHTIIZ.js +13 -0
  39. package/dist/chunk-DWKQZ2SK.cjs +254 -0
  40. package/dist/chunk-E3WHL7CO.js +14 -0
  41. package/dist/chunk-EYZYXJTJ.cjs +1 -0
  42. package/dist/chunk-FMOBD2OQ.js +39 -0
  43. package/dist/chunk-FTQ7IQUC.js +991 -0
  44. package/dist/chunk-FZ46M34D.cjs +1 -0
  45. package/dist/chunk-G2FUJNA2.cjs +193 -0
  46. package/dist/chunk-G2UTNSGU.js +277 -0
  47. package/dist/chunk-GBHYAGX3.cjs +26 -0
  48. package/dist/chunk-GMMT7RVN.cjs +39 -0
  49. package/dist/chunk-H5JUT3KV.js +105 -0
  50. package/dist/chunk-HQP3K7PU.cjs +431 -0
  51. package/dist/chunk-JO5NLTLY.js +46 -0
  52. package/dist/chunk-JWC6APFQ.js +23 -0
  53. package/dist/chunk-KUU2RNG6.cjs +46 -0
  54. package/dist/chunk-LKZJEL6E.cjs +124 -0
  55. package/dist/chunk-MNYKI4CI.js +94 -0
  56. package/dist/chunk-MZNPGW5Q.js +26 -0
  57. package/dist/chunk-N3V2J5ZO.cjs +53 -0
  58. package/dist/chunk-NYUNU75A.cjs +44 -0
  59. package/dist/chunk-NZYN7C3P.cjs +179 -0
  60. package/dist/chunk-O466Y272.js +235 -0
  61. package/dist/chunk-PXUJF5HS.js +124 -0
  62. package/dist/chunk-QBZJ7P2T.cjs +13 -0
  63. package/dist/chunk-QOCNX236.js +46 -0
  64. package/dist/chunk-QXD4MV2X.cjs +23 -0
  65. package/dist/chunk-R3HK6R4B.cjs +13 -0
  66. package/dist/chunk-RSJ3TWJQ.cjs +186 -0
  67. package/dist/chunk-S4WBV25P.js +913 -0
  68. package/dist/chunk-SN3YWBX7.cjs +4400 -0
  69. package/dist/chunk-SPVWWUHX.cjs +46 -0
  70. package/dist/chunk-SUEGJ75D.cjs +764 -0
  71. package/dist/chunk-SVNDB62D.cjs +58 -0
  72. package/dist/chunk-UYPEN5XE.cjs +235 -0
  73. package/dist/chunk-V5KPWNYX.cjs +147 -0
  74. package/dist/chunk-VVEHS2LI.js +431 -0
  75. package/dist/chunk-XBSYYZIY.cjs +94 -0
  76. package/dist/chunk-YGXJGRFI.cjs +913 -0
  77. package/dist/chunk-YMFAJFQT.cjs +173 -0
  78. package/dist/chunk-Z7LUNECE.js +49 -0
  79. package/dist/chunk-Z7Y2NPHY.js +186 -0
  80. package/dist/chunk-ZJZAOKI7.js +254 -0
  81. package/dist/chunk-ZLX3KGXX.js +173 -0
  82. package/dist/chunk-ZSVQT3PW.js +43 -0
  83. package/dist/completion/ApiKeyPoolService.cjs +23 -48
  84. package/dist/completion/ApiKeyPoolService.d.cts +150 -2
  85. package/dist/completion/ApiKeyPoolService.d.ts +150 -2
  86. package/dist/completion/BuiltinToolExecutor.cjs +12 -0
  87. package/dist/completion/BuiltinToolExecutor.d.cts +4 -0
  88. package/dist/completion/BuiltinToolExecutor.d.ts +4 -0
  89. package/dist/completion/BuiltinToolExecutor.js +12 -0
  90. package/dist/completion/CompletionService.cjs +38 -0
  91. package/dist/completion/CompletionService.d.cts +22 -0
  92. package/dist/completion/CompletionService.d.ts +22 -0
  93. package/dist/completion/CompletionService.js +38 -0
  94. package/dist/completion/NativeSearchInjector.cjs +12 -0
  95. package/dist/completion/NativeSearchInjector.d.cts +42 -0
  96. package/dist/completion/NativeSearchInjector.d.ts +42 -0
  97. package/dist/completion/NativeSearchInjector.js +12 -0
  98. package/dist/completion/ProviderSearchInjector.cjs +60 -0
  99. package/dist/completion/ProviderSearchInjector.d.cts +47 -0
  100. package/dist/completion/ProviderSearchInjector.d.ts +47 -0
  101. package/dist/completion/ProviderSearchInjector.js +60 -0
  102. package/dist/completion/native-search-types.cjs +14 -0
  103. package/dist/completion/native-search-types.d.cts +3 -0
  104. package/dist/completion/native-search-types.d.ts +3 -0
  105. package/dist/completion/native-search-types.js +14 -0
  106. package/dist/completion/openrouter-headers.cjs +16 -0
  107. package/dist/completion/openrouter-headers.d.cts +44 -0
  108. package/dist/completion/openrouter-headers.d.ts +44 -0
  109. package/dist/completion/openrouter-headers.js +16 -0
  110. package/dist/completion/openrouter-models.cjs +29 -0
  111. package/dist/completion/openrouter-models.d.cts +27 -0
  112. package/dist/completion/openrouter-models.d.ts +27 -0
  113. package/dist/completion/openrouter-models.js +29 -0
  114. package/dist/completion/types.cjs +1 -0
  115. package/dist/completion/types.d.cts +3 -0
  116. package/dist/completion/types.d.ts +3 -0
  117. package/dist/completion/types.js +0 -0
  118. package/dist/completion/url-builder.cjs +24 -0
  119. package/dist/completion/url-builder.d.cts +87 -0
  120. package/dist/completion/url-builder.d.ts +87 -0
  121. package/dist/completion/url-builder.js +24 -0
  122. package/dist/completion.cjs +55 -3989
  123. package/dist/completion.d.cts +150 -8
  124. package/dist/completion.d.ts +150 -8
  125. package/dist/completion.js +63 -3953
  126. package/dist/index.cjs +197 -10428
  127. package/dist/index.d.cts +35 -91
  128. package/dist/index.d.ts +35 -91
  129. package/dist/index.js +125 -10267
  130. package/dist/logger-4GvQNzhE.d.cts +22 -0
  131. package/dist/logger-4GvQNzhE.d.ts +22 -0
  132. package/dist/outbound-api/routeResolver.cjs +11 -0
  133. package/dist/outbound-api/routeResolver.d.cts +19 -0
  134. package/dist/outbound-api/routeResolver.d.ts +19 -0
  135. package/dist/outbound-api/routeResolver.js +11 -0
  136. package/dist/outbound-api/subscriptionRegistryPort.cjs +7 -37
  137. package/dist/outbound-api/subscriptionRegistryPort.d.cts +7 -3
  138. package/dist/outbound-api/subscriptionRegistryPort.d.ts +7 -3
  139. package/dist/outbound-api/subscriptionRegistryPort.js +4 -8
  140. package/dist/outbound-api/types.cjs +1 -0
  141. package/dist/{types-CbCN2NQP.d.ts → outbound-api/types.d.cts} +18 -3
  142. package/dist/{types-CGGrKqC_.d.cts → outbound-api/types.d.ts} +18 -3
  143. package/dist/outbound-api/types.js +0 -0
  144. package/dist/outbound-api.cjs +35 -5220
  145. package/dist/outbound-api.d.cts +16 -88
  146. package/dist/outbound-api.d.ts +16 -88
  147. package/dist/outbound-api.js +54 -5193
  148. package/dist/pipeline/AuthSource.cjs +1 -0
  149. package/dist/pipeline/AuthSource.d.cts +101 -0
  150. package/dist/pipeline/AuthSource.d.ts +101 -0
  151. package/dist/pipeline/AuthSource.js +0 -0
  152. package/dist/pipeline/LlmConfigProviderAuth.cjs +8 -0
  153. package/dist/pipeline/LlmConfigProviderAuth.d.cts +87 -0
  154. package/dist/pipeline/LlmConfigProviderAuth.d.ts +87 -0
  155. package/dist/pipeline/LlmConfigProviderAuth.js +8 -0
  156. package/dist/pipeline/SubscriptionAuthSource.cjs +6 -128
  157. package/dist/pipeline/SubscriptionAuthSource.d.cts +165 -3
  158. package/dist/pipeline/SubscriptionAuthSource.d.ts +165 -3
  159. package/dist/pipeline/SubscriptionAuthSource.js +5 -99
  160. package/dist/pipeline/SubscriptionAuthStrategy.cjs +1 -18
  161. package/dist/pipeline/executeProviderCall.cjs +6 -0
  162. package/dist/pipeline/executeProviderCall.d.cts +149 -0
  163. package/dist/pipeline/executeProviderCall.d.ts +149 -0
  164. package/dist/pipeline/executeProviderCall.js +6 -0
  165. package/dist/pipeline/resolveProviderChain.cjs +6 -0
  166. package/dist/pipeline/resolveProviderChain.d.cts +58 -0
  167. package/dist/pipeline/resolveProviderChain.d.ts +58 -0
  168. package/dist/pipeline/resolveProviderChain.js +6 -0
  169. package/dist/pipeline/resolveSubscriptionChain.cjs +6 -0
  170. package/dist/pipeline/resolveSubscriptionChain.d.cts +68 -0
  171. package/dist/pipeline/resolveSubscriptionChain.d.ts +68 -0
  172. package/dist/pipeline/resolveSubscriptionChain.js +6 -0
  173. package/dist/ports/gemini-code-assist-resolver.cjs +7 -37
  174. package/dist/ports/gemini-code-assist-resolver.js +4 -8
  175. package/dist/ports/pricing-store.cjs +1 -0
  176. package/dist/ports/pricing-store.d.cts +50 -0
  177. package/dist/ports/pricing-store.d.ts +50 -0
  178. package/dist/ports/pricing-store.js +0 -0
  179. package/dist/ports/provider-config-source.cjs +1 -0
  180. package/dist/ports/provider-config-source.d.cts +51 -0
  181. package/dist/ports/provider-config-source.d.ts +51 -0
  182. package/dist/ports/provider-config-source.js +0 -0
  183. package/dist/ports/usage-event-store.cjs +1 -0
  184. package/dist/ports/usage-event-store.d.cts +29 -0
  185. package/dist/ports/usage-event-store.d.ts +29 -0
  186. package/dist/ports/usage-event-store.js +0 -0
  187. package/dist/ports/web-search-backend.cjs +1 -0
  188. package/dist/ports/web-search-backend.d.cts +29 -0
  189. package/dist/ports/web-search-backend.d.ts +29 -0
  190. package/dist/ports/web-search-backend.js +0 -0
  191. package/dist/ports.cjs +1 -18
  192. package/dist/ports.d.cts +16 -8
  193. package/dist/ports.d.ts +16 -8
  194. package/dist/provider-proxy/ProviderProxy.cjs +40 -0
  195. package/dist/provider-proxy/ProviderProxy.d.cts +17 -0
  196. package/dist/provider-proxy/ProviderProxy.d.ts +17 -0
  197. package/dist/provider-proxy/ProviderProxy.js +40 -0
  198. package/dist/provider-proxy/ingress/providerProxyShared.cjs +35 -2941
  199. package/dist/provider-proxy/ingress/providerProxyShared.d.cts +7 -3
  200. package/dist/provider-proxy/ingress/providerProxyShared.d.ts +7 -3
  201. package/dist/provider-proxy/ingress/providerProxyShared.js +41 -2914
  202. package/dist/provider-proxy/matchText.cjs +11 -72
  203. package/dist/provider-proxy/matchText.js +6 -39
  204. package/dist/provider-proxy/types.cjs +1 -18
  205. package/dist/provider-proxy/types.d.cts +407 -8
  206. package/dist/provider-proxy/types.d.ts +407 -8
  207. package/dist/provider-proxy.cjs +35 -4654
  208. package/dist/provider-proxy.d.cts +10 -6
  209. package/dist/provider-proxy.d.ts +10 -6
  210. package/dist/provider-proxy.js +39 -4627
  211. package/dist/routeResolver-BrbK6ja9.d.cts +88 -0
  212. package/dist/routeResolver-HE-ZO0fO.d.ts +88 -0
  213. package/dist/serializeError.cjs +5 -81
  214. package/dist/serializeError.js +3 -54
  215. package/dist/sse-parser.cjs +7 -455
  216. package/dist/sse-parser.js +4 -426
  217. package/dist/transformer/TransformerChainExecutor.cjs +4 -318
  218. package/dist/transformer/TransformerChainExecutor.js +4 -291
  219. package/dist/transformer/TransformerService.cjs +5 -289
  220. package/dist/transformer/TransformerService.js +3 -262
  221. package/dist/transformer/anthropicBetaInject.cjs +8 -0
  222. package/dist/transformer/anthropicBetaInject.d.cts +20 -0
  223. package/dist/transformer/anthropicBetaInject.d.ts +20 -0
  224. package/dist/transformer/anthropicBetaInject.js +8 -0
  225. package/dist/transformer/transformers/AnthropicTransformer.cjs +6 -0
  226. package/dist/transformer/transformers/AnthropicTransformer.d.cts +148 -0
  227. package/dist/transformer/transformers/AnthropicTransformer.d.ts +148 -0
  228. package/dist/transformer/transformers/AnthropicTransformer.js +6 -0
  229. package/dist/transformer/transformers/GeminiCodeAssistTransformer.cjs +4 -1106
  230. package/dist/transformer/transformers/GeminiCodeAssistTransformer.js +7 -1079
  231. package/dist/transformer/transformers/GeminiTransformer.cjs +4 -1010
  232. package/dist/transformer/transformers/GeminiTransformer.js +4 -983
  233. package/dist/transformer/transformers/OpenAIResponseTransformer.cjs +3 -535
  234. package/dist/transformer/transformers/OpenAIResponseTransformer.js +3 -510
  235. package/dist/transformer/transformers/OpenCodeGoTransformer.cjs +5 -72
  236. package/dist/transformer/transformers/OpenCodeGoTransformer.js +3 -45
  237. package/dist/transformer/transformers/ReasoningTransformer.cjs +6 -0
  238. package/dist/transformer/transformers/ReasoningTransformer.d.cts +47 -0
  239. package/dist/transformer/transformers/ReasoningTransformer.d.ts +47 -0
  240. package/dist/transformer/transformers/ReasoningTransformer.js +6 -0
  241. package/dist/transformer/transformers.cjs +39 -0
  242. package/dist/transformer/transformers.d.cts +100 -0
  243. package/dist/transformer/transformers.d.ts +100 -0
  244. package/dist/transformer/transformers.js +39 -0
  245. package/dist/transformer/types.cjs +1 -18
  246. package/dist/transformer.cjs +13 -3726
  247. package/dist/transformer.d.cts +8 -31
  248. package/dist/transformer.d.ts +8 -31
  249. package/dist/transformer.js +17 -3706
  250. package/dist/types-BScIHmPr.d.cts +153 -0
  251. package/dist/types-BScIHmPr.d.ts +153 -0
  252. package/dist/usage/pricing-engine.cjs +6 -0
  253. package/dist/usage/pricing-engine.d.cts +83 -0
  254. package/dist/usage/pricing-engine.d.ts +83 -0
  255. package/dist/usage/pricing-engine.js +6 -0
  256. package/dist/usage/usage-recorder.cjs +6 -0
  257. package/dist/usage/usage-recorder.d.cts +73 -0
  258. package/dist/usage/usage-recorder.d.ts +73 -0
  259. package/dist/usage/usage-recorder.js +6 -0
  260. package/dist/usage.cjs +11 -0
  261. package/dist/usage.d.cts +8 -0
  262. package/dist/usage.d.ts +8 -0
  263. package/dist/usage.js +11 -0
  264. package/package.json +3 -3
  265. package/dist/ApiKeyPoolService-BmMkau07.d.cts +0 -170
  266. package/dist/ApiKeyPoolService-BmMkau07.d.ts +0 -170
  267. package/dist/SubscriptionAuthSource-Cr4fVEYY.d.cts +0 -264
  268. package/dist/SubscriptionAuthSource-D89zmiSS.d.ts +0 -264
  269. package/dist/index-BTSmc9Sm.d.ts +0 -645
  270. package/dist/index-DXazdTzZ.d.cts +0 -645
  271. package/dist/types-DCzHkhJt.d.ts +0 -467
  272. package/dist/types-DZIQbgp0.d.cts +0 -467
@@ -0,0 +1,764 @@
1
+ // src/api-converter/shared.ts
2
+ function convertOpenAITool(tool) {
3
+ return {
4
+ name: tool.function.name,
5
+ description: tool.function.description,
6
+ input_schema: tool.function.parameters
7
+ };
8
+ }
9
+ function mapAnthropicStopReason(stopReason) {
10
+ switch (stopReason) {
11
+ case "end_turn":
12
+ return "stop";
13
+ case "max_tokens":
14
+ return "length";
15
+ case "tool_use":
16
+ return "tool_calls";
17
+ case "stop_sequence":
18
+ return "stop";
19
+ default:
20
+ return "stop";
21
+ }
22
+ }
23
+ function mapOpenAIFinishReason(finishReason) {
24
+ switch (finishReason) {
25
+ case "stop":
26
+ return "end_turn";
27
+ case "length":
28
+ return "max_tokens";
29
+ case "tool_calls":
30
+ return "tool_use";
31
+ case "content_filter":
32
+ return "end_turn";
33
+ default:
34
+ return "end_turn";
35
+ }
36
+ }
37
+ function hasImageContent(request) {
38
+ const messages = request.messages;
39
+ for (const msg of messages) {
40
+ if (Array.isArray(msg.content)) {
41
+ for (const part of msg.content) {
42
+ if ("type" in part && part.type === "image_url") {
43
+ return true;
44
+ }
45
+ if ("type" in part && part.type === "image") {
46
+ return true;
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+ function hasThinkingEnabled(request) {
54
+ if ("thinking" in request && request.thinking?.type === "enabled") {
55
+ return true;
56
+ }
57
+ if ("reasoning" in request) {
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+
63
+ // src/api-converter/anthropic-to-openai.ts
64
+ function convertAnthropicToOpenAI(response) {
65
+ const content = [];
66
+ const toolCalls = [];
67
+ let reasoningContent = "";
68
+ for (const block of response.content) {
69
+ if (block.type === "text") {
70
+ content.push(block.text);
71
+ } else if (block.type === "tool_use") {
72
+ toolCalls.push({
73
+ id: block.id,
74
+ type: "function",
75
+ function: {
76
+ name: block.name,
77
+ arguments: JSON.stringify(block.input)
78
+ }
79
+ });
80
+ } else if (block.type === "thinking") {
81
+ reasoningContent += block.thinking;
82
+ }
83
+ }
84
+ const finishReason = mapAnthropicStopReason(response.stop_reason);
85
+ const result = {
86
+ id: response.id,
87
+ object: "chat.completion",
88
+ created: Math.floor(Date.now() / 1e3),
89
+ model: response.model,
90
+ choices: [
91
+ {
92
+ index: 0,
93
+ message: {
94
+ role: "assistant",
95
+ content: content.join("\n") || null,
96
+ ...toolCalls.length > 0 ? { tool_calls: toolCalls } : {}
97
+ },
98
+ finish_reason: finishReason
99
+ }
100
+ ],
101
+ usage: {
102
+ prompt_tokens: response.usage.input_tokens,
103
+ completion_tokens: response.usage.output_tokens,
104
+ total_tokens: response.usage.input_tokens + response.usage.output_tokens
105
+ }
106
+ };
107
+ if (reasoningContent) {
108
+ result.reasoning_content = reasoningContent;
109
+ }
110
+ return result;
111
+ }
112
+ function convertAnthropicRequestToOpenAI(request) {
113
+ const messages = [];
114
+ if (request.system) {
115
+ if (typeof request.system === "string") {
116
+ messages.push({ role: "system", content: request.system });
117
+ } else if (Array.isArray(request.system)) {
118
+ const systemText = request.system.filter((s) => s.type === "text").map((s) => s.text).join("\n");
119
+ messages.push({ role: "system", content: systemText });
120
+ }
121
+ }
122
+ for (const msg of request.messages) {
123
+ if (typeof msg.content === "string") {
124
+ messages.push({
125
+ role: msg.role,
126
+ content: msg.content
127
+ });
128
+ } else if (Array.isArray(msg.content)) {
129
+ const openaiContent = [];
130
+ const toolCalls = [];
131
+ let toolResultId;
132
+ let toolResultContent;
133
+ for (const part of msg.content) {
134
+ if (part.type === "text") {
135
+ openaiContent.push({ type: "text", text: part.text });
136
+ } else if (part.type === "image") {
137
+ if (part.source.type === "base64") {
138
+ openaiContent.push({
139
+ type: "image_url",
140
+ image_url: {
141
+ url: `data:${part.source.media_type};base64,${part.source.data}`
142
+ }
143
+ });
144
+ } else if (part.source.url) {
145
+ openaiContent.push({
146
+ type: "image_url",
147
+ image_url: { url: part.source.url }
148
+ });
149
+ }
150
+ } else if (part.type === "tool_use") {
151
+ toolCalls.push({
152
+ id: part.id,
153
+ type: "function",
154
+ function: {
155
+ name: part.name,
156
+ arguments: JSON.stringify(part.input)
157
+ }
158
+ });
159
+ } else if (part.type === "tool_result") {
160
+ toolResultId = part.tool_use_id;
161
+ toolResultContent = typeof part.content === "string" ? part.content : JSON.stringify(part.content);
162
+ }
163
+ }
164
+ if (toolResultId && toolResultContent !== void 0) {
165
+ messages.push({
166
+ role: "tool",
167
+ tool_call_id: toolResultId,
168
+ content: toolResultContent
169
+ });
170
+ } else if (toolCalls.length > 0) {
171
+ messages.push({
172
+ role: "assistant",
173
+ content: openaiContent.length > 0 ? openaiContent.map((c) => c.type === "text" ? c.text : "").join("\n") : null,
174
+ tool_calls: toolCalls
175
+ });
176
+ } else {
177
+ messages.push({
178
+ role: msg.role,
179
+ content: openaiContent.length > 0 ? openaiContent : null
180
+ });
181
+ }
182
+ }
183
+ }
184
+ const result = {
185
+ model: request.model,
186
+ messages,
187
+ max_tokens: request.max_tokens,
188
+ stream: request.stream
189
+ };
190
+ if (request.tools && request.tools.length > 0) {
191
+ result.tools = request.tools.map((tool) => ({
192
+ type: "function",
193
+ function: {
194
+ name: tool.name,
195
+ description: tool.description,
196
+ parameters: tool.input_schema
197
+ }
198
+ }));
199
+ if (request.tool_choice) {
200
+ if (request.tool_choice.type === "auto") {
201
+ result.tool_choice = "auto";
202
+ } else if (request.tool_choice.type === "any") {
203
+ result.tool_choice = "required";
204
+ } else if (request.tool_choice.type === "tool") {
205
+ result.tool_choice = {
206
+ type: "function",
207
+ function: { name: request.tool_choice.name }
208
+ };
209
+ }
210
+ }
211
+ }
212
+ return result;
213
+ }
214
+ function convertAnthropicToOpenAIWithThinking(response) {
215
+ const baseResult = convertAnthropicToOpenAI(response);
216
+ const thinkingBlocks = response.content.filter(
217
+ (block) => block.type === "thinking"
218
+ );
219
+ if (thinkingBlocks.length > 0) {
220
+ baseResult.reasoning_content = thinkingBlocks.map((block) => "thinking" in block ? block.thinking : "").join("\n");
221
+ }
222
+ return baseResult;
223
+ }
224
+ async function* convertAnthropicStreamToOpenAI(anthropicStream) {
225
+ let messageId = "";
226
+ let model = "unknown";
227
+ const toolCalls = /* @__PURE__ */ new Map();
228
+ for await (const line of anthropicStream) {
229
+ if (!line.startsWith("data:")) continue;
230
+ const data = line.slice(5).trim();
231
+ try {
232
+ const event = JSON.parse(data);
233
+ switch (event.type) {
234
+ case "message_start":
235
+ messageId = event.message?.id || `chatcmpl-${Date.now()}`;
236
+ model = event.message?.model || model;
237
+ break;
238
+ case "content_block_delta":
239
+ if (event.delta?.type === "text_delta") {
240
+ yield `data: ${JSON.stringify({
241
+ id: messageId,
242
+ object: "chat.completion.chunk",
243
+ created: Math.floor(Date.now() / 1e3),
244
+ model,
245
+ choices: [{
246
+ index: 0,
247
+ delta: { content: event.delta.text },
248
+ finish_reason: null
249
+ }]
250
+ })}
251
+
252
+ `;
253
+ } else if (event.delta?.type === "thinking_delta") {
254
+ yield `data: ${JSON.stringify({
255
+ id: messageId,
256
+ object: "chat.completion.chunk",
257
+ created: Math.floor(Date.now() / 1e3),
258
+ model,
259
+ choices: [{
260
+ index: 0,
261
+ delta: { reasoning_content: event.delta.thinking },
262
+ finish_reason: null
263
+ }]
264
+ })}
265
+
266
+ `;
267
+ } else if (event.delta?.type === "input_json_delta") {
268
+ const toolIndex = event.index || 0;
269
+ const tc = toolCalls.get(toolIndex);
270
+ if (tc) {
271
+ yield `data: ${JSON.stringify({
272
+ id: messageId,
273
+ object: "chat.completion.chunk",
274
+ created: Math.floor(Date.now() / 1e3),
275
+ model,
276
+ choices: [{
277
+ index: 0,
278
+ delta: {
279
+ tool_calls: [{
280
+ index: toolIndex,
281
+ function: { arguments: event.delta.partial_json }
282
+ }]
283
+ },
284
+ finish_reason: null
285
+ }]
286
+ })}
287
+
288
+ `;
289
+ }
290
+ }
291
+ break;
292
+ case "content_block_start":
293
+ if (event.content_block?.type === "tool_use") {
294
+ const toolIndex = event.index || 0;
295
+ toolCalls.set(toolIndex, {
296
+ id: event.content_block.id,
297
+ name: event.content_block.name,
298
+ arguments: ""
299
+ });
300
+ yield `data: ${JSON.stringify({
301
+ id: messageId,
302
+ object: "chat.completion.chunk",
303
+ created: Math.floor(Date.now() / 1e3),
304
+ model,
305
+ choices: [{
306
+ index: 0,
307
+ delta: {
308
+ tool_calls: [{
309
+ index: toolIndex,
310
+ id: event.content_block.id,
311
+ type: "function",
312
+ function: { name: event.content_block.name, arguments: "" }
313
+ }]
314
+ },
315
+ finish_reason: null
316
+ }]
317
+ })}
318
+
319
+ `;
320
+ }
321
+ break;
322
+ case "message_delta":
323
+ if (event.delta?.stop_reason) {
324
+ const finishReason = mapAnthropicStopReason(event.delta.stop_reason);
325
+ yield `data: ${JSON.stringify({
326
+ id: messageId,
327
+ object: "chat.completion.chunk",
328
+ created: Math.floor(Date.now() / 1e3),
329
+ model,
330
+ choices: [{
331
+ index: 0,
332
+ delta: {},
333
+ finish_reason: finishReason
334
+ }],
335
+ usage: event.usage ? {
336
+ prompt_tokens: event.usage.input_tokens || 0,
337
+ completion_tokens: event.usage.output_tokens || 0,
338
+ total_tokens: (event.usage.input_tokens || 0) + (event.usage.output_tokens || 0)
339
+ } : void 0
340
+ })}
341
+
342
+ `;
343
+ }
344
+ break;
345
+ case "message_stop":
346
+ yield "data: [DONE]\n\n";
347
+ break;
348
+ }
349
+ } catch {
350
+ }
351
+ }
352
+ }
353
+
354
+ // src/api-converter/openai-to-anthropic.ts
355
+ function convertOpenAIToAnthropic(request, config) {
356
+ const messages = [];
357
+ let system;
358
+ for (const msg of request.messages) {
359
+ if (msg.role === "system") {
360
+ if (typeof msg.content === "string") {
361
+ system = msg.content;
362
+ } else if (Array.isArray(msg.content)) {
363
+ system = msg.content.filter((p) => p.type === "text").map((p) => ({ type: "text", text: p.text || "" }));
364
+ }
365
+ continue;
366
+ }
367
+ if (msg.role === "tool" && msg.tool_call_id) {
368
+ const toolResult = {
369
+ type: "tool_result",
370
+ tool_use_id: msg.tool_call_id,
371
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
372
+ };
373
+ const lastMsg = messages[messages.length - 1];
374
+ if (lastMsg && lastMsg.role === "user" && Array.isArray(lastMsg.content)) {
375
+ lastMsg.content.push(toolResult);
376
+ } else {
377
+ messages.push({ role: "user", content: [toolResult] });
378
+ }
379
+ continue;
380
+ }
381
+ if (msg.role === "assistant" && msg.tool_calls && msg.tool_calls.length > 0) {
382
+ const content = [];
383
+ if (msg.content) {
384
+ if (typeof msg.content === "string") {
385
+ content.push({ type: "text", text: msg.content });
386
+ } else if (Array.isArray(msg.content)) {
387
+ for (const part of msg.content) {
388
+ if (part.type === "text" && part.text) {
389
+ content.push({ type: "text", text: part.text });
390
+ }
391
+ }
392
+ }
393
+ }
394
+ for (const tc of msg.tool_calls) {
395
+ content.push({
396
+ type: "tool_use",
397
+ id: tc.id,
398
+ name: tc.function.name,
399
+ input: JSON.parse(tc.function.arguments || "{}")
400
+ });
401
+ }
402
+ messages.push({ role: "assistant", content });
403
+ continue;
404
+ }
405
+ if (msg.role === "user" || msg.role === "assistant") {
406
+ const content = convertOpenAIMessageContent(msg);
407
+ messages.push({ role: msg.role, content });
408
+ }
409
+ }
410
+ let model = request.model;
411
+ if (config.modelMapping && config.modelMapping[model]) {
412
+ model = config.modelMapping[model];
413
+ } else if (!model.startsWith("claude")) {
414
+ model = config.defaultModel;
415
+ }
416
+ const result = {
417
+ model,
418
+ // Anthropic requires max_tokens; use high default (16384) if not explicitly set
419
+ // This prevents output truncation for long responses
420
+ max_tokens: request.max_tokens || 16384,
421
+ messages,
422
+ stream: request.stream
423
+ };
424
+ if (system) {
425
+ result.system = system;
426
+ }
427
+ if (request.tools && request.tools.length > 0) {
428
+ result.tools = request.tools.map(convertOpenAITool);
429
+ if (request.tool_choice) {
430
+ if (request.tool_choice === "auto") {
431
+ result.tool_choice = { type: "auto" };
432
+ } else if (request.tool_choice === "required") {
433
+ result.tool_choice = { type: "any" };
434
+ } else if (typeof request.tool_choice === "object") {
435
+ result.tool_choice = {
436
+ type: "tool",
437
+ name: request.tool_choice.function.name
438
+ };
439
+ }
440
+ }
441
+ }
442
+ return result;
443
+ }
444
+ function convertOpenAIMessageContent(msg) {
445
+ if (typeof msg.content === "string") {
446
+ return msg.content;
447
+ }
448
+ if (!msg.content || !Array.isArray(msg.content)) {
449
+ return "";
450
+ }
451
+ const parts = [];
452
+ for (const part of msg.content) {
453
+ if (part.type === "text" && part.text) {
454
+ parts.push({ type: "text", text: part.text });
455
+ } else if (part.type === "image_url" && part.image_url) {
456
+ const url = part.image_url.url;
457
+ if (url.startsWith("data:")) {
458
+ const match = url.match(/^data:([^;]+);base64,(.+)$/);
459
+ if (match) {
460
+ parts.push({
461
+ type: "image",
462
+ source: {
463
+ type: "base64",
464
+ media_type: match[1],
465
+ data: match[2]
466
+ }
467
+ });
468
+ }
469
+ } else {
470
+ parts.push({
471
+ type: "image",
472
+ source: { type: "url", url }
473
+ });
474
+ }
475
+ }
476
+ }
477
+ return parts.length > 0 ? parts : "";
478
+ }
479
+ function convertOpenAIResponseToAnthropic(response) {
480
+ const content = [];
481
+ const choice = response.choices[0];
482
+ if (choice.message.content) {
483
+ content.push({ type: "text", text: choice.message.content });
484
+ }
485
+ if (choice.message.tool_calls) {
486
+ for (const tc of choice.message.tool_calls) {
487
+ content.push({
488
+ type: "tool_use",
489
+ id: tc.id,
490
+ name: tc.function.name,
491
+ input: JSON.parse(tc.function.arguments || "{}")
492
+ });
493
+ }
494
+ }
495
+ if (response.reasoning_content) {
496
+ content.unshift({
497
+ type: "thinking",
498
+ thinking: response.reasoning_content
499
+ });
500
+ }
501
+ return {
502
+ id: response.id,
503
+ type: "message",
504
+ role: "assistant",
505
+ model: response.model,
506
+ content,
507
+ stop_reason: mapOpenAIFinishReason(choice.finish_reason),
508
+ usage: {
509
+ input_tokens: response.usage.prompt_tokens,
510
+ output_tokens: response.usage.completion_tokens
511
+ }
512
+ };
513
+ }
514
+ function convertOpenAIToAnthropicWithThinking(request, config) {
515
+ const baseResult = convertOpenAIToAnthropic(request, config);
516
+ if (config.enableThinking) {
517
+ baseResult.thinking = {
518
+ type: "enabled",
519
+ budget_tokens: config.thinkingBudget || 1e4
520
+ };
521
+ }
522
+ return baseResult;
523
+ }
524
+ async function* convertOpenAIStreamToAnthropic(openaiStream) {
525
+ const messageId = `msg_${Date.now()}`;
526
+ let hasStarted = false;
527
+ let hasTextContentStarted = false;
528
+ let hasThinkingContentStarted = false;
529
+ let contentIndex = 0;
530
+ let model = "unknown";
531
+ const toolCalls = /* @__PURE__ */ new Map();
532
+ for await (const line of openaiStream) {
533
+ if (!line.startsWith("data:")) continue;
534
+ const data = line.slice(5).trim();
535
+ if (data === "[DONE]") {
536
+ if (hasTextContentStarted) {
537
+ yield `event: content_block_stop
538
+ data: ${JSON.stringify({
539
+ type: "content_block_stop",
540
+ index: contentIndex
541
+ })}
542
+
543
+ `;
544
+ contentIndex++;
545
+ hasTextContentStarted = false;
546
+ }
547
+ if (hasThinkingContentStarted) {
548
+ yield `event: content_block_stop
549
+ data: ${JSON.stringify({
550
+ type: "content_block_stop",
551
+ index: contentIndex
552
+ })}
553
+
554
+ `;
555
+ contentIndex++;
556
+ hasThinkingContentStarted = false;
557
+ }
558
+ for (const [, tc] of toolCalls) {
559
+ yield `event: content_block_stop
560
+ data: ${JSON.stringify({
561
+ type: "content_block_stop",
562
+ index: tc.contentIndex
563
+ })}
564
+
565
+ `;
566
+ }
567
+ yield `event: message_delta
568
+ data: ${JSON.stringify({
569
+ type: "message_delta",
570
+ delta: { stop_reason: "end_turn", stop_sequence: null },
571
+ usage: { input_tokens: 0, output_tokens: 0 }
572
+ })}
573
+
574
+ `;
575
+ yield `event: message_stop
576
+ data: ${JSON.stringify({ type: "message_stop" })}
577
+
578
+ `;
579
+ break;
580
+ }
581
+ try {
582
+ const chunk = JSON.parse(data);
583
+ model = chunk.model || model;
584
+ if (!hasStarted) {
585
+ hasStarted = true;
586
+ yield `event: message_start
587
+ data: ${JSON.stringify({
588
+ type: "message_start",
589
+ message: {
590
+ id: messageId,
591
+ type: "message",
592
+ role: "assistant",
593
+ content: [],
594
+ model,
595
+ stop_reason: null,
596
+ stop_sequence: null,
597
+ usage: { input_tokens: 0, output_tokens: 0 }
598
+ }
599
+ })}
600
+
601
+ `;
602
+ }
603
+ const choice = chunk.choices?.[0];
604
+ if (!choice) continue;
605
+ if (choice.delta?.content) {
606
+ if (!hasTextContentStarted) {
607
+ hasTextContentStarted = true;
608
+ yield `event: content_block_start
609
+ data: ${JSON.stringify({
610
+ type: "content_block_start",
611
+ index: contentIndex,
612
+ content_block: { type: "text", text: "" }
613
+ })}
614
+
615
+ `;
616
+ }
617
+ yield `event: content_block_delta
618
+ data: ${JSON.stringify({
619
+ type: "content_block_delta",
620
+ index: contentIndex,
621
+ delta: { type: "text_delta", text: choice.delta.content }
622
+ })}
623
+
624
+ `;
625
+ }
626
+ if (choice.delta?.reasoning_content) {
627
+ if (hasTextContentStarted) {
628
+ yield `event: content_block_stop
629
+ data: ${JSON.stringify({
630
+ type: "content_block_stop",
631
+ index: contentIndex
632
+ })}
633
+
634
+ `;
635
+ contentIndex++;
636
+ hasTextContentStarted = false;
637
+ }
638
+ if (!hasThinkingContentStarted) {
639
+ hasThinkingContentStarted = true;
640
+ yield `event: content_block_start
641
+ data: ${JSON.stringify({
642
+ type: "content_block_start",
643
+ index: contentIndex,
644
+ content_block: { type: "thinking", thinking: "" }
645
+ })}
646
+
647
+ `;
648
+ }
649
+ yield `event: content_block_delta
650
+ data: ${JSON.stringify({
651
+ type: "content_block_delta",
652
+ index: contentIndex,
653
+ delta: { type: "thinking_delta", thinking: choice.delta.reasoning_content }
654
+ })}
655
+
656
+ `;
657
+ }
658
+ if (choice.delta?.tool_calls) {
659
+ if (hasTextContentStarted) {
660
+ yield `event: content_block_stop
661
+ data: ${JSON.stringify({
662
+ type: "content_block_stop",
663
+ index: contentIndex
664
+ })}
665
+
666
+ `;
667
+ contentIndex++;
668
+ hasTextContentStarted = false;
669
+ }
670
+ for (const toolCall of choice.delta.tool_calls) {
671
+ const toolIndex = toolCall.index ?? 0;
672
+ if (!toolCalls.has(toolIndex)) {
673
+ const toolContentIndex = contentIndex++;
674
+ const toolId = toolCall.id || `call_${Date.now()}_${toolIndex}`;
675
+ const toolName = toolCall.function?.name || `tool_${toolIndex}`;
676
+ toolCalls.set(toolIndex, { id: toolId, name: toolName, contentIndex: toolContentIndex });
677
+ yield `event: content_block_start
678
+ data: ${JSON.stringify({
679
+ type: "content_block_start",
680
+ index: toolContentIndex,
681
+ content_block: { type: "tool_use", id: toolId, name: toolName, input: {} }
682
+ })}
683
+
684
+ `;
685
+ }
686
+ if (toolCall.function?.arguments) {
687
+ const tc = toolCalls.get(toolIndex);
688
+ yield `event: content_block_delta
689
+ data: ${JSON.stringify({
690
+ type: "content_block_delta",
691
+ index: tc.contentIndex,
692
+ delta: { type: "input_json_delta", partial_json: toolCall.function.arguments }
693
+ })}
694
+
695
+ `;
696
+ }
697
+ }
698
+ }
699
+ if (choice.finish_reason) {
700
+ if (hasTextContentStarted) {
701
+ yield `event: content_block_stop
702
+ data: ${JSON.stringify({
703
+ type: "content_block_stop",
704
+ index: contentIndex
705
+ })}
706
+
707
+ `;
708
+ contentIndex++;
709
+ hasTextContentStarted = false;
710
+ }
711
+ if (hasThinkingContentStarted) {
712
+ yield `event: content_block_stop
713
+ data: ${JSON.stringify({
714
+ type: "content_block_stop",
715
+ index: contentIndex
716
+ })}
717
+
718
+ `;
719
+ contentIndex++;
720
+ hasThinkingContentStarted = false;
721
+ }
722
+ for (const [, tc] of toolCalls) {
723
+ yield `event: content_block_stop
724
+ data: ${JSON.stringify({
725
+ type: "content_block_stop",
726
+ index: tc.contentIndex
727
+ })}
728
+
729
+ `;
730
+ }
731
+ const stopReason = mapOpenAIFinishReason(choice.finish_reason);
732
+ yield `event: message_delta
733
+ data: ${JSON.stringify({
734
+ type: "message_delta",
735
+ delta: { stop_reason: stopReason, stop_sequence: null },
736
+ usage: {
737
+ input_tokens: chunk.usage?.prompt_tokens || 0,
738
+ output_tokens: chunk.usage?.completion_tokens || 0
739
+ }
740
+ })}
741
+
742
+ `;
743
+ yield `event: message_stop
744
+ data: ${JSON.stringify({ type: "message_stop" })}
745
+
746
+ `;
747
+ }
748
+ } catch {
749
+ }
750
+ }
751
+ }
752
+
753
+ export {
754
+ hasImageContent,
755
+ hasThinkingEnabled,
756
+ convertAnthropicToOpenAI,
757
+ convertAnthropicRequestToOpenAI,
758
+ convertAnthropicToOpenAIWithThinking,
759
+ convertAnthropicStreamToOpenAI,
760
+ convertOpenAIToAnthropic,
761
+ convertOpenAIResponseToAnthropic,
762
+ convertOpenAIToAnthropicWithThinking,
763
+ convertOpenAIStreamToAnthropic
764
+ };