@serii84/vertex-partner-provider 1.0.26 → 1.0.29
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/index.js +31 -6
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Vertex Partner Provider for OpenCode
|
|
3
|
-
* v1.0.
|
|
3
|
+
* v1.0.29 - Remove delta from finish chunks entirely
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const fs = require('fs');
|
|
@@ -56,12 +56,13 @@ function cleanResponse(parsed) {
|
|
|
56
56
|
|| choice.finish_reason.stop_reason
|
|
57
57
|
|| 'stop';
|
|
58
58
|
} else {
|
|
59
|
-
cleanChoice.finish_reason = choice.finish_reason;
|
|
59
|
+
cleanChoice.finish_reason = String(choice.finish_reason);
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
// Clean up delta - remove null values and non-standard fields
|
|
64
|
-
|
|
64
|
+
// Don't include delta on finish chunks at all
|
|
65
|
+
if (choice.delta && !choice.finish_reason) {
|
|
65
66
|
const cleanDelta = {};
|
|
66
67
|
if (choice.delta.role) cleanDelta.role = choice.delta.role;
|
|
67
68
|
if (choice.delta.content) cleanDelta.content = choice.delta.content;
|
|
@@ -69,6 +70,7 @@ function cleanResponse(parsed) {
|
|
|
69
70
|
if (choice.delta.tool_calls) cleanDelta.tool_calls = choice.delta.tool_calls;
|
|
70
71
|
cleanChoice.delta = cleanDelta;
|
|
71
72
|
}
|
|
73
|
+
// Note: intentionally NOT including delta on finish chunks
|
|
72
74
|
|
|
73
75
|
if (choice.message) {
|
|
74
76
|
const cleanMessage = { role: choice.message.role };
|
|
@@ -94,10 +96,13 @@ function cleanResponse(parsed) {
|
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
function transformStream(response) {
|
|
99
|
+
// Log response headers for debugging
|
|
100
|
+
debugLog('Response headers:', Object.fromEntries(response.headers.entries()));
|
|
101
|
+
|
|
97
102
|
const reader = response.body.getReader();
|
|
98
103
|
const decoder = new TextDecoder();
|
|
99
104
|
const encoder = new TextEncoder();
|
|
100
|
-
|
|
105
|
+
|
|
101
106
|
let buffer = '';
|
|
102
107
|
|
|
103
108
|
const transformedStream = new ReadableStream({
|
|
@@ -106,6 +111,26 @@ function transformStream(response) {
|
|
|
106
111
|
const { done, value } = await reader.read();
|
|
107
112
|
|
|
108
113
|
if (done) {
|
|
114
|
+
// Process any remaining data in buffer
|
|
115
|
+
if (buffer.trim()) {
|
|
116
|
+
debugLog('Processing remaining buffer:', buffer);
|
|
117
|
+
if (buffer.startsWith('data: ')) {
|
|
118
|
+
const data = buffer.slice(6).trim();
|
|
119
|
+
if (data === '[DONE]') {
|
|
120
|
+
controller.enqueue(encoder.encode('data: [DONE]\n\n'));
|
|
121
|
+
} else if (data) {
|
|
122
|
+
try {
|
|
123
|
+
const parsed = JSON.parse(data);
|
|
124
|
+
const cleaned = cleanResponse(parsed);
|
|
125
|
+
if (cleaned.choices && cleaned.choices.length > 0) {
|
|
126
|
+
controller.enqueue(encoder.encode('data: ' + JSON.stringify(cleaned) + '\n\n'));
|
|
127
|
+
}
|
|
128
|
+
} catch (e) {
|
|
129
|
+
debugLog('Final buffer parse error:', e.message);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
109
134
|
controller.close();
|
|
110
135
|
return;
|
|
111
136
|
}
|
|
@@ -123,8 +148,8 @@ function transformStream(response) {
|
|
|
123
148
|
const data = message.slice(6);
|
|
124
149
|
|
|
125
150
|
if (data === '[DONE]') {
|
|
126
|
-
debugLog('
|
|
127
|
-
|
|
151
|
+
debugLog('Forwarding [DONE]');
|
|
152
|
+
controller.enqueue(encoder.encode('data: [DONE]\n\n'));
|
|
128
153
|
continue;
|
|
129
154
|
}
|
|
130
155
|
|