




















@@ -425,13 +425,23 @@ function resolveMediaRequestOverrides(config: MediaUnderstandingConfig | undefin
425425};
426426}
427427428+function isMissingProviderApiKeyError(err: unknown, providerId: string): boolean {
429+const message = err instanceof Error ? err.message : String(err);
430+return (
431+message.includes(`No API key found for provider "${providerId}"`) ||
432+message.includes(`No API key resolved for provider "${providerId}"`)
433+);
434+}
435+428436async function resolveProviderExecutionAuth(params: {
429437providerId: string;
438+provider?: MediaUnderstandingProvider;
430439cfg: OpenClawConfig;
431440entry: MediaUnderstandingModelConfig;
432441agentDir?: string;
433442workspaceDir?: string;
434443}) {
444+const providerConfig = params.cfg.models?.providers?.[params.providerId];
435445const literalApiKey = resolveLiteralProviderApiKey({
436446cfg: params.cfg,
437447providerId: params.providerId,
@@ -442,29 +452,55 @@ async function resolveProviderExecutionAuth(params: {
442452provider: params.providerId,
443453primaryApiKey: literalApiKey,
444454}),
445-providerConfig: params.cfg.models?.providers?.[params.providerId],
455+ providerConfig,
446456};
447457}
448-const { requireApiKey, resolveApiKeyForProvider } = await loadModelAuth();
449-const auth = await resolveApiKeyForProvider({
450-provider: params.providerId,
451-cfg: params.cfg,
452-profileId: params.entry.profile,
453-preferredProfile: params.entry.preferredProfile,
454-agentDir: params.agentDir,
455-workspaceDir: params.workspaceDir,
456-});
457-return {
458-apiKeys: collectProviderApiKeysForExecution({
458+const resolveMediaProviderSyntheticAuth = () => {
459+const syntheticAuth = params.provider?.resolveSyntheticAuth?.({
460+config: params.cfg,
459461provider: params.providerId,
460-primaryApiKey: requireApiKey(auth, params.providerId),
461-}),
462-providerConfig: params.cfg.models?.providers?.[params.providerId],
462+providerConfig,
463+});
464+return syntheticAuth?.apiKey?.trim() || undefined;
463465};
466+const { requireApiKey, resolveApiKeyForProvider } = await loadModelAuth();
467+try {
468+const auth = await resolveApiKeyForProvider({
469+provider: params.providerId,
470+cfg: params.cfg,
471+profileId: params.entry.profile,
472+preferredProfile: params.entry.preferredProfile,
473+agentDir: params.agentDir,
474+workspaceDir: params.workspaceDir,
475+});
476+return {
477+apiKeys: collectProviderApiKeysForExecution({
478+provider: params.providerId,
479+primaryApiKey: requireApiKey(auth, params.providerId),
480+}),
481+ providerConfig,
482+};
483+} catch (err) {
484+if (!isMissingProviderApiKeyError(err, params.providerId)) {
485+throw err;
486+}
487+const syntheticApiKey = resolveMediaProviderSyntheticAuth();
488+if (syntheticApiKey) {
489+return {
490+apiKeys: collectProviderApiKeysForExecution({
491+provider: params.providerId,
492+primaryApiKey: syntheticApiKey,
493+}),
494+ providerConfig,
495+};
496+}
497+throw err;
498+}
464499}
465500466501async function resolveProviderExecutionContext(params: {
467502providerId: string;
503+provider?: MediaUnderstandingProvider;
468504cfg: OpenClawConfig;
469505entry: MediaUnderstandingModelConfig;
470506config?: MediaUnderstandingConfig;
@@ -473,6 +509,7 @@ async function resolveProviderExecutionContext(params: {
473509}) {
474510const { apiKeys, providerConfig } = await resolveProviderExecutionAuth({
475511providerId: params.providerId,
512+provider: params.provider,
476513cfg: params.cfg,
477514entry: params.entry,
478515agentDir: params.agentDir,
@@ -651,6 +688,7 @@ export async function runProviderEntry(params: {
651688assertMinAudioSize({ size: media.size, attachmentIndex: params.attachmentIndex });
652689const { apiKeys, baseUrl, headers, request } = await resolveProviderExecutionContext({
653690 providerId,
691+ provider,
654692 cfg,
655693 entry,
656694config: params.config,
@@ -724,6 +762,7 @@ export async function runProviderEntry(params: {
724762}
725763const { apiKeys, baseUrl, headers, request } = await resolveProviderExecutionContext({
726764 providerId,
765+ provider,
727766 cfg,
728767 entry,
729768config: params.config,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。