|
3 | 3 | import json
|
4 | 4 | import os
|
5 | 5 | from typing import Any, Dict, List, Mapping, Optional
|
| 6 | +from datetime import datetime |
6 | 7 |
|
7 | 8 | from helm.common.cache import CacheConfig
|
8 | 9 | from helm.clients.client import CachingClient, truncate_and_tokenize_response_text
|
9 | 10 | from helm.common.request import Request, RequestResult, GeneratedOutput, wrap_request_time
|
10 |
| -from helm.clients.bedrock_utils import get_bedrock_client |
| 11 | +from helm.common.hierarchical_logger import htrack_block |
| 12 | +from helm.clients.bedrock_utils import get_bedrock_client, get_bedrock_client_v1 |
11 | 13 | from helm.tokenizers.tokenizer import Tokenizer
|
12 | 14 |
|
13 | 15 |
|
@@ -96,6 +98,81 @@ def do_it() -> Dict[Any, Any]:
|
96 | 98 | )
|
97 | 99 |
|
98 | 100 |
|
| 101 | +class BedrockNovaClient(CachingClient): |
| 102 | + |
| 103 | + """ |
| 104 | + Amazon Bedrock is a fully managed service that provides s selection of leading foundation models (FMs) from Amazon |
| 105 | + and other partner model providers. |
| 106 | + """ |
| 107 | + |
| 108 | + def __init__( |
| 109 | + self, |
| 110 | + cache_config: CacheConfig, |
| 111 | + tokenizer: Tokenizer, |
| 112 | + tokenizer_name: str, |
| 113 | + bedrock_model_id: Optional[str] = None, |
| 114 | + assumed_role: Optional[str] = None, |
| 115 | + region: Optional[str] = None, |
| 116 | + ): |
| 117 | + super().__init__(cache_config=cache_config) |
| 118 | + self.tokenizer = tokenizer |
| 119 | + self.tokenizer_name = tokenizer_name |
| 120 | + self.bedrock_model_id = bedrock_model_id |
| 121 | + self.bedrock_client = get_bedrock_client_v1( |
| 122 | + assumed_role=assumed_role or os.environ.get("BEDROCK_ASSUME_ROLE", None), |
| 123 | + region=region or os.environ.get("AWS_DEFAULT_REGION", None), |
| 124 | + ) |
| 125 | + |
| 126 | + def convert_request_to_raw_request(self, request: Request) -> Dict: |
| 127 | + model_id = request.model.replace("/", ".") |
| 128 | + messages = [ |
| 129 | + { |
| 130 | + "role": "user", |
| 131 | + "content": [ |
| 132 | + { |
| 133 | + "text": request.prompt |
| 134 | + } |
| 135 | + ] |
| 136 | + } |
| 137 | + ] |
| 138 | + |
| 139 | + return { |
| 140 | + "modelId": model_id, |
| 141 | + "inferenceConfig": { |
| 142 | + "temperature": request.temperature, |
| 143 | + "maxTokens": request.max_tokens, |
| 144 | + "topP": request.top_p |
| 145 | + }, |
| 146 | + "messages": messages, |
| 147 | + } |
| 148 | + |
| 149 | + def make_request(self, request: Request) -> RequestResult: |
| 150 | + raw_request = self.convert_request_to_raw_request(request) |
| 151 | + response = self.bedrock_client.converse(**raw_request) |
| 152 | + completions = self.convert_raw_response_to_completions(response, request) |
| 153 | + dt = datetime.strptime(response["ResponseMetadata"]["HTTPHeaders"]["date"], "%a, %d %b %Y %H:%M:%S GMT") |
| 154 | + |
| 155 | + return RequestResult( |
| 156 | + success=True, |
| 157 | + cached=False, |
| 158 | + request_time=response["metrics"]["latencyMs"], |
| 159 | + request_datetime=int(dt.timestamp()), |
| 160 | + completions=completions, |
| 161 | + embedding=[], |
| 162 | + ) |
| 163 | + |
| 164 | + def convert_raw_response_to_completions(self, response: Dict, request: Request) -> List[GeneratedOutput]: |
| 165 | + completions: List[GeneratedOutput] = [] |
| 166 | + raw_completion = response["output"] |
| 167 | + output_text = raw_completion["message"]["content"][0]["text"] |
| 168 | + finish_reason = response["stopReason"] |
| 169 | + completion = truncate_and_tokenize_response_text( |
| 170 | + output_text.lstrip(), request, self.tokenizer, self.tokenizer_name, finish_reason |
| 171 | + ) |
| 172 | + completions.append(completion) |
| 173 | + return completions |
| 174 | + |
| 175 | + |
99 | 176 | # Amazon Bedrock Client for Titan Models
|
100 | 177 | class BedrockTitanClient(BedrockClient):
|
101 | 178 | _COMPLETION_REASON_TO_FINISH_REASON = {
|
|
0 commit comments