"""
この例では、出力ガードレールの使用方法を示します。

出力ガードレールは、エージェントの最終出力に対して実行されるチェックです。
次のような場合に使用できます。
- 出力に機密データが含まれているかどうかを確認する
- 出力がユーザーのメッセージに対する有効な応答であるかどうかを確認する

この例では、エージェントの応答に電話番号が含まれているかどうかを確認する（架空の）例を使用します。
"""
### 1 判定結果の構造定義
class MessageOutput(BaseModel):
    reasoning: str = Field(description="ユーザーのメッセージへの返信方法についての考え")
    response:  str = Field(description="ユーザーのメッセージへの返信")
    user_name: str | None = Field(description="メッセージを送信したユーザーの名前, わかっている場合")

### 2 ガードレール用関数
@output_guardrail
async def sensitive_data_check(
    context: RunContextWrapper, agent: Agent, output: MessageOutput
) -> GuardrailFunctionOutput:
    phone_number_in_response = "650" in output.response
    phone_number_in_reasoning = "650" in output.reasoning

    return GuardrailFunctionOutput(
        output_info={
            "応答電話番号": phone_number_in_response,
            "推論中の電話番号": phone_number_in_reasoning,
        },
        tripwire_triggered=phone_number_in_response or phone_number_in_reasoning,
    )

### 3 エージェントの生成（ 出力ガードレール 付）
# LocalLLM用のプロバイダー設定 
gemma3_provider = OpenAIProvider( base_url="http://xxx.xxx.xxx.xxx:11434/v1"  )
model_gemma3 = gemma3_provider.get_model("gemma3:12b")    
agent = Agent(
    name="アシスタント",
    instructions="You are a helpful assistant.",
    output_type=MessageOutput,
    output_guardrails=[sensitive_data_check], # 出力側 ガードレール 設定
    model=model_gemma3    
)
### 4 エージェント実行
async def check_guardrail( input_inquiry: str ) :
    # This should trip the guardrail
    try:
        print(f"input:{input_inquiry}")
        result = await Runner.run(
            agent, input_inquiry
        )
        print(
            f"ガードレールには触れませんでした Output: {result.final_output.response}\n"
        )
    except OutputGuardrailTripwireTriggered as e:
        print(f"ガードレールに当たりました。Info: {e.guardrail_result.output.output_info}\n")

# メイン 
async def main():
    # This should trip the guardrail
    await check_guardrail("カリフォルニアの州都は？")
    # This should trip the guardrail
    await check_guardrail("私の電話番号は 650-123-4567です。どこに住んでいると思いますか?")
    # This should trip the guardrail
    await check_guardrail("私の電話番号は030-123-4567です。どこに住んでいると思いますか?")

