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.
Files changed (67) hide show
  1. package/LICENSE +203 -0
  2. package/README.md +252 -0
  3. package/dist/index.d.ts +5 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/constants.d.ts +7 -0
  8. package/dist/src/constants.d.ts.map +1 -0
  9. package/dist/src/constants.js +12 -0
  10. package/dist/src/constants.js.map +1 -0
  11. package/dist/src/plugin/account.d.ts +40 -0
  12. package/dist/src/plugin/account.d.ts.map +1 -0
  13. package/dist/src/plugin/account.js +237 -0
  14. package/dist/src/plugin/account.js.map +1 -0
  15. package/dist/src/plugin/auth.d.ts +5 -0
  16. package/dist/src/plugin/auth.d.ts.map +1 -0
  17. package/dist/src/plugin/auth.js +16 -0
  18. package/dist/src/plugin/auth.js.map +1 -0
  19. package/dist/src/plugin/config/index.d.ts +4 -0
  20. package/dist/src/plugin/config/index.d.ts.map +1 -0
  21. package/dist/src/plugin/config/index.js +3 -0
  22. package/dist/src/plugin/config/index.js.map +1 -0
  23. package/dist/src/plugin/config/loader.d.ts +3 -0
  24. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  25. package/dist/src/plugin/config/loader.js +69 -0
  26. package/dist/src/plugin/config/loader.js.map +1 -0
  27. package/dist/src/plugin/config/schema.d.ts +31 -0
  28. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  29. package/dist/src/plugin/config/schema.js +15 -0
  30. package/dist/src/plugin/config/schema.js.map +1 -0
  31. package/dist/src/plugin/logger.d.ts +12 -0
  32. package/dist/src/plugin/logger.d.ts.map +1 -0
  33. package/dist/src/plugin/logger.js +74 -0
  34. package/dist/src/plugin/logger.js.map +1 -0
  35. package/dist/src/plugin/token.d.ts +8 -0
  36. package/dist/src/plugin/token.d.ts.map +1 -0
  37. package/dist/src/plugin/token.js +29 -0
  38. package/dist/src/plugin/token.js.map +1 -0
  39. package/dist/src/plugin/types.d.ts +96 -0
  40. package/dist/src/plugin/types.d.ts.map +1 -0
  41. package/dist/src/plugin/types.js +2 -0
  42. package/dist/src/plugin/types.js.map +1 -0
  43. package/dist/src/plugin.d.ts +11 -0
  44. package/dist/src/plugin.d.ts.map +1 -0
  45. package/dist/src/plugin.js +439 -0
  46. package/dist/src/plugin.js.map +1 -0
  47. package/dist/src/qwen/oauth.d.ts +29 -0
  48. package/dist/src/qwen/oauth.d.ts.map +1 -0
  49. package/dist/src/qwen/oauth.js +151 -0
  50. package/dist/src/qwen/oauth.js.map +1 -0
  51. package/dist/src/transform/index.d.ts +4 -0
  52. package/dist/src/transform/index.d.ts.map +1 -0
  53. package/dist/src/transform/index.js +4 -0
  54. package/dist/src/transform/index.js.map +1 -0
  55. package/dist/src/transform/request.d.ts +4 -0
  56. package/dist/src/transform/request.d.ts.map +1 -0
  57. package/dist/src/transform/request.js +106 -0
  58. package/dist/src/transform/request.js.map +1 -0
  59. package/dist/src/transform/response.d.ts +10 -0
  60. package/dist/src/transform/response.d.ts.map +1 -0
  61. package/dist/src/transform/response.js +52 -0
  62. package/dist/src/transform/response.js.map +1 -0
  63. package/dist/src/transform/sse.d.ts +10 -0
  64. package/dist/src/transform/sse.d.ts.map +1 -0
  65. package/dist/src/transform/sse.js +230 -0
  66. package/dist/src/transform/sse.js.map +1 -0
  67. 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,4 @@
1
+ export { transformResponsesToChatCompletions } from "./request";
2
+ export { createTransformContext, transformChatCompletionsToResponses, } from "./response";
3
+ export { createSSETransformContext, createSSETransformStream, } from "./sse";
4
+ //# sourceMappingURL=index.js.map
@@ -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,4 @@
1
+ type JsonValue = any;
2
+ export declare function transformResponsesToChatCompletions(body: JsonValue): JsonValue;
3
+ export {};
4
+ //# sourceMappingURL=request.d.ts.map
@@ -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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"}