opencode-qwen-auth 0.1.1
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 +203 -0
- package/README.md +252 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/src/constants.d.ts +7 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +12 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/plugin/account.d.ts +40 -0
- package/dist/src/plugin/account.d.ts.map +1 -0
- package/dist/src/plugin/account.js +237 -0
- package/dist/src/plugin/account.js.map +1 -0
- package/dist/src/plugin/auth.d.ts +5 -0
- package/dist/src/plugin/auth.d.ts.map +1 -0
- package/dist/src/plugin/auth.js +16 -0
- package/dist/src/plugin/auth.js.map +1 -0
- package/dist/src/plugin/config/index.d.ts +4 -0
- package/dist/src/plugin/config/index.d.ts.map +1 -0
- package/dist/src/plugin/config/index.js +3 -0
- package/dist/src/plugin/config/index.js.map +1 -0
- package/dist/src/plugin/config/loader.d.ts +3 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +69 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +31 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -0
- package/dist/src/plugin/config/schema.js +15 -0
- package/dist/src/plugin/config/schema.js.map +1 -0
- package/dist/src/plugin/logger.d.ts +12 -0
- package/dist/src/plugin/logger.d.ts.map +1 -0
- package/dist/src/plugin/logger.js +74 -0
- package/dist/src/plugin/logger.js.map +1 -0
- package/dist/src/plugin/token.d.ts +8 -0
- package/dist/src/plugin/token.d.ts.map +1 -0
- package/dist/src/plugin/token.js +29 -0
- package/dist/src/plugin/token.js.map +1 -0
- package/dist/src/plugin/types.d.ts +96 -0
- package/dist/src/plugin/types.d.ts.map +1 -0
- package/dist/src/plugin/types.js +2 -0
- package/dist/src/plugin/types.js.map +1 -0
- package/dist/src/plugin.d.ts +11 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +439 -0
- package/dist/src/plugin.js.map +1 -0
- package/dist/src/qwen/oauth.d.ts +29 -0
- package/dist/src/qwen/oauth.d.ts.map +1 -0
- package/dist/src/qwen/oauth.js +151 -0
- package/dist/src/qwen/oauth.js.map +1 -0
- package/dist/src/transform/index.d.ts +4 -0
- package/dist/src/transform/index.d.ts.map +1 -0
- package/dist/src/transform/index.js +4 -0
- package/dist/src/transform/index.js.map +1 -0
- package/dist/src/transform/request.d.ts +4 -0
- package/dist/src/transform/request.d.ts.map +1 -0
- package/dist/src/transform/request.js +106 -0
- package/dist/src/transform/request.js.map +1 -0
- package/dist/src/transform/response.d.ts +10 -0
- package/dist/src/transform/response.d.ts.map +1 -0
- package/dist/src/transform/response.js +52 -0
- package/dist/src/transform/response.js.map +1 -0
- package/dist/src/transform/sse.d.ts +10 -0
- package/dist/src/transform/sse.d.ts.map +1 -0
- package/dist/src/transform/sse.js +230 -0
- package/dist/src/transform/sse.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { QWEN_DEFAULT_CLIENT_ID, QWEN_DEFAULT_SCOPES, QWEN_DEVICE_CODE_ENDPOINT, QWEN_OAUTH_BASE_URL, QWEN_TOKEN_ENDPOINT, } from "../constants";
|
|
3
|
+
import { calculateTokenExpiry } from "../plugin/auth";
|
|
4
|
+
function createOAuthBody(entries) {
|
|
5
|
+
return new URLSearchParams(entries);
|
|
6
|
+
}
|
|
7
|
+
function resolveOAuthUrl(base, endpoint) {
|
|
8
|
+
const normalized = typeof base === "string" && base.trim() ? base : QWEN_OAUTH_BASE_URL;
|
|
9
|
+
try {
|
|
10
|
+
return new URL(endpoint, normalized).toString();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
14
|
+
throw new Error(`Invalid OAuth base URL: ${normalized}. ${message}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function resolveClientId(clientId) {
|
|
18
|
+
const trimmed = typeof clientId === "string" ? clientId.trim() : "";
|
|
19
|
+
return trimmed || QWEN_DEFAULT_CLIENT_ID;
|
|
20
|
+
}
|
|
21
|
+
function base64UrlEncode(buffer) {
|
|
22
|
+
return buffer
|
|
23
|
+
.toString("base64")
|
|
24
|
+
.replace(/\+/g, "-")
|
|
25
|
+
.replace(/\//g, "_")
|
|
26
|
+
.replace(/=+$/, "");
|
|
27
|
+
}
|
|
28
|
+
function createPkcePair() {
|
|
29
|
+
const verifier = base64UrlEncode(randomBytes(32));
|
|
30
|
+
const challenge = base64UrlEncode(createHash("sha256").update(verifier).digest());
|
|
31
|
+
return { verifier, challenge };
|
|
32
|
+
}
|
|
33
|
+
export async function authorizeQwenDevice(options) {
|
|
34
|
+
const scopes = options.scopes ?? QWEN_DEFAULT_SCOPES;
|
|
35
|
+
const { verifier, challenge } = createPkcePair();
|
|
36
|
+
const response = await fetch(resolveOAuthUrl(options.oauthBaseUrl, QWEN_DEVICE_CODE_ENDPOINT), {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: {
|
|
39
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
40
|
+
},
|
|
41
|
+
body: createOAuthBody({
|
|
42
|
+
client_id: resolveClientId(options.clientId),
|
|
43
|
+
scope: scopes.join(" "),
|
|
44
|
+
code_challenge: challenge,
|
|
45
|
+
code_challenge_method: "S256",
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
const message = await response.text();
|
|
50
|
+
throw new Error(message || "Failed to start Qwen device flow");
|
|
51
|
+
}
|
|
52
|
+
const payload = (await response.json());
|
|
53
|
+
const expiresAt = calculateTokenExpiry(Date.now(), payload.expires_in);
|
|
54
|
+
const intervalSeconds = payload.interval ?? 5;
|
|
55
|
+
return {
|
|
56
|
+
deviceCode: payload.device_code,
|
|
57
|
+
userCode: payload.user_code,
|
|
58
|
+
verificationUri: payload.verification_uri,
|
|
59
|
+
verificationUriComplete: payload.verification_uri_complete,
|
|
60
|
+
expiresAt,
|
|
61
|
+
intervalSeconds,
|
|
62
|
+
codeVerifier: verifier,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function sleep(ms) {
|
|
66
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
67
|
+
}
|
|
68
|
+
export async function pollQwenDeviceToken(options, deviceCode, intervalSeconds, expiresAt, codeVerifier) {
|
|
69
|
+
let currentInterval = intervalSeconds;
|
|
70
|
+
while (Date.now() < expiresAt) {
|
|
71
|
+
const response = await fetch(resolveOAuthUrl(options.oauthBaseUrl, QWEN_TOKEN_ENDPOINT), {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: {
|
|
74
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
75
|
+
},
|
|
76
|
+
body: createOAuthBody({
|
|
77
|
+
client_id: resolveClientId(options.clientId),
|
|
78
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
79
|
+
device_code: deviceCode,
|
|
80
|
+
code_verifier: codeVerifier,
|
|
81
|
+
}),
|
|
82
|
+
});
|
|
83
|
+
if (response.ok) {
|
|
84
|
+
const payload = (await response.json());
|
|
85
|
+
if (!payload.refresh_token) {
|
|
86
|
+
return { type: "failed", error: "Missing refresh token" };
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
type: "success",
|
|
90
|
+
access: payload.access_token,
|
|
91
|
+
refresh: payload.refresh_token,
|
|
92
|
+
expires: calculateTokenExpiry(Date.now(), payload.expires_in),
|
|
93
|
+
resourceUrl: payload.resource_url,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const errorPayload = (await response
|
|
97
|
+
.json()
|
|
98
|
+
.catch(() => ({})));
|
|
99
|
+
const code = errorPayload.error;
|
|
100
|
+
if (code === "authorization_pending") {
|
|
101
|
+
await sleep(currentInterval * 1000);
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (code === "slow_down") {
|
|
105
|
+
currentInterval += 5;
|
|
106
|
+
await sleep(currentInterval * 1000);
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (code === "expired_token") {
|
|
110
|
+
return { type: "failed", error: "Device code expired", code };
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
type: "failed",
|
|
114
|
+
error: errorPayload.error_description ?? "OAuth polling failed",
|
|
115
|
+
code,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
return { type: "failed", error: "Device authorization expired" };
|
|
119
|
+
}
|
|
120
|
+
export async function refreshQwenToken(options, refreshToken) {
|
|
121
|
+
const response = await fetch(resolveOAuthUrl(options.oauthBaseUrl, QWEN_TOKEN_ENDPOINT), {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: {
|
|
124
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
125
|
+
},
|
|
126
|
+
body: createOAuthBody({
|
|
127
|
+
client_id: resolveClientId(options.clientId),
|
|
128
|
+
grant_type: "refresh_token",
|
|
129
|
+
refresh_token: refreshToken,
|
|
130
|
+
}),
|
|
131
|
+
});
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
const errorPayload = (await response
|
|
134
|
+
.json()
|
|
135
|
+
.catch(() => ({})));
|
|
136
|
+
return {
|
|
137
|
+
type: "failed",
|
|
138
|
+
error: errorPayload.error_description ?? "Failed to refresh token",
|
|
139
|
+
code: errorPayload.error,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const payload = (await response.json());
|
|
143
|
+
return {
|
|
144
|
+
type: "success",
|
|
145
|
+
access: payload.access_token,
|
|
146
|
+
refresh: payload.refresh_token ?? refreshToken,
|
|
147
|
+
expires: calculateTokenExpiry(Date.now(), payload.expires_in),
|
|
148
|
+
resourceUrl: payload.resource_url,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/qwen/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { transformResponsesToChatCompletions } from "./request";
|
|
2
|
+
export { createTransformContext, type TransformContext, transformChatCompletionsToResponses, } from "./response";
|
|
3
|
+
export { createSSETransformContext, createSSETransformStream, type SSETransformContext, } from "./sse";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,mCAAmC,GACpC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mCAAmC,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EACL,sBAAsB,EAEtB,mCAAmC,GACpC,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,GAEzB,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/transform/request.ts"],"names":[],"mappings":"AACA,KAAK,SAAS,GAAG,GAAG,CAAC;AAuDrB,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,SAAS,GACd,SAAS,CAsEX"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
function asImageUrlObject(part) {
|
|
2
|
+
const imageUrl = part?.image_url ?? part?.url;
|
|
3
|
+
if (typeof imageUrl === "string")
|
|
4
|
+
return { url: imageUrl };
|
|
5
|
+
if (imageUrl &&
|
|
6
|
+
typeof imageUrl === "object" &&
|
|
7
|
+
typeof imageUrl.url === "string") {
|
|
8
|
+
return { url: imageUrl.url };
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
function mapContentPart(part) {
|
|
13
|
+
if (!part || typeof part !== "object")
|
|
14
|
+
return part;
|
|
15
|
+
switch (part.type) {
|
|
16
|
+
case "input_text":
|
|
17
|
+
case "output_text":
|
|
18
|
+
return { type: "text", text: String(part.text ?? "") };
|
|
19
|
+
case "input_image": {
|
|
20
|
+
const urlObj = asImageUrlObject(part);
|
|
21
|
+
if (!urlObj)
|
|
22
|
+
return null;
|
|
23
|
+
return { type: "image_url", image_url: urlObj };
|
|
24
|
+
}
|
|
25
|
+
case "input_audio":
|
|
26
|
+
return {
|
|
27
|
+
type: "text",
|
|
28
|
+
text: "[audio omitted: provider does not support input_audio]",
|
|
29
|
+
};
|
|
30
|
+
default:
|
|
31
|
+
return part;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function mapMessage(msg) {
|
|
35
|
+
const role = msg.role === "developer" ? "system" : msg.role;
|
|
36
|
+
if (typeof msg.content === "string") {
|
|
37
|
+
return { ...msg, role };
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(msg.content)) {
|
|
40
|
+
const mapped = msg.content.map(mapContentPart).filter(Boolean);
|
|
41
|
+
return { ...msg, role, content: mapped.length ? mapped : "" };
|
|
42
|
+
}
|
|
43
|
+
return { ...msg, role };
|
|
44
|
+
}
|
|
45
|
+
export function transformResponsesToChatCompletions(body) {
|
|
46
|
+
const result = { ...body };
|
|
47
|
+
if (result.input && !result.messages) {
|
|
48
|
+
result.messages = result.input;
|
|
49
|
+
delete result.input;
|
|
50
|
+
}
|
|
51
|
+
if (typeof result.messages === "string") {
|
|
52
|
+
result.messages = [{ role: "user", content: result.messages }];
|
|
53
|
+
}
|
|
54
|
+
if (result.instructions) {
|
|
55
|
+
result.messages = [
|
|
56
|
+
{ role: "system", content: String(result.instructions) },
|
|
57
|
+
...(Array.isArray(result.messages) ? result.messages : []),
|
|
58
|
+
];
|
|
59
|
+
delete result.instructions;
|
|
60
|
+
}
|
|
61
|
+
if (Array.isArray(result.messages)) {
|
|
62
|
+
result.messages = result.messages.flatMap((item) => {
|
|
63
|
+
if (item && typeof item === "object" && "role" in item) {
|
|
64
|
+
return [mapMessage(item)];
|
|
65
|
+
}
|
|
66
|
+
if (item?.type === "function_call_output") {
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
role: "tool",
|
|
70
|
+
tool_call_id: item.call_id ?? item.id ?? "unknown",
|
|
71
|
+
content: typeof item.output === "string"
|
|
72
|
+
? item.output
|
|
73
|
+
: JSON.stringify(item.output ?? {}),
|
|
74
|
+
},
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
return [];
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (result.max_output_tokens && !result.max_tokens) {
|
|
81
|
+
result.max_tokens = result.max_output_tokens;
|
|
82
|
+
delete result.max_output_tokens;
|
|
83
|
+
}
|
|
84
|
+
if (result.text?.format && !result.response_format) {
|
|
85
|
+
result.response_format = result.text.format;
|
|
86
|
+
delete result.text;
|
|
87
|
+
}
|
|
88
|
+
if (Array.isArray(result.tools)) {
|
|
89
|
+
result.tools = result.tools.map((tool) => {
|
|
90
|
+
if (tool.type === "function" && tool.name && !tool.function) {
|
|
91
|
+
const { type, name, description, parameters, strict, ...rest } = tool;
|
|
92
|
+
return {
|
|
93
|
+
type: "function",
|
|
94
|
+
function: { name, description, parameters, strict },
|
|
95
|
+
...rest,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return tool;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
delete result.store;
|
|
102
|
+
delete result.include;
|
|
103
|
+
delete result.previous_response_id;
|
|
104
|
+
return result;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/transform/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type JsonValue = any;
|
|
2
|
+
export interface TransformContext {
|
|
3
|
+
responseId: string;
|
|
4
|
+
itemId: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function createTransformContext(): TransformContext;
|
|
8
|
+
export declare function transformChatCompletionsToResponses(chatBody: JsonValue, ctx: TransformContext): JsonValue;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/transform/response.ts"],"names":[],"mappings":"AACA,KAAK,SAAS,GAAG,GAAG,CAAC;AAErB,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAMzD;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,EACnB,GAAG,EAAE,gBAAgB,GACpB,SAAS,CAgDX"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function createTransformContext() {
|
|
2
|
+
return {
|
|
3
|
+
responseId: `resp_${Date.now().toString(36)}`,
|
|
4
|
+
itemId: `msg_${Date.now().toString(36)}`,
|
|
5
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function transformChatCompletionsToResponses(chatBody, ctx) {
|
|
9
|
+
const choice = chatBody.choices?.[0];
|
|
10
|
+
const message = choice?.message;
|
|
11
|
+
const content = message?.content ?? "";
|
|
12
|
+
const toolCalls = message?.tool_calls;
|
|
13
|
+
const outputItems = [];
|
|
14
|
+
if (content) {
|
|
15
|
+
outputItems.push({
|
|
16
|
+
type: "message",
|
|
17
|
+
id: ctx.itemId,
|
|
18
|
+
status: "completed",
|
|
19
|
+
role: "assistant",
|
|
20
|
+
content: [{ type: "output_text", text: content, annotations: [] }],
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (toolCalls && Array.isArray(toolCalls)) {
|
|
24
|
+
for (const tc of toolCalls) {
|
|
25
|
+
const fn = tc.function;
|
|
26
|
+
outputItems.push({
|
|
27
|
+
type: "function_call",
|
|
28
|
+
id: tc.id ?? `call_${Date.now().toString(36)}`,
|
|
29
|
+
status: "completed",
|
|
30
|
+
name: fn?.name ?? "",
|
|
31
|
+
arguments: fn?.arguments ?? "{}",
|
|
32
|
+
call_id: tc.id,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const usage = chatBody.usage;
|
|
37
|
+
return {
|
|
38
|
+
id: ctx.responseId,
|
|
39
|
+
object: "response",
|
|
40
|
+
created_at: ctx.createdAt,
|
|
41
|
+
status: "completed",
|
|
42
|
+
model: chatBody.model ?? "qwen",
|
|
43
|
+
output: outputItems,
|
|
44
|
+
usage: usage
|
|
45
|
+
? {
|
|
46
|
+
input_tokens: usage.prompt_tokens ?? 0,
|
|
47
|
+
output_tokens: usage.completion_tokens ?? 0,
|
|
48
|
+
}
|
|
49
|
+
: undefined,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/transform/response.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC7C,MAAM,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACxC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,QAAmB,EACnB,GAAqB;IAErB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,CAAC;IAChC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,EAAE,UAAU,CAAC;IAEtC,MAAM,WAAW,GAAgB,EAAE,CAAC;IAEpC,IAAI,OAAO,EAAE,CAAC;QACZ,WAAW,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,SAAS;YACf,EAAE,EAAE,GAAG,CAAC,MAAM;YACd,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;SACnE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC;YACvB,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,eAAe;gBACrB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;gBAC9C,MAAM,EAAE,WAAW;gBACnB,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE;gBACpB,SAAS,EAAE,EAAE,EAAE,SAAS,IAAI,IAAI;gBAChC,OAAO,EAAE,EAAE,CAAC,EAAE;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE7B,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,UAAU;QAClB,MAAM,EAAE,UAAU;QAClB,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,MAAM;QAC/B,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,KAAK;YACV,CAAC,CAAC;gBACE,YAAY,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;gBACtC,aAAa,EAAE,KAAK,CAAC,iBAAiB,IAAI,CAAC;aAC5C;YACH,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Logger } from "../plugin/logger";
|
|
2
|
+
export interface SSETransformContext {
|
|
3
|
+
responseId: string;
|
|
4
|
+
itemId: string;
|
|
5
|
+
createdAt: number;
|
|
6
|
+
logger?: Logger;
|
|
7
|
+
}
|
|
8
|
+
export declare function createSSETransformContext(logger?: Logger): SSETransformContext;
|
|
9
|
+
export declare function createSSETransformStream(ctx: SSETransformContext): TransformStream<Uint8Array, Uint8Array>;
|
|
10
|
+
//# sourceMappingURL=sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/transform/sse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,CAAC,EAAE,MAAM,GACd,mBAAmB,CAOrB;AAUD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,mBAAmB,GACvB,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CA8PzC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
export function createSSETransformContext(logger) {
|
|
2
|
+
return {
|
|
3
|
+
responseId: `resp_${Date.now().toString(36)}`,
|
|
4
|
+
itemId: `msg_${Date.now().toString(36)}`,
|
|
5
|
+
createdAt: Math.floor(Date.now() / 1000),
|
|
6
|
+
logger,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function createSSETransformStream(ctx) {
|
|
10
|
+
let accumulatedText = "";
|
|
11
|
+
let sentCreated = false;
|
|
12
|
+
let sentItemAdded = false;
|
|
13
|
+
let sentContentPartAdded = false;
|
|
14
|
+
let messageOutputIndex = -1;
|
|
15
|
+
let inputTokens = 0;
|
|
16
|
+
let outputTokens = 0;
|
|
17
|
+
let modelName = "qwen";
|
|
18
|
+
let buffer = "";
|
|
19
|
+
let nextOutputIndex = 0;
|
|
20
|
+
const toolCallStates = new Map();
|
|
21
|
+
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
22
|
+
const encoder = new TextEncoder();
|
|
23
|
+
const emit = (event) => {
|
|
24
|
+
return encoder.encode(`data: ${JSON.stringify(event)}\n\n`);
|
|
25
|
+
};
|
|
26
|
+
return new TransformStream({
|
|
27
|
+
transform(chunk, controller) {
|
|
28
|
+
buffer += decoder.decode(chunk, { stream: true });
|
|
29
|
+
const lines = buffer.split(/\r?\n/);
|
|
30
|
+
buffer = lines.pop() ?? "";
|
|
31
|
+
for (let line of lines) {
|
|
32
|
+
line = line.replace(/\r$/, "");
|
|
33
|
+
if (!line.startsWith("data: "))
|
|
34
|
+
continue;
|
|
35
|
+
const data = line.slice(6).trim();
|
|
36
|
+
if (data === "[DONE]") {
|
|
37
|
+
if (accumulatedText || sentContentPartAdded) {
|
|
38
|
+
controller.enqueue(emit({
|
|
39
|
+
type: "response.output_text.done",
|
|
40
|
+
item_id: ctx.itemId,
|
|
41
|
+
output_index: messageOutputIndex,
|
|
42
|
+
content_index: 0,
|
|
43
|
+
text: accumulatedText,
|
|
44
|
+
}));
|
|
45
|
+
controller.enqueue(emit({
|
|
46
|
+
type: "response.content_part.done",
|
|
47
|
+
item_id: ctx.itemId,
|
|
48
|
+
output_index: messageOutputIndex,
|
|
49
|
+
content_index: 0,
|
|
50
|
+
part: {
|
|
51
|
+
type: "output_text",
|
|
52
|
+
text: accumulatedText,
|
|
53
|
+
annotations: [],
|
|
54
|
+
},
|
|
55
|
+
}));
|
|
56
|
+
controller.enqueue(emit({
|
|
57
|
+
type: "response.output_item.done",
|
|
58
|
+
output_index: messageOutputIndex,
|
|
59
|
+
item: {
|
|
60
|
+
id: ctx.itemId,
|
|
61
|
+
type: "message",
|
|
62
|
+
status: "completed",
|
|
63
|
+
role: "assistant",
|
|
64
|
+
content: [{ type: "output_text", text: accumulatedText }],
|
|
65
|
+
},
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
for (const [, tcState] of toolCallStates) {
|
|
69
|
+
controller.enqueue(emit({
|
|
70
|
+
type: "response.function_call_arguments.done",
|
|
71
|
+
item_id: tcState.id,
|
|
72
|
+
output_index: tcState.outputIndex,
|
|
73
|
+
arguments: tcState.arguments,
|
|
74
|
+
}));
|
|
75
|
+
controller.enqueue(emit({
|
|
76
|
+
type: "response.output_item.done",
|
|
77
|
+
output_index: tcState.outputIndex,
|
|
78
|
+
item: {
|
|
79
|
+
id: tcState.id,
|
|
80
|
+
type: "function_call",
|
|
81
|
+
status: "completed",
|
|
82
|
+
name: tcState.name,
|
|
83
|
+
arguments: tcState.arguments,
|
|
84
|
+
call_id: tcState.id,
|
|
85
|
+
},
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
controller.enqueue(emit({
|
|
89
|
+
type: "response.completed",
|
|
90
|
+
response: {
|
|
91
|
+
id: ctx.responseId,
|
|
92
|
+
object: "response",
|
|
93
|
+
created_at: ctx.createdAt,
|
|
94
|
+
status: "completed",
|
|
95
|
+
model: modelName,
|
|
96
|
+
usage: {
|
|
97
|
+
input_tokens: inputTokens,
|
|
98
|
+
output_tokens: outputTokens,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const parsed = JSON.parse(data);
|
|
107
|
+
if (parsed.model)
|
|
108
|
+
modelName = parsed.model;
|
|
109
|
+
const usage = parsed.usage;
|
|
110
|
+
if (usage) {
|
|
111
|
+
inputTokens = usage.prompt_tokens ?? inputTokens;
|
|
112
|
+
outputTokens = usage.completion_tokens ?? outputTokens;
|
|
113
|
+
}
|
|
114
|
+
if (!sentCreated) {
|
|
115
|
+
controller.enqueue(emit({
|
|
116
|
+
type: "response.created",
|
|
117
|
+
response: {
|
|
118
|
+
id: ctx.responseId,
|
|
119
|
+
object: "response",
|
|
120
|
+
created_at: ctx.createdAt,
|
|
121
|
+
status: "in_progress",
|
|
122
|
+
model: modelName,
|
|
123
|
+
},
|
|
124
|
+
}));
|
|
125
|
+
sentCreated = true;
|
|
126
|
+
}
|
|
127
|
+
const choices = parsed.choices;
|
|
128
|
+
const delta = choices?.[0]?.delta?.content;
|
|
129
|
+
if (delta !== undefined && delta !== null) {
|
|
130
|
+
if (!sentItemAdded) {
|
|
131
|
+
messageOutputIndex = nextOutputIndex++;
|
|
132
|
+
controller.enqueue(emit({
|
|
133
|
+
type: "response.output_item.added",
|
|
134
|
+
output_index: messageOutputIndex,
|
|
135
|
+
item: {
|
|
136
|
+
id: ctx.itemId,
|
|
137
|
+
type: "message",
|
|
138
|
+
status: "in_progress",
|
|
139
|
+
role: "assistant",
|
|
140
|
+
content: [],
|
|
141
|
+
},
|
|
142
|
+
}));
|
|
143
|
+
sentItemAdded = true;
|
|
144
|
+
}
|
|
145
|
+
if (!sentContentPartAdded) {
|
|
146
|
+
controller.enqueue(emit({
|
|
147
|
+
type: "response.content_part.added",
|
|
148
|
+
item_id: ctx.itemId,
|
|
149
|
+
output_index: messageOutputIndex,
|
|
150
|
+
content_index: 0,
|
|
151
|
+
part: { type: "output_text", text: "", annotations: [] },
|
|
152
|
+
}));
|
|
153
|
+
sentContentPartAdded = true;
|
|
154
|
+
}
|
|
155
|
+
if (delta) {
|
|
156
|
+
accumulatedText += delta;
|
|
157
|
+
controller.enqueue(emit({
|
|
158
|
+
type: "response.output_text.delta",
|
|
159
|
+
item_id: ctx.itemId,
|
|
160
|
+
output_index: messageOutputIndex,
|
|
161
|
+
content_index: 0,
|
|
162
|
+
delta: delta,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const toolCalls = choices?.[0]?.delta?.tool_calls;
|
|
167
|
+
if (toolCalls && Array.isArray(toolCalls)) {
|
|
168
|
+
for (const tc of toolCalls) {
|
|
169
|
+
const tcIndex = tc.index ?? 0;
|
|
170
|
+
const fn = tc.function;
|
|
171
|
+
const tcId = tc.id ?? `call_${Date.now().toString(36)}_${tcIndex}`;
|
|
172
|
+
let state = toolCallStates.get(tcIndex);
|
|
173
|
+
if (!state) {
|
|
174
|
+
state = {
|
|
175
|
+
id: tcId,
|
|
176
|
+
name: fn?.name ?? "",
|
|
177
|
+
arguments: "",
|
|
178
|
+
emittedAdded: false,
|
|
179
|
+
outputIndex: nextOutputIndex++,
|
|
180
|
+
};
|
|
181
|
+
toolCallStates.set(tcIndex, state);
|
|
182
|
+
}
|
|
183
|
+
if (tc.id && !state.emittedAdded)
|
|
184
|
+
state.id = tc.id;
|
|
185
|
+
if (fn?.name)
|
|
186
|
+
state.name = fn.name;
|
|
187
|
+
if (fn?.arguments)
|
|
188
|
+
state.arguments += fn.arguments;
|
|
189
|
+
if (!state.emittedAdded && state.name) {
|
|
190
|
+
controller.enqueue(emit({
|
|
191
|
+
type: "response.output_item.added",
|
|
192
|
+
output_index: state.outputIndex,
|
|
193
|
+
item: {
|
|
194
|
+
id: state.id,
|
|
195
|
+
type: "function_call",
|
|
196
|
+
status: "in_progress",
|
|
197
|
+
name: state.name,
|
|
198
|
+
arguments: "",
|
|
199
|
+
call_id: state.id,
|
|
200
|
+
},
|
|
201
|
+
}));
|
|
202
|
+
state.emittedAdded = true;
|
|
203
|
+
}
|
|
204
|
+
if (fn?.arguments) {
|
|
205
|
+
controller.enqueue(emit({
|
|
206
|
+
type: "response.function_call_arguments.delta",
|
|
207
|
+
item_id: state.id,
|
|
208
|
+
output_index: state.outputIndex,
|
|
209
|
+
delta: fn.arguments,
|
|
210
|
+
}));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// Skip malformed JSON
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
flush(_controller) {
|
|
221
|
+
buffer += decoder.decode();
|
|
222
|
+
if (buffer.trim()) {
|
|
223
|
+
ctx.logger?.verbose("Flush remaining SSE buffer", {
|
|
224
|
+
length: buffer.length,
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/transform/sse.ts"],"names":[],"mappings":"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"}
|