OpenAIのAgent SDKで遊ぶ。小説を書いてみる

## Agent SDKのサンプルソースを動かしてみた。
大体の流れとしては
①ユーザーの入力を元にアウトラインをエージェントが考える。
②出来たアウトラインを元に別なエージェントが良いか、またSFかを判断する。
③良くない場合、またSFではない場合はそこで終了する。
④アウトラインが良く、SFである場合は作家エージェントが小説を書く。
という流れになっている。

```
import asyncio

from pydantic import BaseModel

from agents import Agent, Runner, trace

"""
This example demonstrates a deterministic flow, where each step is performed by an agent.
1. The first agent generates a story outline
2. We feed the outline into the second agent
3. The second agent checks if the outline is good quality and if it is a scifi story
4. If the outline is not good quality or not a scifi story, we stop here
5. If the outline is good quality and a scifi story, we feed the outline into the third agent
6. The third agent writes the story
"""

story_outline_agent = Agent(
    name="ストーリー_アウトライン_エージェント",
    instructions="ユーザーの入力に基づきとても短いストーリーのアウトラインを生成する.",
)


class OutlineCheckerOutput(BaseModel):
    good_quality: bool
    is_scifi: bool


outline_checker_agent = Agent(
    name="アウトライン_チェッカー_エージェント",
    instructions="与えられたストーリーのアウトラインを読んで品質を判定しSF小説か判断する.",
    output_type=OutlineCheckerOutput,
)

story_agent = Agent(
    name="ストーリー_エージェント",
    instructions="与えられたアウトラインで短い小説を書く.",
    output_type=str,
)


async def main():
    input_prompt = input("どんな種類の小説がいい? ")

    # Ensure the entire workflow is a single trace
    with trace("小説が決定されるフロー"):
        # 1. Generate an outline
        outline_result = await Runner.run(
            story_outline_agent,
            input_prompt,
        )
        print("アウトラインが出来た")

        # 2. Check the outline
        outline_checker_result = await Runner.run(
            outline_checker_agent,
            outline_result.final_output,
        )

        # 3. Add a gate to stop if the outline is not good quality or not a scifi story
        assert isinstance(outline_checker_result.final_output, OutlineCheckerOutput)
        if not outline_checker_result.final_output.good_quality:
            print("アウトラインの品質が良くないのでここで終了する.")
            exit(0)

        if not outline_checker_result.final_output.is_scifi:
            print("アウトラインはSFでないのでここで終了する.")
            exit(0)

        print("アウトラインは良い品質でSFなので引き続き小説を書く.")

        # 4. Write the story
        story_result = await Runner.run(
            story_agent,
            outline_result.final_output,
        )
        print(f"Story: {story_result.final_output}")
```

動作結果
```
どんな種類の小説がいい? 猫の宇宙旅行    
アウトラインが出来た
アウトラインは良い品質でSFなので引き続き小説を書く.
Story: ### 宇宙を駆けるミケ

1. **設定**
静かな田舎町の片隅、ミケという名の猫が暮らしていた。彼のひげは常に好奇心でピンと立ち、青い目は日々の発見に輝いていた。人々が穏やかに暮らすこの町で、ミケだけは何か新 しいものを探し求めていた。

2. **冒険の始まり**
ある日、ミケは裏庭でうねる草をかき分け、不思議な装置を発見した。それは金属製の丸い板のようで、なんとも不思議な光を放っていた。好奇心を抑えられず、ミケはその上を歩き 回った。

3. **宇宙への旅**
突然、地面が青く輝き、その光の中でミケの体がふわりと浮き上がった。あっという間に彼は宇宙船の中にいた。あたりを見回すと、その船室は未知のテクノロジーで満たされ、窓か らは無限の星空が広がっていた。

4. **新しい友達**
宇宙船の中で、ミケは一匹の奇妙なエイリアンに出会った。そのエイリアンはタコのような姿で「タック」と名乗った。彼はミケに優しく微笑み、宇宙の言葉で歓迎の意を伝えた。次 第に彼らは仲良くなり、互いの星について興味を持ち始めた。

5. **ミッション**
タックの故郷の星が危機に瀕しており、その原因はエネルギー源の異常にあった。驚いたことに、その問題を解決できる鍵はミケが見つけた装置に隠されているという。ミケはタック と共に、問題解決に挑むことを決意した。

6. **帰還**
ミケとタックは協力して装置を解析し、エネルギー源を安定させることに成功した。星は救われ、住民たちは感謝の意を込めて二人を見送った。友情で満たされた船は、再び青い地球 に向けて進み始めた。

7. **教訓と結び**
地球に帰還したミケは、田舎町の裏庭に舞い降りた。旅の記憶を振り返り、仲間と協力することの大切さを深く心に刻んだ。この冒険は、彼にとって忘れられない宝となったのだった 。外の世界は広く、未知の友が待っている。今日もミケは、新しい冒険を求めて歩き出す。
```
別パターン
```
どんな種類の小説がいい? 歴史恋愛小説
アウトラインが出来た
アウトラインはSFでないのでここで終了する.
```