@holokai/holo-provider-openai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +771 -0
  3. package/dist/index.d.ts +16 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +16 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/manifest.d.ts +3 -0
  8. package/dist/manifest.d.ts.map +1 -0
  9. package/dist/manifest.js +163 -0
  10. package/dist/manifest.js.map +1 -0
  11. package/dist/openai.auditor.d.ts +15 -0
  12. package/dist/openai.auditor.d.ts.map +1 -0
  13. package/dist/openai.auditor.js +164 -0
  14. package/dist/openai.auditor.js.map +1 -0
  15. package/dist/openai.provider.d.ts +24 -0
  16. package/dist/openai.provider.d.ts.map +1 -0
  17. package/dist/openai.provider.js +111 -0
  18. package/dist/openai.provider.js.map +1 -0
  19. package/dist/openai.response.factory.d.ts +8 -0
  20. package/dist/openai.response.factory.d.ts.map +1 -0
  21. package/dist/openai.response.factory.js +15 -0
  22. package/dist/openai.response.factory.js.map +1 -0
  23. package/dist/openai.translator.d.ts +22 -0
  24. package/dist/openai.translator.d.ts.map +1 -0
  25. package/dist/openai.translator.js +74 -0
  26. package/dist/openai.translator.js.map +1 -0
  27. package/dist/openai.wire.adapter.d.ts +12 -0
  28. package/dist/openai.wire.adapter.d.ts.map +1 -0
  29. package/dist/openai.wire.adapter.js +17 -0
  30. package/dist/openai.wire.adapter.js.map +1 -0
  31. package/dist/plugin.d.ts +14 -0
  32. package/dist/plugin.d.ts.map +1 -0
  33. package/dist/plugin.js +59 -0
  34. package/dist/plugin.js.map +1 -0
  35. package/dist/services/index.d.ts +2 -0
  36. package/dist/services/index.d.ts.map +1 -0
  37. package/dist/services/index.js +2 -0
  38. package/dist/services/index.js.map +1 -0
  39. package/dist/services/openai.chatcompletions.service.d.ts +12 -0
  40. package/dist/services/openai.chatcompletions.service.d.ts.map +1 -0
  41. package/dist/services/openai.chatcompletions.service.js +66 -0
  42. package/dist/services/openai.chatcompletions.service.js.map +1 -0
  43. package/dist/translators/index.d.ts +10 -0
  44. package/dist/translators/index.d.ts.map +1 -0
  45. package/dist/translators/index.js +10 -0
  46. package/dist/translators/index.js.map +1 -0
  47. package/dist/translators/openai.chatcompletion.request.translators.d.ts +23 -0
  48. package/dist/translators/openai.chatcompletion.request.translators.d.ts.map +1 -0
  49. package/dist/translators/openai.chatcompletion.request.translators.js +201 -0
  50. package/dist/translators/openai.chatcompletion.request.translators.js.map +1 -0
  51. package/dist/translators/openai.chatcompletion.response.translators.d.ts +18 -0
  52. package/dist/translators/openai.chatcompletion.response.translators.d.ts.map +1 -0
  53. package/dist/translators/openai.chatcompletion.response.translators.js +117 -0
  54. package/dist/translators/openai.chatcompletion.response.translators.js.map +1 -0
  55. package/dist/translators/openai.content.translators.d.ts +28 -0
  56. package/dist/translators/openai.content.translators.d.ts.map +1 -0
  57. package/dist/translators/openai.content.translators.js +100 -0
  58. package/dist/translators/openai.content.translators.js.map +1 -0
  59. package/dist/translators/openai.message.translators.d.ts +15 -0
  60. package/dist/translators/openai.message.translators.d.ts.map +1 -0
  61. package/dist/translators/openai.message.translators.js +144 -0
  62. package/dist/translators/openai.message.translators.js.map +1 -0
  63. package/dist/translators/openai.response.message.translators.d.ts +12 -0
  64. package/dist/translators/openai.response.message.translators.d.ts.map +1 -0
  65. package/dist/translators/openai.response.message.translators.js +100 -0
  66. package/dist/translators/openai.response.message.translators.js.map +1 -0
  67. package/dist/translators/openai.responses.request.translators.d.ts +10 -0
  68. package/dist/translators/openai.responses.request.translators.d.ts.map +1 -0
  69. package/dist/translators/openai.responses.request.translators.js +172 -0
  70. package/dist/translators/openai.responses.request.translators.js.map +1 -0
  71. package/dist/translators/openai.tool.translators.d.ts +19 -0
  72. package/dist/translators/openai.tool.translators.d.ts.map +1 -0
  73. package/dist/translators/openai.tool.translators.js +80 -0
  74. package/dist/translators/openai.tool.translators.js.map +1 -0
  75. package/dist/translators/openai.usage.translators.d.ts +12 -0
  76. package/dist/translators/openai.usage.translators.d.ts.map +1 -0
  77. package/dist/translators/openai.usage.translators.js +42 -0
  78. package/dist/translators/openai.usage.translators.js.map +1 -0
  79. package/dist/translators/streaming/index.d.ts +6 -0
  80. package/dist/translators/streaming/index.d.ts.map +1 -0
  81. package/dist/translators/streaming/index.js +6 -0
  82. package/dist/translators/streaming/index.js.map +1 -0
  83. package/dist/translators/streaming/openai.content.delta.translator.d.ts +12 -0
  84. package/dist/translators/streaming/openai.content.delta.translator.d.ts.map +1 -0
  85. package/dist/translators/streaming/openai.content.delta.translator.js +82 -0
  86. package/dist/translators/streaming/openai.content.delta.translator.js.map +1 -0
  87. package/dist/translators/streaming/openai.message.delta.translator.d.ts +12 -0
  88. package/dist/translators/streaming/openai.message.delta.translator.d.ts.map +1 -0
  89. package/dist/translators/streaming/openai.message.delta.translator.js +152 -0
  90. package/dist/translators/streaming/openai.message.delta.translator.js.map +1 -0
  91. package/dist/translators/streaming/openai.message.start.translator.d.ts +12 -0
  92. package/dist/translators/streaming/openai.message.start.translator.d.ts.map +1 -0
  93. package/dist/translators/streaming/openai.message.start.translator.js +80 -0
  94. package/dist/translators/streaming/openai.message.start.translator.js.map +1 -0
  95. package/dist/translators/streaming/openai.message.stop.translator.d.ts +14 -0
  96. package/dist/translators/streaming/openai.message.stop.translator.d.ts.map +1 -0
  97. package/dist/translators/streaming/openai.message.stop.translator.js +112 -0
  98. package/dist/translators/streaming/openai.message.stop.translator.js.map +1 -0
  99. package/dist/translators/streaming/openai.stream.translator.d.ts +20 -0
  100. package/dist/translators/streaming/openai.stream.translator.d.ts.map +1 -0
  101. package/dist/translators/streaming/openai.stream.translator.js +86 -0
  102. package/dist/translators/streaming/openai.stream.translator.js.map +1 -0
  103. package/package.json +72 -0
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenAI Provider Plugin
3
+ *
4
+ * Entry point for the OpenAI provider plugin.
5
+ * Exports the plugin instance as default export per Holo plugin contract.
6
+ */
7
+ import { OpenAIProviderPlugin } from './plugin.js';
8
+ export * from './services';
9
+ export * from './translators';
10
+ export * from './manifest';
11
+ export * from './openai.auditor';
12
+ export * from './openai.translator';
13
+ export * from './plugin';
14
+ declare const _default: OpenAIProviderPlugin;
15
+ export default _default;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEjD,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAE3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;;AAGzB,wBAA0C"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * OpenAI Provider Plugin
3
+ *
4
+ * Entry point for the OpenAI provider plugin.
5
+ * Exports the plugin instance as default export per Holo plugin contract.
6
+ */
7
+ import { OpenAIProviderPlugin } from './plugin.js';
8
+ export * from './services';
9
+ export * from './translators';
10
+ export * from './manifest';
11
+ export * from './openai.auditor';
12
+ export * from './openai.translator';
13
+ export * from './plugin';
14
+ // Export singleton instance as default for plugin loading
15
+ export default new OpenAIProviderPlugin();
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAEjD,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAE3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AAEzB,0DAA0D;AAC1D,eAAe,IAAI,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { PluginManifest } from "@holokai/sdk";
2
+ export declare const manifest: PluginManifest;
3
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,cAAc,CAAC;AAE5C,eAAO,MAAM,QAAQ,EAAE,cAyLtB,CAAC"}
@@ -0,0 +1,163 @@
1
+ export const manifest = {
2
+ // Required identity
3
+ name: '@holokai/provider-openai',
4
+ family: 'openai',
5
+ version: '1.0.0',
6
+ pluginType: 'provider',
7
+ displayName: 'OpenAI Provider',
8
+ description: 'First-party OpenAI provider plugin for Holokai, providing chat, tools, and streaming via the Holo universal format.',
9
+ // Optional metadata
10
+ author: {
11
+ name: 'Holokai Team',
12
+ url: 'https://holok.ai'
13
+ },
14
+ license: 'MIT',
15
+ homepage: 'https://holok.ai/docs/providers/openai',
16
+ repository: {
17
+ type: 'git',
18
+ url: 'https://github.com/holokai/holokai',
19
+ directory: 'packages/provider-openai'
20
+ },
21
+ bugs: {
22
+ url: 'https://github.com/holokai/holokai/issues'
23
+ },
24
+ keywords: [
25
+ 'holokai',
26
+ 'holo',
27
+ 'openai',
28
+ 'provider',
29
+ 'llm',
30
+ 'chat-completions',
31
+ 'tools',
32
+ 'streaming'
33
+ ],
34
+ // Engine / dependency requirements
35
+ engineVersion: '>=1.0.0 <2.0.0',
36
+ peerDependencies: {
37
+ '@holokai/sdk': '^1.0.0'
38
+ },
39
+ dependencies: {
40
+ openai: '^4.73.0'
41
+ },
42
+ // Capabilities
43
+ capabilities: {
44
+ supportsStreaming: true,
45
+ supportsHotReload: true,
46
+ supportsAsync: true,
47
+ supportsBatching: false,
48
+ supportsDistributed: true,
49
+ // Custom capability flags
50
+ supportsTools: true,
51
+ supportsVision: true,
52
+ supportsStructuredOutputs: true
53
+ },
54
+ // Permissions (what the host must allow)
55
+ permissions: ['network', 'env'],
56
+ // Configuration schema (what the operator configures for this plugin)
57
+ configSchema: {
58
+ $schema: 'http://json-schema.org/draft-07/schema#',
59
+ type: 'object',
60
+ title: 'OpenAI Provider Configuration',
61
+ description: 'Configuration for the @holokai/provider-openai plugin. Used by Holokai to connect to the OpenAI API.',
62
+ properties: {
63
+ apiKey: {
64
+ type: 'string',
65
+ description: 'OpenAI API key. This SHOULD be supplied via secure secret management (env/secret store), not hard-coded.',
66
+ minLength: 20
67
+ },
68
+ organizationId: {
69
+ type: 'string',
70
+ description: 'Optional OpenAI organization ID to use for requests.',
71
+ minLength: 1
72
+ },
73
+ projectId: {
74
+ type: 'string',
75
+ description: 'Optional OpenAI project ID (for org/project-scoped keys).'
76
+ },
77
+ baseUrl: {
78
+ type: 'string',
79
+ description: 'Optional custom base URL for OpenAI-compatible endpoints (e.g., proxy or Azure/OpenAI-compatible gateway).',
80
+ format: 'uri'
81
+ },
82
+ defaultModel: {
83
+ type: 'string',
84
+ description: 'Default OpenAI model to use when no model is specified in the HoloRequest (e.g., "gpt-4o-mini").'
85
+ },
86
+ allowedModels: {
87
+ type: 'array',
88
+ description: 'Optional allowlist of OpenAI model IDs that this plugin may use. If set, all requests will be validated against this list.',
89
+ items: {
90
+ type: 'string'
91
+ },
92
+ uniqueItems: true
93
+ },
94
+ timeoutMs: {
95
+ type: 'integer',
96
+ description: 'Default request timeout in milliseconds for OpenAI calls.',
97
+ minimum: 1000,
98
+ maximum: 600000,
99
+ default: 60000
100
+ },
101
+ maxRetries: {
102
+ type: 'integer',
103
+ description: 'Maximum number of retry attempts for transient OpenAI errors.',
104
+ minimum: 0,
105
+ maximum: 10,
106
+ default: 2
107
+ },
108
+ enableStructuredOutputs: {
109
+ type: 'boolean',
110
+ description: 'Enable OpenAI structured outputs (json_object/json_schema) when requested via Holo response_format.',
111
+ default: true
112
+ },
113
+ enableVision: {
114
+ type: 'boolean',
115
+ description: 'Enable multimodal/vision support for models that accept image content.',
116
+ default: true
117
+ },
118
+ logRequests: {
119
+ type: 'boolean',
120
+ description: 'If true, log summarized request/response metadata for observability (never full content or secrets).',
121
+ default: false
122
+ },
123
+ telemetrySampleRate: {
124
+ type: 'number',
125
+ description: 'Sampling rate (0.0–1.0) for sending telemetry events related to this provider.',
126
+ minimum: 0,
127
+ maximum: 1,
128
+ default: 1
129
+ }
130
+ },
131
+ required: ['apiKey'],
132
+ additionalProperties: false
133
+ },
134
+ // Marketplace metadata
135
+ category: 'ai-providers',
136
+ screenshots: [
137
+ 'https://holok.ai/assets/screenshots/provider-openai-1.png'
138
+ ],
139
+ changelog: 'https://holok.ai/docs/providers/openai/changelog',
140
+ pricing: {
141
+ model: 'free',
142
+ price: 0,
143
+ currency: 'USD',
144
+ billingPeriod: 'one-time'
145
+ },
146
+ support: {
147
+ email: 'support@holok.ai',
148
+ documentation: 'https://holok.ai/docs/providers/openai'
149
+ },
150
+ // Upgrade semantics
151
+ upgradeFrom: '>=1.0.0',
152
+ // Entrypoints
153
+ main: 'dist/index.js',
154
+ types: 'dist/index.d.ts',
155
+ // Custom metadata for host/runtime
156
+ custom: {
157
+ // Used by the host/plugin loader to auto-wire this plugin
158
+ providerKind: 'openai',
159
+ // Hints for the host UI
160
+ recommendedDefaultModel: 'gpt-4o-mini'
161
+ }
162
+ };
163
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { BaseAuditor, HoloWorkerRequest, HoloWorkerResponse, ProviderEnvelope } from "@holokai/sdk";
2
+ import { ChatCompletionCreateParamsBase } from "openai/resources/chat/completions";
3
+ import { ResponseCreateParamsBase } from "openai/resources/responses/responses";
4
+ import { LlmRequest, LlmResponse } from "@holokai/sdk/core/entities";
5
+ export declare class OpenAIAuditor extends BaseAuditor {
6
+ readonly provider = "openai";
7
+ protected toHoloRequest(workerRequest: HoloWorkerRequest, llmRequest: Omit<LlmRequest, 'id'>): void;
8
+ protected mapProviderPayload(workerRequest: HoloWorkerRequest, llmRequest: Omit<LlmRequest, 'id'>): void;
9
+ protected mapResponseToHolo(workerResponse: HoloWorkerResponse, llmResponse: Omit<LlmResponse, 'id'>): void;
10
+ protected collectResponseMetrics(workerResponse: HoloWorkerResponse, llmResponse: Omit<LlmResponse, 'id'>): void;
11
+ private extractUserPromptFromMessages;
12
+ private extractSystemPromptFromMessages;
13
+ protected createProviderEnvelope(payload: ResponseCreateParamsBase | ChatCompletionCreateParamsBase): Promise<ProviderEnvelope>;
14
+ }
15
+ //# sourceMappingURL=openai.auditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.auditor.d.ts","sourceRoot":"","sources":["../src/openai.auditor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAe,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC/G,OAAO,EAAC,8BAA8B,EAAC,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAC,wBAAwB,EAAC,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAC,UAAU,EAAE,WAAW,EAAY,MAAM,4BAA4B,CAAC;AAE9E,qBACa,aAAc,SAAQ,WAAW;IAC1C,QAAQ,CAAC,QAAQ,YAAY;IAE7B,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI;IAmBnG,SAAS,CAAC,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,IAAI;IAsBxG,SAAS,CAAC,iBAAiB,CACvB,cAAc,EAAE,kBAAkB,EAClC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GACrC,IAAI;IA4BP,SAAS,CAAC,sBAAsB,CAC5B,cAAc,EAAE,kBAAkB,EAClC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GACrC,IAAI;IAyCP,OAAO,CAAC,6BAA6B;IAqBrC,OAAO,CAAC,+BAA+B;cAOvB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,8BAA8B,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAKxI"}
@@ -0,0 +1,164 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { injectable } from 'tsyringe';
8
+ import { BaseAuditor, pickDefined } from "@holokai/sdk";
9
+ import { LlmStatus } from "@holokai/sdk/core/entities";
10
+ let OpenAIAuditor = class OpenAIAuditor extends BaseAuditor {
11
+ provider = 'openai';
12
+ toHoloRequest(workerRequest, llmRequest) {
13
+ const payload = workerRequest.payload;
14
+ // Set model
15
+ llmRequest.model_slug = payload.model;
16
+ // Extract user prompt from messages
17
+ const userPrompt = this.extractUserPromptFromMessages(payload.messages);
18
+ if (userPrompt !== undefined) {
19
+ llmRequest.user_prompt = userPrompt;
20
+ }
21
+ // Extract system prompt from messages
22
+ const systemPrompt = this.extractSystemPromptFromMessages(payload.messages);
23
+ if (systemPrompt !== undefined) {
24
+ llmRequest.system_prompt = systemPrompt;
25
+ }
26
+ }
27
+ mapProviderPayload(workerRequest, llmRequest) {
28
+ const payload = workerRequest.payload;
29
+ // Set options (OpenAI-specific parameters)
30
+ const options = {};
31
+ if (payload.max_tokens !== undefined)
32
+ options.max_tokens = payload.max_tokens;
33
+ if (payload.temperature !== undefined)
34
+ options.temperature = payload.temperature;
35
+ if (payload.top_p !== undefined)
36
+ options.top_p = payload.top_p;
37
+ if (payload.frequency_penalty !== undefined)
38
+ options.frequency_penalty = payload.frequency_penalty;
39
+ if (payload.presence_penalty !== undefined)
40
+ options.presence_penalty = payload.presence_penalty;
41
+ if (payload.stop !== undefined)
42
+ options.stop = payload.stop;
43
+ if (payload.stream !== undefined)
44
+ options.stream = payload.stream;
45
+ if (payload.tools !== undefined)
46
+ options.tools = payload.tools;
47
+ if (payload.tool_choice !== undefined)
48
+ options.tool_choice = payload.tool_choice;
49
+ if (payload.response_format !== undefined)
50
+ options.response_format = payload.response_format;
51
+ if (payload.seed !== undefined)
52
+ options.seed = payload.seed;
53
+ if (payload.user !== undefined)
54
+ options.user = payload.user;
55
+ if (Object.keys(options).length > 0) {
56
+ llmRequest.options = options;
57
+ }
58
+ }
59
+ mapResponseToHolo(workerResponse, llmResponse) {
60
+ const payload = workerResponse.payload;
61
+ // Extract model from payload
62
+ llmResponse.model_slug = payload.model || 'unknown';
63
+ // Extract response text from final response
64
+ if (workerResponse.fullResponse !== undefined) {
65
+ llmResponse.response = workerResponse.fullResponse;
66
+ }
67
+ else if (payload.object === 'chat.completion') {
68
+ // Non-streaming completion
69
+ const choice = payload.choices?.[0];
70
+ if (choice?.message?.content !== undefined) {
71
+ llmResponse.response = choice.message.content;
72
+ }
73
+ }
74
+ else if (payload.object === 'chat.completion.chunk') {
75
+ // Streaming chunk
76
+ const choice = payload.choices?.[0];
77
+ if (choice?.delta?.content !== undefined) {
78
+ llmResponse.response = choice.delta.content;
79
+ }
80
+ }
81
+ // Ensure response is never undefined for successful completions
82
+ if (llmResponse.response === undefined) {
83
+ llmResponse.response = '';
84
+ }
85
+ }
86
+ collectResponseMetrics(workerResponse, llmResponse) {
87
+ const payload = workerResponse.payload;
88
+ // Extract token usage from metrics or payload
89
+ if (workerResponse.metrics) {
90
+ llmResponse.usage_raw = workerResponse.metrics;
91
+ llmResponse.input_tokens = workerResponse.metrics.inputTokens;
92
+ llmResponse.output_tokens = workerResponse.metrics.outputTokens;
93
+ llmResponse.time_to_first_token = workerResponse.metrics.timeToFirstToken;
94
+ llmResponse.total_processing_time = workerResponse.metrics.totalProcessingTime;
95
+ }
96
+ else if (payload.usage) {
97
+ llmResponse.usage_raw = payload.usage;
98
+ llmResponse.input_tokens = payload.usage.prompt_tokens;
99
+ llmResponse.output_tokens = payload.usage.completion_tokens;
100
+ llmResponse.time_to_first_token = payload.usage.timeToFirstToken;
101
+ llmResponse.total_processing_time = payload.usage.totalProcessingTime;
102
+ }
103
+ // Set status based on completion and finish reason
104
+ const choice = payload.choices?.[0];
105
+ if (choice?.finish_reason) {
106
+ if (choice.finish_reason === 'length') {
107
+ llmResponse.status = LlmStatus.PARTIAL;
108
+ }
109
+ else if (choice.finish_reason === 'stop' || choice.finish_reason === 'end_turn') {
110
+ llmResponse.status = LlmStatus.SUCCESS;
111
+ }
112
+ else if (choice.finish_reason === 'content_filter') {
113
+ llmResponse.status = LlmStatus.ERROR;
114
+ llmResponse.error_message = 'Content filtered by OpenAI';
115
+ }
116
+ else {
117
+ llmResponse.status = LlmStatus.SUCCESS;
118
+ }
119
+ }
120
+ else if (payload.error) {
121
+ llmResponse.status = LlmStatus.ERROR;
122
+ llmResponse.error_message = payload.error.message || 'OpenAI API error';
123
+ }
124
+ else {
125
+ llmResponse.status = LlmStatus.SUCCESS;
126
+ }
127
+ }
128
+ extractUserPromptFromMessages(messages) {
129
+ if (!messages || !Array.isArray(messages))
130
+ return undefined;
131
+ const userMessages = messages.filter(msg => msg.role === 'user');
132
+ if (userMessages.length === 0)
133
+ return undefined;
134
+ // Return the last user message content
135
+ const lastUserMessage = userMessages[userMessages.length - 1];
136
+ if (typeof lastUserMessage.content === 'string') {
137
+ return lastUserMessage.content;
138
+ }
139
+ else if (Array.isArray(lastUserMessage.content)) {
140
+ // Handle content array - extract text content
141
+ const textParts = lastUserMessage.content
142
+ .filter((part) => part.type === 'text')
143
+ .map((part) => part.text);
144
+ return textParts.length > 0 ? textParts.join('\n') : undefined;
145
+ }
146
+ return undefined;
147
+ }
148
+ extractSystemPromptFromMessages(messages) {
149
+ if (!messages || !Array.isArray(messages))
150
+ return undefined;
151
+ const systemMessage = messages.find(msg => msg.role === 'system');
152
+ return systemMessage && typeof systemMessage.content === 'string' ? systemMessage.content : undefined;
153
+ }
154
+ async createProviderEnvelope(payload) {
155
+ return pickDefined({
156
+ model_slug: payload.model
157
+ });
158
+ }
159
+ };
160
+ OpenAIAuditor = __decorate([
161
+ injectable()
162
+ ], OpenAIAuditor);
163
+ export { OpenAIAuditor };
164
+ //# sourceMappingURL=openai.auditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.auditor.js","sourceRoot":"","sources":["../src/openai.auditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseProvider, IAuditor, IProviderTranslator, IResponseFactory, ProviderContext, RunHandle } from '@holokai/sdk';
3
+ import { ResponseCreateParamsBase, ResponseErrorEvent } from 'openai/resources/responses/responses';
4
+ import { ChatCompletionCreateParamsBase } from 'openai/resources/chat/completions';
5
+ import { Model } from 'openai/resources/models';
6
+ import { APIError } from "openai/core/error";
7
+ /**
8
+ * OpenAI provider for connecting to OpenAI API
9
+ */
10
+ export declare class OpenAIProvider extends BaseProvider<OpenAI, ResponseCreateParamsBase | ChatCompletionCreateParamsBase> {
11
+ protected createAuditor(): IAuditor;
12
+ protected createClient(): OpenAI;
13
+ protected createTranslator(): IProviderTranslator;
14
+ protected createResponseFactory(): IResponseFactory;
15
+ getModels(allowedModels: string[] | true): Promise<{
16
+ object: string;
17
+ data: Model[];
18
+ }>;
19
+ protected handleError(error: APIError): Promise<ResponseErrorEvent>;
20
+ protected handleRequest(payload: ResponseCreateParamsBase | ChatCompletionCreateParamsBase, ctx: ProviderContext): Promise<RunHandle<any>>;
21
+ private runResponses;
22
+ private runChatCompletions;
23
+ }
24
+ //# sourceMappingURL=openai.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.provider.d.ts","sourceRoot":"","sources":["../src/openai.provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EACH,YAAY,EACZ,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EAEf,SAAS,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,wBAAwB,EAAE,kBAAkB,EAAsB,MAAM,sCAAsC,CAAC;AACvH,OAAO,EAAC,8BAA8B,EAAC,MAAM,mCAAmC,CAAC;AAEjF,OAAO,EAAC,KAAK,EAAa,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAC,QAAQ,EAAC,MAAM,mBAAmB,CAAC;AAI3C;;GAEG;AACH,qBAAa,cAAe,SAAQ,YAAY,CAAC,MAAM,EAAE,wBAAwB,GAAG,8BAA8B,CAAC;IAE/G,SAAS,CAAC,aAAa,IAAI,QAAQ;IAInC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC,SAAS,CAAC,gBAAgB,IAAI,mBAAmB;IAIjD,SAAS,CAAC,qBAAqB,IAAI,gBAAgB;IAI7C,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,EAAE,CAAA;KAAE,CAAC;cAa3E,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC;cASzD,aAAa,CACzB,OAAO,EAAE,wBAAwB,GAAG,8BAA8B,EAClE,GAAG,EAAE,eAAe,GACrB,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAUZ,YAAY;YA4CZ,kBAAkB;CAyCnC"}
@@ -0,0 +1,111 @@
1
+ import OpenAI from 'openai';
2
+ import { BaseProvider, RequestType } from '@holokai/sdk';
3
+ import { OpenAIAuditor } from './openai.auditor';
4
+ import { OpenAITranslator } from './openai.translator';
5
+ import { OpenAIResponseFactory } from './openai.response.factory';
6
+ /**
7
+ * OpenAI provider for connecting to OpenAI API
8
+ */
9
+ export class OpenAIProvider extends BaseProvider {
10
+ createAuditor() {
11
+ return new OpenAIAuditor();
12
+ }
13
+ createClient() {
14
+ return new OpenAI(this._config);
15
+ }
16
+ createTranslator() {
17
+ return OpenAITranslator.instance();
18
+ }
19
+ createResponseFactory() {
20
+ return OpenAIResponseFactory.instance();
21
+ }
22
+ async getModels(allowedModels) {
23
+ const response = await this.client.models.list();
24
+ if (allowedModels === true) {
25
+ return response;
26
+ }
27
+ const data = response.data.filter(model => allowedModels.includes(model.id));
28
+ return {
29
+ object: response.object,
30
+ data
31
+ };
32
+ }
33
+ async handleError(error) {
34
+ if (error.error) {
35
+ // may need to validate what the error is
36
+ return error.error;
37
+ }
38
+ return this.responseFactory.createError(error.message, error.code ? error.code : undefined);
39
+ }
40
+ async handleRequest(payload, ctx) {
41
+ switch (ctx.requestType) {
42
+ case RequestType.RESPONSES:
43
+ return this.runResponses(payload, ctx);
44
+ default:
45
+ return this.runChatCompletions(payload, ctx);
46
+ }
47
+ }
48
+ // --- Responses API ---
49
+ async runResponses(req, ctx) {
50
+ if (!req.stream) {
51
+ return {
52
+ final: async () => {
53
+ return this.client.responses.create({ ...req, stream: false });
54
+ },
55
+ };
56
+ }
57
+ const finalPromise = (async () => {
58
+ const stream = await this.client.responses.create({
59
+ ...req,
60
+ stream: true
61
+ });
62
+ let finalChunk;
63
+ for await (const event of stream) {
64
+ ctx.emitStreamEvent(event);
65
+ if (event.type === 'response.output_text.delta') {
66
+ ctx.emitTextDelta(event.delta);
67
+ }
68
+ if (event.type === 'response.completed' ||
69
+ event.type === 'response.failed' ||
70
+ event.type === 'response.incomplete' ||
71
+ event.type === 'error') {
72
+ finalChunk = event;
73
+ }
74
+ }
75
+ return finalChunk;
76
+ })();
77
+ return { final: () => finalPromise };
78
+ }
79
+ // --- Chat Completions API ---
80
+ async runChatCompletions(req, ctx) {
81
+ if (!req.stream) {
82
+ return {
83
+ final: async () => {
84
+ return this.client.chat.completions.create({ ...req, stream: false });
85
+ },
86
+ };
87
+ }
88
+ const streamingReq = {
89
+ ...req,
90
+ stream: true,
91
+ stream_options: { include_usage: true },
92
+ };
93
+ this.client.chat.completions.create(streamingReq);
94
+ const finalPromise = (async () => {
95
+ const stream = await this.client.chat.completions.create(streamingReq);
96
+ let finalChunk;
97
+ for await (const chunk of stream) {
98
+ ctx.emitStreamEvent(chunk);
99
+ const delta = chunk?.choices?.[0]?.delta?.content;
100
+ if (typeof delta === 'string' && delta.length) {
101
+ ctx.emitTextDelta(delta);
102
+ }
103
+ if (chunk?.usage)
104
+ finalChunk = chunk;
105
+ }
106
+ return finalChunk;
107
+ })();
108
+ return { final: () => finalPromise };
109
+ }
110
+ }
111
+ //# sourceMappingURL=openai.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.provider.js","sourceRoot":"","sources":["../src/openai.provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { IResponseFactory } from "@holokai/sdk";
2
+ import { ResponseErrorEvent } from "openai/resources/responses/responses";
3
+ export type OpenAIResponseCode = 'server_error' | 'rate_limit_exceeded' | 'invalid_prompt' | 'vector_store_timeout' | 'invalid_image' | 'invalid_image_format' | 'invalid_base64_image' | 'invalid_image_url' | 'image_too_large' | 'image_too_small' | 'image_parse_error' | 'image_content_policy_violation' | 'invalid_image_mode' | 'image_file_too_large' | 'unsupported_image_media_type' | 'empty_image_file' | 'failed_to_download_image' | 'image_file_not_found';
4
+ export declare class OpenAIResponseFactory implements IResponseFactory {
5
+ createError(message: string, code?: OpenAIResponseCode): ResponseErrorEvent;
6
+ static instance(): OpenAIResponseFactory;
7
+ }
8
+ //# sourceMappingURL=openai.response.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.response.factory.d.ts","sourceRoot":"","sources":["../src/openai.response.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sCAAsC,CAAC;AAExE,MAAM,MAAM,kBAAkB,GAAK,cAAc,GAC3C,qBAAqB,GACrB,gBAAgB,GAChB,sBAAsB,GACtB,eAAe,GACf,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,gCAAgC,GAChC,oBAAoB,GACpB,sBAAsB,GACtB,8BAA8B,GAC9B,kBAAkB,GAClB,0BAA0B,GAC1B,sBAAsB,CAAC;AAE7B,qBAAa,qBAAsB,YAAW,gBAAgB;IAC1D,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAqC,GAAG,kBAAkB;IAU7F,MAAM,CAAC,QAAQ,IAAI,qBAAqB;CAG3C"}
@@ -0,0 +1,15 @@
1
+ export class OpenAIResponseFactory {
2
+ createError(message, code = 'invalid_prompt') {
3
+ return {
4
+ type: 'error',
5
+ message,
6
+ param: null,
7
+ code,
8
+ sequence_number: 0
9
+ };
10
+ }
11
+ static instance() {
12
+ return new OpenAIResponseFactory();
13
+ }
14
+ }
15
+ //# sourceMappingURL=openai.response.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.response.factory.js","sourceRoot":"","sources":["../src/openai.response.factory.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,qBAAqB;IAC9B,WAAW,CAAC,OAAe,EAAE,OAA2B,gBAAgB;QACpE,OAAO;YACH,IAAI,EAAE,OAAO;YACb,OAAO;YACP,KAAK,EAAE,IAAI;YACX,IAAI;YACJ,eAAe,EAAE,CAAC;SACrB,CAAC;IACN,CAAC;IAED,MAAM,CAAC,QAAQ;QACX,OAAO,IAAI,qBAAqB,EAAE,CAAC;IACvC,CAAC;CACJ"}
@@ -0,0 +1,22 @@
1
+ import 'reflect-metadata';
2
+ import { IProviderTranslator } from "@holokai/sdk/provider";
3
+ import { OpenAIMessageTranslator, OpenAIRequestTranslator, OpenAIResponseTranslator, OpenAIStreamTranslator } from "./translators";
4
+ import { HoloMessage, HoloRequest, HoloResponse, HoloStreamChunk } from "@holokai/sdk";
5
+ import { ChatCompletion, ChatCompletionChunk, ChatCompletionMessageParam } from "openai/resources/chat/completions/completions";
6
+ import { ChatCompletionCreateParamsBase } from "openai/resources/chat/completions";
7
+ export declare class OpenAITranslator implements IProviderTranslator {
8
+ private readonly responseTranslator;
9
+ private readonly requestTranslator;
10
+ private readonly messageTranslator;
11
+ private readonly streamTranslator;
12
+ constructor(responseTranslator: OpenAIResponseTranslator, requestTranslator: OpenAIRequestTranslator, messageTranslator: OpenAIMessageTranslator, streamTranslator: OpenAIStreamTranslator);
13
+ static instance(): IProviderTranslator;
14
+ fromHoloResponse(response: HoloResponse): Promise<Partial<ChatCompletion | ChatCompletionChunk>>;
15
+ toHoloResponse(response: ChatCompletion | ChatCompletionChunk): Promise<Partial<HoloResponse>>;
16
+ fromHoloRequest(request: HoloRequest): Promise<Partial<ChatCompletionCreateParamsBase>>;
17
+ toHoloRequest(request: ChatCompletionCreateParamsBase): Promise<Partial<HoloRequest>>;
18
+ fromHoloMessages(messages: HoloMessage[]): Promise<Partial<ChatCompletionMessageParam>[]>;
19
+ toHoloMessages(messages: ChatCompletionMessageParam[]): Promise<Partial<HoloMessage>[]>;
20
+ fromHoloStreamChunks(chunks: HoloStreamChunk[]): Promise<unknown>;
21
+ }
22
+ //# sourceMappingURL=openai.translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.translator.d.ts","sourceRoot":"","sources":["../src/openai.translator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAGH,uBAAuB,EACvB,uBAAuB,EAEvB,wBAAwB,EACxB,sBAAsB,EAKzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAC,MAAM,cAAc,CAAC;AACrF,OAAO,EACH,cAAc,EACd,mBAAmB,EACnB,0BAA0B,EAC7B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAC,8BAA8B,EAAC,MAAM,mCAAmC,CAAC;AAQjF,qBACa,gBAAiB,YAAW,mBAAmB;IAEpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAHhB,kBAAkB,EAAE,wBAAwB,EAC5C,iBAAiB,EAAE,uBAAuB,EAC1C,iBAAiB,EAAE,uBAAuB,EAC1C,gBAAgB,EAAE,sBAAsB;IAI7D,MAAM,CAAC,QAAQ,IAAI,mBAAmB;IAkChC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG,mBAAmB,CAAC,CAAC;IAIhG,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAI9F,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAIvF,aAAa,CAAC,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAIrF,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,CAAC;IAIzF,cAAc,CAAC,QAAQ,EAAE,0BAA0B,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;IAIvF,oBAAoB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;CAG1E"}