1import type * as bedrock from "@distilled.cloud/aws/bedrock-agent-runtime";
2import type * as Effect from "effect/Effect";
3import * as Binding from "../../Binding.ts";
4import type { KnowledgeBase } from "./KnowledgeBase.ts";
5
6/**
7 * The `RetrieveAndGenerateStream` request. The knowledge base is referenced
8 * inside
9 * `retrieveAndGenerateConfiguration.knowledgeBaseConfiguration.knowledgeBaseId`
10 * — pass the bound {@link KnowledgeBase}'s `knowledgeBaseId` there.
11 */
12export interface RetrieveAndGenerateStreamRequest
13 extends bedrock.RetrieveAndGenerateStreamRequest {}
14
15/**
16 * Runtime binding for `bedrock-agent-runtime:RetrieveAndGenerateStream` —
17 * the streaming variant of {@link RetrieveAndGenerate}. The grounded answer
18 * arrives as an event `Stream` of `output` text deltas, `citation` events,
19 * and `guardrail` events instead of a single response.
20 *
21 * Bind a knowledge base and one or more generation models inside a function
22 * runtime. The binding grants `bedrock:Retrieve` and
23 * `bedrock:RetrieveAndGenerate` scoped to the knowledge base, plus
24 * `bedrock:InvokeModel` scoped to the bound models (or all foundation models
25 * and cross-region inference profiles when none are named).
26 *
27 * ### Streaming a Grounded Answer
28 * **Example:** Aggregate Streamed Output Deltas
29 * ```typescript
30 * // init
31 * const ragStream = yield* Bedrock.RetrieveAndGenerateStream(
32 * knowledgeBase,
33 * "us.amazon.nova-micro-v1:0",
34 * );
35 *
36 * // runtime
37 * const result = yield* ragStream({
38 * input: { text: "How do I rotate credentials?" },
39 * retrieveAndGenerateConfiguration: {
40 * type: "KNOWLEDGE_BASE",
41 * knowledgeBaseConfiguration: {
42 * knowledgeBaseId: yield* knowledgeBase.knowledgeBaseId,
43 * modelArn: "us.amazon.nova-micro-v1:0",
44 * },
45 * },
46 * });
47 * const events = yield* Stream.runCollect(result.stream);
48 * const answer = events.map((event) => event.output?.text ?? "").join("");
49 * ```
50 *
51 * @binding
52 */
53export interface RetrieveAndGenerateStream extends Binding.Service<
54 RetrieveAndGenerateStream,
55 "AWS.Bedrock.RetrieveAndGenerateStream",
56 <K extends KnowledgeBase>(
57 knowledgeBase: K,
58 ...models: string[]
59 ) => Effect.Effect<
60 (
61 request: RetrieveAndGenerateStreamRequest,
62 ) => Effect.Effect<
63 bedrock.RetrieveAndGenerateStreamResponse,
64 bedrock.RetrieveAndGenerateStreamError
65 >
66 >
67> {}
68export const RetrieveAndGenerateStream =
69 Binding.Service<RetrieveAndGenerateStream>(
70 "AWS.Bedrock.RetrieveAndGenerateStream",
71 );