@langchain/google-common 2.1.26-dev-1773962633795 → 2.1.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/auth.cjs.map +1 -1
  3. package/dist/auth.d.cts.map +1 -1
  4. package/dist/auth.d.ts.map +1 -1
  5. package/dist/auth.js.map +1 -1
  6. package/dist/chat_models.cjs +1 -1
  7. package/dist/chat_models.cjs.map +1 -1
  8. package/dist/chat_models.js +1 -1
  9. package/dist/chat_models.js.map +1 -1
  10. package/dist/connection.cjs.map +1 -1
  11. package/dist/connection.js.map +1 -1
  12. package/dist/experimental/media.cjs.map +1 -1
  13. package/dist/experimental/media.js.map +1 -1
  14. package/dist/experimental/utils/media_core.cjs.map +1 -1
  15. package/dist/experimental/utils/media_core.js.map +1 -1
  16. package/dist/llms.cjs +1 -1
  17. package/dist/llms.cjs.map +1 -1
  18. package/dist/llms.js +1 -1
  19. package/dist/llms.js.map +1 -1
  20. package/dist/types.cjs.map +1 -1
  21. package/dist/types.d.cts +1 -1
  22. package/dist/types.d.cts.map +1 -1
  23. package/dist/types.d.ts +1 -1
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/types.js.map +1 -1
  26. package/dist/utils/anthropic.cjs.map +1 -1
  27. package/dist/utils/anthropic.js.map +1 -1
  28. package/dist/utils/common.cjs.map +1 -1
  29. package/dist/utils/common.js.map +1 -1
  30. package/dist/utils/failed_handler.cjs.map +1 -1
  31. package/dist/utils/failed_handler.js.map +1 -1
  32. package/dist/utils/gemini.cjs +1 -0
  33. package/dist/utils/gemini.cjs.map +1 -1
  34. package/dist/utils/gemini.d.cts.map +1 -1
  35. package/dist/utils/gemini.d.ts.map +1 -1
  36. package/dist/utils/gemini.js +1 -0
  37. package/dist/utils/gemini.js.map +1 -1
  38. package/dist/utils/safety.cjs.map +1 -1
  39. package/dist/utils/safety.js.map +1 -1
  40. package/dist/utils/stream.cjs.map +1 -1
  41. package/dist/utils/stream.js.map +1 -1
  42. package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
  43. package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
  44. package/experimental/media.cjs +1 -0
  45. package/experimental/media.d.cts +1 -0
  46. package/experimental/media.d.ts +1 -0
  47. package/experimental/media.js +1 -0
  48. package/experimental/utils/media_core.cjs +1 -0
  49. package/experimental/utils/media_core.d.cts +1 -0
  50. package/experimental/utils/media_core.d.ts +1 -0
  51. package/experimental/utils/media_core.js +1 -0
  52. package/package.json +5 -14
  53. package/types.cjs +1 -0
  54. package/types.d.cts +1 -0
  55. package/types.d.ts +1 -0
  56. package/types.js +1 -0
  57. package/utils.cjs +1 -0
  58. package/utils.d.cts +1 -0
  59. package/utils.d.ts +1 -0
  60. package/utils.js +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","names":[],"sources":["../src/connection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { BaseLanguageModelCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n AsyncCaller,\n AsyncCallerCallOptions,\n} from \"@langchain/core/utils/async_caller\";\nimport { getRuntimeEnvironment } from \"@langchain/core/utils/env\";\nimport { BaseRunManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type {\n GoogleAIBaseLLMInput,\n GoogleConnectionParams,\n GooglePlatformType,\n GoogleResponse,\n GoogleLLMResponse,\n GoogleAIModelRequestParams,\n GoogleRawResponse,\n GoogleAIAPI,\n VertexModelFamily,\n GoogleAIAPIConfig,\n AnthropicAPIConfig,\n GeminiAPIConfig,\n GoogleModelParams,\n} from \"./types.js\";\nimport {\n GoogleAbstractedClient,\n GoogleAbstractedClientOps,\n GoogleAbstractedClientOpsMethod,\n} from \"./auth.js\";\nimport {\n getGeminiAPI,\n modelToFamily,\n modelToPublisher,\n} from \"./utils/index.js\";\nimport { getAnthropicAPI } from \"./utils/anthropic.js\";\n\nexport abstract class GoogleConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n> {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n streaming: boolean;\n\n constructor(\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n this.caller = caller;\n this.client = client;\n this.streaming = streaming ?? false;\n }\n\n abstract buildUrl(): Promise<string>;\n\n abstract buildMethod(): GoogleAbstractedClientOpsMethod;\n\n async _clientInfoHeaders(): Promise<Record<string, string>> {\n const { userAgent, clientLibraryVersion } = await this._getClientInfo();\n return {\n \"User-Agent\": userAgent,\n \"Client-Info\": clientLibraryVersion,\n };\n }\n\n async _getClientInfo(): Promise<{\n userAgent: string;\n clientLibraryVersion: string;\n }> {\n const env = await getRuntimeEnvironment();\n const langchain = env?.library ?? \"langchain-js\";\n // TODO: Add an API for getting the current LangChain version\n const langchainVersion = \"0\";\n const moduleName = await this._moduleName();\n let clientLibraryVersion = `${langchain}/${langchainVersion}`;\n if (moduleName && moduleName.length) {\n clientLibraryVersion = `${clientLibraryVersion}-${moduleName}`;\n }\n return {\n userAgent: clientLibraryVersion,\n clientLibraryVersion: `${langchainVersion}-${moduleName}`,\n };\n }\n\n async _moduleName(): Promise<string> {\n return this.constructor.name;\n }\n\n async additionalHeaders(): Promise<Record<string, string>> {\n return {};\n }\n\n async _buildOpts(\n data: unknown | undefined,\n options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<GoogleAbstractedClientOps> {\n const url = await this.buildUrl();\n const method = this.buildMethod();\n const infoHeaders = (await this._clientInfoHeaders()) ?? {};\n const additionalHeaders = (await this.additionalHeaders()) ?? {};\n const headers = {\n ...infoHeaders,\n ...additionalHeaders,\n ...requestHeaders,\n };\n\n const opts: GoogleAbstractedClientOps = {\n url,\n method,\n headers,\n signal: options?.signal,\n };\n if (data && method === \"POST\") {\n opts.data = data;\n }\n if (this.streaming) {\n opts.responseType = \"stream\";\n } else {\n opts.responseType = \"json\";\n }\n return opts;\n }\n\n async _request(\n data: unknown | undefined,\n options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<ResponseType> {\n const opts = await this._buildOpts(data, options, requestHeaders);\n const callResponse = await this.caller.callWithOptions(\n { signal: options?.signal },\n async () => this.client.request(opts)\n );\n const response: unknown = callResponse; // Done for typecast safety, I guess\n return <ResponseType>response;\n }\n}\n\nexport abstract class GoogleHostConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n>\n extends GoogleConnection<CallOptions, ResponseType>\n implements GoogleConnectionParams<AuthOptions>\n{\n // This does not default to a value intentionally.\n // Use the \"platform\" getter if you need this.\n platformType: GooglePlatformType | undefined;\n\n _endpoint: string | undefined;\n\n _location: string | undefined;\n\n _apiVersion: string | undefined;\n\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n super(caller, client, streaming);\n this.caller = caller;\n\n this.platformType = this.fieldPlatformType(fields);\n this._endpoint = fields?.endpoint;\n this._location = fields?.location;\n this._apiVersion = fields?.apiVersion;\n this.client = client;\n }\n\n fieldPlatformType(\n fields: GoogleConnectionParams<any> | undefined\n ): GooglePlatformType | undefined {\n if (typeof fields === \"undefined\") {\n return undefined;\n }\n if (typeof fields.platformType !== \"undefined\") {\n return fields.platformType;\n }\n if (fields.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n }\n\n get platform(): GooglePlatformType {\n return this.platformType ?? this.computedPlatformType;\n }\n\n get computedPlatformType(): GooglePlatformType {\n return \"gcp\";\n }\n\n get computedApiVersion(): string {\n return \"v1\";\n }\n\n get apiVersion(): string {\n return this._apiVersion ?? this.computedApiVersion;\n }\n\n get location(): string {\n return this._location ?? this.computedLocation;\n }\n\n get computedLocation(): string {\n return \"us-central1\";\n }\n\n get endpoint(): string {\n return this._endpoint ?? this.computedEndpoint;\n }\n\n get computedEndpoint(): string {\n if (this.location === \"global\") {\n return \"aiplatform.googleapis.com\";\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"POST\";\n }\n}\n\nexport abstract class GoogleRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, GoogleRawResponse, AuthOptions> {\n async _buildOpts(\n data: unknown | undefined,\n _options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<GoogleAbstractedClientOps> {\n const opts = await super._buildOpts(data, _options, requestHeaders);\n opts.responseType = \"blob\";\n return opts;\n }\n}\n\nexport abstract class GoogleAIConnection<\n CallOptions extends AsyncCallerCallOptions,\n InputType,\n AuthOptions,\n ResponseType extends GoogleResponse,\n>\n extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions>\n implements GoogleAIBaseLLMInput<AuthOptions>\n{\n model: string;\n\n modelName: string;\n\n client: GoogleAbstractedClient;\n\n _apiName?: string;\n\n apiConfig?: GoogleAIAPIConfig;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n super(fields, caller, client, streaming);\n this.client = client;\n this.modelName = fields?.model ?? fields?.modelName ?? this.model;\n this.model = this.modelName;\n\n this._apiName = fields?.apiName;\n this.apiConfig = {\n safetyHandler: fields?.safetyHandler, // For backwards compatibility\n ...fields?.apiConfig,\n };\n }\n\n get modelFamily(): VertexModelFamily {\n return modelToFamily(this.model);\n }\n\n get modelPublisher(): string {\n return modelToPublisher(this.model);\n }\n\n get computedAPIName(): string {\n // At least at the moment, model publishers and APIs map the same\n return this.modelPublisher;\n }\n\n get apiName(): string {\n return this._apiName ?? this.computedAPIName;\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n case \"gemma\": // TODO: Is this true?\n return getGeminiAPI(this.apiConfig as GeminiAPIConfig);\n case \"anthropic\":\n return getAnthropicAPI(this.apiConfig as AnthropicAPIConfig);\n default:\n throw new Error(`Unknown API: ${this.apiName}`);\n }\n }\n\n get isApiKey(): boolean {\n return this.client.clientType === \"apiKey\";\n }\n\n fieldPlatformType(\n fields: GoogleConnectionParams<any> | undefined\n ): GooglePlatformType | undefined {\n const ret = super.fieldPlatformType(fields);\n if (typeof ret !== \"undefined\") {\n return ret;\n }\n if (fields?.vertexai === false) {\n return \"gai\";\n }\n return undefined;\n }\n\n get computedPlatformType(): GooglePlatformType {\n // This is not a completely correct assumption, since GCP can\n // have an API Key. But if so, then people need to set the platform\n // type explicitly.\n if (this.isApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n }\n\n get computedApiVersion(): string {\n switch (this.platform) {\n case \"gai\":\n return \"v1beta\";\n default:\n return \"v1\";\n }\n }\n\n get computedLocation(): string {\n switch (this.apiName) {\n case \"google\":\n return super.computedLocation;\n case \"anthropic\":\n return \"us-east5\";\n default:\n throw new Error(\n `Unknown apiName: ${this.apiName}. Can't get location.`\n );\n }\n }\n\n abstract buildUrlMethod(): Promise<string>;\n\n async buildUrlGenerativeLanguage(): Promise<string> {\n const method = await this.buildUrlMethod();\n const url = `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertexExpress(): Promise<string> {\n const method = await this.buildUrlMethod();\n const publisher = this.modelPublisher;\n const url = `https://aiplatform.googleapis.com/${this.apiVersion}/publishers/${publisher}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertexLocation(): Promise<string> {\n const projectId = await this.client.getProjectId();\n const method = await this.buildUrlMethod();\n const publisher = this.modelPublisher;\n const url = `https://${this.endpoint}/${this.apiVersion}/projects/${projectId}/locations/${this.location}/publishers/${publisher}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertex(): Promise<string> {\n if (this.isApiKey) {\n return this.buildUrlVertexExpress();\n } else {\n return this.buildUrlVertexLocation();\n }\n }\n\n async buildUrl(): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGenerativeLanguage();\n default:\n return this.buildUrlVertex();\n }\n }\n\n abstract formatData(\n input: InputType,\n parameters: GoogleModelParams\n ): Promise<unknown>;\n\n async request(\n input: InputType,\n parameters: GoogleAIModelRequestParams,\n\n options: CallOptions,\n runManager?: BaseRunManager\n ): Promise<ResponseType> {\n const moduleName = this.constructor.name;\n const streamingParameters: GoogleAIModelRequestParams = {\n ...parameters,\n streaming: this.streaming,\n };\n const data = await this.formatData(input, streamingParameters);\n\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n data,\n parameters: streamingParameters,\n options,\n connection: {\n ...this,\n url: await this.buildUrl(),\n urlMethod: await this.buildUrlMethod(),\n modelFamily: this.modelFamily,\n modelPublisher: this.modelPublisher,\n computedPlatformType: this.computedPlatformType,\n },\n });\n\n const response = await this._request(data, options);\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n response,\n });\n\n return response;\n }\n}\n\nexport abstract class AbstractGoogleLLMConnection<\n MessageType,\n AuthOptions,\n> extends GoogleAIConnection<\n BaseLanguageModelCallOptions,\n MessageType,\n AuthOptions,\n GoogleLLMResponse\n> {\n async buildUrlMethodGemini(): Promise<string> {\n return this.streaming ? \"streamGenerateContent\" : \"generateContent\";\n }\n\n async buildUrlMethodClaude(): Promise<string> {\n return this.streaming ? \"streamRawPredict\" : \"rawPredict\";\n }\n\n async buildUrlMethod(): Promise<string> {\n switch (this.modelFamily) {\n case \"gemini\":\n case \"gemma\": // TODO: Is this true?\n return this.buildUrlMethodGemini();\n case \"claude\":\n return this.buildUrlMethodClaude();\n default:\n throw new Error(`Unknown model family: ${this.modelFamily}`);\n }\n }\n\n async formatData(\n input: MessageType,\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n // Filter out labels for non-Vertex AI platforms (labels are only supported on Vertex AI)\n let filteredParameters = parameters;\n if (parameters.labels && this.platform !== \"gcp\") {\n const { labels, ...paramsWithoutLabels } = parameters;\n filteredParameters = paramsWithoutLabels;\n }\n\n return this.api.formatData(input, filteredParameters);\n }\n}\n\nexport interface GoogleCustomEventInfo {\n subEvent: string;\n module: string;\n}\n\nexport abstract class GoogleRequestCallbackHandler extends BaseCallbackHandler {\n customEventInfo(eventName: string): GoogleCustomEventInfo {\n const names = eventName.split(\"-\");\n return {\n subEvent: names[1],\n module: names[2],\n };\n }\n\n abstract handleCustomRequestEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n abstract handleCustomResponseEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n abstract handleCustomChunkEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n handleCustomEvent(\n eventName: string,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any {\n if (!eventName) {\n return undefined;\n }\n const eventInfo = this.customEventInfo(eventName);\n switch (eventInfo.subEvent) {\n case \"request\":\n return this.handleCustomRequestEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n case \"response\":\n return this.handleCustomResponseEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n case \"chunk\":\n return this.handleCustomChunkEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n default:\n console.error(\n `Unexpected eventInfo for ${eventName} ${JSON.stringify(\n eventInfo,\n null,\n 1\n )}`\n );\n }\n }\n}\n\nexport class GoogleRequestLogger extends GoogleRequestCallbackHandler {\n name: string = \"GoogleRequestLogger\";\n\n log(eventName: string, data: any, tags?: string[]): undefined {\n const tagStr = tags ? `[${tags}]` : \"[]\";\n console.log(`${eventName} ${tagStr} ${JSON.stringify(data, null, 1)}`);\n }\n\n handleCustomRequestEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n\n handleCustomResponseEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n\n handleCustomChunkEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n}\n\nexport class GoogleRequestRecorder extends GoogleRequestCallbackHandler {\n name = \"GoogleRequestRecorder\";\n\n request: any = {};\n\n response: any = {};\n\n chunk: any[] = [];\n\n handleCustomRequestEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.request = data;\n }\n\n handleCustomResponseEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.response = data;\n }\n\n handleCustomChunkEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.chunk.push(data);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","names":[],"sources":["../src/connection.ts"],"sourcesContent":["/* oxlint-disable @typescript-eslint/no-explicit-any */\nimport { BaseLanguageModelCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n AsyncCaller,\n AsyncCallerCallOptions,\n} from \"@langchain/core/utils/async_caller\";\nimport { getRuntimeEnvironment } from \"@langchain/core/utils/env\";\nimport { BaseRunManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseCallbackHandler } from \"@langchain/core/callbacks/base\";\nimport type {\n GoogleAIBaseLLMInput,\n GoogleConnectionParams,\n GooglePlatformType,\n GoogleResponse,\n GoogleLLMResponse,\n GoogleAIModelRequestParams,\n GoogleRawResponse,\n GoogleAIAPI,\n VertexModelFamily,\n GoogleAIAPIConfig,\n AnthropicAPIConfig,\n GeminiAPIConfig,\n GoogleModelParams,\n} from \"./types.js\";\nimport {\n GoogleAbstractedClient,\n GoogleAbstractedClientOps,\n GoogleAbstractedClientOpsMethod,\n} from \"./auth.js\";\nimport {\n getGeminiAPI,\n modelToFamily,\n modelToPublisher,\n} from \"./utils/index.js\";\nimport { getAnthropicAPI } from \"./utils/anthropic.js\";\n\nexport abstract class GoogleConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n> {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n streaming: boolean;\n\n constructor(\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n this.caller = caller;\n this.client = client;\n this.streaming = streaming ?? false;\n }\n\n abstract buildUrl(): Promise<string>;\n\n abstract buildMethod(): GoogleAbstractedClientOpsMethod;\n\n async _clientInfoHeaders(): Promise<Record<string, string>> {\n const { userAgent, clientLibraryVersion } = await this._getClientInfo();\n return {\n \"User-Agent\": userAgent,\n \"Client-Info\": clientLibraryVersion,\n };\n }\n\n async _getClientInfo(): Promise<{\n userAgent: string;\n clientLibraryVersion: string;\n }> {\n const env = await getRuntimeEnvironment();\n const langchain = env?.library ?? \"langchain-js\";\n // TODO: Add an API for getting the current LangChain version\n const langchainVersion = \"0\";\n const moduleName = await this._moduleName();\n let clientLibraryVersion = `${langchain}/${langchainVersion}`;\n if (moduleName && moduleName.length) {\n clientLibraryVersion = `${clientLibraryVersion}-${moduleName}`;\n }\n return {\n userAgent: clientLibraryVersion,\n clientLibraryVersion: `${langchainVersion}-${moduleName}`,\n };\n }\n\n async _moduleName(): Promise<string> {\n return this.constructor.name;\n }\n\n async additionalHeaders(): Promise<Record<string, string>> {\n return {};\n }\n\n async _buildOpts(\n data: unknown | undefined,\n options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<GoogleAbstractedClientOps> {\n const url = await this.buildUrl();\n const method = this.buildMethod();\n const infoHeaders = (await this._clientInfoHeaders()) ?? {};\n const additionalHeaders = (await this.additionalHeaders()) ?? {};\n const headers = {\n ...infoHeaders,\n ...additionalHeaders,\n ...requestHeaders,\n };\n\n const opts: GoogleAbstractedClientOps = {\n url,\n method,\n headers,\n signal: options?.signal,\n };\n if (data && method === \"POST\") {\n opts.data = data;\n }\n if (this.streaming) {\n opts.responseType = \"stream\";\n } else {\n opts.responseType = \"json\";\n }\n return opts;\n }\n\n async _request(\n data: unknown | undefined,\n options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<ResponseType> {\n const opts = await this._buildOpts(data, options, requestHeaders);\n const callResponse = await this.caller.callWithOptions(\n { signal: options?.signal },\n async () => this.client.request(opts)\n );\n const response: unknown = callResponse; // Done for typecast safety, I guess\n return <ResponseType>response;\n }\n}\n\nexport abstract class GoogleHostConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n>\n extends GoogleConnection<CallOptions, ResponseType>\n implements GoogleConnectionParams<AuthOptions>\n{\n // This does not default to a value intentionally.\n // Use the \"platform\" getter if you need this.\n platformType: GooglePlatformType | undefined;\n\n _endpoint: string | undefined;\n\n _location: string | undefined;\n\n _apiVersion: string | undefined;\n\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n super(caller, client, streaming);\n this.caller = caller;\n\n this.platformType = this.fieldPlatformType(fields);\n this._endpoint = fields?.endpoint;\n this._location = fields?.location;\n this._apiVersion = fields?.apiVersion;\n this.client = client;\n }\n\n fieldPlatformType(\n fields: GoogleConnectionParams<any> | undefined\n ): GooglePlatformType | undefined {\n if (typeof fields === \"undefined\") {\n return undefined;\n }\n if (typeof fields.platformType !== \"undefined\") {\n return fields.platformType;\n }\n if (fields.vertexai === true) {\n return \"gcp\";\n }\n return undefined;\n }\n\n get platform(): GooglePlatformType {\n return this.platformType ?? this.computedPlatformType;\n }\n\n get computedPlatformType(): GooglePlatformType {\n return \"gcp\";\n }\n\n get computedApiVersion(): string {\n return \"v1\";\n }\n\n get apiVersion(): string {\n return this._apiVersion ?? this.computedApiVersion;\n }\n\n get location(): string {\n return this._location ?? this.computedLocation;\n }\n\n get computedLocation(): string {\n return \"us-central1\";\n }\n\n get endpoint(): string {\n return this._endpoint ?? this.computedEndpoint;\n }\n\n get computedEndpoint(): string {\n if (this.location === \"global\") {\n return \"aiplatform.googleapis.com\";\n } else {\n return `${this.location}-aiplatform.googleapis.com`;\n }\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"POST\";\n }\n}\n\nexport abstract class GoogleRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, GoogleRawResponse, AuthOptions> {\n async _buildOpts(\n data: unknown | undefined,\n _options: CallOptions,\n requestHeaders: Record<string, string> = {}\n ): Promise<GoogleAbstractedClientOps> {\n const opts = await super._buildOpts(data, _options, requestHeaders);\n opts.responseType = \"blob\";\n return opts;\n }\n}\n\nexport abstract class GoogleAIConnection<\n CallOptions extends AsyncCallerCallOptions,\n InputType,\n AuthOptions,\n ResponseType extends GoogleResponse,\n>\n extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions>\n implements GoogleAIBaseLLMInput<AuthOptions>\n{\n model: string;\n\n modelName: string;\n\n client: GoogleAbstractedClient;\n\n _apiName?: string;\n\n apiConfig?: GoogleAIAPIConfig;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming?: boolean\n ) {\n super(fields, caller, client, streaming);\n this.client = client;\n this.modelName = fields?.model ?? fields?.modelName ?? this.model;\n this.model = this.modelName;\n\n this._apiName = fields?.apiName;\n this.apiConfig = {\n safetyHandler: fields?.safetyHandler, // For backwards compatibility\n ...fields?.apiConfig,\n };\n }\n\n get modelFamily(): VertexModelFamily {\n return modelToFamily(this.model);\n }\n\n get modelPublisher(): string {\n return modelToPublisher(this.model);\n }\n\n get computedAPIName(): string {\n // At least at the moment, model publishers and APIs map the same\n return this.modelPublisher;\n }\n\n get apiName(): string {\n return this._apiName ?? this.computedAPIName;\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n case \"gemma\": // TODO: Is this true?\n return getGeminiAPI(this.apiConfig as GeminiAPIConfig);\n case \"anthropic\":\n return getAnthropicAPI(this.apiConfig as AnthropicAPIConfig);\n default:\n throw new Error(`Unknown API: ${this.apiName}`);\n }\n }\n\n get isApiKey(): boolean {\n return this.client.clientType === \"apiKey\";\n }\n\n fieldPlatformType(\n fields: GoogleConnectionParams<any> | undefined\n ): GooglePlatformType | undefined {\n const ret = super.fieldPlatformType(fields);\n if (typeof ret !== \"undefined\") {\n return ret;\n }\n if (fields?.vertexai === false) {\n return \"gai\";\n }\n return undefined;\n }\n\n get computedPlatformType(): GooglePlatformType {\n // This is not a completely correct assumption, since GCP can\n // have an API Key. But if so, then people need to set the platform\n // type explicitly.\n if (this.isApiKey) {\n return \"gai\";\n } else {\n return \"gcp\";\n }\n }\n\n get computedApiVersion(): string {\n switch (this.platform) {\n case \"gai\":\n return \"v1beta\";\n default:\n return \"v1\";\n }\n }\n\n get computedLocation(): string {\n switch (this.apiName) {\n case \"google\":\n return super.computedLocation;\n case \"anthropic\":\n return \"us-east5\";\n default:\n throw new Error(\n `Unknown apiName: ${this.apiName}. Can't get location.`\n );\n }\n }\n\n abstract buildUrlMethod(): Promise<string>;\n\n async buildUrlGenerativeLanguage(): Promise<string> {\n const method = await this.buildUrlMethod();\n const url = `https://generativelanguage.googleapis.com/${this.apiVersion}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertexExpress(): Promise<string> {\n const method = await this.buildUrlMethod();\n const publisher = this.modelPublisher;\n const url = `https://aiplatform.googleapis.com/${this.apiVersion}/publishers/${publisher}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertexLocation(): Promise<string> {\n const projectId = await this.client.getProjectId();\n const method = await this.buildUrlMethod();\n const publisher = this.modelPublisher;\n const url = `https://${this.endpoint}/${this.apiVersion}/projects/${projectId}/locations/${this.location}/publishers/${publisher}/models/${this.model}:${method}`;\n return url;\n }\n\n async buildUrlVertex(): Promise<string> {\n if (this.isApiKey) {\n return this.buildUrlVertexExpress();\n } else {\n return this.buildUrlVertexLocation();\n }\n }\n\n async buildUrl(): Promise<string> {\n switch (this.platform) {\n case \"gai\":\n return this.buildUrlGenerativeLanguage();\n default:\n return this.buildUrlVertex();\n }\n }\n\n abstract formatData(\n input: InputType,\n parameters: GoogleModelParams\n ): Promise<unknown>;\n\n async request(\n input: InputType,\n parameters: GoogleAIModelRequestParams,\n\n options: CallOptions,\n runManager?: BaseRunManager\n ): Promise<ResponseType> {\n const moduleName = this.constructor.name;\n const streamingParameters: GoogleAIModelRequestParams = {\n ...parameters,\n streaming: this.streaming,\n };\n const data = await this.formatData(input, streamingParameters);\n\n await runManager?.handleCustomEvent(`google-request-${moduleName}`, {\n data,\n parameters: streamingParameters,\n options,\n connection: {\n ...this,\n url: await this.buildUrl(),\n urlMethod: await this.buildUrlMethod(),\n modelFamily: this.modelFamily,\n modelPublisher: this.modelPublisher,\n computedPlatformType: this.computedPlatformType,\n },\n });\n\n const response = await this._request(data, options);\n\n await runManager?.handleCustomEvent(`google-response-${moduleName}`, {\n response,\n });\n\n return response;\n }\n}\n\nexport abstract class AbstractGoogleLLMConnection<\n MessageType,\n AuthOptions,\n> extends GoogleAIConnection<\n BaseLanguageModelCallOptions,\n MessageType,\n AuthOptions,\n GoogleLLMResponse\n> {\n async buildUrlMethodGemini(): Promise<string> {\n return this.streaming ? \"streamGenerateContent\" : \"generateContent\";\n }\n\n async buildUrlMethodClaude(): Promise<string> {\n return this.streaming ? \"streamRawPredict\" : \"rawPredict\";\n }\n\n async buildUrlMethod(): Promise<string> {\n switch (this.modelFamily) {\n case \"gemini\":\n case \"gemma\": // TODO: Is this true?\n return this.buildUrlMethodGemini();\n case \"claude\":\n return this.buildUrlMethodClaude();\n default:\n throw new Error(`Unknown model family: ${this.modelFamily}`);\n }\n }\n\n async formatData(\n input: MessageType,\n parameters: GoogleAIModelRequestParams\n ): Promise<unknown> {\n // Filter out labels for non-Vertex AI platforms (labels are only supported on Vertex AI)\n let filteredParameters = parameters;\n if (parameters.labels && this.platform !== \"gcp\") {\n const { labels, ...paramsWithoutLabels } = parameters;\n filteredParameters = paramsWithoutLabels;\n }\n\n return this.api.formatData(input, filteredParameters);\n }\n}\n\nexport interface GoogleCustomEventInfo {\n subEvent: string;\n module: string;\n}\n\nexport abstract class GoogleRequestCallbackHandler extends BaseCallbackHandler {\n customEventInfo(eventName: string): GoogleCustomEventInfo {\n const names = eventName.split(\"-\");\n return {\n subEvent: names[1],\n module: names[2],\n };\n }\n\n abstract handleCustomRequestEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n abstract handleCustomResponseEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n abstract handleCustomChunkEvent(\n eventName: string,\n eventInfo: GoogleCustomEventInfo,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any;\n\n handleCustomEvent(\n eventName: string,\n data: any,\n runId: string,\n tags?: string[],\n metadata?: Record<string, any>\n ): any {\n if (!eventName) {\n return undefined;\n }\n const eventInfo = this.customEventInfo(eventName);\n switch (eventInfo.subEvent) {\n case \"request\":\n return this.handleCustomRequestEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n case \"response\":\n return this.handleCustomResponseEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n case \"chunk\":\n return this.handleCustomChunkEvent(\n eventName,\n eventInfo,\n data,\n runId,\n tags,\n metadata\n );\n default:\n console.error(\n `Unexpected eventInfo for ${eventName} ${JSON.stringify(\n eventInfo,\n null,\n 1\n )}`\n );\n }\n }\n}\n\nexport class GoogleRequestLogger extends GoogleRequestCallbackHandler {\n name: string = \"GoogleRequestLogger\";\n\n log(eventName: string, data: any, tags?: string[]): undefined {\n const tagStr = tags ? `[${tags}]` : \"[]\";\n console.log(`${eventName} ${tagStr} ${JSON.stringify(data, null, 1)}`);\n }\n\n handleCustomRequestEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n\n handleCustomResponseEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n\n handleCustomChunkEvent(\n eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.log(eventName, data, tags);\n }\n}\n\nexport class GoogleRequestRecorder extends GoogleRequestCallbackHandler {\n name = \"GoogleRequestRecorder\";\n\n request: any = {};\n\n response: any = {};\n\n chunk: any[] = [];\n\n handleCustomRequestEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.request = data;\n }\n\n handleCustomResponseEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.response = data;\n }\n\n handleCustomChunkEvent(\n _eventName: string,\n _eventInfo: GoogleCustomEventInfo,\n data: any,\n _runId: string,\n _tags?: string[],\n _metadata?: Record<string, any>\n ): any {\n this.chunk.push(data);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"media.cjs","names":["GoogleHostConnection","GoogleRawConnection","BlobStore","AsyncCaller","MediaBlob","ApiKeyGoogleAuth"],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // eslint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"media.cjs","names":["GoogleHostConnection","GoogleRawConnection","BlobStore","AsyncCaller","MediaBlob","ApiKeyGoogleAuth"],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // oxlint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":";;;;;;;AA4BA,IAAsB,kCAAtB,cAIUA,mBAAAA,qBAA6D;CACrE,YACE,QACA,QACA,QACA;AACA,QAAM,QAAQ,QAAQ,OAAO;;CAG/B,MAAM,MACJ,WACA,MACA,UACiB;EACjB,MAAM,cAAc,KAAK;EACzB,MAAM,EAAE,SAAS,aAAa,MAAM,KAAK,QAAQ;AAcjD,SAba;GACX,KAAK;GACL;GACA;GACA,KAAK,UAAU,SAAS;GACxB;GACA,KAAK;GACL,iBAAiB;GACjB,8BAA8B;GAC9B;GACA;GACA,KAAK,UAAU;GAChB,CACW,KAAK,KAAK;;CAGxB,MAAM,QACJ,MACA,UACA,SACuB;EACvB,MAAM,YAAY,aAAa,KAAK,KAAK;EACzC,MAAM,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM,SAAS;EACxD,MAAM,iBAAiB;GACrB,gBAAgB,+BAA+B;GAC/C,0BAA0B;GAC3B;AAED,SADiB,KAAK,SAAS,MAAM,SAAS,eAAe;;;AAKjE,IAAsB,2BAAtB,cAIUA,mBAAAA,qBAA6D;CACrE,MAAM,QAAQ,SAA6C;AACzD,SAAO,KAAK,SAAS,KAAA,GAAW,QAAQ;;;AAI5C,IAAsB,8BAAtB,cAGUC,mBAAAA,oBAA8C;CACtD,cAA+C;AAC7C,SAAO;;CAGT,MAAM,QAAQ,SAAkD;AAC9D,SAAO,KAAK,SAAS,KAAA,GAAW,QAAQ;;;AAU5C,IAAsB,kBAAtB,cAGUC,sCAAAA,UAAU;CAClB;CAEA;CAEA,YAAY,QAA6C;AACvD,QAAM,OAAO;AACb,OAAK,SAAS,IAAIC,mCAAAA,YAAY,UAAU,EAAE,CAAC;AAC3C,OAAK,SAAS,KAAK,YAAY,OAAO;;CAqBxC,MAAM,KAAK,cAA0D;EACnE,MAAM,GAAG,QAAQ;EAEjB,MAAM,WADc,KAAK,iBAAiB,aAAa;AAKvD,SADiB,MADE,KAAK,mBAAmB,aAAa,CACtB,QAAQ,MAAM,UAFhC,EAAE,CAEgD;;CAIpE,MAAM,KAAK,eAAqD;EAC9D,MAAM,MAAM,cAAc,KAAK,aAAa,KAAK,KAAK,SAAS,CAAC;AAChE,QAAM,QAAQ,IAAI,IAAI;;CAWxB,MAAM,aAAa,KAA+C;AAIhE,UADiB,MAFE,KAAK,2BAA2B,IAAI,CAErB,QADlB,EAAE,CACgC,EAClC;;CAOlB,MAAM,SAAS,KAA4B;AAIzC,UADiB,MAFE,KAAK,uBAAuB,IAAI,CAEjB,QADlB,EAAE,CACgC,EAClC;;CAGlB,yBAAyB,UAA2C;AAClE,SAAO,SAAS;;CAGlB,MAAM,KAAK,KAA6C;EACtD,MAAM,WAAW,MAAM,KAAK,aAAa,IAAI;EAC7C,MAAM,OAAO,MAAM,KAAK,SAAS,IAAI;AACrC,MAAI,QAAQ,SAEV,QADY,MAAMC,sCAAAA,UAAU,SAAS,MAAM;GAAE;GAAU,MAAM;GAAK,CAAC;MAGnE;;CAIJ,MAAM,KAAK,MAAoD;EAC7D,MAAM,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,IAAI,CAAC;AAC7C,SAAO,MAAM,QAAQ,IAAI,IAAI;;CAW/B,MAAM,KAAK,KAA4B;AAGrC,QAFmB,KAAK,sBAAsB,IAAI,CAEjC,QADD,EAAE,CACe;;CAGnC,MAAM,QAAQ,MAA+B;EAC3C,MAAM,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,IAAI,CAAC;AAC7C,QAAM,QAAQ,IAAI,IAAI;;CAIxB,OAAO,UAAU,SAAqD;AAEpE,QAAM,IAAI,MAAM,+BAA+B;;;AAwBnD,IAAa,wBAAb,MAAa,sBAAsB;CACjC,OAAO,YAAY;CAEnB;CAEA;CAEA,YAAY,KAAa;EACvB,MAAM,gBAAgB,sBAAsB,mBAAmB,IAAI;AACnE,OAAK,SAAS,cAAc;AAC5B,OAAK,OAAO,cAAc;;CAG5B,IAAI,MAAM;AACR,SAAO,QAAQ,KAAK,OAAO,GAAG,KAAK;;CAGrC,IAAI,UAAU;AACZ,SACE,OAAO,KAAK,WAAW,eAAe,OAAO,KAAK,SAAS;;CAI/D,OAAO,mBAAmB,KAA4B;EACpD,MAAM,QAAQ,KAAK,UAAU,KAAK,IAAI;AACtC,MAAI,CAAC,MACH,OAAM,IAAI,MAAM,sBAAsB,MAAM;AAE9C,SAAO;GACL,QAAQ,MAAM;GACd,MAAM,MAAM;GACb;;CAGH,OAAO,WAAW,KAAsB;AACtC,SAAO,KAAK,UAAU,KAAK,IAAI;;;AAanC,IAAa,qCAAb,cAEU,gCAIR;CACA;CAEA,YACE,QACA,QACA,QACA;AACA,QAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAK,MAAM,IAAI,sBAAsB,OAAO,IAAI;;CAGlD,MAAM,WAA4B;AAChC,SAAO,iDAAiD,KAAK,WAAW,KAAK,KAAK,IAAI,OAAO;;;AAYjG,IAAa,uCAAb,cAGU,yBAIR;CACA;CAEA;CAEA;CAEA,YACE,QACA,QACA,QACA;AACA,QAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAK,MAAM,IAAI,sBAAsB,OAAO,IAAI;AAChD,OAAK,SAAS,OAAO;AACrB,OAAK,MAAM,OAAO;;CAGpB,cAA+C;AAC7C,SAAO,KAAK;;CAGd,MAAM,WAA4B;EAChC,MAAM,OAAO,mBAAmB,KAAK,IAAI,KAAK;EAC9C,MAAM,MAAM,0CAA0C,KAAK,WAAW,KAAK,KAAK,IAAI,OAAO,KAAK;AAChG,SAAO,KAAK,MAAM,GAAG,IAAI,OAAO,KAAK,QAAQ;;;AASjD,IAAa,kCAAb,cAEU,4BAAiE;CACzE;CAEA,YACE,QACA,QACA,QACA;AACA,QAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAK,MAAM,IAAI,sBAAsB,OAAO,IAAI;;CAGlD,MAAM,WAA4B;EAChC,MAAM,OAAO,mBAAmB,KAAK,IAAI,KAAK;AAE9C,SADY,0CAA0C,KAAK,WAAW,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK;;;AAWzG,IAAsB,kCAAtB,cAEU,gBAAyD;CACjE;CAEA,YAAY,QAA4D;AACtE,QAAM,OAAO;AACb,OAAK,SAAS;AACd,OAAK,sBAAsB;GACzB,GAAG,KAAK;GACR,YAAY,OAAO,UAAU;GAC9B;;CAGH,mBAAmB,CAAC,KAAK,QAOvB;AAKA,SAAO,IAAI,mCAJ2D;GACpE,GAAG,KAAK;GACR,KAAK;GACN,EAGC,KAAK,QACL,KAAK,OACN;;CAGH,iBAAiB,CAAC,KAAK,OAAqD;AAO1E,SALsC;GACpC,MAFU,IAAI,sBAAsB,IAAI,CAE9B;GACV,UAAU,KAAK;GACf,aAAa,KAAK;GACnB;;CAIH,2BACE,KAKA;AAMA,SAAO,IAAI,qCAL6D;GACtE,KAAK;GACL,QAAQ;GACR,KAAK,KAAA;GACN,EAIS,KAAK,QAAQ,KAAK,OAAO;;CAGrC,uBACE,KACkE;AAIlE,SAAO,IAAI,gCAHwD,EACjE,KAAK,KACN,EAGC,KAAK,QACL,KAAK,OACN;;CAGH,sBACE,KAKA;AAMA,SAAO,IAAI,qCAL6D;GACtE,KAAK;GACL,QAAQ;GACR,KAAK,KAAA;GACN,EAIS,KAAK,QAAQ,KAAK,OAAO;;;AAqCvC,IAAa,oBAAb,cAAuCA,sCAAAA,UAAU;CAC/C,aAAa,OAAqB;AAChC,MAAI,CAAC,MACH,wBAAO,IAAI,KAAK,EAAE;AAEpB,SAAO,IAAI,KAAK,MAAM;;CAGxB,qBAAqB,OAAqB;AACxC,SAAO,KAAK,aAAa,KAAK,WAAW,OAAO;;CAGlD,IAAI,aAAmB;AACrB,SAAO,KAAK,qBAAqB,aAAa;;CAGhD,IAAI,aAAmB;AACrB,SAAO,KAAK,qBAAqB,aAAa;;CAGhD,IAAI,iBAAuB;AACzB,SAAO,KAAK,qBAAqB,iBAAiB;;CAGpD,IAAI,YAAqB;EACvB,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;AAEpC,UADY,KAAK,UAAU,kBAAkB,QAC/B;;;AAiClB,IAAa,+BAAb,cAEU,gCAIR;CACA,IAAI,qBAA6B;AAC/B,SAAO;;CAGT,MAAM,WAA4B;AAChC,SAAO,oDAAoD,KAAK,WAAW;;;AAU/E,IAAa,iCAAb,cAGU,yBAIR;CACA;CAEA;CAEA,YACE,QACA,QACA,QACA;AACA,QAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAK,SAAS,OAAO;AACrB,OAAK,OAAO,OAAO;;CAGrB,IAAI,qBAA6B;AAC/B,SAAO;;CAGT,cAA+C;AAC7C,SAAO,KAAK;;CAGd,MAAM,WAA4B;AAChC,SAAO,6CAA6C,KAAK,WAAW,SAAS,KAAK;;;AAUtF,IAAsB,4BAAtB,cAEU,gBAAmD;CAC3D;CAEA,YAAoB;CAEpB,YAAY,QAAuD;EACjE,MAAM,SAAuD;GAC3D,qBAAqB;IACnB,YAAY;IACZ,iBAAiB;IAClB;GACD,GAAG;GACJ;AACD,QAAM,OAAO;AACb,OAAK,SAAS;AACd,OAAK,YAAY,QAAQ,aAAa,KAAK,aAAa;;CAG1D,YAAY,MAAsB;AAChC,SAAO,KAAK,MAAM,IAAI,CAAC,KAAK,IAAI;;CAOlC,kBAAkB,QAAwC;AACxD,SAAO,IAAIC,aAAAA,iBAAiB,OAAO;;CAGrC,YAAY,QAAiE;AAC3E,SAAO,QAAQ,WAAA,GAAA,0BAAA,wBAAiC,iBAAiB;;CAGnE,YACE,QACwB;EACxB,MAAM,SAAS,KAAK,YAAY,OAAO;AACvC,MAAI,OACF,QAAO,KAAK,kBAAkB,OAAO;MAGrC,QAAO,KAAK,sBAAsB,OAAO;;CAI7C,MAAM,eAAe,KAA0C;AAE7D,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,KAAK,UAAU,CAAC;AAGnE,SAAO,KAAK,aAAa,IAAI;;CAG/B,MAAM,KAAK,CAAC,KAAK,OAGqB;EACpC,MAAM,WAAY,MAAM,MAAM,KAAK,CACjC,KACA,KACD,CAAC;EAEF,IAAI,OAAO,SAAS,MAAM,QAAQ,EAAE,OAAO,UAAU;AACrD,SAAO,KAAK,UAAU,gBAAgB,KAAK,OAAO,KAAK,YAAY,EACjE,QAAO,MAAM,KAAK,eAAe,KAAK,IAAI;AAM5C,OAAK,OAAO,KAAK;AACjB,OAAK,WAAW;GACd,GAAG,KAAK;GACR,GAAG;GACJ;AACD,SAAO;;CAGT,mBAAmB,CAAC,MAAM,QAOxB;AACA,SAAO,IAAI,6BACT,KAAK,QACL,KAAK,QACL,KAAK,OACN;;CAGH,iBAAiB,CAAC,MAAM,QAGtB;AACA,SAAO,EAAE;;CAGX,2BACE,KAKA;AAMA,SAAO,IAAI,+BALuD;GAChE,GAAG,KAAK;GACR,QAAQ;GACR,MAAM,KAAK,YAAY,IAAI;GAC5B,EAIS,KAAK,QAAQ,KAAK,OAAO;;CAGrC,uBACE,MACkE;AAClE,QAAM,IAAI,MAAM,2CAA2C;;CAG7D,MAAM,KAAK,KAA6C;EACtD,MAAM,WAAW,MAAM,KAAK,aAAa,IAAI;AAC7C,MAAI,SASF,QAAO,IAAID,sCAAAA,UAAU;GACnB,MAAM;GACN,MAP0B;IAC1B,OAAO;IACP,MAJC,UAAU,YAAuB;IAKnC;GAKC;GACD,CAAC;MAEF;;CAIJ,sBACE,KAKA;AAMA,SAAO,IAAI,+BALuD;GAChE,GAAG,KAAK;GACR,QAAQ;GACR,MAAM,KAAK,YAAY,IAAI;GAC5B,EAIS,KAAK,QAAQ,KAAK,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","names":[],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // eslint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"media.js","names":[],"sources":["../../src/experimental/media.ts"],"sourcesContent":["import {\n AsyncCaller,\n AsyncCallerCallOptions,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n MediaBlob,\n BlobStore,\n BlobStoreOptions,\n MediaBlobData,\n} from \"./utils/media_core.js\";\nimport {\n GoogleConnectionParams,\n GoogleRawResponse,\n GoogleResponse,\n} from \"../types.js\";\nimport { GoogleHostConnection, GoogleRawConnection } from \"../connection.js\";\nimport {\n ApiKeyGoogleAuth,\n GoogleAbstractedClient,\n GoogleAbstractedClientOpsMethod,\n} from \"../auth.js\";\n\nexport interface GoogleUploadConnectionParams<\n AuthOptions,\n> extends GoogleConnectionParams<AuthOptions> {}\n\nexport abstract class GoogleMultipartUploadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n constructor(\n fields: GoogleConnectionParams<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n }\n\n async _body(\n separator: string,\n data: MediaBlob,\n metadata: Record<string, unknown>\n ): Promise<string> {\n const contentType = data.mimetype;\n const { encoded, encoding } = await data.encode();\n const body = [\n `--${separator}`,\n \"Content-Type: application/json; charset=UTF-8\",\n \"\",\n JSON.stringify(metadata),\n \"\",\n `--${separator}`,\n `Content-Type: ${contentType}`,\n `Content-Transfer-Encoding: ${encoding}`,\n \"\",\n encoded,\n `--${separator}--`,\n ];\n return body.join(\"\\n\");\n }\n\n async request(\n data: MediaBlob,\n metadata: Record<string, unknown>,\n options: CallOptions\n ): Promise<ResponseType> {\n const separator = `separator-${Date.now()}`;\n const body = await this._body(separator, data, metadata);\n const requestHeaders = {\n \"Content-Type\": `multipart/related; boundary=${separator}`,\n \"X-Goog-Upload-Protocol\": \"multipart\",\n };\n const response = this._request(body, options, requestHeaders);\n return response;\n }\n}\n\nexport abstract class GoogleDownloadConnection<\n CallOptions extends AsyncCallerCallOptions,\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleHostConnection<CallOptions, ResponseType, AuthOptions> {\n async request(options: CallOptions): Promise<ResponseType> {\n return this._request(undefined, options);\n }\n}\n\nexport abstract class GoogleDownloadRawConnection<\n CallOptions extends AsyncCallerCallOptions,\n AuthOptions,\n> extends GoogleRawConnection<CallOptions, AuthOptions> {\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return \"GET\";\n }\n\n async request(options: CallOptions): Promise<GoogleRawResponse> {\n return this._request(undefined, options);\n }\n}\n\nexport interface BlobStoreGoogleParams<AuthOptions>\n extends\n GoogleConnectionParams<AuthOptions>,\n AsyncCallerParams,\n BlobStoreOptions {}\n\nexport abstract class BlobStoreGoogle<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends BlobStore {\n caller: AsyncCaller;\n\n client: GoogleAbstractedClient;\n\n constructor(fields?: BlobStoreGoogleParams<AuthOptions>) {\n super(fields);\n this.caller = new AsyncCaller(fields ?? {});\n this.client = this.buildClient(fields);\n }\n\n abstract buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n abstract buildSetMetadata([key, blob]: [string, MediaBlob]): Record<\n string,\n unknown\n >;\n\n abstract buildSetConnection([key, blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _set(keyValuePair: [string, MediaBlob]): Promise<ResponseType> {\n const [, blob] = keyValuePair;\n const setMetadata = this.buildSetMetadata(keyValuePair);\n const metadata = setMetadata;\n const options = {};\n const connection = this.buildSetConnection(keyValuePair);\n const response = await connection.request(blob, metadata, options);\n return response;\n }\n\n async mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n const ret = keyValuePairs.map((keyValue) => this._set(keyValue));\n await Promise.all(ret);\n }\n\n abstract buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n >;\n\n async _getMetadata(key: string): Promise<Record<string, unknown>> {\n const connection = this.buildGetMetadataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n abstract buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions>;\n\n async _getData(key: string): Promise<Blob> {\n const connection = this.buildGetDataConnection(key);\n const options = {};\n const response = await connection.request(options);\n return response.data;\n }\n\n _getMimetypeFromMetadata(metadata: Record<string, unknown>): string {\n return metadata.contentType as string;\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n const data = await this._getData(key);\n if (data && metadata) {\n const ret = await MediaBlob.fromBlob(data, { metadata, path: key });\n return ret;\n } else {\n return undefined;\n }\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const ret = keys.map((key) => this._get(key));\n return await Promise.all(ret);\n }\n\n abstract buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n >;\n\n async _del(key: string): Promise<void> {\n const connection = this.buildDeleteConnection(key);\n const options = {};\n await connection.request(options);\n }\n\n async mdelete(keys: string[]): Promise<void> {\n const ret = keys.map((key) => this._del(key));\n await Promise.all(ret);\n }\n\n // oxlint-disable-next-line require-yield\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n // TODO: Implement. Most have an implementation that uses nextToken.\n throw new Error(\"yieldKeys is not implemented\");\n }\n}\n\n/**\n * Based on https://cloud.google.com/storage/docs/json_api/v1/objects#resource\n */\nexport interface GoogleCloudStorageObject extends Record<string, unknown> {\n id?: string;\n name?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n // This is incomplete.\n}\n\nexport interface GoogleCloudStorageResponse extends GoogleResponse {\n data: GoogleCloudStorageObject;\n}\n\nexport type BucketAndPath = {\n bucket: string;\n path: string;\n};\n\nexport class GoogleCloudStorageUri {\n static uriRegexp = /gs:\\/\\/([a-z0-9][a-z0-9._-]+[a-z0-9])\\/(.*)/;\n\n bucket: string;\n\n path: string;\n\n constructor(uri: string) {\n const bucketAndPath = GoogleCloudStorageUri.uriToBucketAndPath(uri);\n this.bucket = bucketAndPath.bucket;\n this.path = bucketAndPath.path;\n }\n\n get uri() {\n return `gs://${this.bucket}/${this.path}`;\n }\n\n get isValid() {\n return (\n typeof this.bucket !== \"undefined\" && typeof this.path !== \"undefined\"\n );\n }\n\n static uriToBucketAndPath(uri: string): BucketAndPath {\n const match = this.uriRegexp.exec(uri);\n if (!match) {\n throw new Error(`Invalid gs:// URI: ${uri}`);\n }\n return {\n bucket: match[1],\n path: match[2],\n };\n }\n\n static isValidUri(uri: string): boolean {\n return this.uriRegexp.test(uri);\n }\n}\n\nexport interface GoogleCloudStorageConnectionParams {\n uri: string;\n}\n\nexport interface GoogleCloudStorageUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n GoogleCloudStorageConnectionParams {}\n\nexport class GoogleCloudStorageUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageUploadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n return `https://storage.googleapis.com/upload/storage/${this.apiVersion}/b/${this.uri.bucket}/o?uploadType=multipart`;\n }\n}\n\nexport interface GoogleCloudStorageDownloadConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n alt: \"media\" | undefined;\n}\n\nexport class GoogleCloudStorageDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n uri: GoogleCloudStorageUri;\n\n method: GoogleAbstractedClientOpsMethod;\n\n alt: \"media\" | undefined;\n\n constructor(\n fields: GoogleCloudStorageDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n this.method = fields.method;\n this.alt = fields.alt;\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}`;\n return this.alt ? `${ret}?alt=${this.alt}` : ret;\n }\n}\n\nexport interface GoogleCloudStorageRawConnectionParams<AuthOptions>\n extends\n GoogleCloudStorageConnectionParams,\n GoogleConnectionParams<AuthOptions> {}\n\nexport class GoogleCloudStorageRawConnection<\n AuthOptions,\n> extends GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n uri: GoogleCloudStorageUri;\n\n constructor(\n fields: GoogleCloudStorageRawConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.uri = new GoogleCloudStorageUri(fields.uri);\n }\n\n async buildUrl(): Promise<string> {\n const path = encodeURIComponent(this.uri.path);\n const ret = `https://storage.googleapis.com/storage/${this.apiVersion}/b/${this.uri.bucket}/o/${path}?alt=media`;\n return ret;\n }\n}\n\nexport interface BlobStoreGoogleCloudStorageBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n uriPrefix: GoogleCloudStorageUri;\n}\n\nexport abstract class BlobStoreGoogleCloudStorageBase<\n AuthOptions,\n> extends BlobStoreGoogle<GoogleCloudStorageResponse, AuthOptions> {\n params: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>;\n\n constructor(fields: BlobStoreGoogleCloudStorageBaseParams<AuthOptions>) {\n super(fields);\n this.params = fields;\n this.defaultStoreOptions = {\n ...this.defaultStoreOptions,\n pathPrefix: fields.uriPrefix.uri,\n };\n }\n\n buildSetConnection([key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageUploadConnectionParams<AuthOptions> = {\n ...this.params,\n uri: key,\n };\n return new GoogleCloudStorageUploadConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([key, blob]: [string, MediaBlob]): Record<string, unknown> {\n const uri = new GoogleCloudStorageUri(key);\n const ret: GoogleCloudStorageObject = {\n name: uri.path,\n metadata: blob.metadata,\n contentType: blob.mimetype,\n };\n return ret;\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleCloudStorageResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"GET\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleCloudStorageResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n const params: GoogleCloudStorageRawConnectionParams<AuthOptions> = {\n uri: key,\n };\n return new GoogleCloudStorageRawConnection<AuthOptions>(\n params,\n this.caller,\n this.client\n );\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n GoogleResponse,\n AuthOptions\n > {\n const params: GoogleCloudStorageDownloadConnectionParams<AuthOptions> = {\n uri: key,\n method: \"DELETE\",\n alt: undefined,\n };\n return new GoogleCloudStorageDownloadConnection<\n GoogleResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n\nexport type AIStudioFileState =\n | \"PROCESSING\"\n | \"ACTIVE\"\n | \"FAILED\"\n | \"STATE_UNSPECIFIED\";\n\nexport type AIStudioFileVideoMetadata = {\n videoMetadata: {\n videoDuration: string; // Duration in seconds, possibly with fractional, ending in \"s\"\n };\n};\n\nexport type AIStudioFileMetadata = AIStudioFileVideoMetadata;\n\nexport interface AIStudioFileObject {\n name?: string;\n displayName?: string;\n mimeType?: string;\n sizeBytes?: string; // int64 format\n createTime?: string; // timestamp format\n updateTime?: string; // timestamp format\n expirationTime?: string; // timestamp format\n sha256Hash?: string; // base64 encoded\n uri?: string;\n state?: AIStudioFileState;\n error?: {\n code: number;\n message: string;\n details: Record<string, unknown>[];\n };\n metadata?: AIStudioFileMetadata;\n}\n\nexport class AIStudioMediaBlob extends MediaBlob {\n _valueAsDate(value: string): Date {\n if (!value) {\n return new Date(0);\n }\n return new Date(value);\n }\n\n _metadataFieldAsDate(field: string): Date {\n return this._valueAsDate(this.metadata?.[field]);\n }\n\n get createDate(): Date {\n return this._metadataFieldAsDate(\"createTime\");\n }\n\n get updateDate(): Date {\n return this._metadataFieldAsDate(\"updateTime\");\n }\n\n get expirationDate(): Date {\n return this._metadataFieldAsDate(\"expirationTime\");\n }\n\n get isExpired(): boolean {\n const now = new Date().toISOString();\n const exp = this.metadata?.expirationTime ?? now;\n return exp <= now;\n }\n}\n\nexport interface AIStudioFileGetResponse extends GoogleResponse {\n data: AIStudioFileObject;\n}\n\nexport interface AIStudioFileSaveResponse extends GoogleResponse {\n data: {\n file: AIStudioFileObject;\n };\n}\n\nexport interface AIStudioFileListResponse extends GoogleResponse {\n data: {\n files: AIStudioFileObject[];\n nextPageToken: string;\n };\n}\n\nexport type AIStudioFileResponse =\n | AIStudioFileGetResponse\n | AIStudioFileSaveResponse\n | AIStudioFileListResponse;\n\nexport interface AIStudioFileConnectionParams {}\n\nexport interface AIStudioFileUploadConnectionParams<AuthOptions>\n extends\n GoogleUploadConnectionParams<AuthOptions>,\n AIStudioFileConnectionParams {}\n\nexport class AIStudioFileUploadConnection<\n AuthOptions,\n> extends GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileSaveResponse,\n AuthOptions\n> {\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/upload/${this.apiVersion}/files`;\n }\n}\n\nexport interface AIStudioFileDownloadConnectionParams<AuthOptions>\n extends AIStudioFileConnectionParams, GoogleConnectionParams<AuthOptions> {\n method: GoogleAbstractedClientOpsMethod;\n name: string;\n}\n\nexport class AIStudioFileDownloadConnection<\n ResponseType extends GoogleResponse,\n AuthOptions,\n> extends GoogleDownloadConnection<\n AsyncCallerCallOptions,\n ResponseType,\n AuthOptions\n> {\n method: GoogleAbstractedClientOpsMethod;\n\n name: string;\n\n constructor(\n fields: AIStudioFileDownloadConnectionParams<AuthOptions>,\n caller: AsyncCaller,\n client: GoogleAbstractedClient\n ) {\n super(fields, caller, client);\n this.method = fields.method;\n this.name = fields.name;\n }\n\n get computedApiVersion(): string {\n return \"v1beta\";\n }\n\n buildMethod(): GoogleAbstractedClientOpsMethod {\n return this.method;\n }\n\n async buildUrl(): Promise<string> {\n return `https://generativelanguage.googleapis.com/${this.apiVersion}/files/${this.name}`;\n }\n}\n\nexport interface BlobStoreAIStudioFileBaseParams<\n AuthOptions,\n> extends BlobStoreGoogleParams<AuthOptions> {\n retryTime?: number;\n}\n\nexport abstract class BlobStoreAIStudioFileBase<\n AuthOptions,\n> extends BlobStoreGoogle<AIStudioFileResponse, AuthOptions> {\n params?: BlobStoreAIStudioFileBaseParams<AuthOptions>;\n\n retryTime: number = 1000;\n\n constructor(fields?: BlobStoreAIStudioFileBaseParams<AuthOptions>) {\n const params: BlobStoreAIStudioFileBaseParams<AuthOptions> = {\n defaultStoreOptions: {\n pathPrefix: \"https://generativelanguage.googleapis.com/v1beta/files/\",\n actionIfInvalid: \"removePath\",\n },\n ...fields,\n };\n super(params);\n this.params = params;\n this.retryTime = params?.retryTime ?? this.retryTime ?? 1000;\n }\n\n _pathToName(path: string): string {\n return path.split(\"/\").pop() ?? path;\n }\n\n abstract buildAbstractedClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: BlobStoreGoogleParams<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: BlobStoreGoogleParams<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n // TODO: Test that you can use OAuth to access\n return this.buildAbstractedClient(fields);\n }\n }\n\n async _regetMetadata(key: string): Promise<AIStudioFileObject> {\n // Sleep for some time period\n await new Promise((resolve) => setTimeout(resolve, this.retryTime));\n\n // Fetch the latest metadata\n return this._getMetadata(key);\n }\n\n async _set([key, blob]: [\n string,\n MediaBlob,\n ]): Promise<AIStudioFileSaveResponse> {\n const response = (await super._set([\n key,\n blob,\n ])) as AIStudioFileSaveResponse;\n\n let file = response.data?.file ?? { state: \"FAILED\" };\n while (file.state === \"PROCESSING\" && file.uri && this.retryTime > 0) {\n file = await this._regetMetadata(file.uri);\n }\n\n // The response should contain the name (and valid URI), so we need to\n // update the blob with this. We can't return a new blob, since mset()\n // doesn't return anything.\n blob.path = file.uri;\n blob.metadata = {\n ...blob.metadata,\n ...file,\n };\n return response;\n }\n\n buildSetConnection([_key, _blob]: [\n string,\n MediaBlob,\n ]): GoogleMultipartUploadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n return new AIStudioFileUploadConnection(\n this.params,\n this.caller,\n this.client\n );\n }\n\n buildSetMetadata([_key, _blob]: [string, MediaBlob]): Record<\n string,\n unknown\n > {\n return {};\n }\n\n buildGetMetadataConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"GET\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n\n buildGetDataConnection(\n _key: string\n ): GoogleDownloadRawConnection<AsyncCallerCallOptions, AuthOptions> {\n throw new Error(\"AI Studio File API does not provide data\");\n }\n\n async _get(key: string): Promise<MediaBlob | undefined> {\n const metadata = await this._getMetadata(key);\n if (metadata) {\n const contentType =\n (metadata?.mimeType as string) ?? \"application/octet-stream\";\n // TODO - Get the actual data (and other metadata) from an optional backing store\n const data: MediaBlobData = {\n value: \"\",\n type: contentType,\n };\n\n return new MediaBlob({\n path: key,\n data,\n metadata,\n });\n } else {\n return undefined;\n }\n }\n\n buildDeleteConnection(\n key: string\n ): GoogleDownloadConnection<\n AsyncCallerCallOptions,\n AIStudioFileResponse,\n AuthOptions\n > {\n const params: AIStudioFileDownloadConnectionParams<AuthOptions> = {\n ...this.params,\n method: \"DELETE\",\n name: this._pathToName(key),\n };\n return new AIStudioFileDownloadConnection<\n AIStudioFileResponse,\n AuthOptions\n >(params, this.caller, this.client);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"media_core.cjs","names":["Serializable","BaseStore"],"sources":["../../../src/experimental/utils/media_core.ts"],"sourcesContent":["import { v1, v4 } from \"uuid\"; // FIXME - it is importing the wrong uuid, so v6 and v7 aren't implemented\nimport { BaseStore } from \"@langchain/core/stores\";\nimport { Serializable } from \"@langchain/core/load/serializable\";\n\nexport type MediaBlobData = {\n value: string; // In Base64 encoding\n type: string; // The mime type and possibly encoding\n};\n\nexport interface MediaBlobParameters {\n data?: MediaBlobData;\n\n metadata?: Record<string, unknown>;\n\n path?: string;\n}\n\nfunction bytesToString(dataArray: Uint8Array): string {\n // Need to handle the array in smaller chunks to deal with stack size limits\n let ret = \"\";\n const chunkSize = 102400;\n for (let i = 0; i < dataArray.length; i += chunkSize) {\n const chunk = dataArray.subarray(i, i + chunkSize);\n ret += String.fromCharCode(...chunk);\n }\n\n return ret;\n}\n\n/**\n * Represents a chunk of data that can be identified by the path where the\n * data is (or will be) located, along with optional metadata about the data.\n */\nexport class MediaBlob extends Serializable implements MediaBlobParameters {\n lc_serializable = true;\n\n lc_namespace = [\n \"langchain\",\n \"google_common\",\n \"experimental\",\n \"utils\",\n \"media_core\",\n ];\n\n data: MediaBlobData = {\n value: \"\",\n type: \"text/plain\",\n };\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n metadata?: Record<string, any>;\n\n path?: string;\n\n constructor(params: MediaBlobParameters) {\n super(params);\n\n this.data = params.data ?? this.data;\n this.metadata = params.metadata;\n this.path = params.path;\n }\n\n get size(): number {\n return this.asBytes.length;\n }\n\n get dataType(): string {\n return this.data?.type ?? \"\";\n }\n\n get encoding(): string {\n const charsetEquals = this.dataType.indexOf(\"charset=\");\n return charsetEquals === -1\n ? \"utf-8\"\n : this.dataType.substring(charsetEquals + 8);\n }\n\n get mimetype(): string {\n const semicolon = this.dataType.indexOf(\";\");\n return semicolon === -1\n ? this.dataType\n : this.dataType.substring(0, semicolon);\n }\n\n get asBytes(): Uint8Array {\n if (!this.data) {\n return Uint8Array.from([]);\n }\n const binString = atob(this.data?.value);\n const ret = new Uint8Array(binString.length);\n for (let co = 0; co < binString.length; co += 1) {\n ret[co] = binString.charCodeAt(co);\n }\n return ret;\n }\n\n async asString(): Promise<string> {\n return bytesToString(this.asBytes);\n }\n\n async asBase64(): Promise<string> {\n return this.data?.value ?? \"\";\n }\n\n async asDataUrl(): Promise<string> {\n return `data:${this.mimetype};base64,${await this.asBase64()}`;\n }\n\n async asUri(): Promise<string> {\n return this.path ?? (await this.asDataUrl());\n }\n\n async encode(): Promise<{ encoded: string; encoding: string }> {\n const dataUrl = await this.asDataUrl();\n const comma = dataUrl.indexOf(\",\");\n const encoded = dataUrl.substring(comma + 1);\n const encoding: string = dataUrl.indexOf(\"base64\") > -1 ? \"base64\" : \"8bit\";\n return {\n encoded,\n encoding,\n };\n }\n\n static fromDataUrl(url: string): MediaBlob {\n if (!url.startsWith(\"data:\")) {\n throw new Error(\"Not a data: URL\");\n }\n const colon = url.indexOf(\":\");\n const semicolon = url.indexOf(\";\");\n const mimeType = url.substring(colon + 1, semicolon);\n\n const comma = url.indexOf(\",\");\n const base64Data = url.substring(comma + 1);\n\n const data: MediaBlobData = {\n type: mimeType,\n value: base64Data,\n };\n\n return new MediaBlob({\n data,\n path: url,\n });\n }\n\n static async fromBlob(\n blob: Blob,\n other?: Omit<MediaBlobParameters, \"data\">\n ): Promise<MediaBlob> {\n const valueBuffer = await blob.arrayBuffer();\n const valueArray = new Uint8Array(valueBuffer);\n const valueStr = bytesToString(valueArray);\n const value = btoa(valueStr);\n\n return new MediaBlob({\n ...other,\n data: {\n value,\n type: blob.type,\n },\n });\n }\n}\n\nexport type ActionIfInvalidAction =\n | \"ignore\"\n | \"prefixPath\"\n | \"prefixUuid1\"\n | \"prefixUuid4\"\n | \"prefixUuid6\"\n | \"prefixUuid7\"\n | \"removePath\";\n\nexport interface BlobStoreStoreOptions {\n /**\n * If the path is missing or invalid in the blob, how should we create\n * a new path?\n * Subclasses may define their own methods, but the following are supported\n * by default:\n * - Undefined or an emtpy string: Reject the blob\n * - \"ignore\": Attempt to store it anyway (but this may fail)\n * - \"prefixPath\": Use the default prefix for the BlobStore and get the\n * unique portion from the URL. The original path is stored in the metadata\n * - \"prefixUuid\": Use the default prefix for the BlobStore and get the\n * unique portion from a generated UUID. The original path is stored\n * in the metadata\n */\n actionIfInvalid?: ActionIfInvalidAction;\n\n /**\n * The expected prefix for URIs that are stored.\n * This may be used to test if a MediaBlob is valid and used to create a new\n * path if \"prefixPath\" or \"prefixUuid\" is set for actionIfInvalid.\n */\n pathPrefix?: string;\n}\n\nexport type ActionIfBlobMissingAction = \"emptyBlob\";\n\nexport interface BlobStoreFetchOptions {\n /**\n * If the blob is not found when fetching, what should we do?\n * Subclasses may define their own methods, but the following are supported\n * by default:\n * - Undefined or an empty string: return undefined\n * - \"emptyBlob\": return a new MediaBlob that has the path set, but nothing else.\n */\n actionIfBlobMissing?: ActionIfBlobMissingAction;\n}\n\nexport interface BlobStoreOptions {\n defaultStoreOptions?: BlobStoreStoreOptions;\n\n defaultFetchOptions?: BlobStoreFetchOptions;\n}\n\n/**\n * A specialized Store that is designed to handle MediaBlobs and use the\n * key that is included in the blob to determine exactly how it is stored.\n *\n * The full details of a MediaBlob may be changed when it is stored.\n * For example, it may get additional or different Metadata. This should be\n * what is returned when the store() method is called.\n *\n * Although BlobStore extends BaseStore, not all of the methods from\n * BaseStore may be implemented (or even possible). Those that are not\n * implemented should be documented and throw an Error if called.\n */\nexport abstract class BlobStore extends BaseStore<string, MediaBlob> {\n lc_namespace = [\"langchain\", \"google-common\"]; // FIXME - What should this be? And why?\n\n defaultStoreOptions: BlobStoreStoreOptions;\n\n defaultFetchOptions: BlobStoreFetchOptions;\n\n constructor(opts?: BlobStoreOptions) {\n super(opts);\n this.defaultStoreOptions = opts?.defaultStoreOptions ?? {};\n this.defaultFetchOptions = opts?.defaultFetchOptions ?? {};\n }\n\n protected async _realKey(key: string | MediaBlob): Promise<string> {\n return typeof key === \"string\" ? key : await key.asUri();\n }\n\n /**\n * Is the path supported by this BlobStore?\n *\n * Although this is async, this is expected to be a relatively fast operation\n * (ie - you shouldn't make network calls).\n *\n * @param path The path to check\n * @param opts Any options (if needed) that may be used to determine if it is valid\n * @return If the path is supported\n */\n hasValidPath(\n path: string | undefined,\n opts?: BlobStoreStoreOptions\n ): Promise<boolean> {\n const prefix = opts?.pathPrefix ?? \"\";\n const isPrefixed = typeof path !== \"undefined\" && path.startsWith(prefix);\n return Promise.resolve(isPrefixed);\n }\n\n protected _blobPathSuffix(blob: MediaBlob): string {\n // Get the path currently set and make sure we treat it as a string\n const blobPath = `${blob.path}`;\n\n // Advance past the first set of /\n let pathStart = blobPath.indexOf(\"/\") + 1;\n while (blobPath.charAt(pathStart) === \"/\") {\n pathStart += 1;\n }\n\n // We will use the rest as the path for a replacement\n return blobPath.substring(pathStart);\n }\n\n protected async _newBlob(\n oldBlob: MediaBlob,\n newPath?: string\n ): Promise<MediaBlob> {\n const oldPath = oldBlob.path;\n const metadata = oldBlob?.metadata ?? {};\n metadata.langchainOldPath = oldPath;\n const newBlob = new MediaBlob({\n ...oldBlob,\n metadata,\n });\n if (newPath) {\n newBlob.path = newPath;\n } else if (newBlob.path) {\n delete newBlob.path;\n }\n return newBlob;\n }\n\n protected async _validBlobPrefixPath(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n const prefix = opts?.pathPrefix ?? \"\";\n const suffix = this._blobPathSuffix(blob);\n const newPath = `${prefix}${suffix}`;\n return this._newBlob(blob, newPath);\n }\n\n protected _validBlobPrefixUuidFunction(\n name: ActionIfInvalidAction | string\n ): string {\n switch (name) {\n case \"prefixUuid1\":\n return v1();\n case \"prefixUuid4\":\n return v4();\n // case \"prefixUuid6\": return v6();\n // case \"prefixUuid7\": return v7();\n default:\n throw new Error(`Unknown uuid function: ${name}`);\n }\n }\n\n protected async _validBlobPrefixUuid(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n const prefix = opts?.pathPrefix ?? \"\";\n const suffix = this._validBlobPrefixUuidFunction(\n opts?.actionIfInvalid ?? \"prefixUuid4\"\n );\n const newPath = `${prefix}${suffix}`;\n return this._newBlob(blob, newPath);\n }\n\n protected async _validBlobRemovePath(\n blob: MediaBlob,\n _opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n return this._newBlob(blob, undefined);\n }\n\n /**\n * Based on the blob and options, return a blob that has a valid path\n * that can be saved.\n * @param blob\n * @param opts\n */\n protected async _validStoreBlob(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob | undefined> {\n if (await this.hasValidPath(blob.path, opts)) {\n return blob;\n }\n switch (opts?.actionIfInvalid) {\n case \"ignore\":\n return blob;\n case \"prefixPath\":\n return this._validBlobPrefixPath(blob, opts);\n case \"prefixUuid1\":\n case \"prefixUuid4\":\n case \"prefixUuid6\":\n case \"prefixUuid7\":\n return this._validBlobPrefixUuid(blob, opts);\n case \"removePath\":\n return this._validBlobRemovePath(blob, opts);\n default:\n return undefined;\n }\n }\n\n async store(\n blob: MediaBlob,\n opts: BlobStoreStoreOptions = {}\n ): Promise<MediaBlob | undefined> {\n const allOpts: BlobStoreStoreOptions = {\n ...this.defaultStoreOptions,\n ...opts,\n };\n const validBlob = await this._validStoreBlob(blob, allOpts);\n if (typeof validBlob !== \"undefined\") {\n const validKey = await validBlob.asUri();\n await this.mset([[validKey, validBlob]]);\n const savedKey = await validBlob.asUri();\n return await this.fetch(savedKey);\n }\n return undefined;\n }\n\n protected async _missingFetchBlobEmpty(\n path: string,\n _opts?: BlobStoreFetchOptions\n ): Promise<MediaBlob> {\n return new MediaBlob({ path });\n }\n\n protected async _missingFetchBlob(\n path: string,\n opts?: BlobStoreFetchOptions\n ): Promise<MediaBlob | undefined> {\n switch (opts?.actionIfBlobMissing) {\n case \"emptyBlob\":\n return this._missingFetchBlobEmpty(path, opts);\n default:\n return undefined;\n }\n }\n\n async fetch(\n key: string | MediaBlob,\n opts: BlobStoreFetchOptions = {}\n ): Promise<MediaBlob | undefined> {\n const allOpts: BlobStoreFetchOptions = {\n ...this.defaultFetchOptions,\n ...opts,\n };\n const realKey = await this._realKey(key);\n const ret = await this.mget([realKey]);\n return ret?.[0] ?? (await this._missingFetchBlob(realKey, allOpts));\n }\n}\n\nexport interface BackedBlobStoreOptions extends BlobStoreOptions {\n backingStore: BaseStore<string, MediaBlob>;\n}\n\nexport class BackedBlobStore extends BlobStore {\n backingStore: BaseStore<string, MediaBlob>;\n\n constructor(opts: BackedBlobStoreOptions) {\n super(opts);\n this.backingStore = opts.backingStore;\n }\n\n mdelete(keys: string[]): Promise<void> {\n return this.backingStore.mdelete(keys);\n }\n\n mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n return this.backingStore.mget(keys);\n }\n\n mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n return this.backingStore.mset(keyValuePairs);\n }\n\n yieldKeys(prefix: string | undefined): AsyncGenerator<string> {\n return this.backingStore.yieldKeys(prefix);\n }\n}\n\nexport interface ReadThroughBlobStoreOptions extends BlobStoreOptions {\n baseStore: BlobStore;\n backingStore: BlobStore;\n}\n\nexport class ReadThroughBlobStore extends BlobStore {\n baseStore: BlobStore;\n\n backingStore: BlobStore;\n\n constructor(opts: ReadThroughBlobStoreOptions) {\n super(opts);\n this.baseStore = opts.baseStore;\n this.backingStore = opts.backingStore;\n }\n\n async store(\n blob: MediaBlob,\n opts: BlobStoreStoreOptions = {}\n ): Promise<MediaBlob | undefined> {\n const originalUri = await blob.asUri();\n const newBlob = await this.backingStore.store(blob, opts);\n if (newBlob) {\n await this.baseStore.mset([[originalUri, newBlob]]);\n }\n return newBlob;\n }\n\n mdelete(keys: string[]): Promise<void> {\n return this.baseStore.mdelete(keys);\n }\n\n mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n return this.baseStore.mget(keys);\n }\n\n mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n throw new Error(\"Do not call ReadThroughBlobStore.mset directly\");\n }\n\n yieldKeys(prefix: string | undefined): AsyncGenerator<string> {\n return this.baseStore.yieldKeys(prefix);\n }\n}\n\nexport class SimpleWebBlobStore extends BlobStore {\n _notImplementedException() {\n throw new Error(\"Not implemented for SimpleWebBlobStore\");\n }\n\n async hasValidPath(\n path: string | undefined,\n _opts?: BlobStoreStoreOptions\n ): Promise<boolean> {\n return (\n (await super.hasValidPath(path, { pathPrefix: \"https://\" })) ||\n (await super.hasValidPath(path, { pathPrefix: \"http://\" }))\n );\n }\n\n async _fetch(url: string): Promise<MediaBlob | undefined> {\n const ret = new MediaBlob({\n path: url,\n });\n const metadata: Record<string, unknown> = {};\n const fetchOptions = {\n method: \"GET\",\n };\n const res = await fetch(url, fetchOptions);\n metadata.status = res.status;\n\n const headers: Record<string, string> = {};\n for (const [key, value] of res.headers.entries()) {\n headers[key] = value;\n }\n metadata.headers = headers;\n\n metadata.ok = res.ok;\n if (res.ok) {\n const resMediaBlob = await MediaBlob.fromBlob(await res.blob());\n ret.data = resMediaBlob.data;\n }\n\n ret.metadata = metadata;\n return ret;\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const blobMap = keys.map(this._fetch);\n return await Promise.all(blobMap);\n }\n\n async mdelete(_keys: string[]): Promise<void> {\n this._notImplementedException();\n }\n\n async mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n this._notImplementedException();\n }\n\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n this._notImplementedException();\n yield \"\";\n }\n}\n\n/**\n * A blob \"store\" that works with data: URLs that will turn the URL into\n * a blob.\n */\nexport class DataBlobStore extends BlobStore {\n _notImplementedException() {\n throw new Error(\"Not implemented for DataBlobStore\");\n }\n\n hasValidPath(path: string, _opts?: BlobStoreStoreOptions): Promise<boolean> {\n return super.hasValidPath(path, { pathPrefix: \"data:\" });\n }\n\n _fetch(url: string): MediaBlob {\n return MediaBlob.fromDataUrl(url);\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const blobMap = keys.map(this._fetch);\n return blobMap;\n }\n\n async mdelete(_keys: string[]): Promise<void> {\n this._notImplementedException();\n }\n\n async mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n this._notImplementedException();\n }\n\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n this._notImplementedException();\n yield \"\";\n }\n}\n\nexport interface MediaManagerConfiguration {\n /**\n * A store that, given a common URI, returns the corresponding MediaBlob.\n * The returned MediaBlob may have a different URI.\n * In many cases, this will be a ReadThroughStore or something similar\n * that has a cached version of the MediaBlob, but also a way to get\n * a new (or refreshed) version.\n */\n store: BlobStore;\n\n /**\n * BlobStores that can resolve a URL into the MediaBlob to save\n * in the canonical store. This list is evaluated in order.\n * If not provided, a default list (which involves a DataBlobStore\n * and a SimpleWebBlobStore) will be used.\n */\n resolvers?: BlobStore[];\n}\n\n/**\n * Responsible for converting a URI (typically a web URL) into a MediaBlob.\n * Allows for aliasing / caching of the requested URI and what it resolves to.\n * This MediaBlob is expected to be usable to provide to an LLM, either\n * through the Base64 of the media or through a canonical URI that the LLM\n * supports.\n */\nexport class MediaManager {\n store: BlobStore;\n\n resolvers: BlobStore[] | undefined;\n\n constructor(config: MediaManagerConfiguration) {\n this.store = config.store;\n this.resolvers = config.resolvers;\n }\n\n defaultResolvers(): BlobStore[] {\n return [new DataBlobStore({}), new SimpleWebBlobStore({})];\n }\n\n async _isInvalid(blob: MediaBlob | undefined): Promise<boolean> {\n return typeof blob === \"undefined\";\n }\n\n /**\n * Given the public URI, load what is at this URI and save it\n * in the store.\n * @param uri The URI to resolve using the resolver\n * @return A canonical MediaBlob for this URI\n */\n async _resolveAndSave(uri: string): Promise<MediaBlob | undefined> {\n let resolvedBlob: MediaBlob | undefined;\n\n const resolvers = this.resolvers || this.defaultResolvers();\n for (let co = 0; co < resolvers.length; co += 1) {\n const resolver = resolvers[co];\n if (await resolver.hasValidPath(uri)) {\n resolvedBlob = await resolver.fetch(uri);\n }\n }\n\n if (resolvedBlob) {\n return await this.store.store(resolvedBlob);\n } else {\n return new MediaBlob({});\n }\n }\n\n async getMediaBlob(uri: string): Promise<MediaBlob | undefined> {\n const aliasBlob = await this.store.fetch(uri);\n const ret = (await this._isInvalid(aliasBlob))\n ? await this._resolveAndSave(uri)\n : (aliasBlob as MediaBlob);\n return ret;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"media_core.cjs","names":["Serializable","BaseStore"],"sources":["../../../src/experimental/utils/media_core.ts"],"sourcesContent":["import { v1, v4 } from \"uuid\"; // FIXME - it is importing the wrong uuid, so v6 and v7 aren't implemented\nimport { BaseStore } from \"@langchain/core/stores\";\nimport { Serializable } from \"@langchain/core/load/serializable\";\n\nexport type MediaBlobData = {\n value: string; // In Base64 encoding\n type: string; // The mime type and possibly encoding\n};\n\nexport interface MediaBlobParameters {\n data?: MediaBlobData;\n\n metadata?: Record<string, unknown>;\n\n path?: string;\n}\n\nfunction bytesToString(dataArray: Uint8Array): string {\n // Need to handle the array in smaller chunks to deal with stack size limits\n let ret = \"\";\n const chunkSize = 102400;\n for (let i = 0; i < dataArray.length; i += chunkSize) {\n const chunk = dataArray.subarray(i, i + chunkSize);\n ret += String.fromCharCode(...chunk);\n }\n\n return ret;\n}\n\n/**\n * Represents a chunk of data that can be identified by the path where the\n * data is (or will be) located, along with optional metadata about the data.\n */\nexport class MediaBlob extends Serializable implements MediaBlobParameters {\n lc_serializable = true;\n\n lc_namespace = [\n \"langchain\",\n \"google_common\",\n \"experimental\",\n \"utils\",\n \"media_core\",\n ];\n\n data: MediaBlobData = {\n value: \"\",\n type: \"text/plain\",\n };\n\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n metadata?: Record<string, any>;\n\n path?: string;\n\n constructor(params: MediaBlobParameters) {\n super(params);\n\n this.data = params.data ?? this.data;\n this.metadata = params.metadata;\n this.path = params.path;\n }\n\n get size(): number {\n return this.asBytes.length;\n }\n\n get dataType(): string {\n return this.data?.type ?? \"\";\n }\n\n get encoding(): string {\n const charsetEquals = this.dataType.indexOf(\"charset=\");\n return charsetEquals === -1\n ? \"utf-8\"\n : this.dataType.substring(charsetEquals + 8);\n }\n\n get mimetype(): string {\n const semicolon = this.dataType.indexOf(\";\");\n return semicolon === -1\n ? this.dataType\n : this.dataType.substring(0, semicolon);\n }\n\n get asBytes(): Uint8Array {\n if (!this.data) {\n return Uint8Array.from([]);\n }\n const binString = atob(this.data?.value);\n const ret = new Uint8Array(binString.length);\n for (let co = 0; co < binString.length; co += 1) {\n ret[co] = binString.charCodeAt(co);\n }\n return ret;\n }\n\n async asString(): Promise<string> {\n return bytesToString(this.asBytes);\n }\n\n async asBase64(): Promise<string> {\n return this.data?.value ?? \"\";\n }\n\n async asDataUrl(): Promise<string> {\n return `data:${this.mimetype};base64,${await this.asBase64()}`;\n }\n\n async asUri(): Promise<string> {\n return this.path ?? (await this.asDataUrl());\n }\n\n async encode(): Promise<{ encoded: string; encoding: string }> {\n const dataUrl = await this.asDataUrl();\n const comma = dataUrl.indexOf(\",\");\n const encoded = dataUrl.substring(comma + 1);\n const encoding: string = dataUrl.indexOf(\"base64\") > -1 ? \"base64\" : \"8bit\";\n return {\n encoded,\n encoding,\n };\n }\n\n static fromDataUrl(url: string): MediaBlob {\n if (!url.startsWith(\"data:\")) {\n throw new Error(\"Not a data: URL\");\n }\n const colon = url.indexOf(\":\");\n const semicolon = url.indexOf(\";\");\n const mimeType = url.substring(colon + 1, semicolon);\n\n const comma = url.indexOf(\",\");\n const base64Data = url.substring(comma + 1);\n\n const data: MediaBlobData = {\n type: mimeType,\n value: base64Data,\n };\n\n return new MediaBlob({\n data,\n path: url,\n });\n }\n\n static async fromBlob(\n blob: Blob,\n other?: Omit<MediaBlobParameters, \"data\">\n ): Promise<MediaBlob> {\n const valueBuffer = await blob.arrayBuffer();\n const valueArray = new Uint8Array(valueBuffer);\n const valueStr = bytesToString(valueArray);\n const value = btoa(valueStr);\n\n return new MediaBlob({\n ...other,\n data: {\n value,\n type: blob.type,\n },\n });\n }\n}\n\nexport type ActionIfInvalidAction =\n | \"ignore\"\n | \"prefixPath\"\n | \"prefixUuid1\"\n | \"prefixUuid4\"\n | \"prefixUuid6\"\n | \"prefixUuid7\"\n | \"removePath\";\n\nexport interface BlobStoreStoreOptions {\n /**\n * If the path is missing or invalid in the blob, how should we create\n * a new path?\n * Subclasses may define their own methods, but the following are supported\n * by default:\n * - Undefined or an emtpy string: Reject the blob\n * - \"ignore\": Attempt to store it anyway (but this may fail)\n * - \"prefixPath\": Use the default prefix for the BlobStore and get the\n * unique portion from the URL. The original path is stored in the metadata\n * - \"prefixUuid\": Use the default prefix for the BlobStore and get the\n * unique portion from a generated UUID. The original path is stored\n * in the metadata\n */\n actionIfInvalid?: ActionIfInvalidAction;\n\n /**\n * The expected prefix for URIs that are stored.\n * This may be used to test if a MediaBlob is valid and used to create a new\n * path if \"prefixPath\" or \"prefixUuid\" is set for actionIfInvalid.\n */\n pathPrefix?: string;\n}\n\nexport type ActionIfBlobMissingAction = \"emptyBlob\";\n\nexport interface BlobStoreFetchOptions {\n /**\n * If the blob is not found when fetching, what should we do?\n * Subclasses may define their own methods, but the following are supported\n * by default:\n * - Undefined or an empty string: return undefined\n * - \"emptyBlob\": return a new MediaBlob that has the path set, but nothing else.\n */\n actionIfBlobMissing?: ActionIfBlobMissingAction;\n}\n\nexport interface BlobStoreOptions {\n defaultStoreOptions?: BlobStoreStoreOptions;\n\n defaultFetchOptions?: BlobStoreFetchOptions;\n}\n\n/**\n * A specialized Store that is designed to handle MediaBlobs and use the\n * key that is included in the blob to determine exactly how it is stored.\n *\n * The full details of a MediaBlob may be changed when it is stored.\n * For example, it may get additional or different Metadata. This should be\n * what is returned when the store() method is called.\n *\n * Although BlobStore extends BaseStore, not all of the methods from\n * BaseStore may be implemented (or even possible). Those that are not\n * implemented should be documented and throw an Error if called.\n */\nexport abstract class BlobStore extends BaseStore<string, MediaBlob> {\n lc_namespace = [\"langchain\", \"google-common\"]; // FIXME - What should this be? And why?\n\n defaultStoreOptions: BlobStoreStoreOptions;\n\n defaultFetchOptions: BlobStoreFetchOptions;\n\n constructor(opts?: BlobStoreOptions) {\n super(opts);\n this.defaultStoreOptions = opts?.defaultStoreOptions ?? {};\n this.defaultFetchOptions = opts?.defaultFetchOptions ?? {};\n }\n\n protected async _realKey(key: string | MediaBlob): Promise<string> {\n return typeof key === \"string\" ? key : await key.asUri();\n }\n\n /**\n * Is the path supported by this BlobStore?\n *\n * Although this is async, this is expected to be a relatively fast operation\n * (ie - you shouldn't make network calls).\n *\n * @param path The path to check\n * @param opts Any options (if needed) that may be used to determine if it is valid\n * @return If the path is supported\n */\n hasValidPath(\n path: string | undefined,\n opts?: BlobStoreStoreOptions\n ): Promise<boolean> {\n const prefix = opts?.pathPrefix ?? \"\";\n const isPrefixed = typeof path !== \"undefined\" && path.startsWith(prefix);\n return Promise.resolve(isPrefixed);\n }\n\n protected _blobPathSuffix(blob: MediaBlob): string {\n // Get the path currently set and make sure we treat it as a string\n const blobPath = `${blob.path}`;\n\n // Advance past the first set of /\n let pathStart = blobPath.indexOf(\"/\") + 1;\n while (blobPath.charAt(pathStart) === \"/\") {\n pathStart += 1;\n }\n\n // We will use the rest as the path for a replacement\n return blobPath.substring(pathStart);\n }\n\n protected async _newBlob(\n oldBlob: MediaBlob,\n newPath?: string\n ): Promise<MediaBlob> {\n const oldPath = oldBlob.path;\n const metadata = oldBlob?.metadata ?? {};\n metadata.langchainOldPath = oldPath;\n const newBlob = new MediaBlob({\n ...oldBlob,\n metadata,\n });\n if (newPath) {\n newBlob.path = newPath;\n } else if (newBlob.path) {\n delete newBlob.path;\n }\n return newBlob;\n }\n\n protected async _validBlobPrefixPath(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n const prefix = opts?.pathPrefix ?? \"\";\n const suffix = this._blobPathSuffix(blob);\n const newPath = `${prefix}${suffix}`;\n return this._newBlob(blob, newPath);\n }\n\n protected _validBlobPrefixUuidFunction(\n name: ActionIfInvalidAction | string\n ): string {\n switch (name) {\n case \"prefixUuid1\":\n return v1();\n case \"prefixUuid4\":\n return v4();\n // case \"prefixUuid6\": return v6();\n // case \"prefixUuid7\": return v7();\n default:\n throw new Error(`Unknown uuid function: ${name}`);\n }\n }\n\n protected async _validBlobPrefixUuid(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n const prefix = opts?.pathPrefix ?? \"\";\n const suffix = this._validBlobPrefixUuidFunction(\n opts?.actionIfInvalid ?? \"prefixUuid4\"\n );\n const newPath = `${prefix}${suffix}`;\n return this._newBlob(blob, newPath);\n }\n\n protected async _validBlobRemovePath(\n blob: MediaBlob,\n _opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob> {\n return this._newBlob(blob, undefined);\n }\n\n /**\n * Based on the blob and options, return a blob that has a valid path\n * that can be saved.\n * @param blob\n * @param opts\n */\n protected async _validStoreBlob(\n blob: MediaBlob,\n opts?: BlobStoreStoreOptions\n ): Promise<MediaBlob | undefined> {\n if (await this.hasValidPath(blob.path, opts)) {\n return blob;\n }\n switch (opts?.actionIfInvalid) {\n case \"ignore\":\n return blob;\n case \"prefixPath\":\n return this._validBlobPrefixPath(blob, opts);\n case \"prefixUuid1\":\n case \"prefixUuid4\":\n case \"prefixUuid6\":\n case \"prefixUuid7\":\n return this._validBlobPrefixUuid(blob, opts);\n case \"removePath\":\n return this._validBlobRemovePath(blob, opts);\n default:\n return undefined;\n }\n }\n\n async store(\n blob: MediaBlob,\n opts: BlobStoreStoreOptions = {}\n ): Promise<MediaBlob | undefined> {\n const allOpts: BlobStoreStoreOptions = {\n ...this.defaultStoreOptions,\n ...opts,\n };\n const validBlob = await this._validStoreBlob(blob, allOpts);\n if (typeof validBlob !== \"undefined\") {\n const validKey = await validBlob.asUri();\n await this.mset([[validKey, validBlob]]);\n const savedKey = await validBlob.asUri();\n return await this.fetch(savedKey);\n }\n return undefined;\n }\n\n protected async _missingFetchBlobEmpty(\n path: string,\n _opts?: BlobStoreFetchOptions\n ): Promise<MediaBlob> {\n return new MediaBlob({ path });\n }\n\n protected async _missingFetchBlob(\n path: string,\n opts?: BlobStoreFetchOptions\n ): Promise<MediaBlob | undefined> {\n switch (opts?.actionIfBlobMissing) {\n case \"emptyBlob\":\n return this._missingFetchBlobEmpty(path, opts);\n default:\n return undefined;\n }\n }\n\n async fetch(\n key: string | MediaBlob,\n opts: BlobStoreFetchOptions = {}\n ): Promise<MediaBlob | undefined> {\n const allOpts: BlobStoreFetchOptions = {\n ...this.defaultFetchOptions,\n ...opts,\n };\n const realKey = await this._realKey(key);\n const ret = await this.mget([realKey]);\n return ret?.[0] ?? (await this._missingFetchBlob(realKey, allOpts));\n }\n}\n\nexport interface BackedBlobStoreOptions extends BlobStoreOptions {\n backingStore: BaseStore<string, MediaBlob>;\n}\n\nexport class BackedBlobStore extends BlobStore {\n backingStore: BaseStore<string, MediaBlob>;\n\n constructor(opts: BackedBlobStoreOptions) {\n super(opts);\n this.backingStore = opts.backingStore;\n }\n\n mdelete(keys: string[]): Promise<void> {\n return this.backingStore.mdelete(keys);\n }\n\n mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n return this.backingStore.mget(keys);\n }\n\n mset(keyValuePairs: [string, MediaBlob][]): Promise<void> {\n return this.backingStore.mset(keyValuePairs);\n }\n\n yieldKeys(prefix: string | undefined): AsyncGenerator<string> {\n return this.backingStore.yieldKeys(prefix);\n }\n}\n\nexport interface ReadThroughBlobStoreOptions extends BlobStoreOptions {\n baseStore: BlobStore;\n backingStore: BlobStore;\n}\n\nexport class ReadThroughBlobStore extends BlobStore {\n baseStore: BlobStore;\n\n backingStore: BlobStore;\n\n constructor(opts: ReadThroughBlobStoreOptions) {\n super(opts);\n this.baseStore = opts.baseStore;\n this.backingStore = opts.backingStore;\n }\n\n async store(\n blob: MediaBlob,\n opts: BlobStoreStoreOptions = {}\n ): Promise<MediaBlob | undefined> {\n const originalUri = await blob.asUri();\n const newBlob = await this.backingStore.store(blob, opts);\n if (newBlob) {\n await this.baseStore.mset([[originalUri, newBlob]]);\n }\n return newBlob;\n }\n\n mdelete(keys: string[]): Promise<void> {\n return this.baseStore.mdelete(keys);\n }\n\n mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n return this.baseStore.mget(keys);\n }\n\n mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n throw new Error(\"Do not call ReadThroughBlobStore.mset directly\");\n }\n\n yieldKeys(prefix: string | undefined): AsyncGenerator<string> {\n return this.baseStore.yieldKeys(prefix);\n }\n}\n\nexport class SimpleWebBlobStore extends BlobStore {\n _notImplementedException() {\n throw new Error(\"Not implemented for SimpleWebBlobStore\");\n }\n\n async hasValidPath(\n path: string | undefined,\n _opts?: BlobStoreStoreOptions\n ): Promise<boolean> {\n return (\n (await super.hasValidPath(path, { pathPrefix: \"https://\" })) ||\n (await super.hasValidPath(path, { pathPrefix: \"http://\" }))\n );\n }\n\n async _fetch(url: string): Promise<MediaBlob | undefined> {\n const ret = new MediaBlob({\n path: url,\n });\n const metadata: Record<string, unknown> = {};\n const fetchOptions = {\n method: \"GET\",\n };\n const res = await fetch(url, fetchOptions);\n metadata.status = res.status;\n\n const headers: Record<string, string> = {};\n for (const [key, value] of res.headers.entries()) {\n headers[key] = value;\n }\n metadata.headers = headers;\n\n metadata.ok = res.ok;\n if (res.ok) {\n const resMediaBlob = await MediaBlob.fromBlob(await res.blob());\n ret.data = resMediaBlob.data;\n }\n\n ret.metadata = metadata;\n return ret;\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const blobMap = keys.map(this._fetch);\n return await Promise.all(blobMap);\n }\n\n async mdelete(_keys: string[]): Promise<void> {\n this._notImplementedException();\n }\n\n async mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n this._notImplementedException();\n }\n\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n this._notImplementedException();\n yield \"\";\n }\n}\n\n/**\n * A blob \"store\" that works with data: URLs that will turn the URL into\n * a blob.\n */\nexport class DataBlobStore extends BlobStore {\n _notImplementedException() {\n throw new Error(\"Not implemented for DataBlobStore\");\n }\n\n hasValidPath(path: string, _opts?: BlobStoreStoreOptions): Promise<boolean> {\n return super.hasValidPath(path, { pathPrefix: \"data:\" });\n }\n\n _fetch(url: string): MediaBlob {\n return MediaBlob.fromDataUrl(url);\n }\n\n async mget(keys: string[]): Promise<(MediaBlob | undefined)[]> {\n const blobMap = keys.map(this._fetch);\n return blobMap;\n }\n\n async mdelete(_keys: string[]): Promise<void> {\n this._notImplementedException();\n }\n\n async mset(_keyValuePairs: [string, MediaBlob][]): Promise<void> {\n this._notImplementedException();\n }\n\n async *yieldKeys(_prefix: string | undefined): AsyncGenerator<string> {\n this._notImplementedException();\n yield \"\";\n }\n}\n\nexport interface MediaManagerConfiguration {\n /**\n * A store that, given a common URI, returns the corresponding MediaBlob.\n * The returned MediaBlob may have a different URI.\n * In many cases, this will be a ReadThroughStore or something similar\n * that has a cached version of the MediaBlob, but also a way to get\n * a new (or refreshed) version.\n */\n store: BlobStore;\n\n /**\n * BlobStores that can resolve a URL into the MediaBlob to save\n * in the canonical store. This list is evaluated in order.\n * If not provided, a default list (which involves a DataBlobStore\n * and a SimpleWebBlobStore) will be used.\n */\n resolvers?: BlobStore[];\n}\n\n/**\n * Responsible for converting a URI (typically a web URL) into a MediaBlob.\n * Allows for aliasing / caching of the requested URI and what it resolves to.\n * This MediaBlob is expected to be usable to provide to an LLM, either\n * through the Base64 of the media or through a canonical URI that the LLM\n * supports.\n */\nexport class MediaManager {\n store: BlobStore;\n\n resolvers: BlobStore[] | undefined;\n\n constructor(config: MediaManagerConfiguration) {\n this.store = config.store;\n this.resolvers = config.resolvers;\n }\n\n defaultResolvers(): BlobStore[] {\n return [new DataBlobStore({}), new SimpleWebBlobStore({})];\n }\n\n async _isInvalid(blob: MediaBlob | undefined): Promise<boolean> {\n return typeof blob === \"undefined\";\n }\n\n /**\n * Given the public URI, load what is at this URI and save it\n * in the store.\n * @param uri The URI to resolve using the resolver\n * @return A canonical MediaBlob for this URI\n */\n async _resolveAndSave(uri: string): Promise<MediaBlob | undefined> {\n let resolvedBlob: MediaBlob | undefined;\n\n const resolvers = this.resolvers || this.defaultResolvers();\n for (let co = 0; co < resolvers.length; co += 1) {\n const resolver = resolvers[co];\n if (await resolver.hasValidPath(uri)) {\n resolvedBlob = await resolver.fetch(uri);\n }\n }\n\n if (resolvedBlob) {\n return await this.store.store(resolvedBlob);\n } else {\n return new MediaBlob({});\n }\n }\n\n async getMediaBlob(uri: string): Promise<MediaBlob | undefined> {\n const aliasBlob = await this.store.fetch(uri);\n const ret = (await this._isInvalid(aliasBlob))\n ? await this._resolveAndSave(uri)\n : (aliasBlob as MediaBlob);\n return ret;\n }\n}\n"],"mappings":";;;;;AAiBA,SAAS,cAAc,WAA+B;CAEpD,IAAI,MAAM;CACV,MAAM,YAAY;AAClB,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,WAAW;EACpD,MAAM,QAAQ,UAAU,SAAS,GAAG,IAAI,UAAU;AAClD,SAAO,OAAO,aAAa,GAAG,MAAM;;AAGtC,QAAO;;;;;;AAOT,IAAa,YAAb,MAAa,kBAAkBA,kCAAAA,aAA4C;CACzE,kBAAkB;CAElB,eAAe;EACb;EACA;EACA;EACA;EACA;EACD;CAED,OAAsB;EACpB,OAAO;EACP,MAAM;EACP;CAGD;CAEA;CAEA,YAAY,QAA6B;AACvC,QAAM,OAAO;AAEb,OAAK,OAAO,OAAO,QAAQ,KAAK;AAChC,OAAK,WAAW,OAAO;AACvB,OAAK,OAAO,OAAO;;CAGrB,IAAI,OAAe;AACjB,SAAO,KAAK,QAAQ;;CAGtB,IAAI,WAAmB;AACrB,SAAO,KAAK,MAAM,QAAQ;;CAG5B,IAAI,WAAmB;EACrB,MAAM,gBAAgB,KAAK,SAAS,QAAQ,WAAW;AACvD,SAAO,kBAAkB,KACrB,UACA,KAAK,SAAS,UAAU,gBAAgB,EAAE;;CAGhD,IAAI,WAAmB;EACrB,MAAM,YAAY,KAAK,SAAS,QAAQ,IAAI;AAC5C,SAAO,cAAc,KACjB,KAAK,WACL,KAAK,SAAS,UAAU,GAAG,UAAU;;CAG3C,IAAI,UAAsB;AACxB,MAAI,CAAC,KAAK,KACR,QAAO,WAAW,KAAK,EAAE,CAAC;EAE5B,MAAM,YAAY,KAAK,KAAK,MAAM,MAAM;EACxC,MAAM,MAAM,IAAI,WAAW,UAAU,OAAO;AAC5C,OAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM,EAC5C,KAAI,MAAM,UAAU,WAAW,GAAG;AAEpC,SAAO;;CAGT,MAAM,WAA4B;AAChC,SAAO,cAAc,KAAK,QAAQ;;CAGpC,MAAM,WAA4B;AAChC,SAAO,KAAK,MAAM,SAAS;;CAG7B,MAAM,YAA6B;AACjC,SAAO,QAAQ,KAAK,SAAS,UAAU,MAAM,KAAK,UAAU;;CAG9D,MAAM,QAAyB;AAC7B,SAAO,KAAK,QAAS,MAAM,KAAK,WAAW;;CAG7C,MAAM,SAAyD;EAC7D,MAAM,UAAU,MAAM,KAAK,WAAW;EACtC,MAAM,QAAQ,QAAQ,QAAQ,IAAI;AAGlC,SAAO;GACL,SAHc,QAAQ,UAAU,QAAQ,EAAE;GAI1C,UAHuB,QAAQ,QAAQ,SAAS,GAAG,KAAK,WAAW;GAIpE;;CAGH,OAAO,YAAY,KAAwB;AACzC,MAAI,CAAC,IAAI,WAAW,QAAQ,CAC1B,OAAM,IAAI,MAAM,kBAAkB;EAEpC,MAAM,QAAQ,IAAI,QAAQ,IAAI;EAC9B,MAAM,YAAY,IAAI,QAAQ,IAAI;EAClC,MAAM,WAAW,IAAI,UAAU,QAAQ,GAAG,UAAU;EAEpD,MAAM,QAAQ,IAAI,QAAQ,IAAI;AAQ9B,SAAO,IAAI,UAAU;GACnB,MAN0B;IAC1B,MAAM;IACN,OAJiB,IAAI,UAAU,QAAQ,EAAE;IAK1C;GAIC,MAAM;GACP,CAAC;;CAGJ,aAAa,SACX,MACA,OACoB;EACpB,MAAM,cAAc,MAAM,KAAK,aAAa;EAE5C,MAAM,WAAW,cADE,IAAI,WAAW,YAAY,CACJ;EAC1C,MAAM,QAAQ,KAAK,SAAS;AAE5B,SAAO,IAAI,UAAU;GACnB,GAAG;GACH,MAAM;IACJ;IACA,MAAM,KAAK;IACZ;GACF,CAAC;;;;;;;;;;;;;;;AAoEN,IAAsB,YAAtB,cAAwCC,uBAAAA,UAA6B;CACnE,eAAe,CAAC,aAAa,gBAAgB;CAE7C;CAEA;CAEA,YAAY,MAAyB;AACnC,QAAM,KAAK;AACX,OAAK,sBAAsB,MAAM,uBAAuB,EAAE;AAC1D,OAAK,sBAAsB,MAAM,uBAAuB,EAAE;;CAG5D,MAAgB,SAAS,KAA0C;AACjE,SAAO,OAAO,QAAQ,WAAW,MAAM,MAAM,IAAI,OAAO;;;;;;;;;;;;CAa1D,aACE,MACA,MACkB;EAClB,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,aAAa,OAAO,SAAS,eAAe,KAAK,WAAW,OAAO;AACzE,SAAO,QAAQ,QAAQ,WAAW;;CAGpC,gBAA0B,MAAyB;EAEjD,MAAM,WAAW,GAAG,KAAK;EAGzB,IAAI,YAAY,SAAS,QAAQ,IAAI,GAAG;AACxC,SAAO,SAAS,OAAO,UAAU,KAAK,IACpC,cAAa;AAIf,SAAO,SAAS,UAAU,UAAU;;CAGtC,MAAgB,SACd,SACA,SACoB;EACpB,MAAM,UAAU,QAAQ;EACxB,MAAM,WAAW,SAAS,YAAY,EAAE;AACxC,WAAS,mBAAmB;EAC5B,MAAM,UAAU,IAAI,UAAU;GAC5B,GAAG;GACH;GACD,CAAC;AACF,MAAI,QACF,SAAQ,OAAO;WACN,QAAQ,KACjB,QAAO,QAAQ;AAEjB,SAAO;;CAGT,MAAgB,qBACd,MACA,MACoB;EAGpB,MAAM,UAAU,GAFD,MAAM,cAAc,KACpB,KAAK,gBAAgB,KAAK;AAEzC,SAAO,KAAK,SAAS,MAAM,QAAQ;;CAGrC,6BACE,MACQ;AACR,UAAQ,MAAR;GACE,KAAK,cACH,SAAA,GAAA,KAAA,KAAW;GACb,KAAK,cACH,SAAA,GAAA,KAAA,KAAW;GAGb,QACE,OAAM,IAAI,MAAM,0BAA0B,OAAO;;;CAIvD,MAAgB,qBACd,MACA,MACoB;EAKpB,MAAM,UAAU,GAJD,MAAM,cAAc,KACpB,KAAK,6BAClB,MAAM,mBAAmB,cAC1B;AAED,SAAO,KAAK,SAAS,MAAM,QAAQ;;CAGrC,MAAgB,qBACd,MACA,OACoB;AACpB,SAAO,KAAK,SAAS,MAAM,KAAA,EAAU;;;;;;;;CASvC,MAAgB,gBACd,MACA,MACgC;AAChC,MAAI,MAAM,KAAK,aAAa,KAAK,MAAM,KAAK,CAC1C,QAAO;AAET,UAAQ,MAAM,iBAAd;GACE,KAAK,SACH,QAAO;GACT,KAAK,aACH,QAAO,KAAK,qBAAqB,MAAM,KAAK;GAC9C,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK,cACH,QAAO,KAAK,qBAAqB,MAAM,KAAK;GAC9C,KAAK,aACH,QAAO,KAAK,qBAAqB,MAAM,KAAK;GAC9C,QACE;;;CAIN,MAAM,MACJ,MACA,OAA8B,EAAE,EACA;EAChC,MAAM,UAAiC;GACrC,GAAG,KAAK;GACR,GAAG;GACJ;EACD,MAAM,YAAY,MAAM,KAAK,gBAAgB,MAAM,QAAQ;AAC3D,MAAI,OAAO,cAAc,aAAa;GACpC,MAAM,WAAW,MAAM,UAAU,OAAO;AACxC,SAAM,KAAK,KAAK,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC;GACxC,MAAM,WAAW,MAAM,UAAU,OAAO;AACxC,UAAO,MAAM,KAAK,MAAM,SAAS;;;CAKrC,MAAgB,uBACd,MACA,OACoB;AACpB,SAAO,IAAI,UAAU,EAAE,MAAM,CAAC;;CAGhC,MAAgB,kBACd,MACA,MACgC;AAChC,UAAQ,MAAM,qBAAd;GACE,KAAK,YACH,QAAO,KAAK,uBAAuB,MAAM,KAAK;GAChD,QACE;;;CAIN,MAAM,MACJ,KACA,OAA8B,EAAE,EACA;EAChC,MAAM,UAAiC;GACrC,GAAG,KAAK;GACR,GAAG;GACJ;EACD,MAAM,UAAU,MAAM,KAAK,SAAS,IAAI;AAExC,UADY,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,IACzB,MAAO,MAAM,KAAK,kBAAkB,SAAS,QAAQ;;;AAQtE,IAAa,kBAAb,cAAqC,UAAU;CAC7C;CAEA,YAAY,MAA8B;AACxC,QAAM,KAAK;AACX,OAAK,eAAe,KAAK;;CAG3B,QAAQ,MAA+B;AACrC,SAAO,KAAK,aAAa,QAAQ,KAAK;;CAGxC,KAAK,MAAoD;AACvD,SAAO,KAAK,aAAa,KAAK,KAAK;;CAGrC,KAAK,eAAqD;AACxD,SAAO,KAAK,aAAa,KAAK,cAAc;;CAG9C,UAAU,QAAoD;AAC5D,SAAO,KAAK,aAAa,UAAU,OAAO;;;AAS9C,IAAa,uBAAb,cAA0C,UAAU;CAClD;CAEA;CAEA,YAAY,MAAmC;AAC7C,QAAM,KAAK;AACX,OAAK,YAAY,KAAK;AACtB,OAAK,eAAe,KAAK;;CAG3B,MAAM,MACJ,MACA,OAA8B,EAAE,EACA;EAChC,MAAM,cAAc,MAAM,KAAK,OAAO;EACtC,MAAM,UAAU,MAAM,KAAK,aAAa,MAAM,MAAM,KAAK;AACzD,MAAI,QACF,OAAM,KAAK,UAAU,KAAK,CAAC,CAAC,aAAa,QAAQ,CAAC,CAAC;AAErD,SAAO;;CAGT,QAAQ,MAA+B;AACrC,SAAO,KAAK,UAAU,QAAQ,KAAK;;CAGrC,KAAK,MAAoD;AACvD,SAAO,KAAK,UAAU,KAAK,KAAK;;CAGlC,KAAK,gBAAsD;AACzD,QAAM,IAAI,MAAM,iDAAiD;;CAGnE,UAAU,QAAoD;AAC5D,SAAO,KAAK,UAAU,UAAU,OAAO;;;AAI3C,IAAa,qBAAb,cAAwC,UAAU;CAChD,2BAA2B;AACzB,QAAM,IAAI,MAAM,yCAAyC;;CAG3D,MAAM,aACJ,MACA,OACkB;AAClB,SACG,MAAM,MAAM,aAAa,MAAM,EAAE,YAAY,YAAY,CAAC,IAC1D,MAAM,MAAM,aAAa,MAAM,EAAE,YAAY,WAAW,CAAC;;CAI9D,MAAM,OAAO,KAA6C;EACxD,MAAM,MAAM,IAAI,UAAU,EACxB,MAAM,KACP,CAAC;EACF,MAAM,WAAoC,EAAE;EAI5C,MAAM,MAAM,MAAM,MAAM,KAHH,EACnB,QAAQ,OACT,CACyC;AAC1C,WAAS,SAAS,IAAI;EAEtB,MAAM,UAAkC,EAAE;AAC1C,OAAK,MAAM,CAAC,KAAK,UAAU,IAAI,QAAQ,SAAS,CAC9C,SAAQ,OAAO;AAEjB,WAAS,UAAU;AAEnB,WAAS,KAAK,IAAI;AAClB,MAAI,IAAI,GAEN,KAAI,QADiB,MAAM,UAAU,SAAS,MAAM,IAAI,MAAM,CAAC,EACvC;AAG1B,MAAI,WAAW;AACf,SAAO;;CAGT,MAAM,KAAK,MAAoD;EAC7D,MAAM,UAAU,KAAK,IAAI,KAAK,OAAO;AACrC,SAAO,MAAM,QAAQ,IAAI,QAAQ;;CAGnC,MAAM,QAAQ,OAAgC;AAC5C,OAAK,0BAA0B;;CAGjC,MAAM,KAAK,gBAAsD;AAC/D,OAAK,0BAA0B;;CAGjC,OAAO,UAAU,SAAqD;AACpE,OAAK,0BAA0B;AAC/B,QAAM;;;;;;;AAQV,IAAa,gBAAb,cAAmC,UAAU;CAC3C,2BAA2B;AACzB,QAAM,IAAI,MAAM,oCAAoC;;CAGtD,aAAa,MAAc,OAAiD;AAC1E,SAAO,MAAM,aAAa,MAAM,EAAE,YAAY,SAAS,CAAC;;CAG1D,OAAO,KAAwB;AAC7B,SAAO,UAAU,YAAY,IAAI;;CAGnC,MAAM,KAAK,MAAoD;AAE7D,SADgB,KAAK,IAAI,KAAK,OAAO;;CAIvC,MAAM,QAAQ,OAAgC;AAC5C,OAAK,0BAA0B;;CAGjC,MAAM,KAAK,gBAAsD;AAC/D,OAAK,0BAA0B;;CAGjC,OAAO,UAAU,SAAqD;AACpE,OAAK,0BAA0B;AAC/B,QAAM;;;;;;;;;;AA8BV,IAAa,eAAb,MAA0B;CACxB;CAEA;CAEA,YAAY,QAAmC;AAC7C,OAAK,QAAQ,OAAO;AACpB,OAAK,YAAY,OAAO;;CAG1B,mBAAgC;AAC9B,SAAO,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,IAAI,mBAAmB,EAAE,CAAC,CAAC;;CAG5D,MAAM,WAAW,MAA+C;AAC9D,SAAO,OAAO,SAAS;;;;;;;;CASzB,MAAM,gBAAgB,KAA6C;EACjE,IAAI;EAEJ,MAAM,YAAY,KAAK,aAAa,KAAK,kBAAkB;AAC3D,OAAK,IAAI,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM,GAAG;GAC/C,MAAM,WAAW,UAAU;AAC3B,OAAI,MAAM,SAAS,aAAa,IAAI,CAClC,gBAAe,MAAM,SAAS,MAAM,IAAI;;AAI5C,MAAI,aACF,QAAO,MAAM,KAAK,MAAM,MAAM,aAAa;MAE3C,QAAO,IAAI,UAAU,EAAE,CAAC;;CAI5B,MAAM,aAAa,KAA6C;EAC9D,MAAM,YAAY,MAAM,KAAK,MAAM,MAAM,IAAI;AAI7C,SAHa,MAAM,KAAK,WAAW,UAAU,GACzC,MAAM,KAAK,gBAAgB,IAAI,GAC9B"}