import {z} from 'zod' export type GetApiConfigOptions = {baseUrl: string, HTTPBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const chatConfig = z.object({quick_prompts: z.record(z.string(), z.array(z.string()))}); export const manifest = z.object({description: z.string().nullable().optional(), labels: z.array(z.string()).nullable().optional(), quick_prompts: z.array(z.string()).nullable().optional()}); export const sessionDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigSessionDomainConfig = z.object({db_id: z.string(), domain_config: sessionDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const sessionConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigSessionDomainConfig).nullable().optional()}); export const metricsDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigMetricsDomainConfig = z.object({db_id: z.string(), domain_config: metricsDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const metricsConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigMetricsDomainConfig).nullable().optional()}); export const memoryDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigMemoryDomainConfig = z.object({db_id: z.string(), domain_config: memoryDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const memoryConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigMemoryDomainConfig).nullable().optional()}); export const learningDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigLearningDomainConfig = z.object({db_id: z.string(), domain_config: learningDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const learningConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigLearningDomainConfig).nullable().optional()}); export const knowledgeDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const knowledgeDatabaseConfig = z.object({db_id: z.string(), domain_config: knowledgeDomainConfig.nullable().optional(), tables: z.array(z.string()).optional()}); export const knowledgeInstanceConfig = z.object({id: z.string(), name: z.string(), description: z.string().nullable().optional(), db_id: z.string(), table: z.string()}); export const knowledgeConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(knowledgeDatabaseConfig).nullable().optional(), knowledge_instances: z.array(knowledgeInstanceConfig).nullable().optional()}); export const evalsDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigEvalsDomainConfig = z.object({db_id: z.string(), domain_config: evalsDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const evalsConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigEvalsDomainConfig).nullable().optional()}); export const tracesDomainConfig = z.object({display_name: z.string().nullable().optional()}); export const databaseConfigTracesDomainConfig = z.object({db_id: z.string(), domain_config: tracesDomainConfig.nullable().optional(), tables: z.array(z.string()).nullable().optional()}); export const tracesConfig = z.object({display_name: z.string().nullable().optional(), dbs: z.array(databaseConfigTracesDomainConfig).nullable().optional()}); export const model = z.object({id: z.string().nullable().optional(), provider: z.string().nullable().optional()}); export const agentSummaryResponse = z.object({id: z.string().nullable().optional(), name: z.string().nullable().optional(), description: z.string().nullable().optional(), db_id: z.string().nullable().optional(), model: model.nullable().optional(), metadata: z.record(z.string(), z.unknown()).nullable().optional()}); export const teamSummaryResponse = z.object({id: z.string().nullable().optional(), name: z.string().nullable().optional(), description: z.string().nullable().optional(), db_id: z.string().nullable().optional(), mode: z.string().nullable().optional(), model: model.nullable().optional()}); export const workflowSummaryResponse = z.object({id: z.string().nullable().optional(), name: z.string().nullable().optional(), description: z.string().nullable().optional(), db_id: z.string().nullable().optional(), is_factory: z.boolean().optional(), factory_input_schema: z.record(z.string(), z.unknown()).nullable().optional(), is_component: z.boolean().optional(), current_version: z.number().int().nullable().optional(), stage: z.string().nullable().optional()}); export const interfaceResponse = z.object({type: z.string(), version: z.string(), route: z.string()}); export const configResponse = z.object({os_id: z.string(), name: z.string().nullable().optional(), description: z.string().nullable().optional(), available_models: z.array(z.string()).nullable().optional(), os_database: z.string().nullable().optional(), databases: z.array(z.string()), chat: chatConfig.nullable().optional(), manifest: z.record(z.string(), manifest).nullable().optional(), session: sessionConfig.nullable().optional(), metrics: metricsConfig.nullable().optional(), memory: memoryConfig.nullable().optional(), learning: learningConfig.nullable().optional(), knowledge: knowledgeConfig.nullable().optional(), evals: evalsConfig.nullable().optional(), traces: tracesConfig.nullable().optional(), agents: z.array(agentSummaryResponse), teams: z.array(teamSummaryResponse), workflows: z.array(workflowSummaryResponse), interfaces: z.array(interfaceResponse)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get OS Configuration * * GET /config */ export const getApiConfig = async (options: GetApiConfigOptions) => { const {baseUrl, fetch: fetchFn = fetch, HTTPBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (HTTPBearer !== undefined) headers.set('authorization', `Bearer ${HTTPBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/config${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(configResponse, await res.json()) };