ó
    ±"³j?  ã                   ó†  • S SK JrJrJr  S SKJr  S SKJr  S SKJ	r	  S SK
JrJrJrJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJrJr  SSKJr  SSKJ r J!r!  SSK"J#r#J$r$  SSK%J&r&J'r'  SSK(J)r)  SSK*J+r+  / SQr,\" S\S   5      r- \\-  r.\S.S\\--  \/-  S\\//\\   4   S\4S jjr0\	" SS9 " S S5      5       r1g) é    )ÚCallableÚ	GeneratorÚSequence)Úcontextmanager)Ú
ContextVar)Ú	dataclass)ÚAnyÚClassVarÚLiteralÚget_args)ÚTypeAliasType)Ú_utils)Ú	UserError)ÚOpenAIChatCompatibleProviderÚ!OpenAIResponsesCompatibleProvider)ÚInstrumentationSettings)ÚProviderÚinfer_provideré   )ÚEmbeddingModel)ÚInstrumentedEmbeddingModelÚinstrument_embedding_model)ÚEmbeddingResultÚEmbedInputType)ÚEmbeddingSettingsÚmerge_embedding_settings)ÚTestEmbeddingModel)ÚWrapperEmbeddingModel)ÚEmbedderr   r   r   r   ÚKnownEmbeddingModelNameÚinfer_embedding_modelr   r   r   r   r    ) z!google-cloud:gemini-embedding-001z'google-cloud:gemini-embedding-2-previewzgoogle-cloud:gemini-embedding-2zgoogle-cloud:text-embedding-005z,google-cloud:text-multilingual-embedding-002zgoogle:gemini-embedding-001z!google:gemini-embedding-2-previewzgoogle:gemini-embedding-2zopenai:text-embedding-ada-002zopenai:text-embedding-3-smallzopenai:text-embedding-3-largezcohere:embed-v4.0zcohere:embed-english-v3.0zcohere:embed-english-light-v3.0zcohere:embed-multilingual-v3.0z$cohere:embed-multilingual-light-v3.0zvoyageai:voyage-4-largezvoyageai:voyage-4zvoyageai:voyage-4-litezvoyageai:voyage-3-largezvoyageai:voyage-3.5zvoyageai:voyage-3.5-litezvoyageai:voyage-code-3zvoyageai:voyage-finance-2zvoyageai:voyage-law-2zvoyageai:voyage-code-2z"bedrock:amazon.titan-embed-text-v1z$bedrock:amazon.titan-embed-text-v2:0zbedrock:cohere.embed-english-v3z$bedrock:cohere.embed-multilingual-v3zbedrock:cohere.embed-v4:0z0bedrock:amazon.nova-2-multimodal-embeddings-v1:0)Úprovider_factoryÚmodelr"   Úreturnc                óN  • [        U [        5      (       a  U $  U R                  SSS9u  p#U" U5      nUnUR	                  S5      (       a  SSKJn  U" U5      nUS	/[        [        R                  5      Q[        [        R                  5      Q7;   a  SS
KJn  U" X5S9$ US:X  a  SSKJn	  U	" X5S9$ US:X  a  SSKJn
  U
" X5S9$ US;   a  SSKJn  U" X5S9$ US:X  a  SSKJn  U" U5      $ US:X  a  SSKJn  U" X5S9$ [/        SU  35      e! [         a  n[        S5      UeSnAff = f)zInfer the model from the name.Ú:r   )ÚmaxsplitzJYou must provide a provider prefix when specifying an embedding model nameNzgateway/é   )Únormalize_gateway_providerÚopenai)ÚOpenAIEmbeddingModel)ÚproviderÚcohere)ÚCohereEmbeddingModelÚbedrock)ÚBedrockEmbeddingModel)Úgooglezgoogle-cloud)ÚGoogleEmbeddingModelzsentence-transformers)Ú!SentenceTransformerEmbeddingModelÚvoyageai)ÚVoyageAIEmbeddingModelzUnknown embeddings model: )Ú
isinstancer   ÚsplitÚ
ValueErrorÚ
startswithÚproviders.gatewayr)   r   r   Ú	__value__r   r*   r+   r-   r.   r/   r0   r1   r2   Úsentence_transformersr3   r4   r5   r   )r#   r"   Úprovider_nameÚ
model_nameÚer,   Ú
model_kindr)   r+   r.   r0   r2   r3   r5   s                 Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pydantic_ai/embeddings/__init__.pyr!   r!   S   sS  € ô �%œ×(Ñ(ØˆðnØ$)§K¡K°¸a KÐ$@Ñ!ˆñ   Ó.€Hà€JØ×Ñ˜Z×(Ñ(ÝBá/°
Ó;ˆ
àØð	ô 
Ô.×8Ñ8Ó	9ð	ô 
Ô3×=Ñ=Ó	>ñ	ó 	õ 	1á# JÑBÐBØ	�xÓ	Ý0á# JÑBÐBØ	�yÓ	 Ý2á$ ZÑCÐCØ	Ð1Ó	1Ý0á# JÑBÐBØ	Ð.Ó	.ÝLá0°Ó<Ð<Ø	�zÓ	!Ý4á% jÑDÐDäÐ4°U°GÐ<Ó=Ð=øô[ ó nÜÐeÓfÐlmÐmûðnús   ™D	 Ä	
D$ÄDÄD$F)Úinitc                   óÄ  • \ rS rSr% Sr\\-  S-  \S'    Sr\	\\-     \S'   SSSS.S	\
\-  \-  S
\S-  S\S\\-  S-  SS4
S jjr\S$S\\-  SS4S jj5       r\S\
\-  \-  4S j5       r\\R*                  S.S	\
\-  \-  \R,                  -  S\S   4S jj5       rSS.S\\\   -  S
\S-  S\4S jjrSS.S\\\   -  S
\S-  S\4S jjrSS.S\\\   -  S\S
\S-  S\4S jjrS\S-  4S jr S\S\4S jr!SS.S\\\   -  S
\S-  S\4S jjr"SS.S\\\   -  S
\S-  S\4S jjr#SS.S\\\   -  S\S
\S-  S\4S jjr$S\S-  4S  jr%S\S\4S! jr&S\
4S" jr'S#r(g)%r   éŽ   a6  High-level interface for generating text embeddings.

The `Embedder` class provides a convenient way to generate vector embeddings from text
using various embedding model providers. It handles model inference, settings management,
and optional OpenTelemetry instrumentation.

Example:
```python
from pydantic_ai import Embedder

embedder = Embedder('openai:text-embedding-3-small')


async def main():
    result = await embedder.embed_query('What is machine learning?')
    print(result.embeddings[0][:5])  # First 5 dimensions
    #> [1.0, 1.0, 1.0, 1.0, 1.0]
```
NÚ
instrumentFÚ_instrument_defaultT)ÚsettingsÚdefer_model_checkrE   r#   rG   rH   r$   c                ól   • U(       a  UO
[        U5      U l        X l        X@l        [	        SSS9U l        g)a›  Initialize an Embedder.

Args:
    model: The embedding model to use. Can be specified as:

        - A model name string in the format `'provider:model-name'`
          (e.g., `'openai:text-embedding-3-small'`)
        - An [`EmbeddingModel`][pydantic_ai.embeddings.EmbeddingModel] instance
    settings: Optional [`EmbeddingSettings`][pydantic_ai.embeddings.EmbeddingSettings]
        to use as defaults for all embed calls.
    defer_model_check: Whether to defer model validation until first use.
        Set to `False` to validate the model immediately on construction.
    instrument: OpenTelemetry instrumentation settings. Set to `True` to enable with defaults,
        or pass an [`InstrumentationSettings`][pydantic_ai.models.instrumented.InstrumentationSettings]
        instance to customize. If `None`, uses the value from
        [`Embedder.instrument_all()`][pydantic_ai.embeddings.Embedder.instrument_all].
Ú_override_modelN)Údefault)r!   Ú_modelÚ	_settingsrE   r   rJ   )Úselfr#   rG   rH   rE   s        rA   Ú__init__ÚEmbedder.__init__±   s0   € ö2  1‘eÔ6KÈEÓ6RˆŒØ!ŒØ$ŒäBLÐM^ÐhlÑBmˆÕó    c                 ó   • U [         l        g)aÖ  Set the default instrumentation options for all embedders where `instrument` is not explicitly set.

This is useful for enabling instrumentation globally without modifying each embedder individually.

Args:
    instrument: Instrumentation settings to use as the default. Set to `True` for default settings,
        `False` to disable, or pass an
        [`InstrumentationSettings`][pydantic_ai.models.instrumented.InstrumentationSettings]
        instance to customize.
N)r   rF   )rE   s    rA   Úinstrument_allÚEmbedder.instrument_allÐ   s   € ð (2ŒÕ$rQ   c                 ó   • U R                   $ )z*The embedding model used by this embedder.)rL   ©rN   s    rA   r#   ÚEmbedder.modelÞ   s   € ð �{‰{ÐrQ   )r#   c             #   ó   #   • [         R                  " U5      (       a%  U R                  R                  [	        U5      5      nOSn Sv •  Ub  U R                  R                  U5        gg! Ub  U R                  R                  U5        f f = f7f)a2  Context manager to temporarily override the embedding model.

Useful for testing or dynamically switching models.

Args:
    model: The embedding model to use within this context.

Example:
```python
from pydantic_ai import Embedder

embedder = Embedder('openai:text-embedding-3-small')


async def main():
    # Temporarily use a different model
    with embedder.override(model='openai:text-embedding-3-large'):
        result = await embedder.embed_query('test')
        print(len(result.embeddings[0]))  # 3072 dimensions for large model
        #> 3072
```
N)r   Úis_setrJ   Úsetr!   Úreset)rN   r#   Úmodel_tokens      rA   ÚoverrideÚEmbedder.overrideã   s}   é € ô8 �=Š=˜×ÑØ×.Ñ.×2Ñ2Ô3HÈÓ3OÓP‰KàˆKð	8ÛàÑ&Ø×$Ñ$×*Ñ*¨;Õ7ð 'øˆ{Ñ&Ø×$Ñ$×*Ñ*¨;Õ7ð 'üs   ‚ABÁA* Á
 BÁ*!BÂB©rG   Úqueryc             ƒ   ó@   #   • U R                  USUS9I Sh  v•N $  N7f)a  Embed one or more query texts.

Use this method when embedding search queries that will be compared against document embeddings.
Some models optimize embeddings differently based on whether the input is a query or document.

Args:
    query: A single query string or sequence of query strings to embed.
    settings: Optional settings to override the embedder's default settings for this call.

Returns:
    An [`EmbeddingResult`][pydantic_ai.embeddings.EmbeddingResult] containing the embeddings
    and metadata about the operation.
r`   ©Ú
input_typerG   N©Úembed©rN   r`   rG   s      rA   Úembed_queryÚEmbedder.embed_query
  s"   é € ð  —Z‘Z °'ÀH�ZÐM×MÐMÑMùó   ‚—˜Ú	documentsc             ƒ   ó@   #   • U R                  USUS9I Sh  v•N $  N7f)a  Embed one or more document texts.

Use this method when embedding documents that will be stored and later searched against.
Some models optimize embeddings differently based on whether the input is a query or document.

Args:
    documents: A single document string or sequence of document strings to embed.
    settings: Optional settings to override the embedder's default settings for this call.

Returns:
    An [`EmbeddingResult`][pydantic_ai.embeddings.EmbeddingResult] containing the embeddings
    and metadata about the operation.
Údocumentrb   Nrd   ©rN   rj   rG   s      rA   Úembed_documentsÚEmbedder.embed_documents  s"   é € ð  —Z‘Z 	°jÈ8�ZÐT×TÐTÑTùri   Úinputsrc   c             ƒ   óŠ   #   • U R                  5       n[        U R                  U5      nUR                  XUS9I Sh  v•N $  N7f)ay  Embed text inputs with explicit input type specification.

This is the low-level embedding method. For most use cases, prefer
[`embed_query()`][pydantic_ai.embeddings.Embedder.embed_query] or
[`embed_documents()`][pydantic_ai.embeddings.Embedder.embed_documents].

Args:
    inputs: A single string or sequence of strings to embed.
    input_type: The type of input, either `'query'` or `'document'`.
    settings: Optional settings to override the embedder's default settings for this call.

Returns:
    An [`EmbeddingResult`][pydantic_ai.embeddings.EmbeddingResult] containing the embeddings
    and metadata about the operation.
rb   N)Ú
_get_modelr   rM   re   )rN   rp   rc   rG   r#   s        rA   re   ÚEmbedder.embed.  s<   é € ð$ —‘Ó!ˆÜ+¨D¯N©N¸HÓEˆØ—[‘[ È�[ÐR×RÐRÑRùs   ‚:A¼A½Ac              ƒ   ó^   #   • U R                  5       nUR                  5       I Sh  v•N $  N7f)z™Get the maximum number of tokens the model can accept as input.

Returns:
    The maximum token count, or `None` if the limit is unknown for this model.
N)rr   Úmax_input_tokens)rN   r#   s     rA   ru   ÚEmbedder.max_input_tokensD  s(   é € ð —‘Ó!ˆØ×+Ñ+Ó-×-Ð-Ñ-ùs   ‚$-¦+§-Útextc              ƒ   ó`   #   • U R                  5       nUR                  U5      I Sh  v•N $  N7f)a  Count the number of tokens in the given text.

Args:
    text: The text to tokenize and count.

Returns:
    The number of tokens in the text.

Raises:
    NotImplementedError: If the model doesn't support token counting.
    UserError: If the model or tokenizer is not supported.
N)rr   Úcount_tokens)rN   rw   r#   s      rA   ry   ÚEmbedder.count_tokensM  s*   é € ð —‘Ó!ˆØ×'Ñ'¨Ó-×-Ð-Ñ-ùs   ‚%.§,¨.c                óH   • [         R                  " U R                  XS95      $ )zVSynchronous version of [`embed_query()`][pydantic_ai.embeddings.Embedder.embed_query].r_   )r   Úrun_until_completerg   rf   s      rA   Úembed_query_syncÚEmbedder.embed_query_sync]  s#   € ô ×(Ò(¨×)9Ñ)9¸%Ð)9Ð)SÓTÐTrQ   c                óH   • [         R                  " U R                  XS95      $ )z^Synchronous version of [`embed_documents()`][pydantic_ai.embeddings.Embedder.embed_documents].r_   )r   r|   rn   rm   s      rA   Úembed_documents_syncÚEmbedder.embed_documents_syncc  s#   € ô ×(Ò(¨×)=Ñ)=¸iÐ)=Ð)[Ó\Ð\rQ   c                óJ   • [         R                  " U R                  XUS95      $ )zJSynchronous version of [`embed()`][pydantic_ai.embeddings.Embedder.embed].rb   )r   r|   re   )rN   rp   rc   rG   s       rA   Ú
embed_syncÚEmbedder.embed_synci  s#   € ô ×(Ò(¨¯©°FÐ\d¨Ð)eÓfÐfrQ   c                 óJ   • [         R                  " U R                  5       5      $ )z`Synchronous version of [`max_input_tokens()`][pydantic_ai.embeddings.Embedder.max_input_tokens].)r   r|   ru   rV   s    rA   Úmax_input_tokens_syncÚEmbedder.max_input_tokens_synco  s   € ä×(Ò(¨×)>Ñ)>Ó)@ÓAÐArQ   c                 óL   • [         R                  " U R                  U5      5      $ )zXSynchronous version of [`count_tokens()`][pydantic_ai.embeddings.Embedder.count_tokens].)r   r|   ry   )rN   rw   s     rA   Úcount_tokens_syncÚEmbedder.count_tokens_syncs  s   € ä×(Ò(¨×):Ñ):¸4Ó)@ÓAÐArQ   c                 óÌ   • U R                   R                  5       =n(       a  UnO[        U R                  5      =o l        U R
                  nUc  U R                  n[        X#5      $ )zƒCreate a model configured for this embedder.

Returns:
    The embedding model to use, with instrumentation applied if configured.
)rJ   Úgetr!   r#   rL   rE   rF   r   )rN   Ú
some_modelÚmodel_rE   s       rA   rr   ÚEmbedder._get_modelw  s[   € ð ×-Ñ-×1Ñ1Ó3Ð3ˆ:Õ3Ø‰Fä#8¸¿¹Ó#DÐDˆF”[à—_‘_ˆ
ØÑØ×1Ñ1ˆJä)¨&Ó=Ð=rQ   )rL   rJ   rM   rE   )T))Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   ÚboolÚ__annotations__rF   r
   r   r    Ústrr   rO   ÚstaticmethodrS   Úpropertyr#   r   r   ÚUNSETÚUnsetr   r]   r   r   rg   rn   r   re   Úintru   ry   r}   r€   rƒ   r†   r‰   rr   Ú__static_attributes__© rQ   rA   r   r   Ž   sá  ‡ ñð( (¨$Ñ.°Ñ5Ó5ðð EJÐ˜Ð"9¸DÑ"@ÑAÓIð .2Ø"&Ø<@ònàÐ 7Ñ7¸#Ñ=ðnð $ dÑ*ð	nð
  ðnð ,¨dÑ2°TÑ9ðnð 
õnð> ñ2Ð#:¸TÑ#Að 2ÈTô 2ó ð2ð ð�~Ð(?Ñ?À#ÑEó ó ðð ð PVÏ|É|ò$8ð Ð 7Ñ7¸#Ñ=ÀÇÁÑLð$8ð 
�4‰ô	$8ó ð$8ðN SWòNØ˜8 C™=Ñ(ðNØ7HÈ4Ñ7OðNà	õNð& W[òUØ˜x¨™}Ñ,ðUØ;LÈtÑ;SðUà	õUð& ptòSØ˜H S™MÑ)ðSØ:HðSØTeÐhlÑTlðSà	õSð,.¨¨d©
ô .ð. sð .¨sô .ð" SWòUØ˜8 C™=Ñ(ðUØ7HÈ4Ñ7OðUà	õUð W[ò]Ø˜x¨™}Ñ,ð]Ø;LÈtÑ;Sð]à	õ]ð ptògØ˜H S™MÑ)ðgØ:HðgØTeÐhlÑTlðgà	õgðB s¨T¡zô BðB cð B¨cô Bð>˜N÷ >rQ   r   N)2Úcollections.abcr   r   r   Ú
contextlibr   Úcontextvarsr   Údataclassesr   Útypingr	   r
   r   r   Útyping_extensionsr   Úpydantic_air   Úpydantic_ai.exceptionsr   Úpydantic_ai.modelsr   r   Úpydantic_ai.models.instrumentedr   Úpydantic_ai.providersr   r   Úbaser   Úinstrumentedr   r   Úresultr   r   rG   r   r   Útestr   Úwrapperr   Ú__all__r    Ú"OpenAIEmbeddingsCompatibleProviderr—   r!   r   rž   rQ   rA   Ú<module>r±      sÛ   ðß 9Ñ 9Ý %Ý "Ý !ß 3Ó 3å +å Ý ,ß ^Ý Cß :å  ß Pß 3ß AÝ $Ý *ò€ñ (ØØð	<ñ!ó$Ð ðJð &BÐDeÑ%eÐ "ð 8Fò8>ØÐ3Ñ3°cÑ9ð8>ð  ˜u h¨s¡mÐ3Ñ4ð8>ð õ	8>ñv �Ñ÷x>ð x>ó ñx>rQ   