diff --git a/.generator/schemas/v2/openapi.yaml b/.generator/schemas/v2/openapi.yaml index 9dd8e972ab6d..62da8be0f948 100644 --- a/.generator/schemas/v2/openapi.yaml +++ b/.generator/schemas/v2/openapi.yaml @@ -92998,6 +92998,49 @@ components: type: string x-enum-varnames: - RECOMMENDATION + RecommendationV2RequestAttributes: + description: |- + Attributes for requesting SPA recommendations by forwarding a Spark job's raw arguments + instead of a precomputed shard. + properties: + arguments: + description: |- + Raw, unfiltered Spark job arguments as submitted (for example, `--org_id=2`). + SPA determines which arguments are relevant for the given service. + example: + - "" + items: + type: string + type: array + required: [arguments] + type: object + RecommendationV2RequestBody: + description: |- + Request body for retrieving SPA recommendations by forwarding a Spark job's raw arguments + instead of a precomputed shard. + properties: + data: + $ref: "#/components/schemas/RecommendationV2RequestData" + required: [data] + type: object + RecommendationV2RequestData: + description: JSON:API resource object for the SPA v2 recommendation request. + properties: + attributes: + $ref: "#/components/schemas/RecommendationV2RequestAttributes" + type: + $ref: "#/components/schemas/RecommendationV2RequestType" + required: [type, attributes] + type: object + RecommendationV2RequestType: + default: recommendation_v2_request + description: JSON:API resource type for the SPA v2 recommendation request. + enum: + - recommendation_v2_request + example: recommendation_v2_request + type: string + x-enum-varnames: + - RECOMMENDATION_V2_REQUEST RecommendationsFilterRequest: description: JSON:API request body for filtering cost recommendations. example: @@ -218752,6 +218795,68 @@ paths: x-unstable: |- **Note**: This endpoint is in preview and is subject to change. If you have any feedback, contact [Datadog support](https://docs.datadoghq.com/help/). + /api/v2/spa/recommendations-v2/{service}: + post: + description: |- + This endpoint is experimental and restricted to Datadog internal use only. + Retrieve resource recommendations for a Spark job. The caller (Spark Gateway) provides + a service name and the job's raw arguments. SPA determines which arguments are relevant + for the service and returns structured recommendations for driver and executor resources. + operationId: GetSPARecommendationsV2 + parameters: + - description: The service name for a Spark job + in: path + name: service + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/RecommendationV2RequestBody" + required: true + responses: + "200": + content: + application/json: + example: + data: + attributes: + driver: + estimation: + cpu: {max: 1500, p75: 1000, p95: 1200} + ephemeral_storage: 896 + heap: 6144 + memory: 7168 + overhead: 1024 + executor: + estimation: + cpu: {max: 2000, p75: 1200, p95: 1500} + ephemeral_storage: 512 + heap: 3072 + memory: 4096 + overhead: 1024 + id: "dedupeactivecontexts:adp_dedupeactivecontexts_org2" + type: recommendation + schema: + $ref: "#/components/schemas/RecommendationDocument" + description: OK + "400": + $ref: "#/components/responses/BadRequestResponse" + "403": + $ref: "#/components/responses/NotAuthorizedResponse" + "404": + $ref: "#/components/responses/NotFoundResponse" + "429": + $ref: "#/components/responses/TooManyRequestsResponse" + security: + - AuthZ: [] + summary: Get SPA recommendations v2 + tags: + - Spa + x-unstable: |- + **Note**: This endpoint is in preview and may change in the future. It is not yet recommended for production use. /api/v2/spa/recommendations/{service}: get: description: This endpoint is currently experimental and restricted to Datadog internal use only. Retrieve resource recommendations for a Spark job. The caller (Spark Gateway or DJM UI) provides a service name and SPA returns structured recommendations for driver and executor resources. The version with a shard should be preferred, where possible, as it gives more accurate results. diff --git a/examples/v2/spa/GetSPARecommendationsV2.ts b/examples/v2/spa/GetSPARecommendationsV2.ts new file mode 100644 index 000000000000..ff65a436430f --- /dev/null +++ b/examples/v2/spa/GetSPARecommendationsV2.ts @@ -0,0 +1,36 @@ +/** + * Get SPA recommendations v2 returns "OK" response + */ + +import { client, v2 } from "@datadog/datadog-api-client"; + +const configuration = client.createConfiguration({ + authMethods: { + AuthZ: { + accessToken: process.env.DD_BEARER_TOKEN as string, + }, + }, +}); +configuration.unstableOperations["v2.getSPARecommendationsV2"] = true; +const apiInstance = new v2.SpaApi(configuration); + +const params: v2.SpaApiGetSPARecommendationsV2Request = { + body: { + data: { + attributes: { + arguments: [""], + }, + type: "recommendation_v2_request", + }, + }, + service: "service", +}; + +apiInstance + .getSPARecommendationsV2(params) + .then((data: v2.RecommendationDocument) => { + console.log( + "API called successfully. Returned data: " + JSON.stringify(data) + ); + }) + .catch((error: any) => console.error(error)); diff --git a/features/support/scenarios_model_mapping.ts b/features/support/scenarios_model_mapping.ts index 6f781059acbc..926fbf6674f9 100644 --- a/features/support/scenarios_model_mapping.ts +++ b/features/support/scenarios_model_mapping.ts @@ -17361,6 +17361,17 @@ export const ScenariosModelMappings: {[key: string]: {[key: string]: any}} = { }, "operationResponseType": "CreateSnapshotResponse", }, + "v2.GetSPARecommendationsV2": { + "service": { + "type": "string", + "format": "", + }, + "body": { + "type": "RecommendationV2RequestBody", + "format": "", + }, + "operationResponseType": "RecommendationDocument", + }, "v2.GetSPARecommendations": { "bypassCache": { "type": "string", diff --git a/features/v2/spa.feature b/features/v2/spa.feature index 0e6ac6b3a76b..b3d5d0fec0c2 100644 --- a/features/v2/spa.feature +++ b/features/v2/spa.feature @@ -40,6 +40,33 @@ Feature: Spa When the request is sent Then the response status is 200 OK + @generated @skip @team:DataDog/data-and-analytics-processing + Scenario: Get SPA recommendations v2 returns "Bad Request" response + Given operation "GetSPARecommendationsV2" enabled + And new "GetSPARecommendationsV2" request + And request contains "service" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"arguments": [""]}, "type": "recommendation_v2_request"}} + When the request is sent + Then the response status is 400 Bad Request + + @generated @skip @team:DataDog/data-and-analytics-processing + Scenario: Get SPA recommendations v2 returns "Not Found" response + Given operation "GetSPARecommendationsV2" enabled + And new "GetSPARecommendationsV2" request + And request contains "service" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"arguments": [""]}, "type": "recommendation_v2_request"}} + When the request is sent + Then the response status is 404 Not Found + + @generated @skip @team:DataDog/data-and-analytics-processing + Scenario: Get SPA recommendations v2 returns "OK" response + Given operation "GetSPARecommendationsV2" enabled + And new "GetSPARecommendationsV2" request + And request contains "service" parameter from "REPLACE.ME" + And body with value {"data": {"attributes": {"arguments": [""]}, "type": "recommendation_v2_request"}} + When the request is sent + Then the response status is 200 OK + @skip @team:DataDog/data-and-analytics-processing Scenario: GetSPARecommendations returns a JSON:API Recommendation with driver and executor estimations Given new "GetSPARecommendations" request diff --git a/features/v2/undo.json b/features/v2/undo.json index 8ad9cc9418f1..0f86041e11e6 100644 --- a/features/v2/undo.json +++ b/features/v2/undo.json @@ -9323,6 +9323,12 @@ "type": "unsafe" } }, + "GetSPARecommendationsV2": { + "tag": "Spa", + "undo": { + "type": "safe" + } + }, "GetSPARecommendations": { "tag": "Spa", "undo": { diff --git a/packages/datadog-api-client-common/configuration.ts b/packages/datadog-api-client-common/configuration.ts index ab9ed5ccf769..f1feb6eb8b24 100644 --- a/packages/datadog-api-client-common/configuration.ts +++ b/packages/datadog-api-client-common/configuration.ts @@ -811,6 +811,7 @@ export function createConfiguration( "v2.getSloStatus": false, "v2.createSnapshot": false, "v2.getSPARecommendations": false, + "v2.getSPARecommendationsV2": false, "v2.getSPARecommendationsWithShard": false, "v2.createAiCustomRule": false, "v2.createAiCustomRuleRevision": false, diff --git a/packages/datadog-api-client-v2/apis/SpaApi.ts b/packages/datadog-api-client-v2/apis/SpaApi.ts index adbcf7fe7a31..ba57ca0e4b93 100644 --- a/packages/datadog-api-client-v2/apis/SpaApi.ts +++ b/packages/datadog-api-client-v2/apis/SpaApi.ts @@ -18,6 +18,7 @@ import { ApiException } from "../../datadog-api-client-common/exception"; import { APIErrorResponse } from "../models/APIErrorResponse"; import { RecommendationDocument } from "../models/RecommendationDocument"; +import { RecommendationV2RequestBody } from "../models/RecommendationV2RequestBody"; export class SpaApiRequestFactory extends BaseAPIRequestFactory { public async getSPARecommendations( @@ -70,6 +71,65 @@ export class SpaApiRequestFactory extends BaseAPIRequestFactory { return requestContext; } + public async getSPARecommendationsV2( + service: string, + body: RecommendationV2RequestBody, + _options?: Configuration + ): Promise { + const _config = _options || this.configuration; + + logger.warn("Using unstable operation 'getSPARecommendationsV2'"); + if (!_config.unstableOperations["v2.getSPARecommendationsV2"]) { + throw new Error( + "Unstable operation 'getSPARecommendationsV2' is disabled" + ); + } + + // verify required parameter 'service' is not null or undefined + if (service === null || service === undefined) { + throw new RequiredError("service", "getSPARecommendationsV2"); + } + + // verify required parameter 'body' is not null or undefined + if (body === null || body === undefined) { + throw new RequiredError("body", "getSPARecommendationsV2"); + } + + // Path Params + const localVarPath = "/api/v2/spa/recommendations-v2/{service}".replace( + "{service}", + encodeURIComponent(String(service)) + ); + + // Make Request Context + const requestContext = _config + .getServer("v2.SpaApi.getSPARecommendationsV2") + .makeRequestContext(localVarPath, HttpMethod.POST); + requestContext.setHeaderParam("Accept", "application/json"); + requestContext.setHttpConfig(_config.httpConfig); + + // Set IaC header + if (_config.isIaC) { + requestContext.setHeaderParam("X-Datadog-Managed-By", "iac"); + } + + // Body Params + const contentType = ObjectSerializer.getPreferredMediaType([ + "application/json", + ]); + requestContext.setHeaderParam("Content-Type", contentType); + const serializedBody = ObjectSerializer.stringify( + ObjectSerializer.serialize(body, "RecommendationV2RequestBody", ""), + contentType + ); + requestContext.setBody(serializedBody); + + // Apply auth methods + applySecurityAuthentication(_config, requestContext, ["AuthZ"]); + + return requestContext; + } + public async getSPARecommendationsWithShard( shard: string, service: string, @@ -191,6 +251,69 @@ export class SpaApiResponseProcessor { ); } + /** + * Unwraps the actual response sent by the server from the response context and deserializes the response content + * to the expected objects + * + * @params response Response returned by the server for a request to getSPARecommendationsV2 + * @throws ApiException if the response code was not in [200, 299] + */ + public async getSPARecommendationsV2( + response: ResponseContext + ): Promise { + const contentType = ObjectSerializer.normalizeMediaType( + response.headers["content-type"] + ); + if (response.httpStatusCode === 200) { + const body: RecommendationDocument = ObjectSerializer.deserialize( + ObjectSerializer.parse(await response.body.text(), contentType), + "RecommendationDocument" + ) as RecommendationDocument; + return body; + } + if ( + response.httpStatusCode === 400 || + response.httpStatusCode === 403 || + response.httpStatusCode === 404 || + response.httpStatusCode === 429 + ) { + const bodyText = ObjectSerializer.parse( + await response.body.text(), + contentType + ); + let body: APIErrorResponse; + try { + body = ObjectSerializer.deserialize( + bodyText, + "APIErrorResponse" + ) as APIErrorResponse; + } catch (error) { + logger.debug(`Got error deserializing error: ${error}`); + throw new ApiException( + response.httpStatusCode, + bodyText + ); + } + throw new ApiException(response.httpStatusCode, body); + } + + // Work around for missing responses in specification, e.g. for petstore.yaml + if (response.httpStatusCode >= 200 && response.httpStatusCode <= 299) { + const body: RecommendationDocument = ObjectSerializer.deserialize( + ObjectSerializer.parse(await response.body.text(), contentType), + "RecommendationDocument", + "" + ) as RecommendationDocument; + return body; + } + + const body = (await response.body.text()) || ""; + throw new ApiException( + response.httpStatusCode, + 'Unknown API Status Code!\nBody: "' + body + '"' + ); + } + /** * Unwraps the actual response sent by the server from the response context and deserializes the response content * to the expected objects @@ -267,6 +390,18 @@ export interface SpaApiGetSPARecommendationsRequest { bypassCache?: string; } +export interface SpaApiGetSPARecommendationsV2Request { + /** + * The service name for a Spark job + * @type string + */ + service: string; + /** + * @type RecommendationV2RequestBody + */ + body: RecommendationV2RequestBody; +} + export interface SpaApiGetSPARecommendationsWithShardRequest { /** * The shard tag for a spark job, which differentiates jobs within the same service that have different resource needs @@ -323,6 +458,33 @@ export class SpaApi { }); } + /** + * This endpoint is experimental and restricted to Datadog internal use only. + * Retrieve resource recommendations for a Spark job. The caller (Spark Gateway) provides + * a service name and the job's raw arguments. SPA determines which arguments are relevant + * for the service and returns structured recommendations for driver and executor resources. + * @param param The request object + */ + public getSPARecommendationsV2( + param: SpaApiGetSPARecommendationsV2Request, + options?: Configuration + ): Promise { + const requestContextPromise = this.requestFactory.getSPARecommendationsV2( + param.service, + param.body, + options + ); + return requestContextPromise.then((requestContext) => { + return this.configuration.httpApi + .send(requestContext) + .then((responseContext) => { + return this.responseProcessor.getSPARecommendationsV2( + responseContext + ); + }); + }); + } + /** * This endpoint is currently experimental and restricted to Datadog internal use only. Retrieve resource recommendations for a Spark job. The caller (Spark Gateway or DJM UI) provides a service name and shard identifier, and SPA returns structured recommendations for driver and executor resources. * @param param The request object diff --git a/packages/datadog-api-client-v2/index.ts b/packages/datadog-api-client-v2/index.ts index 7254693e6df9..58a67154901c 100644 --- a/packages/datadog-api-client-v2/index.ts +++ b/packages/datadog-api-client-v2/index.ts @@ -1757,6 +1757,7 @@ export { export { SpaApiGetSPARecommendationsRequest, + SpaApiGetSPARecommendationsV2Request, SpaApiGetSPARecommendationsWithShardRequest, SpaApi, } from "./apis/SpaApi"; @@ -7583,6 +7584,10 @@ export { RecommendationsFilterRequestSortItems } from "./models/RecommendationsF export { RecommendationsPageMeta } from "./models/RecommendationsPageMeta"; export { RecommendationsPageMetaPage } from "./models/RecommendationsPageMetaPage"; export { RecommendationType } from "./models/RecommendationType"; +export { RecommendationV2RequestAttributes } from "./models/RecommendationV2RequestAttributes"; +export { RecommendationV2RequestBody } from "./models/RecommendationV2RequestBody"; +export { RecommendationV2RequestData } from "./models/RecommendationV2RequestData"; +export { RecommendationV2RequestType } from "./models/RecommendationV2RequestType"; export { ReferenceTableCreateSourceType } from "./models/ReferenceTableCreateSourceType"; export { ReferenceTableSchemaFieldType } from "./models/ReferenceTableSchemaFieldType"; export { ReferenceTableSortType } from "./models/ReferenceTableSortType"; diff --git a/packages/datadog-api-client-v2/models/ObjectSerializer.ts b/packages/datadog-api-client-v2/models/ObjectSerializer.ts index 5480c1f2584f..ab1bf3b1d5be 100644 --- a/packages/datadog-api-client-v2/models/ObjectSerializer.ts +++ b/packages/datadog-api-client-v2/models/ObjectSerializer.ts @@ -4317,6 +4317,9 @@ import { RecentlyUpdatedEntitiesResponse } from "./RecentlyUpdatedEntitiesRespon import { RecommendationAttributes } from "./RecommendationAttributes"; import { RecommendationData } from "./RecommendationData"; import { RecommendationDocument } from "./RecommendationDocument"; +import { RecommendationV2RequestAttributes } from "./RecommendationV2RequestAttributes"; +import { RecommendationV2RequestBody } from "./RecommendationV2RequestBody"; +import { RecommendationV2RequestData } from "./RecommendationV2RequestData"; import { RecommendationsFilterRequest } from "./RecommendationsFilterRequest"; import { RecommendationsFilterRequestData } from "./RecommendationsFilterRequestData"; import { RecommendationsFilterRequestDataAttributes } from "./RecommendationsFilterRequestDataAttributes"; @@ -8470,6 +8473,7 @@ const enumsMap: { [key: string]: any[] } = { RUMSortOrder: ["asc", "desc"], ReadinessGateThresholdType: ["ANY", "ALL"], RecommendationType: ["recommendation"], + RecommendationV2RequestType: ["recommendation_v2_request"], RecommendationsFilterRequestDataType: ["recommendations_filter"], RecommendationsFilterRequestScope: ["ccm", "experiment", "*"], ReferenceTableCreateSourceType: ["LOCAL_FILE", "S3", "GCS", "AZURE"], @@ -14868,6 +14872,9 @@ const typeMap: { [index: string]: any } = { RecommendationAttributes: RecommendationAttributes, RecommendationData: RecommendationData, RecommendationDocument: RecommendationDocument, + RecommendationV2RequestAttributes: RecommendationV2RequestAttributes, + RecommendationV2RequestBody: RecommendationV2RequestBody, + RecommendationV2RequestData: RecommendationV2RequestData, RecommendationsFilterRequest: RecommendationsFilterRequest, RecommendationsFilterRequestData: RecommendationsFilterRequestData, RecommendationsFilterRequestDataAttributes: diff --git a/packages/datadog-api-client-v2/models/RecommendationV2RequestAttributes.ts b/packages/datadog-api-client-v2/models/RecommendationV2RequestAttributes.ts new file mode 100644 index 000000000000..e815db23f4df --- /dev/null +++ b/packages/datadog-api-client-v2/models/RecommendationV2RequestAttributes.ts @@ -0,0 +1,55 @@ +/** + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + +import { AttributeTypeMap } from "../../datadog-api-client-common/util"; + +/** + * Attributes for requesting SPA recommendations by forwarding a Spark job's raw arguments + * instead of a precomputed shard. + */ +export class RecommendationV2RequestAttributes { + /** + * Raw, unfiltered Spark job arguments as submitted (for example, `--org_id=2`). + * SPA determines which arguments are relevant for the given service. + */ + "arguments": Array; + + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + arguments: { + baseName: "arguments", + type: "Array", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return RecommendationV2RequestAttributes.attributeTypeMap; + } + + public constructor() {} +} diff --git a/packages/datadog-api-client-v2/models/RecommendationV2RequestBody.ts b/packages/datadog-api-client-v2/models/RecommendationV2RequestBody.ts new file mode 100644 index 000000000000..73b566dee852 --- /dev/null +++ b/packages/datadog-api-client-v2/models/RecommendationV2RequestBody.ts @@ -0,0 +1,55 @@ +/** + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ +import { RecommendationV2RequestData } from "./RecommendationV2RequestData"; + +import { AttributeTypeMap } from "../../datadog-api-client-common/util"; + +/** + * Request body for retrieving SPA recommendations by forwarding a Spark job's raw arguments + * instead of a precomputed shard. + */ +export class RecommendationV2RequestBody { + /** + * JSON:API resource object for the SPA v2 recommendation request. + */ + "data": RecommendationV2RequestData; + + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + data: { + baseName: "data", + type: "RecommendationV2RequestData", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return RecommendationV2RequestBody.attributeTypeMap; + } + + public constructor() {} +} diff --git a/packages/datadog-api-client-v2/models/RecommendationV2RequestData.ts b/packages/datadog-api-client-v2/models/RecommendationV2RequestData.ts new file mode 100644 index 000000000000..367eecb1c035 --- /dev/null +++ b/packages/datadog-api-client-v2/models/RecommendationV2RequestData.ts @@ -0,0 +1,65 @@ +/** + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ +import { RecommendationV2RequestAttributes } from "./RecommendationV2RequestAttributes"; +import { RecommendationV2RequestType } from "./RecommendationV2RequestType"; + +import { AttributeTypeMap } from "../../datadog-api-client-common/util"; + +/** + * JSON:API resource object for the SPA v2 recommendation request. + */ +export class RecommendationV2RequestData { + /** + * Attributes for requesting SPA recommendations by forwarding a Spark job's raw arguments + * instead of a precomputed shard. + */ + "attributes": RecommendationV2RequestAttributes; + /** + * JSON:API resource type for the SPA v2 recommendation request. + */ + "type": RecommendationV2RequestType; + + /** + * A container for additional, undeclared properties. + * This is a holder for any undeclared properties as specified with + * the 'additionalProperties' keyword in the OAS document. + */ + "additionalProperties"?: { [key: string]: any }; + + /** + * @ignore + */ + "_unparsed"?: boolean; + + /** + * @ignore + */ + static readonly attributeTypeMap: AttributeTypeMap = { + attributes: { + baseName: "attributes", + type: "RecommendationV2RequestAttributes", + required: true, + }, + type: { + baseName: "type", + type: "RecommendationV2RequestType", + required: true, + }, + additionalProperties: { + baseName: "additionalProperties", + type: "{ [key: string]: any; }", + }, + }; + + /** + * @ignore + */ + static getAttributeTypeMap(): AttributeTypeMap { + return RecommendationV2RequestData.attributeTypeMap; + } + + public constructor() {} +} diff --git a/packages/datadog-api-client-v2/models/RecommendationV2RequestType.ts b/packages/datadog-api-client-v2/models/RecommendationV2RequestType.ts new file mode 100644 index 000000000000..a2fdac4b4248 --- /dev/null +++ b/packages/datadog-api-client-v2/models/RecommendationV2RequestType.ts @@ -0,0 +1,16 @@ +/** + * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License. + * This product includes software developed at Datadog (https://www.datadoghq.com/). + * Copyright 2020-Present Datadog, Inc. + */ + +import { UnparsedObject } from "../../datadog-api-client-common/util"; + +/** + * JSON:API resource type for the SPA v2 recommendation request. + */ + +export type RecommendationV2RequestType = + | typeof RECOMMENDATION_V2_REQUEST + | UnparsedObject; +export const RECOMMENDATION_V2_REQUEST = "recommendation_v2_request";