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:
gsxdsm
2026-06-01 08:23:02 -07:00
parent b4230c06b1
commit f76716e55b
9 changed files with 167 additions and 46 deletions

View File

@@ -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 {

View File

@@ -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 {