import {z} from 'zod' export type GetApiV1ServiceAccountsArgs = {'xi-api-key'?: (string | null) | undefined}; export type GetApiV1ServiceAccountsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const permissionType = z.enum(["text_to_speech", "speech_to_speech", "speech_to_text", "models_read", "models_write", "voices_read", "voices_write", "voice_collections_read", "voice_collections_write", "speech_history_read", "speech_history_write", "sound_generation", "audio_isolation", "voice_generation", "dubbing_read", "dubbing_write", "pronunciation_dictionaries_read", "pronunciation_dictionaries_write", "user_read", "user_write", "projects_read", "projects_write", "audio_native_read", "audio_native_write", "workspace_read", "workspace_write", "forced_alignment", "convai_read", "convai_write", "agents_architect", "music_generation", "image_video_generation", "flows", "templates", "add_voice_from_voice_library", "create_instant_voice_clone", "create_professional_voice_clone", "publish_voice_to_voice_library", "share_voice_externally", "create_user_api_key", "workspace_analytics_full_read", "webhooks_write", "service_account_write", "group_members_manage", "workspace_members_read", "workspace_members_invite", "workspace_members_remove", "terms_of_service_accept", "audit_log_read", "conversation_privacy_manage", "copy_resources_cross_workspace", "synthid_detector"]); export const lockReason = z.enum(["trial_ended", "subscription_downgrade", "exposed_publicly", "self_disabled"]); export const storedUsagePlatformLimit = z.object({limit: z.number().int().nullable().optional(), usage: z.number().int().optional()}); export const computedUsagePlatformLimit = z.object({limit: z.number().int().nullable().optional()}); export const platformLimits = z.object({credits: storedUsagePlatformLimit.optional(), pvc: computedUsagePlatformLimit.optional(), concurrency: computedUsagePlatformLimit.optional(), dubbing_concurrency: computedUsagePlatformLimit.optional(), music_concurrency: computedUsagePlatformLimit.optional()}); export const workspaceApiKeyResponseModel = z.object({name: z.string(), hint: z.string(), key_id: z.string(), service_account_user_id: z.string(), created_at_unix: z.number().int().nullable().optional(), is_disabled: z.boolean().optional(), permissions: z.array(permissionType).nullable().optional(), disable_reason: lockReason.nullable().optional(), character_limit: z.number().int().nullable().optional(), character_count: z.number().int().nullable().optional(), hashed_xi_api_key: z.string(), allowed_ips: z.array(z.string()).nullable().optional(), third_party_disable_allowed: z.boolean().nullable().optional(), platform_limits: platformLimits.nullable().optional(), expires_at_unix: z.number().int().nullable().optional()}); export const workspaceGroupPermission = z.enum(["text_to_speech", "speech_to_speech", "speech_to_text", "voice_lab", "sound_effects", "projects", "voiceover_studio", "dubbing", "audio_native", "conversational_ai", "conversational_ai_read", "architect", "voice_isolator", "ai_speech_classifier", "synthid_detector", "add_voice_from_voice_library", "create_instant_voice_clone", "create_professional_voice_clone", "create_user_api_key", "publish_studio_project", "music", "image_video_generation", "flows", "templates", "share_voice_externally", "publish_voice_to_voice_library", "view_fiat_balance", "workspace_analytics_full_read", "service_accounts_manage", "webhooks_manage", "group_members_manage", "workspace_members_invite", "workspace_members_remove", "terms_of_service_accept", "audit_log_read", "conversation_privacy_manage", "all_resources_access", "copy_resources_cross_workspace", "voice_design"]); export const seatType = z.enum(["workspace_admin", "workspace_member", "workspace_lite_member"]); export const scimGroupResponseModel = z.object({scim_external_id: z.string().nullable(), display_name: z.string(), created_at_unix: z.number().int().nullable().optional(), updated_at_unix: z.number().int().nullable().optional(), seat_type: seatType.nullable().optional()}); export const workspaceGroupResponseModel = z.object({name: z.string(), id: z.string(), members: z.array(z.string()), permissions: z.array(workspaceGroupPermission).nullable(), group_usage_limit: z.union([z.number().int(), z.literal("unlimited")]).nullable().optional(), group_pvc_limit: z.union([z.number().int(), z.literal("unlimited")]).nullable().optional(), group_concurrency_limit: z.union([z.number().int(), z.literal("unlimited")]).nullable().optional(), group_dubbing_concurrency_limit: z.union([z.number().int(), z.literal("unlimited")]).nullable().optional(), group_music_concurrency_limit: z.union([z.number().int(), z.literal("unlimited")]).nullable().optional(), character_count: z.number().int().nullable().optional(), is_scim_synced: z.boolean().optional(), scim_group: scimGroupResponseModel.nullable().optional(), scim_frozen: z.boolean().optional()}); export const defaultSharingGroupResponseModel = z.object({group: workspaceGroupResponseModel, permission_level: z.enum(["admin", "editor", "viewer"])}); export const workspaceServiceAccountResponseModel = z.object({service_account_user_id: z.string(), name: z.string(), created_at_unix: z.number().int().nullable().optional(), "api-keys": z.array(workspaceApiKeyResponseModel), default_sharing_groups: z.array(defaultSharingGroupResponseModel).optional()}); export const workspaceServiceAccountListResponseModel = z.object({"service-accounts": z.array(workspaceServiceAccountResponseModel)}); 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 Workspace Service Accounts * * GET /v1/service-accounts */ export const getApiV1ServiceAccounts = async (args: GetApiV1ServiceAccountsArgs, options: GetApiV1ServiceAccountsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['xi-api-key'] != null) headers.set("xi-api-key", String(args['xi-api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/v1/service-accounts${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(workspaceServiceAccountListResponseModel, await res.json()) };