import {z} from 'zod' export type SourceMetadata = {path: string, type?: ('markdown' | 'text' | 'pdf' | 'html' | 'docx' | 'pptx' | 'xlsx' | 'image') | undefined, author?: (string | null) | undefined, created_at?: (string | null) | undefined, effective_from?: (string | null) | undefined, description?: (string | null) | undefined, tags?: Array | undefined, source_authority?: (string | null) | undefined, authoritative?: boolean | undefined}; export type PiiLevers = {mode?: ('off' | 'anonymize' | 'block') | undefined, contextual_entities?: (Array<'NAME' | 'ADDRESS' | 'AGE' | 'USERNAME'> | null) | undefined, structured_entities?: (Array<'EMAIL' | 'PHONE' | 'CREDIT_DEBIT_CARD_NUMBER' | 'CREDIT_DEBIT_CARD_CVV' | 'CREDIT_DEBIT_CARD_EXPIRY' | 'PIN' | 'PASSWORD' | 'INTERNATIONAL_BANK_ACCOUNT_NUMBER' | 'IP_ADDRESS' | 'AWS_ACCESS_KEY' | 'AWS_SECRET_KEY' | 'LICENSE_PLATE' | 'VEHICLE_IDENTIFICATION_NUMBER' | 'DRIVER_ID' | 'ES_DNI' | 'ES_NIE' | 'ES_NIF' | 'ES_NSS'> | null) | undefined, reversible?: boolean | undefined}; export type ExtractionProfileLevers = {name: string, description?: (string | null) | undefined, language?: (string | null) | undefined, scope_aware?: (boolean | null) | undefined, granularity?: ('fine' | 'standard' | 'coarse' | null) | undefined, additional_instructions?: (string | null) | undefined, business_relevance?: (string | null) | undefined, initial_pot_score?: (number | null) | undefined, pii?: (PiiLevers | null) | undefined}; export type ContextAttachmentCreateRequest = {type: 'author_note' | 'json_schema', name: string, content_text: string, mime_type?: ('text/plain' | 'application/json' | 'application/schema+json' | null) | undefined}; export type ExtractionPreviewRequest = {content: string, source?: (SourceMetadata | null) | undefined, language?: (string | null) | undefined, profile_id?: (string | null) | undefined, profile?: (ExtractionProfileLevers | null) | undefined, context_attachments?: Array | undefined, include_unmasked?: boolean | undefined}; export type CreateApiPotsPotIdExtractPreviewArgs = {pot_id: string, 'X-Contributor-ID'?: (string | null) | undefined, body: ExtractionPreviewRequest}; export type CreateApiPotsPotIdExtractPreviewOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const piiLevers = z.object({mode: z.enum(["off", "anonymize", "block"]).optional(), contextual_entities: z.array(z.enum(["NAME", "ADDRESS", "AGE", "USERNAME"])).nullable().optional(), structured_entities: z.array(z.enum(["EMAIL", "PHONE", "CREDIT_DEBIT_CARD_NUMBER", "CREDIT_DEBIT_CARD_CVV", "CREDIT_DEBIT_CARD_EXPIRY", "PIN", "PASSWORD", "INTERNATIONAL_BANK_ACCOUNT_NUMBER", "IP_ADDRESS", "AWS_ACCESS_KEY", "AWS_SECRET_KEY", "LICENSE_PLATE", "VEHICLE_IDENTIFICATION_NUMBER", "DRIVER_ID", "ES_DNI", "ES_NIE", "ES_NIF", "ES_NSS"])).nullable().optional(), reversible: z.boolean().optional()}); export const appliedProfile = z.object({source: z.enum(["stored", "inline"]), profile_id: z.string().nullable().optional(), version: z.number().int().gte(1).nullable().optional(), name: z.string(), language: z.string().nullable().optional(), scope_aware: z.boolean().nullable().optional(), granularity: z.enum(["fine", "standard", "coarse"]).nullable().optional(), additional_instructions: z.string().nullable().optional(), business_relevance: z.string().nullable().optional(), initial_pot_score: z.number().nullable().optional(), pii: piiLevers.nullable().optional()}); export const documentContext = z.object({title: z.string(), key_entities: z.array(z.string()), main_themes: z.array(z.string()), document_type: z.enum(["technical", "conceptual", "reference", "guide", "other"]), language: z.string().nullable().optional(), scope_hint: z.enum(["own", "third_party", "mixed_context", "unknown"]).nullable().optional()}); export const chunkingSummary = z.object({chunks_total: z.number().int().gte(0), chunks_failed: z.number().int().gte(0), target_size_tokens: z.number().int().gte(1), overlap_tokens: z.number().int().gte(0)}); export const potScoreLevel = z.enum(["CONSTITUTION", "VERIFIED", "SUPPORTED", "INFERRED", "HYPOTHESIS", "SPECULATION"]); export const provenance = z.object({type: z.string(), sources: z.array(z.record(z.string(), z.unknown())).optional(), derivation: z.record(z.string(), z.unknown()).nullable().optional(), profile_id: z.string().nullable().optional(), profile_version: z.number().int().gte(1).nullable().optional()}); export const classification = z.object({domain: z.string().optional(), subdomain: z.string().nullable().optional(), tags: z.array(z.string()).optional(), entity_mentions: z.array(z.string()).optional()}); export const documentLocation = z.object({page_number: z.number().int().gte(1).nullable().optional(), section_path: z.string().nullable().optional(), source_text: z.string().max(500).nullable().optional(), sheet_name: z.string().nullable().optional(), row_number: z.number().int().gte(1).nullable().optional(), cell_ref: z.string().nullable().optional()}); export const factPii = z.object({applied: z.boolean(), mode: z.enum(["off", "anonymize", "block"]), entities: z.record(z.string(), z.number().int()).optional(), coverage: z.enum(["full", "partial", "none"]).optional(), language: z.string().nullable().optional(), unmasked_content: z.string().nullable().optional()}); export const factWarning = z.object({pattern: z.string(), message: z.string(), detail: z.string().nullable().optional(), probability: z.number().nullable().optional()}); export const edgeTypeCounts = z.object({in: z.number().int().gte(0).optional(), out: z.number().int().gte(0).optional()}); export const edgeSummary = z.object({total_in: z.number().int().gte(0).optional(), total_out: z.number().int().gte(0).optional(), by_type: z.record(z.string(), edgeTypeCounts).optional()}); export const factExtended = z.object({id: z.string(), pot_id: z.string(), workspace_id: z.string().nullable().optional(), content: z.string().min(1), title: z.string().max(80).nullable().optional(), content_hash: z.string().nullable().optional(), pot_score: z.number().gte(0).lte(1), original_pot_score: z.number().gte(0).lte(1).nullable().optional(), level: potScoreLevel, embedding_model: z.string().nullable().optional(), provenance: provenance, classification: classification.optional(), status: z.string().optional(), validation_status: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), valid_from: z.string().nullable().optional(), valid_from_source: z.enum(["document_effective", "document_date", "contributor", "imported", "curator"]).nullable().optional(), document_id: z.string().nullable().optional(), language: z.string().nullable().optional(), location: documentLocation.nullable().optional(), scope_inferred: z.enum(["own", "third_party", "mixed_context", "unknown"]).nullable().optional(), scope_confidence: z.number().gte(0).lte(1).nullable().optional(), scope_reason: z.string().max(500).nullable().optional(), context_attachment_ids_used: z.array(z.string()).nullable().optional(), pii: factPii.nullable().optional(), version: z.number().int().optional(), flags: z.array(z.string()).optional(), notes: z.string().nullable().optional(), warnings: z.array(factWarning).optional(), edge_summary: edgeSummary.optional()}).and(z.record(z.string(), z.unknown())); export const discardReason = z.enum(["duplicate", "duplicate_of_constitution", "too_short", "too_long"]); export const discardedFact = z.object({id: z.string(), content: z.string(), reason: discardReason, duplicate_of_id: z.string().nullable().optional(), similarity_score: z.number().gte(0).lte(1).nullable().optional(), decision_confidence: z.number().gte(0).lte(1).nullable().optional(), timestamp: z.string().optional()}); export const keptNearDuplicate = z.object({id: z.string(), other_id: z.string().nullable().optional(), other_kind: z.enum(["fact", "constitution"]), relation: z.enum(["contradiction", "restates", "complementary", "undecided"]), reason: z.string(), confidence: z.number().gte(0).lte(1).nullable().optional(), similarity_score: z.number().gte(0).lte(1), cosine: z.number().gte(-1).lte(1).nullable().optional(), found_by: z.enum(["wording", "meaning", "both"]).optional()}); export const semanticCandidateAudit = z.object({status: z.enum(["on", "failed"]), threshold: z.number().gte(-1).lte(1), top_k: z.number().int().gte(1), pairs_added: z.number().int().gte(0).optional(), errors: z.number().int().gte(0).optional()}); export const extractionAudit = z.object({total_extracted: z.number().int(), filtered: z.number().int().gte(0).optional(), filtered_by_reason: z.record(z.string(), z.number().int()).optional(), kept: z.number().int(), discarded: z.number().int(), discarded_facts: z.array(discardedFact).optional(), near_duplicates_kept: z.array(keptNearDuplicate).optional(), near_duplicates_total: z.number().int().gte(0).optional(), near_duplicates_by_relation: z.record(z.string(), z.number().int()).optional(), near_duplicates_by_reason: z.record(z.string(), z.number().int()).optional(), near_duplicates_unchecked: z.number().int().gte(0).optional(), near_duplicates_restates: z.number().int().gte(0).optional(), semantic_candidates: semanticCandidateAudit.nullable().optional()}); export const chunkError = z.object({chunk_index: z.number().int().gte(0), code: z.string(), message: z.string(), retryable: z.boolean().optional()}); export const previewUsage = z.object({llm_calls: z.number().int().gte(0), prompt_tokens: z.number().int().gte(0), completion_tokens: z.number().int().gte(0), cached_prompt_tokens: z.number().int().gte(0).optional(), cache_write_tokens: z.number().int().gte(0).optional()}); export const appliedContextAttachment = z.object({type: z.enum(["author_note", "json_schema"]), name: z.string(), byte_size: z.number().int()}); export const piiRunSummary = z.object({mode: z.enum(["off", "anonymize", "block"]), provider: z.string(), provider_version: z.string().nullable().optional(), entitlement: z.enum(["premium", "floor"]), facts_scanned: z.number().int().gte(0).optional(), facts_anonymized: z.number().int().gte(0).optional(), facts_blocked: z.number().int().gte(0).optional(), by_type: z.record(z.string(), z.number().int()).optional(), coverage: z.enum(["full", "partial", "none"]).optional(), language: z.string().nullable().optional(), units: z.number().int().gte(0).optional(), free_units: z.number().int().gte(0).optional(), chars: z.number().int().gte(0).optional(), processing_ms: z.number().int().gte(0).optional()}); export const previewLimits = z.object({max_content_chars: z.number().int().optional(), timeout_seconds: z.number().int().optional(), max_concurrent_per_process: z.number().int().optional(), requests_per_minute: z.number().int().optional()}); export const extractionPreviewResponse = z.object({pot_id: z.string(), persisted: z.literal(false).optional(), score_stage: z.enum(["initial", "propagated"]).optional(), edges: z.array(z.unknown()).nullable().optional(), dedup_scope: z.literal("batch+constitution").optional(), profile_applied: appliedProfile.nullable().optional(), language_applied: z.string().nullable().optional(), content_chars: z.number().int().gte(1), document_context: documentContext, chunking: chunkingSummary, facts: z.array(factExtended), extraction_audit: extractionAudit, errors: z.array(chunkError).optional(), processing_time_ms: z.number().int().gte(0), usage: previewUsage, context_attachments_applied: z.array(appliedContextAttachment).optional(), pii_applied: piiRunSummary.nullable().optional(), detail: z.string().nullable().optional(), detail_code: z.enum(["all_filtered", "no_facts_found", "all_withheld", "all_duplicates"]).nullable().optional(), limits: previewLimits.optional(), partial: z.boolean()}); 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 }; /** * Preview what a profile would extract from a text (nothing is stored) * * POST /pots/{pot_id}/extract/preview */ export const createApiPotsPotIdExtractPreview = async (args: CreateApiPotsPotIdExtractPreviewArgs, options: CreateApiPotsPotIdExtractPreviewOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['X-Contributor-ID'] != null) headers.set("X-Contributor-ID", String(args['X-Contributor-ID'])) const url = `${baseUrl.replace(/\/+$/, '')}/pots/${encodeURIComponent(String(args.pot_id))}/extract/preview${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(extractionPreviewResponse, await res.json()) };