@convo-lang/convo-lang-aws-cdk
Version:
The language of AI
79 lines • 3.54 kB
JavaScript
import { openAiSecretsParam } from '@convo-lang/convo-lang';
import { FnsBuilder, getDefaultManagedProps, grantTableQueryPerms } from '@iyio/cdk-common';
import * as cdk from 'aws-cdk-lib';
import * as db from "aws-cdk-lib/aws-dynamodb";
import * as iam from 'aws-cdk-lib/aws-iam';
import * as secrets from 'aws-cdk-lib/aws-secretsmanager';
import { Construct } from 'constructs';
import { convoLangAnonUsdCapParam, convoLangAnonUsdCapTotalParam, convoLangApiFnArnParam, convoLangApiFnUrlParam, convoLangCapsTableParam } from "./convo-lang-aws-cdk.deps.js";
export class ConvoLangConstruct extends Construct {
constructor(scope, id, { managed = getDefaultManagedProps(), defaultFnProps, fnName = "ConvoLangApiFn", anonUsdCap, anonUsdCapTotal, grantAccess, handleQuotas = anonUsdCap !== undefined || anonUsdCapTotal !== undefined, } = {}) {
super(scope, id);
const { params } = managed;
let getQName = fnName;
if (getQName.endsWith('Fn')) {
getQName = getQName.substring(0, getQName.length - 2);
}
getQName += 'GetTokenQuotaFn';
const fnsInfo = [{
name: fnName,
arnParam: convoLangApiFnArnParam,
urlParam: convoLangApiFnUrlParam,
grantAccess,
createProps: {
createPublicUrl: true,
bundledHandlerFileNames: [
'../../dist/packages/convo-lang-aws-cdk/handlers/ConvoLangApi',
'../../node_modules/@convo-lang/convo-lang-aws-cdk/handlers/ConvoLangApi',
],
timeoutMs: 1000 * 60 * 5,
...defaultFnProps,
},
}];
const fnBuilder = new FnsBuilder(this, "Fns", {
fnsInfo,
managed,
});
this.fnBuilder = fnBuilder;
const handlerFn = fnBuilder.fns.find(f => f.info.name === fnName)?.fn;
if (!handlerFn) {
throw new Error('FnsBuilder did not create a matching named fn');
}
this.handlerFn = handlerFn;
handlerFn.func.addToRolePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: [
"bedrock:InvokeModel"
],
resources: ["*"],
}));
if (anonUsdCap !== undefined) {
handlerFn.func.addEnvironment(convoLangAnonUsdCapParam.typeName, anonUsdCap.toString());
}
if (anonUsdCapTotal !== undefined) {
handlerFn.func.addEnvironment(convoLangAnonUsdCapTotalParam.typeName, anonUsdCapTotal.toString());
}
if (handleQuotas) {
const capTable = new db.Table(this, 'Caps', {
tableClass: db.TableClass.STANDARD,
billingMode: db.BillingMode.PAY_PER_REQUEST,
partitionKey: {
name: 'id',
type: db.AttributeType.STRING,
},
removalPolicy: cdk.RemovalPolicy.RETAIN,
});
capTable.grantFullAccess(handlerFn.func);
grantTableQueryPerms(handlerFn.func, capTable);
if (params) {
params.setParam(convoLangCapsTableParam, capTable.tableArn);
}
}
const secret = new secrets.Secret(this, 'ApiKey');
secret.grantRead(handlerFn.func);
if (params) {
params.setParam(openAiSecretsParam, secret.secretArn);
}
}
}
//# sourceMappingURL=ConvoLangConstruct.js.map