{"version":3,"sources":["../../src/vertexai/client.ts"],"sourcesContent":["/**\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GenkitError, StatusName, type ErrorResponseMetadata } from 'genkit';\nimport { logger } from 'genkit/logging';\nimport { runInNewSpan } from 'genkit/tracing';\nimport { GoogleAuth } from 'google-auth-library';\nimport {\n  CreateInteractionRequest,\n  GeminiInteraction,\n  InteractionStreamResult,\n} from '../common/interaction-types.mjs';\nimport { isObject } from '../common/types.mjs';\nimport {\n  INTERACTIONS_API_REVISION,\n  buildTraceMetadataInput,\n  extractErrMsg,\n  getGenkitClientHeader,\n  httpStatusToGenkitStatus,\n  interactionErrorCodeToGenkitStatus,\n  interactionProcessStream,\n  isInteractionUrl,\n  parseRetryAfterMs,\n  processStream,\n  withoutHeaders,\n} from '../common/utils.mjs';\nimport {\n  ClientOptions,\n  EmbedContentRequest,\n  EmbedContentResponse,\n  EmbedPredictRequest,\n  EmbedPredictResponse,\n  GenerateContentRequest,\n  GenerateContentResponse,\n  GenerateContentStreamResult,\n  ImagenPredictRequest,\n  ImagenPredictResponse,\n  ListModelsResponse,\n  LyriaPredictRequest,\n  LyriaPredictResponse,\n  Model,\n  VeoOperation,\n  VeoOperationRequest,\n  VeoPredictRequest,\n} from './types.mjs';\nimport { calculateApiKey, checkSupportedResourceMethod } from './utils.mjs';\n\nexport const tracingHooks = { runInNewSpan };\n\ninterface TraceOptions<T> {\n  request?: unknown;\n  model?: string;\n  streaming?: boolean;\n  processFn?: (resp: Response) => Promise<T>;\n  clientOptions?: ClientOptions;\n}\n\nasync function maybeTraceRequest<T>(\n  url: string,\n  fetchOptions: RequestInit,\n  traceOptions: TraceOptions<T>\n): Promise<T> {\n  const call = async () => {\n    const response = await makeRequest(url, fetchOptions);\n    let processedResponse: Promise<T>;\n    if (traceOptions.processFn) {\n      // This is for streaming etc.\n      processedResponse = traceOptions.processFn(response);\n    } else {\n      // default processing is just get the json response\n      processedResponse = await response.json();\n    }\n    return processedResponse;\n  };\n\n  if (traceOptions.clientOptions?.experimental_debugTraces) {\n    return tracingHooks.runInNewSpan(\n      {\n        metadata: {\n          name: 'httpRequest',\n          // Seed input up front so the realtime \"pending\" span export carries it.\n          input: buildTraceMetadataInput(url, fetchOptions, traceOptions),\n        },\n      },\n      async (metadata) => {\n        const processedResponse = await call();\n\n        if (traceOptions.streaming) {\n          metadata.output = '[Streaming Response]';\n        } else {\n          metadata.output = processedResponse;\n        }\n\n        return processedResponse;\n      }\n    );\n  }\n  return call();\n}\n\nexport async function listModels(\n  clientOptions: ClientOptions\n): Promise<Model[]> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: false,\n    resourcePath: 'publishers/google/models',\n    clientOptions,\n  });\n  const fetchOptions = await getFetchOptions({\n    method: 'GET',\n    clientOptions,\n  });\n  const response = await makeRequest(url, fetchOptions);\n  const modelResponse = (await response.json()) as ListModelsResponse;\n  return modelResponse.publisherModels;\n}\n\n/**\n * Resource path of the Interactions API. Express mode has no project, but\n * still needs the location: `v1beta1/locations/global/interactions`.\n */\nfunction getInteractionsResourcePath(clientOptions: ClientOptions): string {\n  return clientOptions.kind == 'express'\n    ? 'locations/global/interactions'\n    : 'interactions';\n}\n\nexport async function createInteraction(\n  createInteractionRequest: CreateInteractionRequest,\n  clientOptions: ClientOptions\n): Promise<GeminiInteraction> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: getInteractionsResourcePath(clientOptions),\n    clientOptions,\n  });\n\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(createInteractionRequest),\n    isInteraction: true,\n  });\n\n  return maybeTraceRequest<GeminiInteraction>(url, fetchOptions, {\n    request: createInteractionRequest,\n    clientOptions,\n  });\n}\n\nexport async function createInteractionStream(\n  createInteractionRequest: CreateInteractionRequest,\n  clientOptions: ClientOptions\n): Promise<InteractionStreamResult> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: getInteractionsResourcePath(clientOptions),\n    clientOptions,\n  });\n\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(createInteractionRequest),\n    isInteraction: true,\n  });\n\n  return maybeTraceRequest<InteractionStreamResult>(url, fetchOptions, {\n    request: createInteractionRequest,\n    streaming: true,\n    clientOptions,\n    processFn: async (response) => {\n      return interactionProcessStream(response);\n    },\n  });\n}\n\nexport async function generateContent(\n  model: string,\n  generateContentRequest: GenerateContentRequest,\n  clientOptions: ClientOptions\n): Promise<GenerateContentResponse> {\n  let url: string;\n  if (model.includes('endpoints/')) {\n    // Tuned model\n    url = getVertexAIUrl({\n      includeProjectAndLocation: !model.startsWith('projects/'),\n      resourcePath: model,\n      resourceMethod: 'generateContent',\n      clientOptions,\n    });\n  } else {\n    url = getVertexAIUrl({\n      includeProjectAndLocation: true,\n      resourcePath: `publishers/google/models/${model}`,\n      resourceMethod: 'generateContent',\n      clientOptions,\n    });\n  }\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(generateContentRequest),\n  });\n\n  return maybeTraceRequest<GenerateContentResponse>(url, fetchOptions, {\n    model: model,\n    request: generateContentRequest,\n    clientOptions,\n  });\n}\n\nexport async function generateContentStream(\n  model: string,\n  generateContentRequest: GenerateContentRequest,\n  clientOptions: ClientOptions\n): Promise<GenerateContentStreamResult> {\n  let url: string;\n  if (model.includes('endpoints/')) {\n    // Tuned model\n    url = getVertexAIUrl({\n      includeProjectAndLocation: !model.startsWith('projects/'),\n      resourcePath: model,\n      resourceMethod: 'streamGenerateContent',\n      clientOptions,\n    });\n  } else {\n    url = getVertexAIUrl({\n      includeProjectAndLocation: true,\n      resourcePath: `publishers/google/models/${model}`,\n      resourceMethod: 'streamGenerateContent',\n      clientOptions,\n    });\n  }\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(generateContentRequest),\n  });\n\n  return maybeTraceRequest<GenerateContentStreamResult>(url, fetchOptions, {\n    model: model,\n    request: generateContentRequest,\n    streaming: true,\n    clientOptions,\n    processFn: async (response) => {\n      return processStream(response);\n    },\n  });\n}\n\nasync function internalPredict<T>(\n  model: string,\n  requestPayload: unknown,\n  clientOptions: ClientOptions\n): Promise<T> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: `publishers/google/models/${model}`,\n    resourceMethod: 'predict',\n    clientOptions,\n  });\n\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(requestPayload),\n  });\n\n  return maybeTraceRequest<T>(url, fetchOptions, {\n    model: model,\n    request: requestPayload,\n    clientOptions,\n  });\n}\n\n/**\n * Calls the `:predict` embeddings method (gemini-embedding-001,\n * text-embedding-*, multimodalembedding@001).\n */\nexport async function embedPredict(\n  model: string,\n  embedPredictRequest: EmbedPredictRequest,\n  clientOptions: ClientOptions\n): Promise<EmbedPredictResponse> {\n  return internalPredict<EmbedPredictResponse>(\n    model,\n    embedPredictRequest,\n    clientOptions\n  );\n}\n\n/**\n * Calls the `:embedContent` method (gemini-embedding-2).\n */\nexport async function embedContent(\n  model: string,\n  embedContentRequest: EmbedContentRequest,\n  clientOptions: ClientOptions\n): Promise<EmbedContentResponse> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: `publishers/google/models/${model}`,\n    resourceMethod: 'embedContent',\n    clientOptions,\n  });\n\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(embedContentRequest),\n  });\n\n  return maybeTraceRequest<EmbedContentResponse>(url, fetchOptions, {\n    model,\n    request: embedContentRequest,\n    clientOptions,\n  });\n}\n\nexport async function imagenPredict(\n  model: string,\n  imagenPredictRequest: ImagenPredictRequest,\n  clientOptions: ClientOptions\n): Promise<ImagenPredictResponse> {\n  return internalPredict<ImagenPredictResponse>(\n    model,\n    imagenPredictRequest,\n    clientOptions\n  );\n}\n\nexport async function lyriaPredict(\n  model: string,\n  lyriaPredictRequest: LyriaPredictRequest,\n  clientOptions: ClientOptions\n): Promise<LyriaPredictResponse> {\n  return internalPredict<LyriaPredictResponse>(\n    model,\n    lyriaPredictRequest,\n    clientOptions\n  );\n}\n\nexport async function veoPredict(\n  model: string,\n  veoPredictRequest: VeoPredictRequest,\n  clientOptions: ClientOptions\n): Promise<VeoOperation> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: `publishers/google/models/${model}`,\n    resourceMethod: 'predictLongRunning',\n    clientOptions,\n  });\n\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(veoPredictRequest),\n  });\n\n  return maybeTraceRequest<VeoOperation>(url, fetchOptions, {\n    model: model,\n    request: veoPredictRequest,\n    clientOptions,\n  });\n}\n\nexport async function veoCheckOperation(\n  model: string,\n  veoOperationRequest: VeoOperationRequest,\n  clientOptions: ClientOptions\n): Promise<VeoOperation> {\n  const url = getVertexAIUrl({\n    includeProjectAndLocation: true,\n    resourcePath: `publishers/google/models/${model}`,\n    resourceMethod: 'fetchPredictOperation',\n    clientOptions,\n  });\n  const fetchOptions = await getFetchOptions({\n    method: 'POST',\n    clientOptions,\n    body: JSON.stringify(veoOperationRequest),\n  });\n\n  return maybeTraceRequest<VeoOperation>(url, fetchOptions, {\n    model: model,\n    request: veoOperationRequest,\n    clientOptions,\n  });\n}\n\nexport function getVertexAIUrl(params: {\n  includeProjectAndLocation: boolean; // False for listModels, true for most others\n  resourcePath: string;\n  resourceMethod?: string;\n  queryParams?: string;\n  clientOptions: ClientOptions;\n}): string {\n  checkSupportedResourceMethod(params);\n\n  const DEFAULT_API_VERSION = 'v1beta1';\n  const API_BASE_PATH = 'aiplatform.googleapis.com';\n\n  let basePath: string;\n\n  if (params.clientOptions.kind == 'regional') {\n    basePath = `${params.clientOptions.location}-${API_BASE_PATH}`;\n  } else if (params.clientOptions.kind == 'multi-regional') {\n    basePath = `aiplatform.${params.clientOptions.location}.rep.googleapis.com`;\n  } else {\n    basePath = API_BASE_PATH;\n  }\n\n  let resourcePath = params.resourcePath;\n  if (\n    params.clientOptions.kind != 'express' &&\n    params.includeProjectAndLocation\n  ) {\n    const parent = `projects/${params.clientOptions.projectId}/locations/${params.clientOptions.location}`;\n    resourcePath = `${parent}/${params.resourcePath}`;\n  }\n\n  const version = params.clientOptions.apiVersion ?? DEFAULT_API_VERSION;\n\n  let url = `https://${basePath}/${version}/${resourcePath}`;\n  if (params.resourceMethod) {\n    url += `:${params.resourceMethod}`;\n  }\n\n  let joiner = '?';\n  if (params.queryParams) {\n    url += `${joiner}${params.queryParams}`;\n    joiner = '&';\n  }\n  if (params.resourceMethod === 'streamGenerateContent') {\n    url += `${joiner}alt=sse`;\n    joiner = '&';\n  }\n  return url;\n}\n\nasync function getFetchOptions(params: {\n  method: 'POST' | 'GET';\n  body?: string;\n  clientOptions: ClientOptions;\n  isInteraction?: boolean;\n}) {\n  const fetchOptions: RequestInit = {\n    method: params.method,\n    headers: await getHeaders(params.clientOptions, params.isInteraction),\n    redirect: 'manual',\n  };\n  if (params.body) {\n    fetchOptions.body = params.body;\n  }\n  const signal = getAbortSignal(params.clientOptions);\n  if (signal) {\n    fetchOptions.signal = signal;\n  }\n  return fetchOptions;\n}\n\nfunction getAbortSignal(clientOptions: ClientOptions): AbortSignal | undefined {\n  const hasTimeout = (clientOptions.timeout ?? -1) >= 0;\n  if (clientOptions.signal !== undefined || hasTimeout) {\n    const controller = new AbortController();\n    if (hasTimeout) {\n      setTimeout(() => controller.abort(), clientOptions.timeout);\n    }\n    if (clientOptions?.signal) {\n      clientOptions.signal.addEventListener('abort', () => {\n        controller.abort();\n      });\n    }\n    return controller.signal;\n  }\n  return undefined;\n}\n\nasync function getHeaders(\n  clientOptions: ClientOptions,\n  isInteraction?: boolean\n): Promise<HeadersInit> {\n  // The Interactions converters only understand INTERACTIONS_API_REVISION's\n  // schema, so custom headers can't change it (in any letter case).\n  const customHeaders = withoutHeaders(\n    clientOptions.customHeaders,\n    isInteraction ? ['Api-Revision'] : []\n  );\n  if (clientOptions.kind == 'express') {\n    const headers: HeadersInit = {\n      'x-goog-api-key': calculateApiKey(clientOptions.apiKey, undefined),\n      'Content-Type': 'application/json',\n      'X-Goog-Api-Client': getGenkitClientHeader(),\n      'User-Agent': getGenkitClientHeader(),\n      ...customHeaders,\n    };\n    if (isInteraction) {\n      headers['Api-Revision'] = INTERACTIONS_API_REVISION;\n    }\n    return headers;\n  } else {\n    const token = await getToken(clientOptions.authClient);\n    const headers: HeadersInit = {\n      Authorization: `Bearer ${token}`,\n      'x-goog-user-project': clientOptions.projectId,\n      'Content-Type': 'application/json',\n      'X-Goog-Api-Client': getGenkitClientHeader(),\n      'User-Agent': getGenkitClientHeader(),\n      ...customHeaders,\n    };\n    if (clientOptions.apiKey) {\n      headers['x-goog-api-key'] = clientOptions.apiKey;\n    }\n    if (isInteraction) {\n      headers['Api-Revision'] = INTERACTIONS_API_REVISION;\n    }\n    return headers;\n  }\n}\n\nasync function getToken(authClient: GoogleAuth): Promise<string> {\n  const CREDENTIAL_ERROR_MESSAGE =\n    '\\nUnable to authenticate your request\\\n        \\nDepending on your run time environment, you can get authentication by\\\n        \\n- if in local instance or cloud shell: `!gcloud auth login`\\\n        \\n- if in Colab:\\\n        \\n    -`from google.colab import auth`\\\n        \\n    -`auth.authenticate_user()`\\\n        \\n- if in service account or other: please follow guidance in https://cloud.google.com/docs/authentication';\n  const token = await authClient.getAccessToken().catch((e) => {\n    throw new Error(CREDENTIAL_ERROR_MESSAGE, e);\n  });\n  if (!token) {\n    throw new Error(CREDENTIAL_ERROR_MESSAGE);\n  }\n  return token;\n}\n\nasync function makeRequest(\n  url: string,\n  fetchOptions: RequestInit\n): Promise<Response> {\n  try {\n    const response = await fetch(url, fetchOptions);\n    if (!response.ok) {\n      let errorText = await response.text();\n      let errorMessage = errorText;\n      let errorDetail: unknown;\n      try {\n        const json = JSON.parse(errorText);\n        errorDetail = json;\n        if (json.error && json.error.message) {\n          errorMessage = json.error.message;\n          if (Array.isArray(json.error.details)) {\n            const detailsText = json.error.details\n              .map((d: any) => {\n                if (d.detail && typeof d.detail === 'string') {\n                  const match = d.detail.match(\n                    /\\[ORIGINAL ERROR\\]\\s*(?:generic::[^:]+:\\s*)?(.*?)(?:\\s+\\[|\\s+\\d+\\s+\\{|$)/\n                  );\n                  return match ? match[1].trim() : d.detail;\n                }\n                return JSON.stringify(d);\n              })\n              .filter(Boolean)\n              .join('\\n');\n            if (detailsText) {\n              errorMessage += `\\nDetails: ${detailsText}`;\n            }\n          }\n        }\n      } catch (e) {\n        // Not JSON or expected format, use the raw text\n      }\n      let status: StatusName = httpStatusToGenkitStatus(response.status);\n      // Interactions API errors carry a specific `error.code` (e.g. `safety`,\n      // `model_not_found`, `quota_exceeded`) that is more precise than the\n      // HTTP status, so prefer it when recognized.\n      if (isInteractionUrl(url)) {\n        const apiError = isObject(errorDetail) ? errorDetail.error : undefined;\n        const codeStatus = interactionErrorCodeToGenkitStatus(\n          isObject(apiError) ? apiError.code : undefined\n        );\n        if (codeStatus) {\n          status = codeStatus;\n        }\n      }\n      // Capture Retry-After header for retry middleware to use\n      const retryAfterHeader = response.headers.get('retry-after');\n      const retryAfterMs = retryAfterHeader\n        ? parseRetryAfterMs(retryAfterHeader)\n        : undefined;\n      const responseMetadata: ErrorResponseMetadata | undefined =\n        retryAfterMs !== undefined ? { retryAfterMs } : undefined;\n\n      throw new GenkitError({\n        status,\n        message: `Error fetching from ${url}: [${response.status} ${response.statusText}] ${errorMessage}`,\n        detail: errorDetail,\n        responseMetadata,\n      });\n    }\n    return response;\n  } catch (e: unknown) {\n    logger.error(e);\n    if (e instanceof GenkitError) {\n      throw e;\n    }\n    throw new Error(`Failed to fetch from ${url}: ${extractErrMsg(e)}`);\n  }\n}\n\nexport const TEST_ONLY = {\n  getFetchOptions,\n  getAbortSignal,\n  getHeaders,\n  makeRequest,\n  tracingHooks,\n};\n"],"mappings":"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","names":[]}