Ë
    kQêjj  ã                   ób   — d dl Z d dlZd dlmZ d dlmZ d dlZddlm	Z	 ddl
mZ  G d„ d	e«      Zy)
é    N)Úcached_property)ÚOptionalé   )Úattempt_import_or_raiseé   )ÚRerankerc                   óþ   ‡ — e Zd ZdZ	 	 	 	 ddededee   fˆ fd„Zd„ Zdej                  defd	„Z
ded
ej                  dej                  fd„Zded
ej                  fd„Zdedej                  fd„Zed„ «       Zˆ xZS )ÚOpenaiRerankera¦  
    Reranks the results using the OpenAI API.
    WARNING: This is a prompt based reranker that uses chat model that is
    not a dedicated reranker API. This should be treated as experimental.

    Parameters
    ----------
    model_name : str, default "gpt-5.6-sol"
        The name of the cross encoder model to use.
    column : str, default "text"
        The name of the column to use as input to the cross encoder model.
    return_score : str, default "relevance"
        options are "relevance" or "all". Only "relevance" is supported for now.
    api_key : str, default None
        The API key to use. If None, will use the OPENAI_API_KEY environment variable.
    Ú
model_nameÚcolumnÚapi_keyc                 óN   •— t         ‰| �  |«       || _        || _        || _        y ©N)ÚsuperÚ__init__r   r   r   )Úselfr   r   Úreturn_scorer   Ú	__class__s        €ú]/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/lancedb/rerankers/openai.pyr   zOpenaiReranker.__init__"   s'   ø€ ô 	‰Ñ˜Ô&Ø$ˆŒØˆŒØˆ�ó    c                 ó"   — d| j                   › d�S )NzOpenaiReranker(model_name=ú))r   )r   s    r   Ú__str__zOpenaiReranker.__str__.   s   € Ø+¨D¯O©OÐ+<¸AÐ>Ð>r   Ú
result_setÚqueryc           
      óÈ  ‡
— | j                  |«      }t        |«      dk(  r|S || j                     j                  «       }| j                  j
                  j                  j                  | j                  ddidddœdd|› d	|› �dœg¬
«      }t        j                  |j                  d   j                  j                  «      d   }|D �ci c]  }|d   |d   “Œ c}Š
t        ˆ
fd„|D «       «      }|rt        d|› dt        |«      › d�«      ‚|D �cg c]  }‰
|   ‘Œ	 }	}|j!                  dt#        j$                  |	t#        j&                  «       ¬«      «      }|S c c}w c c}w )Nr   ÚtypeÚjson_objectÚsystema$  You are an expert relevance ranker. Given a list of                        documents and a query, your job is to determine the relevance                        each document is for answering the query. Your output is JSON,                        which is a list of documents. Each document has two fields,                        content and relevance_score.  relevance_score is from 0.0 to                        1.0 indicating the relevance of the text to the given query.                        Make sure to include all documents in the response.)ÚroleÚcontentÚuserzQuery: z Docs: )ÚmodelÚresponse_formatÚmessagesÚ	documentsr!   Úrelevance_scorec              3   ó&   •K  — | ]  }|‰v–— Œ
 y ­wr   © )Ú.0ÚdocÚscores_by_contents     €r   ú	<genexpr>z)OpenaiReranker._rerank.<locals>.<genexpr>M   s   øè ø€ ÒC°s�cÐ!2Ô2ÑCùs   ƒz*The model returned no relevance_score for z of z
 documentsÚ_relevance_score)r   )Ú_handle_empty_resultsÚlenr   Ú	to_pylistÚ_clientÚchatÚcompletionsÚcreater   ÚjsonÚloadsÚchoicesÚmessager!   ÚsumÚ
ValueErrorÚappend_columnÚpaÚarrayÚfloat32)r   r   r   ÚdocsÚresponseÚresultsÚresultÚmissingr+   Úscoresr,   s             @r   Ú_rerankzOpenaiReranker._rerank1   s€  ø€ Ø×/Ñ/°
Ó;ˆ
Üˆz‹?˜aÒØÐØ˜$Ÿ+™+Ñ&×0Ñ0Ó2ˆØ—<‘<×$Ñ$×0Ñ0×7Ñ7Ø—/‘/Ø# ]Ð3ð %ð Mñ	ð  ¨g°e°W¸GÀDÀ6Ð,JÑKðð 8ó 
ˆô" —*‘*˜X×-Ñ-¨aÑ0×8Ñ8×@Ñ@ÓAÀ+ÑNˆð HOö
Ø=CˆF�9Ñ˜vÐ&7Ñ8Ñ8ò
Ðô ÓC¸dÔCÓCˆÙÜØ<¸W¸IÀTÜ�t“9�+˜Zð)óð ð 59Ö9¨SÐ# CÓ(Ð9ˆÐ9Ø×-Ñ-Ø¤§¡¨´b·j±j³lÔ Có
ˆ
ð Ðùò
ùò :s   Ã	EÄEÚvector_resultsÚfts_resultsc                 óö   — | j                   dk(  r| j                  ||«      }n| j                  ||«      }| j                  ||«      }| j                   dk(  r| j	                  |«      }|j                  dg«      }|S )NÚallÚ	relevance©r.   Ú
descending)ÚscoreÚ_merge_and_keep_scoresÚmerge_resultsrF   Ú_keep_relevance_scoreÚsort_by)r   r   rG   rH   Úcombined_resultss        r   Úrerank_hybridzOpenaiReranker.rerank_hybridZ   s…   € ð �:‰:˜ÒØ#×:Ñ:¸>È;ÓWÑà#×1Ñ1°.À+ÓNÐØŸ<™<Ð(8¸%Ó@ÐØ�:‰:˜Ò$Ø#×9Ñ9Ð:JÓKÐà+×3Ñ3Ø/Ð0ó
Ðð  Ðr   c                 ó�   — | j                  ||«      }| j                  dk(  r|j                  dg«      }|j                  dg«      }|S )NrK   Ú	_distancerL   ©rF   rN   Údrop_columnsrR   )r   r   rG   s      r   Úrerank_vectorzOpenaiReranker.rerank_vectorn   sJ   € ØŸ™ n°eÓ<ˆØ�:‰:˜Ò$Ø+×8Ñ8¸+¸ÓGˆNØ'×/Ñ/Ð1SÐ0TÓUˆØÐr   c                 ó�   — | j                  ||«      }| j                  dk(  r|j                  dg«      }|j                  dg«      }|S )NrK   Ú_scorerL   rW   )r   r   rH   s      r   Ú
rerank_ftszOpenaiReranker.rerank_ftsu   sJ   € Ø—l‘l ;°Ó6ˆØ�:‰:˜Ò$Ø%×2Ñ2°H°:Ó>ˆKØ!×)Ñ)Ð+MÐ*NÓOˆØÐr   c                 óþ   — t        d«      }t        j                  j                  d«      €| j                  €t        d«      ‚|j                  | j                  xs t        j                  j                  d«      ¬«      S )NÚopenaiÚOPENAI_API_KEYz�OPENAI_API_KEY not set. Either set it in your environment or                 pass it as `api_key` argument to the CohereReranker.)r   )r   ÚosÚenvironÚgetr   r;   ÚOpenAI)r   r^   s     r   r2   zOpenaiReranker._client|   sk   € ä(Øó
ˆô �:‰:�>‰>Ð*Ó+Ð3¸¿¹Ð8LÜðFóð ð �}‰} T§\¡\Ò%U´R·Z±Z·^±^ÐDTÓ5Uˆ}ÓVÐVr   )zgpt-5.6-solÚtextrK   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr   r   r   r=   ÚTablerF   rT   rY   r\   r   r2   Ú__classcell__)r   s   @r   r
   r
      sÅ   ø„ ñð& (ØØ Ø!%ñ
àð
ð ð
ð
 ˜#‘õ
ò?ð' "§(¡(ð '°3ó 'ðR àð ð Ÿ™ð ð —X‘Xó	 ð( 3ð ¸¿¹ó ð ð °"·(±(ó ð ñ	Wó ô	Wr   r
   )r6   r`   Ú	functoolsr   Útypingr   Úpyarrowr=   Úutilr   Úbaser   r
   r)   r   r   ú<module>rq      s,   ðó
 Û 	Ý %Ý ã å *Ý ôvW�Xõ vWr   