refactor: re-organize Qwen related code files.

Co-authored-by: tanzhenxin <tanzhenxing1987@gmail.com>
Co-authored-by: pomelo-nwu <czynwu@outlook.com>
This commit is contained in:
mingholy.lmh
2025-08-08 11:44:38 +08:00
parent ea7dcf8347
commit ce632725b0
9 changed files with 39 additions and 34 deletions

View File

@@ -65,12 +65,7 @@ export const useQwenAuth = (
}));
// Set up event listeners
const handleDeviceAuth = (deviceAuth: {
verification_uri: string;
verification_uri_complete: string;
user_code: string;
expires_in: number;
}) => {
const handleDeviceAuth = (deviceAuth: DeviceAuthorizationInfo) => {
setQwenAuthState((prev) => ({
...prev,
deviceAuth: {

View File

@@ -201,9 +201,11 @@ export async function createContentGenerator(
// Import required classes dynamically
const { getQwenOAuthClient: getQwenOauthClient } = await import(
'../code_assist/qwenOAuth2.js'
'../qwen/qwenOAuth2.js'
);
const { QwenContentGenerator } = await import(
'../qwen/qwenContentGenerator.js'
);
const { QwenContentGenerator } = await import('./qwenContentGenerator.js');
try {
// Get the Qwen OAuth client (now includes integrated token management)

View File

@@ -21,7 +21,7 @@ export * from './core/nonInteractiveToolExecutor.js';
export * from './code_assist/codeAssist.js';
export * from './code_assist/oauth2.js';
export * from './code_assist/qwenOAuth2.js';
export * from './qwen/qwenOAuth2.js';
export * from './code_assist/server.js';
export * from './code_assist/types.js';

View File

@@ -7,9 +7,9 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import {
IQwenOAuth2Client,
QwenCredentials,
ErrorData,
} from '../code_assist/qwenOAuth2.js';
type QwenCredentials,
type ErrorData,
} from './qwenOAuth2.js';
import {
GenerateContentParameters,
GenerateContentResponse,
@@ -23,7 +23,7 @@ import { QwenContentGenerator } from './qwenContentGenerator.js';
import { Config } from '../config/config.js';
// Mock the OpenAIContentGenerator parent class
vi.mock('./openaiContentGenerator.js', () => ({
vi.mock('../core/openaiContentGenerator.js', () => ({
OpenAIContentGenerator: class {
client: {
apiKey: string;
@@ -106,7 +106,19 @@ describe('QwenContentGenerator', () => {
vi.clearAllMocks();
// Mock Config
mockConfig = {} as Config;
mockConfig = {
getContentGeneratorConfig: vi.fn().mockReturnValue({
authType: 'qwen',
enableOpenAILogging: false,
timeout: 120000,
maxRetries: 3,
samplingParams: {
temperature: 0.7,
max_tokens: 1000,
top_p: 0.9,
},
}),
} as unknown as Config;
// Mock QwenOAuth2Client
mockQwenClient = {

View File

@@ -4,13 +4,13 @@
* SPDX-License-Identifier: Apache-2.0
*/
import { OpenAIContentGenerator } from './openaiContentGenerator.js';
import { OpenAIContentGenerator } from '../core/openaiContentGenerator.js';
import {
IQwenOAuth2Client,
type TokenRefreshData,
type ErrorData,
isErrorResponse,
} from '../code_assist/qwenOAuth2.js';
} from './qwenOAuth2.js';
import { Config } from '../config/config.js';
import {
GenerateContentParameters,

View File

@@ -22,7 +22,6 @@ const QWEN_OAUTH_DEVICE_CODE_ENDPOINT = `${QWEN_OAUTH_BASE_URL}/api/v1/oauth2/de
const QWEN_OAUTH_TOKEN_ENDPOINT = `${QWEN_OAUTH_BASE_URL}/api/v1/oauth2/token`;
// OAuth Client Configuration
// const QWEN_OAUTH_CLIENT_ID = '93a239d6ed36412c8c442e91b60fa305';
const QWEN_OAUTH_CLIENT_ID = 'f0304373b74a44d2b584a3fb70ca9e56';
const QWEN_OAUTH_SCOPE = 'openid profile email model.completion';
@@ -332,8 +331,6 @@ export class QwenOAuth2Client implements IQwenOAuth2Client {
try {
const errorData = (await response.json()) as ErrorData;
console.log(errorData.error);
// According to OAuth RFC 8628, handle standard polling responses
if (
response.status === 400 &&
@@ -567,14 +564,13 @@ async function authWithQwenDeviceFlow(
// Emit device authorization event for UI integration immediately
qwenOAuth2Events.emit(QwenOAuth2Event.AuthUri, deviceAuth);
console.log('\n=== Qwen OAuth Device Authorization ===');
console.log(
`Please visit the following URL on your phone or browser for authorization:`,
);
console.log(`\n${deviceAuth.verification_uri_complete}\n`);
const showFallbackMessage = () => {
// Fallback message for console output
console.log('\n=== Qwen OAuth Device Authorization ===');
console.log(
'Please visit the following URL in your browser to authorize:',
);
console.log(`\n${deviceAuth.verification_uri_complete}\n`);
console.log('Waiting for authorization to complete...\n');
};
// If browser launch is not suppressed, try to open the URL
@@ -645,8 +641,7 @@ async function authWithQwenDeviceFlow(
token_type: tokenData.token_type,
resource_url: tokenData.resource_url,
expiry_date: tokenData.expires_in
? /* ts-ignore */
Date.now() + (tokenData.expires_in ?? 1) * 1000
? Date.now() + tokenData.expires_in * 1000
: undefined,
};
@@ -670,8 +665,6 @@ async function authWithQwenDeviceFlow(
if (isDeviceTokenPending(tokenResponse)) {
const pendingData = tokenResponse as DeviceTokenPendingData;
console.log(pendingData);
// Handle slow_down error by increasing poll interval
if (pendingData.slowDown) {
pollInterval = Math.min(pollInterval * 1.5, 10000); // Increase by 50%, max 10 seconds