|
|
|
|
|
|
|
|
|
|
|
|
|
import { qwen3Client } from './qwen3Client'; |
|
|
|
interface TextGenerationClient { |
|
predict(endpoint: string, params: any[]): Promise<{data: any[]}>; |
|
testConnection?(): Promise<boolean>; |
|
} |
|
|
|
class TextGenerationManager { |
|
private primaryClient: TextGenerationClient; |
|
private fallbackClient: TextGenerationClient | null = null; |
|
private useQwen3: boolean = true; |
|
private connectionTested: boolean = false; |
|
|
|
constructor() { |
|
this.primaryClient = qwen3Client; |
|
} |
|
|
|
|
|
|
|
|
|
setFallbackClient(client: TextGenerationClient) { |
|
this.fallbackClient = client; |
|
} |
|
|
|
|
|
|
|
|
|
async initialize(): Promise<void> { |
|
if (this.connectionTested) return; |
|
|
|
console.log('Testing Qwen3 connection...'); |
|
|
|
try { |
|
if (this.primaryClient.testConnection) { |
|
const qwen3Available = await this.primaryClient.testConnection(); |
|
|
|
if (qwen3Available) { |
|
console.log('β
Qwen3 client is available and will be used for text generation'); |
|
this.useQwen3 = true; |
|
} else { |
|
console.log('β οΈ Qwen3 client is not available, falling back to Zephyr-7B'); |
|
this.useQwen3 = false; |
|
} |
|
} |
|
} catch (error) { |
|
console.error('Failed to test Qwen3 connection:', error); |
|
console.log('β οΈ Falling back to Zephyr-7B due to connection error'); |
|
this.useQwen3 = false; |
|
} |
|
|
|
this.connectionTested = true; |
|
} |
|
|
|
|
|
|
|
|
|
private getActiveClient(): TextGenerationClient { |
|
if (this.useQwen3) { |
|
return this.primaryClient; |
|
} else if (this.fallbackClient) { |
|
return this.fallbackClient; |
|
} else { |
|
console.warn('No fallback client available, using Qwen3 client'); |
|
return this.primaryClient; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
async predict(endpoint: string, params: any[]): Promise<{data: any[]}> { |
|
|
|
if (!this.connectionTested) { |
|
await this.initialize(); |
|
} |
|
|
|
const activeClient = this.getActiveClient(); |
|
const clientName = this.useQwen3 ? 'Qwen3' : 'Zephyr-7B'; |
|
|
|
console.log(`π€ Using ${clientName} for text generation`); |
|
|
|
try { |
|
const result = await activeClient.predict(endpoint, params); |
|
return result; |
|
} catch (error) { |
|
console.error(`${clientName} prediction failed:`, error); |
|
|
|
|
|
if (this.useQwen3 && this.fallbackClient) { |
|
console.log('π Qwen3 failed, trying fallback to Zephyr-7B...'); |
|
try { |
|
const fallbackResult = await this.fallbackClient.predict(endpoint, params); |
|
|
|
this.useQwen3 = false; |
|
return fallbackResult; |
|
} catch (fallbackError) { |
|
console.error('Fallback client also failed:', fallbackError); |
|
throw new Error(`Both primary (${clientName}) and fallback clients failed`); |
|
} |
|
} |
|
|
|
throw error; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
useQwen3Client() { |
|
this.useQwen3 = true; |
|
console.log('π Switched to Qwen3 client'); |
|
} |
|
|
|
|
|
|
|
|
|
useFallbackClient() { |
|
if (this.fallbackClient) { |
|
this.useQwen3 = false; |
|
console.log('π Switched to fallback (Zephyr-7B) client'); |
|
} else { |
|
console.warn('No fallback client available'); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
getStatus() { |
|
return { |
|
usingQwen3: this.useQwen3, |
|
hasFallback: this.fallbackClient !== null, |
|
connectionTested: this.connectionTested, |
|
activeClient: this.useQwen3 ? 'Qwen3' : 'Zephyr-7B' |
|
}; |
|
} |
|
} |
|
|
|
|
|
export const textGenerationManager = new TextGenerationManager(); |