@robota-sdk/agent-provider-openai 3.0.0-beta.63 → 3.0.0-beta.82

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 (70) hide show
  1. package/LICENSE +661 -21
  2. package/dist/node/index.cjs +1 -2
  3. package/dist/node/index.d.cts +271 -267
  4. package/dist/node/index.d.cts.map +1 -0
  5. package/dist/node/index.d.ts +271 -267
  6. package/dist/node/index.d.ts.map +1 -0
  7. package/dist/node/index.js +2 -2
  8. package/dist/node/index.js.map +1 -0
  9. package/dist/node/loggers/index.cjs +1 -0
  10. package/dist/node/loggers/index.d.cts +94 -0
  11. package/dist/node/loggers/index.d.cts.map +1 -0
  12. package/dist/node/loggers/index.d.ts +94 -0
  13. package/dist/node/loggers/index.d.ts.map +1 -0
  14. package/dist/node/loggers/index.js +2 -0
  15. package/dist/node/loggers/index.js.map +1 -0
  16. package/dist/node/payload-logger-BaW0K8yI.d.cts +61 -0
  17. package/dist/node/payload-logger-BaW0K8yI.d.cts.map +1 -0
  18. package/dist/node/payload-logger-BaW0K8yI.d.ts +61 -0
  19. package/dist/node/payload-logger-BaW0K8yI.d.ts.map +1 -0
  20. package/dist/node/rolldown-runtime-CMqjfN_6.cjs +1 -0
  21. package/package.json +69 -86
  22. package/src/index.ts +1 -0
  23. package/src/openai/__tests__/endpoint-provenance.test.ts +44 -0
  24. package/src/openai/__tests__/provider-errors.test.ts +114 -0
  25. package/src/openai/__tests__/request-format.test.ts +59 -0
  26. package/src/openai/__tests__/strict-tools-closure.test.ts +136 -0
  27. package/src/openai/__tests__/tool-schema-projection.test.ts +302 -0
  28. package/src/openai/__tests__/trace-context-wire.test.ts +114 -0
  29. package/src/openai/adapter.test.ts +494 -0
  30. package/src/openai/adapter.ts +145 -0
  31. package/src/openai/chat-completions-chat.ts +225 -0
  32. package/src/openai/executor-integration.test.ts +213 -0
  33. package/src/openai/index.ts +19 -0
  34. package/src/openai/interfaces/payload-logger.ts +48 -0
  35. package/src/openai/loggers/console-payload-logger.test.ts +173 -0
  36. package/src/openai/loggers/console-payload-logger.ts +96 -0
  37. package/src/openai/loggers/console.ts +9 -0
  38. package/src/openai/loggers/file-payload-logger.test.ts +243 -0
  39. package/src/openai/loggers/file-payload-logger.ts +124 -0
  40. package/src/openai/loggers/file.ts +9 -0
  41. package/src/openai/loggers/index.ts +12 -0
  42. package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
  43. package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
  44. package/src/openai/message-converter.ts +23 -0
  45. package/src/openai/model-effort-table.ts +19 -0
  46. package/src/openai/model-effort-verification-config.test.ts +45 -0
  47. package/src/openai/model-effort-verification-config.ts +35 -0
  48. package/src/openai/openai-request-format.ts +116 -0
  49. package/src/openai/parsers/response-parser.test.ts +407 -0
  50. package/src/openai/parsers/response-parser.ts +48 -0
  51. package/src/openai/provider-definition.test.ts +74 -0
  52. package/src/openai/provider-definition.ts +139 -0
  53. package/src/openai/provider.test.ts +1686 -0
  54. package/src/openai/provider.ts +392 -0
  55. package/src/openai/reasoning-effort.test.ts +272 -0
  56. package/src/openai/reasoning-effort.ts +49 -0
  57. package/src/openai/request-id.ts +39 -0
  58. package/src/openai/request-options.ts +14 -0
  59. package/src/openai/responses-chat.ts +285 -0
  60. package/src/openai/responses-converter.ts +122 -0
  61. package/src/openai/responses-parser.ts +297 -0
  62. package/src/openai/responses-stream-utils.ts +45 -0
  63. package/src/openai/responses-types.ts +193 -0
  64. package/src/openai/streaming/stream-assembler.ts +3 -0
  65. package/src/openai/types/api-types.ts +113 -0
  66. package/src/openai/types.ts +235 -0
  67. package/CHANGELOG.md +0 -614
  68. package/README.md +0 -467
  69. package/dist/browser/index.d.ts +0 -307
  70. package/dist/browser/index.js +0 -2
@@ -0,0 +1,139 @@
1
+ import { probeOpenAICompatibleProfile } from '@robota-sdk/agent-provider-openai-compatible/shared';
2
+
3
+ import { OpenAIProvider } from './provider';
4
+
5
+ import type { IOpenAINativeWebToolsOptions, TOpenAIApiSurface } from './types';
6
+ import type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';
7
+
8
+ export const DEFAULT_OPENAI_PROVIDER_MODEL: string | undefined = undefined;
9
+ export const DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE = '$ENV:OPENAI_API_KEY';
10
+ const OPENAI_API_KEY_URL = 'https://platform.openai.com/api-keys';
11
+ const OPENAI_SETUP_SOURCE_URL =
12
+ 'https://developers.openai.com/api/reference/overview#authentication';
13
+ const OPENAI_SETUP_LAST_VERIFIED_AT = '2026-05-08';
14
+ const OPENAI_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [
15
+ {
16
+ kind: 'api-key',
17
+ label: 'OpenAI API keys',
18
+ url: OPENAI_API_KEY_URL,
19
+ sourceUrl: OPENAI_SETUP_SOURCE_URL,
20
+ lastVerifiedAt: OPENAI_SETUP_LAST_VERIFIED_AT,
21
+ },
22
+ ];
23
+
24
+ export function createOpenAIProviderDefinition(): IProviderDefinition {
25
+ return {
26
+ type: 'openai',
27
+ displayName: 'OpenAI',
28
+ description: 'GPT series — general-purpose assistant. API key required.',
29
+ category: 'cloud-paid',
30
+ // Interim provider-level cost (ARCH-PROVIDER-003), migrated from the former llm-text-openai node.
31
+ costPerTokenUsd: 0.001,
32
+ defaults: {
33
+ apiKey: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,
34
+ },
35
+ // OBSERVABILITY-1991: the SDK embeds this endpoint; declared here for the pre-session doctor only.
36
+ endpoint: { host: 'api.openai.com', port: 443 },
37
+ modelCatalog: {
38
+ status: 'unavailable',
39
+ sourceUrl: 'https://platform.openai.com/docs/api-reference/models/list',
40
+ message: 'OpenAI model availability should be discovered live from GET /v1/models.',
41
+ },
42
+ setupHelpLinks: OPENAI_SETUP_HELP_LINKS,
43
+ setupSteps: [
44
+ {
45
+ key: 'model',
46
+ title: 'OpenAI model',
47
+ required: true,
48
+ },
49
+ {
50
+ key: 'apiKey',
51
+ title: 'OpenAI API key',
52
+ defaultValue: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,
53
+ masked: true,
54
+ },
55
+ ],
56
+ requiresApiKey: true,
57
+ probeProfile: probeOpenAICompatibleProfile,
58
+ // The OpenAI SDK falls back to the base URL variable when none is configured, and sends the
59
+ // organization and project the others name.
60
+ destinationEnvironment: ['OPENAI_BASE_URL', 'OPENAI_ORG_ID', 'OPENAI_PROJECT_ID'],
61
+ createProvider: (config) => {
62
+ const apiSurface = readApiSurface(config.options);
63
+ const nativeWebTools = readNativeWebTools(config.options);
64
+ validateOpenAINativeWebTools(config.baseURL, apiSurface, nativeWebTools);
65
+ return new OpenAIProvider({
66
+ apiKey: requireApiKey(config.apiKey),
67
+ ...(config.baseURL !== undefined && { baseURL: config.baseURL }),
68
+ ...(config.timeout !== undefined && { timeout: config.timeout }),
69
+ ...(apiSurface !== undefined && { apiSurface }),
70
+ ...(nativeWebTools !== undefined && { nativeWebTools }),
71
+ defaultModel: config.model,
72
+ });
73
+ },
74
+ };
75
+ }
76
+
77
+ function requireApiKey(apiKey: string | undefined): string {
78
+ if (!apiKey) {
79
+ throw new Error('Provider openai requires apiKey');
80
+ }
81
+ return apiKey;
82
+ }
83
+
84
+ function readApiSurface(
85
+ options: Record<string, TUniversalValue> | undefined,
86
+ ): TOpenAIApiSurface | undefined {
87
+ const apiSurface = options?.['apiSurface'];
88
+ if (apiSurface === 'responses' || apiSurface === 'chat-completions') {
89
+ return apiSurface;
90
+ }
91
+ return undefined;
92
+ }
93
+
94
+ function readNativeWebTools(
95
+ options: Record<string, TUniversalValue> | undefined,
96
+ ): IOpenAINativeWebToolsOptions | undefined {
97
+ const nativeWebTools =
98
+ readNativeWebToolsRecord(options?.['nativeWebTools']) ??
99
+ readNativeWebToolsRecord(options?.['builtInWebTools']);
100
+ if (nativeWebTools === undefined) {
101
+ return undefined;
102
+ }
103
+ return nativeWebTools;
104
+ }
105
+
106
+ function readNativeWebToolsRecord(
107
+ value: TUniversalValue | undefined,
108
+ ): IOpenAINativeWebToolsOptions | undefined {
109
+ if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {
110
+ return undefined;
111
+ }
112
+ if (typeof value !== 'object') {
113
+ return undefined;
114
+ }
115
+ const webSearch = value['webSearch'];
116
+ const webFetch = value['webFetch'];
117
+ return {
118
+ ...(typeof webSearch === 'boolean' && { webSearch }),
119
+ ...(typeof webFetch === 'boolean' && { webFetch }),
120
+ };
121
+ }
122
+
123
+ function validateOpenAINativeWebTools(
124
+ baseURL: string | undefined,
125
+ apiSurface: TOpenAIApiSurface | undefined,
126
+ nativeWebTools: IOpenAINativeWebToolsOptions | undefined,
127
+ ): void {
128
+ if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {
129
+ return;
130
+ }
131
+ if (baseURL !== undefined || apiSurface === 'chat-completions') {
132
+ throw new Error(
133
+ 'Provider openai profile uses an OpenAI-compatible Chat Completions endpoint; native web search/fetch is not supported for this profile. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',
134
+ );
135
+ }
136
+ throw new Error(
137
+ 'Provider openai native web search/fetch is not wired in this Robota provider version. Use Robota local WebSearch/WebFetch tools or a provider with documented hosted web support.',
138
+ );
139
+ }