FN-5833: fix custom Responses API model lookup
Ensure custom OpenAI Responses providers resolve configured models without requiring registry entries. - update global settings model resolution to preserve custom provider model configuration - adjust engine custom-provider and fn-agent creation paths to avoid false 'model not found' failures - add regression tests for OpenAI Responses custom providers and pi create-fn-agent flows - document the custom provider model behavior and add a changeset for @runfusion/fusion Files changed: .../FN-5833-custom-provider-responses-fix.md | 10 ++++ docs/settings-reference.md | 2 +- packages/core/src/global-settings.ts | 56 +++++++++---------- packages/core/src/index.ts | 2 +- .../custom-providers-openai-responses.test.ts | 64 ++++++++++++++++++++++ .../engine/src/__tests__/custom-providers.test.ts | 33 ++++++++++- .../src/__tests__/pi-create-fn-agent.test.ts | 11 +++- packages/engine/src/custom-providers.ts | 4 +- packages/engine/src/pi.ts | 21 +++++-- 9 files changed, 162 insertions(+), 41 deletions(-) Fusion-Task-Id: FN-5833 Fusion-Task-Lineage: a59481cf-faf5-42b8-97ce-7b3eca27b4fb
This commit is contained in:
@@ -39,6 +39,38 @@ export function defaultGlobalDir(): string {
|
||||
return join(getHomeDir(), ".fusion");
|
||||
}
|
||||
|
||||
/** Resolve the active global directory for an explicit home directory. */
|
||||
export function resolveGlobalDirForHome(homeDir: string): string {
|
||||
const preferredDir = join(homeDir, ".fusion");
|
||||
if (existsSync(preferredDir)) {
|
||||
return preferredDir;
|
||||
}
|
||||
|
||||
const legacyDir = join(homeDir, ".pi", "fusion");
|
||||
if (existsSync(legacyDir)) {
|
||||
try {
|
||||
mkdirSync(dirname(preferredDir), { recursive: true });
|
||||
renameSync(legacyDir, preferredDir);
|
||||
return preferredDir;
|
||||
} catch {
|
||||
return legacyDir;
|
||||
}
|
||||
}
|
||||
|
||||
const legacyDirOriginal = join(homeDir, ".pi", "kb");
|
||||
if (existsSync(legacyDirOriginal)) {
|
||||
try {
|
||||
mkdirSync(dirname(preferredDir), { recursive: true });
|
||||
renameSync(legacyDirOriginal, preferredDir);
|
||||
return preferredDir;
|
||||
} catch {
|
||||
return legacyDirOriginal;
|
||||
}
|
||||
}
|
||||
|
||||
return preferredDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the active global directory.
|
||||
*
|
||||
@@ -59,39 +91,7 @@ export function resolveGlobalDir(dir?: string): string {
|
||||
|
||||
if (hasExplicitDir) return dir;
|
||||
|
||||
const preferredDir = defaultGlobalDir();
|
||||
|
||||
// Case 1: New directory already exists
|
||||
if (existsSync(preferredDir)) {
|
||||
return preferredDir;
|
||||
}
|
||||
|
||||
// Case 2: Check for legacy ~/.pi/fusion directory
|
||||
const legacyDir = legacyGlobalDir();
|
||||
if (existsSync(legacyDir)) {
|
||||
try {
|
||||
mkdirSync(dirname(preferredDir), { recursive: true });
|
||||
renameSync(legacyDir, preferredDir);
|
||||
return preferredDir;
|
||||
} catch {
|
||||
return legacyDir;
|
||||
}
|
||||
}
|
||||
|
||||
// Case 3: Check for original legacy ~/.pi/kb directory
|
||||
const legacyDirOriginal = legacyGlobalDirOriginal();
|
||||
if (existsSync(legacyDirOriginal)) {
|
||||
try {
|
||||
mkdirSync(dirname(preferredDir), { recursive: true });
|
||||
renameSync(legacyDirOriginal, preferredDir);
|
||||
return preferredDir;
|
||||
} catch {
|
||||
return legacyDirOriginal;
|
||||
}
|
||||
}
|
||||
|
||||
// Case 4: Return the preferred directory (will be created on first use)
|
||||
return preferredDir;
|
||||
return resolveGlobalDirForHome(getHomeDir());
|
||||
}
|
||||
|
||||
export class GlobalSettingsStore {
|
||||
|
||||
@@ -274,7 +274,7 @@ export type { ProjectIdentity } from "./project-identity.js";
|
||||
export type { EnsureProjectForPathInput, EnsureProjectForPathResult } from "./central-core.js";
|
||||
export { ArchiveDatabase } from "./archive-db.js";
|
||||
export { detectLegacyData, migrateFromLegacy, getMigrationStatus } from "./db-migrate.js";
|
||||
export { GlobalSettingsStore, resolveGlobalDir } from "./global-settings.js";
|
||||
export { GlobalSettingsStore, resolveGlobalDir, resolveGlobalDirForHome } from "./global-settings.js";
|
||||
export { isValidSqliteDatabaseFile } from "./sqlite-validation.js";
|
||||
export { DaemonTokenManager, DAEMON_TOKEN_PREFIX, DAEMON_TOKEN_HEX_LENGTH, isDaemonTokenFormat } from "./daemon-token.js";
|
||||
export {
|
||||
|
||||
Reference in New Issue
Block a user