@strands-agents/sdk 0.7.0 → 1.0.0-rc.0

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 (250) hide show
  1. package/README.md +7 -7
  2. package/dist/src/__fixtures__/agent-helpers.d.ts +44 -0
  3. package/dist/src/__fixtures__/agent-helpers.d.ts.map +1 -1
  4. package/dist/src/__fixtures__/agent-helpers.js +45 -0
  5. package/dist/src/__fixtures__/agent-helpers.js.map +1 -1
  6. package/dist/src/__fixtures__/mock-plugin.d.ts.map +1 -1
  7. package/dist/src/__fixtures__/mock-plugin.js +3 -1
  8. package/dist/src/__fixtures__/mock-plugin.js.map +1 -1
  9. package/dist/src/__fixtures__/tool-helpers.d.ts.map +1 -1
  10. package/dist/src/__fixtures__/tool-helpers.js +1 -0
  11. package/dist/src/__fixtures__/tool-helpers.js.map +1 -1
  12. package/dist/src/a2a/__tests__/events.test.d.ts +2 -0
  13. package/dist/src/a2a/__tests__/events.test.d.ts.map +1 -0
  14. package/dist/src/a2a/__tests__/events.test.js +66 -0
  15. package/dist/src/a2a/__tests__/events.test.js.map +1 -0
  16. package/dist/src/a2a/a2a-agent.d.ts.map +1 -1
  17. package/dist/src/a2a/a2a-agent.js +1 -1
  18. package/dist/src/a2a/a2a-agent.js.map +1 -1
  19. package/dist/src/a2a/events.d.ts +2 -0
  20. package/dist/src/a2a/events.d.ts.map +1 -1
  21. package/dist/src/a2a/events.js +6 -0
  22. package/dist/src/a2a/events.js.map +1 -1
  23. package/dist/src/a2a/index.d.ts +0 -1
  24. package/dist/src/a2a/index.d.ts.map +1 -1
  25. package/dist/src/a2a/index.js +0 -1
  26. package/dist/src/a2a/index.js.map +1 -1
  27. package/dist/src/a2a/server.d.ts +1 -1
  28. package/dist/src/a2a/server.js +1 -1
  29. package/dist/src/agent/__tests__/agent.hook.test.js +229 -1
  30. package/dist/src/agent/__tests__/agent.hook.test.js.map +1 -1
  31. package/dist/src/agent/__tests__/agent.test.js +215 -42
  32. package/dist/src/agent/__tests__/agent.test.js.map +1 -1
  33. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts +2 -0
  34. package/dist/src/agent/__tests__/agent.tracer.test.node.d.ts.map +1 -0
  35. package/dist/src/agent/__tests__/{agent.tracer.test.js → agent.tracer.test.node.js} +52 -40
  36. package/dist/src/agent/__tests__/agent.tracer.test.node.js.map +1 -0
  37. package/dist/src/agent/__tests__/printer.test.js +7 -7
  38. package/dist/src/agent/__tests__/printer.test.js.map +1 -1
  39. package/dist/src/agent/__tests__/snapshot.test.js +39 -2
  40. package/dist/src/agent/__tests__/snapshot.test.js.map +1 -1
  41. package/dist/src/agent/agent.d.ts +16 -1
  42. package/dist/src/agent/agent.d.ts.map +1 -1
  43. package/dist/src/agent/agent.js +170 -94
  44. package/dist/src/agent/agent.js.map +1 -1
  45. package/dist/src/agent/printer.d.ts.map +1 -1
  46. package/dist/src/agent/printer.js +3 -0
  47. package/dist/src/agent/printer.js.map +1 -1
  48. package/dist/src/agent/snapshot.d.ts +3 -3
  49. package/dist/src/agent/snapshot.d.ts.map +1 -1
  50. package/dist/src/agent/snapshot.js +14 -7
  51. package/dist/src/agent/snapshot.js.map +1 -1
  52. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js +72 -46
  53. package/dist/src/conversation-manager/__tests__/sliding-window-conversation-manager.test.js.map +1 -1
  54. package/dist/src/conversation-manager/sliding-window-conversation-manager.d.ts.map +1 -1
  55. package/dist/src/conversation-manager/sliding-window-conversation-manager.js +14 -7
  56. package/dist/src/conversation-manager/sliding-window-conversation-manager.js.map +1 -1
  57. package/dist/src/errors.d.ts +8 -0
  58. package/dist/src/errors.d.ts.map +1 -1
  59. package/dist/src/errors.js +11 -0
  60. package/dist/src/errors.js.map +1 -1
  61. package/dist/src/hooks/__tests__/events.test.js +387 -0
  62. package/dist/src/hooks/__tests__/events.test.js.map +1 -1
  63. package/dist/src/hooks/events.d.ts +104 -0
  64. package/dist/src/hooks/events.d.ts.map +1 -1
  65. package/dist/src/hooks/events.js +137 -0
  66. package/dist/src/hooks/events.js.map +1 -1
  67. package/dist/src/index.d.ts +3 -2
  68. package/dist/src/index.d.ts.map +1 -1
  69. package/dist/src/index.js +5 -3
  70. package/dist/src/index.js.map +1 -1
  71. package/dist/src/models/__tests__/anthropic.test.js +1 -2
  72. package/dist/src/models/__tests__/anthropic.test.js.map +1 -1
  73. package/dist/src/models/__tests__/bedrock.test.js +18 -18
  74. package/dist/src/models/__tests__/bedrock.test.js.map +1 -1
  75. package/dist/src/models/__tests__/google.test.d.ts +2 -0
  76. package/dist/src/models/__tests__/google.test.d.ts.map +1 -0
  77. package/dist/src/models/__tests__/{gemini.test.js → google.test.js} +55 -21
  78. package/dist/src/models/__tests__/google.test.js.map +1 -0
  79. package/dist/src/models/__tests__/openai.test.js +78 -71
  80. package/dist/src/models/__tests__/openai.test.js.map +1 -1
  81. package/dist/src/models/anthropic.d.ts.map +1 -1
  82. package/dist/src/models/anthropic.js +8 -7
  83. package/dist/src/models/anthropic.js.map +1 -1
  84. package/dist/src/models/bedrock.d.ts +3 -3
  85. package/dist/src/models/bedrock.d.ts.map +1 -1
  86. package/dist/src/models/bedrock.js +7 -7
  87. package/dist/src/models/bedrock.js.map +1 -1
  88. package/dist/src/models/{gemini → google}/adapters.d.ts +3 -3
  89. package/dist/src/models/{gemini → google}/adapters.d.ts.map +1 -1
  90. package/dist/src/models/{gemini → google}/adapters.js +1 -1
  91. package/dist/src/models/{gemini → google}/adapters.js.map +1 -1
  92. package/dist/src/models/{gemini → google}/errors.d.ts +7 -7
  93. package/dist/src/models/google/errors.d.ts.map +1 -0
  94. package/dist/src/models/{gemini → google}/errors.js +11 -5
  95. package/dist/src/models/google/errors.js.map +1 -0
  96. package/dist/src/models/google/index.d.ts +15 -0
  97. package/dist/src/models/google/index.d.ts.map +1 -0
  98. package/dist/src/models/google/index.js +15 -0
  99. package/dist/src/models/google/index.js.map +1 -0
  100. package/dist/src/models/{gemini → google}/model.d.ts +18 -18
  101. package/dist/src/models/{gemini → google}/model.d.ts.map +1 -1
  102. package/dist/src/models/{gemini → google}/model.js +22 -19
  103. package/dist/src/models/google/model.js.map +1 -0
  104. package/dist/src/models/{gemini → google}/types.d.ts +9 -9
  105. package/dist/src/models/{gemini → google}/types.d.ts.map +1 -1
  106. package/dist/src/models/google/types.js +5 -0
  107. package/dist/src/models/google/types.js.map +1 -0
  108. package/dist/src/models/model.js +2 -2
  109. package/dist/src/models/model.js.map +1 -1
  110. package/dist/src/models/openai.d.ts +29 -11
  111. package/dist/src/models/openai.d.ts.map +1 -1
  112. package/dist/src/models/openai.js +25 -15
  113. package/dist/src/models/openai.js.map +1 -1
  114. package/dist/src/models/streaming.d.ts +13 -0
  115. package/dist/src/models/streaming.d.ts.map +1 -1
  116. package/dist/src/models/streaming.js +29 -0
  117. package/dist/src/models/streaming.js.map +1 -1
  118. package/dist/src/multiagent/__tests__/events.test.js +177 -0
  119. package/dist/src/multiagent/__tests__/events.test.js.map +1 -1
  120. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts +2 -0
  121. package/dist/src/multiagent/__tests__/graph.tracer.test.d.ts.map +1 -0
  122. package/dist/src/multiagent/__tests__/graph.tracer.test.js +204 -0
  123. package/dist/src/multiagent/__tests__/graph.tracer.test.js.map +1 -0
  124. package/dist/src/multiagent/__tests__/nodes.test.js +48 -5
  125. package/dist/src/multiagent/__tests__/nodes.test.js.map +1 -1
  126. package/dist/src/multiagent/__tests__/swarm.test.js +34 -6
  127. package/dist/src/multiagent/__tests__/swarm.test.js.map +1 -1
  128. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts +2 -0
  129. package/dist/src/multiagent/__tests__/swarm.tracer.test.d.ts.map +1 -0
  130. package/dist/src/multiagent/__tests__/swarm.tracer.test.js +235 -0
  131. package/dist/src/multiagent/__tests__/swarm.tracer.test.js.map +1 -0
  132. package/dist/src/multiagent/events.d.ts +14 -0
  133. package/dist/src/multiagent/events.d.ts.map +1 -1
  134. package/dist/src/multiagent/events.js +34 -0
  135. package/dist/src/multiagent/events.js.map +1 -1
  136. package/dist/src/multiagent/graph.d.ts +4 -0
  137. package/dist/src/multiagent/graph.d.ts.map +1 -1
  138. package/dist/src/multiagent/graph.js +42 -16
  139. package/dist/src/multiagent/graph.js.map +1 -1
  140. package/dist/src/multiagent/index.d.ts +1 -1
  141. package/dist/src/multiagent/index.d.ts.map +1 -1
  142. package/dist/src/multiagent/index.js.map +1 -1
  143. package/dist/src/multiagent/nodes.d.ts +23 -9
  144. package/dist/src/multiagent/nodes.d.ts.map +1 -1
  145. package/dist/src/multiagent/nodes.js +25 -14
  146. package/dist/src/multiagent/nodes.js.map +1 -1
  147. package/dist/src/multiagent/state.d.ts +8 -3
  148. package/dist/src/multiagent/state.d.ts.map +1 -1
  149. package/dist/src/multiagent/state.js +18 -4
  150. package/dist/src/multiagent/state.js.map +1 -1
  151. package/dist/src/multiagent/swarm.d.ts +15 -1
  152. package/dist/src/multiagent/swarm.d.ts.map +1 -1
  153. package/dist/src/multiagent/swarm.js +71 -30
  154. package/dist/src/multiagent/swarm.js.map +1 -1
  155. package/dist/src/session/__tests__/session-manager.test.js +36 -0
  156. package/dist/src/session/__tests__/session-manager.test.js.map +1 -1
  157. package/dist/src/session/session-manager.d.ts +2 -3
  158. package/dist/src/session/session-manager.d.ts.map +1 -1
  159. package/dist/src/session/session-manager.js +11 -9
  160. package/dist/src/session/session-manager.js.map +1 -1
  161. package/dist/src/telemetry/__tests__/local-trace.test.d.ts +2 -0
  162. package/dist/src/telemetry/__tests__/local-trace.test.d.ts.map +1 -0
  163. package/dist/src/telemetry/__tests__/local-trace.test.js +158 -0
  164. package/dist/src/telemetry/__tests__/local-trace.test.js.map +1 -0
  165. package/dist/src/telemetry/__tests__/tracer.test.node.js +28 -0
  166. package/dist/src/telemetry/__tests__/tracer.test.node.js.map +1 -1
  167. package/dist/src/telemetry/config.js +1 -1
  168. package/dist/src/telemetry/config.js.map +1 -1
  169. package/dist/src/telemetry/meter.d.ts +0 -13
  170. package/dist/src/telemetry/meter.d.ts.map +1 -1
  171. package/dist/src/telemetry/meter.js +8 -36
  172. package/dist/src/telemetry/meter.js.map +1 -1
  173. package/dist/src/telemetry/tracer.d.ts +107 -18
  174. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  175. package/dist/src/telemetry/tracer.js +245 -33
  176. package/dist/src/telemetry/tracer.js.map +1 -1
  177. package/dist/src/telemetry/types.d.ts +49 -0
  178. package/dist/src/telemetry/types.d.ts.map +1 -1
  179. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts +2 -0
  180. package/dist/src/tools/__tests__/structured-output-tool.test.d.ts.map +1 -0
  181. package/dist/src/tools/__tests__/structured-output-tool.test.js +84 -0
  182. package/dist/src/tools/__tests__/structured-output-tool.test.js.map +1 -0
  183. package/dist/src/tools/structured-output-tool.d.ts +41 -0
  184. package/dist/src/tools/structured-output-tool.d.ts.map +1 -0
  185. package/dist/src/tools/structured-output-tool.js +82 -0
  186. package/dist/src/tools/structured-output-tool.js.map +1 -0
  187. package/dist/src/tools/zod-tool.js +1 -1
  188. package/dist/src/tools/zod-tool.js.map +1 -1
  189. package/dist/src/{utils/zod.d.ts → tools/zod-utils.d.ts} +1 -1
  190. package/dist/src/tools/zod-utils.d.ts.map +1 -0
  191. package/dist/src/{utils/zod.js → tools/zod-utils.js} +1 -1
  192. package/dist/src/tools/zod-utils.js.map +1 -0
  193. package/dist/src/tsconfig.tsbuildinfo +1 -1
  194. package/dist/src/types/__tests__/agent.test.js +127 -0
  195. package/dist/src/types/__tests__/agent.test.js.map +1 -1
  196. package/dist/src/types/agent.d.ts +27 -1
  197. package/dist/src/types/agent.d.ts.map +1 -1
  198. package/dist/src/types/agent.js +26 -0
  199. package/dist/src/types/agent.js.map +1 -1
  200. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js +12 -0
  201. package/dist/src/vended-tools/bash/__tests__/bash.test.node.js.map +1 -1
  202. package/dist/src/vended-tools/bash/bash.d.ts.map +1 -1
  203. package/dist/src/vended-tools/bash/bash.js +16 -14
  204. package/dist/src/vended-tools/bash/bash.js.map +1 -1
  205. package/package.json +12 -8
  206. package/dist/src/agent/__tests__/agent.tracer.test.d.ts +0 -2
  207. package/dist/src/agent/__tests__/agent.tracer.test.d.ts.map +0 -1
  208. package/dist/src/agent/__tests__/agent.tracer.test.js.map +0 -1
  209. package/dist/src/models/__tests__/gemini.test.d.ts +0 -2
  210. package/dist/src/models/__tests__/gemini.test.d.ts.map +0 -1
  211. package/dist/src/models/__tests__/gemini.test.js.map +0 -1
  212. package/dist/src/models/gemini/errors.d.ts.map +0 -1
  213. package/dist/src/models/gemini/errors.js.map +0 -1
  214. package/dist/src/models/gemini/model.js.map +0 -1
  215. package/dist/src/models/gemini/types.js +0 -5
  216. package/dist/src/models/gemini/types.js.map +0 -1
  217. package/dist/src/structured-output/__tests__/context.test.d.ts +0 -2
  218. package/dist/src/structured-output/__tests__/context.test.d.ts.map +0 -1
  219. package/dist/src/structured-output/__tests__/context.test.js +0 -201
  220. package/dist/src/structured-output/__tests__/context.test.js.map +0 -1
  221. package/dist/src/structured-output/__tests__/exceptions.test.d.ts +0 -2
  222. package/dist/src/structured-output/__tests__/exceptions.test.d.ts.map +0 -1
  223. package/dist/src/structured-output/__tests__/exceptions.test.js +0 -103
  224. package/dist/src/structured-output/__tests__/exceptions.test.js.map +0 -1
  225. package/dist/src/structured-output/__tests__/tool.test.d.ts +0 -2
  226. package/dist/src/structured-output/__tests__/tool.test.d.ts.map +0 -1
  227. package/dist/src/structured-output/__tests__/tool.test.js +0 -256
  228. package/dist/src/structured-output/__tests__/tool.test.js.map +0 -1
  229. package/dist/src/structured-output/__tests__/utils.test.d.ts +0 -2
  230. package/dist/src/structured-output/__tests__/utils.test.d.ts.map +0 -1
  231. package/dist/src/structured-output/__tests__/utils.test.js +0 -183
  232. package/dist/src/structured-output/__tests__/utils.test.js.map +0 -1
  233. package/dist/src/structured-output/context.d.ts +0 -91
  234. package/dist/src/structured-output/context.d.ts.map +0 -1
  235. package/dist/src/structured-output/context.js +0 -112
  236. package/dist/src/structured-output/context.js.map +0 -1
  237. package/dist/src/structured-output/exceptions.d.ts +0 -18
  238. package/dist/src/structured-output/exceptions.d.ts.map +0 -1
  239. package/dist/src/structured-output/exceptions.js +0 -28
  240. package/dist/src/structured-output/exceptions.js.map +0 -1
  241. package/dist/src/structured-output/tool.d.ts +0 -33
  242. package/dist/src/structured-output/tool.d.ts.map +0 -1
  243. package/dist/src/structured-output/tool.js +0 -73
  244. package/dist/src/structured-output/tool.js.map +0 -1
  245. package/dist/src/structured-output/utils.d.ts +0 -23
  246. package/dist/src/structured-output/utils.d.ts.map +0 -1
  247. package/dist/src/structured-output/utils.js +0 -104
  248. package/dist/src/structured-output/utils.js.map +0 -1
  249. package/dist/src/utils/zod.d.ts.map +0 -1
  250. package/dist/src/utils/zod.js.map +0 -1
@@ -61,20 +61,20 @@ describe('OpenAIModel', () => {
61
61
  };
62
62
  describe('constructor', () => {
63
63
  it('creates an instance with required modelId', () => {
64
- const provider = new OpenAIModel({ modelId: 'gpt-4o', apiKey: 'sk-test' });
64
+ const provider = new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4', apiKey: 'sk-test' });
65
65
  const config = provider.getConfig();
66
- expect(config.modelId).toBe('gpt-4o');
66
+ expect(config.modelId).toBe('gpt-5.4');
67
67
  });
68
68
  it('uses custom model ID', () => {
69
69
  const customModelId = 'gpt-3.5-turbo';
70
- const provider = new OpenAIModel({ modelId: customModelId, apiKey: 'sk-test' });
70
+ const provider = new OpenAIModel({ api: 'chat', modelId: customModelId, apiKey: 'sk-test' });
71
71
  expect(provider.getConfig()).toStrictEqual({
72
72
  modelId: customModelId,
73
73
  });
74
74
  });
75
75
  it('uses API key from constructor parameter', () => {
76
76
  const apiKey = 'sk-explicit';
77
- new OpenAIModel({ modelId: 'gpt-4o', apiKey });
77
+ new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4', apiKey });
78
78
  expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({
79
79
  apiKey: apiKey,
80
80
  }));
@@ -83,7 +83,7 @@ describe('OpenAIModel', () => {
83
83
  if (isNode) {
84
84
  it('uses API key from environment variable', () => {
85
85
  vi.stubEnv('OPENAI_API_KEY', 'sk-from-env');
86
- new OpenAIModel({ modelId: 'gpt-4o' });
86
+ new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4' });
87
87
  // OpenAI client should be called without explicit apiKey (uses env var internally)
88
88
  expect(OpenAI).toHaveBeenCalled();
89
89
  });
@@ -93,7 +93,7 @@ describe('OpenAIModel', () => {
93
93
  vi.stubEnv('OPENAI_API_KEY', 'sk-from-env');
94
94
  }
95
95
  const explicitKey = 'sk-explicit';
96
- new OpenAIModel({ modelId: 'gpt-4o', apiKey: explicitKey });
96
+ new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4', apiKey: explicitKey });
97
97
  expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({
98
98
  apiKey: explicitKey,
99
99
  }));
@@ -102,11 +102,11 @@ describe('OpenAIModel', () => {
102
102
  if (isNode) {
103
103
  vi.stubEnv('OPENAI_API_KEY', '');
104
104
  }
105
- expect(() => new OpenAIModel({ modelId: 'gpt-4o' })).toThrow("OpenAI API key is required. Provide it via the 'apiKey' option (string or function) or set the OPENAI_API_KEY environment variable.");
105
+ expect(() => new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4' })).toThrow("OpenAI API key is required. Provide it via the 'apiKey' option (string or function) or set the OPENAI_API_KEY environment variable.");
106
106
  });
107
107
  it('uses custom client configuration', () => {
108
108
  const timeout = 30000;
109
- new OpenAIModel({ modelId: 'gpt-4o', apiKey: 'sk-test', clientConfig: { timeout } });
109
+ new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4', apiKey: 'sk-test', clientConfig: { timeout } });
110
110
  expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({
111
111
  timeout: timeout,
112
112
  }));
@@ -114,7 +114,7 @@ describe('OpenAIModel', () => {
114
114
  it('uses provided client instance', () => {
115
115
  vi.clearAllMocks();
116
116
  const mockClient = {};
117
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
117
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
118
118
  // Should not create a new OpenAI client
119
119
  expect(OpenAI).not.toHaveBeenCalled();
120
120
  expect(provider).toBeDefined();
@@ -123,7 +123,8 @@ describe('OpenAIModel', () => {
123
123
  vi.clearAllMocks();
124
124
  const mockClient = {};
125
125
  new OpenAIModel({
126
- modelId: 'gpt-4o',
126
+ api: 'chat',
127
+ modelId: 'gpt-5.4',
127
128
  apiKey: 'sk-test',
128
129
  client: mockClient,
129
130
  clientConfig: { timeout: 30000 },
@@ -137,12 +138,13 @@ describe('OpenAIModel', () => {
137
138
  vi.stubEnv('OPENAI_API_KEY', '');
138
139
  }
139
140
  const mockClient = {};
140
- expect(() => new OpenAIModel({ modelId: 'gpt-4o', client: mockClient })).not.toThrow();
141
+ expect(() => new OpenAIModel({ api: 'chat', client: mockClient })).not.toThrow();
141
142
  });
142
143
  it('accepts function-based API key', () => {
143
144
  const apiKeyFn = vi.fn(async () => 'sk-dynamic');
144
145
  new OpenAIModel({
145
- modelId: 'gpt-4o',
146
+ api: 'chat',
147
+ modelId: 'gpt-5.4',
146
148
  apiKey: apiKeyFn,
147
149
  });
148
150
  expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({
@@ -155,7 +157,8 @@ describe('OpenAIModel', () => {
155
157
  return 'sk-async-key';
156
158
  };
157
159
  new OpenAIModel({
158
- modelId: 'gpt-4o',
160
+ api: 'chat',
161
+ modelId: 'gpt-5.4',
159
162
  apiKey: apiKeyFn,
160
163
  });
161
164
  expect(OpenAI).toHaveBeenCalledWith(expect.objectContaining({
@@ -165,16 +168,17 @@ describe('OpenAIModel', () => {
165
168
  });
166
169
  describe('updateConfig', () => {
167
170
  it('merges new config with existing config', () => {
168
- const provider = new OpenAIModel({ modelId: 'gpt-4o', apiKey: 'sk-test', temperature: 0.5 });
169
- provider.updateConfig({ modelId: 'gpt-4o', temperature: 0.8, maxTokens: 2048 });
171
+ const provider = new OpenAIModel({ api: 'chat', modelId: 'gpt-5.4', apiKey: 'sk-test', temperature: 0.5 });
172
+ provider.updateConfig({ modelId: 'gpt-5.4', temperature: 0.8, maxTokens: 2048 });
170
173
  expect(provider.getConfig()).toStrictEqual({
171
- modelId: 'gpt-4o',
174
+ modelId: 'gpt-5.4',
172
175
  temperature: 0.8,
173
176
  maxTokens: 2048,
174
177
  });
175
178
  });
176
179
  it('preserves fields not included in the update', () => {
177
180
  const provider = new OpenAIModel({
181
+ api: 'chat',
178
182
  apiKey: 'sk-test',
179
183
  modelId: 'gpt-3.5-turbo',
180
184
  temperature: 0.5,
@@ -191,13 +195,14 @@ describe('OpenAIModel', () => {
191
195
  describe('getConfig', () => {
192
196
  it('returns the current configuration', () => {
193
197
  const provider = new OpenAIModel({
194
- modelId: 'gpt-4o',
198
+ api: 'chat',
199
+ modelId: 'gpt-5.4',
195
200
  apiKey: 'sk-test',
196
201
  maxTokens: 1024,
197
202
  temperature: 0.7,
198
203
  });
199
204
  expect(provider.getConfig()).toStrictEqual({
200
- modelId: 'gpt-4o',
205
+ modelId: 'gpt-5.4',
201
206
  maxTokens: 1024,
202
207
  temperature: 0.7,
203
208
  });
@@ -207,7 +212,7 @@ describe('OpenAIModel', () => {
207
212
  describe('validation', () => {
208
213
  it('throws error when messages array is empty', async () => {
209
214
  const mockClient = createMockClient(async function* () { });
210
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
215
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
211
216
  await expect(async () => {
212
217
  await collectIterator(provider.stream([]));
213
218
  }).rejects.toThrow('At least one message is required');
@@ -221,7 +226,7 @@ describe('OpenAIModel', () => {
221
226
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
222
227
  };
223
228
  });
224
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
229
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
225
230
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
226
231
  // System prompt that's only whitespace should not be sent
227
232
  const events = await collectIterator(provider.stream(messages, { systemPrompt: ' ' }));
@@ -232,7 +237,8 @@ describe('OpenAIModel', () => {
232
237
  it('throws error for streaming with n > 1', async () => {
233
238
  const mockClient = createMockClient(async function* () { });
234
239
  const provider = new OpenAIModel({
235
- modelId: 'gpt-4o',
240
+ api: 'chat',
241
+ modelId: 'gpt-5.4',
236
242
  client: mockClient,
237
243
  params: { n: 2 },
238
244
  });
@@ -245,7 +251,7 @@ describe('OpenAIModel', () => {
245
251
  });
246
252
  it('throws error for tool spec without name or description', async () => {
247
253
  const mockClient = createMockClient(async function* () { });
248
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
254
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
249
255
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
250
256
  await expect(async () => {
251
257
  for await (const _ of provider.stream(messages, {
@@ -257,7 +263,7 @@ describe('OpenAIModel', () => {
257
263
  });
258
264
  it('throws error for empty tool result content', async () => {
259
265
  const mockClient = createMockClient(async function* () { });
260
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
266
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
261
267
  const messages = [
262
268
  new Message({
263
269
  role: 'user',
@@ -285,7 +291,7 @@ describe('OpenAIModel', () => {
285
291
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
286
292
  };
287
293
  });
288
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
294
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
289
295
  const messages = [
290
296
  new Message({ role: 'user', content: [new TextBlock('Run tool')] }),
291
297
  new Message({
@@ -317,7 +323,7 @@ describe('OpenAIModel', () => {
317
323
  });
318
324
  it('throws error for circular reference in tool input', async () => {
319
325
  const mockClient = createMockClient(async function* () { });
320
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
326
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
321
327
  const circular = { a: 1 };
322
328
  circular.self = circular;
323
329
  const messages = [
@@ -356,7 +362,7 @@ describe('OpenAIModel', () => {
356
362
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
357
363
  };
358
364
  });
359
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
365
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
360
366
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
361
367
  const events = await collectIterator(provider.stream(messages));
362
368
  // Now includes complete content block lifecycle: start, deltas, stop
@@ -392,7 +398,7 @@ describe('OpenAIModel', () => {
392
398
  usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },
393
399
  };
394
400
  });
395
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
401
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
396
402
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
397
403
  const events = await collectIterator(provider.stream(messages));
398
404
  const metadataEvent = events.find((e) => e.type === 'modelMetadataEvent');
@@ -419,7 +425,7 @@ describe('OpenAIModel', () => {
419
425
  usage: {}, // Empty usage object
420
426
  };
421
427
  });
422
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
428
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
423
429
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
424
430
  const events = await collectIterator(provider.stream(messages));
425
431
  const metadataEvent = events.find((e) => e.type === 'modelMetadataEvent');
@@ -448,7 +454,7 @@ describe('OpenAIModel', () => {
448
454
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
449
455
  };
450
456
  });
451
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
457
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
452
458
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
453
459
  const events = await collectIterator(provider.stream(messages));
454
460
  // Should not emit event for empty content
@@ -468,7 +474,7 @@ describe('OpenAIModel', () => {
468
474
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
469
475
  };
470
476
  });
471
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
477
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
472
478
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
473
479
  // Suppress console.warn for this test
474
480
  vi.spyOn(console, 'warn').mockImplementation(() => { });
@@ -525,7 +531,7 @@ describe('OpenAIModel', () => {
525
531
  choices: [{ finish_reason: 'tool_calls', delta: {}, index: 0 }],
526
532
  };
527
533
  });
528
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
534
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
529
535
  const messages = [new Message({ role: 'user', content: [new TextBlock('Calculate 2+2')] })];
530
536
  const events = await collectIterator(provider.stream(messages));
531
537
  // Verify key events in sequence
@@ -600,7 +606,7 @@ describe('OpenAIModel', () => {
600
606
  choices: [{ finish_reason: 'tool_calls', delta: {}, index: 0 }],
601
607
  };
602
608
  });
603
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
609
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
604
610
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
605
611
  const events = await collectIterator(provider.stream(messages));
606
612
  // Should emit stop events for both tool calls
@@ -635,7 +641,7 @@ describe('OpenAIModel', () => {
635
641
  choices: [{ finish_reason: 'stop', delta: {}, index: 0 }],
636
642
  };
637
643
  });
638
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
644
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
639
645
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
640
646
  // Suppress console.warn for this test
641
647
  vi.spyOn(console, 'warn').mockImplementation(() => { });
@@ -675,7 +681,7 @@ describe('OpenAIModel', () => {
675
681
  yield { choices: [{ delta: { tool_calls: [{ index: 0, function: { arguments: '20}' } }] }, index: 0 }] };
676
682
  yield { choices: [{ finish_reason: 'tool_calls', delta: {}, index: 0 }] };
677
683
  });
678
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
684
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
679
685
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
680
686
  const events = await collectIterator(provider.stream(messages));
681
687
  // Extract and concatenate all tool input deltas
@@ -713,7 +719,7 @@ describe('OpenAIModel', () => {
713
719
  };
714
720
  yield { choices: [{ finish_reason: 'tool_calls', delta: {}, index: 0 }] };
715
721
  });
716
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
722
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
717
723
  const messages = [new Message({ role: 'user', content: [new TextBlock('Calculate 2+2')] })];
718
724
  const events = await collectIterator(provider.stream(messages));
719
725
  // Should have text deltas followed by tool events
@@ -749,7 +755,7 @@ describe('OpenAIModel', () => {
749
755
  choices: [{ finish_reason: openai, delta: {}, index: 0 }],
750
756
  };
751
757
  });
752
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
758
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
753
759
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
754
760
  const events = await collectIterator(provider.stream(messages));
755
761
  const stopEvent = events.find((e) => e.type === 'modelMessageStopEvent');
@@ -766,7 +772,7 @@ describe('OpenAIModel', () => {
766
772
  choices: [{ finish_reason: 'new_unknown_reason', delta: {}, index: 0 }],
767
773
  };
768
774
  });
769
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
775
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
770
776
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
771
777
  const events = await collectIterator(provider.stream(messages));
772
778
  // Should convert unknown stop reason to camelCase
@@ -797,7 +803,8 @@ describe('OpenAIModel', () => {
797
803
  },
798
804
  };
799
805
  const provider = new OpenAIModel({
800
- modelId: 'gpt-4o',
806
+ api: 'chat',
807
+ modelId: 'gpt-5.4',
801
808
  client: mockClient,
802
809
  temperature: 0.7,
803
810
  maxTokens: 1000,
@@ -819,7 +826,7 @@ describe('OpenAIModel', () => {
819
826
  expect(callCount).toBe(1);
820
827
  expect(capturedRequest).toBeDefined();
821
828
  expect(capturedRequest).toEqual({
822
- model: 'gpt-4o',
829
+ model: 'gpt-5.4',
823
830
  stream: true,
824
831
  stream_options: { include_usage: true },
825
832
  temperature: 0.7,
@@ -846,7 +853,7 @@ describe('OpenAIModel', () => {
846
853
  it('formats array system prompt with text blocks only', async () => {
847
854
  const captured = { request: null };
848
855
  const mockClient = createMockClientWithCapture(captured);
849
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
856
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
850
857
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
851
858
  await collectIterator(provider.stream(messages, {
852
859
  systemPrompt: [
@@ -864,7 +871,7 @@ describe('OpenAIModel', () => {
864
871
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
865
872
  const captured = { request: null };
866
873
  const mockClient = createMockClientWithCapture(captured);
867
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
874
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
868
875
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
869
876
  collectIterator(provider.stream(messages, {
870
877
  systemPrompt: [
@@ -886,7 +893,7 @@ describe('OpenAIModel', () => {
886
893
  it('handles empty array system prompt', async () => {
887
894
  const captured = { request: null };
888
895
  const mockClient = createMockClientWithCapture(captured);
889
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
896
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
890
897
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
891
898
  await collectIterator(provider.stream(messages, {
892
899
  systemPrompt: [],
@@ -898,7 +905,7 @@ describe('OpenAIModel', () => {
898
905
  it('formats array system prompt with single text block', async () => {
899
906
  const captured = { request: null };
900
907
  const mockClient = createMockClientWithCapture(captured);
901
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
908
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
902
909
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
903
910
  await collectIterator(provider.stream(messages, {
904
911
  systemPrompt: [{ type: 'textBlock', text: 'You are a helpful assistant' }],
@@ -913,7 +920,7 @@ describe('OpenAIModel', () => {
913
920
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
914
921
  const captured = { request: null };
915
922
  const mockClient = createMockClientWithCapture(captured);
916
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
923
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
917
924
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
918
925
  await collectIterator(provider.stream(messages, {
919
926
  systemPrompt: [
@@ -941,7 +948,7 @@ describe('OpenAIModel', () => {
941
948
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
942
949
  const captured = { request: null };
943
950
  const mockClient = createMockClientWithCapture(captured);
944
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
951
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
945
952
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
946
953
  await collectIterator(provider.stream(messages, {
947
954
  systemPrompt: [
@@ -970,7 +977,7 @@ describe('OpenAIModel', () => {
970
977
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
971
978
  const captured = { request: null };
972
979
  const mockClient = createMockClientWithCapture(captured);
973
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
980
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
974
981
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hello')] })];
975
982
  await collectIterator(provider.stream(messages, {
976
983
  systemPrompt: [
@@ -996,7 +1003,7 @@ describe('OpenAIModel', () => {
996
1003
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
997
1004
  const captured = { request: null };
998
1005
  const mockClient = createMockClientWithCapture(captured);
999
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1006
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1000
1007
  const messages = [
1001
1008
  new Message({
1002
1009
  role: 'user',
@@ -1014,7 +1021,7 @@ describe('OpenAIModel', () => {
1014
1021
  ];
1015
1022
  await collectIterator(provider.stream(messages));
1016
1023
  // Verify warning was logged
1017
- expect(warnSpy).toHaveBeenCalledWith('OpenAI ChatCompletions API does not support content type: guardContentBlock.');
1024
+ expect(warnSpy).toHaveBeenCalledWith('block_type=<guardContentBlock> | unsupported content type in openai user message | skipping');
1018
1025
  // Verify guard content filtered out
1019
1026
  expect(captured.request).toBeDefined();
1020
1027
  expect(captured.request.messages).toEqual([
@@ -1032,7 +1039,7 @@ describe('OpenAIModel', () => {
1032
1039
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
1033
1040
  const captured = { request: null };
1034
1041
  const mockClient = createMockClientWithCapture(captured);
1035
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1042
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1036
1043
  const imageBytes = new Uint8Array([1, 2, 3, 4]);
1037
1044
  const messages = [
1038
1045
  new Message({
@@ -1050,7 +1057,7 @@ describe('OpenAIModel', () => {
1050
1057
  ];
1051
1058
  await collectIterator(provider.stream(messages));
1052
1059
  // Verify warning was logged
1053
- expect(warnSpy).toHaveBeenCalledWith('OpenAI ChatCompletions API does not support content type: guardContentBlock.');
1060
+ expect(warnSpy).toHaveBeenCalledWith('block_type=<guardContentBlock> | unsupported content type in openai user message | skipping');
1054
1061
  // Verify guard content filtered out
1055
1062
  expect(captured.request).toBeDefined();
1056
1063
  expect(captured.request.messages).toEqual([
@@ -1062,7 +1069,7 @@ describe('OpenAIModel', () => {
1062
1069
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
1063
1070
  const captured = { request: null };
1064
1071
  const mockClient = createMockClientWithCapture(captured);
1065
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1072
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1066
1073
  const messages = [
1067
1074
  new Message({
1068
1075
  role: 'user',
@@ -1078,7 +1085,7 @@ describe('OpenAIModel', () => {
1078
1085
  ];
1079
1086
  await collectIterator(provider.stream(messages));
1080
1087
  // Verify warning was logged
1081
- expect(warnSpy).toHaveBeenCalledWith('OpenAI ChatCompletions API does not support content type: guardContentBlock.');
1088
+ expect(warnSpy).toHaveBeenCalledWith('block_type=<guardContentBlock> | unsupported content type in openai user message | skipping');
1082
1089
  // Verify no user message added (only guard content)
1083
1090
  expect(captured.request).toBeDefined();
1084
1091
  expect(captured.request.messages).toEqual([]);
@@ -1089,7 +1096,7 @@ describe('OpenAIModel', () => {
1089
1096
  it('formats image block in user message as image_url with base64', async () => {
1090
1097
  const captured = { request: null };
1091
1098
  const mockClient = createMockClientWithCapture(captured);
1092
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1099
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1093
1100
  const imageBytes = new Uint8Array([72, 101, 108, 108, 111]);
1094
1101
  const messages = [
1095
1102
  new Message({
@@ -1113,7 +1120,7 @@ describe('OpenAIModel', () => {
1113
1120
  it('formats image block in user message with URL source', async () => {
1114
1121
  const captured = { request: null };
1115
1122
  const mockClient = createMockClientWithCapture(captured);
1116
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1123
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1117
1124
  const messages = [
1118
1125
  new Message({
1119
1126
  role: 'user',
@@ -1130,7 +1137,7 @@ describe('OpenAIModel', () => {
1130
1137
  it('formats document block with bytes source as file in user message', async () => {
1131
1138
  const captured = { request: null };
1132
1139
  const mockClient = createMockClientWithCapture(captured);
1133
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1140
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1134
1141
  const docBytes = new Uint8Array([1, 2, 3]);
1135
1142
  const messages = [
1136
1143
  new Message({
@@ -1148,7 +1155,7 @@ describe('OpenAIModel', () => {
1148
1155
  it('splits image from tool result into separate user message', async () => {
1149
1156
  const captured = { request: null };
1150
1157
  const mockClient = createMockClientWithCapture(captured);
1151
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1158
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1152
1159
  const imageBytes = new Uint8Array([72, 101, 108, 108, 111]);
1153
1160
  const messages = [
1154
1161
  new Message({
@@ -1182,7 +1189,7 @@ describe('OpenAIModel', () => {
1182
1189
  it('injects placeholder text when tool result contains only images', async () => {
1183
1190
  const captured = { request: null };
1184
1191
  const mockClient = createMockClientWithCapture(captured);
1185
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1192
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1186
1193
  const messages = [
1187
1194
  new Message({
1188
1195
  role: 'user',
@@ -1203,7 +1210,7 @@ describe('OpenAIModel', () => {
1203
1210
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
1204
1211
  const captured = { request: null };
1205
1212
  const mockClient = createMockClientWithCapture(captured);
1206
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1213
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1207
1214
  const messages = [
1208
1215
  new Message({
1209
1216
  role: 'user',
@@ -1229,7 +1236,7 @@ describe('OpenAIModel', () => {
1229
1236
  const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
1230
1237
  const captured = { request: null };
1231
1238
  const mockClient = createMockClientWithCapture(captured);
1232
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1239
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1233
1240
  const messages = [
1234
1241
  new Message({
1235
1242
  role: 'user',
@@ -1265,7 +1272,7 @@ describe('OpenAIModel', () => {
1265
1272
  },
1266
1273
  },
1267
1274
  };
1268
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1275
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1269
1276
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1270
1277
  await expect(async () => {
1271
1278
  for await (const _ of provider.stream(messages)) {
@@ -1283,7 +1290,7 @@ describe('OpenAIModel', () => {
1283
1290
  },
1284
1291
  },
1285
1292
  };
1286
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1293
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1287
1294
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1288
1295
  await expect(async () => {
1289
1296
  for await (const _ of provider.stream(messages)) {
@@ -1308,7 +1315,7 @@ describe('OpenAIModel', () => {
1308
1315
  },
1309
1316
  },
1310
1317
  };
1311
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1318
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1312
1319
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1313
1320
  await expect(async () => {
1314
1321
  for await (const _ of provider.stream(messages)) {
@@ -1326,7 +1333,7 @@ describe('OpenAIModel', () => {
1326
1333
  },
1327
1334
  },
1328
1335
  };
1329
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1336
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1330
1337
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1331
1338
  await expect(async () => {
1332
1339
  for await (const _ of provider.stream(messages)) {
@@ -1341,7 +1348,7 @@ describe('OpenAIModel', () => {
1341
1348
  // Stream interruption
1342
1349
  throw new Error('Network connection lost');
1343
1350
  });
1344
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1351
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1345
1352
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1346
1353
  await expect(async () => {
1347
1354
  for await (const _ of provider.stream(messages)) {
@@ -1361,7 +1368,7 @@ describe('OpenAIModel', () => {
1361
1368
  },
1362
1369
  },
1363
1370
  };
1364
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1371
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1365
1372
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1366
1373
  await expect(async () => {
1367
1374
  for await (const _ of provider.stream(messages)) {
@@ -1381,7 +1388,7 @@ describe('OpenAIModel', () => {
1381
1388
  },
1382
1389
  },
1383
1390
  };
1384
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1391
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1385
1392
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1386
1393
  await expect(async () => {
1387
1394
  for await (const _ of provider.stream(messages)) {
@@ -1399,7 +1406,7 @@ describe('OpenAIModel', () => {
1399
1406
  },
1400
1407
  },
1401
1408
  };
1402
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1409
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1403
1410
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1404
1411
  await expect(async () => {
1405
1412
  for await (const _ of provider.stream(messages)) {
@@ -1417,7 +1424,7 @@ describe('OpenAIModel', () => {
1417
1424
  },
1418
1425
  },
1419
1426
  };
1420
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1427
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1421
1428
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1422
1429
  await expect(async () => {
1423
1430
  for await (const _ of provider.stream(messages)) {
@@ -1426,7 +1433,7 @@ describe('OpenAIModel', () => {
1426
1433
  }).rejects.toThrow(ModelThrottledError);
1427
1434
  });
1428
1435
  it('preserves original error as cause in ModelThrottledError', async () => {
1429
- const originalError = new Error('Request too large for gpt-4o on tokens per min');
1436
+ const originalError = new Error('Request too large for gpt-5.4 on tokens per min');
1430
1437
  originalError.status = 429;
1431
1438
  const mockClient = {
1432
1439
  chat: {
@@ -1437,7 +1444,7 @@ describe('OpenAIModel', () => {
1437
1444
  },
1438
1445
  },
1439
1446
  };
1440
- const provider = new OpenAIModel({ modelId: 'gpt-4o', client: mockClient });
1447
+ const provider = new OpenAIModel({ api: 'chat', client: mockClient });
1441
1448
  const messages = [new Message({ role: 'user', content: [new TextBlock('Hi')] })];
1442
1449
  try {
1443
1450
  for await (const _ of provider.stream(messages)) {
@@ -1449,7 +1456,7 @@ describe('OpenAIModel', () => {
1449
1456
  expect(error).toBeInstanceOf(ModelThrottledError);
1450
1457
  const throttleError = error;
1451
1458
  expect(throttleError.cause).toBe(originalError);
1452
- expect(throttleError.message).toBe('Request too large for gpt-4o on tokens per min');
1459
+ expect(throttleError.message).toBe('Request too large for gpt-5.4 on tokens per min');
1453
1460
  }
1454
1461
  });
1455
1462
  });