Ë
   )ÝZƒ&çy=ã                  ó  — d Z ddlmZ ddlZddlmc mZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZ  G d„ d	«      Z G d
„ d«      Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z!dd„Z"dd„Z#dd„Z$dd„Z%y) u˜   Tests for llama_cpp_server_proxy.py â€” the Ollama-backed proxy on port 8080.

All httpx calls to Ollama are mocked so no external service is required.
é    )ÚannotationsN)ÚAny)Ú	MagicMockÚpatch)Ú
TestClient)Úappc                  ó"   — e Zd ZdZddd„Zdd„Zy)ÚMockResponsez"A minimal mock for httpx.Response.Nc                ó6   — || _         |xs i | _        || _        y ©N)Ústatus_codeÚ_jsonÚtext)Úselfr   Ú	json_datar   s       ú9/home/oem/CyberBrain26-unified/tests/test_proxy_server.pyÚ__init__zMockResponse.__init__   s   € Ø&ˆÔØ’_ "ˆŒ
Øˆ�	ó    c                ó   — | j                   S r   )r   ©r   s    r   ÚjsonzMockResponse.json   s   € Ø�z‰zÐr   )NÚ )r   Úintr   r   r   ÚstrÚreturnÚNone)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   © r   r   r
   r
      s   „ Ù,ôô
r   r
   c                  ó8   — e Zd ZdZdd„Zd	d„Zd
d„Zdd„Zdd„Zy)ÚMockAsyncClientz<Mock for httpx.AsyncClient used as an async context manager.c                ó   — || _         y r   ©Ú	_response)r   Úresponses     r   r   zMockAsyncClient.__init__!   s	   € Ø!ˆ�r   c              ƒ  ó   K  — | S ­wr   r!   r   s    r   Ú
__aenter__zMockAsyncClient.__aenter__$   s   è ø€ Øˆùó   ‚c              ‡  ó   K  — y ­wr   r!   ©r   Úargss     r   Ú	__aexit__zMockAsyncClient.__aexit__'   s	   è ø€ Øùó   ‚c              �  ó"   K  — | j                   S ­wr   r%   ©r   r-   Úkwargss      r   ÚgetzMockAsyncClient.get*   ó   è ø€ Ø�~‰~Ðùó   ‚c              �  ó"   K  — | j                   S ­wr   r%   r1   s      r   ÚpostzMockAsyncClient.post-   r4   r5   N)r'   r
   r   r   )r   r#   )r-   r   r   r   )r-   r   r2   r   r   r
   )	r   r   r   r    r   r)   r.   r3   r7   r!   r   r   r#   r#      s   „ ÙFó"óóóôr   r#   c                ó:   — t        «       }t        | «      |_        |S )z@Return a MagicMock that replaces httpx.AsyncClient for one call.)r   r#   Úreturn_value)r'   Úmocks     r   Ú_mock_clientr;   1   s   € ä‹;€DÜ'¨Ó1€DÔØ€Kr   c                 óˆ  — t        t        «      } | j                  d«      }|j                  }d}||k(  }|s­t	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  «       }|d	   }d
}||k(  }	|	slt	        j
                  d|	fd||f«      t	        j                  |«      t	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}	}|d   }d}||k(  }	|	slt	        j
                  d|	fd||f«      t	        j                  |«      t	        j                  |«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}	}d}||v }	|	s™t	        j
                  d|	fd||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}	d}||v }	|	s™t	        j
                  d|	fd||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}}	y )Nú/éÈ   ©ú==©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚresp©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7Úarchzllama.cpp proxy©z%(py1)s == %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6Úporti�  Úos©Úin©z%(py1)s in %(py3)sÚbody©rL   Úpy3úassert %(py5)srF   Úmodel)r   r   r3   r   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   )ÚclientrB   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8rU   Ú@py_assert0Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_format4s                r   Útest_root_endpointrm   <   så  € Üœ‹_€FØ�:‰:�c‹?€DØ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�‰<Ð,Ð,Ð,ˆ<Ð,Ñ,×,×,Õ,ˆ<Ð,×,×,Ó,ˆ<×,×,Ò,Ð,×,×,×,×,×,×,Ó,Ø�‰<Ð˜4Ðˆ<˜4Ñ××Õˆ<˜4××Óˆ<××Ò˜4××××××ÓØÐˆ4�4ˆ<××Õˆ4�4××Óˆ4×××××Ð�4××Ó�4××××××ÓØÐˆ7�dˆ?××Õˆ7�d××Óˆ7×××××Ð�d××Ó�d××××××Ôr   c            	     ój  — ddddidœdddidœgi} t        dt        t        d	| «      «      «      5  t        t        «      }|j                  d
«      }d d d «       j                  }d	}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }t!        |«      }d}	||	k(  }
|
sÉt        j                  d|
fd||	f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	|d   d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|d   d   d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   �ŒÙxY w)NÚmodelsúphi3.5:latestÚcontext_lengthi   )ÚnameÚdetailszdolphin-cb26:latesti €  ú(llama_cpp_server_proxy.httpx.AsyncClientr>   ú/api/tokenizer?   rA   rB   rC   rG   rH   é   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚlen©rD   rE   rM   rH   úassert %(py9)sÚpy9r   rY   rJ   rK   rN   rO   )r   r;   r
   r   r   r3   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   rx   )Úmodels_payloadrb   rB   rc   rd   re   rf   rg   rU   Ú@py_assert6Ú@py_assert5Ú@py_format10rh   ri   rj   rk   s                   r   Útest_list_models_successr€   K   s5  € àà'Ø,¨fÐ5ñð
 .Ø,¨eÐ4ñð	
ð€Nô 
Ð9¼<ÌÐUXÐZhÓHiÓ;jÓ	kñ +ÜœC“ˆØ�z‰z˜/Ó*ˆ÷+ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�H‰~Ð#Œ3ˆ~ÓÐ# !Ð#Ð !Ñ#×#×#Õ#Ð !×#×#×#×#×#Ñ#Œ3×#×#Ó#Œ3×#×#Ô#ˆ~×#×#Ò#Ð×#×#Ò# !×#×#×#×#×#×#Õ#Ø�‰>˜!Ñ˜WÑ%Ð8¨Ð8Ð%¨Ñ8×8×8Õ8Ð%¨×8×8Ó8Ð%×8×8Ò8¨×8×8×8×8×8×8Ó8Ø�‰>˜!ÑÐ-Ñ.Ð8°&Ð8Ð.°&Ñ8×8×8Õ8Ð.°&×8×8Ó8Ð.×8×8Ò8°&×8×8×8×8×8×8Ô8÷+ñ +ús   °!L(Ì(L2c            
     óÜ  — t        dt        t        dd d«      «      «      5  t        t        «      } | j                  d«      }d d d «       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      d	œz  }d
d|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }g }||k(  }	|	slt        j                  d|	fd||f«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}	}d}|d   }|j                   } |«       }||v }	|	s”t        j                  d|	fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}	x}x}}y # 1 sw Y   �Œ!xY w)Nrt   éô  zinternal errorru   r>   r?   rA   rB   rC   rG   rH   ro   rJ   rK   rN   rO   ÚerrorÚmessagerR   ©zD%(py1)s in %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.lower
}()
}©rL   rM   rO   Úpy8úassert %(py10)sÚpy10)r   r;   r
   r   r   r3   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   Úlower)rb   rB   rc   rd   re   rf   rg   rU   rh   ri   rj   rk   r~   Ú@py_assert7Ú@py_format9Ú@py_format11s                   r   Útest_list_models_non_200rŽ   b   s™  € Ü	Ø2Ü”\ # tÐ-=Ó>Ó?ó
ñ +ô œC“ˆØ�z‰z˜/Ó*ˆ÷+ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�‰>Ð˜RÐˆ>˜RÑ××Õˆ>˜R××Óˆ>××Ò˜R××××××ÓØÐ-�d˜9‘oÐ-�o×+Ñ+Ð-Ñ+Ó-Ð-ˆ7Ð-Ð-×-×-Õ-ˆ7Ð-×-×-Ó-ˆ7×-×-Ò-�o×-×-Ò-Ð+×-×-Ò-Ð-×-×-×-×-×-×-×-Ð-÷+ñ +ús   ¡!I!É!I+c                 ó>  — dd„} t        d| «      5  t        t        «      }|j                  d«      }d d d «       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }	g }|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}d}	|d   }|	|v }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}y # 1 sw Y   �ŒâxY w)Nc                 ó   — t        d«      ‚)Núconnection refused)Ú	Exception)r-   r2   s     r   Ú_raisez,test_list_models_httpx_error.<locals>._raisep   s   € ÜÐ,Ó-Ð-r   rt   ru   r>   r?   rA   rB   rC   rG   rH   ro   rJ   rK   rN   rO   r‘   r„   rR   )z%(py1)s in %(py4)s©r-   r   r2   r   r   r#   )r   r   r   r3   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   )r“   rb   rB   rc   rd   re   rf   rg   rU   rh   ri   rj   rk   s                r   Útest_list_models_httpx_errorr•   o   s^  € ó.ô 
Ð9¸6Ó	Bñ +ÜœC“ˆØ�z‰z˜/Ó*ˆ÷+ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�‰>Ð˜RÐˆ>˜RÑ××Õˆ>˜R××Óˆ>××Ò˜R××××××ÓØÐ2 4¨	¡?Ð2Ð ?Ð2×2×2Õ2Ð ?×2×2Ó2Ð×2×2Ò2 ?×2×2×2×2×2×2Ô2÷+ñ +ús   ‘!HÈHc            	     óú  — dddœddœ} t        dt        t        d| «      «      «      5  t        t        «      }|j                  dd	d
ddœgdœ¬«      }d d d «       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}|d   }	d	}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}|d   d   d   d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}|d   d   d   d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}|d   d   d    }	d!}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}d"}	|	|v }
|
s™t        j                  d#|
fd$|	|f«      t        j                  |	«      d%t        j                  «       v st        j                  |«      rt        j                  |«      nd%d&œz  }d'd(|iz  }t        t        j                  |«      «      ‚d x}	}
y # 1 sw Y   �Œ xY w))NÚ	assistantÚHello©ÚroleÚcontentT)r„   Údonert   r>   ú	/api/chatrp   ÚuserÚhi©rY   Úmessages©r   r?   rA   rB   rC   rG   rH   Úobjectzchat.completionrJ   rK   rN   rO   rY   Úchoicesr   r„   rš   r›   Úfinish_reasonÚstopÚusagerR   rT   rU   rV   rX   rF   ©r   r;   r
   r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   )Úchat_payloadrb   rB   rc   rd   re   rf   rg   rU   rh   ri   rj   rk   rl   s                 r   Útest_chat_successrª   €   s	  € à'°GÑ<Øñ€Lô 
Ø2Ü”\ # |Ó4Ó5ó
ñ 
ô œC“ˆØ�{‰{ØØ*À&ÐUYÑ9ZÐ8[Ñ\ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�‰>Ð.Ð.Ð.ˆ>Ð.Ñ.×.×.Õ.ˆ>Ð.×.×.Ó.ˆ>×.×.Ò.Ð.×.×.×.×.×.×.Ó.Ø�‰=Ð+˜OÐ+ˆ=˜OÑ+×+×+Õ+ˆ=˜O×+×+Ó+ˆ=×+×+Ò+˜O×+×+×+×+×+×+Ó+Ø�	‰?˜1Ñ˜iÑ(¨Ñ0Ð?°KÐ?Ð0°KÑ?×?×?Õ?Ð0°K×?×?Ó?Ð0×?×?Ò?°K×?×?×?×?×?×?Ó?Ø�	‰?˜1Ñ˜iÑ(¨Ñ3Ð>°wÐ>Ð3°wÑ>×>×>Õ>Ð3°w×>×>Ó>Ð3×>×>Ò>°w×>×>×>×>×>×>Ó>Ø�	‰?˜1Ñ˜oÑ.Ð8°&Ð8Ð.°&Ñ8×8×8Õ8Ð.°&×8×8Ó8Ð.×8×8Ò8°&×8×8×8×8×8×8Ó8ØÐˆ7�dˆ?××Õˆ7�d××Óˆ7×××××Ð�d××Ó�d××××××Ô÷!
ñ 
ús   ¨*Q0Ñ0Q:c            
     ó¼  — t        dt        t        dd d«      «      «      5  t        t        «      } | j                  dddddœgd	œ¬
«      }d d d «       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }d}||v }	|	s™t        j                  d|	fd||f«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}}	y # 1 sw Y   �ŒˆxY w)Nrt   é”  zmodel not foundr�   Únonexistentrž   rŸ   r™   r    r¢   r‚   r?   rA   rB   rC   rG   rH   rƒ   rR   rT   rU   rV   rX   rF   r¨   )rb   rB   rc   rd   re   rf   rg   rU   rh   ri   rl   s              r   Útest_chat_non_200r®   ˜   s=  € Ü	Ø2Ü”\ # tÐ->Ó?Ó@ó
ñ 
ô œC“ˆØ�{‰{ØØ(ÀÐSWÑ7XÐ6YÑZð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØÐˆ7�dˆ?××Õˆ7�d××Óˆ7×××××Ð�d××Ó�d××××××Ô÷
ñ 
ús   ¡*GÇGc                 óü  — ddl m}  d}| |u}|s™t        j                  d|fd| |f«      dt	        j
                  «       v st        j                  | «      rt        j                  | «      ndt        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚dx}}t        j                  D �cg c]  }|j                  ‘Œ }}d
}||v }|s™t        j                  d|fd||f«      t        j                  |«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd	|iz  }t        t        j                  |«      «      ‚dx}}yc c}w )zçStreaming endpoint is registered (async generator can't be tested via TestClient).

    Starlette's TestClient does not support async_generator bodies for
    StreamingResponse, so we only verify the route exists and is wired.
    r   )ÚStreamChatIteratorN)úis not)z%(py0)s is not %(py3)sr°   )rD   rW   rX   rF   r�   rR   rT   ÚroutesrV   )Úllama_cpp_server_proxyr°   rZ   r[   r\   r]   r^   r_   r`   ra   r   r²   Úpath)r°   ri   rc   rl   rf   Úrr²   rh   s           r   Ú#test_chat_streaming_endpoint_existsr¶   §   sÝ   € õ :à%)Ð)Ð TÐ)×)×)Õ)Ð T×)×)×)×)×)Ñ)Ð×)×)Ó)Ð×)×)Ô) T×)×)×)×)×)×)Ñ)Ü!Ÿj™jÖ)˜ˆa�f‹fÐ)€FÐ)ØÐ ˆ;˜&Ð × × Õ ˆ;˜&× × Ó ˆ;× × × × × Ð ˜&× × Ó ˜&× × × × × × Ô ùò *s   Â>E9c            	     ó|  — ddi} t        dt        t        d| «      «      «      5  t        t        «      }|j                  ddddœ¬	«      }d d d «       j                  }d}||k(  }|s­t        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }	d}|	|k(  }
|
slt        j                  d
|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}|d   d   d   }	d}|	|k(  }
|
slt        j                  d
|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	x}
}y # 1 sw Y   �ŒéxY w)Nr'   zThe quick brown foxrt   r>   ú/api/completionrp   z	The quick©rY   Úpromptr¢   r?   rA   rB   rC   rG   rH   r£   Útext_completionrJ   rK   rN   rO   r¤   r   r   r¨   )Úcompletion_payloadrb   rB   rc   rd   re   rf   rg   rU   rh   ri   rj   rk   s                r   Útest_completion_successr½   ¸   s—  € Ø$Ð&;Ð<ÐÜ	Ø2Ü”\ #Ð'9Ó:Ó;ó
ñ 
ô œC“ˆØ�{‰{ØØ*°kÑBð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�‰>Ð.Ð.Ð.ˆ>Ð.Ñ.×.×.Õ.ˆ>Ð.×.×.Ó.ˆ>×.×.Ò.Ð.×.×.×.×.×.×.Ó.Ø�	‰?˜1Ñ˜fÑ%Ð>Ð)>Ð>Ð%Ð)>Ñ>×>×>Õ>Ð%Ð)>×>×>Ó>Ð%×>×>Ò>Ð)>×>×>×>×>×>×>Ô>÷
ñ 
ús   ¤&H1È1H;c            
     óH  — t        dt        t        dd d«      «      «      5  t        t        «      } | j                  ddddœ¬«      }d d d «       j                  }d}||k(  }|s­t        j                  d	|fd
||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   ŒÒxY w)Nrt   r‚   zserver errorr¸   rp   Útestr¹   r¢   r?   rA   rB   rC   rG   rH   ©r   r;   r
   r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   ©rb   rB   rc   rd   re   rf   rg   s          r   Útest_completion_non_200rÂ   É   sÐ   € Ü	Ø2Ü”\ # t¨^Ó<Ó=ó
ñ 
ô œC“ˆØ�{‰{ØØ*°fÑ=ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ô"÷
ð 
úó   ¡&DÄD!c            	     ó^  — dg d¢g d¢gi} t        dt        t        d| «      «      «      5  t        t        «      }|j                  dddd	gd
œ¬«      }d d d «       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }|d   }t!        |«      }d}	||	k(  }
|
sÉt        j                  d|
fd||	f«      dt        j                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      t        j                  |	«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}
}	|d   d   }g d¢}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   �ŒRxY w)NÚ
embeddings©gš™™™™™¹?gš™™™™™É?g333333Ó?)gš™™™™™Ù?g      à?g333333ã?rt   r>   ú/api/embeddingsrp   ÚhelloÚworld©rY   Úinputr¢   r?   rA   rB   rC   rG   rH   rv   rw   rx   ry   rz   r{   r   rJ   rK   rN   rO   )r   r;   r
   r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   rx   )Úembeddings_payloadrb   rB   rc   rd   re   rf   rg   rU   r}   r~   r   rh   ri   rj   rk   s                   r   Útest_embeddings_successrÍ   Ú   sÎ  € Ø&ªº/Ð(JÐKÐÜ	Ø2Ü”\ #Ð'9Ó:Ó;ó
ñ 
ô œC“ˆØ�{‰{ØØ*°g¸wÐ5GÑHð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�LÑ!Ð'Œ3Ð!Ó"Ð' aÐ'Ð" aÑ'×'×'Õ'Ð" a×'×'×'×'×'Ñ'Œ3×'×'Ó'Œ3×'×'Ô'Ð!×'×'Ò'Ð"×'×'Ò' a×'×'×'×'×'×'Õ'Ø�Ñ˜aÑ Ð3¢OÐ3Ð  OÑ3×3×3Õ3Ð  O×3×3Ó3Ð ×3×3Ò3 O×3×3×3×3×3×3Ô3÷
ñ 
ús   ª(J"Ê"J,c            	     óT  — dg d¢gi} t        dt        t        d| «      «      «      5  t        t        «      }|j                  ddddœ¬	«      }d d d «       j                  }d}||k(  }|s­t        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   ŒÒxY w)NrÅ   rÆ   rt   r>   rÇ   rp   rÈ   rÊ   r¢   r?   rA   rB   rC   rG   rH   rÀ   )rÌ   rb   rB   rc   rd   re   rf   rg   s           r   Útest_embeddings_string_inputrÏ   ë   sÝ   € Ø&ªÐ(9Ð:ÐÜ	Ø2Ü”\ #Ð'9Ó:Ó;ó
ñ 
ô œC“ˆØ�{‰{ØØ*°WÑ=ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ô"÷
ð 
ús   §&DÄD'c            
     óH  — t        dt        t        dd d«      «      «      5  t        t        «      } | j                  ddddœ¬«      }d d d «       j                  }d	}||k(  }|s­t        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   ŒÒxY w)Nrt   i¦  zinvalid inputrÇ   rp   r¿   rÊ   r¢   r‚   r?   rA   rB   rC   rG   rH   rÀ   rÁ   s          r   Útest_embeddings_non_200rÑ   ù   sÐ   € Ü	Ø2Ü”\ # t¨_Ó=Ó>ó
ñ 
ô œC“ˆØ�{‰{ØØ*°VÑ<ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ô"÷
ð 
úrÃ   c                 óÄ  — t        t        «      } | j                  ddddœ¬«      }|j                  }d}||k(  }|s­t	        j
                  d|fd||f«      d	t        j                  «       v st	        j                  |«      rt	        j                  |«      nd	t	        j                  |«      t	        j                  |«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  «       }d}||v }	|	s™t	        j
                  d|	fd||f«      t	        j                  |«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}}	d}|d   }|j                  } |«       }||v }	|	s”t	        j
                  d|	fd||f«      t	        j                  |«      t	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}	x}x}}y )Nru   rp   rÈ   )rY   r›   r¢   iõ  r?   rA   rB   rC   rG   rH   rƒ   rR   rT   rU   rV   rX   rF   znot supportedr…   r†   rˆ   r‰   )r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   rŠ   )rb   rB   rc   rd   re   rf   rg   rU   rh   ri   rl   r~   r‹   rŒ   r�   s                  r   Útest_tokenize_not_implementedrÓ   
  s  € Üœ‹_€FØ�;‰;ØØ&°7Ñ;ð ó €Dð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØÐˆ7�dˆ?××Õˆ7�d××Óˆ7×××××Ð�d××Ó�d××××××ÓØÐ3˜d 7™mÐ3˜m×1Ñ1Ð3Ñ1Ó3Ð3ˆ?Ð3Ð3×3×3Õ3ˆ?Ð3×3×3Ó3ˆ?×3×3Ò3˜m×3×3Ò3Ð1×3×3Ò3Ð3×3×3×3×3×3×3×3Ð3r   c            	     ó¾  — ddi} t        dt        t        d| «      «      «      5  t        t        «      }|j                  ddg d¢dœ¬	«      }d d d «       j                  }d}||k(  }|s­t        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  «       }d}	|	|v }
|
s™t        j                  d|
fd|	|f«      t        j                  |	«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}	}
y # 1 sw Y   �ŒˆxY w)Nr'   zhello worldrt   r>   ú/api/detokenizerp   )éd   r>   i,  ©rY   Útokensr¢   r?   rA   rB   rC   rG   rH   r   rR   rT   rU   rV   rX   rF   r¨   )Údetokenize_payloadrb   rB   rc   rd   re   rf   rg   rU   rh   ri   rl   s               r   Útest_detokenize_successrÚ     s=  € Ø$ mÐ4ÐÜ	Ø2Ü”\ #Ð'9Ó:Ó;ó
ñ 
ô œC“ˆØ�{‰{ØØ*²oÑFð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØÐˆ6�Tˆ>××Õˆ6�T××Óˆ6×××××Ð�T××Ó�T××××××Ô÷
ñ 
ús   ¤(GÇGc                 óH  ‡‡— i Š G ˆfd„d«      Št        dˆfd„«      5  t        t        «      } | j                  ddg d¢dœ¬	«      }d
d
d
«       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d
x}x}}‰j                  }d} ||«      }d}||k(  }	|	sÕt        j                  d|	fd||f«      dt        j                  «       v st        j                  ‰«      rt        j                  ‰«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d
x}x}x}x}	}y
# 1 sw Y   �ŒÑxY w)zIVerify tokens list is converted to space-separated string before sending.c                  ó&   •— e Zd Zd„ Zd„ Zdˆ fd„	Zy)úFtest_detokenize_tokens_as_list_converted.<locals>.CapturingAsyncClientc              “  ó   K  — | S ­wr   r!   r   s    r   r)   zQtest_detokenize_tokens_as_list_converted.<locals>.CapturingAsyncClient.__aenter__/  s   è ø€ ØˆKùr*   c              —  ó   K  — y ­wr   r!   r,   s     r   r.   zPtest_detokenize_tokens_as_list_converted.<locals>.CapturingAsyncClient.__aexit__2  s	   è ø€ Øùr/   Nc              ›  óR   •K  — ‰j                  |xs i «       t        dddi«      S ­w)Nr>   r'   Úok)Úupdater
   )r   Úurlr   r2   Úcaptured_bodys       €r   r7   zKtest_detokenize_tokens_as_list_converted.<locals>.CapturingAsyncClient.post5  s+   øè ø€ Ø× Ñ  ¢¨Ô,Ü  j°$Ð%7Ó8Ð8ùs   ƒ$'r   )r   r   r   r)   r.   r7   )rä   s   €r   ÚCapturingAsyncClientrÝ   .  s   ø„ ò	ò	ö	9r   rå   rt   c                 ó   •—  ‰«       S r   r!   )ÚaÚkrå   s     €r   ú<lambda>z:test_detokenize_tokens_as_list_converted.<locals>.<lambda>9  s   ø€ ÑK_ÓKa€ r   rÕ   rp   )é   é   é	   r×   r¢   Nr>   r?   rA   rB   rC   rG   rH   rº   z7 8 9)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)srä   )rD   rE   rM   rO   r{   zassert %(py11)sÚpy11)r   r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   r3   )rb   rB   rc   rd   re   rf   rg   r~   Ú@py_assert8r‹   r   Ú@py_format12rå   rä   s               @@r   Ú(test_detokenize_tokens_as_list_convertedrð   *  sl  ù€ à€M÷	9ó 	9ô 
Ð9Ó;aÓ	bñ 
ÜœC“ˆØ�{‰{ØØ*²iÑ@ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø×ÑÐ1˜XÐ1Ñ˜XÓ&Ð1¨'Ð1Ð&¨'Ñ1×1×1Õ1Ð&¨'×1×1×1×1×1Ñ1ˆ=×1×1Ó1ˆ=×1×1Ô1Ð×1×1Ò1˜X×1×1Ò1Ð&×1×1Ò1¨'×1×1×1×1×1×1×1Ð1÷
ñ 
ús    (HÈH!c            
     óL  — t        dt        t        dd d«      «      «      5  t        t        «      } | j                  ddg d¢dœ¬«      }d d d «       j                  }d	}||k(  }|s­t        j                  d
|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y # 1 sw Y   ŒÒxY w)Nrt   i�  zbad requestrÕ   rp   )é   rv   é   r×   r¢   r‚   r?   rA   rB   rC   rG   rH   rÀ   rÁ   s          r   Útest_detokenize_non_200rô   C  sÐ   € Ü	Ø2Ü”\ # t¨]Ó;Ó<ó
ñ 
ô œC“ˆØ�{‰{ØØ*²iÑ@ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ô"÷
ð 
ús   ¡(DÄD#c            	     ó¶  ‡— t        t        ddd«      t        ddddii«      g«      Šdˆfd„} t        d	| «      5  t        t        «      }|j                  d
ddddœgdœ¬«      }ddd«       j                  }d}||k(  }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}|j                  «       }|d   d   d   d   }	d}|	|k(  }
|
slt        j                  d|
fd|	|f«      t        j                  |	«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}	x}
}y# 1 sw Y   �ŒlxY w)zCWhen /api/show returns non-200 for primary model, fallback is used.r¬   Nz	not foundr>   r„   r›   zfallback responsec                 ó,   •— t        t        ‰«      «      S r   )r#   Únext)r-   r2   Ú	responsess     €r   Ú_client_factoryz?test_fallback_when_primary_unavailable.<locals>._client_factory^  s   ø€ Üœt I›Ó/Ð/r   rt   r�   znonexistent-modelrž   rŸ   r™   r    r¢   r?   rA   rB   rC   rG   rH   r¤   r   rJ   rK   rN   rO   r”   )Úiterr
   r   r   r   r7   r   rZ   r[   r\   r]   r^   r_   r`   ra   r   )rù   rb   rB   rc   rd   re   rf   rg   rU   rh   ri   rj   rk   rø   s                @r   Ú&test_fallback_when_primary_unavailablerû   T  so  ø€ ô ä˜˜d KÓ0Ü˜˜y¨9Ð6IÐ*JÐKÓLð	
ó€Iõ0ô 
Ð9¸?Ó	Kñ 
ÜœC“ˆØ�{‰{ØØ.ÀfÐY]Ñ=^Ð<_Ñ`ð ó 
ˆ÷
ð ×ÑÐ"˜sÐ"Ð˜sÑ"×"×"Õ"Ð˜s×"×"×"×"×"Ñ"ˆ4×"×"Ó"ˆ4×"×"Ô"Ð×"×"Ò"˜s×"×"×"×"×"×"Ó"Ø�9‰9‹;€DØ�	‰?˜1Ñ˜iÑ(¨Ñ3ÐJÐ7JÐJÐ3Ð7JÑJ×J×JÕJÐ3Ð7J×J×JÓJÐ3×J×JÒJÐ7J×J×J×J×J×J×JÔJ÷
ñ 
ús   º*GÇG)r'   r
   r   r   )r   r   )&r    Ú
__future__r   Úbuiltinsr\   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterZ   Útypingr   Úunittest.mockr   r   Úfastapi.testclientr   r³   r   r
   r#   r;   rm   r€   rŽ   r•   rª   r®   r¶   r½   rÂ   rÍ   rÏ   rÑ   rÓ   rÚ   rð   rô   rû   r!   r   r   ú<module>r     s‘   ðñõ
 #ç  „ Õ ß *å )õ '÷	ñ 	÷ñ ó&óó9ó.
.ó
3ó"ó0ó
!ó"?ó"
#ó"4ó"#ó
#ó"	4ó ó 2ó2
#ô"Kr   