@robota-sdk/agent-provider-openai 3.0.0-beta.81 → 3.0.0-beta.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/node/index.d.cts +2 -2
- package/dist/node/index.d.ts +2 -2
- package/dist/node/loggers/index.d.cts +2 -2
- package/dist/node/loggers/index.d.ts +2 -2
- package/dist/node/loggers/index.js.map +1 -1
- package/package.json +8 -3
- package/src/openai/index.ts +1 -1
- package/src/openai/loggers/console-payload-logger.ts +1 -1
- package/src/openai/loggers/console.ts +1 -1
- package/src/openai/loggers/file-payload-logger.ts +1 -1
- package/src/openai/loggers/file.ts +1 -1
- package/src/openai/types.ts +2 -2
package/dist/node/index.d.cts
CHANGED
|
@@ -150,14 +150,14 @@ interface IOpenAIProviderOptions {
|
|
|
150
150
|
* @example
|
|
151
151
|
* ```typescript
|
|
152
152
|
* // Node.js
|
|
153
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
153
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
154
154
|
* const provider = new OpenAIProvider({
|
|
155
155
|
* client: openaiClient,
|
|
156
156
|
* payloadLogger: new FilePayloadLogger({ logDir: './logs/openai' })
|
|
157
157
|
* });
|
|
158
158
|
*
|
|
159
159
|
* // Browser
|
|
160
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
160
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
161
161
|
* const provider = new OpenAIProvider({
|
|
162
162
|
* client: openaiClient,
|
|
163
163
|
* payloadLogger: new ConsolePayloadLogger()
|
package/dist/node/index.d.ts
CHANGED
|
@@ -150,14 +150,14 @@ interface IOpenAIProviderOptions {
|
|
|
150
150
|
* @example
|
|
151
151
|
* ```typescript
|
|
152
152
|
* // Node.js
|
|
153
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
153
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
154
154
|
* const provider = new OpenAIProvider({
|
|
155
155
|
* client: openaiClient,
|
|
156
156
|
* payloadLogger: new FilePayloadLogger({ logDir: './logs/openai' })
|
|
157
157
|
* });
|
|
158
158
|
*
|
|
159
159
|
* // Browser
|
|
160
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
160
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
161
161
|
* const provider = new OpenAIProvider({
|
|
162
162
|
* client: openaiClient,
|
|
163
163
|
* payloadLogger: new ConsolePayloadLogger()
|
|
@@ -9,7 +9,7 @@ import { ILogger } from "@robota-sdk/agent-core";
|
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
11
|
* ```typescript
|
|
12
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
12
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
13
13
|
*
|
|
14
14
|
* const logger = new FilePayloadLogger({
|
|
15
15
|
* logDir: './logs/api-payloads',
|
|
@@ -60,7 +60,7 @@ declare class FilePayloadLogger implements IPayloadLogger {
|
|
|
60
60
|
*
|
|
61
61
|
* @example
|
|
62
62
|
* ```typescript
|
|
63
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
63
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
64
64
|
*
|
|
65
65
|
* const logger = new ConsolePayloadLogger({
|
|
66
66
|
* enabled: true,
|
|
@@ -9,7 +9,7 @@ import { ILogger } from "@robota-sdk/agent-core";
|
|
|
9
9
|
*
|
|
10
10
|
* @example
|
|
11
11
|
* ```typescript
|
|
12
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
12
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
13
13
|
*
|
|
14
14
|
* const logger = new FilePayloadLogger({
|
|
15
15
|
* logDir: './logs/api-payloads',
|
|
@@ -60,7 +60,7 @@ declare class FilePayloadLogger implements IPayloadLogger {
|
|
|
60
60
|
*
|
|
61
61
|
* @example
|
|
62
62
|
* ```typescript
|
|
63
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
63
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
64
64
|
*
|
|
65
65
|
* const logger = new ConsolePayloadLogger({
|
|
66
66
|
* enabled: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/openai/loggers/sanitize-openai-log-data.ts","../../../src/openai/loggers/file-payload-logger.ts","../../../src/openai/loggers/console-payload-logger.ts"],"sourcesContent":["import type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Creates a defensive deep copy of OpenAI log data.\n * SSOT utility shared by payload loggers.\n */\nexport function sanitizeOpenAILogData(payload: IOpenAILogData): IOpenAILogData {\n // Create a deep copy to avoid modifying original\n const sanitized = JSON.parse(JSON.stringify(payload)) as IOpenAILogData;\n\n // Remove or mask sensitive data if needed.\n // For now, we keep everything as OpenAI payloads don't contain API keys.\n return sanitized;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { SilentLogger } from '@robota-sdk/agent-core';\n\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\nimport type { IPayloadLogger } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\nimport type { ILogger } from '@robota-sdk/agent-core';\n\n/** Owner-only access — no group or other bits (SEC-003 / CWE-377). */\nconst OWNER_ONLY_FILE_MODE = 0o600;\nconst OWNER_ONLY_DIR_MODE = 0o700;\n\n/**\n * File-based payload logger for Node.js environments\n *\n * This logger saves API request/response payloads to JSON files on disk.\n * It's designed specifically for Node.js environments with filesystem access.\n *\n * @example\n * ```typescript\n * import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/openai/loggers/sanitize-openai-log-data.ts","../../../src/openai/loggers/file-payload-logger.ts","../../../src/openai/loggers/console-payload-logger.ts"],"sourcesContent":["import type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Creates a defensive deep copy of OpenAI log data.\n * SSOT utility shared by payload loggers.\n */\nexport function sanitizeOpenAILogData(payload: IOpenAILogData): IOpenAILogData {\n // Create a deep copy to avoid modifying original\n const sanitized = JSON.parse(JSON.stringify(payload)) as IOpenAILogData;\n\n // Remove or mask sensitive data if needed.\n // For now, we keep everything as OpenAI payloads don't contain API keys.\n return sanitized;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nimport { SilentLogger } from '@robota-sdk/agent-core';\n\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\nimport type { IPayloadLogger } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\nimport type { ILogger } from '@robota-sdk/agent-core';\n\n/** Owner-only access — no group or other bits (SEC-003 / CWE-377). */\nconst OWNER_ONLY_FILE_MODE = 0o600;\nconst OWNER_ONLY_DIR_MODE = 0o700;\n\n/**\n * File-based payload logger for Node.js environments\n *\n * This logger saves API request/response payloads to JSON files on disk.\n * It's designed specifically for Node.js environments with filesystem access.\n *\n * @example\n * ```typescript\n * import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';\n *\n * const logger = new FilePayloadLogger({\n * logDir: './logs/api-payloads',\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class FilePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly logDir: string;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: {\n logDir: string;\n enabled?: boolean;\n includeTimestamp?: boolean;\n logger?: ILogger;\n }) {\n this.enabled = options.enabled ?? true;\n this.logDir = options.logDir;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n\n if (this.enabled) {\n this.ensureLogDirectoryExists();\n }\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to file\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = this.includeTimestamp\n ? `openai-${type}-${timestamp}.json`\n : `openai-${type}-${Date.now()}.json`;\n\n const filepath = path.join(this.logDir, filename);\n\n const logData = {\n timestamp: new Date().toISOString(),\n type,\n provider: 'openai',\n payload: sanitizeOpenAILogData(payload),\n };\n\n // SEC-003: payload logs contain prompt/response content and `logDir` is\n // caller-supplied, so create them owner-only rather than under the process umask.\n await fs.promises.writeFile(filepath, JSON.stringify(logData, null, 2), {\n encoding: 'utf8',\n mode: OWNER_ONLY_FILE_MODE,\n });\n\n // Payload saved successfully (silent operation)\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error('[FilePayloadLogger] Failed to save payload log:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n /**\n * Ensure log directory exists\n */\n private ensureLogDirectoryExists(): void {\n try {\n if (!fs.existsSync(this.logDir)) {\n fs.mkdirSync(this.logDir, { recursive: true, mode: OWNER_ONLY_DIR_MODE });\n }\n } catch (error) {\n this.logger.error('[FilePayloadLogger] Failed to create log directory:', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n","import { SilentLogger, type ILogger } from '@robota-sdk/agent-core';\n\nimport { sanitizeOpenAILogData } from './sanitize-openai-log-data';\n\nimport type { IPayloadLogger, IPayloadLoggerOptions } from '../interfaces/payload-logger';\nimport type { IOpenAILogData } from '../types/api-types';\n\n/**\n * Console-based payload logger for browser environments\n *\n * This logger outputs API request/response payloads to the browser console\n * using structured logging. It's designed specifically for browser environments\n * and development/debugging scenarios.\n *\n * @example\n * ```typescript\n * import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';\n *\n * const logger = new ConsolePayloadLogger({\n * enabled: true,\n * includeTimestamp: true\n * });\n *\n * const provider = new OpenAIProvider({\n * client: openaiClient,\n * payloadLogger: logger\n * });\n * ```\n */\nexport class ConsolePayloadLogger implements IPayloadLogger {\n private readonly enabled: boolean;\n private readonly includeTimestamp: boolean;\n private readonly logger: ILogger;\n\n constructor(options: IPayloadLoggerOptions = {}) {\n this.enabled = options.enabled ?? true;\n this.includeTimestamp = options.includeTimestamp ?? true;\n this.logger = options.logger || SilentLogger;\n }\n\n /**\n * Check if logging is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Log API payload to browser console\n * @param payload - The API request payload\n * @param type - Type of request ('chat' or 'stream')\n */\n async logPayload(payload: IOpenAILogData, type: 'chat' | 'stream' = 'chat'): Promise<void> {\n if (!this.enabled) {\n return;\n }\n\n try {\n const sanitizedPayload = sanitizeOpenAILogData(payload);\n\n // Use structured console logging for better browser developer tools integration\n const title = `[OpenAI ${type.toUpperCase()}] API Payload`;\n const timeInfo = this.includeTimestamp ? ` (${sanitizedPayload.timestamp})` : '';\n\n // Group related log entries for better organization\n this.logger.group?.(`${title}${timeInfo}`);\n\n // Log different aspects with appropriate console methods\n this.logger.info('📋 Request Details:', {\n model: payload.model,\n messagesCount: payload.messagesCount,\n hasTools: payload.hasTools,\n temperature: payload.temperature,\n maxTokens: payload.maxTokens,\n });\n\n this.logger.debug('🔍 Full Payload:', { type, provider: 'openai', ...sanitizedPayload });\n\n this.logger.groupEnd?.();\n } catch (error) {\n // Don't throw errors - just log them and continue\n // This ensures that API logging failures don't break the main functionality\n this.logger.error(\n '[ConsolePayloadLogger] Failed to log payload:',\n error instanceof Error ? error.message : 'Unknown error',\n );\n }\n }\n\n /**\n * Sanitize payload to remove sensitive information\n * @param payload - Raw payload object\n * @returns Sanitized payload\n */\n // Sanitization intentionally lives in ./sanitize-openai-log-data.ts (SSOT utility).\n}\n"],"mappings":"kGAMA,SAAgB,EAAsB,EAAyC,CAM7E,OAJkB,KAAK,MAAM,KAAK,UAAU,CAAO,CAIpC,CACjB,CCwBA,IAAa,EAAb,KAAyD,CACvD,QACA,OACA,iBACA,OAEA,YAAY,EAKT,CACD,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,OAAS,EAAQ,OACtB,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,EAE5B,KAAK,SACP,KAAK,yBAAyB,CAElC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAY,IAAI,KAAK,CAAA,CAAE,YAAY,CAAC,CAAC,QAAQ,QAAS,GAAG,EACzD,EAAW,KAAK,iBAClB,UAAU,EAAK,GAAG,EAAU,OAC5B,UAAU,EAAK,GAAG,KAAK,IAAI,EAAE,OAE3B,EAAW,EAAK,KAAK,KAAK,OAAQ,CAAQ,EAE1C,EAAU,CACd,UAAW,IAAI,KAAK,CAAA,CAAE,YAAY,EAClC,OACA,SAAU,SACV,QAAS,EAAsB,CAAO,CACxC,EAIA,MAAM,EAAG,SAAS,UAAU,EAAU,KAAK,UAAU,EAAS,KAAM,CAAC,EAAG,CACtE,SAAU,OACV,KAAM,GACR,CAAC,CAGH,OAAS,EAAO,CAGd,KAAK,OAAO,MAAM,kDAAmD,CACnE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAKA,0BAAyC,CACvC,GAAI,CACG,EAAG,WAAW,KAAK,MAAM,GAC5B,EAAG,UAAU,KAAK,OAAQ,CAAE,UAAW,GAAM,KAAM,GAAoB,CAAC,CAE5E,OAAS,EAAO,CACd,KAAK,OAAO,MAAM,sDAAuD,CACvE,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CAEF,EC9Fa,EAAb,KAA4D,CAC1D,QACA,iBACA,OAEA,YAAY,EAAiC,CAAC,EAAG,CAC/C,KAAK,QAAU,EAAQ,SAAW,GAClC,KAAK,iBAAmB,EAAQ,kBAAoB,GACpD,KAAK,OAAS,EAAQ,QAAU,CAClC,CAKA,WAAqB,CACnB,OAAO,KAAK,OACd,CAOA,MAAM,WAAW,EAAyB,EAA0B,OAAuB,CACpF,QAAK,QAIV,GAAI,CACF,IAAM,EAAmB,EAAsB,CAAO,EAGhD,EAAQ,WAAW,EAAK,YAAY,EAAE,eACtC,EAAW,KAAK,iBAAmB,KAAK,EAAiB,UAAU,GAAK,GAG9E,KAAK,OAAO,QAAQ,GAAG,IAAQ,GAAU,EAGzC,KAAK,OAAO,KAAK,sBAAuB,CACtC,MAAO,EAAQ,MACf,cAAe,EAAQ,cACvB,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,UAAW,EAAQ,SACrB,CAAC,EAED,KAAK,OAAO,MAAM,mBAAoB,CAAE,OAAM,SAAU,SAAU,GAAG,CAAiB,CAAC,EAEvF,KAAK,OAAO,WAAW,CACzB,OAAS,EAAO,CAGd,KAAK,OAAO,MACV,gDACA,aAAiB,MAAQ,EAAM,QAAU,eAC3C,CACF,CACF,CAQF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@robota-sdk/agent-provider-openai",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.82",
|
|
4
4
|
"description": "OpenAI provider implementation for Robota SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"publishConfig": {
|
|
@@ -68,10 +68,15 @@
|
|
|
68
68
|
"vitest": "^3.2.6"
|
|
69
69
|
},
|
|
70
70
|
"license": "AGPL-3.0-only OR LicenseRef-Commercial",
|
|
71
|
+
"repository": {
|
|
72
|
+
"type": "git",
|
|
73
|
+
"url": "https://github.com/woojubb/robota.git",
|
|
74
|
+
"directory": "packages/agent-provider-openai"
|
|
75
|
+
},
|
|
71
76
|
"dependencies": {
|
|
72
77
|
"openai": "^4.104.0",
|
|
73
|
-
"@robota-sdk/agent-core": "3.0.0-beta.
|
|
74
|
-
"@robota-sdk/agent-provider-openai-compatible": "3.0.0-beta.
|
|
78
|
+
"@robota-sdk/agent-core": "3.0.0-beta.82",
|
|
79
|
+
"@robota-sdk/agent-provider-openai-compatible": "3.0.0-beta.82"
|
|
75
80
|
},
|
|
76
81
|
"volta": {
|
|
77
82
|
"extends": "../../package.json"
|
package/src/openai/index.ts
CHANGED
|
@@ -14,7 +14,7 @@ import type { IOpenAILogData } from '../types/api-types';
|
|
|
14
14
|
*
|
|
15
15
|
* @example
|
|
16
16
|
* ```typescript
|
|
17
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
17
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
18
18
|
*
|
|
19
19
|
* const logger = new ConsolePayloadLogger({
|
|
20
20
|
* enabled: true,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
5
|
* ```typescript
|
|
6
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
6
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
7
7
|
* ```
|
|
8
8
|
*/
|
|
9
9
|
export { ConsolePayloadLogger } from './console-payload-logger';
|
|
@@ -21,7 +21,7 @@ const OWNER_ONLY_DIR_MODE = 0o700;
|
|
|
21
21
|
*
|
|
22
22
|
* @example
|
|
23
23
|
* ```typescript
|
|
24
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
24
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
25
25
|
*
|
|
26
26
|
* const logger = new FilePayloadLogger({
|
|
27
27
|
* logDir: './logs/api-payloads',
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @example
|
|
5
5
|
* ```typescript
|
|
6
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
6
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
7
7
|
* ```
|
|
8
8
|
*/
|
|
9
9
|
export { FilePayloadLogger } from './file-payload-logger';
|
package/src/openai/types.ts
CHANGED
|
@@ -184,14 +184,14 @@ export interface IOpenAIProviderOptions {
|
|
|
184
184
|
* @example
|
|
185
185
|
* ```typescript
|
|
186
186
|
* // Node.js
|
|
187
|
-
* import { FilePayloadLogger } from '@robota-sdk/agent-provider
|
|
187
|
+
* import { FilePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
188
188
|
* const provider = new OpenAIProvider({
|
|
189
189
|
* client: openaiClient,
|
|
190
190
|
* payloadLogger: new FilePayloadLogger({ logDir: './logs/openai' })
|
|
191
191
|
* });
|
|
192
192
|
*
|
|
193
193
|
* // Browser
|
|
194
|
-
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider
|
|
194
|
+
* import { ConsolePayloadLogger } from '@robota-sdk/agent-provider-openai/loggers';
|
|
195
195
|
* const provider = new OpenAIProvider({
|
|
196
196
|
* client: openaiClient,
|
|
197
197
|
* payloadLogger: new ConsolePayloadLogger()
|