mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
feat: add yolo mode support to auto vision model switch (#652)
* feat: add yolo mode support to auto vision model switch * feat: add cli args & env variables for switch behavoir * fix: use dedicated model names and settings * docs: add vision model instructions * fix: failed test case * fix: setModel failure
This commit is contained in:
@@ -56,6 +56,7 @@ import {
|
||||
DEFAULT_GEMINI_FLASH_MODEL,
|
||||
} from './models.js';
|
||||
import { Storage } from './storage.js';
|
||||
import { Logger, type ModelSwitchEvent } from '../core/logger.js';
|
||||
|
||||
// Re-export OAuth config type
|
||||
export type { AnyToolInvocation, MCPOAuthConfig };
|
||||
@@ -239,6 +240,7 @@ export interface ConfigParameters {
|
||||
extensionManagement?: boolean;
|
||||
enablePromptCompletion?: boolean;
|
||||
skipLoopDetection?: boolean;
|
||||
vlmSwitchMode?: string;
|
||||
}
|
||||
|
||||
export class Config {
|
||||
@@ -330,9 +332,11 @@ export class Config {
|
||||
private readonly extensionManagement: boolean;
|
||||
private readonly enablePromptCompletion: boolean = false;
|
||||
private readonly skipLoopDetection: boolean;
|
||||
private readonly vlmSwitchMode: string | undefined;
|
||||
private initialized: boolean = false;
|
||||
readonly storage: Storage;
|
||||
private readonly fileExclusions: FileExclusions;
|
||||
private logger: Logger | null = null;
|
||||
|
||||
constructor(params: ConfigParameters) {
|
||||
this.sessionId = params.sessionId;
|
||||
@@ -424,8 +428,15 @@ export class Config {
|
||||
this.extensionManagement = params.extensionManagement ?? false;
|
||||
this.storage = new Storage(this.targetDir);
|
||||
this.enablePromptCompletion = params.enablePromptCompletion ?? false;
|
||||
this.vlmSwitchMode = params.vlmSwitchMode;
|
||||
this.fileExclusions = new FileExclusions(this);
|
||||
|
||||
// Initialize logger asynchronously
|
||||
this.logger = new Logger(this.sessionId, this.storage);
|
||||
this.logger.initialize().catch((error) => {
|
||||
console.debug('Failed to initialize logger:', error);
|
||||
});
|
||||
|
||||
if (params.contextFileName) {
|
||||
setGeminiMdFilename(params.contextFileName);
|
||||
}
|
||||
@@ -517,21 +528,47 @@ export class Config {
|
||||
return this.contentGeneratorConfig?.model || this.model;
|
||||
}
|
||||
|
||||
setModel(newModel: string): void {
|
||||
async setModel(
|
||||
newModel: string,
|
||||
options?: {
|
||||
reason?: ModelSwitchEvent['reason'];
|
||||
context?: string;
|
||||
},
|
||||
): Promise<void> {
|
||||
const oldModel = this.getModel();
|
||||
|
||||
if (this.contentGeneratorConfig) {
|
||||
this.contentGeneratorConfig.model = newModel;
|
||||
}
|
||||
|
||||
// Log the model switch if the model actually changed
|
||||
if (oldModel !== newModel && this.logger) {
|
||||
const switchEvent: ModelSwitchEvent = {
|
||||
fromModel: oldModel,
|
||||
toModel: newModel,
|
||||
reason: options?.reason || 'manual',
|
||||
context: options?.context,
|
||||
};
|
||||
|
||||
// Log asynchronously to avoid blocking
|
||||
this.logger.logModelSwitch(switchEvent).catch((error) => {
|
||||
console.debug('Failed to log model switch:', error);
|
||||
});
|
||||
}
|
||||
|
||||
// Reinitialize chat with updated configuration while preserving history
|
||||
const geminiClient = this.getGeminiClient();
|
||||
if (geminiClient && geminiClient.isInitialized()) {
|
||||
// Use async operation but don't await to avoid blocking
|
||||
geminiClient.reinitialize().catch((error) => {
|
||||
// Now await the reinitialize operation to ensure completion
|
||||
try {
|
||||
await geminiClient.reinitialize();
|
||||
} catch (error) {
|
||||
console.error(
|
||||
'Failed to reinitialize chat with updated config:',
|
||||
error,
|
||||
);
|
||||
});
|
||||
throw error; // Re-throw to let callers handle the error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -938,6 +975,10 @@ export class Config {
|
||||
return this.skipLoopDetection;
|
||||
}
|
||||
|
||||
getVlmSwitchMode(): string | undefined {
|
||||
return this.vlmSwitchMode;
|
||||
}
|
||||
|
||||
async getGitService(): Promise<GitService> {
|
||||
if (!this.gitService) {
|
||||
this.gitService = new GitService(this.targetDir, this.storage);
|
||||
|
||||
Reference in New Issue
Block a user