
    ]Gi                         d dl Zd dlmc mZ d dlmZmZm	Z	 d dl
Z
ddZddZddZddZde
j        ddfd	Zde
j        ddfd
Zde
j        ddfdZde
j        ddfdZde
j        ddfdZddZdS )    N)	LLMClientLLMParseErrorLLMProviderErrorreturnc                  j   t          j        dg          } |                     d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 S )NzU```json
{"next_action": "FINISH", "analysis": "done", "final_report": "# Report"}
```openaifakepromptprovidermodelsystem_promptuser_promptnext_actionFINISH==z%(py1)s == %(py4)spy1py4assert %(py6)spy6r   from_fake_responsesgenerate_structured_response
@pytest_ar_call_reprcompare	_safereprAssertionError_format_explanationclientresult@py_assert0@py_assert3@py_assert2@py_format5@py_format7s          5/root/projects/multi-agents-meeting/tests/test_llm.py/test_parse_structured_response_from_fenced_jsonr+      s    *
 	 F 00	 1  F - ,H, H,,,,,,,,,, H,,,,, ,,,,H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,    c                  j   t          j        dg          } |                     d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 S )NzqHere is the JSON you requested:
{"next_action": "FINISH", "analysis": "done", "final_report": "# Report"}
Thanks.	anthropicr	   r
   r   final_report# Reportr   r   r   r   r   r   r"   s          r*   =test_parse_structured_response_with_leading_and_trailing_textr1      s    * B	
 F 00	 1  F .!/Z/!Z//////////!Z/////!////Z/////////////////////////////r,   c                  r   t          j        ddddg          } |                     d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 S )Nr   doner0   r   analysisr/   r   r	   r
   r   r   r   r   r   r   r   r   r"   s          r*   /test_fake_llm_client_returns_structured_payloadr6   '   s    *!vz	R	RS F 00	 1  F - ,H, H,,,,,,,,,, H,,,,, ,,,,H,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r,   c                     t          j        dg          } |                     dddd          }d}||k    }|st          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}}d S )Nzplain text responser.   r	   r
   r   r   )z%(py0)s == %(py3)sr$   )py0py3zassert %(py5)spy5)r   r   generate_text_responser   r   @py_builtinslocals_should_repr_global_namer   r    r!   )r#   r$   r'   @py_assert1@py_format4@py_format6s         r*   )test_fake_llm_client_returns_text_payloadrB   6   s	   *,A+BCCF**	 +  F +*6***********6*************6*****6**********************************r,   monkeypatchc                     |                      dd           t                      }t          j        t                    5  |                    dddd           d d d            d S # 1 swxY w Y   d S NOPENAI_API_KEYFraisingr   gpt-4.1r
   r   )delenvr   pytestraisesr   r;   rC   r#   s     r*   %test_openai_provider_requires_api_keyrN   C   s    '777[[F	'	(	( 
 
%%" 	 	& 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   A&&A*-A*c                     |                      dd           t                      }t          j        t                    5  |                    dddd           d d d            d S # 1 swxY w Y   d S )NANTHROPIC_API_KEYFrG   r.   zclaude-sonnet-4-5r
   r   rJ   r   rK   rL   r   r   rM   s     r*   (test_anthropic_provider_requires_api_keyrS   P   s    *E:::[[F	'	(	( 
 
++ %" 	 	, 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
rO   c                    |                      dd           t                      }|                                }|j        }d }||u}|st	          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}}d S )	NrF   test-keyis notz3%(py2)s
{%(py2)s = %(py0)s.timeout
} is not %(py5)sopenai_clientr8   py2r:   assert %(py7)spy7)setenvr   _build_openai_clienttimeoutr   r   r<   r=   r>   r   r    r!   )rC   r#   rY   r?   @py_assert4r&   rA   @py_format8s           r*   (test_openai_client_uses_explicit_timeoutrc   ]   s   '444[[F//11M ,, ,,,,,,,,,, ,,,,,,,,,,,,=,,,,,=,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,r,   c                     |                      dd           t                      }t          j        t                    5  |                    dddd           d d d            d S # 1 swxY w Y   d S rE   rR   rM   s     r*   :test_openai_provider_missing_api_key_raises_provider_errorre   f   s     '777[[F	'	(	( 
 
++" 	 	, 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
rO   c                    |                      dd           t                      }|                                }|j        }d }||u}|st	          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}}d S )	NrQ   rU   rV   rX   anthropic_clientrZ   r\   r]   )r^   r   _build_anthropic_clientr`   r   r   r<   r=   r>   r   r    r!   )rC   r#   rg   r?   ra   r&   rA   rb   s           r*   +test_anthropic_client_uses_explicit_timeoutri   u   s   *J777[[F5577#/4/#4//////////#4///////////////////////#////4/////////////////////////////r,   c                  
    G d dt                     }  |             }|                    d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}}|j        }d}	||	k    }|st          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}}	d}|j        d         }||v }|slt          j        d|fd||f          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}}d S )Nc            
       H     e Zd Zd fdZdedededeeef         fdZ xZS )	\test_real_structured_response_retries_once_with_stronger_json_prompt.<locals>.RetryingClientr   Nc                 d    t                                                       g | _        d| _        d S )Nr   )super__init__user_promptscalls)self	__class__s    r*   ro   zetest_real_structured_response_retries_once_with_stronger_json_prompt.<locals>.RetryingClient.__init__   s,    GG+-DDJJJr,   r   r   r   c                     | xj         dz  c_         | j                            |           | j         dk    rt          d          ddddS )N   zmodel did not return valid JSONr   r3   r0   r4   )rq   rp   appendr   )rr   r   r   r   s       r*   $_generate_openai_structured_responseztest_real_structured_response_retries_once_with_stronger_json_prompt.<locals>.RetryingClient._generate_openai_structured_response   sU     JJ!OJJ$$[111zQ#$EFFF#+Q[\\\r,   r   N)	__name__
__module____qualname__ro   strdictobjectrw   __classcell__)rs   s   @r*   RetryingClientrl      s        	 	 	 	 	 	

	]
	] 
	] 	
	]
 #v+
	] 
	] 
	] 
	] 
	] 
	] 
	] 
	]r,   r   r   rI   r
   zoriginal promptr   r   r   r   r   r   r   r      )z-%(py2)s
{%(py2)s = %(py0)s.calls
} == %(py5)sr#   rZ   r\   r]   zReturn only valid JSONru   )in)z%(py1)s in %(py4)s)r   r   r   r   r   r    r!   rq   r<   r=   r>   rp   )r   r#   r$   r%   r&   r'   r(   r)   r?   ra   rA   rb   s               r*   Dtest_real_structured_response_retries_once_with_stronger_json_promptr   ~   s   ] ] ] ] ] ] ] ]$ ^F00%	 1  F - ,H, H,,,,,,,,,, H,,,,, ,,,,H,,,,,,,,,,,,,,,,,,,,,,,,,,,<1<1<166<1#=v':1'==#'===========#'======#===='==============================r,   rx   )builtinsr<   _pytest.assertion.rewrite	assertionrewriter   core.llmr   r   r   rK   r+   r1   r6   rB   MonkeyPatchrN   rS   rc   re   ri   r    r,   r*   <module>r      ss                 ? ? ? ? ? ? ? ? ? ? - - - -"0 0 0 0"- - - -
+ 
+ 
+ 
+

v7I 

d 

 

 

 



&:L 

QU 

 

 

 

-&:L -QU - - - -
#
	
 
 
 
0V=O 0TX 0 0 0 0> > > > > >r,   