UNPKG

@sanity/client

Version:

Client for retrieving, creating and patching data from Sanity.io

169 lines (149 loc) 5.49 kB
import {type Observable} from 'rxjs' import {_request} from '../../data/dataMethods' import type {ObservableSanityClient, SanityClient} from '../../SanityClient' import type { AgentActionParams, AgentActionPathSegment, AgentActionTarget, Any, HttpRequest, IdentifiedSanityDocumentStub, } from '../../types' import {hasDataset} from '../../validators' import type { AgentActionAsync, AgentActionPath, AgentActionRequestBase, AgentActionSync, AgentActionTargetInclude, } from './commonTypes' import type {TransformTargetDocument} from './transform' /** @beta */ export interface TranslateRequestBase extends AgentActionRequestBase { /** schemaId as reported by sanity deploy / sanity schema store */ schemaId: string /** * The source document the transformation will use as input. * @see #AgentActionSchema.forcePublishedWrite */ documentId: string /** * The target document will first get content copied over from the source, * then it is translated according to the instruction. * * When omitted, the source document (documentId) is also the target document. * * @see #AgentActionSchema.forcePublishedWrite */ targetDocument?: TransformTargetDocument /** * While optional, it is recommended */ fromLanguage?: TranslateLanguage toLanguage: TranslateLanguage /** * `styleGuide` can be used to tailor how the translation should be preformed. * * String template using $variable from styleGuideParams. * * Capped to 2000 characters, after variables has been injected. * * @see #protectedPhrases */ styleGuide?: string /** param values for the string template, keys are the variable name, ie if the template has "$variable", one key must be "variable" */ styleGuideParams?: AgentActionParams /** * When the input string contains any phrase from `protectedPhrases`, the LLM will be instructed not * to translate them. * * It is recommended to use `protectedPhrases` instead of `styleGuide` for deny-list words and phrases, * since it keeps token cost low, resulting in faster responses, and limits how much information the LLM * has to process, since only phrases that are actually in the input string will be included in the final prompt. */ protectedPhrases?: string[] /** * When specified, the `toLanguage.id` will be stored in the specified path in the target document. * * The file _can_ be hidden: true (unlike other fields in the target, which will be ignored) */ languageFieldPath?: AgentActionPathSegment | AgentActionPath /** * Target defines which parts of the document will be affected by the instruction. * It can be an array, so multiple parts of the document can be separately configured in detail. * * Omitting target implies that the document itself is the root. * * Notes: * - instruction can only affect fields up to `maxPathDepth` * - when multiple targets are provided, they will be coalesced into a single target sharing a common target root. * It is therefor an error to provide conflicting include/exclude across targets (ie, include title in one, and exclude it in another) * * @see AgentActionRequestBase#conditionalPaths */ target?: TranslateTarget | TranslateTarget[] } /** @beta */ export interface TranslateLanguage { /** * Language code */ id: string /** * While optional, it is recommended to provide a language title */ title?: string } /** @beta */ export interface TranslateTargetInclude extends AgentActionTargetInclude { /** String template using $variable from styleGuideParams. */ styleGuide?: string /** * By default, all children up to `target.maxPathDepth` are included. * * When `include` is specified, only segments explicitly listed will be included. * * Fields or array items not on the include list, are implicitly excluded. */ include?: (AgentActionPathSegment | TranslateTargetInclude)[] } /** @beta */ export interface TranslateTarget extends AgentActionTarget { /** String template using $variable from styleGuideParams. */ styleGuide?: string /** * By default, all children up to `target.maxPathDepth` are included. * * When `include` is specified, only segments explicitly listed will be included. * * Fields or array items not on the include list, are implicitly excluded. */ include?: (AgentActionPathSegment | TranslateTargetInclude)[] } /** @beta */ // need the generics to hold optional call-site response generics // eslint-disable-next-line unused-imports/no-unused-vars export type TranslateDocumentSync<T extends Record<string, Any> = Record<string, Any>> = TranslateRequestBase & AgentActionSync /** @beta */ export type TranslateDocumentAsync = TranslateRequestBase & AgentActionAsync /** @beta */ export type TranslateDocument<T extends Record<string, Any> = Record<string, Any>> = | TranslateDocumentSync<T> | TranslateDocumentAsync export function _translate<DocumentShape extends Record<string, Any>>( client: SanityClient | ObservableSanityClient, httpRequest: HttpRequest, request: TranslateDocument<DocumentShape>, ): Observable< (typeof request)['async'] extends true ? {_id: string} : IdentifiedSanityDocumentStub & DocumentShape > { const dataset = hasDataset(client.config()) return _request(client, httpRequest, { method: 'POST', uri: `/agent/action/translate/${dataset}`, body: request, }) }