|
@@ -74,12 +74,12 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
|
|
|
|
|
|
# invoke claude 3 models via anthropic official SDK
|
|
|
if "anthropic.claude-3" in model:
|
|
|
- return self._invoke_claude3(model, credentials, prompt_messages, model_parameters, stop, stream)
|
|
|
+ return self._invoke_claude3(model, credentials, prompt_messages, model_parameters, stop, stream, user)
|
|
|
# invoke model
|
|
|
return self._generate(model, credentials, prompt_messages, model_parameters, stop, stream, user)
|
|
|
|
|
|
def _invoke_claude3(self, model: str, credentials: dict, prompt_messages: list[PromptMessage], model_parameters: dict,
|
|
|
- stop: Optional[list[str]] = None, stream: bool = True) -> Union[LLMResult, Generator]:
|
|
|
+ stop: Optional[list[str]] = None, stream: bool = True, user: Optional[str] = None) -> Union[LLMResult, Generator]:
|
|
|
"""
|
|
|
Invoke Claude3 large language model
|
|
|
|
|
@@ -100,22 +100,38 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
|
|
|
aws_region=credentials["aws_region"],
|
|
|
)
|
|
|
|
|
|
+ extra_model_kwargs = {}
|
|
|
+ if stop:
|
|
|
+ extra_model_kwargs['stop_sequences'] = stop
|
|
|
+
|
|
|
+ # Notice: If you request the current version of the SDK to the bedrock server,
|
|
|
+ # you will get the following error message and you need to wait for the service or SDK to be updated.
|
|
|
+ # Response: Error code: 400
|
|
|
+ # {'message': 'Malformed input request: #: subject must not be valid against schema
|
|
|
+ # {"required":["messages"]}#: extraneous key [metadata] is not permitted, please reformat your input and try again.'}
|
|
|
+ # TODO: Open in the future when the interface is properly supported
|
|
|
+ # if user:
|
|
|
+ # ref: https://github.com/anthropics/anthropic-sdk-python/blob/e84645b07ca5267066700a104b4d8d6a8da1383d/src/anthropic/resources/messages.py#L465
|
|
|
+ # extra_model_kwargs['metadata'] = message_create_params.Metadata(user_id=user)
|
|
|
+
|
|
|
system, prompt_message_dicts = self._convert_claude3_prompt_messages(prompt_messages)
|
|
|
|
|
|
+ if system:
|
|
|
+ extra_model_kwargs['system'] = system
|
|
|
+
|
|
|
response = client.messages.create(
|
|
|
model=model,
|
|
|
messages=prompt_message_dicts,
|
|
|
- stop_sequences=stop if stop else [],
|
|
|
- system=system,
|
|
|
stream=stream,
|
|
|
**model_parameters,
|
|
|
+ **extra_model_kwargs
|
|
|
)
|
|
|
|
|
|
- if stream is False:
|
|
|
- return self._handle_claude3_response(model, credentials, response, prompt_messages)
|
|
|
- else:
|
|
|
+ if stream:
|
|
|
return self._handle_claude3_stream_response(model, credentials, response, prompt_messages)
|
|
|
|
|
|
+ return self._handle_claude3_response(model, credentials, response, prompt_messages)
|
|
|
+
|
|
|
def _handle_claude3_response(self, model: str, credentials: dict, response: Message,
|
|
|
prompt_messages: list[PromptMessage]) -> LLMResult:
|
|
|
"""
|
|
@@ -263,13 +279,22 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
|
|
|
"""
|
|
|
Convert prompt messages to dict list and system
|
|
|
"""
|
|
|
- system = ""
|
|
|
- prompt_message_dicts = []
|
|
|
|
|
|
+ system = ""
|
|
|
+ first_loop = True
|
|
|
for message in prompt_messages:
|
|
|
if isinstance(message, SystemPromptMessage):
|
|
|
- system += message.content + ("\n" if not system else "")
|
|
|
- else:
|
|
|
+ message.content=message.content.strip()
|
|
|
+ if first_loop:
|
|
|
+ system=message.content
|
|
|
+ first_loop=False
|
|
|
+ else:
|
|
|
+ system+="\n"
|
|
|
+ system+=message.content
|
|
|
+
|
|
|
+ prompt_message_dicts = []
|
|
|
+ for message in prompt_messages:
|
|
|
+ if not isinstance(message, SystemPromptMessage):
|
|
|
prompt_message_dicts.append(self._convert_claude3_prompt_message_to_dict(message))
|
|
|
|
|
|
return system, prompt_message_dicts
|