import {z} from 'zod' export type TurnRequest = {user_message: string, for_update?: boolean | undefined, include_evidence?: boolean | undefined, evidence_view?: ('display' | 'full') | undefined}; export type CreateApiV1ConversationsConversationIdTurnsArgs = {conversation_id: string, body: TurnRequest}; export type CreateApiV1ConversationsConversationIdTurnsOptions = {baseUrl: string, APIKeyHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const evidenceSection = z.object({path_titles: z.array(z.string()).nullable().optional(), path_numbers: z.array(z.string()).nullable().optional(), display_label: z.string().nullable().optional(), confidence: z.enum(["parsed", "derived", "unknown"]).optional()}); export const evidenceItemDisplay = z.object({citation_marker: z.string().nullable().optional(), label: z.string().nullable().optional(), short_label: z.string().nullable().optional(), document_title: z.string().nullable().optional(), version_number: z.number().int().nullable().optional(), section: evidenceSection.nullable().optional(), deep_link: z.string().nullable().optional(), kb_id: z.string().nullable().optional(), kb_name: z.string().nullable().optional(), document_id: z.string().nullable().optional(), source_provider: z.string().nullable().optional(), external_id: z.string().nullable().optional(), external_uri: z.string().nullable().optional()}); export const evidencePackageDisplay = z.object({view: z.literal("display").optional(), schema_version: z.number().int().optional(), package_id: z.string(), conversation_id: z.string(), message_id: z.string().nullable().optional(), turn_id: z.string(), created_at: z.string(), evidence_status: z.enum(["complete", "partial", "failed", "not_applicable"]), kb_used: z.boolean().optional(), items: z.array(evidenceItemDisplay)}); export const inlineSource = z.object({title: z.string(), url: z.string()}); export const evidenceProvenance = z.object({kb_id: z.string(), kb_name: z.string().nullable().optional(), document_id: z.string(), document_title: z.string(), version_id: z.string().nullable().optional(), version_number: z.number().int().nullable().optional(), source_type: z.string(), source_provider: z.string().nullable().optional(), deep_link: z.string().nullable().optional(), external_id: z.string().nullable().optional(), external_uri: z.string().nullable().optional(), inline_sources: z.array(inlineSource).optional(), filename: z.string().nullable().optional(), section: evidenceSection.nullable().optional(), chunk_id: z.string(), chunk_index: z.number().int().nullable().optional(), content_sha256: z.string().nullable().optional(), last_processed_at: z.string().nullable().optional()}); export const evidencePosition = z.object({type: z.literal("text").optional(), start_char: z.number().int().nullable().optional(), end_char: z.number().int().nullable().optional()}); export const evidenceScore = z.object({retrieval_score_raw: z.number().nullable().optional(), retrieval_score_display: z.number().nullable().optional(), score_basis: z.enum(["raw_hybrid_dotproduct", "minmax_normalized", "reranked_original_score", "grouped_unranked"]), band: z.enum(["high", "medium", "low", "unknown"]).optional(), calibrated: z.boolean().optional()}); export const evidenceUsageConstraints = z.object({sensitivity: z.enum(["public", "internal", "confidential", "restricted"]).nullable().optional(), sensitivity_level: z.number().int().nullable().optional(), visibility_mode: z.enum(["org_wide", "audience"]).nullable().optional(), audience_tags: z.array(z.string()).nullable().optional(), constraint_source: z.enum(["acl_columns", "metadata", "none"]).optional(), raw: z.record(z.string(), z.unknown()).nullable().optional()}); export const evidenceDisplay = z.object({label: z.string(), short_label: z.string().nullable().optional(), citation_marker: z.string().nullable().optional()}); export const evidenceItem = z.object({evidence_id: z.string(), rag_query_id: z.string().nullable().optional(), attribution_level: z.literal("exposed").optional(), prompt_order: z.number().int().nullable().optional(), provenance: evidenceProvenance, position: evidencePosition.nullable().optional(), score: evidenceScore.nullable().optional(), usage_constraints: evidenceUsageConstraints.nullable().optional(), display: evidenceDisplay.nullable().optional(), source_trust: z.string().nullable().optional(), scan_status: z.string().nullable().optional()}); export const evidencePackageFull = z.object({schema_version: z.number().int().optional(), package_id: z.string(), organization_id: z.string(), conversation_id: z.string(), message_id: z.string().nullable().optional(), turn_id: z.string(), agent_id: z.string().nullable().optional(), created_at: z.string(), evidence_status: z.enum(["complete", "partial", "failed", "not_applicable"]), status_reason: z.enum(["complete", "no_kb_used", "no_exposed_chunks", "answerability_suppressed", "partial_missing_source_rows", "item_cap_applied", "build_failed"]).nullable().optional(), items: z.array(evidenceItem), view: z.literal("full").optional()}); export const turnSource = z.object({title: z.string(), url: z.string()}); export const srcRuntimeConversationSchemasTurnResponse = z.object({turn_id: z.string(), conversation_id: z.string(), text: z.string(), active_assistant_id: z.string().nullable(), answering_assistant_id: z.string().nullable().optional(), path: z.string(), decision_source: z.string(), message_seqs: z.array(z.number().int()), session_status: z.string(), turn_ttft_ms: z.number().int().nullable().optional(), ended: z.boolean().optional(), evidence: z.union([evidencePackageDisplay, evidencePackageFull]).nullable().optional(), message: z.string().nullable().optional(), sources: z.array(turnSource).nullable().optional()}); 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 }; /** * Run one turn of a v2 conversation * * POST /v1/conversations/{conversation_id}/turns */ export const createApiV1ConversationsConversationIdTurns = async (args: CreateApiV1ConversationsConversationIdTurnsArgs, options: CreateApiV1ConversationsConversationIdTurnsOptions) => { const {baseUrl, fetch: fetchFn = fetch, APIKeyHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (APIKeyHeader !== undefined) headers.set("x-api-key", APIKeyHeader) const url = `${baseUrl.replace(/\/+$/, '')}/v1/conversations/${encodeURIComponent(String(args.conversation_id))}/turns${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(srcRuntimeConversationSchemasTurnResponse, await res.json()) };