AWS Bedrock chat model integration.

Setup: Install @langchain/community and set the following environment variables:

npm install @langchain/openai
export BEDROCK_AWS_REGION="your-aws-region"
export BEDROCK_AWS_SECRET_ACCESS_KEY="your-aws-secret-access-key"
export BEDROCK_AWS_ACCESS_KEY_ID="your-aws-access-key-id"

See full list of supported init args and their descriptions in the constructor section.

Instantiate
import { BedrockChat } from '@langchain/community/chat_models/bedrock';

const llm = new BedrockChat({
region: process.env.BEDROCK_AWS_REGION,
maxRetries: 0,
credentials: {
secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,
accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,
},
model: "anthropic.claude-3-5-sonnet-20240620-v1:0",
temperature: 0,
maxTokens: undefined,
// other params...
});

Invoking
const messages = [
{
type: "system" as const,
content: "You are a helpful translator. Translate the user sentence to French.",
},
{
type: "human" as const,
content: "I love programming.",
},
];
const result = await llm.invoke(messages);
console.log(result);
AIMessage {
  "content": "Here's the translation to French:\n\nJ'adore la programmation.",
  "additional_kwargs": {
    "id": "msg_bdrk_01HCZHa2mKbMZeTeHjLDd286"
  },
  "response_metadata": {
    "type": "message",
    "role": "assistant",
    "model": "claude-3-5-sonnet-20240620",
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
      "input_tokens": 25,
      "output_tokens": 19
    }
  },
  "tool_calls": [],
  "invalid_tool_calls": []
}

Streaming Chunks
for await (const chunk of await llm.stream(messages)) {
console.log(chunk);
}
AIMessageChunk {
  "content": "",
  "additional_kwargs": {
    "id": "msg_bdrk_01RhFuGR9uJ2bj5GbdAma4y6"
  },
  "response_metadata": {
    "type": "message",
    "role": "assistant",
    "model": "claude-3-5-sonnet-20240620",
    "stop_reason": null,
    "stop_sequence": null
  },
}
AIMessageChunk {
  "content": "J",
}
AIMessageChunk {
  "content": "'adore la",
}
AIMessageChunk {
  "content": " programmation.",
}
AIMessageChunk {
  "content": "",
  "additional_kwargs": {
    "stop_reason": "end_turn",
    "stop_sequence": null
  },
}
AIMessageChunk {
  "content": "",
  "response_metadata": {
    "amazon-bedrock-invocationMetrics": {
      "inputTokenCount": 25,
      "outputTokenCount": 11,
      "invocationLatency": 659,
      "firstByteLatency": 506
    }
  },
  "usage_metadata": {
    "input_tokens": 25,
    "output_tokens": 11,
    "total_tokens": 36
  }
}

Aggregate Streamed Chunks
import { AIMessageChunk } from '@langchain/core/messages';
import { concat } from '@langchain/core/utils/stream';

const stream = await llm.stream(messages);
let full: AIMessageChunk | undefined;
for await (const chunk of stream) {
full = !full ? chunk : concat(full, chunk);
}
console.log(full);
AIMessageChunk {
  "content": "J'adore la programmation.",
  "additional_kwargs": {
    "id": "msg_bdrk_017b6PuBybA51P5LZ9K6gZHm",
    "stop_reason": "end_turn",
    "stop_sequence": null
  },
  "response_metadata": {
    "type": "message",
    "role": "assistant",
    "model": "claude-3-5-sonnet-20240620",
    "stop_reason": null,
    "stop_sequence": null,
    "amazon-bedrock-invocationMetrics": {
      "inputTokenCount": 25,
      "outputTokenCount": 11,
      "invocationLatency": 1181,
      "firstByteLatency": 1177
    }
  },
  "usage_metadata": {
    "input_tokens": 25,
    "output_tokens": 11,
    "total_tokens": 36
  }
}

Bind tools
import { z } from 'zod';
import { AIMessage } from '@langchain/core/messages';

const GetWeather = {
name: "GetWeather",
description: "Get the current weather in a given location",
schema: z.object({
location: z.string().describe("The city and state, e.g. San Francisco, CA")
}),
}

const GetPopulation = {
name: "GetPopulation",
description: "Get the current population in a given location",
schema: z.object({
location: z.string().describe("The city and state, e.g. San Francisco, CA")
}),
}

const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);
const aiMsg: AIMessage = await llmWithTools.invoke(
"Which city is hotter today and which is bigger: LA or NY?"
);
console.log(aiMsg.tool_calls);
[
  {
    name: 'GetWeather',
    args: { location: 'Los Angeles, CA' },
    id: 'toolu_bdrk_01R2daqwHR931r4baVNzbe38',
    type: 'tool_call'
  },
  {
    name: 'GetWeather',
    args: { location: 'New York, NY' },
    id: 'toolu_bdrk_01WDadwNc7PGqVZvCN7Dr7eD',
    type: 'tool_call'
  },
  {
    name: 'GetPopulation',
    args: { location: 'Los Angeles, CA' },
    id: 'toolu_bdrk_014b8zLkpAgpxrPfewKinJFc',
    type: 'tool_call'
  },
  {
    name: 'GetPopulation',
    args: { location: 'New York, NY' },
    id: 'toolu_bdrk_01Tt8K2MUP15kNuMDFCLEFKN',
    type: 'tool_call'
  }
]

Structured Output
const Joke = z.object({
setup: z.string().describe("The setup of the joke"),
punchline: z.string().describe("The punchline to the joke"),
rating: z.number().optional().describe("How funny the joke is, from 1 to 10")
}).describe('Joke to tell user.');

const structuredLlm = llm.withStructuredOutput(Joke);
const jokeResult = await structuredLlm.invoke("Tell me a joke about cats");
console.log(jokeResult);
{
  setup: "Why don't cats play poker in the jungle?",
  punchline: 'Too many cheetahs!'
}

Response Metadata
const aiMsgForResponseMetadata = await llm.invoke(messages);
console.log(aiMsgForResponseMetadata.response_metadata);
"response_metadata": {
  "type": "message",
  "role": "assistant",
  "model": "claude-3-5-sonnet-20240620",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 25,
    "output_tokens": 19
  }
}

Hierarchy (view full)

Implements

  • BaseBedrockInput

Constructors

Properties

codec: EventStreamCodec = ...
credentials: CredentialType

AWS Credentials. If no credentials are provided, the default credentials from @aws-sdk/credential-provider-node will be used.

fetchFn: {
    (input: URL | RequestInfo, init?: RequestInit): Promise<Response>;
    (input: RequestInfo, init?: RequestInit): Promise<Response>;
}

A custom fetch function for low-level access to AWS API. Defaults to fetch().

Type declaration

    • (input, init?): Promise<Response>
    • Parameters

      • input: URL | RequestInfo
      • Optionalinit: RequestInit

      Returns Promise<Response>

    • (input, init?): Promise<Response>
    • Parameters

      • input: RequestInfo
      • Optionalinit: RequestInit

      Returns Promise<Response>

guardrailIdentifier: string = ""

Identifier for the guardrail configuration.

guardrailVersion: string = ""

Version for the guardrail configuration.

model: string = "amazon.titan-tg1-large"

Model to use. For example, "amazon.titan-tg1-large", this is equivalent to the modelId property in the list-foundation-models api.

region: string

The AWS region e.g. us-west-2. Fallback to AWS_DEFAULT_REGION env variable or region specified in ~/.aws/config in case it is not provided here.

streaming: boolean = false

Whether or not to stream responses

usesMessagesApi: boolean = false
endpointHost?: string

Override the default endpoint hostname.

guardrailConfig?: {
    streamProcessingMode: "SYNCHRONOUS" | "ASYNCHRONOUS";
    tagSuffix: string;
}

Required when Guardrail is in use.

maxTokens?: number = undefined

Max tokens.

modelKwargs?: Record<string, unknown>

Additional kwargs to pass to the model.

stopSequences?: string[]

Use as a call option using .bind() instead.

temperature?: number = undefined

Temperature.

trace?: "ENABLED" | "DISABLED"

Trace settings for the Bedrock Guardrails.

Methods

  • Parameters

    • tools: any[]
    • Optional_kwargs: Partial<unknown>

    Returns Runnable<BaseLanguageModelInput, BaseMessageChunk, this["ParsedCallOptions"]>

  • Parameters

    • Optionaloptions: unknown

    Returns {
        guardrailConfig: undefined | {
            streamProcessingMode: "SYNCHRONOUS" | "ASYNCHRONOUS";
            tagSuffix: string;
        };
        max_tokens: undefined | number;
        modelKwargs: undefined | Record<string, unknown>;
        stop: any;
        temperature: undefined | number;
        tools: AnthropicTool[];
    }

    • guardrailConfig: undefined | {
          streamProcessingMode: "SYNCHRONOUS" | "ASYNCHRONOUS";
          tagSuffix: string;
      }
    • max_tokens: undefined | number
    • modelKwargs: undefined | Record<string, unknown>
    • stop: any
    • temperature: undefined | number
    • tools: AnthropicTool[]
""