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

ガードレールとは、エージェントの実行と並行して実行されるチェックです。
ガードレールは、次のような処理に使用できます。
- 入力メッセージがトピックから外れていないか確認する
- 入力メッセージがポリシーに違反していないか確認する
- 予期しない入力が検出された場合、エージェントの実行制御を引き継ぐ

この例では、ユーザーが数学の宿題を要求した場合に作動する入力ガードレールを設定します。
ガードレールが作動した場合、拒否メッセージで応答します。
"""

### 1.ガードレール出力モデル
# 数学の宿題チェック用の出力モデル
class MathHomeworkOutput(BaseModel):
    reasoning: str  # 判断の理由
    is_math_homework: bool  # 数学の宿題かどうかのフラグ

### 2. Guardrail 用のプロバイダー設定 
#ガードレール用エージェント
gptoss_provider = OpenAIProvider(base_url="http://xxx.xxx.xxx.xxx:11434/v1")
model_gptoss = gptoss_provider.get_model("gpt-oss:latest")
guardrail_agent = Agent(
    	name="Guardrail check",
    	instructions="Check if the user is asking you to do their math homework.",
    	output_type=MathHomeworkOutput,
    	model=model_gptoss
)

### 3. 入力ガードレール関数
@input_guardrail
async def math_guardrail(
    context: RunContextWrapper[None], agent: Agent, input: str | list[TResponseInputItem]
) -> GuardrailFunctionOutput:　<- Guardrail関数型
    """
    入力が数学の宿題かどうかをチェックするガードレール関数。
    エージェントを使用してチェックを実行します。
    """
    result = await Runner.run( guardrail_agent , input, context=context.context)
    final_output = result.final_output_as(MathHomeworkOutput)
    
    return GuardrailFunctionOutput(
        output_info=final_output,　
        tripwire_triggered=final_output.is_math_homework, 
    )
：
：
# メインのエージェント
# エージェントの「input_guardrails」プロパティに登録した物がガードレールとして実行されます。、
async def main():
    gemma3_provider = OpenAIProvider( base_url="http://192.168.10.33:11434/v1"  )
    model_gemma3 = gemma3_provider.get_model("gemma3:12b")    
### 4. メインエージェントへの登録
agent = Agent(
name="Customer support agent",
        instructions="You are a customer support agent. You help customers with their questions.",
#ガードレールをinput_guardrails に登録
        input_guardrails=[math_guardrail],　
        model=model_gemma3,       # メインエージェントのモデル
    )
　　　　 ：
	：
try:
### 5. 実行と例外処理
result = await Runner.run(agent, input_data)
 # ガードレールが作動しなかった場合、結果を次の入力として使用して、会話を継続する
input_data = result.to_input_list()
except InputGuardrailTripwireTriggered as e:
    # ガードレールが作動した場合の処理
    message = "申し訳ありませんが、数学の宿題を手伝うことはできません."
    print(message)