@stacksjs/ts-cloud 0.1.2 → 0.1.5
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.
- package/README.md +98 -13
- package/dist/aws/acm.d.ts +129 -0
- package/dist/aws/application-autoscaling.d.ts +282 -0
- package/dist/aws/bedrock.d.ts +2292 -0
- package/dist/aws/client.d.ts +79 -0
- package/dist/aws/cloudformation.d.ts +105 -0
- package/dist/aws/cloudfront.d.ts +265 -0
- package/dist/aws/cloudwatch-logs.d.ts +48 -0
- package/dist/aws/comprehend.d.ts +505 -0
- package/dist/aws/connect.d.ts +377 -0
- package/dist/aws/deploy-imap.d.ts +14 -0
- package/dist/aws/dynamodb.d.ts +176 -0
- package/dist/aws/ec2.d.ts +272 -0
- package/dist/aws/ecr.d.ts +149 -0
- package/dist/aws/ecs.d.ts +162 -0
- package/dist/aws/elasticache.d.ts +71 -0
- package/dist/aws/elbv2.d.ts +248 -0
- package/dist/aws/email.d.ts +175 -0
- package/dist/aws/eventbridge.d.ts +142 -0
- package/dist/aws/iam.d.ts +638 -0
- package/dist/aws/imap-server.d.ts +119 -0
- package/{src/aws/index.ts → dist/aws/index.d.ts} +62 -83
- package/{src/aws/kendra.ts → dist/aws/kendra.d.ts} +71 -386
- package/dist/aws/lambda.d.ts +232 -0
- package/dist/aws/opensearch.d.ts +87 -0
- package/dist/aws/personalize.d.ts +516 -0
- package/dist/aws/polly.d.ts +214 -0
- package/dist/aws/rds.d.ts +240 -0
- package/dist/aws/rekognition.d.ts +543 -0
- package/dist/aws/route53-domains.d.ts +113 -0
- package/dist/aws/route53.d.ts +215 -0
- package/dist/aws/s3.d.ts +212 -0
- package/dist/aws/scheduler.d.ts +140 -0
- package/dist/aws/secrets-manager.d.ts +170 -0
- package/dist/aws/ses.d.ts +288 -0
- package/dist/aws/setup-phone.d.ts +0 -0
- package/dist/aws/setup-sms.d.ts +115 -0
- package/dist/aws/sms.d.ts +304 -0
- package/dist/aws/smtp-server.d.ts +61 -0
- package/dist/aws/sns.d.ts +117 -0
- package/dist/aws/sqs.d.ts +65 -0
- package/dist/aws/ssm.d.ts +179 -0
- package/dist/aws/sts.d.ts +15 -0
- package/dist/aws/support.d.ts +104 -0
- package/dist/aws/test-imap.d.ts +0 -0
- package/dist/aws/textract.d.ts +403 -0
- package/dist/aws/transcribe.d.ts +60 -0
- package/dist/aws/translate.d.ts +358 -0
- package/dist/aws/voice.d.ts +219 -0
- package/dist/bin/cli.js +1724 -0
- package/dist/config.d.ts +7 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/static-site-external-dns.d.ts +51 -0
- package/dist/deploy/static-site.d.ts +71 -0
- package/dist/dns/cloudflare.d.ts +52 -0
- package/dist/dns/godaddy.d.ts +38 -0
- package/dist/dns/index.d.ts +45 -0
- package/dist/dns/porkbun.d.ts +18 -0
- package/dist/dns/route53-adapter.d.ts +38 -0
- package/{src/dns/types.ts → dist/dns/types.d.ts} +26 -63
- package/dist/dns/validator.d.ts +78 -0
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/infrastructure.d.ts +30 -0
- package/{src/index.ts → dist/index.d.ts} +70 -93
- package/dist/index.js +7881 -0
- package/dist/push/apns.d.ts +60 -0
- package/dist/push/fcm.d.ts +117 -0
- package/dist/push/index.d.ts +14 -0
- package/dist/security/pre-deploy-scanner.d.ts +69 -0
- package/dist/ssl/acme-client.d.ts +67 -0
- package/dist/ssl/index.d.ts +2 -0
- package/dist/ssl/letsencrypt.d.ts +48 -0
- package/dist/types.d.ts +1 -0
- package/dist/utils/cli.d.ts +123 -0
- package/dist/validation/index.d.ts +1 -0
- package/dist/validation/template.d.ts +23 -0
- package/package.json +8 -8
- package/bin/cli.ts +0 -133
- package/bin/commands/analytics.ts +0 -328
- package/bin/commands/api.ts +0 -379
- package/bin/commands/assets.ts +0 -221
- package/bin/commands/audit.ts +0 -501
- package/bin/commands/backup.ts +0 -682
- package/bin/commands/cache.ts +0 -294
- package/bin/commands/cdn.ts +0 -281
- package/bin/commands/config.ts +0 -202
- package/bin/commands/container.ts +0 -105
- package/bin/commands/cost.ts +0 -208
- package/bin/commands/database.ts +0 -401
- package/bin/commands/deploy.ts +0 -674
- package/bin/commands/domain.ts +0 -397
- package/bin/commands/email.ts +0 -423
- package/bin/commands/environment.ts +0 -285
- package/bin/commands/events.ts +0 -424
- package/bin/commands/firewall.ts +0 -145
- package/bin/commands/function.ts +0 -116
- package/bin/commands/generate.ts +0 -280
- package/bin/commands/git.ts +0 -139
- package/bin/commands/iam.ts +0 -464
- package/bin/commands/index.ts +0 -48
- package/bin/commands/init.ts +0 -120
- package/bin/commands/logs.ts +0 -148
- package/bin/commands/network.ts +0 -579
- package/bin/commands/notify.ts +0 -489
- package/bin/commands/queue.ts +0 -407
- package/bin/commands/scheduler.ts +0 -370
- package/bin/commands/secrets.ts +0 -54
- package/bin/commands/server.ts +0 -629
- package/bin/commands/shared.ts +0 -97
- package/bin/commands/ssl.ts +0 -138
- package/bin/commands/stack.ts +0 -325
- package/bin/commands/status.ts +0 -385
- package/bin/commands/storage.ts +0 -450
- package/bin/commands/team.ts +0 -96
- package/bin/commands/tunnel.ts +0 -489
- package/bin/commands/utils.ts +0 -202
- package/build.ts +0 -15
- package/cloud +0 -2
- package/src/aws/acm.ts +0 -768
- package/src/aws/application-autoscaling.ts +0 -845
- package/src/aws/bedrock.ts +0 -4074
- package/src/aws/client.ts +0 -878
- package/src/aws/cloudformation.ts +0 -896
- package/src/aws/cloudfront.ts +0 -1531
- package/src/aws/cloudwatch-logs.ts +0 -154
- package/src/aws/comprehend.ts +0 -839
- package/src/aws/connect.ts +0 -1056
- package/src/aws/deploy-imap.ts +0 -384
- package/src/aws/dynamodb.ts +0 -340
- package/src/aws/ec2.ts +0 -1385
- package/src/aws/ecr.ts +0 -621
- package/src/aws/ecs.ts +0 -615
- package/src/aws/elasticache.ts +0 -301
- package/src/aws/elbv2.ts +0 -942
- package/src/aws/email.ts +0 -928
- package/src/aws/eventbridge.ts +0 -248
- package/src/aws/iam.ts +0 -1689
- package/src/aws/imap-server.ts +0 -2100
- package/src/aws/lambda.ts +0 -786
- package/src/aws/opensearch.ts +0 -158
- package/src/aws/personalize.ts +0 -977
- package/src/aws/polly.ts +0 -559
- package/src/aws/rds.ts +0 -888
- package/src/aws/rekognition.ts +0 -846
- package/src/aws/route53-domains.ts +0 -359
- package/src/aws/route53.ts +0 -1046
- package/src/aws/s3.ts +0 -2318
- package/src/aws/scheduler.ts +0 -571
- package/src/aws/secrets-manager.ts +0 -769
- package/src/aws/ses.ts +0 -1081
- package/src/aws/setup-phone.ts +0 -104
- package/src/aws/setup-sms.ts +0 -580
- package/src/aws/sms.ts +0 -1735
- package/src/aws/smtp-server.ts +0 -531
- package/src/aws/sns.ts +0 -758
- package/src/aws/sqs.ts +0 -382
- package/src/aws/ssm.ts +0 -807
- package/src/aws/sts.ts +0 -92
- package/src/aws/support.ts +0 -391
- package/src/aws/test-imap.ts +0 -86
- package/src/aws/textract.ts +0 -780
- package/src/aws/transcribe.ts +0 -108
- package/src/aws/translate.ts +0 -641
- package/src/aws/voice.ts +0 -1379
- package/src/config.ts +0 -35
- package/src/deploy/index.ts +0 -7
- package/src/deploy/static-site-external-dns.ts +0 -906
- package/src/deploy/static-site.ts +0 -1125
- package/src/dns/godaddy.ts +0 -412
- package/src/dns/index.ts +0 -183
- package/src/dns/porkbun.ts +0 -362
- package/src/dns/route53-adapter.ts +0 -414
- package/src/dns/validator.ts +0 -369
- package/src/generators/index.ts +0 -5
- package/src/generators/infrastructure.ts +0 -1660
- package/src/push/apns.ts +0 -452
- package/src/push/fcm.ts +0 -506
- package/src/push/index.ts +0 -58
- package/src/ssl/acme-client.ts +0 -478
- package/src/ssl/index.ts +0 -7
- package/src/ssl/letsencrypt.ts +0 -747
- package/src/types.ts +0 -2
- package/src/utils/cli.ts +0 -398
- package/src/validation/index.ts +0 -5
- package/src/validation/template.ts +0 -405
- package/test/index.test.ts +0 -128
- package/tsconfig.json +0 -18
package/src/aws/personalize.ts
DELETED
|
@@ -1,977 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AWS Personalize Client
|
|
3
|
-
* Recommendation engine service
|
|
4
|
-
* No external SDK dependencies - implements AWS Signature V4 directly
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { AWSClient } from './client'
|
|
8
|
-
|
|
9
|
-
// ============================================================================
|
|
10
|
-
// Types
|
|
11
|
-
// ============================================================================
|
|
12
|
-
|
|
13
|
-
export interface CreateDatasetGroupCommandInput {
|
|
14
|
-
name: string
|
|
15
|
-
roleArn?: string
|
|
16
|
-
kmsKeyArn?: string
|
|
17
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
18
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface CreateDatasetGroupCommandOutput {
|
|
22
|
-
datasetGroupArn?: string
|
|
23
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface DescribeDatasetGroupCommandInput {
|
|
27
|
-
datasetGroupArn: string
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface DatasetGroup {
|
|
31
|
-
name?: string
|
|
32
|
-
datasetGroupArn?: string
|
|
33
|
-
status?: string
|
|
34
|
-
roleArn?: string
|
|
35
|
-
kmsKeyArn?: string
|
|
36
|
-
creationDateTime?: string
|
|
37
|
-
lastUpdatedDateTime?: string
|
|
38
|
-
failureReason?: string
|
|
39
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface DescribeDatasetGroupCommandOutput {
|
|
43
|
-
datasetGroup?: DatasetGroup
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface ListDatasetGroupsCommandInput {
|
|
47
|
-
nextToken?: string
|
|
48
|
-
maxResults?: number
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface DatasetGroupSummary {
|
|
52
|
-
name?: string
|
|
53
|
-
datasetGroupArn?: string
|
|
54
|
-
status?: string
|
|
55
|
-
creationDateTime?: string
|
|
56
|
-
lastUpdatedDateTime?: string
|
|
57
|
-
failureReason?: string
|
|
58
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export interface ListDatasetGroupsCommandOutput {
|
|
62
|
-
datasetGroups?: DatasetGroupSummary[]
|
|
63
|
-
nextToken?: string
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface CreateSchemaCommandInput {
|
|
67
|
-
name: string
|
|
68
|
-
schema: string
|
|
69
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface CreateSchemaCommandOutput {
|
|
73
|
-
schemaArn?: string
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export interface CreateDatasetCommandInput {
|
|
77
|
-
name: string
|
|
78
|
-
schemaArn: string
|
|
79
|
-
datasetGroupArn: string
|
|
80
|
-
datasetType: 'Interactions' | 'Items' | 'Users' | 'Actions' | 'Action_Interactions'
|
|
81
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export interface CreateDatasetCommandOutput {
|
|
85
|
-
datasetArn?: string
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export interface CreateDatasetImportJobCommandInput {
|
|
89
|
-
jobName: string
|
|
90
|
-
datasetArn: string
|
|
91
|
-
dataSource: {
|
|
92
|
-
dataLocation: string
|
|
93
|
-
}
|
|
94
|
-
roleArn: string
|
|
95
|
-
importMode?: 'FULL' | 'INCREMENTAL'
|
|
96
|
-
publishAttributionMetricsToS3?: boolean
|
|
97
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export interface CreateDatasetImportJobCommandOutput {
|
|
101
|
-
datasetImportJobArn?: string
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export interface DescribeDatasetImportJobCommandInput {
|
|
105
|
-
datasetImportJobArn: string
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export interface DatasetImportJob {
|
|
109
|
-
jobName?: string
|
|
110
|
-
datasetImportJobArn?: string
|
|
111
|
-
datasetArn?: string
|
|
112
|
-
dataSource?: {
|
|
113
|
-
dataLocation?: string
|
|
114
|
-
}
|
|
115
|
-
roleArn?: string
|
|
116
|
-
status?: string
|
|
117
|
-
creationDateTime?: string
|
|
118
|
-
lastUpdatedDateTime?: string
|
|
119
|
-
failureReason?: string
|
|
120
|
-
importMode?: 'FULL' | 'INCREMENTAL'
|
|
121
|
-
publishAttributionMetricsToS3?: boolean
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export interface DescribeDatasetImportJobCommandOutput {
|
|
125
|
-
datasetImportJob?: DatasetImportJob
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export interface CreateSolutionCommandInput {
|
|
129
|
-
name: string
|
|
130
|
-
datasetGroupArn: string
|
|
131
|
-
recipeArn?: string
|
|
132
|
-
eventType?: string
|
|
133
|
-
solutionConfig?: {
|
|
134
|
-
eventValueThreshold?: string
|
|
135
|
-
hpoConfig?: {
|
|
136
|
-
hpoObjective?: {
|
|
137
|
-
type?: string
|
|
138
|
-
metricName?: string
|
|
139
|
-
metricRegex?: string
|
|
140
|
-
}
|
|
141
|
-
hpoResourceConfig?: {
|
|
142
|
-
maxNumberOfTrainingJobs?: string
|
|
143
|
-
maxParallelTrainingJobs?: string
|
|
144
|
-
}
|
|
145
|
-
algorithmHyperParameterRanges?: {
|
|
146
|
-
integerHyperParameterRanges?: Array<{
|
|
147
|
-
name?: string
|
|
148
|
-
minValue?: number
|
|
149
|
-
maxValue?: number
|
|
150
|
-
}>
|
|
151
|
-
continuousHyperParameterRanges?: Array<{
|
|
152
|
-
name?: string
|
|
153
|
-
minValue?: number
|
|
154
|
-
maxValue?: number
|
|
155
|
-
}>
|
|
156
|
-
categoricalHyperParameterRanges?: Array<{
|
|
157
|
-
name?: string
|
|
158
|
-
values?: string[]
|
|
159
|
-
}>
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
algorithmHyperParameters?: Record<string, string>
|
|
163
|
-
featureTransformationParameters?: Record<string, string>
|
|
164
|
-
autoMLConfig?: {
|
|
165
|
-
metricName?: string
|
|
166
|
-
recipeList?: string[]
|
|
167
|
-
}
|
|
168
|
-
optimizationObjective?: {
|
|
169
|
-
itemAttribute?: string
|
|
170
|
-
objectiveSensitivity?: 'LOW' | 'MEDIUM' | 'HIGH' | 'OFF'
|
|
171
|
-
}
|
|
172
|
-
trainingDataConfig?: {
|
|
173
|
-
excludedDatasetColumns?: Record<string, string[]>
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
performHPO?: boolean
|
|
177
|
-
performAutoML?: boolean
|
|
178
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
export interface CreateSolutionCommandOutput {
|
|
182
|
-
solutionArn?: string
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export interface CreateSolutionVersionCommandInput {
|
|
186
|
-
name?: string
|
|
187
|
-
solutionArn: string
|
|
188
|
-
trainingMode?: 'FULL' | 'UPDATE' | 'AUTOTRAIN'
|
|
189
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export interface CreateSolutionVersionCommandOutput {
|
|
193
|
-
solutionVersionArn?: string
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export interface DescribeSolutionVersionCommandInput {
|
|
197
|
-
solutionVersionArn: string
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export interface SolutionVersion {
|
|
201
|
-
name?: string
|
|
202
|
-
solutionVersionArn?: string
|
|
203
|
-
solutionArn?: string
|
|
204
|
-
performHPO?: boolean
|
|
205
|
-
performAutoML?: boolean
|
|
206
|
-
recipeArn?: string
|
|
207
|
-
eventType?: string
|
|
208
|
-
datasetGroupArn?: string
|
|
209
|
-
solutionConfig?: {
|
|
210
|
-
eventValueThreshold?: string
|
|
211
|
-
hpoConfig?: Record<string, unknown>
|
|
212
|
-
algorithmHyperParameters?: Record<string, string>
|
|
213
|
-
featureTransformationParameters?: Record<string, string>
|
|
214
|
-
autoMLConfig?: Record<string, unknown>
|
|
215
|
-
}
|
|
216
|
-
trainingHours?: number
|
|
217
|
-
trainingMode?: 'FULL' | 'UPDATE' | 'AUTOTRAIN'
|
|
218
|
-
tunedHPOParams?: {
|
|
219
|
-
algorithmHyperParameters?: Record<string, string>
|
|
220
|
-
}
|
|
221
|
-
status?: string
|
|
222
|
-
failureReason?: string
|
|
223
|
-
creationDateTime?: string
|
|
224
|
-
lastUpdatedDateTime?: string
|
|
225
|
-
trainingType?: 'AUTOMATIC' | 'MANUAL'
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export interface DescribeSolutionVersionCommandOutput {
|
|
229
|
-
solutionVersion?: SolutionVersion
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
export interface CreateCampaignCommandInput {
|
|
233
|
-
name: string
|
|
234
|
-
solutionVersionArn: string
|
|
235
|
-
minProvisionedTPS?: number
|
|
236
|
-
campaignConfig?: {
|
|
237
|
-
itemExplorationConfig?: Record<string, string>
|
|
238
|
-
enableMetadataWithRecommendations?: boolean
|
|
239
|
-
syncWithLatestSolutionVersion?: boolean
|
|
240
|
-
}
|
|
241
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
export interface CreateCampaignCommandOutput {
|
|
245
|
-
campaignArn?: string
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
export interface DescribeCampaignCommandInput {
|
|
249
|
-
campaignArn: string
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export interface Campaign {
|
|
253
|
-
name?: string
|
|
254
|
-
campaignArn?: string
|
|
255
|
-
solutionVersionArn?: string
|
|
256
|
-
minProvisionedTPS?: number
|
|
257
|
-
campaignConfig?: {
|
|
258
|
-
itemExplorationConfig?: Record<string, string>
|
|
259
|
-
enableMetadataWithRecommendations?: boolean
|
|
260
|
-
syncWithLatestSolutionVersion?: boolean
|
|
261
|
-
}
|
|
262
|
-
status?: string
|
|
263
|
-
failureReason?: string
|
|
264
|
-
creationDateTime?: string
|
|
265
|
-
lastUpdatedDateTime?: string
|
|
266
|
-
latestCampaignUpdate?: {
|
|
267
|
-
solutionVersionArn?: string
|
|
268
|
-
minProvisionedTPS?: number
|
|
269
|
-
campaignConfig?: Record<string, unknown>
|
|
270
|
-
status?: string
|
|
271
|
-
failureReason?: string
|
|
272
|
-
creationDateTime?: string
|
|
273
|
-
lastUpdatedDateTime?: string
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
export interface DescribeCampaignCommandOutput {
|
|
278
|
-
campaign?: Campaign
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
export interface GetRecommendationsCommandInput {
|
|
282
|
-
campaignArn?: string
|
|
283
|
-
recommenderArn?: string
|
|
284
|
-
itemId?: string
|
|
285
|
-
userId?: string
|
|
286
|
-
numResults?: number
|
|
287
|
-
context?: Record<string, string>
|
|
288
|
-
filterArn?: string
|
|
289
|
-
filterValues?: Record<string, string>
|
|
290
|
-
promotions?: Array<{
|
|
291
|
-
name?: string
|
|
292
|
-
percentPromotedItems?: number
|
|
293
|
-
filterArn?: string
|
|
294
|
-
filterValues?: Record<string, string>
|
|
295
|
-
}>
|
|
296
|
-
metadataColumns?: Record<string, string[]>
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
export interface PredictedItem {
|
|
300
|
-
itemId?: string
|
|
301
|
-
score?: number
|
|
302
|
-
promotionName?: string
|
|
303
|
-
metadata?: Record<string, string>
|
|
304
|
-
reason?: string[]
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
export interface GetRecommendationsCommandOutput {
|
|
308
|
-
itemList?: PredictedItem[]
|
|
309
|
-
recommendationId?: string
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
export interface GetPersonalizedRankingCommandInput {
|
|
313
|
-
campaignArn: string
|
|
314
|
-
inputList: string[]
|
|
315
|
-
userId: string
|
|
316
|
-
context?: Record<string, string>
|
|
317
|
-
filterArn?: string
|
|
318
|
-
filterValues?: Record<string, string>
|
|
319
|
-
metadataColumns?: Record<string, string[]>
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
export interface GetPersonalizedRankingCommandOutput {
|
|
323
|
-
personalizedRanking?: PredictedItem[]
|
|
324
|
-
recommendationId?: string
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
export interface CreateRecommenderCommandInput {
|
|
328
|
-
name: string
|
|
329
|
-
datasetGroupArn: string
|
|
330
|
-
recipeArn: string
|
|
331
|
-
recommenderConfig?: {
|
|
332
|
-
itemExplorationConfig?: Record<string, string>
|
|
333
|
-
minRecommendationRequestsPerSecond?: number
|
|
334
|
-
trainingDataConfig?: {
|
|
335
|
-
excludedDatasetColumns?: Record<string, string[]>
|
|
336
|
-
}
|
|
337
|
-
enableMetadataWithRecommendations?: boolean
|
|
338
|
-
}
|
|
339
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
export interface CreateRecommenderCommandOutput {
|
|
343
|
-
recommenderArn?: string
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
export interface DescribeRecommenderCommandInput {
|
|
347
|
-
recommenderArn: string
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
export interface Recommender {
|
|
351
|
-
recommenderArn?: string
|
|
352
|
-
datasetGroupArn?: string
|
|
353
|
-
name?: string
|
|
354
|
-
recipeArn?: string
|
|
355
|
-
recommenderConfig?: {
|
|
356
|
-
itemExplorationConfig?: Record<string, string>
|
|
357
|
-
minRecommendationRequestsPerSecond?: number
|
|
358
|
-
trainingDataConfig?: {
|
|
359
|
-
excludedDatasetColumns?: Record<string, string[]>
|
|
360
|
-
}
|
|
361
|
-
enableMetadataWithRecommendations?: boolean
|
|
362
|
-
}
|
|
363
|
-
creationDateTime?: string
|
|
364
|
-
lastUpdatedDateTime?: string
|
|
365
|
-
status?: string
|
|
366
|
-
failureReason?: string
|
|
367
|
-
latestRecommenderUpdate?: {
|
|
368
|
-
recommenderConfig?: Record<string, unknown>
|
|
369
|
-
creationDateTime?: string
|
|
370
|
-
lastUpdatedDateTime?: string
|
|
371
|
-
status?: string
|
|
372
|
-
failureReason?: string
|
|
373
|
-
}
|
|
374
|
-
modelMetrics?: Record<string, number>
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
export interface DescribeRecommenderCommandOutput {
|
|
378
|
-
recommender?: Recommender
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
export interface ListRecommendersCommandInput {
|
|
382
|
-
datasetGroupArn?: string
|
|
383
|
-
nextToken?: string
|
|
384
|
-
maxResults?: number
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
export interface RecommenderSummary {
|
|
388
|
-
name?: string
|
|
389
|
-
recommenderArn?: string
|
|
390
|
-
datasetGroupArn?: string
|
|
391
|
-
recipeArn?: string
|
|
392
|
-
recommenderConfig?: Record<string, unknown>
|
|
393
|
-
status?: string
|
|
394
|
-
creationDateTime?: string
|
|
395
|
-
lastUpdatedDateTime?: string
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
export interface ListRecommendersCommandOutput {
|
|
399
|
-
recommenders?: RecommenderSummary[]
|
|
400
|
-
nextToken?: string
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export interface PutEventsCommandInput {
|
|
404
|
-
trackingId: string
|
|
405
|
-
userId?: string
|
|
406
|
-
sessionId: string
|
|
407
|
-
eventList: Array<{
|
|
408
|
-
eventId?: string
|
|
409
|
-
eventType: string
|
|
410
|
-
eventValue?: number
|
|
411
|
-
itemId?: string
|
|
412
|
-
properties?: string
|
|
413
|
-
sentAt: Date | string
|
|
414
|
-
recommendationId?: string
|
|
415
|
-
impression?: string[]
|
|
416
|
-
metricAttribution?: {
|
|
417
|
-
eventAttributionSource?: string
|
|
418
|
-
}
|
|
419
|
-
}>
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
export interface PutEventsCommandOutput {
|
|
423
|
-
// Empty
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
export interface PutItemsCommandInput {
|
|
427
|
-
datasetArn: string
|
|
428
|
-
items: Array<{
|
|
429
|
-
itemId: string
|
|
430
|
-
properties?: string
|
|
431
|
-
}>
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
export interface PutItemsCommandOutput {
|
|
435
|
-
// Empty
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
export interface PutUsersCommandInput {
|
|
439
|
-
datasetArn: string
|
|
440
|
-
users: Array<{
|
|
441
|
-
userId: string
|
|
442
|
-
properties?: string
|
|
443
|
-
}>
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
export interface PutUsersCommandOutput {
|
|
447
|
-
// Empty
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
export interface CreateEventTrackerCommandInput {
|
|
451
|
-
name: string
|
|
452
|
-
datasetGroupArn: string
|
|
453
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
export interface CreateEventTrackerCommandOutput {
|
|
457
|
-
eventTrackerArn?: string
|
|
458
|
-
trackingId?: string
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
export interface DescribeEventTrackerCommandInput {
|
|
462
|
-
eventTrackerArn: string
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
export interface EventTracker {
|
|
466
|
-
name?: string
|
|
467
|
-
eventTrackerArn?: string
|
|
468
|
-
accountId?: string
|
|
469
|
-
trackingId?: string
|
|
470
|
-
datasetGroupArn?: string
|
|
471
|
-
status?: string
|
|
472
|
-
creationDateTime?: string
|
|
473
|
-
lastUpdatedDateTime?: string
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
export interface DescribeEventTrackerCommandOutput {
|
|
477
|
-
eventTracker?: EventTracker
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
export interface CreateFilterCommandInput {
|
|
481
|
-
name: string
|
|
482
|
-
datasetGroupArn: string
|
|
483
|
-
filterExpression: string
|
|
484
|
-
tags?: Array<{ tagKey: string; tagValue: string }>
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
export interface CreateFilterCommandOutput {
|
|
488
|
-
filterArn?: string
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
export interface ListRecipesCommandInput {
|
|
492
|
-
recipeProvider?: 'SERVICE'
|
|
493
|
-
nextToken?: string
|
|
494
|
-
maxResults?: number
|
|
495
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
export interface RecipeSummary {
|
|
499
|
-
name?: string
|
|
500
|
-
recipeArn?: string
|
|
501
|
-
status?: string
|
|
502
|
-
creationDateTime?: string
|
|
503
|
-
lastUpdatedDateTime?: string
|
|
504
|
-
domain?: 'ECOMMERCE' | 'VIDEO_ON_DEMAND'
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
export interface ListRecipesCommandOutput {
|
|
508
|
-
recipes?: RecipeSummary[]
|
|
509
|
-
nextToken?: string
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
// ============================================================================
|
|
513
|
-
// Personalize Client
|
|
514
|
-
// ============================================================================
|
|
515
|
-
|
|
516
|
-
export class PersonalizeClient {
|
|
517
|
-
private client: AWSClient
|
|
518
|
-
private region: string
|
|
519
|
-
|
|
520
|
-
constructor(region: string = 'us-east-1') {
|
|
521
|
-
this.region = region
|
|
522
|
-
this.client = new AWSClient()
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
private async request<T>(action: string, params: Record<string, unknown>): Promise<T> {
|
|
526
|
-
return this.client.request({
|
|
527
|
-
service: 'personalize',
|
|
528
|
-
region: this.region,
|
|
529
|
-
method: 'POST',
|
|
530
|
-
path: '/',
|
|
531
|
-
headers: {
|
|
532
|
-
'Content-Type': 'application/x-amz-json-1.1',
|
|
533
|
-
'X-Amz-Target': `AmazonPersonalize.${action}`,
|
|
534
|
-
},
|
|
535
|
-
body: JSON.stringify(params),
|
|
536
|
-
})
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// -------------------------------------------------------------------------
|
|
540
|
-
// Dataset Groups
|
|
541
|
-
// -------------------------------------------------------------------------
|
|
542
|
-
|
|
543
|
-
async createDatasetGroup(params: CreateDatasetGroupCommandInput): Promise<CreateDatasetGroupCommandOutput> {
|
|
544
|
-
return this.request('CreateDatasetGroup', params as unknown as Record<string, unknown>)
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
async describeDatasetGroup(params: DescribeDatasetGroupCommandInput): Promise<DescribeDatasetGroupCommandOutput> {
|
|
548
|
-
return this.request('DescribeDatasetGroup', params as unknown as Record<string, unknown>)
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
async listDatasetGroups(params?: ListDatasetGroupsCommandInput): Promise<ListDatasetGroupsCommandOutput> {
|
|
552
|
-
return this.request('ListDatasetGroups', (params || {}) as unknown as Record<string, unknown>)
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
// -------------------------------------------------------------------------
|
|
556
|
-
// Schemas
|
|
557
|
-
// -------------------------------------------------------------------------
|
|
558
|
-
|
|
559
|
-
async createSchema(params: CreateSchemaCommandInput): Promise<CreateSchemaCommandOutput> {
|
|
560
|
-
return this.request('CreateSchema', params as unknown as Record<string, unknown>)
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
// -------------------------------------------------------------------------
|
|
564
|
-
// Datasets
|
|
565
|
-
// -------------------------------------------------------------------------
|
|
566
|
-
|
|
567
|
-
async createDataset(params: CreateDatasetCommandInput): Promise<CreateDatasetCommandOutput> {
|
|
568
|
-
return this.request('CreateDataset', params as unknown as Record<string, unknown>)
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
async createDatasetImportJob(params: CreateDatasetImportJobCommandInput): Promise<CreateDatasetImportJobCommandOutput> {
|
|
572
|
-
return this.request('CreateDatasetImportJob', params as unknown as Record<string, unknown>)
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
async describeDatasetImportJob(params: DescribeDatasetImportJobCommandInput): Promise<DescribeDatasetImportJobCommandOutput> {
|
|
576
|
-
return this.request('DescribeDatasetImportJob', params as unknown as Record<string, unknown>)
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
// -------------------------------------------------------------------------
|
|
580
|
-
// Solutions
|
|
581
|
-
// -------------------------------------------------------------------------
|
|
582
|
-
|
|
583
|
-
async createSolution(params: CreateSolutionCommandInput): Promise<CreateSolutionCommandOutput> {
|
|
584
|
-
return this.request('CreateSolution', params as unknown as Record<string, unknown>)
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
async createSolutionVersion(params: CreateSolutionVersionCommandInput): Promise<CreateSolutionVersionCommandOutput> {
|
|
588
|
-
return this.request('CreateSolutionVersion', params as unknown as Record<string, unknown>)
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
async describeSolutionVersion(params: DescribeSolutionVersionCommandInput): Promise<DescribeSolutionVersionCommandOutput> {
|
|
592
|
-
return this.request('DescribeSolutionVersion', params as unknown as Record<string, unknown>)
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
// -------------------------------------------------------------------------
|
|
596
|
-
// Campaigns
|
|
597
|
-
// -------------------------------------------------------------------------
|
|
598
|
-
|
|
599
|
-
async createCampaign(params: CreateCampaignCommandInput): Promise<CreateCampaignCommandOutput> {
|
|
600
|
-
return this.request('CreateCampaign', params as unknown as Record<string, unknown>)
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
async describeCampaign(params: DescribeCampaignCommandInput): Promise<DescribeCampaignCommandOutput> {
|
|
604
|
-
return this.request('DescribeCampaign', params as unknown as Record<string, unknown>)
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
// -------------------------------------------------------------------------
|
|
608
|
-
// Recommenders (Domain Datasets)
|
|
609
|
-
// -------------------------------------------------------------------------
|
|
610
|
-
|
|
611
|
-
async createRecommender(params: CreateRecommenderCommandInput): Promise<CreateRecommenderCommandOutput> {
|
|
612
|
-
return this.request('CreateRecommender', params as unknown as Record<string, unknown>)
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
async describeRecommender(params: DescribeRecommenderCommandInput): Promise<DescribeRecommenderCommandOutput> {
|
|
616
|
-
return this.request('DescribeRecommender', params as unknown as Record<string, unknown>)
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
async listRecommenders(params?: ListRecommendersCommandInput): Promise<ListRecommendersCommandOutput> {
|
|
620
|
-
return this.request('ListRecommenders', (params || {}) as unknown as Record<string, unknown>)
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
// -------------------------------------------------------------------------
|
|
624
|
-
// Events & Real-time Data
|
|
625
|
-
// -------------------------------------------------------------------------
|
|
626
|
-
|
|
627
|
-
async createEventTracker(params: CreateEventTrackerCommandInput): Promise<CreateEventTrackerCommandOutput> {
|
|
628
|
-
return this.request('CreateEventTracker', params as unknown as Record<string, unknown>)
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
async describeEventTracker(params: DescribeEventTrackerCommandInput): Promise<DescribeEventTrackerCommandOutput> {
|
|
632
|
-
return this.request('DescribeEventTracker', params as unknown as Record<string, unknown>)
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
// -------------------------------------------------------------------------
|
|
636
|
-
// Filters
|
|
637
|
-
// -------------------------------------------------------------------------
|
|
638
|
-
|
|
639
|
-
async createFilter(params: CreateFilterCommandInput): Promise<CreateFilterCommandOutput> {
|
|
640
|
-
return this.request('CreateFilter', params as unknown as Record<string, unknown>)
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
// -------------------------------------------------------------------------
|
|
644
|
-
// Recipes
|
|
645
|
-
// -------------------------------------------------------------------------
|
|
646
|
-
|
|
647
|
-
async listRecipes(params?: ListRecipesCommandInput): Promise<ListRecipesCommandOutput> {
|
|
648
|
-
return this.request('ListRecipes', (params || {}) as unknown as Record<string, unknown>)
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
// -------------------------------------------------------------------------
|
|
652
|
-
// Convenience Methods
|
|
653
|
-
// -------------------------------------------------------------------------
|
|
654
|
-
|
|
655
|
-
/**
|
|
656
|
-
* Wait for a solution version to be ready
|
|
657
|
-
*/
|
|
658
|
-
async waitForSolutionVersion(
|
|
659
|
-
solutionVersionArn: string,
|
|
660
|
-
options?: { maxWaitMs?: number; pollIntervalMs?: number },
|
|
661
|
-
): Promise<SolutionVersion> {
|
|
662
|
-
const maxWaitMs = options?.maxWaitMs ?? 7200000 // 2 hours
|
|
663
|
-
const pollIntervalMs = options?.pollIntervalMs ?? 60000 // 1 minute
|
|
664
|
-
const startTime = Date.now()
|
|
665
|
-
|
|
666
|
-
while (Date.now() - startTime < maxWaitMs) {
|
|
667
|
-
const result = await this.describeSolutionVersion({ solutionVersionArn })
|
|
668
|
-
const sv = result.solutionVersion
|
|
669
|
-
|
|
670
|
-
if (sv?.status === 'ACTIVE') {
|
|
671
|
-
return sv
|
|
672
|
-
}
|
|
673
|
-
if (sv?.status === 'CREATE FAILED') {
|
|
674
|
-
throw new Error(`Solution version failed: ${sv.failureReason}`)
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
await new Promise(resolve => setTimeout(resolve, pollIntervalMs))
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
throw new Error(`Timeout waiting for solution version ${solutionVersionArn}`)
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
/**
|
|
684
|
-
* Wait for a campaign to be active
|
|
685
|
-
*/
|
|
686
|
-
async waitForCampaign(
|
|
687
|
-
campaignArn: string,
|
|
688
|
-
options?: { maxWaitMs?: number; pollIntervalMs?: number },
|
|
689
|
-
): Promise<Campaign> {
|
|
690
|
-
const maxWaitMs = options?.maxWaitMs ?? 1800000 // 30 minutes
|
|
691
|
-
const pollIntervalMs = options?.pollIntervalMs ?? 30000
|
|
692
|
-
const startTime = Date.now()
|
|
693
|
-
|
|
694
|
-
while (Date.now() - startTime < maxWaitMs) {
|
|
695
|
-
const result = await this.describeCampaign({ campaignArn })
|
|
696
|
-
const campaign = result.campaign
|
|
697
|
-
|
|
698
|
-
if (campaign?.status === 'ACTIVE') {
|
|
699
|
-
return campaign
|
|
700
|
-
}
|
|
701
|
-
if (campaign?.status === 'CREATE FAILED') {
|
|
702
|
-
throw new Error(`Campaign failed: ${campaign.failureReason}`)
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
await new Promise(resolve => setTimeout(resolve, pollIntervalMs))
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
throw new Error(`Timeout waiting for campaign ${campaignArn}`)
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
/**
|
|
712
|
-
* Wait for a dataset import job to complete
|
|
713
|
-
*/
|
|
714
|
-
async waitForDatasetImportJob(
|
|
715
|
-
jobArn: string,
|
|
716
|
-
options?: { maxWaitMs?: number; pollIntervalMs?: number },
|
|
717
|
-
): Promise<DatasetImportJob> {
|
|
718
|
-
const maxWaitMs = options?.maxWaitMs ?? 3600000 // 1 hour
|
|
719
|
-
const pollIntervalMs = options?.pollIntervalMs ?? 30000
|
|
720
|
-
const startTime = Date.now()
|
|
721
|
-
|
|
722
|
-
while (Date.now() - startTime < maxWaitMs) {
|
|
723
|
-
const result = await this.describeDatasetImportJob({ datasetImportJobArn: jobArn })
|
|
724
|
-
const job = result.datasetImportJob
|
|
725
|
-
|
|
726
|
-
if (job?.status === 'ACTIVE') {
|
|
727
|
-
return job
|
|
728
|
-
}
|
|
729
|
-
if (job?.status === 'CREATE FAILED') {
|
|
730
|
-
throw new Error(`Dataset import job failed: ${job.failureReason}`)
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
await new Promise(resolve => setTimeout(resolve, pollIntervalMs))
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
throw new Error(`Timeout waiting for dataset import job ${jobArn}`)
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
// ============================================================================
|
|
741
|
-
// Personalize Runtime Client (for getting recommendations)
|
|
742
|
-
// ============================================================================
|
|
743
|
-
|
|
744
|
-
export class PersonalizeRuntimeClient {
|
|
745
|
-
private client: AWSClient
|
|
746
|
-
private region: string
|
|
747
|
-
|
|
748
|
-
constructor(region: string = 'us-east-1') {
|
|
749
|
-
this.region = region
|
|
750
|
-
this.client = new AWSClient()
|
|
751
|
-
}
|
|
752
|
-
|
|
753
|
-
private async request<T>(action: string, params: Record<string, unknown>): Promise<T> {
|
|
754
|
-
return this.client.request({
|
|
755
|
-
service: 'personalize-runtime',
|
|
756
|
-
region: this.region,
|
|
757
|
-
method: 'POST',
|
|
758
|
-
path: '/',
|
|
759
|
-
headers: {
|
|
760
|
-
'Content-Type': 'application/x-amz-json-1.1',
|
|
761
|
-
'X-Amz-Target': `AmazonPersonalizeRuntime.${action}`,
|
|
762
|
-
},
|
|
763
|
-
body: JSON.stringify(params),
|
|
764
|
-
})
|
|
765
|
-
}
|
|
766
|
-
|
|
767
|
-
/**
|
|
768
|
-
* Get recommendations for a user
|
|
769
|
-
*/
|
|
770
|
-
async getRecommendations(params: GetRecommendationsCommandInput): Promise<GetRecommendationsCommandOutput> {
|
|
771
|
-
return this.request('GetRecommendations', params as unknown as Record<string, unknown>)
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
/**
|
|
775
|
-
* Get personalized ranking of items for a user
|
|
776
|
-
*/
|
|
777
|
-
async getPersonalizedRanking(params: GetPersonalizedRankingCommandInput): Promise<GetPersonalizedRankingCommandOutput> {
|
|
778
|
-
return this.request('GetPersonalizedRanking', params as unknown as Record<string, unknown>)
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
// -------------------------------------------------------------------------
|
|
782
|
-
// Convenience Methods
|
|
783
|
-
// -------------------------------------------------------------------------
|
|
784
|
-
|
|
785
|
-
/**
|
|
786
|
-
* Simple recommendations for a user
|
|
787
|
-
*/
|
|
788
|
-
async recommendForUser(
|
|
789
|
-
campaignArn: string,
|
|
790
|
-
userId: string,
|
|
791
|
-
numResults: number = 10,
|
|
792
|
-
): Promise<string[]> {
|
|
793
|
-
const result = await this.getRecommendations({
|
|
794
|
-
campaignArn,
|
|
795
|
-
userId,
|
|
796
|
-
numResults,
|
|
797
|
-
})
|
|
798
|
-
return result.itemList?.map(i => i.itemId || '').filter(Boolean) || []
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
/**
|
|
802
|
-
* Get similar items
|
|
803
|
-
*/
|
|
804
|
-
async getSimilarItems(
|
|
805
|
-
campaignArn: string,
|
|
806
|
-
itemId: string,
|
|
807
|
-
numResults: number = 10,
|
|
808
|
-
): Promise<string[]> {
|
|
809
|
-
const result = await this.getRecommendations({
|
|
810
|
-
campaignArn,
|
|
811
|
-
itemId,
|
|
812
|
-
numResults,
|
|
813
|
-
})
|
|
814
|
-
return result.itemList?.map(i => i.itemId || '').filter(Boolean) || []
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
/**
|
|
818
|
-
* Rank items for a user
|
|
819
|
-
*/
|
|
820
|
-
async rankItems(
|
|
821
|
-
campaignArn: string,
|
|
822
|
-
userId: string,
|
|
823
|
-
itemIds: string[],
|
|
824
|
-
): Promise<string[]> {
|
|
825
|
-
const result = await this.getPersonalizedRanking({
|
|
826
|
-
campaignArn,
|
|
827
|
-
userId,
|
|
828
|
-
inputList: itemIds,
|
|
829
|
-
})
|
|
830
|
-
return result.personalizedRanking?.map(i => i.itemId || '').filter(Boolean) || []
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
// ============================================================================
|
|
835
|
-
// Personalize Events Client
|
|
836
|
-
// ============================================================================
|
|
837
|
-
|
|
838
|
-
export class PersonalizeEventsClient {
|
|
839
|
-
private client: AWSClient
|
|
840
|
-
private region: string
|
|
841
|
-
|
|
842
|
-
constructor(region: string = 'us-east-1') {
|
|
843
|
-
this.region = region
|
|
844
|
-
this.client = new AWSClient()
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
private async request<T>(action: string, params: Record<string, unknown>): Promise<T> {
|
|
848
|
-
return this.client.request({
|
|
849
|
-
service: 'personalize-events',
|
|
850
|
-
region: this.region,
|
|
851
|
-
method: 'POST',
|
|
852
|
-
path: '/',
|
|
853
|
-
headers: {
|
|
854
|
-
'Content-Type': 'application/x-amz-json-1.1',
|
|
855
|
-
'X-Amz-Target': `AmazonPersonalizeEvents.${action}`,
|
|
856
|
-
},
|
|
857
|
-
body: JSON.stringify(params),
|
|
858
|
-
})
|
|
859
|
-
}
|
|
860
|
-
|
|
861
|
-
/**
|
|
862
|
-
* Record user events
|
|
863
|
-
*/
|
|
864
|
-
async putEvents(params: PutEventsCommandInput): Promise<PutEventsCommandOutput> {
|
|
865
|
-
return this.request('PutEvents', params as unknown as Record<string, unknown>)
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
/**
|
|
869
|
-
* Add or update items
|
|
870
|
-
*/
|
|
871
|
-
async putItems(params: PutItemsCommandInput): Promise<PutItemsCommandOutput> {
|
|
872
|
-
return this.request('PutItems', params as unknown as Record<string, unknown>)
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
/**
|
|
876
|
-
* Add or update users
|
|
877
|
-
*/
|
|
878
|
-
async putUsers(params: PutUsersCommandInput): Promise<PutUsersCommandOutput> {
|
|
879
|
-
return this.request('PutUsers', params as unknown as Record<string, unknown>)
|
|
880
|
-
}
|
|
881
|
-
|
|
882
|
-
// -------------------------------------------------------------------------
|
|
883
|
-
// Convenience Methods
|
|
884
|
-
// -------------------------------------------------------------------------
|
|
885
|
-
|
|
886
|
-
/**
|
|
887
|
-
* Track a simple click/view event
|
|
888
|
-
*/
|
|
889
|
-
async trackEvent(
|
|
890
|
-
trackingId: string,
|
|
891
|
-
sessionId: string,
|
|
892
|
-
userId: string,
|
|
893
|
-
itemId: string,
|
|
894
|
-
eventType: string = 'click',
|
|
895
|
-
): Promise<void> {
|
|
896
|
-
await this.putEvents({
|
|
897
|
-
trackingId,
|
|
898
|
-
sessionId,
|
|
899
|
-
userId,
|
|
900
|
-
eventList: [
|
|
901
|
-
{
|
|
902
|
-
eventType,
|
|
903
|
-
itemId,
|
|
904
|
-
sentAt: new Date().toISOString(),
|
|
905
|
-
},
|
|
906
|
-
],
|
|
907
|
-
})
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
/**
|
|
911
|
-
* Track a purchase event with value
|
|
912
|
-
*/
|
|
913
|
-
async trackPurchase(
|
|
914
|
-
trackingId: string,
|
|
915
|
-
sessionId: string,
|
|
916
|
-
userId: string,
|
|
917
|
-
itemId: string,
|
|
918
|
-
value: number,
|
|
919
|
-
): Promise<void> {
|
|
920
|
-
await this.putEvents({
|
|
921
|
-
trackingId,
|
|
922
|
-
sessionId,
|
|
923
|
-
userId,
|
|
924
|
-
eventList: [
|
|
925
|
-
{
|
|
926
|
-
eventType: 'purchase',
|
|
927
|
-
eventValue: value,
|
|
928
|
-
itemId,
|
|
929
|
-
sentAt: new Date().toISOString(),
|
|
930
|
-
},
|
|
931
|
-
],
|
|
932
|
-
})
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
// ============================================================================
|
|
937
|
-
// Helper Functions
|
|
938
|
-
// ============================================================================
|
|
939
|
-
|
|
940
|
-
/**
|
|
941
|
-
* Get recommendations for a user
|
|
942
|
-
*/
|
|
943
|
-
export async function getRecommendations(
|
|
944
|
-
campaignArn: string,
|
|
945
|
-
userId: string,
|
|
946
|
-
options?: { numResults?: number; region?: string },
|
|
947
|
-
): Promise<string[]> {
|
|
948
|
-
const client = new PersonalizeRuntimeClient(options?.region || 'us-east-1')
|
|
949
|
-
return client.recommendForUser(campaignArn, userId, options?.numResults)
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
/**
|
|
953
|
-
* Get similar items
|
|
954
|
-
*/
|
|
955
|
-
export async function getSimilarItems(
|
|
956
|
-
campaignArn: string,
|
|
957
|
-
itemId: string,
|
|
958
|
-
options?: { numResults?: number; region?: string },
|
|
959
|
-
): Promise<string[]> {
|
|
960
|
-
const client = new PersonalizeRuntimeClient(options?.region || 'us-east-1')
|
|
961
|
-
return client.getSimilarItems(campaignArn, itemId, options?.numResults)
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
/**
|
|
965
|
-
* Track user event
|
|
966
|
-
*/
|
|
967
|
-
export async function trackEvent(
|
|
968
|
-
trackingId: string,
|
|
969
|
-
sessionId: string,
|
|
970
|
-
userId: string,
|
|
971
|
-
itemId: string,
|
|
972
|
-
eventType: string = 'click',
|
|
973
|
-
region?: string,
|
|
974
|
-
): Promise<void> {
|
|
975
|
-
const client = new PersonalizeEventsClient(region || 'us-east-1')
|
|
976
|
-
await client.trackEvent(trackingId, sessionId, userId, itemId, eventType)
|
|
977
|
-
}
|