@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,152 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import 'reflect-metadata';
11
+ import { injectable } from 'tsyringe';
12
+ import { v4 as uuidv4 } from 'uuid';
13
+ import { pickDefined, safeParse } from '@holokai/sdk';
14
+ import { StreamTranslator } from "@holokai/sdk/provider";
15
+ let OpenAIMessageDeltaTranslator = class OpenAIMessageDeltaTranslator extends StreamTranslator {
16
+ holoDefaults = {};
17
+ providerDefaults = {};
18
+ constructor() {
19
+ super();
20
+ }
21
+ async toHoloManyImpl(source) {
22
+ const results = [];
23
+ // Process tool calls - emit one Holo chunk per tool_call delta for clean indexing
24
+ for (const choice of source.choices) {
25
+ const toolCalls = choice.delta?.tool_calls ?? [];
26
+ if (Array.isArray(toolCalls) && toolCalls.length > 0) {
27
+ for (const tc of toolCalls) {
28
+ const rawArgs = tc.function?.arguments;
29
+ const parsedArgs = safeParse(rawArgs);
30
+ const toolCallIndex = tc.index ?? 0;
31
+ // Emit shell when partial JSON; full tool_calls when complete
32
+ const isPartialJson = rawArgs && Object.keys(parsedArgs).length === 0;
33
+ results.push(pickDefined({
34
+ id: source.id,
35
+ model: source.model,
36
+ created: source.created * 1000, // sec -> ms
37
+ delta: {
38
+ provider: 'openai',
39
+ type: 'message_delta',
40
+ choice: choice.index,
41
+ index: toolCallIndex,
42
+ delta: isPartialJson
43
+ ? {} // Partial fragment → no Holo tool_calls yet
44
+ : {
45
+ tool_calls: [pickDefined({
46
+ id: tc.id,
47
+ type: tc.type || 'function',
48
+ function: pickDefined({
49
+ name: tc.function?.name,
50
+ arguments: parsedArgs
51
+ })
52
+ })]
53
+ },
54
+ // Store full source chunk for lossless round-trips
55
+ provider_delta: source
56
+ }
57
+ }));
58
+ }
59
+ }
60
+ }
61
+ // Handle usage data (usually in final chunk)
62
+ if (source.usage) {
63
+ const usage = pickDefined({
64
+ input_tokens: source.usage.prompt_tokens,
65
+ output_tokens: source.usage.completion_tokens,
66
+ total_tokens: source.usage.total_tokens
67
+ });
68
+ if (Object.keys(usage).length > 0) {
69
+ results.push(pickDefined({
70
+ id: source.id,
71
+ model: source.model,
72
+ created: source.created * 1000,
73
+ delta: {
74
+ provider: 'openai',
75
+ type: 'message_delta',
76
+ // Omit choice - usage applies to entire completion
77
+ delta: {},
78
+ usage: usage,
79
+ provider_delta: source
80
+ }
81
+ }));
82
+ }
83
+ }
84
+ return results;
85
+ }
86
+ async fromHoloManyImpl(source) {
87
+ const d = source.delta;
88
+ if (!d || d.type !== 'message_delta')
89
+ return [];
90
+ // Fast pass-through for OpenAI→OpenAI streaming
91
+ if (d.provider === 'OPENAI' && d.provider_delta) {
92
+ return [d.provider_delta];
93
+ }
94
+ const results = [];
95
+ const createdSec = source.created
96
+ ? Math.floor(source.created / 1000) // ms -> sec
97
+ : Math.floor(Date.now() / 1000);
98
+ // Handle tool calls
99
+ const toolCalls = d.delta?.tool_calls;
100
+ if (Array.isArray(toolCalls) && toolCalls.length > 0) {
101
+ results.push(pickDefined({
102
+ id: source.id || this.providerDefaults.id || uuidv4(),
103
+ object: 'chat.completion.chunk',
104
+ created: createdSec,
105
+ model: source.model || this.providerDefaults.model,
106
+ choices: [{
107
+ index: d.choice ?? 0,
108
+ delta: {
109
+ tool_calls: toolCalls.map((tc, i) => pickDefined({
110
+ index: d.index ?? i, // Use provided index or fallback to array index
111
+ id: tc.id,
112
+ type: tc.type || 'function',
113
+ function: tc.function ? pickDefined({
114
+ name: tc.function.name,
115
+ arguments: typeof tc.function.arguments === 'object'
116
+ ? JSON.stringify(tc.function.arguments)
117
+ : tc.function.arguments
118
+ }) : undefined
119
+ }))
120
+ },
121
+ finish_reason: null
122
+ }]
123
+ }));
124
+ }
125
+ // Handle usage
126
+ if (d.usage) {
127
+ const totalTokens = d.usage.total_tokens
128
+ || (d.usage.input_tokens && d.usage.output_tokens
129
+ ? d.usage.input_tokens + d.usage.output_tokens
130
+ : undefined);
131
+ results.push(pickDefined({
132
+ id: source.id || this.providerDefaults.id || uuidv4(),
133
+ object: 'chat.completion.chunk',
134
+ created: createdSec,
135
+ model: source.model || this.providerDefaults.model,
136
+ choices: [], // Empty choices for usage-only chunk (valid per OpenAI)
137
+ usage: pickDefined({
138
+ prompt_tokens: d.usage.input_tokens,
139
+ completion_tokens: d.usage.output_tokens,
140
+ total_tokens: totalTokens
141
+ })
142
+ }));
143
+ }
144
+ return results;
145
+ }
146
+ };
147
+ OpenAIMessageDeltaTranslator = __decorate([
148
+ injectable(),
149
+ __metadata("design:paramtypes", [])
150
+ ], OpenAIMessageDeltaTranslator);
151
+ export { OpenAIMessageDeltaTranslator };
152
+ //# sourceMappingURL=openai.message.delta.translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.message.delta.translator.js","sourceRoot":"","sources":["../../../src/translators/streaming/openai.message.delta.translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import 'reflect-metadata';
2
+ import { HoloStreamChunk } from '@holokai/sdk';
3
+ import { StreamTranslator } from "@holokai/sdk/provider";
4
+ import { ChatCompletionChunk } from "openai/resources/chat/completions/completions";
5
+ export declare class OpenAIMessageStartTranslator extends StreamTranslator<HoloStreamChunk, ChatCompletionChunk> {
6
+ protected holoDefaults: Partial<HoloStreamChunk>;
7
+ protected providerDefaults: Partial<ChatCompletionChunk>;
8
+ constructor();
9
+ protected toHoloManyImpl(source: ChatCompletionChunk): Promise<Partial<HoloStreamChunk>[]>;
10
+ protected fromHoloManyImpl(source: HoloStreamChunk): Promise<Partial<ChatCompletionChunk>[]>;
11
+ }
12
+ //# sourceMappingURL=openai.message.start.translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.message.start.translator.d.ts","sourceRoot":"","sources":["../../../src/translators/streaming/openai.message.start.translator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAC,eAAe,EAAc,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAC,MAAM,+CAA+C,CAAC;AAElF,qBACa,4BAA6B,SAAQ,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC;IACpG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAM;IACtD,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAM;;cAM9C,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;cA2BhF,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;CA+BrG"}
@@ -0,0 +1,80 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import 'reflect-metadata';
11
+ import { injectable } from 'tsyringe';
12
+ import { v4 as uuidv4 } from 'uuid';
13
+ import { pickDefined } from '@holokai/sdk';
14
+ import { StreamTranslator } from "@holokai/sdk/provider";
15
+ let OpenAIMessageStartTranslator = class OpenAIMessageStartTranslator extends StreamTranslator {
16
+ holoDefaults = {};
17
+ providerDefaults = {};
18
+ constructor() {
19
+ super();
20
+ }
21
+ async toHoloManyImpl(source) {
22
+ // OpenAI signals start when a choice delta has role
23
+ const roleChoices = source.choices.filter(c => c.delta?.role);
24
+ if (roleChoices.length === 0)
25
+ return [];
26
+ // Emit one message_start per choice with role (rare but correct for n>1)
27
+ return roleChoices.map(roleChoice => {
28
+ const choiceIndex = Number.isInteger(roleChoice.index) && roleChoice.index >= 0 ? roleChoice.index : 0;
29
+ return pickDefined({
30
+ id: source.id,
31
+ model: source.model,
32
+ created: source.created * 1000, // sec → ms
33
+ delta: {
34
+ provider: 'openai',
35
+ type: 'message_start',
36
+ choice: choiceIndex,
37
+ delta: {
38
+ role: roleChoice.delta.role // 'assistant' etc.
39
+ },
40
+ // Store full source chunk for lossless round-trips
41
+ provider_delta: source
42
+ }
43
+ });
44
+ });
45
+ }
46
+ async fromHoloManyImpl(source) {
47
+ const d = source.delta;
48
+ if (!d || d.type !== 'message_start')
49
+ return [];
50
+ // Fast pass-through if we already carry an OpenAI chunk
51
+ if (d.provider === 'OPENAI' && d.provider_delta) {
52
+ return [d.provider_delta];
53
+ }
54
+ const id = source.id || this.providerDefaults.id || uuidv4();
55
+ const createdSec = source.created
56
+ ? Math.floor(source.created / 1000) // ms → sec
57
+ : Math.floor(Date.now() / 1000);
58
+ const model = source.model || this.providerDefaults.model;
59
+ const choiceIndex = d.choice !== undefined && Number.isInteger(d.choice) && d.choice >= 0 ? d.choice : 0;
60
+ return [pickDefined({
61
+ id,
62
+ object: 'chat.completion.chunk',
63
+ created: createdSec,
64
+ model,
65
+ choices: [{
66
+ index: choiceIndex,
67
+ delta: {
68
+ role: d.delta?.role || 'assistant'
69
+ },
70
+ finish_reason: null
71
+ }]
72
+ })];
73
+ }
74
+ };
75
+ OpenAIMessageStartTranslator = __decorate([
76
+ injectable(),
77
+ __metadata("design:paramtypes", [])
78
+ ], OpenAIMessageStartTranslator);
79
+ export { OpenAIMessageStartTranslator };
80
+ //# sourceMappingURL=openai.message.start.translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.message.start.translator.js","sourceRoot":"","sources":["../../../src/translators/streaming/openai.message.start.translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import 'reflect-metadata';
2
+ import { HoloStreamChunk } from '@holokai/sdk';
3
+ import { StreamTranslator } from "@holokai/sdk/provider";
4
+ import { ChatCompletionChunk } from "openai/resources/chat/completions/completions";
5
+ export declare class OpenAIMessageStopTranslator extends StreamTranslator<HoloStreamChunk, ChatCompletionChunk> {
6
+ protected holoDefaults: Partial<HoloStreamChunk>;
7
+ protected providerDefaults: Partial<ChatCompletionChunk>;
8
+ constructor();
9
+ protected toHoloManyImpl(source: ChatCompletionChunk): Promise<Partial<HoloStreamChunk>[]>;
10
+ protected fromHoloManyImpl(source: HoloStreamChunk): Promise<Partial<ChatCompletionChunk>[]>;
11
+ private mapOpenAIFinishReason;
12
+ private mapHoloFinishReasonToOpenAI;
13
+ }
14
+ //# sourceMappingURL=openai.message.stop.translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.message.stop.translator.d.ts","sourceRoot":"","sources":["../../../src/translators/streaming/openai.message.stop.translator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAmB,eAAe,EAAc,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAC,MAAM,+CAA+C,CAAC;AAElF,qBACa,2BAA4B,SAAQ,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC;IACnG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAM;IACtD,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAM;;cAM9C,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;cA4BhF,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;IAgClG,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,2BAA2B;CAoBtC"}
@@ -0,0 +1,112 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import 'reflect-metadata';
11
+ import { injectable } from 'tsyringe';
12
+ import { v4 as uuidv4 } from 'uuid';
13
+ import { pickDefined } from '@holokai/sdk';
14
+ import { StreamTranslator } from "@holokai/sdk/provider";
15
+ let OpenAIMessageStopTranslator = class OpenAIMessageStopTranslator extends StreamTranslator {
16
+ holoDefaults = {};
17
+ providerDefaults = {};
18
+ constructor() {
19
+ super();
20
+ }
21
+ async toHoloManyImpl(source) {
22
+ const results = [];
23
+ // Emit a message_stop per choice that has a finish_reason
24
+ for (const ch of source.choices) {
25
+ if (!ch.finish_reason)
26
+ continue;
27
+ const choiceIndex = Number.isInteger(ch.index) && ch.index >= 0 ? ch.index : 0;
28
+ results.push(pickDefined({
29
+ id: source.id,
30
+ model: source.model,
31
+ created: source.created * 1000, // sec → ms
32
+ delta: {
33
+ provider: 'openai',
34
+ type: 'message_stop',
35
+ choice: choiceIndex,
36
+ delta: {},
37
+ provider_delta: source // Full raw chunk for lossless replay & validation
38
+ },
39
+ finish_reason: this.mapOpenAIFinishReason(ch.finish_reason)
40
+ // Note: do not set done here; leave it to orchestrator
41
+ }));
42
+ }
43
+ return results;
44
+ }
45
+ async fromHoloManyImpl(source) {
46
+ const d = source.delta;
47
+ if (!d || d.type !== 'message_stop')
48
+ return [];
49
+ // Fast pass-through if we already have an OpenAI chunk
50
+ if (d.provider === 'OPENAI' && d.provider_delta) {
51
+ return [d.provider_delta];
52
+ }
53
+ const createdSec = source.created
54
+ ? Math.floor(source.created / 1000) // ms → sec
55
+ : Math.floor(Date.now() / 1000);
56
+ const id = source.id || this.providerDefaults.id || uuidv4();
57
+ const model = source.model || this.providerDefaults.model;
58
+ const choiceIndex = d.choice !== undefined && Number.isInteger(d.choice) && d.choice >= 0 ? d.choice : 0;
59
+ return [pickDefined({
60
+ id,
61
+ object: 'chat.completion.chunk',
62
+ created: createdSec,
63
+ model,
64
+ choices: [{
65
+ index: choiceIndex,
66
+ delta: {},
67
+ finish_reason: this.mapHoloFinishReasonToOpenAI(source.finish_reason)
68
+ }],
69
+ system_fingerprint: this.providerDefaults.system_fingerprint,
70
+ service_tier: this.providerDefaults.service_tier
71
+ })];
72
+ }
73
+ mapOpenAIFinishReason(reason) {
74
+ // 1:1 mapping; do not invent defaults
75
+ switch (reason) {
76
+ case 'stop':
77
+ return 'stop';
78
+ case 'length':
79
+ return 'length';
80
+ case 'tool_calls':
81
+ return 'tool_calls';
82
+ case 'content_filter':
83
+ return 'content_filter';
84
+ case 'function_call':
85
+ return 'function_call';
86
+ }
87
+ }
88
+ mapHoloFinishReasonToOpenAI(reason) {
89
+ if (!reason)
90
+ return null; // Better than forcing 'stop'
91
+ switch (reason) {
92
+ case 'stop':
93
+ return 'stop';
94
+ case 'length':
95
+ return 'length';
96
+ case 'tool_calls':
97
+ return 'tool_calls';
98
+ case 'content_filter':
99
+ return 'content_filter';
100
+ case 'function_call':
101
+ return 'function_call';
102
+ default:
103
+ return null;
104
+ }
105
+ }
106
+ };
107
+ OpenAIMessageStopTranslator = __decorate([
108
+ injectable(),
109
+ __metadata("design:paramtypes", [])
110
+ ], OpenAIMessageStopTranslator);
111
+ export { OpenAIMessageStopTranslator };
112
+ //# sourceMappingURL=openai.message.stop.translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.message.stop.translator.js","sourceRoot":"","sources":["../../../src/translators/streaming/openai.message.stop.translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import 'reflect-metadata';
2
+ import { OpenAIMessageStartTranslator } from './openai.message.start.translator';
3
+ import { OpenAIContentDeltaTranslator } from './openai.content.delta.translator';
4
+ import { OpenAIMessageDeltaTranslator } from './openai.message.delta.translator';
5
+ import { OpenAIMessageStopTranslator } from './openai.message.stop.translator';
6
+ import { HoloStreamChunk } from "@holokai/sdk";
7
+ import { StreamTranslator } from "@holokai/sdk/provider";
8
+ import { ChatCompletionChunk } from "openai/resources/chat/completions/completions";
9
+ export declare class OpenAIStreamTranslator extends StreamTranslator<HoloStreamChunk, ChatCompletionChunk> {
10
+ private readonly messageStartTranslator;
11
+ private readonly contentDeltaTranslator;
12
+ private readonly messageDeltaTranslator;
13
+ private readonly messageStopTranslator;
14
+ protected holoDefaults: Partial<HoloStreamChunk>;
15
+ protected providerDefaults: Partial<ChatCompletionChunk>;
16
+ constructor(messageStartTranslator: OpenAIMessageStartTranslator, contentDeltaTranslator: OpenAIContentDeltaTranslator, messageDeltaTranslator: OpenAIMessageDeltaTranslator, messageStopTranslator: OpenAIMessageStopTranslator);
17
+ protected toHoloManyImpl(source: ChatCompletionChunk): Promise<Partial<HoloStreamChunk>[]>;
18
+ protected fromHoloManyImpl(source: HoloStreamChunk): Promise<Partial<ChatCompletionChunk>[]>;
19
+ }
20
+ //# sourceMappingURL=openai.stream.translator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.stream.translator.d.ts","sourceRoot":"","sources":["../../../src/translators/streaming/openai.stream.translator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,4BAA4B,EAAC,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAC,2BAA2B,EAAC,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAC,eAAe,EAAC,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAC,mBAAmB,EAAC,MAAM,+CAA+C,CAAC;AAElF,qBACa,sBAAuB,SAAQ,gBAAgB,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAK1F,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAP1C,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,eAAe,CAAC,CAAM;IACtD,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAM;gBAGzC,sBAAsB,EAAE,4BAA4B,EACpD,sBAAsB,EAAE,4BAA4B,EACpD,sBAAsB,EAAE,4BAA4B,EACpD,qBAAqB,EAAE,2BAA2B;cAKvD,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;cA8BhF,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;CA2BrG"}
@@ -0,0 +1,86 @@
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
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import 'reflect-metadata';
11
+ import { injectable } from 'tsyringe';
12
+ import { OpenAIMessageStartTranslator } from './openai.message.start.translator';
13
+ import { OpenAIContentDeltaTranslator } from './openai.content.delta.translator';
14
+ import { OpenAIMessageDeltaTranslator } from './openai.message.delta.translator';
15
+ import { OpenAIMessageStopTranslator } from './openai.message.stop.translator';
16
+ import { StreamTranslator } from "@holokai/sdk/provider";
17
+ let OpenAIStreamTranslator = class OpenAIStreamTranslator extends StreamTranslator {
18
+ messageStartTranslator;
19
+ contentDeltaTranslator;
20
+ messageDeltaTranslator;
21
+ messageStopTranslator;
22
+ holoDefaults = {};
23
+ providerDefaults = {};
24
+ constructor(messageStartTranslator, contentDeltaTranslator, messageDeltaTranslator, messageStopTranslator) {
25
+ super();
26
+ this.messageStartTranslator = messageStartTranslator;
27
+ this.contentDeltaTranslator = contentDeltaTranslator;
28
+ this.messageDeltaTranslator = messageDeltaTranslator;
29
+ this.messageStopTranslator = messageStopTranslator;
30
+ }
31
+ async toHoloManyImpl(source) {
32
+ const results = [];
33
+ // 1. Check for message_start (first chunk with role)
34
+ const hasRole = source.choices.some(c => c.delta?.role);
35
+ if (hasRole) {
36
+ results.push(...await this.messageStartTranslator.toHoloMany(source));
37
+ }
38
+ // 2. Check for content deltas
39
+ const hasContent = source.choices.some(c => c.delta?.content);
40
+ if (hasContent) {
41
+ results.push(...await this.contentDeltaTranslator.toHoloMany(source));
42
+ }
43
+ // 3. Check for tool calls or usage (both go through message_delta)
44
+ const hasToolCalls = source.choices.some(c => c.delta?.tool_calls);
45
+ if (hasToolCalls || source.usage) {
46
+ results.push(...await this.messageDeltaTranslator.toHoloMany(source));
47
+ }
48
+ // 4. Check for finish_reason
49
+ const hasFinishReason = source.choices.some(c => c.finish_reason);
50
+ if (hasFinishReason) {
51
+ results.push(...await this.messageStopTranslator.toHoloMany(source));
52
+ }
53
+ return results;
54
+ }
55
+ async fromHoloManyImpl(source) {
56
+ const d = source.delta;
57
+ if (!d)
58
+ return [];
59
+ // Fast pass-through for OpenAI→OpenAI streaming
60
+ if (d.provider === 'openai' && d.provider_delta) {
61
+ return [d.provider_delta];
62
+ }
63
+ // Route based on delta type
64
+ switch (d.type) {
65
+ case 'message_start':
66
+ return this.messageStartTranslator.fromHoloMany(source);
67
+ case 'content_delta':
68
+ return this.contentDeltaTranslator.fromHoloMany(source);
69
+ case 'message_delta':
70
+ return this.messageDeltaTranslator.fromHoloMany(source);
71
+ case 'message_stop':
72
+ return this.messageStopTranslator.fromHoloMany(source);
73
+ default:
74
+ return [];
75
+ }
76
+ }
77
+ };
78
+ OpenAIStreamTranslator = __decorate([
79
+ injectable(),
80
+ __metadata("design:paramtypes", [OpenAIMessageStartTranslator,
81
+ OpenAIContentDeltaTranslator,
82
+ OpenAIMessageDeltaTranslator,
83
+ OpenAIMessageStopTranslator])
84
+ ], OpenAIStreamTranslator);
85
+ export { OpenAIStreamTranslator };
86
+ //# sourceMappingURL=openai.stream.translator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.stream.translator.js","sourceRoot":"","sources":["../../../src/translators/streaming/openai.stream.translator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@holokai/holo-provider-openai",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "OpenAI provider plugin for Holo LLM Gateway",
6
+ "author": "Holokai",
7
+ "license": "MIT",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "engines": {
11
+ "node": ">=18.0.0"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/holokai/holo-provider-openai.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/holokai/holo-provider-openai/issues"
22
+ },
23
+ "homepage": "https://github.com/holokai/holo-provider-openai#readme",
24
+ "keywords": [
25
+ "holokai",
26
+ "holo",
27
+ "plugin",
28
+ "provider",
29
+ "openai",
30
+ "ai",
31
+ "llm"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js",
37
+ "require": "./dist/index.js"
38
+ },
39
+ "./package.json": "./package.json"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "!dist/**/*.test.*",
44
+ "!dist/**/*.spec.*",
45
+ "README.md",
46
+ "LICENSE"
47
+ ],
48
+ "sideEffects": false,
49
+ "scripts": {
50
+ "build": "tsc --build",
51
+ "build:watch": "tsc --build --watch",
52
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
53
+ "type-check": "tsc --noEmit",
54
+ "lint": "eslint src",
55
+ "test": "jest",
56
+ "test:watch": "jest --watch",
57
+ "test:integration": "jest tests/integration",
58
+ "prepublishOnly": "npm run clean && npm run build"
59
+ },
60
+ "peerDependencies": {
61
+ "@holokai/sdk": "^0.1.0"
62
+ },
63
+ "dependencies": {
64
+ "openai": "^6.17.0"
65
+ },
66
+ "devDependencies": {
67
+ "@types/jest": "^30.0.0",
68
+ "@types/node": "^24.0.11",
69
+ "jest": "^29.7.0",
70
+ "typescript": "^5.8.3"
71
+ }
72
+ }