@robota-sdk/agent-provider 3.0.0-beta.64
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.
- package/LICENSE +21 -0
- package/dist/browser/index.d.ts +1104 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +7 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/loggers/index.cjs +1 -0
- package/dist/loggers/index.d.ts +151 -0
- package/dist/loggers/index.d.ts.map +1 -0
- package/dist/loggers/index.js +2 -0
- package/dist/loggers/index.js.map +1 -0
- package/dist/node/anthropic/index.cjs +1 -0
- package/dist/node/anthropic/index.d.ts +158 -0
- package/dist/node/anthropic/index.d.ts.map +1 -0
- package/dist/node/anthropic/index.js +1 -0
- package/dist/node/anthropic--1vgLC-e.js +5 -0
- package/dist/node/anthropic--1vgLC-e.js.map +1 -0
- package/dist/node/anthropic-BFQ6DSCP.cjs +4 -0
- package/dist/node/bytedance/index.cjs +1 -0
- package/dist/node/bytedance/index.d.ts +74 -0
- package/dist/node/bytedance/index.d.ts.map +1 -0
- package/dist/node/bytedance/index.js +1 -0
- package/dist/node/bytedance-C_0sF_pJ.js +2 -0
- package/dist/node/bytedance-C_0sF_pJ.js.map +1 -0
- package/dist/node/bytedance-DVPxqEiC.cjs +1 -0
- package/dist/node/chunk-Bmb41Sf3.cjs +1 -0
- package/dist/node/deepseek/index.cjs +1 -0
- package/dist/node/deepseek/index.d.ts +2 -0
- package/dist/node/deepseek/index.js +1 -0
- package/dist/node/deepseek-_8Ixx7rA.js +2 -0
- package/dist/node/deepseek-_8Ixx7rA.js.map +1 -0
- package/dist/node/deepseek-oA2Y6bD0.cjs +1 -0
- package/dist/node/gemini/index.cjs +1 -0
- package/dist/node/gemini/index.d.ts +173 -0
- package/dist/node/gemini/index.d.ts.map +1 -0
- package/dist/node/gemini/index.js +1 -0
- package/dist/node/gemini-Bh2U87MY.js +4 -0
- package/dist/node/gemini-Bh2U87MY.js.map +1 -0
- package/dist/node/gemini-DSaNCxZj.cjs +3 -0
- package/dist/node/gemma/index.cjs +1 -0
- package/dist/node/gemma/index.d.ts +2 -0
- package/dist/node/gemma/index.js +1 -0
- package/dist/node/gemma-Dp_AfCUR.js +2 -0
- package/dist/node/gemma-Dp_AfCUR.js.map +1 -0
- package/dist/node/gemma-G-Pf_PnX.cjs +1 -0
- package/dist/node/google/index.cjs +1 -0
- package/dist/node/google/index.d.ts +14 -0
- package/dist/node/google/index.d.ts.map +1 -0
- package/dist/node/google/index.js +2 -0
- package/dist/node/google/index.js.map +1 -0
- package/dist/node/index-B6PnlDMd.d.ts +82 -0
- package/dist/node/index-B6PnlDMd.d.ts.map +1 -0
- package/dist/node/index-B7UvPJcI.d.ts +315 -0
- package/dist/node/index-B7UvPJcI.d.ts.map +1 -0
- package/dist/node/index-BLPOTNb5.d.ts +98 -0
- package/dist/node/index-BLPOTNb5.d.ts.map +1 -0
- package/dist/node/index-BqixM_XD.d.ts +231 -0
- package/dist/node/index-BqixM_XD.d.ts.map +1 -0
- package/dist/node/index-C3beaqKO.d.ts +231 -0
- package/dist/node/index-C3beaqKO.d.ts.map +1 -0
- package/dist/node/index-Cp2XRh9G.d.ts +82 -0
- package/dist/node/index-Cp2XRh9G.d.ts.map +1 -0
- package/dist/node/index-DSv5xruI.d.ts +98 -0
- package/dist/node/index-DSv5xruI.d.ts.map +1 -0
- package/dist/node/index-w0bV1uaP.d.ts +315 -0
- package/dist/node/index-w0bV1uaP.d.ts.map +1 -0
- package/dist/node/index.cjs +1 -0
- package/dist/node/index.d.ts +8 -0
- package/dist/node/index.js +1 -0
- package/dist/node/openai/index.cjs +1 -0
- package/dist/node/openai/index.d.ts +2 -0
- package/dist/node/openai/index.js +1 -0
- package/dist/node/openai-CRQjg4xF.js +2 -0
- package/dist/node/openai-CRQjg4xF.js.map +1 -0
- package/dist/node/openai-compatible-BYfyY5lb.cjs +1 -0
- package/dist/node/openai-compatible-Dm4Sof9e.js +2 -0
- package/dist/node/openai-compatible-Dm4Sof9e.js.map +1 -0
- package/dist/node/openai-xWC6pY7r.cjs +1 -0
- package/dist/node/qwen/index.cjs +1 -0
- package/dist/node/qwen/index.d.ts +2 -0
- package/dist/node/qwen/index.js +1 -0
- package/dist/node/qwen-ChUZobTL.js +2 -0
- package/dist/node/qwen-ChUZobTL.js.map +1 -0
- package/dist/node/qwen-CjT71vSM.cjs +1 -0
- package/package.json +157 -0
- package/src/anthropic/__tests__/abort-streaming.test.ts +199 -0
- package/src/anthropic/__tests__/model-catalog-refresh.test.ts +92 -0
- package/src/anthropic/__tests__/provider-definition.test.ts +55 -0
- package/src/anthropic/__tests__/provider.test.ts +1357 -0
- package/src/anthropic/__tests__/response-parser.test.ts +326 -0
- package/src/anthropic/index.ts +22 -0
- package/src/anthropic/message-converter.ts +181 -0
- package/src/anthropic/model-catalog-refresh.ts +128 -0
- package/src/anthropic/parsers/response-parser.ts +184 -0
- package/src/anthropic/provider-definition.ts +93 -0
- package/src/anthropic/provider.ts +290 -0
- package/src/anthropic/streaming-handler.ts +204 -0
- package/src/anthropic/types/api-types.ts +158 -0
- package/src/anthropic/types.ts +79 -0
- package/src/bytedance/http-client.test.ts +288 -0
- package/src/bytedance/http-client.ts +163 -0
- package/src/bytedance/index.ts +2 -0
- package/src/bytedance/provider.spec.ts +320 -0
- package/src/bytedance/provider.ts +171 -0
- package/src/bytedance/status-mapper.test.ts +299 -0
- package/src/bytedance/status-mapper.ts +141 -0
- package/src/bytedance/types.ts +68 -0
- package/src/deepseek/defaults.ts +4 -0
- package/src/deepseek/index.ts +22 -0
- package/src/deepseek/model-catalog-refresh.test.ts +57 -0
- package/src/deepseek/model-catalog-refresh.ts +105 -0
- package/src/deepseek/model-catalog.ts +55 -0
- package/src/deepseek/provider-definition.test.ts +109 -0
- package/src/deepseek/provider-definition.ts +132 -0
- package/src/deepseek/provider.test.ts +324 -0
- package/src/deepseek/provider.ts +298 -0
- package/src/deepseek/types.ts +37 -0
- package/src/gemini/execution-helpers.ts +233 -0
- package/src/gemini/genai-transport.test.ts +208 -0
- package/src/gemini/image-operations.test.ts +448 -0
- package/src/gemini/image-operations.ts +261 -0
- package/src/gemini/index.ts +11 -0
- package/src/gemini/message-converter.test.ts +616 -0
- package/src/gemini/message-converter.ts +140 -0
- package/src/gemini/model-catalog-refresh.test.ts +107 -0
- package/src/gemini/model-catalog-refresh.ts +92 -0
- package/src/gemini/provider-definition.test.ts +70 -0
- package/src/gemini/provider-definition.ts +78 -0
- package/src/gemini/provider-extended.test.ts +898 -0
- package/src/gemini/provider.spec.ts +216 -0
- package/src/gemini/provider.ts +279 -0
- package/src/gemini/request-converter.ts +226 -0
- package/src/gemini/tool-schema-converter.ts +78 -0
- package/src/gemini/types/api-types.ts +235 -0
- package/src/gemini/types.ts +121 -0
- package/src/gemma/index.ts +5 -0
- package/src/gemma/message-factory.ts +38 -0
- package/src/gemma/provider-definition.test.ts +43 -0
- package/src/gemma/provider-definition.ts +84 -0
- package/src/gemma/provider-projection.ts +49 -0
- package/src/gemma/provider.test.ts +628 -0
- package/src/gemma/provider.ts +308 -0
- package/src/gemma/pseudo-command-envelope.ts +58 -0
- package/src/gemma/pseudo-tool-call-projector.ts +243 -0
- package/src/gemma/pseudo-tool-call-tag-parser.ts +153 -0
- package/src/gemma/pseudo-tool-call-types.ts +31 -0
- package/src/gemma/reasoning-projector.test.ts +52 -0
- package/src/gemma/reasoning-projector.ts +144 -0
- package/src/gemma/streaming-projection.ts +79 -0
- package/src/gemma/tool-call-argument-parser.ts +126 -0
- package/src/gemma/tool-call-projector.test.ts +227 -0
- package/src/gemma/tool-call-projector.ts +264 -0
- package/src/gemma/types.ts +27 -0
- package/src/google/index.ts +11 -0
- package/src/google/provider-compat.test.ts +19 -0
- package/src/google/provider-definition.ts +6 -0
- package/src/google/provider.ts +10 -0
- package/src/google/types.ts +5 -0
- package/src/index.ts +9 -0
- package/src/openai/adapter.test.ts +494 -0
- package/src/openai/adapter.ts +145 -0
- package/src/openai/chat-completions-chat.ts +189 -0
- package/src/openai/executor-integration.test.ts +206 -0
- package/src/openai/index.ts +21 -0
- package/src/openai/interfaces/payload-logger.ts +48 -0
- package/src/openai/loggers/console-payload-logger.test.ts +173 -0
- package/src/openai/loggers/console-payload-logger.ts +94 -0
- package/src/openai/loggers/console.ts +9 -0
- package/src/openai/loggers/file-payload-logger.test.ts +238 -0
- package/src/openai/loggers/file-payload-logger.ts +112 -0
- package/src/openai/loggers/file.ts +9 -0
- package/src/openai/loggers/index.ts +12 -0
- package/src/openai/loggers/sanitize-openai-log-data.test.ts +89 -0
- package/src/openai/loggers/sanitize-openai-log-data.ts +14 -0
- package/src/openai/message-converter.ts +22 -0
- package/src/openai/model-catalog-refresh.test.ts +92 -0
- package/src/openai/model-catalog-refresh.ts +115 -0
- package/src/openai/openai-request-format.ts +92 -0
- package/src/openai/parsers/response-parser.test.ts +407 -0
- package/src/openai/parsers/response-parser.ts +47 -0
- package/src/openai/provider-definition.test.ts +75 -0
- package/src/openai/provider-definition.ts +132 -0
- package/src/openai/provider.test.ts +1402 -0
- package/src/openai/provider.ts +237 -0
- package/src/openai/responses-chat.ts +258 -0
- package/src/openai/responses-converter.ts +112 -0
- package/src/openai/responses-parser.ts +285 -0
- package/src/openai/responses-stream-utils.ts +45 -0
- package/src/openai/responses-types.ts +195 -0
- package/src/openai/streaming/stream-assembler.ts +3 -0
- package/src/openai/streaming/stream-handler.test.ts +367 -0
- package/src/openai/streaming/stream-handler.ts +119 -0
- package/src/openai/types/api-types.ts +112 -0
- package/src/openai/types.ts +194 -0
- package/src/qwen/defaults.ts +26 -0
- package/src/qwen/index.ts +5 -0
- package/src/qwen/model-catalog-refresh.test.ts +91 -0
- package/src/qwen/model-catalog-refresh.ts +97 -0
- package/src/qwen/provider-capabilities.ts +34 -0
- package/src/qwen/provider-definition.test.ts +139 -0
- package/src/qwen/provider-definition.ts +173 -0
- package/src/qwen/provider-streaming-assembly.ts +40 -0
- package/src/qwen/provider.test.ts +640 -0
- package/src/qwen/provider.ts +293 -0
- package/src/qwen/responses-chat.ts +194 -0
- package/src/qwen/responses-converter.ts +104 -0
- package/src/qwen/responses-parser.ts +299 -0
- package/src/qwen/responses-stream-utils.ts +38 -0
- package/src/qwen/types.ts +228 -0
- package/src/shared/openai-compatible/endpoint-probe.test.ts +52 -0
- package/src/shared/openai-compatible/endpoint-probe.ts +43 -0
- package/src/shared/openai-compatible/index.ts +6 -0
- package/src/shared/openai-compatible/message-converter.test.ts +111 -0
- package/src/shared/openai-compatible/message-converter.ts +84 -0
- package/src/shared/openai-compatible/native-payload-observer.test.ts +43 -0
- package/src/shared/openai-compatible/native-payload-observer.ts +26 -0
- package/src/shared/openai-compatible/response-parser.test.ts +172 -0
- package/src/shared/openai-compatible/response-parser.ts +180 -0
- package/src/shared/openai-compatible/stream-assembler.test.ts +266 -0
- package/src/shared/openai-compatible/stream-assembler.ts +248 -0
- package/src/shared/openai-compatible/types.ts +59 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { AbstractAIProvider, IChatOptions, IExecutor, ILogger, IProviderCapabilities, IProviderDefinition, IProviderModelCatalog, IProviderProfileConfig, TProviderOptionValueBase, TTextDeltaCallback, TUniversalMessage } from "@robota-sdk/agent-core";
|
|
2
|
+
import OpenAI from "openai";
|
|
3
|
+
|
|
4
|
+
//#region src/openai/types/api-types.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Payload logging data structure
|
|
7
|
+
*/
|
|
8
|
+
interface IOpenAILogData {
|
|
9
|
+
model: string;
|
|
10
|
+
messagesCount: number;
|
|
11
|
+
hasTools: boolean;
|
|
12
|
+
temperature?: number | undefined;
|
|
13
|
+
maxTokens?: number | undefined;
|
|
14
|
+
timestamp: string;
|
|
15
|
+
requestId?: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/openai/interfaces/payload-logger.d.ts
|
|
19
|
+
/**
|
|
20
|
+
* IPayloadLogger interface for logging OpenAI API payloads
|
|
21
|
+
*
|
|
22
|
+
* This interface provides a contract for different logging implementations:
|
|
23
|
+
* - FilePayloadLogger: Node.js file-based logging
|
|
24
|
+
* - ConsolePayloadLogger: Browser console-based logging
|
|
25
|
+
* - Custom implementations: User-defined loggers
|
|
26
|
+
*/
|
|
27
|
+
interface IPayloadLogger {
|
|
28
|
+
/**
|
|
29
|
+
* Check if logging is enabled
|
|
30
|
+
* @returns true if logging is active, false otherwise
|
|
31
|
+
*/
|
|
32
|
+
isEnabled(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Log API payload data
|
|
35
|
+
* @param payload - The API request/response payload data
|
|
36
|
+
* @param type - Type of operation ('chat' or 'stream')
|
|
37
|
+
*/
|
|
38
|
+
logPayload(payload: IOpenAILogData, type: 'chat' | 'stream'): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Configuration options for payload loggers
|
|
42
|
+
*/
|
|
43
|
+
interface IPayloadLoggerOptions {
|
|
44
|
+
/**
|
|
45
|
+
* Whether logging is enabled
|
|
46
|
+
* @defaultValue true
|
|
47
|
+
*/
|
|
48
|
+
enabled?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Include timestamp in log entries
|
|
51
|
+
* @defaultValue true
|
|
52
|
+
*/
|
|
53
|
+
includeTimestamp?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Logger instance for console output
|
|
56
|
+
* @defaultValue SilentLogger
|
|
57
|
+
*/
|
|
58
|
+
logger?: ILogger;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/openai/types.d.ts
|
|
62
|
+
type TOpenAIApiSurface = 'responses' | 'chat-completions';
|
|
63
|
+
interface IOpenAIJsonSchemaDefinition {
|
|
64
|
+
name: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
schema?: Record<string, TOpenAIProviderOptionValue>;
|
|
67
|
+
strict?: boolean;
|
|
68
|
+
}
|
|
69
|
+
interface IOpenAIResponsesReasoningOptions {
|
|
70
|
+
effort?: 'low' | 'medium' | 'high';
|
|
71
|
+
summary?: 'auto' | 'concise' | 'detailed';
|
|
72
|
+
}
|
|
73
|
+
interface IOpenAINativeWebToolsOptions {
|
|
74
|
+
webSearch?: boolean;
|
|
75
|
+
webFetch?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Valid provider option value types
|
|
79
|
+
*/
|
|
80
|
+
type TOpenAIProviderOptionValue = string | number | boolean | undefined | null | IOpenAIJsonSchemaDefinition | IOpenAINativeWebToolsOptions | IOpenAIResponsesReasoningOptions | OpenAI | IPayloadLogger | ILogger | IExecutor | TProviderOptionValueBase | TOpenAIProviderOptionValue[] | {
|
|
81
|
+
[key: string]: TOpenAIProviderOptionValue;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* OpenAI provider options
|
|
85
|
+
*/
|
|
86
|
+
interface IOpenAIProviderOptions {
|
|
87
|
+
/**
|
|
88
|
+
* Additional provider-specific options
|
|
89
|
+
*/
|
|
90
|
+
[key: string]: TOpenAIProviderOptionValue;
|
|
91
|
+
/**
|
|
92
|
+
* OpenAI API key (required when client is not provided)
|
|
93
|
+
*/
|
|
94
|
+
apiKey?: string;
|
|
95
|
+
/**
|
|
96
|
+
* OpenAI organization ID (optional)
|
|
97
|
+
*/
|
|
98
|
+
organization?: string;
|
|
99
|
+
/**
|
|
100
|
+
* API request timeout (milliseconds)
|
|
101
|
+
*/
|
|
102
|
+
timeout?: number;
|
|
103
|
+
/**
|
|
104
|
+
* API base URL (default: 'https://api.openai.com/v1')
|
|
105
|
+
*/
|
|
106
|
+
baseURL?: string;
|
|
107
|
+
/**
|
|
108
|
+
* Default model used when chat options do not provide a model.
|
|
109
|
+
*/
|
|
110
|
+
defaultModel?: string;
|
|
111
|
+
/**
|
|
112
|
+
* API surface to use for direct OpenAI calls.
|
|
113
|
+
*
|
|
114
|
+
* Defaults to Responses for official OpenAI calls. Profiles with baseURL use
|
|
115
|
+
* Chat Completions by default for OpenAI-compatible endpoint compatibility.
|
|
116
|
+
*/
|
|
117
|
+
apiSurface?: TOpenAIApiSurface;
|
|
118
|
+
/**
|
|
119
|
+
* Response format (default: 'text')
|
|
120
|
+
* - 'text': Plain text response
|
|
121
|
+
* - 'json_object': JSON object mode (requires system message)
|
|
122
|
+
* - 'json_schema': Structured Outputs with schema validation
|
|
123
|
+
*/
|
|
124
|
+
responseFormat?: 'text' | 'json_object' | 'json_schema';
|
|
125
|
+
/**
|
|
126
|
+
* JSON schema for structured outputs (required when responseFormat is 'json_schema')
|
|
127
|
+
*/
|
|
128
|
+
jsonSchema?: IOpenAIJsonSchemaDefinition;
|
|
129
|
+
/**
|
|
130
|
+
* Responses API reasoning controls. Hidden reasoning is never exposed in message
|
|
131
|
+
* content; only explicit summaries/encrypted items requested here are represented.
|
|
132
|
+
*/
|
|
133
|
+
reasoning?: IOpenAIResponsesReasoningOptions;
|
|
134
|
+
/**
|
|
135
|
+
* Whether OpenAI should store Responses API results. Defaults to OpenAI API behavior.
|
|
136
|
+
*/
|
|
137
|
+
store?: boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Include encrypted reasoning items for stateless reasoning continuation.
|
|
140
|
+
*/
|
|
141
|
+
includeEncryptedReasoning?: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* Opt into strict custom function parameter validation where supported.
|
|
144
|
+
*/
|
|
145
|
+
strictTools?: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Provider-native hosted web tool request from provider profile options.
|
|
148
|
+
*
|
|
149
|
+
* OpenAI-compatible Chat Completions endpoints do not support this Robota
|
|
150
|
+
* native web contract. The provider rejects unsupported configurations before
|
|
151
|
+
* any model request is sent.
|
|
152
|
+
*/
|
|
153
|
+
nativeWebTools?: IOpenAINativeWebToolsOptions;
|
|
154
|
+
/**
|
|
155
|
+
* OpenAI client instance (optional: will be created from apiKey if not provided)
|
|
156
|
+
*/
|
|
157
|
+
client?: OpenAI;
|
|
158
|
+
/**
|
|
159
|
+
* Payload logger instance for debugging API requests/responses
|
|
160
|
+
*
|
|
161
|
+
* Use different implementations based on your environment:
|
|
162
|
+
* - FilePayloadLogger: Node.js file-based logging
|
|
163
|
+
* - ConsolePayloadLogger: Browser console-based logging
|
|
164
|
+
* - Custom: Implement IPayloadLogger interface
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```typescript
|
|
168
|
+
* // Node.js
|
|
169
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';
|
|
170
|
+
* const provider = new OpenAIProvider({
|
|
171
|
+
* client: openaiClient,
|
|
172
|
+
* payloadLogger: new FilePayloadLogger({ logDir: './logs/openai' })
|
|
173
|
+
* });
|
|
174
|
+
*
|
|
175
|
+
* // Browser
|
|
176
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider/openai/loggers';
|
|
177
|
+
* const provider = new OpenAIProvider({
|
|
178
|
+
* client: openaiClient,
|
|
179
|
+
* payloadLogger: new ConsolePayloadLogger()
|
|
180
|
+
* });
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
payloadLogger?: IPayloadLogger;
|
|
184
|
+
/**
|
|
185
|
+
* Optional executor for handling AI requests
|
|
186
|
+
*
|
|
187
|
+
* When provided, the provider will delegate all chat operations to this executor
|
|
188
|
+
* instead of making direct API calls. This enables remote execution capabilities.
|
|
189
|
+
*
|
|
190
|
+
* @example
|
|
191
|
+
* ```typescript
|
|
192
|
+
* import { LocalExecutor, RemoteExecutor } from '@robota-sdk/agent-core';
|
|
193
|
+
*
|
|
194
|
+
* // Local execution (registers this provider)
|
|
195
|
+
* const localExecutor = new LocalExecutor();
|
|
196
|
+
* localExecutor.registerProvider('openai', new OpenAIProvider({ apiKey: 'sk-...' }));
|
|
197
|
+
*
|
|
198
|
+
* // Remote execution
|
|
199
|
+
* const remoteExecutor = new RemoteExecutor({
|
|
200
|
+
* serverUrl: 'https://api.robota.io',
|
|
201
|
+
* userApiKey: 'user-token-123'
|
|
202
|
+
* });
|
|
203
|
+
*
|
|
204
|
+
* const provider = new OpenAIProvider({
|
|
205
|
+
* executor: remoteExecutor // No direct API key needed
|
|
206
|
+
* });
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
executor?: IExecutor;
|
|
210
|
+
/**
|
|
211
|
+
* Logger instance for internal OpenAI provider logging
|
|
212
|
+
* @defaultValue SilentLogger
|
|
213
|
+
*/
|
|
214
|
+
logger?: ILogger;
|
|
215
|
+
}
|
|
216
|
+
//#endregion
|
|
217
|
+
//#region src/openai/provider.d.ts
|
|
218
|
+
/**
|
|
219
|
+
* OpenAI provider implementation for Robota
|
|
220
|
+
*
|
|
221
|
+
* Provides integration with OpenAI models through the Robota provider contract.
|
|
222
|
+
* Uses OpenAI SDK native types internally for optimal performance and feature support.
|
|
223
|
+
*
|
|
224
|
+
* @public
|
|
225
|
+
*/
|
|
226
|
+
declare class OpenAIProvider extends AbstractAIProvider {
|
|
227
|
+
readonly name = "openai";
|
|
228
|
+
readonly version = "1.0.0";
|
|
229
|
+
private readonly client?;
|
|
230
|
+
private readonly options;
|
|
231
|
+
private readonly apiSurface;
|
|
232
|
+
private readonly payloadLogger;
|
|
233
|
+
private readonly responseParser;
|
|
234
|
+
/**
|
|
235
|
+
* Optional callback for text deltas during streaming.
|
|
236
|
+
* Set by the consumer (e.g., Session) to receive real-time text chunks.
|
|
237
|
+
* When set, chat() uses streaming internally while still returning
|
|
238
|
+
* the complete assembled message.
|
|
239
|
+
*/
|
|
240
|
+
onTextDelta?: TTextDeltaCallback;
|
|
241
|
+
constructor(options: IOpenAIProviderOptions);
|
|
242
|
+
chat(messages: TUniversalMessage[], options?: IChatOptions): Promise<TUniversalMessage>;
|
|
243
|
+
chatStream(messages: TUniversalMessage[], options?: IChatOptions): AsyncIterable<TUniversalMessage>;
|
|
244
|
+
supportsTools(): boolean;
|
|
245
|
+
getCapabilities(): IProviderCapabilities;
|
|
246
|
+
validateConfig(): boolean;
|
|
247
|
+
dispose(): Promise<void>;
|
|
248
|
+
protected validateMessages(messages: TUniversalMessage[]): void;
|
|
249
|
+
}
|
|
250
|
+
//#endregion
|
|
251
|
+
//#region src/openai/adapter.d.ts
|
|
252
|
+
/**
|
|
253
|
+
* OpenAI Conversation Adapter
|
|
254
|
+
*
|
|
255
|
+
* Converts between TUniversalMessage format and OpenAI native types.
|
|
256
|
+
* Provides bidirectional conversion for seamless integration.
|
|
257
|
+
*
|
|
258
|
+
* @public
|
|
259
|
+
*/
|
|
260
|
+
declare class OpenAIConversationAdapter {
|
|
261
|
+
/**
|
|
262
|
+
* Filter messages for OpenAI compatibility
|
|
263
|
+
*
|
|
264
|
+
* OpenAI has specific requirements:
|
|
265
|
+
* - Tool messages must have valid toolCallId
|
|
266
|
+
* - Messages must be in proper sequence
|
|
267
|
+
* - Tool messages without toolCallId should be excluded
|
|
268
|
+
*/
|
|
269
|
+
static filterMessagesForOpenAI(messages: TUniversalMessage[]): TUniversalMessage[];
|
|
270
|
+
/**
|
|
271
|
+
* Convert TUniversalMessage array to OpenAI message format
|
|
272
|
+
* Now properly handles tool messages for OpenAI's tool calling feature
|
|
273
|
+
*/
|
|
274
|
+
static toOpenAIFormat(messages: TUniversalMessage[]): OpenAI.Chat.ChatCompletionMessageParam[];
|
|
275
|
+
/**
|
|
276
|
+
* Convert a single TUniversalMessage to OpenAI format
|
|
277
|
+
* Handles all message types including tool messages
|
|
278
|
+
*/
|
|
279
|
+
static convertMessage(msg: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam;
|
|
280
|
+
/**
|
|
281
|
+
* Add system prompt to message array if needed
|
|
282
|
+
*/
|
|
283
|
+
static addSystemPromptIfNeeded(messages: OpenAI.Chat.ChatCompletionMessageParam[], systemPrompt?: string): OpenAI.Chat.ChatCompletionMessageParam[];
|
|
284
|
+
}
|
|
285
|
+
//#endregion
|
|
286
|
+
//#region src/openai/model-catalog-refresh.d.ts
|
|
287
|
+
interface IOpenAIModelCatalogResponse {
|
|
288
|
+
data?: readonly IOpenAIModelCatalogResource[];
|
|
289
|
+
}
|
|
290
|
+
interface IOpenAIModelCatalogResource {
|
|
291
|
+
id?: string;
|
|
292
|
+
}
|
|
293
|
+
interface IOpenAIModelCatalogFetchInit {
|
|
294
|
+
headers: Record<string, string>;
|
|
295
|
+
}
|
|
296
|
+
interface IOpenAIModelCatalogFetchResponse {
|
|
297
|
+
ok: boolean;
|
|
298
|
+
status: number;
|
|
299
|
+
statusText?: string;
|
|
300
|
+
json: () => Promise<IOpenAIModelCatalogResponse>;
|
|
301
|
+
}
|
|
302
|
+
type TOpenAIModelCatalogFetch = (url: string, init: IOpenAIModelCatalogFetchInit) => Promise<IOpenAIModelCatalogFetchResponse>;
|
|
303
|
+
interface IRefreshOpenAIModelCatalogOptions {
|
|
304
|
+
fetcher?: TOpenAIModelCatalogFetch;
|
|
305
|
+
now?: () => Date;
|
|
306
|
+
}
|
|
307
|
+
declare function refreshOpenAIModelCatalog(profile: IProviderProfileConfig, options?: IRefreshOpenAIModelCatalogOptions): Promise<IProviderModelCatalog>;
|
|
308
|
+
//#endregion
|
|
309
|
+
//#region src/openai/provider-definition.d.ts
|
|
310
|
+
declare const DEFAULT_OPENAI_PROVIDER_MODEL: string | undefined;
|
|
311
|
+
declare const DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE = "$ENV:OPENAI_API_KEY";
|
|
312
|
+
declare function createOpenAIProviderDefinition(): IProviderDefinition;
|
|
313
|
+
//#endregion
|
|
314
|
+
export { TOpenAIApiSurface as _, IOpenAIModelCatalogFetchResponse as a, IPayloadLoggerOptions as b, IRefreshOpenAIModelCatalogOptions as c, OpenAIConversationAdapter as d, OpenAIProvider as f, IOpenAIResponsesReasoningOptions as g, IOpenAIProviderOptions as h, IOpenAIModelCatalogFetchInit as i, TOpenAIModelCatalogFetch as l, IOpenAINativeWebToolsOptions as m, DEFAULT_OPENAI_PROVIDER_MODEL as n, IOpenAIModelCatalogResource as o, IOpenAIJsonSchemaDefinition as p, createOpenAIProviderDefinition as r, IOpenAIModelCatalogResponse as s, DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE as t, refreshOpenAIModelCatalog as u, TOpenAIProviderOptionValue as v, IPayloadLogger as y };
|
|
315
|
+
//# sourceMappingURL=index-w0bV1uaP.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-w0bV1uaP.d.ts","names":[],"sources":["../../src/openai/types/api-types.ts","../../src/openai/interfaces/payload-logger.ts","../../src/openai/types.ts","../../src/openai/provider.ts","../../src/openai/adapter.ts","../../src/openai/model-catalog-refresh.ts","../../src/openai/provider-definition.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./anthropic-BFQ6DSCP.cjs`),t=require(`./openai-xWC6pY7r.cjs`),n=require(`./deepseek-oA2Y6bD0.cjs`),r=require(`./gemini-DSaNCxZj.cjs`),i=require(`./gemma-G-Pf_PnX.cjs`),a=require(`./bytedance-DVPxqEiC.cjs`),o=require(`./qwen-CjT71vSM.cjs`);exports.ANTHROPIC_MODEL_LAST_VERIFIED_AT=e.n,exports.ANTHROPIC_MODEL_SOURCE_URL=e.r,exports.AnthropicProvider=e.l,exports.BytedanceProvider=a.t,exports.DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE=n.r,exports.DEEPSEEK_MODEL_CATALOG_SOURCE_URL=n.i,exports.DEEPSEEK_MODEL_LAST_VERIFIED_AT=n.a,exports.DEEPSEEK_MODEL_LIST_SOURCE_URL=n.o,exports.DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV=e.i,exports.DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE=e.a,exports.DEFAULT_ANTHROPIC_PROVIDER_MODEL=e.o,exports.DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV=n.c,exports.DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE=n.l,exports.DEFAULT_DEEPSEEK_PROVIDER_BASE_URL=n.u,exports.DEFAULT_DEEPSEEK_PROVIDER_MODEL=n.d,exports.DEFAULT_GEMINI_PROVIDER_API_KEY_ENV=r.n,exports.DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE=r.r,exports.DEFAULT_GEMINI_PROVIDER_MODEL=r.i,exports.DEFAULT_GEMMA_PROVIDER_API_KEY=i.t,exports.DEFAULT_GEMMA_PROVIDER_BASE_URL=i.n,exports.DEFAULT_GEMMA_PROVIDER_MODEL=i.r,exports.DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE=t.t,exports.DEFAULT_OPENAI_PROVIDER_MODEL=t.n,exports.DEFAULT_QWEN_PROVIDER_API_KEY_ENV=o.i,exports.DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE=o.a,exports.DEFAULT_QWEN_PROVIDER_BASE_URL=o.o,exports.DEFAULT_QWEN_PROVIDER_MODEL=o.s,exports.DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL=o.c,exports.DeepSeekProvider=n.s,exports.GEMINI_MODEL_LAST_VERIFIED_AT=r.a,exports.GEMINI_MODEL_SOURCE_URL=r.o,exports.GeminiProvider=r.c,exports.GemmaProvider=i.a,exports.GemmaReasoningProjector=i.l,exports.GemmaToolCallProjector=i.o,exports.OpenAIConversationAdapter=t.a,exports.OpenAIProvider=t.o,exports.QWEN_MODEL_LAST_VERIFIED_AT=o.l,exports.QWEN_MODEL_SOURCE_URL=o.u,exports.QWEN_PROVIDER_BASE_URLS=o.d,exports.QWEN_PROVIDER_RESPONSES_BASE_URLS=o.f,exports.QwenProvider=o.r,exports.createAnthropicProvider=e.t,exports.createAnthropicProviderDefinition=e.s,exports.createDeepSeekProviderDefinition=n.t,exports.createGeminiProviderDefinition=r.s,exports.createGemmaProviderDefinition=i.i,exports.createGemmaToolCallProjector=i.s,exports.createOpenAIProviderDefinition=t.r,exports.createQwenProviderDefinition=o.t,exports.projectGemmaReasoningText=i.u,exports.projectGemmaToolCallText=i.c,exports.refreshAnthropicModelCatalog=e.c,exports.refreshDeepSeekModelCatalog=n.n,exports.refreshGeminiModelCatalog=r.t,exports.refreshOpenAIModelCatalog=t.i,exports.refreshQwenModelCatalog=o.n;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ANTHROPIC_MODEL_LAST_VERIFIED_AT, ANTHROPIC_MODEL_SOURCE_URL, AnthropicProvider, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE, DEFAULT_ANTHROPIC_PROVIDER_MODEL, IAnthropicFetchInit, IAnthropicFetchResponse, IAnthropicModelsResponse, IAnthropicProviderOptions, TAnthropicFetch, TAnthropicProviderOptionValue, createAnthropicProvider, createAnthropicProviderDefinition, refreshAnthropicModelCatalog } from "./anthropic/index.js";
|
|
2
|
+
import { BytedanceProvider, IBytedanceApiErrorResponse, IBytedanceCreateVideoTaskRequest, IBytedanceCreateVideoTaskResponse, IBytedanceProviderOptions, IBytedanceTaskContentImageUrl, IBytedanceTaskContentText, IBytedanceTaskContentVideoUrl, IBytedanceVideoTaskResponse, TBytedanceTaskContent } from "./bytedance/index.js";
|
|
3
|
+
import { a as refreshDeepSeekModelCatalog, c as DEFAULT_DEEPSEEK_PROVIDER_BASE_URL, d as DeepSeekProvider, f as IDeepSeekProviderOptions, g as TDeepSeekThinkingMode, h as TDeepSeekReasoningEffort, i as DEEPSEEK_MODEL_LIST_SOURCE_URL, l as DEFAULT_DEEPSEEK_PROVIDER_MODEL, m as TDeepSeekProviderOptionValue, n as DEEPSEEK_MODEL_CATALOG_SOURCE_URL, o as DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV, p as IDeepSeekThinkingConfig, r as DEEPSEEK_MODEL_LAST_VERIFIED_AT, s as DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE, t as DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE, u as createDeepSeekProviderDefinition } from "./index-Cp2XRh9G.js";
|
|
4
|
+
import { DEFAULT_GEMINI_PROVIDER_API_KEY_ENV, DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE, DEFAULT_GEMINI_PROVIDER_MODEL, GEMINI_MODEL_LAST_VERIFIED_AT, GEMINI_MODEL_SOURCE_URL, GeminiProvider, IGeminiFetchInit, IGeminiFetchResponse, IGeminiModelInfo, IGeminiModelsResponse, IGeminiProviderOptions, IGeminiSafetySetting, IGeminiThinkingConfig, TGeminiFetch, TGeminiProviderOptionValue, createGeminiProviderDefinition, refreshGeminiModelCatalog } from "./gemini/index.js";
|
|
5
|
+
import { a as GemmaProvider, c as IGemmaToolCallProjectorOptions, d as GemmaReasoningProjector, f as IGemmaReasoningProjection, h as TGemmaProviderOptionValue, i as createGemmaProviderDefinition, l as createGemmaToolCallProjector, m as IGemmaProviderOptions, n as DEFAULT_GEMMA_PROVIDER_BASE_URL, o as GemmaToolCallProjector, p as projectGemmaReasoningText, r as DEFAULT_GEMMA_PROVIDER_MODEL, s as IGemmaToolCallProjection, t as DEFAULT_GEMMA_PROVIDER_API_KEY, u as projectGemmaToolCallText } from "./index-BLPOTNb5.js";
|
|
6
|
+
import { _ as TOpenAIApiSurface, a as IOpenAIModelCatalogFetchResponse, b as IPayloadLoggerOptions, c as IRefreshOpenAIModelCatalogOptions, d as OpenAIConversationAdapter, f as OpenAIProvider, g as IOpenAIResponsesReasoningOptions, h as IOpenAIProviderOptions, i as IOpenAIModelCatalogFetchInit, l as TOpenAIModelCatalogFetch, m as IOpenAINativeWebToolsOptions, n as DEFAULT_OPENAI_PROVIDER_MODEL, o as IOpenAIModelCatalogResource, p as IOpenAIJsonSchemaDefinition, r as createOpenAIProviderDefinition, s as IOpenAIModelCatalogResponse, t as DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE, u as refreshOpenAIModelCatalog, v as TOpenAIProviderOptionValue, y as IPayloadLogger } from "./index-w0bV1uaP.js";
|
|
7
|
+
import { A as IQwenResponsesWebExtractorTool, B as TQwenResponsesStreamEvent, C as IQwenResponsesRequestStreaming, D as IQwenResponsesToolUsageCount, E as IQwenResponsesTextDeltaEvent, F as TQwenBuiltInWebToolName, G as DEFAULT_QWEN_PROVIDER_MODEL, H as DEFAULT_QWEN_PROVIDER_API_KEY_ENV, I as TQwenMessagesToResponsesInput, J as QWEN_MODEL_SOURCE_URL, K as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, L as TQwenProviderOptionValue, M as IQwenResponsesWebSearchEvent, N as IQwenResponsesWebSearchOutputItem, O as IQwenResponsesUsage, P as IQwenResponsesWebSearchTool, Q as TQwenProviderResponsesRegion, R as TQwenResponsesInputItem, S as IQwenResponsesRequestNonStreaming, T as IQwenResponsesTextContent, U as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, V as TQwenResponsesTool, W as DEFAULT_QWEN_PROVIDER_BASE_URL, X as QWEN_PROVIDER_RESPONSES_BASE_URLS, Y as QWEN_PROVIDER_BASE_URLS, Z as TQwenProviderRegion, _ as IQwenResponsesGenericOutputItem, a as refreshQwenModelCatalog, b as IQwenResponsesOutputItemDoneEvent, c as IQwenBuiltInWebToolsOptions, d as IQwenResponsesErrorEvent, f as IQwenResponsesFunctionCallInput, g as IQwenResponsesGenericEvent, h as IQwenResponsesFunctionTool, i as TQwenFetch, j as IQwenResponsesWebSearchAction, k as IQwenResponsesWebExtractorOutputItem, l as IQwenProviderOptions, m as IQwenResponsesFunctionCallOutputItem, n as IQwenFetchResponse, o as createQwenProviderDefinition, p as IQwenResponsesFunctionCallOutputInput, q as QWEN_MODEL_LAST_VERIFIED_AT, r as IQwenModelsResponse, s as QwenProvider, t as IQwenFetchInit, u as IQwenResponsesCompletedEvent, v as IQwenResponsesMessageInput, w as IQwenResponsesResponse, x as IQwenResponsesRequestBase, y as IQwenResponsesMessageOutputItem, z as TQwenResponsesOutputItem } from "./index-BqixM_XD.js";
|
|
8
|
+
export { ANTHROPIC_MODEL_LAST_VERIFIED_AT, ANTHROPIC_MODEL_SOURCE_URL, AnthropicProvider, BytedanceProvider, DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE, DEEPSEEK_MODEL_CATALOG_SOURCE_URL, DEEPSEEK_MODEL_LAST_VERIFIED_AT, DEEPSEEK_MODEL_LIST_SOURCE_URL, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV, DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE, DEFAULT_ANTHROPIC_PROVIDER_MODEL, DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV, DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE, DEFAULT_DEEPSEEK_PROVIDER_BASE_URL, DEFAULT_DEEPSEEK_PROVIDER_MODEL, DEFAULT_GEMINI_PROVIDER_API_KEY_ENV, DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE, DEFAULT_GEMINI_PROVIDER_MODEL, DEFAULT_GEMMA_PROVIDER_API_KEY, DEFAULT_GEMMA_PROVIDER_BASE_URL, DEFAULT_GEMMA_PROVIDER_MODEL, DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE, DEFAULT_OPENAI_PROVIDER_MODEL, DEFAULT_QWEN_PROVIDER_API_KEY_ENV, DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE, DEFAULT_QWEN_PROVIDER_BASE_URL, DEFAULT_QWEN_PROVIDER_MODEL, DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL, DeepSeekProvider, GEMINI_MODEL_LAST_VERIFIED_AT, GEMINI_MODEL_SOURCE_URL, GeminiProvider, GemmaProvider, GemmaReasoningProjector, GemmaToolCallProjector, IAnthropicFetchInit, IAnthropicFetchResponse, IAnthropicModelsResponse, IAnthropicProviderOptions, IBytedanceApiErrorResponse, IBytedanceCreateVideoTaskRequest, IBytedanceCreateVideoTaskResponse, IBytedanceProviderOptions, IBytedanceTaskContentImageUrl, IBytedanceTaskContentText, IBytedanceTaskContentVideoUrl, IBytedanceVideoTaskResponse, type IDeepSeekProviderOptions, type IDeepSeekThinkingConfig, IGeminiFetchInit, IGeminiFetchResponse, IGeminiModelInfo, IGeminiModelsResponse, IGeminiProviderOptions, IGeminiSafetySetting, IGeminiThinkingConfig, IGemmaProviderOptions, IGemmaReasoningProjection, IGemmaToolCallProjection, IGemmaToolCallProjectorOptions, IOpenAIJsonSchemaDefinition, IOpenAIModelCatalogFetchInit, IOpenAIModelCatalogFetchResponse, IOpenAIModelCatalogResource, IOpenAIModelCatalogResponse, IOpenAINativeWebToolsOptions, IOpenAIProviderOptions, IOpenAIResponsesReasoningOptions, type IPayloadLogger, type IPayloadLoggerOptions, IQwenBuiltInWebToolsOptions, IQwenFetchInit, IQwenFetchResponse, IQwenModelsResponse, IQwenProviderOptions, IQwenResponsesCompletedEvent, IQwenResponsesErrorEvent, IQwenResponsesFunctionCallInput, IQwenResponsesFunctionCallOutputInput, IQwenResponsesFunctionCallOutputItem, IQwenResponsesFunctionTool, IQwenResponsesGenericEvent, IQwenResponsesGenericOutputItem, IQwenResponsesMessageInput, IQwenResponsesMessageOutputItem, IQwenResponsesOutputItemDoneEvent, IQwenResponsesRequestBase, IQwenResponsesRequestNonStreaming, IQwenResponsesRequestStreaming, IQwenResponsesResponse, IQwenResponsesTextContent, IQwenResponsesTextDeltaEvent, IQwenResponsesToolUsageCount, IQwenResponsesUsage, IQwenResponsesWebExtractorOutputItem, IQwenResponsesWebExtractorTool, IQwenResponsesWebSearchAction, IQwenResponsesWebSearchEvent, IQwenResponsesWebSearchOutputItem, IQwenResponsesWebSearchTool, IRefreshOpenAIModelCatalogOptions, OpenAIConversationAdapter, OpenAIProvider, QWEN_MODEL_LAST_VERIFIED_AT, QWEN_MODEL_SOURCE_URL, QWEN_PROVIDER_BASE_URLS, QWEN_PROVIDER_RESPONSES_BASE_URLS, QwenProvider, TAnthropicFetch, TAnthropicProviderOptionValue, TBytedanceTaskContent, type TDeepSeekProviderOptionValue, type TDeepSeekReasoningEffort, type TDeepSeekThinkingMode, TGeminiFetch, TGeminiProviderOptionValue, TGemmaProviderOptionValue, TOpenAIApiSurface, TOpenAIModelCatalogFetch, TOpenAIProviderOptionValue, TQwenBuiltInWebToolName, TQwenFetch, TQwenMessagesToResponsesInput, TQwenProviderOptionValue, TQwenProviderRegion, TQwenProviderResponsesRegion, TQwenResponsesInputItem, TQwenResponsesOutputItem, TQwenResponsesStreamEvent, TQwenResponsesTool, createAnthropicProvider, createAnthropicProviderDefinition, createDeepSeekProviderDefinition, createGeminiProviderDefinition, createGemmaProviderDefinition, createGemmaToolCallProjector, createOpenAIProviderDefinition, createQwenProviderDefinition, projectGemmaReasoningText, projectGemmaToolCallText, refreshAnthropicModelCatalog, refreshDeepSeekModelCatalog, refreshGeminiModelCatalog, refreshOpenAIModelCatalog, refreshQwenModelCatalog };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c}from"./anthropic--1vgLC-e.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./openai-CRQjg4xF.js";import{a as h,c as g,d as _,i as v,l as y,n as b,o as x,r as S,s as C,t as w,u as T}from"./deepseek-_8Ixx7rA.js";import{a as E,c as D,i as O,n as k,o as A,r as j,s as M,t as N}from"./gemini-Bh2U87MY.js";import{a as P,c as F,i as I,l as L,n as R,o as z,r as B,s as V,t as H,u as U}from"./gemma-Dp_AfCUR.js";import{t as W}from"./bytedance-C_0sF_pJ.js";import{a as G,c as K,d as q,f as J,i as Y,l as X,n as Z,o as Q,r as $,s as ee,t as te,u as ne}from"./qwen-ChUZobTL.js";export{i as ANTHROPIC_MODEL_LAST_VERIFIED_AT,o as ANTHROPIC_MODEL_SOURCE_URL,r as AnthropicProvider,W as BytedanceProvider,S as DEEPSEEK_DEPRECATED_ALIAS_RETIREMENT_DATE,v as DEEPSEEK_MODEL_CATALOG_SOURCE_URL,h as DEEPSEEK_MODEL_LAST_VERIFIED_AT,x as DEEPSEEK_MODEL_LIST_SOURCE_URL,n as DEFAULT_ANTHROPIC_PROVIDER_API_KEY_ENV,e as DEFAULT_ANTHROPIC_PROVIDER_API_KEY_REFERENCE,a as DEFAULT_ANTHROPIC_PROVIDER_MODEL,g as DEFAULT_DEEPSEEK_PROVIDER_API_KEY_ENV,y as DEFAULT_DEEPSEEK_PROVIDER_API_KEY_REFERENCE,T as DEFAULT_DEEPSEEK_PROVIDER_BASE_URL,_ as DEFAULT_DEEPSEEK_PROVIDER_MODEL,k as DEFAULT_GEMINI_PROVIDER_API_KEY_ENV,j as DEFAULT_GEMINI_PROVIDER_API_KEY_REFERENCE,O as DEFAULT_GEMINI_PROVIDER_MODEL,H as DEFAULT_GEMMA_PROVIDER_API_KEY,R as DEFAULT_GEMMA_PROVIDER_BASE_URL,B as DEFAULT_GEMMA_PROVIDER_MODEL,m as DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,d as DEFAULT_OPENAI_PROVIDER_MODEL,Y as DEFAULT_QWEN_PROVIDER_API_KEY_ENV,G as DEFAULT_QWEN_PROVIDER_API_KEY_REFERENCE,Q as DEFAULT_QWEN_PROVIDER_BASE_URL,ee as DEFAULT_QWEN_PROVIDER_MODEL,K as DEFAULT_QWEN_PROVIDER_RESPONSES_BASE_URL,C as DeepSeekProvider,E as GEMINI_MODEL_LAST_VERIFIED_AT,A as GEMINI_MODEL_SOURCE_URL,D as GeminiProvider,P as GemmaProvider,L as GemmaReasoningProjector,z as GemmaToolCallProjector,l as OpenAIConversationAdapter,f as OpenAIProvider,X as QWEN_MODEL_LAST_VERIFIED_AT,ne as QWEN_MODEL_SOURCE_URL,q as QWEN_PROVIDER_BASE_URLS,J as QWEN_PROVIDER_RESPONSES_BASE_URLS,$ as QwenProvider,c as createAnthropicProvider,s as createAnthropicProviderDefinition,w as createDeepSeekProviderDefinition,M as createGeminiProviderDefinition,I as createGemmaProviderDefinition,V as createGemmaToolCallProjector,p as createOpenAIProviderDefinition,te as createQwenProviderDefinition,U as projectGemmaReasoningText,F as projectGemmaToolCallText,t as refreshAnthropicModelCatalog,b as refreshDeepSeekModelCatalog,N as refreshGeminiModelCatalog,u as refreshOpenAIModelCatalog,Z as refreshQwenModelCatalog};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../openai-xWC6pY7r.cjs`);exports.DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE=e.t,exports.DEFAULT_OPENAI_PROVIDER_MODEL=e.n,exports.OpenAIConversationAdapter=e.a,exports.OpenAIProvider=e.o,exports.createOpenAIProviderDefinition=e.r,exports.refreshOpenAIModelCatalog=e.i;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { _ as TOpenAIApiSurface, a as IOpenAIModelCatalogFetchResponse, b as IPayloadLoggerOptions, c as IRefreshOpenAIModelCatalogOptions, d as OpenAIConversationAdapter, f as OpenAIProvider, g as IOpenAIResponsesReasoningOptions, h as IOpenAIProviderOptions, i as IOpenAIModelCatalogFetchInit, l as TOpenAIModelCatalogFetch, m as IOpenAINativeWebToolsOptions, n as DEFAULT_OPENAI_PROVIDER_MODEL, o as IOpenAIModelCatalogResource, p as IOpenAIJsonSchemaDefinition, r as createOpenAIProviderDefinition, s as IOpenAIModelCatalogResponse, t as DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE, u as refreshOpenAIModelCatalog, v as TOpenAIProviderOptionValue, y as IPayloadLogger } from "../index-w0bV1uaP.js";
|
|
2
|
+
export { DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE, DEFAULT_OPENAI_PROVIDER_MODEL, IOpenAIJsonSchemaDefinition, IOpenAIModelCatalogFetchInit, IOpenAIModelCatalogFetchResponse, IOpenAIModelCatalogResource, IOpenAIModelCatalogResponse, IOpenAINativeWebToolsOptions, IOpenAIProviderOptions, IOpenAIResponsesReasoningOptions, type IPayloadLogger, type IPayloadLoggerOptions, IRefreshOpenAIModelCatalogOptions, OpenAIConversationAdapter, OpenAIProvider, TOpenAIApiSurface, TOpenAIModelCatalogFetch, TOpenAIProviderOptionValue, createOpenAIProviderDefinition, refreshOpenAIModelCatalog };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"../openai-CRQjg4xF.js";export{a as DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,n as DEFAULT_OPENAI_PROVIDER_MODEL,e as OpenAIConversationAdapter,r as OpenAIProvider,i as createOpenAIProviderDefinition,t as refreshOpenAIModelCatalog};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t,n,o as r,r as i,t as a}from"./openai-compatible-Dm4Sof9e.js";import{randomUUID as o}from"node:crypto";import{AbstractAIProvider as ee,SilentLogger as s}from"@robota-sdk/agent-core";import c from"openai";var l=class{parser;constructor(e){this.parser=new t({logger:e})}parseResponse(e){try{return this.parser.parseResponse(e)}catch(e){let t=u(e instanceof Error?e.message:`OpenAI response parsing failed`);throw Error(`OpenAI response parsing failed: ${t}`)}}parseStreamingChunk(e){try{return this.parser.parseStreamingChunk(e)}catch(e){let t=u(e instanceof Error?e.message:`OpenAI chunk parsing failed`);throw Error(`OpenAI chunk parsing failed: ${t}`)}}};function u(e){return e.replace(/^OpenAI-compatible response parsing failed: /,``).replace(/^OpenAI-compatible chunk parsing failed: /,``).replace(`OpenAI-compatible response`,`OpenAI response`)}function te(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{type:`json_object`};let t=d(e);return{type:`json_schema`,json_schema:{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function ne(e){if(e.responseFormat===void 0||e.responseFormat===`text`)return;if(e.responseFormat===`json_object`)return{format:{type:`json_object`}};let t=d(e);return{format:{type:`json_schema`,name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}}function d(e){let t=e.jsonSchema;if(e.responseFormat!==`json_schema`)throw Error(`Unsupported OpenAI response format: ${e.responseFormat}`);if(!t?.schema)throw Error(`OpenAI jsonSchema.schema is required when responseFormat is json_schema`);return{name:t.name,schema:t.schema,...t.description!==void 0&&{description:t.description},...t.strict!==void 0&&{strict:t.strict}}}function f(t){return e(t)}function re(e){return r(e)}async function p(e){let t=v(e.client);try{let n=h(e);if(e.chatOptions?.onTextDelta??e.onTextDelta)return await g(t,e,{...n,stream:!0});await _(e,n,`chat`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:n});let r=await t.chat.completions.create(n);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`response`,payload:r}),e.responseParser.parseResponse(r)}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI chat failed: ${t}`)}}async function*m(e){let t=v(e.client);try{let r={...h(e),stream:!0};await _(e,r,`stream`),e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r});let i=await t.chat.completions.create(r,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);for await(let t of n(i,{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload})){let n=e.responseParser.parseStreamingChunk(t);n&&(yield n)}}catch(e){let t=e.message||`OpenAI API request failed`;throw Error(`OpenAI stream failed: ${t}`)}}function h(e){let t=f(e.messages),n=e.chatOptions?.model??e.providerOptions.defaultModel;if(!n)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let r=te(e.providerOptions);return{model:n,messages:t,...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_tokens:e.chatOptions.maxTokens},...e.chatOptions?.tools&&{tools:re(e.chatOptions.tools),tool_choice:`auto`},...r!==void 0&&{response_format:r}}}async function g(e,t,r){try{return await _(t,r,`stream`),t.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`chat-completions`,payloadKind:`request`,payload:r}),i({stream:n(await e.chat.completions.create(r,t.chatOptions?.signal?{signal:t.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`chat-completions`,onProviderNativeRawPayload:t.chatOptions?.onProviderNativeRawPayload}),onTextDelta:t.chatOptions?.onTextDelta??t.onTextDelta,signal:t.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI streaming request failed`;throw Error(`OpenAI stream failed: ${t}`)}}async function _(e,t,n){if(!e.payloadLogger?.isEnabled())return;let r={model:t.model,messagesCount:t.messages.length,hasTools:!!t.tools,temperature:t.temperature??void 0,maxTokens:t.max_tokens??void 0,timestamp:new Date().toISOString()};await e.payloadLogger.logPayload(r,n)}function v(e){if(!e)throw Error(`OpenAI client not available. Either provide a client/apiKey or use an executor.`);return e}function y(e){return e.flatMap(e=>x(e))}function b(e,t){let n=e?.map(e=>({type:`function`,name:e.name,description:e.description,parameters:e.parameters,strict:t??!1}))??[];return n.length>0?n:void 0}function x(e){if(e.role===`user`)return[S(`user`,ae(e.content,e.parts))];if(e.role===`system`)return[S(`system`,e.content)];if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return[{type:`function_call_output`,call_id:e.toolCallId,output:e.content||``}]}return ie(e)}function ie(e){let t=[];e.content&&e.content.length>0&&t.push(S(`assistant`,e.content));for(let n of e.toolCalls??[])t.push({type:`function_call`,call_id:n.id,name:n.function.name,arguments:n.function.arguments});return t.length===0&&t.push(S(`assistant`,``)),t}function ae(e,t){if(!t||t.length===0)return e;let n=t.map(e=>oe(e));return e.length>0&&!t.some(e=>e.type===`text`)?[{type:`input_text`,text:e},...n]:n}function oe(e){return e.type===`text`?{type:`input_text`,text:e.text}:e.type===`image_uri`?{type:`input_image`,image_url:e.uri}:{type:`input_image`,image_url:`data:${e.mimeType};base64,${e.data}`}}function S(e,t){return{role:e,content:t}}async function*se(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await ce(n,t);if(e.done||t?.aborted)break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function ce(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}function le(e){z(e);let t=e.output??[];return T({content:e.output_text??j(t),toolCalls:O(t),response:e,reasoning:P(t)})}async function ue(e){let t={textParts:[],toolCalls:[],reasoning:I()};for await(let n of se(e.stream,e.signal))de(t,n,e.onTextDelta);return t.completedResponse===void 0?T({content:t.textParts.join(``),toolCalls:t.toolCalls,reasoning:t.reasoning}):w(t)}function de(e,t,n){if(t.type===`response.output_text.delta`){e.textParts.push(t.delta),n?.(t.delta);return}if(t.type===`response.completed`){e.completedResponse=t.response,L(e.reasoning,P(t.response.output??[]));return}if(t.type===`response.output_item.done`){C(e,t.item);return}if(t.type===`response.error`||t.type===`response.failed`||t.type===`response.incomplete`)throw Error(`OpenAI Responses API failed: ${B(t)}`)}function C(e,t){if(k(t)){e.toolCalls.push(A(t));return}F(t)&&L(e.reasoning,P([t]))}function w(e){let t=e.completedResponse;if(t===void 0)throw Error(`OpenAI Responses stream completed without response metadata`);z(t);let n=t.output??[],r=O(n),i=e.textParts.length>0?e.textParts.join(``):t.output_text??j(n),a=P(n);return L(a,e.reasoning),T({content:i,toolCalls:r.length>0?r:e.toolCalls,response:t,reasoning:a})}function T(e){return{id:o(),role:`assistant`,content:e.content,state:`complete`,timestamp:new Date,...e.toolCalls.length>0&&{toolCalls:e.toolCalls},...e.response?.usage!==void 0&&{usage:D(e.response.usage)},metadata:E(e.response,e.reasoning)}}function E(e,t){return{providerApiSurface:`responses`,...e?.id!==void 0&&{responseId:e.id},...e?.model!==void 0&&{model:e.model},...e?.status!==void 0&&{finishReason:e.status},...t.reasoningSummaryCount>0&&{reasoningSummaryCount:t.reasoningSummaryCount,reasoningSummaries:t.reasoningSummaries},...t.hasEncryptedReasoning&&{hasEncryptedReasoning:!0}}}function D(e){return{promptTokens:e.input_tokens??0,completionTokens:e.output_tokens??0,totalTokens:e.total_tokens??0}}function O(e){return e.filter(k).map(e=>A(e))}function k(e){return e.type===`function_call`&&`call_id`in e&&`name`in e&&`arguments`in e}function A(e){return{id:e.call_id,type:`function`,function:{name:e.name,arguments:e.arguments}}}function j(e){return e.filter(N).flatMap(e=>e.content).map(M).join(``)}function M(e){return e.type===`refusal`?e.refusal:e.text}function N(e){return e.type===`message`&&`content`in e&&Array.isArray(e.content)}function P(e){let t=I();for(let n of e){if(!F(n))continue;let e=n.summary?.map(e=>e.text).filter(R)??[];t.reasoningSummaryCount+=e.length,t.reasoningSummaries.push(...e),t.hasEncryptedReasoning=t.hasEncryptedReasoning||!!n.encrypted_content}return t}function F(e){return e.type===`reasoning`}function I(){return{reasoningSummaryCount:0,reasoningSummaries:[],hasEncryptedReasoning:!1}}function L(e,t){e.reasoningSummaryCount+=t.reasoningSummaryCount,e.reasoningSummaries.push(...t.reasoningSummaries),e.hasEncryptedReasoning=e.hasEncryptedReasoning||t.hasEncryptedReasoning}function R(e){return e!==void 0}function z(e){if(e.status===`failed`||e.status===`incomplete`)throw Error(`OpenAI Responses API failed: ${e.error?.message??e.status}`)}function B(e){return e.message??e.error?.message??e.response?.error?.message??`unknown error`}async function V(e){let t=e.chatOptions?.onTextDelta??e.onTextDelta;if(t)return U({...e,chatOptions:{...e.chatOptions,onTextDelta:t}});if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=W(e);e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t});let n=await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`response`,payload:n}),le(n)}catch(e){let t=e.message||`OpenAI Responses API request failed`;throw Error(`OpenAI responses failed: ${t}`)}}async function*H(e){let t={deltas:[]},n=e.chatOptions?.onTextDelta??e.onTextDelta,r=U({...e,chatOptions:{...e.chatOptions,onTextDelta:e=>{n?.(e),me(t,fe(e))}}}).then(e=>he(t,e)).catch(e=>ge(t,ye(e)));yield*pe(t),await r}async function U(e){if(!e.client)throw Error(`OpenAI Responses client not available.`);try{let t=G(e);return e.chatOptions?.onProviderNativeRawPayload?.({provider:`openai`,apiSurface:`responses`,payloadKind:`request`,payload:t}),ue({stream:n(await e.client.responses.create(t,e.chatOptions?.signal?{signal:e.chatOptions.signal}:void 0),{provider:`openai`,apiSurface:`responses`,onProviderNativeRawPayload:e.chatOptions?.onProviderNativeRawPayload}),onTextDelta:e.chatOptions?.onTextDelta,signal:e.chatOptions?.signal})}catch(e){let t=e.message||`OpenAI Responses streaming request failed`;throw Error(`OpenAI responses stream failed: ${t}`)}}function W(e){let t=e.chatOptions?.model??e.providerOptions.defaultModel;if(!t)throw Error(`Model is required in chat options. Please specify a model in defaultModel configuration.`);let n=b(e.chatOptions?.tools,e.providerOptions.strictTools),r=ne(e.providerOptions);return{model:t,input:y(e.messages),...n!==void 0&&{tools:n,tool_choice:`auto`},...e.chatOptions?.temperature!==void 0&&{temperature:e.chatOptions.temperature},...e.chatOptions?.maxTokens!==void 0&&{max_output_tokens:e.chatOptions.maxTokens},...r!==void 0&&{text:r},...e.providerOptions.reasoning!==void 0&&{reasoning:e.providerOptions.reasoning},...e.providerOptions.includeEncryptedReasoning===!0&&{include:[`reasoning.encrypted_content`]},...e.providerOptions.store!==void 0&&{store:e.providerOptions.store}}}function G(e){return{...W(e),stream:!0}}function fe(e){return{id:o(),role:`assistant`,content:e,state:`complete`,timestamp:new Date,metadata:{providerApiSurface:`responses`,isStreamChunk:!0,isComplete:!1}}}async function*pe(e){for(;;){let t=e.deltas.shift();if(t!==void 0){yield t;continue}if(e.error!==void 0)throw e.error;if(e.finalMessage!==void 0){yield ve(e.finalMessage);return}await _e(e)}}function me(e,t){e.deltas.push(t),K(e)}function he(e,t){e.finalMessage=t,K(e)}function ge(e,t){e.error=t,K(e)}function _e(e){return new Promise(t=>{e.wake=t})}function K(e){e.wake?.(),e.wake=void 0}function ve(e){return{...e,content:``,metadata:{...e.metadata,isStreamChunk:!0,isComplete:!0}}}function ye(e){return e instanceof Error?e:Error(String(e))}var q=class extends ee{name=`openai`;version=`1.0.0`;client;options;apiSurface;payloadLogger;responseParser;onTextDelta;constructor(e){if(super(e.logger||s),this.options=e,this.apiSurface=be(e),xe(this.apiSurface,e.nativeWebTools),e.executor&&(this.executor=e.executor),!this.executor)if(e.client)this.client=e.client;else if(e.apiKey)this.client=new c({apiKey:e.apiKey,...e.organization&&{organization:e.organization},...e.timeout&&{timeout:e.timeout},...e.baseURL&&{baseURL:e.baseURL}});else throw Error(`Either OpenAI client, apiKey, or executor is required`);this.responseParser=new l(this.logger),this.payloadLogger=e.payloadLogger}async chat(e,t){if(this.validateMessages(e),this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{return await this.executeViaExecutorOrDirect(e,t)}catch(e){throw this.logger.error(`OpenAI Provider executor chat error:`,e instanceof Error?e.message:String(e)),e}return this.apiSurface===`responses`?V({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta}):p({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}async*chatStream(e,t){if(this.validateNativeWebTools(t?.nativeWebTools),this.executor)try{yield*this.executeStreamViaExecutorOrDirect(e,t);return}catch(e){throw this.logger.error(`OpenAI Provider executor stream error:`,e instanceof Error?e.message:String(e)),e}if(this.apiSurface===`responses`){yield*H({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,onTextDelta:this.onTextDelta});return}yield*m({client:this.client,messages:e,chatOptions:t,providerOptions:this.options,payloadLogger:this.payloadLogger,responseParser:this.responseParser,onTextDelta:this.onTextDelta})}supportsTools(){return!0}getCapabilities(){let e=this.apiSurface===`chat-completions`?`openai-compatible-chat-completions`:`openai-responses`;return{functionCalling:{supported:!0},nativeWebTools:{webSearch:{supported:!1,enabled:!1,source:e,reason:J(this.apiSurface,`search`)},webFetch:{supported:!1,enabled:!1,source:e,reason:J(this.apiSurface,`fetch`)}}}}validateConfig(){return!!this.client&&!!this.options}async dispose(){}validateMessages(e){super.validateMessages(e);for(let t of e)if(t.role===`assistant`){let e=t;if(e.toolCalls&&e.toolCalls.length>0&&e.content===``)continue}}};function be(e){return e.apiSurface===void 0?e.baseURL?`chat-completions`:`responses`:e.apiSurface}function J(e,t){return e===`chat-completions`?`OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${t}.`:`OpenAI Responses native web ${t} is not wired in this Robota provider version.`}function xe(e,t){if(!(t?.webSearch!==!0&&t?.webFetch!==!0))throw Error(`Provider openai native web search/fetch is not supported for apiSurface ${e} in this Robota provider version.`)}var Se=class{static filterMessagesForOpenAI(e){return e.filter(e=>e.role===`user`||e.role===`assistant`||e.role===`system`?!0:e.role===`tool`?!!(e.toolCallId&&e.toolCallId.trim()!==``&&e.toolCallId!==`unknown`):!1)}static toOpenAIFormat(e){return this.filterMessagesForOpenAI(e).map(e=>this.convertMessage(e))}static convertMessage(e){let t=e.role;if(t===`user`)return{role:`user`,content:e.content};if(t===`assistant`){let t=e;return t.toolCalls&&t.toolCalls.length>0?{role:`assistant`,content:t.content===``?null:t.content||null,tool_calls:t.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:t.content===null||t.content===``?null:t.content||``}}if(t===`system`)return{role:`system`,content:e.content};if(t===`tool`){if(!e.toolCallId||e.toolCallId.trim()===``)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${t}`)}static addSystemPromptIfNeeded(e,t){return!t||e.some(e=>e.role===`system`)?e:[{role:`system`,content:t},...e]}};const Y=`https://platform.openai.com/docs/api-reference/models/list`;async function X(e,t={}){if(!e.apiKey)return Z(`OpenAI model catalog refresh requires apiKey.`);let n=t.fetcher??Ee,r=t.now??(()=>new Date),i=Ce(e.baseURL);try{let t=await n(i,{headers:{Authorization:`Bearer ${e.apiKey}`}});if(!t.ok)return Z(Te(t));let a=we(await t.json());return{status:`live`,entries:a,lastVerifiedAt:r().toISOString(),sourceUrl:Y,message:`${a.length} OpenAI model(s) discovered.`}}catch(e){return Z(e instanceof Error?e.message:String(e))}}function Ce(e){return e?`${e.replace(/\/$/,``)}/models`:`https://api.openai.com/v1/models`}function we(e){return(e.data??[]).map(e=>e.id).filter(e=>e!==void 0&&e.trim().length>0).map(e=>({id:e,displayName:e,lifecycle:`active`}))}function Te(e){let t=e.statusText?` ${e.statusText}`:``;return`OpenAI model catalog refresh failed: HTTP ${e.status}${t}`}function Z(e){return{status:`unavailable`,sourceUrl:Y,message:e}}async function Ee(e,t){let n=await fetch(e,t);return{ok:n.ok,status:n.status,statusText:n.statusText,json:()=>n.json()}}const De=void 0,Q=`$ENV:OPENAI_API_KEY`,Oe=[{kind:`api-key`,label:`OpenAI API keys`,url:`https://platform.openai.com/api-keys`,sourceUrl:`https://developers.openai.com/api/reference/overview#authentication`,lastVerifiedAt:`2026-05-08`}];function ke(){return{type:`openai`,displayName:`OpenAI`,description:`Official OpenAI Responses API provider`,defaults:{apiKey:Q},modelCatalog:{status:`unavailable`,sourceUrl:`https://platform.openai.com/docs/api-reference/models/list`,message:`OpenAI model availability should be discovered live from GET /v1/models.`},setupHelpLinks:Oe,setupSteps:[{key:`model`,title:`OpenAI model`,required:!0},{key:`apiKey`,title:`OpenAI API key`,defaultValue:Q,masked:!0}],requiresApiKey:!0,probeProfile:a,refreshModelCatalog:({profile:e})=>X(e),modelCatalogCacheTtlSeconds:86400,createProvider:e=>{let t=je(e.options),n=Me(e.options);return Ne(e.baseURL,t,n),new q({apiKey:Ae(e.apiKey),...e.baseURL!==void 0&&{baseURL:e.baseURL},...e.timeout!==void 0&&{timeout:e.timeout},...t!==void 0&&{apiSurface:t},...n!==void 0&&{nativeWebTools:n},defaultModel:e.model})}}}function Ae(e){if(!e)throw Error(`Provider openai requires apiKey`);return e}function je(e){let t=e?.apiSurface;if(t===`responses`||t===`chat-completions`)return t}function Me(e){let t=$(e?.nativeWebTools)??$(e?.builtInWebTools);if(t!==void 0)return t}function $(e){if(e==null||e instanceof Date||Array.isArray(e)||typeof e!=`object`)return;let t=e.webSearch,n=e.webFetch;return{...typeof t==`boolean`&&{webSearch:t},...typeof n==`boolean`&&{webFetch:n}}}function Ne(e,t,n){if(!(n?.webSearch!==!0&&n?.webFetch!==!0))throw Error(e!==void 0||t===`chat-completions`?`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.`:`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.`)}export{Se as a,X as i,De as n,q as o,ke as r,Q as t};
|
|
2
|
+
//# sourceMappingURL=openai-CRQjg4xF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-CRQjg4xF.js","names":["openaiError","assembleOpenAIStream","openaiError","exhaustive"],"sources":["../../src/openai/parsers/response-parser.ts","../../src/openai/openai-request-format.ts","../../src/openai/message-converter.ts","../../src/openai/chat-completions-chat.ts","../../src/openai/responses-converter.ts","../../src/openai/responses-stream-utils.ts","../../src/openai/responses-parser.ts","../../src/openai/responses-chat.ts","../../src/openai/provider.ts","../../src/openai/adapter.ts","../../src/openai/model-catalog-refresh.ts","../../src/openai/provider-definition.ts"],"sourcesContent":["import type OpenAI from 'openai';\nimport type { ILogger, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { OpenAICompatibleResponseParser } from '../../shared/openai-compatible/index.js';\n\n/**\n * OpenAI response parser compatibility wrapper.\n *\n * The implementation delegates to the shared OpenAI-compatible parser while\n * preserving the OpenAI-branded error messages that are part of this package's\n * current test contract.\n */\nexport class OpenAIResponseParser {\n private readonly parser: OpenAICompatibleResponseParser;\n\n constructor(logger?: ILogger) {\n this.parser = new OpenAICompatibleResponseParser({ logger });\n }\n\n parseResponse(response: OpenAI.Chat.ChatCompletion): TUniversalMessage {\n try {\n return this.parser.parseResponse(response);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI response parsing failed',\n );\n throw new Error(`OpenAI response parsing failed: ${message}`);\n }\n }\n\n parseStreamingChunk(chunk: OpenAI.Chat.ChatCompletionChunk): TUniversalMessage | null {\n try {\n return this.parser.parseStreamingChunk(chunk);\n } catch (error) {\n const message = normalizeParserMessage(\n error instanceof Error ? error.message : 'OpenAI chunk parsing failed',\n );\n throw new Error(`OpenAI chunk parsing failed: ${message}`);\n }\n }\n}\n\nfunction normalizeParserMessage(message: string): string {\n return message\n .replace(/^OpenAI-compatible response parsing failed: /, '')\n .replace(/^OpenAI-compatible chunk parsing failed: /, '')\n .replace('OpenAI-compatible response', 'OpenAI response');\n}\n","import type { IOpenAIProviderOptions, TOpenAIProviderOptionValue } from './types';\nimport type {\n IOpenAIResponsesTextConfig,\n IOpenAIResponsesTextFormatJsonSchema,\n} from './responses-types';\n\nexport interface IOpenAIChatTextFormatText {\n type: 'text';\n}\n\nexport interface IOpenAIChatTextFormatJsonObject {\n type: 'json_object';\n}\n\nexport interface IOpenAIChatTextFormatJsonSchema {\n type: 'json_schema';\n json_schema: {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n };\n}\n\nexport type TOpenAIChatResponseFormat =\n | IOpenAIChatTextFormatText\n | IOpenAIChatTextFormatJsonObject\n | IOpenAIChatTextFormatJsonSchema;\n\nexport function buildOpenAIChatResponseFormat(\n options: IOpenAIProviderOptions,\n): TOpenAIChatResponseFormat | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { type: 'json_object' };\n }\n\n const schema = requireJsonSchema(options);\n return {\n type: 'json_schema',\n json_schema: {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n },\n };\n}\n\nexport function buildOpenAIResponsesTextConfig(\n options: IOpenAIProviderOptions,\n): IOpenAIResponsesTextConfig | undefined {\n if (options.responseFormat === undefined || options.responseFormat === 'text') {\n return undefined;\n }\n if (options.responseFormat === 'json_object') {\n return { format: { type: 'json_object' } };\n }\n\n const schema = requireJsonSchema(options);\n const format: IOpenAIResponsesTextFormatJsonSchema = {\n type: 'json_schema',\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n return { format };\n}\n\nfunction requireJsonSchema(input: IOpenAIProviderOptions): {\n name: string;\n schema: Record<string, TOpenAIProviderOptionValue>;\n description?: string;\n strict?: boolean;\n} {\n const schema = input.jsonSchema;\n if (input.responseFormat !== 'json_schema') {\n throw new Error(`Unsupported OpenAI response format: ${input.responseFormat}`);\n }\n if (!schema?.schema) {\n throw new Error('OpenAI jsonSchema.schema is required when responseFormat is json_schema');\n }\n return {\n name: schema.name,\n schema: schema.schema,\n ...(schema.description !== undefined && { description: schema.description }),\n ...(schema.strict !== undefined && { strict: schema.strict }),\n };\n}\n","import type OpenAI from 'openai';\nimport type { IToolSchema, TUniversalMessage } from '@robota-sdk/agent-core';\nimport {\n convertToOpenAICompatibleMessages,\n convertToOpenAICompatibleTools,\n} from '../shared/openai-compatible/index.js';\n\n/**\n * Convert TUniversalMessage array to OpenAI chat completion message format.\n */\nexport function convertToOpenAIMessages(\n messages: TUniversalMessage[],\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n return convertToOpenAICompatibleMessages(messages);\n}\n\n/**\n * Convert tool schemas to OpenAI function tool format.\n */\nexport function convertToOpenAITools(tools: IToolSchema[]): OpenAI.Chat.ChatCompletionTool[] {\n return convertToOpenAICompatibleTools(tools);\n}\n","import type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport type { IOpenAIError, IOpenAILogData } from './types/api-types';\nimport type { IOpenAIProviderOptions } from './types';\nimport { buildOpenAIChatResponseFormat } from './openai-request-format';\nimport { convertToOpenAIMessages, convertToOpenAITools } from './message-converter';\nimport { OpenAIResponseParser } from './parsers/response-parser';\nimport { assembleOpenAIStream } from './streaming/stream-assembler';\n\nexport interface IOpenAIChatCompletionsOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n payloadLogger?: IPayloadLogger;\n responseParser: OpenAIResponseParser;\n onTextDelta?: TTextDeltaCallback;\n}\n\nexport async function chatWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): Promise<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams = buildChatRequestParams(input);\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return await chatWithStreamingAssembly(client, input, {\n ...requestParams,\n stream: true,\n });\n }\n\n await logPayload(input, requestParams, 'chat');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await client.chat.completions.create(requestParams);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'response',\n payload: response,\n });\n return input.responseParser.parseResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI chat failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIChatCompletions(\n input: IOpenAIChatCompletionsOptions,\n): AsyncIterable<TUniversalMessage> {\n const client = requireClient(input.client);\n\n try {\n const requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming = {\n ...buildChatRequestParams(input),\n stream: true,\n };\n\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n for await (const chunk of observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n })) {\n const universalMessage = input.responseParser.parseStreamingChunk(chunk);\n if (universalMessage) {\n yield universalMessage;\n }\n }\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI API request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildChatRequestParams(\n input: IOpenAIChatCompletionsOptions,\n): OpenAI.Chat.ChatCompletionCreateParamsNonStreaming {\n const openaiMessages = convertToOpenAIMessages(input.messages);\n const model = input.chatOptions?.model ?? input.providerOptions.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const responseFormat = buildOpenAIChatResponseFormat(input.providerOptions);\n return {\n model,\n messages: openaiMessages,\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && { max_tokens: input.chatOptions.maxTokens }),\n ...(input.chatOptions?.tools && {\n tools: convertToOpenAITools(input.chatOptions.tools),\n tool_choice: 'auto',\n }),\n ...(responseFormat !== undefined && { response_format: responseFormat }),\n } as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming;\n}\n\nasync function chatWithStreamingAssembly(\n client: OpenAI,\n input: IOpenAIChatCompletionsOptions,\n requestParams: OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n): Promise<TUniversalMessage> {\n try {\n await logPayload(input, requestParams, 'stream');\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'chat-completions',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await client.chat.completions.create(\n requestParams,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n\n return assembleOpenAIStream({\n stream: observeProviderNativeRawPayloadStream(stream, {\n provider: 'openai',\n apiSurface: 'chat-completions',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n }),\n onTextDelta: input.chatOptions?.onTextDelta ?? input.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI streaming request failed';\n throw new Error(`OpenAI stream failed: ${errorMessage}`);\n }\n}\n\nasync function logPayload(\n input: IOpenAIChatCompletionsOptions,\n requestParams:\n | OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n | OpenAI.Chat.ChatCompletionCreateParamsStreaming,\n type: 'chat' | 'stream',\n): Promise<void> {\n if (!input.payloadLogger?.isEnabled()) {\n return;\n }\n\n const logData: IOpenAILogData = {\n model: requestParams.model,\n messagesCount: requestParams.messages.length,\n hasTools: !!requestParams.tools,\n temperature: requestParams.temperature ?? undefined,\n maxTokens: requestParams.max_tokens ?? undefined,\n timestamp: new Date().toISOString(),\n };\n await input.payloadLogger.logPayload(logData, type);\n}\n\nfunction requireClient(client: OpenAI | undefined): OpenAI {\n if (!client) {\n throw new Error(\n 'OpenAI client not available. Either provide a client/apiKey or use an executor.',\n );\n }\n return client;\n}\n","import type {\n IAssistantMessage,\n IToolSchema,\n TUniversalMessage,\n TUniversalMessagePart,\n} from '@robota-sdk/agent-core';\nimport type {\n IOpenAIResponsesFunctionTool,\n IOpenAIResponsesMessageInput,\n TOpenAIResponsesInputContent,\n TOpenAIResponsesInputItem,\n} from './responses-types';\n\nexport function convertToOpenAIResponsesInput(\n messages: TUniversalMessage[],\n): TOpenAIResponsesInputItem[] {\n return messages.flatMap((message) => convertMessage(message));\n}\n\nexport function convertToOpenAIResponsesTools(\n tools: IToolSchema[] | undefined,\n strictTools: boolean | undefined,\n): IOpenAIResponsesFunctionTool[] | undefined {\n const converted =\n tools?.map((tool) => ({\n type: 'function' as const,\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n strict: strictTools ?? false,\n })) ?? [];\n return converted.length > 0 ? converted : undefined;\n}\n\nfunction convertMessage(message: TUniversalMessage): TOpenAIResponsesInputItem[] {\n if (message.role === 'user') {\n return [createMessageInput('user', getUserContent(message.content, message.parts))];\n }\n if (message.role === 'system') {\n return [createMessageInput('system', message.content)];\n }\n if (message.role === 'tool') {\n if (!message.toolCallId || message.toolCallId.trim().length === 0) {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(message)}`);\n }\n return [\n {\n type: 'function_call_output',\n call_id: message.toolCallId,\n output: message.content || '',\n },\n ];\n }\n return convertAssistantMessage(message);\n}\n\nfunction convertAssistantMessage(message: IAssistantMessage): TOpenAIResponsesInputItem[] {\n const items: TOpenAIResponsesInputItem[] = [];\n if (message.content && message.content.length > 0) {\n items.push(createMessageInput('assistant', message.content));\n }\n for (const toolCall of message.toolCalls ?? []) {\n items.push({\n type: 'function_call',\n call_id: toolCall.id,\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n });\n }\n if (items.length === 0) {\n items.push(createMessageInput('assistant', ''));\n }\n return items;\n}\n\nfunction getUserContent(\n content: string,\n parts: TUniversalMessagePart[] | undefined,\n): string | TOpenAIResponsesInputContent[] {\n if (!parts || parts.length === 0) {\n return content;\n }\n\n const converted = parts.map((part) => convertPart(part));\n if (content.length > 0 && !parts.some((part) => part.type === 'text')) {\n return [{ type: 'input_text', text: content }, ...converted];\n }\n return converted;\n}\n\nfunction convertPart(part: TUniversalMessagePart): TOpenAIResponsesInputContent {\n if (part.type === 'text') {\n return { type: 'input_text', text: part.text };\n }\n if (part.type === 'image_uri') {\n return { type: 'input_image', image_url: part.uri };\n }\n return {\n type: 'input_image',\n image_url: `data:${part.mimeType};base64,${part.data}`,\n };\n}\n\nfunction createMessageInput(\n role: IOpenAIResponsesMessageInput['role'],\n content: string | TOpenAIResponsesInputContent[],\n): IOpenAIResponsesMessageInput {\n return {\n role,\n content,\n };\n}\n","export async function* streamWithAbort<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncGenerator<T> {\n const iterator = source[Symbol.asyncIterator]();\n try {\n while (!signal?.aborted) {\n const item = await nextStreamItem(iterator, signal);\n if (item.done || signal?.aborted) {\n break;\n }\n yield item.value;\n }\n } finally {\n if (signal?.aborted) {\n await iterator.return?.();\n }\n }\n}\n\nasync function nextStreamItem<T>(\n iterator: AsyncIterator<T>,\n signal?: AbortSignal,\n): Promise<IteratorResult<T>> {\n if (!signal) {\n return iterator.next();\n }\n if (signal.aborted) {\n return { done: true, value: undefined as T };\n }\n\n let abortListener: (() => void) | undefined;\n const aborted = new Promise<IteratorResult<T>>((resolve) => {\n abortListener = (): void => resolve({ done: true, value: undefined as T });\n signal.addEventListener('abort', abortListener, { once: true });\n });\n\n try {\n return await Promise.race([iterator.next(), aborted]);\n } finally {\n if (abortListener) {\n signal.removeEventListener('abort', abortListener);\n }\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { IToolCall, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport type {\n IOpenAIResponsesErrorEvent,\n IOpenAIResponsesFunctionCallOutputItem,\n IOpenAIResponsesMessageOutputItem,\n IOpenAIResponsesReasoningOutputItem,\n IOpenAIResponsesResponse,\n IOpenAIResponsesUsage,\n TOpenAIResponsesOutputContent,\n TOpenAIResponsesOutputItem,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\nimport { streamWithAbort } from './responses-stream-utils';\n\ninterface IOpenAIResponsesStreamAssemblyOptions {\n stream: AsyncIterable<TOpenAIResponsesStreamEvent>;\n onTextDelta?: TTextDeltaCallback;\n signal?: AbortSignal;\n}\n\ninterface IOpenAIResponsesReasoningMetadata {\n reasoningSummaryCount: number;\n reasoningSummaries: string[];\n hasEncryptedReasoning: boolean;\n}\n\ninterface IOpenAIResponseUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\ninterface IOpenAIResponsesStreamState {\n textParts: string[];\n toolCalls: IToolCall[];\n completedResponse?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}\n\nexport function parseOpenAIResponsesResponse(\n response: IOpenAIResponsesResponse,\n): TUniversalMessage {\n assertUsableResponse(response);\n const output = response.output ?? [];\n const content = response.output_text ?? extractMessageText(output);\n return buildAssistantMessage({\n content,\n toolCalls: extractFunctionToolCalls(output),\n response,\n reasoning: collectReasoningMetadata(output),\n });\n}\n\nexport async function assembleOpenAIResponsesStream(\n options: IOpenAIResponsesStreamAssemblyOptions,\n): Promise<TUniversalMessage> {\n const state: IOpenAIResponsesStreamState = {\n textParts: [],\n toolCalls: [],\n reasoning: createEmptyReasoningMetadata(),\n };\n\n for await (const event of streamWithAbort(options.stream, options.signal)) {\n applyStreamEvent(state, event, options.onTextDelta);\n }\n\n if (state.completedResponse !== undefined) {\n return buildMessageFromCompletedResponse(state);\n }\n\n return buildAssistantMessage({\n content: state.textParts.join(''),\n toolCalls: state.toolCalls,\n reasoning: state.reasoning,\n });\n}\n\nfunction applyStreamEvent(\n state: IOpenAIResponsesStreamState,\n event: TOpenAIResponsesStreamEvent,\n onTextDelta: TTextDeltaCallback | undefined,\n): void {\n if (event.type === 'response.output_text.delta') {\n state.textParts.push(event.delta);\n onTextDelta?.(event.delta);\n return;\n }\n\n if (event.type === 'response.completed') {\n state.completedResponse = event.response;\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata(event.response.output ?? []));\n return;\n }\n\n if (event.type === 'response.output_item.done') {\n applyOutputItem(state, event.item);\n return;\n }\n\n if (\n event.type === 'response.error' ||\n event.type === 'response.failed' ||\n event.type === 'response.incomplete'\n ) {\n throw new Error(`OpenAI Responses API failed: ${extractErrorMessage(event)}`);\n }\n}\n\nfunction applyOutputItem(\n state: IOpenAIResponsesStreamState,\n item: TOpenAIResponsesOutputItem,\n): void {\n if (isFunctionCallOutputItem(item)) {\n state.toolCalls.push(convertFunctionCall(item));\n return;\n }\n if (isReasoningOutputItem(item)) {\n mergeReasoningMetadata(state.reasoning, collectReasoningMetadata([item]));\n }\n}\n\nfunction buildMessageFromCompletedResponse(state: IOpenAIResponsesStreamState): TUniversalMessage {\n const response = state.completedResponse;\n if (response === undefined) {\n throw new Error('OpenAI Responses stream completed without response metadata');\n }\n\n assertUsableResponse(response);\n const output = response.output ?? [];\n const responseToolCalls = extractFunctionToolCalls(output);\n const content =\n state.textParts.length > 0\n ? state.textParts.join('')\n : (response.output_text ?? extractMessageText(output));\n const reasoning = collectReasoningMetadata(output);\n mergeReasoningMetadata(reasoning, state.reasoning);\n\n return buildAssistantMessage({\n content,\n toolCalls: responseToolCalls.length > 0 ? responseToolCalls : state.toolCalls,\n response,\n reasoning,\n });\n}\n\nfunction buildAssistantMessage(input: {\n content: string;\n toolCalls: IToolCall[];\n response?: IOpenAIResponsesResponse;\n reasoning: IOpenAIResponsesReasoningMetadata;\n}): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: input.content,\n state: 'complete',\n timestamp: new Date(),\n ...(input.toolCalls.length > 0 && { toolCalls: input.toolCalls }),\n ...(input.response?.usage !== undefined && { usage: mapUsage(input.response.usage) }),\n metadata: buildMetadata(input.response, input.reasoning),\n };\n}\n\nfunction buildMetadata(\n response: IOpenAIResponsesResponse | undefined,\n reasoning: IOpenAIResponsesReasoningMetadata,\n): NonNullable<TUniversalMessage['metadata']> {\n return {\n providerApiSurface: 'responses',\n ...(response?.id !== undefined && { responseId: response.id }),\n ...(response?.model !== undefined && { model: response.model }),\n ...(response?.status !== undefined && { finishReason: response.status }),\n ...(reasoning.reasoningSummaryCount > 0 && {\n reasoningSummaryCount: reasoning.reasoningSummaryCount,\n reasoningSummaries: reasoning.reasoningSummaries,\n }),\n ...(reasoning.hasEncryptedReasoning && { hasEncryptedReasoning: true }),\n };\n}\n\nfunction mapUsage(usage: IOpenAIResponsesUsage): IOpenAIResponseUsage {\n return {\n promptTokens: usage.input_tokens ?? 0,\n completionTokens: usage.output_tokens ?? 0,\n totalTokens: usage.total_tokens ?? 0,\n };\n}\n\nfunction extractFunctionToolCalls(output: readonly TOpenAIResponsesOutputItem[]): IToolCall[] {\n return output.filter(isFunctionCallOutputItem).map((item) => convertFunctionCall(item));\n}\n\nfunction isFunctionCallOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesFunctionCallOutputItem {\n return (\n item.type === 'function_call' && 'call_id' in item && 'name' in item && 'arguments' in item\n );\n}\n\nfunction convertFunctionCall(item: IOpenAIResponsesFunctionCallOutputItem): IToolCall {\n return {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: item.arguments,\n },\n };\n}\n\nfunction extractMessageText(output: readonly TOpenAIResponsesOutputItem[]): string {\n return output\n .filter(isMessageOutputItem)\n .flatMap((item) => item.content)\n .map(extractTextContent)\n .join('');\n}\n\nfunction extractTextContent(content: TOpenAIResponsesOutputContent): string {\n if (content.type === 'refusal') {\n return content.refusal;\n }\n return content.text;\n}\n\nfunction isMessageOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesMessageOutputItem {\n return item.type === 'message' && 'content' in item && Array.isArray(item.content);\n}\n\nfunction collectReasoningMetadata(\n output: readonly TOpenAIResponsesOutputItem[],\n): IOpenAIResponsesReasoningMetadata {\n const metadata = createEmptyReasoningMetadata();\n for (const item of output) {\n if (!isReasoningOutputItem(item)) {\n continue;\n }\n const summaries = item.summary?.map((summary) => summary.text).filter(isString) ?? [];\n metadata.reasoningSummaryCount += summaries.length;\n metadata.reasoningSummaries.push(...summaries);\n metadata.hasEncryptedReasoning = metadata.hasEncryptedReasoning || !!item.encrypted_content;\n }\n return metadata;\n}\n\nfunction isReasoningOutputItem(\n item: TOpenAIResponsesOutputItem,\n): item is IOpenAIResponsesReasoningOutputItem {\n return item.type === 'reasoning';\n}\n\nfunction createEmptyReasoningMetadata(): IOpenAIResponsesReasoningMetadata {\n return {\n reasoningSummaryCount: 0,\n reasoningSummaries: [],\n hasEncryptedReasoning: false,\n };\n}\n\nfunction mergeReasoningMetadata(\n target: IOpenAIResponsesReasoningMetadata,\n source: IOpenAIResponsesReasoningMetadata,\n): void {\n target.reasoningSummaryCount += source.reasoningSummaryCount;\n target.reasoningSummaries.push(...source.reasoningSummaries);\n target.hasEncryptedReasoning = target.hasEncryptedReasoning || source.hasEncryptedReasoning;\n}\n\nfunction isString(value: string | undefined): value is string {\n return value !== undefined;\n}\n\nfunction assertUsableResponse(response: IOpenAIResponsesResponse): void {\n if (response.status === 'failed' || response.status === 'incomplete') {\n throw new Error(`OpenAI Responses API failed: ${response.error?.message ?? response.status}`);\n }\n}\n\nfunction extractErrorMessage(event: IOpenAIResponsesErrorEvent): string {\n return event.message ?? event.error?.message ?? event.response?.error?.message ?? 'unknown error';\n}\n","import { randomUUID } from 'node:crypto';\nimport type OpenAI from 'openai';\nimport type { IChatOptions, TTextDeltaCallback, TUniversalMessage } from '@robota-sdk/agent-core';\nimport { observeProviderNativeRawPayloadStream } from '../shared/openai-compatible/index.js';\nimport type { IOpenAIError } from './types/api-types';\nimport type { IOpenAIProviderOptions } from './types';\nimport { buildOpenAIResponsesTextConfig } from './openai-request-format';\nimport {\n convertToOpenAIResponsesInput,\n convertToOpenAIResponsesTools,\n} from './responses-converter';\nimport { assembleOpenAIResponsesStream, parseOpenAIResponsesResponse } from './responses-parser';\nimport type {\n IOpenAIResponsesRequestNonStreaming,\n IOpenAIResponsesRequestStreaming,\n TOpenAIResponsesStreamEvent,\n} from './responses-types';\n\nexport interface IOpenAIResponsesChatOptions {\n client?: OpenAI;\n messages: TUniversalMessage[];\n chatOptions?: IChatOptions;\n providerOptions: IOpenAIProviderOptions;\n onTextDelta?: TTextDeltaCallback;\n}\n\ninterface IResponsesStreamMessageQueue {\n deltas: TUniversalMessage[];\n finalMessage?: TUniversalMessage;\n error?: Error;\n wake?: () => void;\n}\n\nexport async function chatWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n if (textDeltaCb) {\n return chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: textDeltaCb,\n },\n });\n }\n\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const response = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsNonStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'response',\n payload: response,\n });\n return parseOpenAIResponsesResponse(response);\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses API request failed';\n throw new Error(`OpenAI responses failed: ${errorMessage}`);\n }\n}\n\nexport async function* chatStreamWithOpenAIResponsesApi(\n input: IOpenAIResponsesChatOptions,\n): AsyncIterable<TUniversalMessage> {\n const queue: IResponsesStreamMessageQueue = { deltas: [] };\n const textDeltaCb = input.chatOptions?.onTextDelta ?? input.onTextDelta;\n const assembly = chatWithOpenAIResponsesStreamingAssembly({\n ...input,\n chatOptions: {\n ...input.chatOptions,\n onTextDelta: (delta) => {\n textDeltaCb?.(delta);\n enqueueStreamDelta(queue, createStreamDeltaMessage(delta));\n },\n },\n })\n .then((result) => finishStreamQueue(queue, result))\n .catch((error) => failStreamQueue(queue, toError(error)));\n\n yield* drainResponsesStreamQueue(queue);\n await assembly;\n}\n\nasync function chatWithOpenAIResponsesStreamingAssembly(\n input: IOpenAIResponsesChatOptions,\n): Promise<TUniversalMessage> {\n if (!input.client) {\n throw new Error('OpenAI Responses client not available.');\n }\n\n try {\n const requestParams = buildResponsesStreamingRequestParams(input);\n input.chatOptions?.onProviderNativeRawPayload?.({\n provider: 'openai',\n apiSurface: 'responses',\n payloadKind: 'request',\n payload: requestParams,\n });\n const stream = await input.client.responses.create(\n requestParams as OpenAI.Responses.ResponseCreateParamsStreaming,\n input.chatOptions?.signal ? { signal: input.chatOptions.signal } : undefined,\n );\n return assembleOpenAIResponsesStream({\n stream: observeProviderNativeRawPayloadStream(\n stream as AsyncIterable<TOpenAIResponsesStreamEvent>,\n {\n provider: 'openai',\n apiSurface: 'responses',\n onProviderNativeRawPayload: input.chatOptions?.onProviderNativeRawPayload,\n },\n ),\n onTextDelta: input.chatOptions?.onTextDelta,\n signal: input.chatOptions?.signal,\n });\n } catch (error) {\n const openaiError = error as IOpenAIError;\n const errorMessage = openaiError.message || 'OpenAI Responses streaming request failed';\n throw new Error(`OpenAI responses stream failed: ${errorMessage}`);\n }\n}\n\nfunction buildResponsesRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestNonStreaming {\n const model = input.chatOptions?.model ?? input.providerOptions.defaultModel;\n if (!model) {\n throw new Error(\n 'Model is required in chat options. Please specify a model in defaultModel configuration.',\n );\n }\n\n const tools = convertToOpenAIResponsesTools(\n input.chatOptions?.tools,\n input.providerOptions.strictTools,\n );\n const textConfig = buildOpenAIResponsesTextConfig(input.providerOptions);\n return {\n model,\n input: convertToOpenAIResponsesInput(input.messages),\n ...(tools !== undefined && { tools, tool_choice: 'auto' }),\n ...(input.chatOptions?.temperature !== undefined && {\n temperature: input.chatOptions.temperature,\n }),\n ...(input.chatOptions?.maxTokens !== undefined && {\n max_output_tokens: input.chatOptions.maxTokens,\n }),\n ...(textConfig !== undefined && { text: textConfig }),\n ...(input.providerOptions.reasoning !== undefined && {\n reasoning: input.providerOptions.reasoning,\n }),\n ...(input.providerOptions.includeEncryptedReasoning === true && {\n include: ['reasoning.encrypted_content'],\n }),\n ...(input.providerOptions.store !== undefined && { store: input.providerOptions.store }),\n };\n}\n\nfunction buildResponsesStreamingRequestParams(\n input: IOpenAIResponsesChatOptions,\n): IOpenAIResponsesRequestStreaming {\n return {\n ...buildResponsesRequestParams(input),\n stream: true,\n };\n}\n\nfunction createStreamDeltaMessage(delta: string): TUniversalMessage {\n return {\n id: randomUUID(),\n role: 'assistant',\n content: delta,\n state: 'complete',\n timestamp: new Date(),\n metadata: {\n providerApiSurface: 'responses',\n isStreamChunk: true,\n isComplete: false,\n },\n };\n}\n\nasync function* drainResponsesStreamQueue(\n queue: IResponsesStreamMessageQueue,\n): AsyncIterable<TUniversalMessage> {\n while (true) {\n const next = queue.deltas.shift();\n if (next !== undefined) {\n yield next;\n continue;\n }\n if (queue.error !== undefined) {\n throw queue.error;\n }\n if (queue.finalMessage !== undefined) {\n yield createFinalStreamMessage(queue.finalMessage);\n return;\n }\n await waitForStreamQueue(queue);\n }\n}\n\nfunction enqueueStreamDelta(queue: IResponsesStreamMessageQueue, message: TUniversalMessage): void {\n queue.deltas.push(message);\n wakeStreamQueue(queue);\n}\n\nfunction finishStreamQueue(queue: IResponsesStreamMessageQueue, result: TUniversalMessage): void {\n queue.finalMessage = result;\n wakeStreamQueue(queue);\n}\n\nfunction failStreamQueue(queue: IResponsesStreamMessageQueue, error: Error): void {\n queue.error = error;\n wakeStreamQueue(queue);\n}\n\nfunction waitForStreamQueue(queue: IResponsesStreamMessageQueue): Promise<void> {\n return new Promise((resolve) => {\n queue.wake = resolve;\n });\n}\n\nfunction wakeStreamQueue(queue: IResponsesStreamMessageQueue): void {\n queue.wake?.();\n queue.wake = undefined;\n}\n\nfunction createFinalStreamMessage(result: TUniversalMessage): TUniversalMessage {\n return {\n ...result,\n content: '',\n metadata: {\n ...result.metadata,\n isStreamChunk: true,\n isComplete: true,\n },\n };\n}\n\nfunction toError(error: Error | string): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n","import OpenAI from 'openai';\nimport type { IOpenAIProviderOptions, TOpenAIApiSurface } from './types';\nimport { AbstractAIProvider } from '@robota-sdk/agent-core';\nimport type {\n TUniversalMessage,\n IChatOptions,\n IAssistantMessage,\n IProviderCapabilities,\n TTextDeltaCallback,\n} from '@robota-sdk/agent-core';\nimport type { IPayloadLogger } from './interfaces/payload-logger';\nimport { OpenAIResponseParser } from './parsers/response-parser';\nimport { SilentLogger } from '@robota-sdk/agent-core';\nimport {\n chatStreamWithOpenAIChatCompletions,\n chatWithOpenAIChatCompletions,\n} from './chat-completions-chat';\nimport { chatStreamWithOpenAIResponsesApi, chatWithOpenAIResponsesApi } from './responses-chat';\n\n/**\n * OpenAI provider implementation for Robota\n *\n * Provides integration with OpenAI models through the Robota provider contract.\n * Uses OpenAI SDK native types internally for optimal performance and feature support.\n *\n * @public\n */\nexport class OpenAIProvider extends AbstractAIProvider {\n override readonly name = 'openai';\n override readonly version = '1.0.0';\n\n private readonly client?: OpenAI;\n private readonly options: IOpenAIProviderOptions;\n private readonly apiSurface: TOpenAIApiSurface;\n private readonly payloadLogger: IPayloadLogger | undefined;\n private readonly responseParser: OpenAIResponseParser;\n\n /**\n * Optional callback for text deltas during streaming.\n * Set by the consumer (e.g., Session) to receive real-time text chunks.\n * When set, chat() uses streaming internally while still returning\n * the complete assembled message.\n */\n onTextDelta?: TTextDeltaCallback;\n\n constructor(options: IOpenAIProviderOptions) {\n super(options.logger || SilentLogger);\n this.options = options;\n this.apiSurface = resolveApiSurface(options);\n validateOpenAIProviderNativeWebTools(this.apiSurface, options.nativeWebTools);\n\n if (options.executor) {\n this.executor = options.executor;\n }\n\n if (!this.executor) {\n if (options.client) {\n this.client = options.client;\n } else if (options.apiKey) {\n this.client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.organization && { organization: options.organization }),\n ...(options.timeout && { timeout: options.timeout }),\n ...(options.baseURL && { baseURL: options.baseURL }),\n });\n } else {\n throw new Error('Either OpenAI client, apiKey, or executor is required');\n }\n }\n\n this.responseParser = new OpenAIResponseParser(this.logger);\n this.payloadLogger = options.payloadLogger;\n }\n\n override async chat(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): Promise<TUniversalMessage> {\n this.validateMessages(messages);\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n return await this.executeViaExecutorOrDirect(messages, options);\n } catch (error) {\n this.logger.error(\n 'OpenAI Provider executor chat error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n return chatWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n }\n\n return chatWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override async *chatStream(\n messages: TUniversalMessage[],\n options?: IChatOptions,\n ): AsyncIterable<TUniversalMessage> {\n this.validateNativeWebTools(options?.nativeWebTools);\n\n if (this.executor) {\n try {\n yield* this.executeStreamViaExecutorOrDirect(messages, options);\n return;\n } catch (error) {\n this.logger.error(\n 'OpenAI Provider executor stream error:',\n error instanceof Error ? error.message : String(error),\n );\n throw error;\n }\n }\n\n if (this.apiSurface === 'responses') {\n yield* chatStreamWithOpenAIResponsesApi({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n onTextDelta: this.onTextDelta,\n });\n return;\n }\n\n yield* chatStreamWithOpenAIChatCompletions({\n client: this.client,\n messages,\n chatOptions: options,\n providerOptions: this.options,\n payloadLogger: this.payloadLogger,\n responseParser: this.responseParser,\n onTextDelta: this.onTextDelta,\n });\n }\n\n override supportsTools(): boolean {\n return true;\n }\n\n override getCapabilities(): IProviderCapabilities {\n const source =\n this.apiSurface === 'chat-completions'\n ? 'openai-compatible-chat-completions'\n : 'openai-responses';\n return {\n functionCalling: { supported: true },\n nativeWebTools: {\n webSearch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, 'search'),\n },\n webFetch: {\n supported: false,\n enabled: false,\n source,\n reason: getOpenAIUnsupportedNativeWebReason(this.apiSurface, 'fetch'),\n },\n },\n };\n }\n\n override validateConfig(): boolean {\n return !!this.client && !!this.options;\n }\n\n override async dispose(): Promise<void> {\n // OpenAI client doesn't need explicit cleanup\n }\n\n protected override validateMessages(messages: TUniversalMessage[]): void {\n super.validateMessages(messages);\n\n for (const message of messages) {\n if (message.role === 'assistant') {\n const assistantMsg = message as IAssistantMessage;\n if (\n assistantMsg.toolCalls &&\n assistantMsg.toolCalls.length > 0 &&\n assistantMsg.content === ''\n ) {\n continue;\n }\n }\n }\n }\n}\n\nfunction resolveApiSurface(options: IOpenAIProviderOptions): TOpenAIApiSurface {\n if (options.apiSurface !== undefined) {\n return options.apiSurface;\n }\n return options.baseURL ? 'chat-completions' : 'responses';\n}\n\nfunction getOpenAIUnsupportedNativeWebReason(\n apiSurface: TOpenAIApiSurface,\n toolKind: 'search' | 'fetch',\n): string {\n if (apiSurface === 'chat-completions') {\n return `OpenAI-compatible Chat Completions endpoints support declared function tools, not provider-native web ${toolKind}.`;\n }\n return `OpenAI Responses native web ${toolKind} is not wired in this Robota provider version.`;\n}\n\nfunction validateOpenAIProviderNativeWebTools(\n apiSurface: TOpenAIApiSurface,\n nativeWebTools: IOpenAIProviderOptions['nativeWebTools'],\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n throw new Error(\n `Provider openai native web search/fetch is not supported for apiSurface ${apiSurface} in this Robota provider version.`,\n );\n}\n","import OpenAI from 'openai';\nimport type { TUniversalMessage, IAssistantMessage } from '@robota-sdk/agent-core';\n\n/**\n * OpenAI Conversation Adapter\n *\n * Converts between TUniversalMessage format and OpenAI native types.\n * Provides bidirectional conversion for seamless integration.\n *\n * @public\n */\nexport class OpenAIConversationAdapter {\n /**\n * Filter messages for OpenAI compatibility\n *\n * OpenAI has specific requirements:\n * - Tool messages must have valid toolCallId\n * - Messages must be in proper sequence\n * - Tool messages without toolCallId should be excluded\n */\n static filterMessagesForOpenAI(messages: TUniversalMessage[]): TUniversalMessage[] {\n return messages.filter((msg) => {\n // Always include user, assistant, and system messages\n if (msg.role === 'user' || msg.role === 'assistant' || msg.role === 'system') {\n return true;\n }\n\n // For tool messages, only include if they have a valid toolCallId\n if (msg.role === 'tool') {\n // Must have toolCallId and it must not be empty or 'unknown'\n return !!(msg.toolCallId && msg.toolCallId.trim() !== '' && msg.toolCallId !== 'unknown');\n }\n\n return false;\n });\n }\n\n /**\n * Convert TUniversalMessage array to OpenAI message format\n * Now properly handles tool messages for OpenAI's tool calling feature\n */\n static toOpenAIFormat(messages: TUniversalMessage[]): OpenAI.Chat.ChatCompletionMessageParam[] {\n // First filter messages for OpenAI compatibility\n const filteredMessages = this.filterMessagesForOpenAI(messages);\n return filteredMessages.map((msg) => this.convertMessage(msg));\n }\n\n /**\n * Convert a single TUniversalMessage to OpenAI format\n * Handles all message types including tool messages\n */\n static convertMessage(msg: TUniversalMessage): OpenAI.Chat.ChatCompletionMessageParam {\n const messageRole = msg.role;\n\n if (messageRole === 'user') {\n return {\n role: 'user',\n content: msg.content,\n };\n }\n\n if (messageRole === 'assistant') {\n const assistantMsg = msg as IAssistantMessage;\n\n // Handle tool_calls format\n if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n const result: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n role: 'assistant',\n // CRITICAL: OpenAI API requires content to be null (not empty string) when tool_calls are present\n // VERIFIED: 2024-12 - This prevents \"400 Bad Request\" errors from OpenAI API\n // DO NOT CHANGE without testing against actual OpenAI API\n content: assistantMsg.content === '' ? null : assistantMsg.content || null,\n tool_calls: assistantMsg.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function',\n function: {\n name: toolCall.function.name,\n arguments: toolCall.function.arguments,\n },\n })),\n };\n return result;\n }\n\n // Regular assistant message (without tool calls)\n // VERIFIED: OpenAI accepts both null and string content for regular messages\n // We preserve null when content is null or empty string for API consistency\n return {\n role: 'assistant',\n content:\n assistantMsg.content === null\n ? null\n : assistantMsg.content === ''\n ? null\n : assistantMsg.content || '',\n };\n }\n\n if (messageRole === 'system') {\n return {\n role: 'system',\n content: msg.content,\n };\n }\n\n // Handle tool messages for OpenAI tool calling\n if (messageRole === 'tool') {\n if (!msg.toolCallId || msg.toolCallId.trim() === '') {\n throw new Error(`Tool message missing toolCallId: ${JSON.stringify(msg)}`);\n }\n\n const result: OpenAI.Chat.ChatCompletionToolMessageParam = {\n role: 'tool',\n content: msg.content,\n tool_call_id: msg.toolCallId,\n };\n return result;\n }\n\n const exhaustive: never = messageRole;\n throw new Error(`Unsupported message role: ${exhaustive}`);\n }\n\n /**\n * Add system prompt to message array if needed\n */\n static addSystemPromptIfNeeded(\n messages: OpenAI.Chat.ChatCompletionMessageParam[],\n systemPrompt?: string,\n ): OpenAI.Chat.ChatCompletionMessageParam[] {\n if (!systemPrompt) {\n return messages;\n }\n\n // Check if system message already exists\n const hasSystemMessage = messages.some((msg) => msg.role === 'system');\n\n if (hasSystemMessage) {\n return messages;\n }\n\n // Add system prompt at the beginning\n return [{ role: 'system', content: systemPrompt }, ...messages];\n }\n}\n","import type {\n IProviderModelCatalog,\n IProviderModelCatalogEntry,\n IProviderProfileConfig,\n} from '@robota-sdk/agent-core';\n\nconst OPENAI_MODELS_ENDPOINT = 'https://api.openai.com/v1/models';\nconst OPENAI_MODELS_SOURCE_URL = 'https://platform.openai.com/docs/api-reference/models/list';\n\nexport interface IOpenAIModelCatalogResponse {\n data?: readonly IOpenAIModelCatalogResource[];\n}\n\nexport interface IOpenAIModelCatalogResource {\n id?: string;\n}\n\nexport interface IOpenAIModelCatalogFetchInit {\n headers: Record<string, string>;\n}\n\nexport interface IOpenAIModelCatalogFetchResponse {\n ok: boolean;\n status: number;\n statusText?: string;\n json: () => Promise<IOpenAIModelCatalogResponse>;\n}\n\nexport type TOpenAIModelCatalogFetch = (\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n) => Promise<IOpenAIModelCatalogFetchResponse>;\n\nexport interface IRefreshOpenAIModelCatalogOptions {\n fetcher?: TOpenAIModelCatalogFetch;\n now?: () => Date;\n}\n\nexport async function refreshOpenAIModelCatalog(\n profile: IProviderProfileConfig,\n options: IRefreshOpenAIModelCatalogOptions = {},\n): Promise<IProviderModelCatalog> {\n if (!profile.apiKey) {\n return createUnavailableCatalog('OpenAI model catalog refresh requires apiKey.');\n }\n\n const fetcher = options.fetcher ?? defaultOpenAIModelCatalogFetch;\n const now = options.now ?? (() => new Date());\n const url = resolveModelsEndpoint(profile.baseURL);\n\n try {\n const response = await fetcher(url, {\n headers: { Authorization: `Bearer ${profile.apiKey}` },\n });\n if (!response.ok) {\n return createUnavailableCatalog(formatHttpFailure(response));\n }\n\n const body = await response.json();\n const entries = toModelCatalogEntries(body);\n return {\n status: 'live',\n entries,\n lastVerifiedAt: now().toISOString(),\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message: `${entries.length} OpenAI model(s) discovered.`,\n };\n } catch (error) {\n return createUnavailableCatalog(error instanceof Error ? error.message : String(error));\n }\n}\n\nfunction resolveModelsEndpoint(baseURL: string | undefined): string {\n if (!baseURL) return OPENAI_MODELS_ENDPOINT;\n return `${baseURL.replace(/\\/$/, '')}/models`;\n}\n\nfunction toModelCatalogEntries(\n body: IOpenAIModelCatalogResponse,\n): readonly IProviderModelCatalogEntry[] {\n return (body.data ?? [])\n .map((model) => model.id)\n .filter((id): id is string => id !== undefined && id.trim().length > 0)\n .map((id) => ({\n id,\n displayName: id,\n lifecycle: 'active',\n }));\n}\n\nfunction formatHttpFailure(response: IOpenAIModelCatalogFetchResponse): string {\n const statusText = response.statusText ? ` ${response.statusText}` : '';\n return `OpenAI model catalog refresh failed: HTTP ${response.status}${statusText}`;\n}\n\nfunction createUnavailableCatalog(message: string): IProviderModelCatalog {\n return {\n status: 'unavailable',\n sourceUrl: OPENAI_MODELS_SOURCE_URL,\n message,\n };\n}\n\nasync function defaultOpenAIModelCatalogFetch(\n url: string,\n init: IOpenAIModelCatalogFetchInit,\n): Promise<IOpenAIModelCatalogFetchResponse> {\n const response = await fetch(url, init);\n return {\n ok: response.ok,\n status: response.status,\n statusText: response.statusText,\n json: () => response.json() as Promise<IOpenAIModelCatalogResponse>,\n };\n}\n","import type { IProviderDefinition, TUniversalValue } from '@robota-sdk/agent-core';\nimport { probeOpenAICompatibleProfile } from '../shared/openai-compatible/index.js';\nimport { refreshOpenAIModelCatalog } from './model-catalog-refresh';\nimport { OpenAIProvider } from './provider';\nimport type { IOpenAINativeWebToolsOptions, TOpenAIApiSurface } from './types';\n\nexport const DEFAULT_OPENAI_PROVIDER_MODEL: string | undefined = undefined;\nexport const DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE = '$ENV:OPENAI_API_KEY';\nconst OPENAI_API_KEY_URL = 'https://platform.openai.com/api-keys';\nconst OPENAI_SETUP_SOURCE_URL =\n 'https://developers.openai.com/api/reference/overview#authentication';\nconst OPENAI_SETUP_LAST_VERIFIED_AT = '2026-05-08';\nconst OPENAI_SETUP_HELP_LINKS: NonNullable<IProviderDefinition['setupHelpLinks']> = [\n {\n kind: 'api-key',\n label: 'OpenAI API keys',\n url: OPENAI_API_KEY_URL,\n sourceUrl: OPENAI_SETUP_SOURCE_URL,\n lastVerifiedAt: OPENAI_SETUP_LAST_VERIFIED_AT,\n },\n];\n\nexport function createOpenAIProviderDefinition(): IProviderDefinition {\n return {\n type: 'openai',\n displayName: 'OpenAI',\n description: 'Official OpenAI Responses API provider',\n defaults: {\n apiKey: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n },\n modelCatalog: {\n status: 'unavailable',\n sourceUrl: 'https://platform.openai.com/docs/api-reference/models/list',\n message: 'OpenAI model availability should be discovered live from GET /v1/models.',\n },\n setupHelpLinks: OPENAI_SETUP_HELP_LINKS,\n setupSteps: [\n {\n key: 'model',\n title: 'OpenAI model',\n required: true,\n },\n {\n key: 'apiKey',\n title: 'OpenAI API key',\n defaultValue: DEFAULT_OPENAI_PROVIDER_API_KEY_REFERENCE,\n masked: true,\n },\n ],\n requiresApiKey: true,\n probeProfile: probeOpenAICompatibleProfile,\n refreshModelCatalog: ({ profile }) => refreshOpenAIModelCatalog(profile),\n modelCatalogCacheTtlSeconds: 86400,\n createProvider: (config) => {\n const apiSurface = readApiSurface(config.options);\n const nativeWebTools = readNativeWebTools(config.options);\n validateOpenAINativeWebTools(config.baseURL, apiSurface, nativeWebTools);\n return new OpenAIProvider({\n apiKey: requireApiKey(config.apiKey),\n ...(config.baseURL !== undefined && { baseURL: config.baseURL }),\n ...(config.timeout !== undefined && { timeout: config.timeout }),\n ...(apiSurface !== undefined && { apiSurface }),\n ...(nativeWebTools !== undefined && { nativeWebTools }),\n defaultModel: config.model,\n });\n },\n };\n}\n\nfunction requireApiKey(apiKey: string | undefined): string {\n if (!apiKey) {\n throw new Error('Provider openai requires apiKey');\n }\n return apiKey;\n}\n\nfunction readApiSurface(\n options: Record<string, TUniversalValue> | undefined,\n): TOpenAIApiSurface | undefined {\n const apiSurface = options?.['apiSurface'];\n if (apiSurface === 'responses' || apiSurface === 'chat-completions') {\n return apiSurface;\n }\n return undefined;\n}\n\nfunction readNativeWebTools(\n options: Record<string, TUniversalValue> | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n const nativeWebTools =\n readNativeWebToolsRecord(options?.['nativeWebTools']) ??\n readNativeWebToolsRecord(options?.['builtInWebTools']);\n if (nativeWebTools === undefined) {\n return undefined;\n }\n return nativeWebTools;\n}\n\nfunction readNativeWebToolsRecord(\n value: TUniversalValue | undefined,\n): IOpenAINativeWebToolsOptions | undefined {\n if (value === null || value === undefined || value instanceof Date || Array.isArray(value)) {\n return undefined;\n }\n if (typeof value !== 'object') {\n return undefined;\n }\n const webSearch = value['webSearch'];\n const webFetch = value['webFetch'];\n return {\n ...(typeof webSearch === 'boolean' && { webSearch }),\n ...(typeof webFetch === 'boolean' && { webFetch }),\n };\n}\n\nfunction validateOpenAINativeWebTools(\n baseURL: string | undefined,\n apiSurface: TOpenAIApiSurface | undefined,\n nativeWebTools: IOpenAINativeWebToolsOptions | undefined,\n): void {\n if (nativeWebTools?.webSearch !== true && nativeWebTools?.webFetch !== true) {\n return;\n }\n if (baseURL !== undefined || apiSurface === 'chat-completions') {\n throw new Error(\n '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.',\n );\n }\n throw new Error(\n '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.',\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./chunk-Bmb41Sf3.cjs`);let e=require(`node:crypto`),t=require(`@robota-sdk/agent-core`);function n(e){return e.map(e=>i(e))}function r(e){return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function i(e){if(e.role===`user`)return{role:`user`,content:e.content||``};if(e.role===`assistant`)return a(e);if(e.role===`system`)return{role:`system`,content:e.content||``};if(e.role===`tool`){if(!e.toolCallId||e.toolCallId.trim().length===0)throw Error(`Tool message missing toolCallId: ${JSON.stringify(e)}`);return{role:`tool`,content:e.content||``,tool_call_id:e.toolCallId}}throw Error(`Unsupported message role: ${JSON.stringify(e)}`)}function a(e){return e.toolCalls&&e.toolCalls.length>0?{role:`assistant`,content:e.content===``?null:e.content||null,tool_calls:e.toolCalls.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))}:{role:`assistant`,content:e.content===null?null:e.content||``}}var o=class{logger;textProjector;toolCallTextProjector;constructor(e={}){this.logger=e.logger??t.SilentLogger,this.textProjector=e.textProjector,this.toolCallTextProjector=e.toolCallTextProjector}parseResponse(e){try{let t=e.choices?.[0];if(!t)throw Error(`No choices found in OpenAI-compatible response`);return this.parseChoice(t,e.usage)}catch(e){let t=e instanceof Error?e.message:`OpenAI-compatible response parsing failed`;throw this.logger.error(`Response parsing failed`,{error:t}),Error(`OpenAI-compatible response parsing failed: ${t}`)}}parseChoice(t,n){let r=t.message,i=this.projectToolCallText(r.content||``),a=this.toolCallTextProjector?.flush(),o=this.parseNativeToolCalls(r),s=[...i.toolCalls,...a?.toolCalls??[]],c=[...o,...s];return{id:(0,e.randomUUID)(),state:`complete`,role:`assistant`,content:this.projectText(i.visibleText+(a?.visibleText??``)),timestamp:new Date,...c.length>0&&{toolCalls:c},...n&&{usage:this.parseUsage(n)},metadata:{finishReason:t.finish_reason||void 0,...this.buildToolTextMetadata(i,a)}}}parseNativeToolCalls(e){return e.tool_calls?.map(e=>({id:e.id,type:`function`,function:{name:e.function.name,arguments:e.function.arguments}}))||[]}parseUsage(e){return{promptTokens:e.prompt_tokens,completionTokens:e.completion_tokens,totalTokens:e.total_tokens}}parseStreamingChunk(t){try{let n=t.choices?.[0];if(!n)return null;let r=n.finish_reason,i=n.delta.tool_calls?.map(e=>({id:e.id||``,type:`function`,function:{name:e.function?.name||``,arguments:e.function?.arguments||``}}));return i?{id:(0,e.randomUUID)(),state:`complete`,role:`assistant`,content:``,timestamp:new Date,toolCalls:i,metadata:{isStreamChunk:!0,isComplete:r===`stop`||r===`tool_calls`}}:{id:(0,e.randomUUID)(),state:`complete`,role:`assistant`,content:this.projectText(n.delta.content||``),timestamp:new Date,metadata:{isStreamChunk:!0,isComplete:r===`stop`||r===`tool_calls`}}}catch(e){let t=e instanceof Error?e.message:`OpenAI-compatible chunk parsing failed`;throw this.logger.error(`Chunk parsing failed`,{error:t}),Error(`OpenAI-compatible chunk parsing failed: ${t}`)}}projectText(e){return this.textProjector?this.textProjector(e):e}projectToolCallText(e){return this.toolCallTextProjector?.project(e)??{visibleText:e,toolCalls:[],removedToolCallText:!1}}buildToolTextMetadata(e,t){let n=[e.rawToolCallText,t?.rawToolCallText].filter(e=>typeof e==`string`&&e.length>0).join(``);return{...(e.removedToolCallText||(t?.removedToolCallText??!1))&&{toolCallTextProjected:!0},...n.length>0&&{rawToolCallText:n}}}};async function s(e){let t={textParts:[],toolCallParts:new Map,projectedToolCalls:[],rawToolCallTextParts:[],toolCallTextProjected:!1,model:``,finishReason:null};for await(let n of v(e.stream,e.signal))c(t,n,e);return d(t,e),h(t,e.metadata)}function c(e,t,n){t.model&&(e.model=t.model);let r=t.choices?.[0];r&&(e.finishReason=r.finish_reason??e.finishReason,l(e,r.delta.content,n),m(e,r.delta.tool_calls??[]))}function l(e,t,n){if(!t)return;let r=f(t,n.toolCallTextProjector);p(e,r);let i=u(r.visibleText,n.textProjector);i.length!==0&&(e.textParts.push(i),n.onTextDelta?.(i))}function u(e,t){return t?t(e):e}function d(e,t){let n=t.toolCallTextProjector?.flush();if(n){p(e,n);let r=u(n.visibleText,t.textProjector);r.length>0&&(e.textParts.push(r),t.onTextDelta?.(r))}let r=t.textProjectorFlush?.();r&&(e.textParts.push(r),t.onTextDelta?.(r))}function f(e,t){return t?.project(e)??{visibleText:e,toolCalls:[],removedToolCallText:!1}}function p(e,t){t.toolCalls.length>0&&e.projectedToolCalls.push(...t.toolCalls),t.removedToolCallText&&(e.toolCallTextProjected=!0),t.rawToolCallText&&t.rawToolCallText.length>0&&e.rawToolCallTextParts.push(t.rawToolCallText)}function m(e,t){for(let n of t){let t=n.index??0,r=e.toolCallParts.get(t)??{id:``,name:``,arguments:``},i=n.function?.name??r.name;e.toolCallParts.set(t,{id:n.id??r.id,name:i,arguments:r.arguments+(n.function?.arguments??``)})}}function h(t,n={}){let r={...n};t.model&&(r.model=t.model),t.finishReason&&(r.finishReason=t.finishReason),t.toolCallTextProjected&&(r.toolCallTextProjected=!0),t.rawToolCallTextParts.length>0&&(r.rawToolCallText=t.rawToolCallTextParts.join(``));let i=g(t);return{id:(0,e.randomUUID)(),role:`assistant`,content:t.textParts.join(``),state:`complete`,timestamp:new Date,...i.length>0&&{toolCalls:i},...Object.keys(r).length>0&&{metadata:r}}}function g(e){return[..._(e.toolCallParts),...e.projectedToolCalls]}function _(e){return Array.from(e.entries()).sort(([e],[t])=>e-t).map(([e,t])=>({id:t.id||`call_${e}`,type:`function`,function:{name:t.name,arguments:t.arguments||`{}`}}))}async function*v(e,t){let n=e[Symbol.asyncIterator]();try{for(;!t?.aborted;){let e=await y(n,t);if(e.done||(await b(t),t?.aborted))break;yield e.value}}finally{t?.aborted&&await n.return?.()}}async function y(e,t){if(!t)return e.next();if(t.aborted)return{done:!0,value:void 0};let n,r=new Promise(e=>{n=()=>e({done:!0,value:void 0}),t.addEventListener(`abort`,n,{once:!0})});try{return await Promise.race([e.next(),r])}finally{n&&t.removeEventListener(`abort`,n)}}async function b(e){e?.aborted||await new Promise(e=>setTimeout(e,0))}async function*x(e,t){let n=t.initialSequence??0;for await(let r of e)t.onProviderNativeRawPayload?.({provider:t.provider,...t.apiSurface!==void 0&&{apiSurface:t.apiSurface},payloadKind:`stream_event`,sequence:n,payload:r}),n++,yield r}async function S(e,t=C){if(!e.baseURL)return{ok:!0,message:`Profile fields are valid; no endpoint probe configured.`};try{let n=await t(`${e.baseURL.replace(/\/$/,``)}/models`);if(!n.ok)return{ok:!1,message:`HTTP ${n.status}`};let r=((await n.json()).data??[]).map(e=>e.id).filter(e=>!!e);return{ok:!0,message:`${r.length} model(s) discovered`,models:r}}catch(e){return{ok:!1,message:e instanceof Error?e.message:String(e)}}}async function C(e){let t=await fetch(e);return{ok:t.ok,status:t.status,json:()=>t.json()}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return S}});
|