@composurecdk/bedrock 0.10.1

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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/dist/commonjs/grants.d.ts +27 -0
  4. package/dist/commonjs/grants.d.ts.map +1 -0
  5. package/dist/commonjs/grants.js +42 -0
  6. package/dist/commonjs/grants.js.map +1 -0
  7. package/dist/commonjs/index.d.ts +8 -0
  8. package/dist/commonjs/index.d.ts.map +1 -0
  9. package/dist/commonjs/index.js +18 -0
  10. package/dist/commonjs/index.js.map +1 -0
  11. package/dist/commonjs/inference-profile.d.ts +88 -0
  12. package/dist/commonjs/inference-profile.d.ts.map +1 -0
  13. package/dist/commonjs/inference-profile.js +125 -0
  14. package/dist/commonjs/inference-profile.js.map +1 -0
  15. package/dist/commonjs/inference-target.d.ts +41 -0
  16. package/dist/commonjs/inference-target.d.ts.map +1 -0
  17. package/dist/commonjs/inference-target.js +104 -0
  18. package/dist/commonjs/inference-target.js.map +1 -0
  19. package/dist/commonjs/model-alarm-builder.d.ts +67 -0
  20. package/dist/commonjs/model-alarm-builder.d.ts.map +1 -0
  21. package/dist/commonjs/model-alarm-builder.js +58 -0
  22. package/dist/commonjs/model-alarm-builder.js.map +1 -0
  23. package/dist/commonjs/model-alarm-config.d.ts +83 -0
  24. package/dist/commonjs/model-alarm-config.d.ts.map +1 -0
  25. package/dist/commonjs/model-alarm-config.js +3 -0
  26. package/dist/commonjs/model-alarm-config.js.map +1 -0
  27. package/dist/commonjs/model-alarm-defaults.d.ts +22 -0
  28. package/dist/commonjs/model-alarm-defaults.d.ts.map +1 -0
  29. package/dist/commonjs/model-alarm-defaults.js +30 -0
  30. package/dist/commonjs/model-alarm-defaults.js.map +1 -0
  31. package/dist/commonjs/model-alarms.d.ts +20 -0
  32. package/dist/commonjs/model-alarms.d.ts.map +1 -0
  33. package/dist/commonjs/model-alarms.js +115 -0
  34. package/dist/commonjs/model-alarms.js.map +1 -0
  35. package/dist/commonjs/package.json +3 -0
  36. package/dist/esm/grants.d.ts +27 -0
  37. package/dist/esm/grants.d.ts.map +1 -0
  38. package/dist/esm/grants.js +39 -0
  39. package/dist/esm/grants.js.map +1 -0
  40. package/dist/esm/index.d.ts +8 -0
  41. package/dist/esm/index.d.ts.map +1 -0
  42. package/dist/esm/index.js +7 -0
  43. package/dist/esm/index.js.map +1 -0
  44. package/dist/esm/inference-profile.d.ts +88 -0
  45. package/dist/esm/inference-profile.d.ts.map +1 -0
  46. package/dist/esm/inference-profile.js +121 -0
  47. package/dist/esm/inference-profile.js.map +1 -0
  48. package/dist/esm/inference-target.d.ts +41 -0
  49. package/dist/esm/inference-target.d.ts.map +1 -0
  50. package/dist/esm/inference-target.js +98 -0
  51. package/dist/esm/inference-target.js.map +1 -0
  52. package/dist/esm/model-alarm-builder.d.ts +67 -0
  53. package/dist/esm/model-alarm-builder.d.ts.map +1 -0
  54. package/dist/esm/model-alarm-builder.js +55 -0
  55. package/dist/esm/model-alarm-builder.js.map +1 -0
  56. package/dist/esm/model-alarm-config.d.ts +83 -0
  57. package/dist/esm/model-alarm-config.d.ts.map +1 -0
  58. package/dist/esm/model-alarm-config.js +2 -0
  59. package/dist/esm/model-alarm-config.js.map +1 -0
  60. package/dist/esm/model-alarm-defaults.d.ts +22 -0
  61. package/dist/esm/model-alarm-defaults.d.ts.map +1 -0
  62. package/dist/esm/model-alarm-defaults.js +27 -0
  63. package/dist/esm/model-alarm-defaults.js.map +1 -0
  64. package/dist/esm/model-alarms.d.ts +20 -0
  65. package/dist/esm/model-alarms.d.ts.map +1 -0
  66. package/dist/esm/model-alarms.js +111 -0
  67. package/dist/esm/model-alarms.js.map +1 -0
  68. package/dist/esm/package.json +3 -0
  69. package/package.json +87 -0
@@ -0,0 +1,111 @@
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { ComparisonOperator, Metric } from "aws-cdk-lib/aws-cloudwatch";
3
+ import { resolveAlarmConfig, resolveAlarmThresholdBasis } from "@composurecdk/cloudwatch";
4
+ import { isInferenceProfile } from "./inference-target.js";
5
+ import { MODEL_ALARM_DEFAULTS } from "./model-alarm-defaults.js";
6
+ const PERIOD = Duration.minutes(1);
7
+ /** Returns the `AWS/Bedrock` metrics for `target`. */
8
+ export function modelMetrics(target) {
9
+ const modelId = isInferenceProfile(target) ? target.profileId : target.modelId;
10
+ return {
11
+ modelId,
12
+ metric: (metricName, options) => new Metric({
13
+ namespace: "AWS/Bedrock",
14
+ metricName,
15
+ dimensionsMap: { ModelId: modelId },
16
+ period: PERIOD,
17
+ ...options,
18
+ }),
19
+ };
20
+ }
21
+ const THRESHOLD_ALARMS = {
22
+ invocationThrottles: {
23
+ metricName: "InvocationThrottles",
24
+ statistic: "Sum",
25
+ defaults: MODEL_ALARM_DEFAULTS.invocationThrottles,
26
+ describe: (id, t) => `Bedrock is throttling requests to ${id}; the account's quota for the model is exhausted. ` +
27
+ `Threshold: > ${String(t)} per minute.`,
28
+ },
29
+ invocationServerErrors: {
30
+ metricName: "InvocationServerErrors",
31
+ statistic: "Sum",
32
+ defaults: MODEL_ALARM_DEFAULTS.invocationServerErrors,
33
+ describe: (id, t) => `Bedrock is returning server errors for ${id}. Threshold: > ${String(t)} per minute.`,
34
+ },
35
+ invocationClientErrors: {
36
+ metricName: "InvocationClientErrors",
37
+ statistic: "Sum",
38
+ defaults: MODEL_ALARM_DEFAULTS.invocationClientErrors,
39
+ describe: (id, t) => `Requests to ${id} are failing with client errors, such as AccessDenied or validation ` +
40
+ `errors. Threshold: > ${String(t)} per minute.`,
41
+ },
42
+ invocationLatency: {
43
+ metricName: "InvocationLatency",
44
+ statistic: "p90",
45
+ describe: (id, t) => `p90 invocation latency for ${id} exceeds ${String(t)} ms.`,
46
+ },
47
+ timeToFirstToken: {
48
+ metricName: "TimeToFirstToken",
49
+ statistic: "p90",
50
+ describe: (id, t) => `p90 time to first token for ${id} exceeds ${String(t)} ms.`,
51
+ },
52
+ };
53
+ function toDefinition(key, metric, cfg, description) {
54
+ return {
55
+ key,
56
+ alarmName: cfg.alarmName,
57
+ metric,
58
+ threshold: cfg.threshold,
59
+ comparisonOperator: ComparisonOperator.GREATER_THAN_THRESHOLD,
60
+ evaluationPeriods: cfg.evaluationPeriods,
61
+ datapointsToAlarm: cfg.datapointsToAlarm,
62
+ treatMissingData: cfg.treatMissingData,
63
+ description,
64
+ };
65
+ }
66
+ function quotaAlarm(scope, metrics, config) {
67
+ if (!config)
68
+ return [];
69
+ const quota = resolveAlarmThresholdBasis({
70
+ scope,
71
+ value: config.quota,
72
+ resolve: (q) => q,
73
+ warningId: "@composurecdk/bedrock:token-tpm-quota-alarm",
74
+ alarmLabel: "Bedrock estimated TPM quota usage",
75
+ suppressHint: "recommendedAlarms({ estimatedTpmQuotaUsage: false })",
76
+ });
77
+ if (quota === undefined)
78
+ return [];
79
+ const percent = config.thresholdPercent ?? MODEL_ALARM_DEFAULTS.estimatedTpmQuotaUsage.thresholdPercent;
80
+ if (!(quota > 0)) {
81
+ throw new Error(`estimatedTpmQuotaUsage: quota must be a positive number, got ${String(quota)}.`);
82
+ }
83
+ if (!(percent > 0 && percent <= 1)) {
84
+ throw new Error(`estimatedTpmQuotaUsage: thresholdPercent must be in (0, 1], got ${String(percent)}.`);
85
+ }
86
+ const cfg = resolveAlarmConfig({ ...config, threshold: Math.floor(quota * percent) }, { ...MODEL_ALARM_DEFAULTS.optIn, threshold: 0 });
87
+ return [
88
+ toDefinition("estimatedTpmQuotaUsage", metrics.metric("EstimatedTPMQuotaUsage", { statistic: "Maximum" }), cfg, `Estimated token usage for ${metrics.modelId} exceeds ${String(percent * 100)}% of the ` +
89
+ `${String(quota)} tokens-per-minute quota.`),
90
+ ];
91
+ }
92
+ /** Resolves the recommended alarm configuration for a model's metrics. */
93
+ export function resolveModelAlarmDefinitions(scope, metrics, config) {
94
+ if (config?.enabled === false)
95
+ return [];
96
+ const definitions = Object.entries(THRESHOLD_ALARMS).flatMap(([key, spec]) => {
97
+ const userConfig = config?.[key];
98
+ if (userConfig === false || (userConfig === undefined && !spec.defaults))
99
+ return [];
100
+ if (!spec.defaults && userConfig?.threshold === undefined) {
101
+ throw new Error(`The "${key}" alarm has no default threshold. Supply one, e.g. ` +
102
+ `recommendedAlarms({ ${key}: { threshold: … } }).`);
103
+ }
104
+ const cfg = resolveAlarmConfig(userConfig, spec.defaults ?? { ...MODEL_ALARM_DEFAULTS.optIn, threshold: 0 });
105
+ return [
106
+ toDefinition(key, metrics.metric(spec.metricName, { statistic: spec.statistic }), cfg, spec.describe(metrics.modelId, cfg.threshold)),
107
+ ];
108
+ });
109
+ return [...definitions, ...quotaAlarm(scope, metrics, config?.estimatedTpmQuotaUsage)];
110
+ }
111
+ //# sourceMappingURL=model-alarms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-alarms.js","sourceRoot":"","sources":["../../src/model-alarms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@composurecdk/bedrock",
3
+ "version": "0.10.1",
4
+ "description": "Composable Amazon Bedrock model access: cross-Region inference profiles, invocation grants and alarms",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/laazyj/composureCDK.git",
8
+ "directory": "packages/bedrock"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "lint": "eslint .",
17
+ "clean": "rm -rf dist .tshy .tshy-build",
18
+ "build": "tshy",
19
+ "typecheck": "tsc --noEmit",
20
+ "check:exports": "attw --pack . --profile node16 && publint",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "keywords": [
25
+ "aws",
26
+ "cdk",
27
+ "aws-cdk",
28
+ "infrastructure-as-code",
29
+ "iac",
30
+ "composurecdk",
31
+ "bedrock",
32
+ "generative-ai",
33
+ "inference-profile",
34
+ "llm"
35
+ ],
36
+ "author": "Jason Duffett (https://github.com/laazyj)",
37
+ "license": "MIT",
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "type": "module",
42
+ "engines": {
43
+ "node": ">=20"
44
+ },
45
+ "tshy": {
46
+ "exports": {
47
+ "./package.json": "./package.json",
48
+ ".": "./src/index.ts"
49
+ }
50
+ },
51
+ "peerDependencies": {
52
+ "@composurecdk/cloudformation": "^0.10.0",
53
+ "@composurecdk/cloudwatch": "^0.10.0",
54
+ "@composurecdk/core": "^0.10.0",
55
+ "aws-cdk-lib": "^2.138.0",
56
+ "constructs": "^10.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@composurecdk/cdk-testing": "*",
60
+ "@types/node": "^26.6.1",
61
+ "aws-cdk-lib": "^2.269.0",
62
+ "constructs": "^10.8.1",
63
+ "typescript": "^6.0.3",
64
+ "vitest": "^5.0.0"
65
+ },
66
+ "exports": {
67
+ "./package.json": "./package.json",
68
+ ".": {
69
+ "import": {
70
+ "types": "./dist/esm/index.d.ts",
71
+ "default": "./dist/esm/index.js"
72
+ },
73
+ "require": {
74
+ "types": "./dist/commonjs/index.d.ts",
75
+ "default": "./dist/commonjs/index.js"
76
+ }
77
+ }
78
+ },
79
+ "main": "./dist/commonjs/index.js",
80
+ "types": "./dist/commonjs/index.d.ts",
81
+ "module": "./dist/esm/index.js",
82
+ "nx": {
83
+ "tags": [
84
+ "scope:lib"
85
+ ]
86
+ }
87
+ }