@@ -51,6 +51,22 @@ export function allProviders(): ProviderDefinition[] {
5151 return Array . from ( registry . values ( ) ) ;
5252}
5353
54+ /**
55+ * Validate a raw provider config against its schema, mapping zod issues to a
56+ * readable UserError. Providers call `.parse()`-style validation through here so
57+ * config mistakes surface as `provider 'x' config invalid: field: message` lines
58+ * instead of a raw ZodError JSON dump leaking to the host's stderr.
59+ */
60+ function parseProviderConfig ( def : ProviderDefinition , rawConfig : unknown ) : unknown {
61+ const result = def . configSchema . safeParse ( rawConfig ) ;
62+ if ( result . success ) return result . data ;
63+ const details = result . error . issues . map ( ( issue ) => {
64+ const path = issue . path . join ( "." ) ;
65+ return path ? `${ path } : ${ issue . message } ` : issue . message ;
66+ } ) ;
67+ throw new UserError ( `Provider '${ def . name } ' config invalid:\n${ details . join ( "\n" ) } ` ) ;
68+ }
69+
5470export function buildProviders (
5571 providersConfig : Record < string , unknown > ,
5672 projectName ?: string ,
@@ -62,7 +78,7 @@ export function buildProviders(
6278 if ( ! def ) {
6379 throw new UserError ( `Unknown provider '${ name } '. Registered: ${ Array . from ( registry . keys ( ) ) . join ( ", " ) } ` ) ;
6480 }
65- const parsed = def . configSchema . parse ( rawConfig ) ;
81+ const parsed = parseProviderConfig ( def , rawConfig ) ;
6682 const adapter = def . createAdapter ( parsed , projectName ) ;
6783 validateProviderFacets ( def , adapter ) ;
6884 adapters . set ( name , adapter ) ;
@@ -78,7 +94,9 @@ export function buildProviders(
7894const PROVIDER_ENV_VARS : Record < string , Record < string , { env : string [ ] ; required : boolean } > > = {
7995 bailian : {
8096 api_key : { env : [ "DASHSCOPE_API_KEY" , "BAILIAN_API_KEY" ] , required : true } ,
81- workspace_id : { env : [ "BAILIAN_WORKSPACE_ID" ] , required : true } ,
97+ // Neither workspace_id nor base_url is required on its own; the config schema
98+ // enforces "at least one" so a host can supply just base_url (BAILIAN_BASE_URL).
99+ workspace_id : { env : [ "BAILIAN_WORKSPACE_ID" ] , required : false } ,
82100 base_url : { env : [ "BAILIAN_BASE_URL" ] , required : false } ,
83101 } ,
84102 qoder : {
@@ -160,7 +178,7 @@ export function buildProviderFromEnv(providerName: string, projectName?: string)
160178 }
161179
162180 const config = resolveProviderConfigFromEnv ( providerName ) ;
163- const parsed = def . configSchema . parse ( config ) ;
181+ const parsed = parseProviderConfig ( def , config ) ;
164182 const adapter = def . createAdapter ( parsed , projectName ) ;
165183 validateProviderFacets ( def , adapter ) ;
166184 return adapter ;
0 commit comments