""" Translates from Cohere's `/v1/rerank` input format to Bedrock's `/rerank` input format. Why separate file? Make it easy to see how transformation works """ import uuid from typing import List, Optional, Union from litellm.types.llms.bedrock import ( BedrockRerankBedrockRerankingConfiguration, BedrockRerankConfiguration, BedrockRerankInlineDocumentSource, BedrockRerankModelConfiguration, BedrockRerankQuery, BedrockRerankRequest, BedrockRerankSource, BedrockRerankTextDocument, BedrockRerankTextQuery, ) from litellm.types.rerank import ( RerankBilledUnits, RerankRequest, RerankResponse, RerankResponseMeta, RerankResponseResult, RerankTokens, ) class BedrockRerankConfig: def _transform_sources( self, documents: List[Union[str, dict]] ) -> List[BedrockRerankSource]: """ Transform the sources from RerankRequest format to Bedrock format. """ _sources = [] for document in documents: if isinstance(document, str): _sources.append( BedrockRerankSource( inlineDocumentSource=BedrockRerankInlineDocumentSource( textDocument=BedrockRerankTextDocument(text=document), type="TEXT", ), type="INLINE", ) ) else: _sources.append( BedrockRerankSource( inlineDocumentSource=BedrockRerankInlineDocumentSource( jsonDocument=document, type="JSON" ), type="INLINE", ) ) return _sources def _transform_request(self, request_data: RerankRequest) -> BedrockRerankRequest: """ Transform the request from RerankRequest format to Bedrock format. """ _sources = self._transform_sources(request_data.documents) return BedrockRerankRequest( queries=[ BedrockRerankQuery( textQuery=BedrockRerankTextQuery(text=request_data.query), type="TEXT", ) ], rerankingConfiguration=BedrockRerankConfiguration( bedrockRerankingConfiguration=BedrockRerankBedrockRerankingConfiguration( modelConfiguration=BedrockRerankModelConfiguration( modelArn=request_data.model ), numberOfResults=request_data.top_n or len(request_data.documents), ), type="BEDROCK_RERANKING_MODEL", ), sources=_sources, ) def _transform_response(self, response: dict) -> RerankResponse: """ Transform the response from Bedrock into the RerankResponse format. example input: {"results":[{"index":0,"relevanceScore":0.6847912669181824},{"index":1,"relevanceScore":0.5980774760246277}]} """ _billed_units = RerankBilledUnits(**response.get("usage", {})) _tokens = RerankTokens(**response.get("usage", {})) rerank_meta = RerankResponseMeta(billed_units=_billed_units, tokens=_tokens) _results: Optional[List[RerankResponseResult]] = None bedrock_results = response.get("results") if bedrock_results: _results = [ RerankResponseResult( index=result.get("index"), relevance_score=result.get("relevanceScore"), ) for result in bedrock_results ] if _results is None: raise ValueError(f"No results found in the response={response}") return RerankResponse( id=response.get("id") or str(uuid.uuid4()), results=_results, meta=rerank_meta, ) # Return response