opencode-qwen-cli-auth 1.0.0 → 1.0.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/dist/index.d.ts +1 -1
- package/dist/index.js +10 -1
- package/package.json +1 -1
- package/dist/lib/prompts/fallback/opencode-qwen-prompt.txt +0 -109
- package/dist/lib/prompts/opencode-qwen.d.ts +0 -14
- package/dist/lib/prompts/opencode-qwen.d.ts.map +0 -1
- package/dist/lib/prompts/opencode-qwen.js +0 -121
- package/dist/lib/prompts/opencode-qwen.js.map +0 -1
- package/dist/lib/prompts/qwen-code.d.ts +0 -25
- package/dist/lib/prompts/qwen-code.d.ts.map +0 -1
- package/dist/lib/prompts/qwen-code.js +0 -307
- package/dist/lib/prompts/qwen-code.js.map +0 -1
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts +0 -15
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts.map +0 -1
- package/dist/lib/prompts/qwen-opencode-bridge.js +0 -81
- package/dist/lib/prompts/qwen-opencode-bridge.js.map +0 -1
- package/dist/lib/request/fetch-helpers.d.ts +0 -19
- package/dist/lib/request/fetch-helpers.d.ts.map +0 -1
- package/dist/lib/request/fetch-helpers.js +0 -50
- package/dist/lib/request/fetch-helpers.js.map +0 -1
- package/dist/lib/request/header-utils.d.ts +0 -38
- package/dist/lib/request/header-utils.d.ts.map +0 -1
- package/dist/lib/request/header-utils.js +0 -75
- package/dist/lib/request/header-utils.js.map +0 -1
- package/dist/lib/request/openai-chunk-builder.d.ts +0 -68
- package/dist/lib/request/openai-chunk-builder.d.ts.map +0 -1
- package/dist/lib/request/openai-chunk-builder.js +0 -110
- package/dist/lib/request/openai-chunk-builder.js.map +0 -1
- package/dist/lib/request/payload-analyzer.d.ts +0 -34
- package/dist/lib/request/payload-analyzer.d.ts.map +0 -1
- package/dist/lib/request/payload-analyzer.js +0 -114
- package/dist/lib/request/payload-analyzer.js.map +0 -1
- package/dist/lib/request/request-transformer.d.ts +0 -39
- package/dist/lib/request/request-transformer.d.ts.map +0 -1
- package/dist/lib/request/request-transformer.js +0 -108
- package/dist/lib/request/request-transformer.js.map +0 -1
- package/dist/lib/request/response-handler.d.ts +0 -15
- package/dist/lib/request/response-handler.d.ts.map +0 -1
- package/dist/lib/request/response-handler.js +0 -90
- package/dist/lib/request/response-handler.js.map +0 -1
- package/dist/lib/request/sse-parser.d.ts +0 -36
- package/dist/lib/request/sse-parser.d.ts.map +0 -1
- package/dist/lib/request/sse-parser.js +0 -85
- package/dist/lib/request/sse-parser.js.map +0 -1
- package/dist/lib/request/stream-normalizer.d.ts +0 -18
- package/dist/lib/request/stream-normalizer.d.ts.map +0 -1
- package/dist/lib/request/stream-normalizer.js +0 -140
- package/dist/lib/request/stream-normalizer.js.map +0 -1
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI Chat Completions chunk builder
|
|
3
|
-
* Creates properly formatted OpenAI-style streaming chunks
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* OpenAI chat completion chunk structure
|
|
7
|
-
*/
|
|
8
|
-
export interface OpenAIChunk {
|
|
9
|
-
id: string;
|
|
10
|
-
object: 'chat.completion.chunk';
|
|
11
|
-
created: number;
|
|
12
|
-
model: string;
|
|
13
|
-
choices: Array<{
|
|
14
|
-
index: number;
|
|
15
|
-
delta: {
|
|
16
|
-
role?: 'assistant';
|
|
17
|
-
content?: string;
|
|
18
|
-
};
|
|
19
|
-
finish_reason: string | null;
|
|
20
|
-
}>;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Builder class for creating OpenAI-compatible streaming chunks
|
|
24
|
-
*/
|
|
25
|
-
export declare class OpenAIChunkBuilder {
|
|
26
|
-
private chunkId;
|
|
27
|
-
private model;
|
|
28
|
-
private sentInitialRole;
|
|
29
|
-
/**
|
|
30
|
-
* Create a new chunk builder
|
|
31
|
-
* @param model - Model name to include in chunks
|
|
32
|
-
*/
|
|
33
|
-
constructor(model?: string);
|
|
34
|
-
/**
|
|
35
|
-
* Create a chunk with role information (first chunk only)
|
|
36
|
-
* @returns OpenAI chunk with role
|
|
37
|
-
*/
|
|
38
|
-
createRoleChunk(): OpenAIChunk;
|
|
39
|
-
/**
|
|
40
|
-
* Create a chunk with content delta
|
|
41
|
-
* @param content - Text content to include
|
|
42
|
-
* @returns OpenAI chunk with content
|
|
43
|
-
*/
|
|
44
|
-
createContentChunk(content: string): OpenAIChunk;
|
|
45
|
-
/**
|
|
46
|
-
* Create a finish chunk with completion reason
|
|
47
|
-
* @param reason - Finish reason (e.g., 'stop', 'length')
|
|
48
|
-
* @returns OpenAI chunk with finish reason
|
|
49
|
-
*/
|
|
50
|
-
createFinishChunk(reason?: string): OpenAIChunk;
|
|
51
|
-
/**
|
|
52
|
-
* Format a chunk as SSE data line
|
|
53
|
-
* @param chunk - OpenAI chunk to format
|
|
54
|
-
* @returns Formatted SSE line
|
|
55
|
-
*/
|
|
56
|
-
formatAsSSE(chunk: OpenAIChunk): string;
|
|
57
|
-
/**
|
|
58
|
-
* Create the [DONE] marker
|
|
59
|
-
* @returns Formatted [DONE] SSE line
|
|
60
|
-
*/
|
|
61
|
-
createDoneMarker(): string;
|
|
62
|
-
/**
|
|
63
|
-
* Check if initial role has been sent
|
|
64
|
-
* @returns True if role chunk was already created
|
|
65
|
-
*/
|
|
66
|
-
hasRole(): boolean;
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=openai-chunk-builder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-chunk-builder.d.ts","sourceRoot":"","sources":["../../../lib/request/openai-chunk-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE;YACN,IAAI,CAAC,EAAE,WAAW,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;OAGG;gBACS,KAAK,GAAE,MAAsB;IAKzC;;;OAGG;IACH,eAAe,IAAI,WAAW;IAiB9B;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAyBhD;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,GAAE,MAAe,GAAG,WAAW;IAgBvD;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IAIvC;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;OAGG;IACH,OAAO,IAAI,OAAO;CAGlB"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI Chat Completions chunk builder
|
|
3
|
-
* Creates properly formatted OpenAI-style streaming chunks
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Builder class for creating OpenAI-compatible streaming chunks
|
|
7
|
-
*/
|
|
8
|
-
export class OpenAIChunkBuilder {
|
|
9
|
-
chunkId;
|
|
10
|
-
model;
|
|
11
|
-
sentInitialRole = false;
|
|
12
|
-
/**
|
|
13
|
-
* Create a new chunk builder
|
|
14
|
-
* @param model - Model name to include in chunks
|
|
15
|
-
*/
|
|
16
|
-
constructor(model = 'coder-model') {
|
|
17
|
-
this.chunkId = `chatcmpl_${Math.random().toString(36).slice(2, 12)}`;
|
|
18
|
-
this.model = model;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Create a chunk with role information (first chunk only)
|
|
22
|
-
* @returns OpenAI chunk with role
|
|
23
|
-
*/
|
|
24
|
-
createRoleChunk() {
|
|
25
|
-
this.sentInitialRole = true;
|
|
26
|
-
return {
|
|
27
|
-
id: this.chunkId,
|
|
28
|
-
object: 'chat.completion.chunk',
|
|
29
|
-
created: Math.floor(Date.now() / 1000),
|
|
30
|
-
model: this.model,
|
|
31
|
-
choices: [
|
|
32
|
-
{
|
|
33
|
-
index: 0,
|
|
34
|
-
delta: { role: 'assistant' },
|
|
35
|
-
finish_reason: null,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Create a chunk with content delta
|
|
42
|
-
* @param content - Text content to include
|
|
43
|
-
* @returns OpenAI chunk with content
|
|
44
|
-
*/
|
|
45
|
-
createContentChunk(content) {
|
|
46
|
-
const chunk = {
|
|
47
|
-
id: this.chunkId,
|
|
48
|
-
object: 'chat.completion.chunk',
|
|
49
|
-
created: Math.floor(Date.now() / 1000),
|
|
50
|
-
model: this.model,
|
|
51
|
-
choices: [
|
|
52
|
-
{
|
|
53
|
-
index: 0,
|
|
54
|
-
delta: {},
|
|
55
|
-
finish_reason: null,
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
};
|
|
59
|
-
// Include role in first content chunk if not sent separately
|
|
60
|
-
if (!this.sentInitialRole) {
|
|
61
|
-
chunk.choices[0].delta.role = 'assistant';
|
|
62
|
-
this.sentInitialRole = true;
|
|
63
|
-
}
|
|
64
|
-
chunk.choices[0].delta.content = content;
|
|
65
|
-
return chunk;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Create a finish chunk with completion reason
|
|
69
|
-
* @param reason - Finish reason (e.g., 'stop', 'length')
|
|
70
|
-
* @returns OpenAI chunk with finish reason
|
|
71
|
-
*/
|
|
72
|
-
createFinishChunk(reason = 'stop') {
|
|
73
|
-
return {
|
|
74
|
-
id: this.chunkId,
|
|
75
|
-
object: 'chat.completion.chunk',
|
|
76
|
-
created: Math.floor(Date.now() / 1000),
|
|
77
|
-
model: this.model,
|
|
78
|
-
choices: [
|
|
79
|
-
{
|
|
80
|
-
index: 0,
|
|
81
|
-
delta: {},
|
|
82
|
-
finish_reason: reason,
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Format a chunk as SSE data line
|
|
89
|
-
* @param chunk - OpenAI chunk to format
|
|
90
|
-
* @returns Formatted SSE line
|
|
91
|
-
*/
|
|
92
|
-
formatAsSSE(chunk) {
|
|
93
|
-
return `data: ${JSON.stringify(chunk)}\n\n`;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Create the [DONE] marker
|
|
97
|
-
* @returns Formatted [DONE] SSE line
|
|
98
|
-
*/
|
|
99
|
-
createDoneMarker() {
|
|
100
|
-
return 'data: [DONE]\n\n';
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Check if initial role has been sent
|
|
104
|
-
* @returns True if role chunk was already created
|
|
105
|
-
*/
|
|
106
|
-
hasRole() {
|
|
107
|
-
return this.sentInitialRole;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=openai-chunk-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"openai-chunk-builder.js","sourceRoot":"","sources":["../../../lib/request/openai-chunk-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACtB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,eAAe,GAAY,KAAK,CAAC;IAEzC;;;OAGG;IACH,YAAY,QAAgB,aAAa;QACxC,IAAI,CAAC,OAAO,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,eAAe;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5B,aAAa,EAAE,IAAI;iBACnB;aACD;SACD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,OAAe;QACjC,MAAM,KAAK,GAAgB;YAC1B,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE;oBACT,aAAa,EAAE,IAAI;iBACnB;aACD;SACD,CAAC;QAEF,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC;YAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,SAAiB,MAAM;QACxC,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE;oBACT,aAAa,EAAE,MAAM;iBACrB;aACD;SACD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAkB;QAC7B,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACf,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACN,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;CACD"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Payload analysis utilities
|
|
3
|
-
* Extracts and analyzes content from various API response formats
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Extract text content from a payload with various possible structures
|
|
7
|
-
* Handles multiple API response formats (OpenAI, Qwen, etc.)
|
|
8
|
-
*
|
|
9
|
-
* @param payload - Response payload to analyze
|
|
10
|
-
* @returns Extracted text content, or undefined if not found
|
|
11
|
-
*/
|
|
12
|
-
export declare function extractText(payload: unknown): string | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* Determine if the current text is cumulative (contains all previous text)
|
|
15
|
-
* or incremental (only new text)
|
|
16
|
-
*
|
|
17
|
-
* @param current - Current text from payload
|
|
18
|
-
* @param previous - Previously accumulated text
|
|
19
|
-
* @returns True if current text is cumulative (starts with previous text)
|
|
20
|
-
*/
|
|
21
|
-
export declare function isCumulative(current: string, previous: string): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Calculate the delta (new text) from current and previous text
|
|
24
|
-
* Handles both cumulative and incremental formats
|
|
25
|
-
*
|
|
26
|
-
* @param current - Current text from payload
|
|
27
|
-
* @param previous - Previously accumulated text
|
|
28
|
-
* @returns Object with new text delta and updated cumulative text
|
|
29
|
-
*/
|
|
30
|
-
export declare function calculateDelta(current: string, previous: string): {
|
|
31
|
-
delta: string;
|
|
32
|
-
cumulative: string;
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=payload-analyzer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payload-analyzer.d.ts","sourceRoot":"","sources":["../../../lib/request/payload-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA6DhE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAcvC"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Payload analysis utilities
|
|
3
|
-
* Extracts and analyzes content from various API response formats
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Extract text content from a payload with various possible structures
|
|
7
|
-
* Handles multiple API response formats (OpenAI, Qwen, etc.)
|
|
8
|
-
*
|
|
9
|
-
* @param payload - Response payload to analyze
|
|
10
|
-
* @returns Extracted text content, or undefined if not found
|
|
11
|
-
*/
|
|
12
|
-
export function extractText(payload) {
|
|
13
|
-
if (!payload || typeof payload !== 'object')
|
|
14
|
-
return undefined;
|
|
15
|
-
// Type guard to ensure payload is an object
|
|
16
|
-
const obj = payload;
|
|
17
|
-
// Common direct string fields
|
|
18
|
-
if (typeof obj.delta === 'string')
|
|
19
|
-
return obj.delta;
|
|
20
|
-
if (typeof obj.text === 'string')
|
|
21
|
-
return obj.text;
|
|
22
|
-
if (typeof obj.output_text === 'string')
|
|
23
|
-
return obj.output_text;
|
|
24
|
-
// Nested checks with proper type guards
|
|
25
|
-
if (obj.response && typeof obj.response === 'object') {
|
|
26
|
-
const response = obj.response;
|
|
27
|
-
if (typeof response.output_text === 'string')
|
|
28
|
-
return response.output_text;
|
|
29
|
-
}
|
|
30
|
-
if (obj.message && typeof obj.message === 'object') {
|
|
31
|
-
const message = obj.message;
|
|
32
|
-
if (typeof message.content === 'string')
|
|
33
|
-
return message.content;
|
|
34
|
-
}
|
|
35
|
-
if (Array.isArray(obj.choices) && obj.choices.length > 0) {
|
|
36
|
-
const choice = obj.choices[0];
|
|
37
|
-
if (choice.delta && typeof choice.delta === 'object') {
|
|
38
|
-
const delta = choice.delta;
|
|
39
|
-
if (typeof delta.content === 'string')
|
|
40
|
-
return delta.content;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Nested under delta
|
|
44
|
-
if (obj.delta && typeof obj.delta === 'object') {
|
|
45
|
-
const delta = obj.delta;
|
|
46
|
-
if (typeof delta.text === 'string')
|
|
47
|
-
return delta.text;
|
|
48
|
-
if (typeof delta.content === 'string')
|
|
49
|
-
return delta.content;
|
|
50
|
-
}
|
|
51
|
-
// Array-shaped content collectors
|
|
52
|
-
const candidates = [
|
|
53
|
-
obj.message && typeof obj.message === 'object' ? obj.message.content : undefined,
|
|
54
|
-
obj.delta && typeof obj.delta === 'object' ? obj.delta.content : undefined,
|
|
55
|
-
obj.content
|
|
56
|
-
];
|
|
57
|
-
for (const c of candidates) {
|
|
58
|
-
if (Array.isArray(c)) {
|
|
59
|
-
let combined = '';
|
|
60
|
-
for (const item of c) {
|
|
61
|
-
if (typeof item === 'string') {
|
|
62
|
-
combined += item;
|
|
63
|
-
}
|
|
64
|
-
else if (item && typeof item === 'object') {
|
|
65
|
-
const itemObj = item;
|
|
66
|
-
if (typeof itemObj.text === 'string')
|
|
67
|
-
combined += itemObj.text;
|
|
68
|
-
else if (typeof itemObj.content === 'string')
|
|
69
|
-
combined += itemObj.content;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
if (combined)
|
|
73
|
-
return combined;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Determine if the current text is cumulative (contains all previous text)
|
|
80
|
-
* or incremental (only new text)
|
|
81
|
-
*
|
|
82
|
-
* @param current - Current text from payload
|
|
83
|
-
* @param previous - Previously accumulated text
|
|
84
|
-
* @returns True if current text is cumulative (starts with previous text)
|
|
85
|
-
*/
|
|
86
|
-
export function isCumulative(current, previous) {
|
|
87
|
-
if (!previous)
|
|
88
|
-
return false;
|
|
89
|
-
return current.startsWith(previous);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Calculate the delta (new text) from current and previous text
|
|
93
|
-
* Handles both cumulative and incremental formats
|
|
94
|
-
*
|
|
95
|
-
* @param current - Current text from payload
|
|
96
|
-
* @param previous - Previously accumulated text
|
|
97
|
-
* @returns Object with new text delta and updated cumulative text
|
|
98
|
-
*/
|
|
99
|
-
export function calculateDelta(current, previous) {
|
|
100
|
-
if (!previous) {
|
|
101
|
-
// First chunk
|
|
102
|
-
return { delta: current, cumulative: current };
|
|
103
|
-
}
|
|
104
|
-
if (isCumulative(current, previous)) {
|
|
105
|
-
// Cumulative style: extract only the new part
|
|
106
|
-
const delta = current.slice(previous.length);
|
|
107
|
-
return { delta, cumulative: current };
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
// Incremental style: current is already just the delta
|
|
111
|
-
return { delta: current, cumulative: previous + current };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=payload-analyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payload-analyzer.js","sourceRoot":"","sources":["../../../lib/request/payload-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { RequestBody, ChatMessage } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* Normalize Qwen model names for Portal API (OAuth)
|
|
4
|
-
*
|
|
5
|
-
* Portal API uses a single 'coder-model' for all coding tasks.
|
|
6
|
-
* This function provides backward compatibility for legacy model names.
|
|
7
|
-
*
|
|
8
|
-
* @param model - Model name from config (e.g., "alibaba/coder-model" or legacy names)
|
|
9
|
-
* @returns Normalized model name for Portal API ("coder-model")
|
|
10
|
-
*/
|
|
11
|
-
export declare function normalizeModel(model: string): string;
|
|
12
|
-
/**
|
|
13
|
-
* Filter OpenCode qwen.txt system prompts from messages
|
|
14
|
-
* @param messages - Input messages
|
|
15
|
-
* @param openCodeQwenPrompt - OpenCode qwen.txt content for verification
|
|
16
|
-
* @returns Filtered messages
|
|
17
|
-
*/
|
|
18
|
-
export declare function filterOpenCodeQwenPrompts(messages: ChatMessage[], openCodeQwenPrompt: string): ChatMessage[];
|
|
19
|
-
/**
|
|
20
|
-
* Add Qwen-OpenCode bridge message
|
|
21
|
-
* @param messages - Input messages
|
|
22
|
-
* @returns Messages with bridge prompt added
|
|
23
|
-
*/
|
|
24
|
-
export declare function addQwenBridgeMessage(messages: ChatMessage[]): ChatMessage[];
|
|
25
|
-
/**
|
|
26
|
-
* Add tool remap message for QWEN_MODE=false
|
|
27
|
-
* @param messages - Input messages
|
|
28
|
-
* @returns Messages with remap message added
|
|
29
|
-
*/
|
|
30
|
-
export declare function addQwenToolRemapMessage(messages: ChatMessage[]): ChatMessage[];
|
|
31
|
-
/**
|
|
32
|
-
* Transform request body for Qwen Portal API (OAuth)
|
|
33
|
-
* @param body - Original request body
|
|
34
|
-
* @param qwenMode - QWEN_MODE setting
|
|
35
|
-
* @param openCodeQwenPrompt - OpenCode qwen.txt content (for filtering)
|
|
36
|
-
* @returns Transformed request body
|
|
37
|
-
*/
|
|
38
|
-
export declare function transformRequestBody(body: RequestBody, qwenMode: boolean, openCodeQwenPrompt: string): RequestBody;
|
|
39
|
-
//# sourceMappingURL=request-transformer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-transformer.d.ts","sourceRoot":"","sources":["../../../lib/request/request-transformer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBpD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE,WAAW,EAAE,EACvB,kBAAkB,EAAE,MAAM,GACxB,WAAW,EAAE,CAOf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,WAAW,EAAE,GACrB,WAAW,EAAE,CAKf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,WAAW,EAAE,GACrB,WAAW,EAAE,CAKf;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,OAAO,EACjB,kBAAkB,EAAE,MAAM,GACxB,WAAW,CA2Cb"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { getQwenCodePrompt } from "../prompts/qwen-code.js";
|
|
2
|
-
import { QWEN_OPENCODE_BRIDGE, QWEN_TOOL_REMAP_MESSAGE } from "../prompts/qwen-opencode-bridge.js";
|
|
3
|
-
import { isOpenCodeQwenPrompt } from "../prompts/opencode-qwen.js";
|
|
4
|
-
/**
|
|
5
|
-
* Normalize Qwen model names for Portal API (OAuth)
|
|
6
|
-
*
|
|
7
|
-
* Portal API uses a single 'coder-model' for all coding tasks.
|
|
8
|
-
* This function provides backward compatibility for legacy model names.
|
|
9
|
-
*
|
|
10
|
-
* @param model - Model name from config (e.g., "alibaba/coder-model" or legacy names)
|
|
11
|
-
* @returns Normalized model name for Portal API ("coder-model")
|
|
12
|
-
*/
|
|
13
|
-
export function normalizeModel(model) {
|
|
14
|
-
// Remove provider prefix if present (alibaba/coder-model → coder-model)
|
|
15
|
-
const modelName = model.includes("/") ? model.split("/")[1] : model;
|
|
16
|
-
// Portal API uses 'coder-model' for all coding tasks
|
|
17
|
-
// Accept legacy model names for backward compatibility
|
|
18
|
-
if (modelName.startsWith("qwen3-coder") ||
|
|
19
|
-
modelName.startsWith("qwen-coder") ||
|
|
20
|
-
modelName.startsWith("qwen-turbo") ||
|
|
21
|
-
modelName.startsWith("qwen-max") ||
|
|
22
|
-
modelName.startsWith("qwen-plus") ||
|
|
23
|
-
modelName === "coder-model") {
|
|
24
|
-
return "coder-model";
|
|
25
|
-
}
|
|
26
|
-
// Vision model (not applicable for OpenCode, but included for completeness)
|
|
27
|
-
if (modelName.includes("vision") || modelName.includes("vl")) {
|
|
28
|
-
return "vision-model";
|
|
29
|
-
}
|
|
30
|
-
// Default to coder-model for any unrecognized model name
|
|
31
|
-
return "coder-model";
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Filter OpenCode qwen.txt system prompts from messages
|
|
35
|
-
* @param messages - Input messages
|
|
36
|
-
* @param openCodeQwenPrompt - OpenCode qwen.txt content for verification
|
|
37
|
-
* @returns Filtered messages
|
|
38
|
-
*/
|
|
39
|
-
export function filterOpenCodeQwenPrompts(messages, openCodeQwenPrompt) {
|
|
40
|
-
return messages.filter(msg => {
|
|
41
|
-
if (msg.role !== "system") {
|
|
42
|
-
return true;
|
|
43
|
-
}
|
|
44
|
-
return !isOpenCodeQwenPrompt(msg.content, openCodeQwenPrompt);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Add Qwen-OpenCode bridge message
|
|
49
|
-
* @param messages - Input messages
|
|
50
|
-
* @returns Messages with bridge prompt added
|
|
51
|
-
*/
|
|
52
|
-
export function addQwenBridgeMessage(messages) {
|
|
53
|
-
return [
|
|
54
|
-
{ role: "system", content: QWEN_OPENCODE_BRIDGE },
|
|
55
|
-
...messages,
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Add tool remap message for QWEN_MODE=false
|
|
60
|
-
* @param messages - Input messages
|
|
61
|
-
* @returns Messages with remap message added
|
|
62
|
-
*/
|
|
63
|
-
export function addQwenToolRemapMessage(messages) {
|
|
64
|
-
return [
|
|
65
|
-
{ role: "system", content: QWEN_TOOL_REMAP_MESSAGE },
|
|
66
|
-
...messages,
|
|
67
|
-
];
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Transform request body for Qwen Portal API (OAuth)
|
|
71
|
-
* @param body - Original request body
|
|
72
|
-
* @param qwenMode - QWEN_MODE setting
|
|
73
|
-
* @param openCodeQwenPrompt - OpenCode qwen.txt content (for filtering)
|
|
74
|
-
* @returns Transformed request body
|
|
75
|
-
*/
|
|
76
|
-
export function transformRequestBody(body, qwenMode, openCodeQwenPrompt) {
|
|
77
|
-
const transformed = { ...body };
|
|
78
|
-
// Normalize model name for Portal API
|
|
79
|
-
if (transformed.model) {
|
|
80
|
-
transformed.model = normalizeModel(transformed.model);
|
|
81
|
-
}
|
|
82
|
-
// Transform messages array
|
|
83
|
-
if (transformed.messages && Array.isArray(transformed.messages)) {
|
|
84
|
-
if (qwenMode) {
|
|
85
|
-
// Filter OpenCode qwen.txt system prompts
|
|
86
|
-
transformed.messages = filterOpenCodeQwenPrompts(transformed.messages, openCodeQwenPrompt);
|
|
87
|
-
// Add Qwen Code system prompt
|
|
88
|
-
const qwenCodePrompt = getQwenCodePrompt();
|
|
89
|
-
transformed.messages = [
|
|
90
|
-
{ role: "system", content: qwenCodePrompt },
|
|
91
|
-
...transformed.messages,
|
|
92
|
-
];
|
|
93
|
-
// Add Qwen-OpenCode bridge prompt
|
|
94
|
-
transformed.messages = addQwenBridgeMessage(transformed.messages);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
// QWEN_MODE=false: Use OpenCode qwen.txt (already in messages)
|
|
98
|
-
// Just add tool remap message
|
|
99
|
-
transformed.messages = addQwenToolRemapMessage(transformed.messages);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
// Remove any Codex-specific fields
|
|
103
|
-
delete transformed.instructions;
|
|
104
|
-
delete transformed.reasoning_effort;
|
|
105
|
-
delete transformed.reasoning_summary;
|
|
106
|
-
return transformed;
|
|
107
|
-
}
|
|
108
|
-
//# sourceMappingURL=request-transformer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-transformer.js","sourceRoot":"","sources":["../../../lib/request/request-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export { normalizeSseToOpenAI } from './stream-normalizer.js';
|
|
2
|
-
/**
|
|
3
|
-
* Convert SSE stream response to JSON for generateText()
|
|
4
|
-
* @param response - Fetch response with SSE stream
|
|
5
|
-
* @param headers - Response headers
|
|
6
|
-
* @returns Response with JSON body
|
|
7
|
-
*/
|
|
8
|
-
export declare function convertSseToJson(response: Response, headers: Headers): Promise<Response>;
|
|
9
|
-
/**
|
|
10
|
-
* Ensure response has content-type header
|
|
11
|
-
* @param headers - Response headers
|
|
12
|
-
* @returns Headers with content-type set
|
|
13
|
-
*/
|
|
14
|
-
export declare function ensureContentType(headers: Headers): Headers;
|
|
15
|
-
//# sourceMappingURL=response-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-handler.d.ts","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AA4B9D;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkD9F;AAGD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQ3D"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import { logRequest, LOGGING_ENABLED, logError } from "../logger.js";
|
|
2
|
-
// Re-export the new modular stream normalizer
|
|
3
|
-
export { normalizeSseToOpenAI } from './stream-normalizer.js';
|
|
4
|
-
/**
|
|
5
|
-
* Parse SSE stream to extract final response
|
|
6
|
-
* @param sseText - Complete SSE stream text
|
|
7
|
-
* @returns Final response object or null if not found
|
|
8
|
-
*/
|
|
9
|
-
function parseSseStream(sseText) {
|
|
10
|
-
const lines = sseText.split('\n');
|
|
11
|
-
for (const line of lines) {
|
|
12
|
-
if (line.startsWith('data: ')) {
|
|
13
|
-
try {
|
|
14
|
-
const data = JSON.parse(line.substring(6));
|
|
15
|
-
// Look for response.done event with final data
|
|
16
|
-
if (data.type === 'response.done' || data.type === 'response.completed') {
|
|
17
|
-
return data.response;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
catch (e) {
|
|
21
|
-
// Skip malformed JSON
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Convert SSE stream response to JSON for generateText()
|
|
29
|
-
* @param response - Fetch response with SSE stream
|
|
30
|
-
* @param headers - Response headers
|
|
31
|
-
* @returns Response with JSON body
|
|
32
|
-
*/
|
|
33
|
-
export async function convertSseToJson(response, headers) {
|
|
34
|
-
if (!response.body) {
|
|
35
|
-
throw new Error('[qwen-oauth-plugin] Response has no body');
|
|
36
|
-
}
|
|
37
|
-
const reader = response.body.getReader();
|
|
38
|
-
const decoder = new TextDecoder();
|
|
39
|
-
let fullText = '';
|
|
40
|
-
try {
|
|
41
|
-
// Consume the entire stream
|
|
42
|
-
while (true) {
|
|
43
|
-
const { done, value } = await reader.read();
|
|
44
|
-
if (done)
|
|
45
|
-
break;
|
|
46
|
-
fullText += decoder.decode(value, { stream: true });
|
|
47
|
-
}
|
|
48
|
-
if (LOGGING_ENABLED) {
|
|
49
|
-
logRequest("stream-full", { fullContent: fullText });
|
|
50
|
-
}
|
|
51
|
-
// Parse SSE events to extract the final response
|
|
52
|
-
const finalResponse = parseSseStream(fullText);
|
|
53
|
-
if (!finalResponse) {
|
|
54
|
-
logError('Could not find final response in SSE stream');
|
|
55
|
-
logRequest("stream-error", { error: "No response.done event found" });
|
|
56
|
-
// Return original stream if we can't parse
|
|
57
|
-
return new Response(fullText, {
|
|
58
|
-
status: response.status,
|
|
59
|
-
statusText: response.statusText,
|
|
60
|
-
headers: headers,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
// Return as plain JSON (not SSE)
|
|
64
|
-
const jsonHeaders = new Headers(headers);
|
|
65
|
-
jsonHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
66
|
-
return new Response(JSON.stringify(finalResponse), {
|
|
67
|
-
status: response.status,
|
|
68
|
-
statusText: response.statusText,
|
|
69
|
-
headers: jsonHeaders,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
logError('Error converting stream:', error);
|
|
74
|
-
logRequest("stream-error", { error: String(error) });
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Ensure response has content-type header
|
|
80
|
-
* @param headers - Response headers
|
|
81
|
-
* @returns Headers with content-type set
|
|
82
|
-
*/
|
|
83
|
-
export function ensureContentType(headers) {
|
|
84
|
-
const responseHeaders = new Headers(headers);
|
|
85
|
-
if (!responseHeaders.has('content-type')) {
|
|
86
|
-
responseHeaders.set('content-type', 'text/event-stream; charset=utf-8');
|
|
87
|
-
}
|
|
88
|
-
return responseHeaders;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=response-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server-Sent Events (SSE) parsing utilities
|
|
3
|
-
* Handles parsing of SSE streams into structured events
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Represents a parsed SSE event
|
|
7
|
-
*/
|
|
8
|
-
export interface SseEvent {
|
|
9
|
-
/** Event type (e.g., 'message', 'response.done') */
|
|
10
|
-
type?: string;
|
|
11
|
-
/** Event data (parsed JSON or raw string) */
|
|
12
|
-
data: unknown;
|
|
13
|
-
/** Raw data string before parsing */
|
|
14
|
-
rawData: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Parse a single SSE frame into events
|
|
18
|
-
* A frame is text between double newlines (\n\n)
|
|
19
|
-
*
|
|
20
|
-
* @param frame - SSE frame text
|
|
21
|
-
* @returns Array of parsed events
|
|
22
|
-
*/
|
|
23
|
-
export declare function parseFrame(frame: string): SseEvent[];
|
|
24
|
-
/**
|
|
25
|
-
* Check if an event indicates stream completion
|
|
26
|
-
* @param event - SSE event to check
|
|
27
|
-
* @returns True if this is a completion event
|
|
28
|
-
*/
|
|
29
|
-
export declare function isCompletionEvent(event: SseEvent): boolean;
|
|
30
|
-
/**
|
|
31
|
-
* Check if an event contains content data
|
|
32
|
-
* @param event - SSE event to check
|
|
33
|
-
* @returns True if this event has content
|
|
34
|
-
*/
|
|
35
|
-
export declare function hasContent(event: SseEvent): boolean;
|
|
36
|
-
//# sourceMappingURL=sse-parser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-parser.d.ts","sourceRoot":"","sources":["../../../lib/request/sse-parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,EAAE,OAAO,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CA6CpD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAM1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAkBnD"}
|