Skip to content

Commit 2f31606

Browse files
authored
Merge pull request #1106 from refly-ai/fix/agent-media-config
fix: properly handle missing media model in agent mode
2 parents b7eeabd + aacefc7 commit 2f31606

File tree

3 files changed

+52
-28
lines changed

3 files changed

+52
-28
lines changed

apps/api/src/modules/provider/provider.service.ts

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -430,49 +430,45 @@ export class ProviderService implements OnModuleInit {
430430
const userPreferences = await this.getUserPreferences(user.uid);
431431
const userDefaultModel = userPreferences?.defaultModel;
432432

433-
if (!userDefaultModel) {
434-
this.logger.log(
435-
`No default model configuration found for user ${user.uid} for ${mediaType}`,
436-
);
437-
return null;
438-
}
439-
440433
// Get the specific media model configuration based on mediaType
441-
const mediaModelConfig = userDefaultModel[mediaType];
442-
443-
if (!mediaModelConfig?.itemId) {
444-
this.logger.log(`No ${mediaType} model configured for user ${user.uid}`);
445-
return null;
446-
}
434+
const mediaModelConfig = userDefaultModel?.[mediaType];
447435

448436
// Find the provider item for this configured model
449437
const providerItems = await this.listProviderItems(user, {
450438
category: 'mediaGeneration',
451439
enabled: true,
452440
});
453441

454-
const configuredProviderItem = providerItems.find(
455-
(item) => item.itemId === mediaModelConfig.itemId,
442+
let configuredProviderItem = providerItems.find(
443+
(item) => item.itemId === mediaModelConfig?.itemId,
456444
);
457445

458446
if (!configuredProviderItem) {
459-
this.logger.warn(
460-
`Configured ${mediaType} model ${mediaModelConfig.itemId} not found in user's provider items`,
461-
);
462-
return null;
447+
// Fallback: find an enabled model that supports the requested mediaType
448+
const fallbackProviderItem = providerItems.find((item) => {
449+
try {
450+
const config: MediaGenerationModelConfig = JSON.parse(item.config || '{}');
451+
452+
return config.capabilities?.[mediaType];
453+
} catch (error) {
454+
this.logger.warn(
455+
`Failed to parse config for provider item ${item.itemId}: ${error?.message}`,
456+
);
457+
return false;
458+
}
459+
});
460+
461+
if (!fallbackProviderItem) {
462+
this.logger.warn(`No enabled ${mediaType} model found in user's provider items`);
463+
return null;
464+
}
465+
466+
configuredProviderItem = fallbackProviderItem;
463467
}
464468

465469
// Parse the model configuration
466470
const config: MediaGenerationModelConfig = JSON.parse(configuredProviderItem.config || '{}');
467471

468-
// Verify that this model actually supports the requested media type
469-
if (!config.capabilities?.[mediaType]) {
470-
this.logger.warn(
471-
`Configured ${mediaType} model ${config.modelId} does not support ${mediaType} generation`,
472-
);
473-
return null;
474-
}
475-
476472
this.logger.log(
477473
`Using user configured ${mediaType} model: ${config.modelId} from provider: ${configuredProviderItem.provider?.providerKey}`,
478474
);

packages/errors/src/errors.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,22 @@ export class EmbeddingNotConfiguredError extends BaseError {
120120
};
121121
}
122122

123+
export class MediaProviderNotConfiguredError extends BaseError {
124+
code = 'E0016';
125+
messageDict = {
126+
en: 'Media provider not configured, please configure a media provider in the settings',
127+
'zh-CN': '未配置媒体提供方,请先在设置中进行配置',
128+
};
129+
}
130+
131+
export class MediaModelNotConfiguredError extends BaseError {
132+
code = 'E0017';
133+
messageDict = {
134+
en: 'Media model not configured, please configure a media model in the settings',
135+
'zh-CN': '未配置媒体模型,请先在设置中进行配置',
136+
};
137+
}
138+
123139
export class CanvasNotFoundError extends BaseError {
124140
code = 'E1000';
125141
messageDict = {
@@ -353,6 +369,8 @@ const errorMap = {
353369
E0013: EmbeddingNotAllowedToChangeError,
354370
E0014: ChatModelNotConfiguredError,
355371
E0015: EmbeddingNotConfiguredError,
372+
E0016: MediaProviderNotConfiguredError,
373+
E0017: MediaModelNotConfiguredError,
356374
E1000: CanvasNotFoundError,
357375
E1002: ResourceNotFoundError,
358376
E1003: DocumentNotFoundError,

packages/skill-template/src/skills/generate-media.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { StateGraphArgs, StateGraph, START, END } from '@langchain/langgraph';
1111
import { GraphState } from '../scheduler/types';
1212
import { Runnable } from '@langchain/core/runnables';
1313
import { SystemMessage } from '@langchain/core/messages';
14+
import { MediaProviderNotConfiguredError, MediaModelNotConfiguredError } from '@refly/errors';
1415

1516
/**
1617
* Interface for log argument objects used in processLogArgs
@@ -138,7 +139,16 @@ export class GenerateMedia extends BaseSkill {
138139
);
139140
const quality = parsedParams.quality || String(tplConfig?.quality?.value ?? 'high');
140141

141-
const { provider, model } = await this.engine.service.getUserMediaConfig(user, mediaType);
142+
const { provider, model } =
143+
(await this.engine.service.getUserMediaConfig(user, mediaType)) || {};
144+
145+
if (!provider) {
146+
throw new MediaProviderNotConfiguredError();
147+
}
148+
149+
if (!model) {
150+
throw new MediaModelNotConfiguredError();
151+
}
142152

143153
// Clean the query by removing parameter specifications
144154
const cleanedQuery = this.cleanQueryFromParameters(query);

0 commit comments

Comments
 (0)