@composurecdk/bedrock 0.11.1 → 0.12.0
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 +41 -21
- package/dist/commonjs/arn.d.ts +12 -0
- package/dist/commonjs/arn.d.ts.map +1 -0
- package/dist/commonjs/arn.js +27 -0
- package/dist/commonjs/arn.js.map +1 -0
- package/dist/commonjs/grants.d.ts +27 -9
- package/dist/commonjs/grants.d.ts.map +1 -1
- package/dist/commonjs/grants.js +68 -30
- package/dist/commonjs/grants.js.map +1 -1
- package/dist/commonjs/index.d.ts +1 -1
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +2 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/inference-profile.d.ts +25 -9
- package/dist/commonjs/inference-profile.d.ts.map +1 -1
- package/dist/commonjs/inference-profile.js +41 -25
- package/dist/commonjs/inference-profile.js.map +1 -1
- package/dist/commonjs/inference-target.d.ts +42 -4
- package/dist/commonjs/inference-target.d.ts.map +1 -1
- package/dist/commonjs/inference-target.js +72 -25
- package/dist/commonjs/inference-target.js.map +1 -1
- package/dist/esm/arn.d.ts +12 -0
- package/dist/esm/arn.d.ts.map +1 -0
- package/dist/esm/arn.js +23 -0
- package/dist/esm/arn.js.map +1 -0
- package/dist/esm/grants.d.ts +27 -9
- package/dist/esm/grants.d.ts.map +1 -1
- package/dist/esm/grants.js +69 -31
- package/dist/esm/grants.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/inference-profile.d.ts +25 -9
- package/dist/esm/inference-profile.d.ts.map +1 -1
- package/dist/esm/inference-profile.js +39 -25
- package/dist/esm/inference-profile.js.map +1 -1
- package/dist/esm/inference-target.d.ts +42 -4
- package/dist/esm/inference-target.d.ts.map +1 -1
- package/dist/esm/inference-target.js +66 -20
- package/dist/esm/inference-target.js.map +1 -1
- package/package.json +9 -9
package/dist/esm/grants.js
CHANGED
|
@@ -1,51 +1,77 @@
|
|
|
1
1
|
import { Effect, Grant as IamGrant, PolicyStatement } from "aws-cdk-lib/aws-iam";
|
|
2
2
|
import { combine, grantVia } from "@composurecdk/core";
|
|
3
|
-
import {
|
|
3
|
+
import { bedrockArn, environmentOf } from "./arn.js";
|
|
4
|
+
import { invocationStatements, scopeOf, } from "./inference-target.js";
|
|
5
|
+
const INVOKE_ACTION = "bedrock:InvokeModel";
|
|
4
6
|
/**
|
|
5
7
|
* Streaming operations (`InvokeModelWithResponseStream`, `ConverseStream`)
|
|
6
8
|
* require both actions.
|
|
7
9
|
*
|
|
8
10
|
* @see https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonbedrock.html
|
|
9
11
|
*/
|
|
10
|
-
const INVOKE_ACTIONS = [
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const INVOKE_ACTIONS = [INVOKE_ACTION, "bedrock:InvokeModelWithResponseStream"];
|
|
13
|
+
/**
|
|
14
|
+
* Every guardrail in `scope`'s account and Region. The versioned identifiers
|
|
15
|
+
* `bedrock:GuardrailIdentifier` carries (`…:guardrail/<id>:<version>`) match
|
|
16
|
+
* it as a `StringLike` pattern.
|
|
17
|
+
*/
|
|
18
|
+
function anyGuardrailArn(scope) {
|
|
19
|
+
const { partition, region, account } = environmentOf(scope);
|
|
20
|
+
return bedrockArn(partition, "guardrail", "*", region, account);
|
|
21
|
+
}
|
|
22
|
+
function requirementOf(guardrail, scope) {
|
|
23
|
+
if (guardrail === "any") {
|
|
24
|
+
const arn = anyGuardrailArn(scope);
|
|
25
|
+
return { like: true, identifier: arn, applyArn: arn };
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
like: false,
|
|
29
|
+
identifier: `${guardrail.guardrailArn}:${guardrail.version}`,
|
|
30
|
+
applyArn: guardrail.guardrailArn,
|
|
31
|
+
};
|
|
14
32
|
}
|
|
15
|
-
function
|
|
16
|
-
const
|
|
17
|
-
|
|
33
|
+
function withGuardrail(conditions, required) {
|
|
34
|
+
const match = required.like ? "StringLike" : "StringEquals";
|
|
35
|
+
return {
|
|
36
|
+
...conditions,
|
|
37
|
+
[match]: {
|
|
38
|
+
...conditions?.[match],
|
|
39
|
+
"bedrock:GuardrailIdentifier": required.identifier,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function grantInvoke(target, grantee, guardrail, streaming) {
|
|
44
|
+
const scope = scopeOf(grantee.grantPrincipal);
|
|
45
|
+
const actions = streaming ? INVOKE_ACTIONS : [INVOKE_ACTION];
|
|
46
|
+
const statements = invocationStatements(target, scope);
|
|
47
|
+
const required = guardrail && requirementOf(guardrail, scope);
|
|
18
48
|
for (const { resourceArns, conditions } of statements) {
|
|
19
49
|
IamGrant.addToPrincipal({
|
|
20
50
|
grantee,
|
|
21
|
-
actions
|
|
51
|
+
actions,
|
|
22
52
|
resourceArns,
|
|
23
|
-
conditions:
|
|
24
|
-
? {
|
|
25
|
-
...conditions,
|
|
26
|
-
StringEquals: {
|
|
27
|
-
...conditions?.StringEquals,
|
|
28
|
-
"bedrock:GuardrailIdentifier": identifier,
|
|
29
|
-
},
|
|
30
|
-
}
|
|
31
|
-
: conditions,
|
|
53
|
+
conditions: required ? withGuardrail(conditions, required) : conditions,
|
|
32
54
|
});
|
|
33
55
|
}
|
|
34
|
-
if (!
|
|
56
|
+
if (!required)
|
|
35
57
|
return;
|
|
36
58
|
grantee.grantPrincipal.addToPrincipalPolicy(new PolicyStatement({
|
|
37
59
|
effect: Effect.DENY,
|
|
38
|
-
actions
|
|
60
|
+
actions,
|
|
39
61
|
resources: statements.flatMap((s) => s.resourceArns),
|
|
40
|
-
conditions: {
|
|
62
|
+
conditions: {
|
|
63
|
+
[required.like ? "StringNotLike" : "StringNotEquals"]: {
|
|
64
|
+
"bedrock:GuardrailIdentifier": required.identifier,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
41
67
|
}));
|
|
42
|
-
grantApply(
|
|
68
|
+
grantApply(required.applyArn, grantee);
|
|
43
69
|
}
|
|
44
|
-
function grantApply(
|
|
70
|
+
function grantApply(guardrailArn, grantee) {
|
|
45
71
|
IamGrant.addToPrincipal({
|
|
46
72
|
grantee,
|
|
47
73
|
actions: ["bedrock:ApplyGuardrail"],
|
|
48
|
-
resourceArns: [
|
|
74
|
+
resourceArns: [guardrailArn],
|
|
49
75
|
});
|
|
50
76
|
}
|
|
51
77
|
/**
|
|
@@ -62,15 +88,15 @@ export const modelGrants = {
|
|
|
62
88
|
* Invoke the target through `InvokeModel`, `Converse` or their streaming
|
|
63
89
|
* variants.
|
|
64
90
|
*
|
|
65
|
-
* For a cross-Region profile this also grants the foundation model in
|
|
66
|
-
*
|
|
67
|
-
* `bedrock:InferenceProfileArn` so
|
|
68
|
-
*
|
|
91
|
+
* For a cross-Region profile this also grants the foundation model, in
|
|
92
|
+
* every Region or in the profile's listed `routingRegions`, conditioned on
|
|
93
|
+
* `bedrock:InferenceProfileArn` so the model is reachable only through the
|
|
94
|
+
* profile.
|
|
69
95
|
*
|
|
70
96
|
* @see https://docs.aws.amazon.com/wellarchitected/latest/generative-ai-lens/gensec01-bp01.html
|
|
71
97
|
*/
|
|
72
|
-
invoke: (target, { requireGuardrail } = {}) => grantVia(combine({ target, guardrail: requireGuardrail }), ({ target: resolved, guardrail }, grantee) => {
|
|
73
|
-
grantInvoke(resolved, grantee, guardrail);
|
|
98
|
+
invoke: (target, { requireGuardrail, streaming = true } = {}) => grantVia(combine({ target, guardrail: requireGuardrail }), ({ target: resolved, guardrail }, grantee) => {
|
|
99
|
+
grantInvoke(resolved, grantee, guardrail, streaming);
|
|
74
100
|
}),
|
|
75
101
|
};
|
|
76
102
|
/**
|
|
@@ -84,7 +110,19 @@ export const guardrailGrants = {
|
|
|
84
110
|
* `ApplyGuardrail` API or a model invocation that names it.
|
|
85
111
|
*/
|
|
86
112
|
apply: (guardrail) => grantVia(guardrail, (resolved, grantee) => {
|
|
87
|
-
grantApply(resolved, grantee);
|
|
113
|
+
grantApply(resolved.guardrailArn, grantee);
|
|
114
|
+
}),
|
|
115
|
+
/**
|
|
116
|
+
* Apply any guardrail in the grantee's account and Region, for a caller
|
|
117
|
+
* that may name one at run time. Where the guardrail is known, `apply` it;
|
|
118
|
+
* where every call must carry one, `modelGrants.invoke(…, { requireGuardrail })`.
|
|
119
|
+
*/
|
|
120
|
+
// A plain Grant rather than grantVia: there is no resource to resolve, only
|
|
121
|
+
// the grantee's own account and Region.
|
|
122
|
+
applyAny: () => ({
|
|
123
|
+
applyTo(grantee) {
|
|
124
|
+
grantApply(anyGuardrailArn(scopeOf(grantee.grantPrincipal)), grantee);
|
|
125
|
+
},
|
|
88
126
|
}),
|
|
89
127
|
};
|
|
90
128
|
//# sourceMappingURL=grants.js.map
|
package/dist/esm/grants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,QAAQ,EAAmB,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/grants.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { type ApplicationInferenceProfileBuilderProps, type ApplicationInferenceProfileBuilderResult, createApplicationInferenceProfileBuilder, type IApplicationInferenceProfileBuilder, } from "./application-inference-profile-builder.js";
|
|
2
2
|
export { type ApplicationInferenceProfile, foundationModelFor, type GeographicInferenceProfile, type GeographicInferenceProfileOptions, type GlobalInferenceProfile, INFERENCE_PROFILE_GEOGRAPHIES, type InferenceProfile, type InferenceProfileGeography, inferenceProfile, } from "./inference-profile.js";
|
|
3
|
-
export { type InferenceTarget, invocationArns } from "./inference-target.js";
|
|
3
|
+
export { type InferenceTarget, type InferenceTargetIdOptions, inferenceTarget, invocationArns, } from "./inference-target.js";
|
|
4
4
|
export { guardrailGrants, type ModelInvokeGrantOptions, modelGrants } from "./grants.js";
|
|
5
5
|
export { createGuardrailBuilder, type GuardrailBuilderProps, type GuardrailBuilderResult, type GuardrailReference, type IGuardrailBuilder, } from "./guardrail-builder.js";
|
|
6
6
|
export { GUARDRAIL_DEFAULTS } from "./guardrail-defaults.js";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uCAAuC,EAC5C,KAAK,wCAAwC,EAC7C,wCAAwC,EACxC,KAAK,mCAAmC,GACzC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,uCAAuC,EAC5C,KAAK,wCAAwC,EAC7C,wCAAwC,EACxC,KAAK,mCAAmC,GACzC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,KAAK,0BAA0B,EAC/B,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,6BAA6B,EAC7B,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,KAAK,uBAAuB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACL,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EACL,mCAAmC,EACnC,KAAK,8BAA8B,EACnC,iCAAiC,EACjC,KAAK,kCAAkC,EACvC,KAAK,mCAAmC,EACxC,KAAK,gCAAgC,GACtC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,uCAAuC,EACvC,KAAK,iCAAiC,GACvC,MAAM,sCAAsC,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { createApplicationInferenceProfileBuilder, } from "./application-inference-profile-builder.js";
|
|
2
2
|
export { foundationModelFor, INFERENCE_PROFILE_GEOGRAPHIES, inferenceProfile, } from "./inference-profile.js";
|
|
3
|
-
export { invocationArns } from "./inference-target.js";
|
|
3
|
+
export { inferenceTarget, invocationArns, } from "./inference-target.js";
|
|
4
4
|
export { guardrailGrants, modelGrants } from "./grants.js";
|
|
5
5
|
export { createGuardrailBuilder, } from "./guardrail-builder.js";
|
|
6
6
|
export { GUARDRAIL_DEFAULTS } from "./guardrail-defaults.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wCAAwC,GAEzC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAEL,kBAAkB,EAIlB,6BAA6B,EAG7B,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,wCAAwC,GAEzC,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAEL,kBAAkB,EAIlB,6BAA6B,EAG7B,gBAAgB,GACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAgC,WAAW,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACL,sBAAsB,GAKvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,GAIxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAA4C,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EACL,mCAAmC,EAEnC,iCAAiC,GAIlC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,uCAAuC,GAExC,MAAM,sCAAsC,CAAC"}
|
|
@@ -9,7 +9,7 @@ import { FoundationModelIdentifier } from "aws-cdk-lib/aws-bedrock";
|
|
|
9
9
|
*
|
|
10
10
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/geographic-cross-region-inference.html
|
|
11
11
|
*/
|
|
12
|
-
export declare const INFERENCE_PROFILE_GEOGRAPHIES: readonly ["us", "eu", "apac", "jp", "au", "us-gov"];
|
|
12
|
+
export declare const INFERENCE_PROFILE_GEOGRAPHIES: readonly ["us", "eu", "apac", "jp", "au", "in", "us-gov"];
|
|
13
13
|
/** A known geography prefix. See {@link INFERENCE_PROFILE_GEOGRAPHIES}. */
|
|
14
14
|
export type InferenceProfileGeography = (typeof INFERENCE_PROFILE_GEOGRAPHIES)[number];
|
|
15
15
|
/**
|
|
@@ -26,11 +26,18 @@ export interface GeographicInferenceProfile {
|
|
|
26
26
|
/** The id to invoke, e.g. `eu.anthropic.claude-haiku-4-5-20251001-v1:0`. */
|
|
27
27
|
readonly profileId: string;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* The Regions the profile routes to from the source Region, as listed by
|
|
30
|
+
* `aws bedrock get-inference-profile`. AWS chooses and extends that list,
|
|
31
|
+
* so a copy of it is a snapshot. Bedrock checks the model in every Region
|
|
32
|
+
* the profile may route to, so once AWS adds one, a grant built from the
|
|
33
|
+
* copy denies every call through the profile.
|
|
34
|
+
*
|
|
35
|
+
* Omitted, the grant covers the foundation model in every Region, still
|
|
36
|
+
* only through this profile. List the Regions when the policy must name
|
|
37
|
+
* each one, for a service control policy or a policy scanner. The source
|
|
38
|
+
* Region is always granted.
|
|
32
39
|
*/
|
|
33
|
-
readonly routingRegions
|
|
40
|
+
readonly routingRegions?: readonly string[];
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
36
43
|
* A system-defined inference profile that routes requests to any supported
|
|
@@ -68,10 +75,20 @@ export interface ApplicationInferenceProfile {
|
|
|
68
75
|
}
|
|
69
76
|
/** Options for {@link inferenceProfile.geographic}. */
|
|
70
77
|
export type GeographicInferenceProfileOptions = Pick<GeographicInferenceProfile, "model" | "geography" | "routingRegions">;
|
|
78
|
+
/**
|
|
79
|
+
* The segment of `id` before its first dot, and whether it marks a
|
|
80
|
+
* system-defined profile id. Undefined when `id` has no such segment.
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
83
|
+
export declare function idPrefix(id: string): {
|
|
84
|
+
prefix: string;
|
|
85
|
+
isProfile: boolean;
|
|
86
|
+
} | undefined;
|
|
87
|
+
/** Throws unless `id` is a non-empty literal string. @internal */
|
|
88
|
+
export declare function assertLiteralId(id: string, label: string): void;
|
|
71
89
|
declare function geographic(options: GeographicInferenceProfileOptions): GeographicInferenceProfile;
|
|
72
90
|
declare function global(model: FoundationModelIdentifier): GlobalInferenceProfile;
|
|
73
|
-
declare function parse(profileId: string):
|
|
74
|
-
declare function parse(profileId: string, routingRegions: readonly string[]): InferenceProfile;
|
|
91
|
+
declare function parse(profileId: string, routingRegions?: readonly string[]): InferenceProfile;
|
|
75
92
|
/**
|
|
76
93
|
* Factories for {@link InferenceProfile} values.
|
|
77
94
|
*
|
|
@@ -80,7 +97,6 @@ declare function parse(profileId: string, routingRegions: readonly string[]): In
|
|
|
80
97
|
* const haiku = inferenceProfile.geographic({
|
|
81
98
|
* model: FoundationModelIdentifier.ANTHROPIC_CLAUDE_HAIKU_4_5_20251001_V1_0,
|
|
82
99
|
* geography: "eu",
|
|
83
|
-
* routingRegions: ["eu-central-1", "eu-north-1", "eu-south-1", "eu-south-2", "eu-west-1", "eu-west-3"],
|
|
84
100
|
* });
|
|
85
101
|
* haiku.profileId; // "eu.anthropic.claude-haiku-4-5-20251001-v1:0"
|
|
86
102
|
* ```
|
|
@@ -93,7 +109,7 @@ export declare const inferenceProfile: {
|
|
|
93
109
|
/**
|
|
94
110
|
* Reads a profile id such as `eu.anthropic.claude-haiku-4-5-20251001-v1:0`.
|
|
95
111
|
* Throws unless the id starts with a known geography or `global`. A
|
|
96
|
-
* geographic id
|
|
112
|
+
* geographic id may take its `routingRegions`; a global id takes none.
|
|
97
113
|
*/
|
|
98
114
|
parse: typeof parse;
|
|
99
115
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference-profile.d.ts","sourceRoot":"","sources":["../../src/inference-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,
|
|
1
|
+
{"version":3,"file":"inference-profile.d.ts","sourceRoot":"","sources":["../../src/inference-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,2DAQhC,CAAC;AAEX,2EAA2E;AAC3E,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAMvF;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC9D,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,yBAAyB,CAAC;IAC1C,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,0BAA0B,GAAG,sBAAsB,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,gBAAgB,CAAC;CAC/D;AAED,uDAAuD;AACvD,MAAM,MAAM,iCAAiC,GAAG,IAAI,CAClD,0BAA0B,EAC1B,OAAO,GAAG,WAAW,GAAG,gBAAgB,CACzC,CAAC;AAKF;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAKvF;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/D;AA4BD,iBAAS,UAAU,CAAC,OAAO,EAAE,iCAAiC,GAAG,0BAA0B,CAiB1F;AAED,iBAAS,MAAM,CAAC,KAAK,EAAE,yBAAyB,GAAG,sBAAsB,CAGxE;AAcD,iBAAS,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,gBAAgB,CAYtF;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB;IAC3B,8CAA8C;;IAE9C,4DAA4D;;IAE5D;;;;OAIG;;CAEJ,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,CAE/E"}
|
|
@@ -10,32 +10,48 @@ import { FoundationModelIdentifier } from "aws-cdk-lib/aws-bedrock";
|
|
|
10
10
|
*
|
|
11
11
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/geographic-cross-region-inference.html
|
|
12
12
|
*/
|
|
13
|
-
export const INFERENCE_PROFILE_GEOGRAPHIES = [
|
|
13
|
+
export const INFERENCE_PROFILE_GEOGRAPHIES = [
|
|
14
|
+
"us",
|
|
15
|
+
"eu",
|
|
16
|
+
"apac",
|
|
17
|
+
"jp",
|
|
18
|
+
"au",
|
|
19
|
+
"in",
|
|
20
|
+
"us-gov",
|
|
21
|
+
];
|
|
14
22
|
const GLOBAL_PREFIX = "global";
|
|
23
|
+
const PROFILE_PREFIXES = [GLOBAL_PREFIX, ...INFERENCE_PROFILE_GEOGRAPHIES];
|
|
15
24
|
const GEOGRAPHY_PATTERN = /^[a-z]+(-[a-z]+)*$/;
|
|
16
25
|
const REGION_PATTERN = /^[a-z]{2}(-[a-z]+)+-\d+$/;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
/**
|
|
27
|
+
* The segment of `id` before its first dot, and whether it marks a
|
|
28
|
+
* system-defined profile id. Undefined when `id` has no such segment.
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export function idPrefix(id) {
|
|
22
32
|
const dot = id.indexOf(".");
|
|
23
|
-
|
|
33
|
+
if (dot <= 0)
|
|
34
|
+
return undefined;
|
|
35
|
+
const prefix = id.slice(0, dot);
|
|
36
|
+
return { prefix, isProfile: PROFILE_PREFIXES.includes(prefix) };
|
|
37
|
+
}
|
|
38
|
+
/** Throws unless `id` is a non-empty literal string. @internal */
|
|
39
|
+
export function assertLiteralId(id, label) {
|
|
40
|
+
if (Token.isUnresolved(id) || id === "") {
|
|
41
|
+
throw new Error(`${label} must be a non-empty literal string.`);
|
|
42
|
+
}
|
|
24
43
|
}
|
|
25
44
|
function assertModel(model) {
|
|
26
45
|
const { modelId } = model;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
const prefix = prefixOf(modelId);
|
|
31
|
-
if (prefix !== undefined && isProfilePrefix(prefix)) {
|
|
46
|
+
assertLiteralId(modelId, "Inference profile model id");
|
|
47
|
+
if (idPrefix(modelId)?.isProfile) {
|
|
32
48
|
throw new Error(`"${modelId}" is an inference profile id, not a foundation model id. ` +
|
|
33
|
-
`Use inferenceProfile.parse("${modelId}"
|
|
49
|
+
`Use inferenceProfile.parse("${modelId}") instead.`);
|
|
34
50
|
}
|
|
35
51
|
}
|
|
36
52
|
function assertRoutingRegions(profileId, regions) {
|
|
37
53
|
if (regions.length === 0) {
|
|
38
|
-
throw new Error(`Inference profile "${profileId}": routingRegions must not be empty.`);
|
|
54
|
+
throw new Error(`Inference profile "${profileId}": routingRegions must not be empty; omit it to grant every Region.`);
|
|
39
55
|
}
|
|
40
56
|
for (const region of regions) {
|
|
41
57
|
if (Token.isUnresolved(region) || !REGION_PATTERN.test(region)) {
|
|
@@ -44,19 +60,20 @@ function assertRoutingRegions(profileId, regions) {
|
|
|
44
60
|
}
|
|
45
61
|
}
|
|
46
62
|
function geographic(options) {
|
|
47
|
-
const { model, geography } = options;
|
|
63
|
+
const { model, geography, routingRegions } = options;
|
|
48
64
|
assertModel(model);
|
|
49
65
|
if (geography === GLOBAL_PREFIX || !GEOGRAPHY_PATTERN.test(geography)) {
|
|
50
66
|
throw new Error(`"${geography}" is not a geography prefix. Use inferenceProfile.global() for a global profile.`);
|
|
51
67
|
}
|
|
52
68
|
const profileId = `${geography}.${model.modelId}`;
|
|
53
|
-
|
|
69
|
+
if (routingRegions !== undefined)
|
|
70
|
+
assertRoutingRegions(profileId, routingRegions);
|
|
54
71
|
return Object.freeze({
|
|
55
72
|
kind: "geographic",
|
|
56
73
|
geography,
|
|
57
74
|
model,
|
|
58
75
|
profileId,
|
|
59
|
-
routingRegions: Object.freeze([...new Set(
|
|
76
|
+
...(routingRegions && { routingRegions: Object.freeze([...new Set(routingRegions)]) }),
|
|
60
77
|
});
|
|
61
78
|
}
|
|
62
79
|
function global(model) {
|
|
@@ -64,11 +81,12 @@ function global(model) {
|
|
|
64
81
|
return Object.freeze({ kind: "global", model, profileId: `${GLOBAL_PREFIX}.${model.modelId}` });
|
|
65
82
|
}
|
|
66
83
|
function splitProfileId(profileId) {
|
|
67
|
-
const
|
|
68
|
-
if (
|
|
84
|
+
const parsed = idPrefix(profileId);
|
|
85
|
+
if (!parsed?.isProfile) {
|
|
69
86
|
throw new Error(`"${profileId}" is not a system-defined inference profile id. Expected one of the ` +
|
|
70
|
-
`prefixes: ${
|
|
87
|
+
`prefixes: ${PROFILE_PREFIXES.join(", ")}.`);
|
|
71
88
|
}
|
|
89
|
+
const { prefix } = parsed;
|
|
72
90
|
return { prefix, modelId: profileId.slice(prefix.length + 1) };
|
|
73
91
|
}
|
|
74
92
|
function parse(profileId, routingRegions) {
|
|
@@ -80,9 +98,6 @@ function parse(profileId, routingRegions) {
|
|
|
80
98
|
}
|
|
81
99
|
return global(model);
|
|
82
100
|
}
|
|
83
|
-
if (routingRegions === undefined) {
|
|
84
|
-
throw new Error(`Inference profile "${profileId}" is geographic and needs its routingRegions.`);
|
|
85
|
-
}
|
|
86
101
|
return geographic({ model, geography: prefix, routingRegions });
|
|
87
102
|
}
|
|
88
103
|
/**
|
|
@@ -93,7 +108,6 @@ function parse(profileId, routingRegions) {
|
|
|
93
108
|
* const haiku = inferenceProfile.geographic({
|
|
94
109
|
* model: FoundationModelIdentifier.ANTHROPIC_CLAUDE_HAIKU_4_5_20251001_V1_0,
|
|
95
110
|
* geography: "eu",
|
|
96
|
-
* routingRegions: ["eu-central-1", "eu-north-1", "eu-south-1", "eu-south-2", "eu-west-1", "eu-west-3"],
|
|
97
111
|
* });
|
|
98
112
|
* haiku.profileId; // "eu.anthropic.claude-haiku-4-5-20251001-v1:0"
|
|
99
113
|
* ```
|
|
@@ -106,7 +120,7 @@ export const inferenceProfile = {
|
|
|
106
120
|
/**
|
|
107
121
|
* Reads a profile id such as `eu.anthropic.claude-haiku-4-5-20251001-v1:0`.
|
|
108
122
|
* Throws unless the id starts with a known geography or `global`. A
|
|
109
|
-
* geographic id
|
|
123
|
+
* geographic id may take its `routingRegions`; a global id takes none.
|
|
110
124
|
*/
|
|
111
125
|
parse,
|
|
112
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference-profile.js","sourceRoot":"","sources":["../../src/inference-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,
|
|
1
|
+
{"version":3,"file":"inference-profile.js","sourceRoot":"","sources":["../../src/inference-profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { FoundationModelIdentifier, type IModel } from "aws-cdk-lib/aws-bedrock";
|
|
2
2
|
import { type IConstruct } from "constructs";
|
|
3
|
-
import type
|
|
3
|
+
import { type ApplicationInferenceProfile, type InferenceProfile } from "./inference-profile.js";
|
|
4
4
|
/**
|
|
5
5
|
* Anything a caller can invoke: an in-Region foundation model, a
|
|
6
6
|
* system-defined or application inference profile, or any {@link IModel} (a
|
|
@@ -17,7 +17,9 @@ export interface InvocationStatement {
|
|
|
17
17
|
/**
|
|
18
18
|
* The statements for invoking `target` from the Region `scope` deploys to:
|
|
19
19
|
* those the Bedrock user guide prescribes, and for an application profile the
|
|
20
|
-
* shape verified against live IAM.
|
|
20
|
+
* shape verified against live IAM. A geographic profile without
|
|
21
|
+
* `routingRegions` grants the model in every Region rather than an
|
|
22
|
+
* enumerated list, still only through the profile (#628).
|
|
21
23
|
*
|
|
22
24
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/geographic-cross-region-inference.html#geographic-cris-iam-setup
|
|
23
25
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/global-cross-region-inference.html#global-cris-iam-setup
|
|
@@ -37,7 +39,9 @@ export declare function sourceArn(source: FoundationModelIdentifier | InferenceP
|
|
|
37
39
|
*
|
|
38
40
|
* {@link modelGrants.invoke} applies these with the conditions the Bedrock
|
|
39
41
|
* user guide prescribes; use this list where you write a policy yourself,
|
|
40
|
-
* such as a service control policy.
|
|
42
|
+
* such as a service control policy. A geographic profile without
|
|
43
|
+
* `routingRegions` yields one Region-wildcard model ARN, so list the Regions
|
|
44
|
+
* on the profile when the policy must name each one.
|
|
41
45
|
*
|
|
42
46
|
* @param scope - Resolves partition, Region and account from its stack. Omit
|
|
43
47
|
* for the `AWS::` pseudo-parameters.
|
|
@@ -45,4 +49,38 @@ export declare function sourceArn(source: FoundationModelIdentifier | InferenceP
|
|
|
45
49
|
export declare function invocationArns(target: InferenceTarget, scope?: IConstruct): string[];
|
|
46
50
|
/** @internal */
|
|
47
51
|
export declare function scopeOf(principal: unknown): IConstruct | undefined;
|
|
52
|
+
/** Options for {@link inferenceTarget.fromId}. */
|
|
53
|
+
export interface InferenceTargetIdOptions {
|
|
54
|
+
/** For a geographic profile id: see {@link GeographicInferenceProfile.routingRegions}. */
|
|
55
|
+
readonly routingRegions?: readonly string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Resolves an id that arrives as a string, such as from configuration, to the
|
|
59
|
+
* target it names:
|
|
60
|
+
*
|
|
61
|
+
* - `anthropic.claude-…` → a `FoundationModelIdentifier`;
|
|
62
|
+
* - `eu.anthropic.claude-…` or `global.anthropic.claude-…` → a system-defined
|
|
63
|
+
* profile, via {@link inferenceProfile.parse};
|
|
64
|
+
* - a provisioned-model ARN → `{ modelArn }`.
|
|
65
|
+
*
|
|
66
|
+
* A two-segment id with an unknown first segment throws rather than being
|
|
67
|
+
* taken for a model named after a geography. A system-defined or application
|
|
68
|
+
* profile ARN throws too: the model it routes to cannot be read from it, and
|
|
69
|
+
* a grant on the ARN alone would be incomplete. Pass the profile value instead.
|
|
70
|
+
*/
|
|
71
|
+
declare function fromId(id: string, options?: InferenceTargetIdOptions): InferenceTarget;
|
|
72
|
+
/**
|
|
73
|
+
* Factories for {@link InferenceTarget} values.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* const ids = ["anthropic.claude-sonnet-5-5", "us.anthropic.claude-haiku-4-5-20251001-v1:0"];
|
|
78
|
+
* createFunctionBuilder().grant(...ids.map((id) => modelGrants.invoke(inferenceTarget.fromId(id))));
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare const inferenceTarget: {
|
|
82
|
+
/** Resolves a model id, system-defined profile id or provisioned-model ARN. */
|
|
83
|
+
fromId: typeof fromId;
|
|
84
|
+
};
|
|
85
|
+
export {};
|
|
48
86
|
//# sourceMappingURL=inference-target.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inference-target.d.ts","sourceRoot":"","sources":["../../src/inference-target.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inference-target.d.ts","sourceRoot":"","sources":["../../src/inference-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,KAAK,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EAKtB,MAAM,wBAAwB,CAAC;AAEhC;;;;GAIG;AACH,MAAM,MAAM,eAAe,GACzB,yBAAyB,GAAG,gBAAgB,GAAG,2BAA2B,GAAG,MAAM,CAAC;AAEtF,gBAAgB;AAChB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,IAAI,gBAAgB,CAEtF;AAUD,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC/D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,eAAe,EACvB,KAAK,CAAC,EAAE,UAAU,GACjB,mBAAmB,EAAE,CASvB;AA6DD;;;GAGG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,yBAAyB,GAAG,gBAAgB,EACpD,KAAK,EAAE,UAAU,GAAG,SAAS,GAC5B,MAAM,CAKR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAEpF;AAED,gBAAgB;AAChB,wBAAgB,OAAO,CAAC,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAElE;AAED,kDAAkD;AAClD,MAAM,WAAW,wBAAwB;IACvC,0FAA0F;IAC1F,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAID;;;;;;;;;;;;;GAaG;AACH,iBAAS,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,eAAe,CA6BnF;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe;IAC1B,+EAA+E;;CAEhF,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FoundationModelIdentifier } from "aws-cdk-lib/aws-bedrock";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
|
+
import { bedrockArn, environmentOf } from "./arn.js";
|
|
4
|
+
import { assertLiteralId, idPrefix, INFERENCE_PROFILE_GEOGRAPHIES, inferenceProfile, } from "./inference-profile.js";
|
|
3
5
|
/** @internal */
|
|
4
6
|
export function isInferenceProfile(target) {
|
|
5
7
|
return "kind" in target && (target.kind === "geographic" || target.kind === "global");
|
|
@@ -10,26 +12,12 @@ function isApplicationProfile(target) {
|
|
|
10
12
|
function isModel(target) {
|
|
11
13
|
return "modelArn" in target;
|
|
12
14
|
}
|
|
13
|
-
function environmentOf(scope) {
|
|
14
|
-
return scope === undefined
|
|
15
|
-
? { partition: Aws.PARTITION, region: Aws.REGION, account: Aws.ACCOUNT_ID }
|
|
16
|
-
: Stack.of(scope);
|
|
17
|
-
}
|
|
18
|
-
function bedrockArn(partition, resource, resourceName, region, account = "") {
|
|
19
|
-
return Arn.format({
|
|
20
|
-
partition,
|
|
21
|
-
service: "bedrock",
|
|
22
|
-
region,
|
|
23
|
-
account,
|
|
24
|
-
resource,
|
|
25
|
-
resourceName,
|
|
26
|
-
arnFormat: ArnFormat.SLASH_RESOURCE_NAME,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
15
|
/**
|
|
30
16
|
* The statements for invoking `target` from the Region `scope` deploys to:
|
|
31
17
|
* those the Bedrock user guide prescribes, and for an application profile the
|
|
32
|
-
* shape verified against live IAM.
|
|
18
|
+
* shape verified against live IAM. A geographic profile without
|
|
19
|
+
* `routingRegions` grants the model in every Region rather than an
|
|
20
|
+
* enumerated list, still only through the profile (#628).
|
|
33
21
|
*
|
|
34
22
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/geographic-cross-region-inference.html#geographic-cris-iam-setup
|
|
35
23
|
* @see https://docs.aws.amazon.com/bedrock/latest/userguide/global-cross-region-inference.html#global-cris-iam-setup
|
|
@@ -76,7 +64,9 @@ function sourceStatements(target, scope, viaProfile) {
|
|
|
76
64
|
const models = target.kind === "geographic"
|
|
77
65
|
? [
|
|
78
66
|
{
|
|
79
|
-
resourceArns:
|
|
67
|
+
resourceArns: (target.routingRegions
|
|
68
|
+
? [...new Set([sourceRegion, ...target.routingRegions])]
|
|
69
|
+
: ["*"]).map((region) => modelArn(modelId, region)),
|
|
80
70
|
conditions: { StringEquals: via },
|
|
81
71
|
},
|
|
82
72
|
]
|
|
@@ -110,7 +100,9 @@ export function sourceArn(source, scope) {
|
|
|
110
100
|
*
|
|
111
101
|
* {@link modelGrants.invoke} applies these with the conditions the Bedrock
|
|
112
102
|
* user guide prescribes; use this list where you write a policy yourself,
|
|
113
|
-
* such as a service control policy.
|
|
103
|
+
* such as a service control policy. A geographic profile without
|
|
104
|
+
* `routingRegions` yields one Region-wildcard model ARN, so list the Regions
|
|
105
|
+
* on the profile when the policy must name each one.
|
|
114
106
|
*
|
|
115
107
|
* @param scope - Resolves partition, Region and account from its stack. Omit
|
|
116
108
|
* for the `AWS::` pseudo-parameters.
|
|
@@ -122,4 +114,58 @@ export function invocationArns(target, scope) {
|
|
|
122
114
|
export function scopeOf(principal) {
|
|
123
115
|
return Construct.isConstruct(principal) ? principal : undefined;
|
|
124
116
|
}
|
|
117
|
+
const PROVISIONED_MODEL_ARN = ":provisioned-model/";
|
|
118
|
+
/**
|
|
119
|
+
* Resolves an id that arrives as a string, such as from configuration, to the
|
|
120
|
+
* target it names:
|
|
121
|
+
*
|
|
122
|
+
* - `anthropic.claude-…` → a `FoundationModelIdentifier`;
|
|
123
|
+
* - `eu.anthropic.claude-…` or `global.anthropic.claude-…` → a system-defined
|
|
124
|
+
* profile, via {@link inferenceProfile.parse};
|
|
125
|
+
* - a provisioned-model ARN → `{ modelArn }`.
|
|
126
|
+
*
|
|
127
|
+
* A two-segment id with an unknown first segment throws rather than being
|
|
128
|
+
* taken for a model named after a geography. A system-defined or application
|
|
129
|
+
* profile ARN throws too: the model it routes to cannot be read from it, and
|
|
130
|
+
* a grant on the ARN alone would be incomplete. Pass the profile value instead.
|
|
131
|
+
*/
|
|
132
|
+
function fromId(id, options = {}) {
|
|
133
|
+
assertLiteralId(id, "Inference target id");
|
|
134
|
+
if (id.startsWith("arn:")) {
|
|
135
|
+
if (id.includes(PROVISIONED_MODEL_ARN))
|
|
136
|
+
return { modelArn: id };
|
|
137
|
+
throw new Error(`"${id}" is an ARN. inferenceTarget.fromId resolves foundation-model and system-defined ` +
|
|
138
|
+
`profile ids, and provisioned-model ARNs. For an inference profile pass its id, or an ` +
|
|
139
|
+
`ApplicationInferenceProfile value, so the model it routes to is granted as well.`);
|
|
140
|
+
}
|
|
141
|
+
const parsed = idPrefix(id);
|
|
142
|
+
if (!parsed) {
|
|
143
|
+
throw new Error(`"${id}" is not a foundation model or inference profile id.`);
|
|
144
|
+
}
|
|
145
|
+
const { prefix, isProfile } = parsed;
|
|
146
|
+
if (isProfile)
|
|
147
|
+
return inferenceProfile.parse(id, options.routingRegions);
|
|
148
|
+
if (id.includes(".", prefix.length + 1)) {
|
|
149
|
+
throw new Error(`"${id}" looks like an inference profile id, but "${prefix}" is neither global nor one ` +
|
|
150
|
+
`of INFERENCE_PROFILE_GEOGRAPHIES (${INFERENCE_PROFILE_GEOGRAPHIES.join(", ")}). ` +
|
|
151
|
+
`For a new geography use inferenceProfile.geographic().`);
|
|
152
|
+
}
|
|
153
|
+
if (options.routingRegions !== undefined) {
|
|
154
|
+
throw new Error(`"${id}" is a foundation model id; routingRegions apply to a geographic profile.`);
|
|
155
|
+
}
|
|
156
|
+
return new FoundationModelIdentifier(id);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Factories for {@link InferenceTarget} values.
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* const ids = ["anthropic.claude-sonnet-5-5", "us.anthropic.claude-haiku-4-5-20251001-v1:0"];
|
|
164
|
+
* createFunctionBuilder().grant(...ids.map((id) => modelGrants.invoke(inferenceTarget.fromId(id))));
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
export const inferenceTarget = {
|
|
168
|
+
/** Resolves a model id, system-defined profile id or provisioned-model ARN. */
|
|
169
|
+
fromId,
|
|
170
|
+
};
|
|
125
171
|
//# sourceMappingURL=inference-target.js.map
|