応用例 - Refinire
Author: kitfactory
Description: 複数のLLMプロバイダーに対応した統一インターフェースライブラリ

コンテンツにスキップ

# 応用例

このチュートリアルでは、Agents SDK Models の応用的な使い方を紹介します。

## 0. 新しいFlow作成方法（超重要！）

新しい Flow は3つの方法で作成できます：

    from agents_sdk_models import create_simple_gen_agent, Flow, DebugStep

    # 1. 単一ステップ（最もシンプル！）
    gen_agent = create_simple_gen_agent("writer", "文章を書いてください", "gpt-4o-mini")
    flow = Flow(steps=gen_agent)

    # 2. シーケンシャルステップ（自動接続！）
    debug_step = DebugStep("debug", "処理完了")
    flow = Flow(steps=[gen_agent, debug_step])  # gen_agent → debug_step

    # 3. 従来方式（複雑なフロー用）
    flow = Flow(
        start="writer",
        steps={
            "writer": gen_agent,
            "debug": debug_step
        }
    )

    # 実行は全て同じ
    result = await flow.run(input_data="AIについて書いて")
    print(result.shared_state["writer_result"])

## 1. ツール連携（新推奨方法）

    from agents import function_tool
    from agents_sdk_models import create_simple_gen_agent, Flow

    @function_tool
    def get_weather(location: str) -> str:
        return f"Weather in {location}: Sunny, 25°C"

    # GenAgent + Flow方式（推奨）
    weather_agent = create_simple_gen_agent(
        name="weather_bot",
        instructions="""
        あなたは天気情報を提供するアシスタントです。必要に応じてget_weatherツールを使ってください。
        """,
        model="gpt-4o-mini",
        generation_tools=[get_weather]
    )

    flow = Flow(steps=weather_agent)  # 超シンプル！
    result = await flow.run(input_data="東京の天気は？")
    print(result.shared_state["weather_bot_result"])

### 旧方式（非推奨）

    # AgentPipeline（v0.1.0で削除予定）
    from agents_sdk_models import AgentPipeline
    pipeline = AgentPipeline(
        name="tool_example",
        generation_instructions="天気情報を提供してください。",
        model="gpt-4o-mini",
        generation_tools=[get_weather]
    )
    result = pipeline.run("東京の天気は？")
    print(result)

## 2. ガードレール（入力制御）

    from agents import input_guardrail, GuardrailFunctionOutput, Runner, RunContextWrapper, Agent
    from agents_sdk_models import AgentPipeline
    from pydantic import BaseModel

    class MathCheck(BaseModel):
        is_math: bool
        reason: str

    guardrail_agent = Agent(
        name="math_check",
        instructions="数学の宿題か判定してください。",
        output_type=MathCheck
    )

    @input_guardrail
    async def math_guardrail(ctx: RunContextWrapper, agent: Agent, input: str):
        result = await Runner.run(guardrail_agent, input, context=ctx.context)
        return GuardrailFunctionOutput(
            output_info=result.final_output,
            tripwire_triggered=result.final_output.is_math,
        )

    pipeline = AgentPipeline(
        name="guardrail_example",
        generation_instructions="質問に答えてください。",
        model="gpt-4o-mini",
        input_guardrails=[math_guardrail]
    )
    try:
        result = pipeline.run("2x+3=11を解いて")
        print(result)
    except Exception:
        print("ガードレール発動: 数学の宿題依頼を検出")

## 3. ダイナミックプロンプト

    def dynamic_prompt(user_input: str) -> str:
        return f"[DYNAMIC] {user_input.upper()}"

    pipeline = AgentPipeline(
        name="dynamic_example",
        generation_instructions="リクエストに答えてください。",
        model="gpt-4o-mini",
        dynamic_prompt=dynamic_prompt
    )
    result = pipeline.run("面白い話をして")
    print(result)

## 4. リトライ＆自己改善（新推奨方法）

    from agents_sdk_models import create_evaluated_gen_agent, Flow

    # 評価付きGenAgent + Flow方式（推奨）
    smart_agent = create_evaluated_gen_agent(
        name="smart_writer",
        generation_instructions="文章を生成してください。",
        evaluation_instructions="分かりやすさで評価し、コメントも返してください。",
        model="gpt-4o-mini",
        threshold=80,
        retries=2
    )

    flow = Flow(steps=smart_agent)  # 自動でリトライ＆自己改善！
    result = await flow.run(input_data="AIの歴史を教えて")
    print(result.shared_state["smart_writer_result"])

### 旧方式（非推奨）

    # AgentPipeline（v0.1.0で削除予定）
    pipeline = AgentPipeline(
        name="retry_example",
        generation_instructions="文章を生成してください。",
        evaluation_instructions="分かりやすさで評価し、コメントも返してください。",
        model="gpt-4o-mini",
        threshold=80,
        retries=2
    )
    result = pipeline.run("AIの歴史を教えて")
    print(result)

## 5. 複雑なワークフロー（マルチステップ）

    from agents_sdk_models import (
        create_simple_gen_agent, create_evaluated_gen_agent,
        Flow, DebugStep, UserInputStep, ConditionStep
    )

    # 複数のGenAgentを組み合わせ
    idea_generator = create_simple_gen_agent(
        name="idea_gen",
        instructions="創造的なアイデアを生成してください",
        model="gpt-4o-mini"
    )

    content_writer = create_evaluated_gen_agent(
        name="writer",
        generation_instructions="提供されたアイデアを基に詳細な記事を書いてください",
        evaluation_instructions="記事の質を評価してください",
        model="gpt-4o",
        threshold=75
    )

    reviewer = create_simple_gen_agent(
        name="reviewer",
        instructions="記事をレビューして改善提案をしてください",
        model="claude-3-5-sonnet-latest"
    )

    # シーケンシャルワークフロー（自動接続！）
    flow = Flow(steps=[
        idea_generator,      # アイデア生成
        content_writer,      # 記事執筆（評価付き）
        reviewer,           # レビュー
        DebugStep("done", "ワークフロー完了")
    ])

    result = await flow.run(input_data="AI技術について")
    print("アイデア:", result.shared_state["idea_gen_result"])
    print("記事:", result.shared_state["writer_result"])
    print("レビュー:", result.shared_state["reviewer_result"])

## 6. 条件分岐付きワークフロー

    # 条件に応じて異なる処理パスを実行
    def check_content_type(ctx):
        user_input = ctx.last_user_input or ""
        return "技術" in user_input

    tech_writer = create_simple_gen_agent("tech", "技術記事を書く", "gpt-4o")
    general_writer = create_simple_gen_agent("general", "一般記事を書く", "gpt-4o-mini")

    # 従来方式（複雑なフロー用）
    complex_flow = Flow(
        start="check_type",
        steps={
            "check_type": ConditionStep(
                "check_type",
                check_content_type,
                "tech_writer",
                "general_writer"
            ),
            "tech_writer": tech_writer,
            "general_writer": general_writer,
            "review": create_simple_gen_agent("reviewer", "記事をレビュー", "claude-3-5-sonnet-latest")
        }
    )

    result = await complex_flow.run(input_data="技術的な内容について書いて")

## ポイント

- 新機能： `Flow(steps=[step1, step2])` で自動シーケンシャル接続
- 新機能： `Flow(steps=single_step)` で単一ステップも超シンプル
- ツールやガードレール、動的プロンプト、自己改善を柔軟に組み合わせ可能
- 旧 `AgentPipeline` から `GenAgent + Flow` への移行は簡単
- 複雑なワークフローも数行で構築可能