{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# TypeSafe AI Jev: 桃太郎を使った利用例\n",
        "typesafe-sdk==0.6.0 / python-dotenv==1.2.3。作業ディレクトリの.envにTYPESAFE_API_KEYを設定してください。\n",
        "API出力は未保存です。全セルの実行で4回のAPIリクエストを送信します。\n"
      ],
      "id": "jev-example-00"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 環境変数の読み込み"
      ],
      "id": "jev-example-01"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from dotenv import load_dotenv\n",
        "\n",
        "load_dotenv(\".env\")"
      ],
      "id": "jev-example-02"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 共通のstate"
      ],
      "id": "jev-example-03"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "momotaro_story = (\n",
        "    \"昔々、あるところにおじいさんとおばあさんが住んでいました。おばあさんが川で洗濯をしていると、\"\n",
        "    \"大きな桃がどんぶらこと流れてきました。家に持ち帰り桃を割ると、中から元気な男の子が生まれ、\"\n",
        "    \"二人は桃太郎と名付けて育てました。桃太郎はすくすくと成長し、ある日、鬼ヶ島の鬼たちが村人から\"\n",
        "    \"金銀財宝を奪い、乱暴を働いていることを知ります。桃太郎は鬼退治を決意し、おばあさんが作ってくれた\"\n",
        "    \"きび団子を持って旅に出ました。道中、犬・猿・雉に出会い、きび団子を分け与えることで仲間にします。\"\n",
        "    \"桃太郎たちは力を合わせて鬼ヶ島に上陸し、鬼の大将と激しく戦った末に鬼たちを降伏させ、奪われていた\"\n",
        "    \"財宝を取り戻しました。桃太郎たちは財宝を持って村に帰り、おじいさんとおばあさんや村人たちと共に\"\n",
        "    \"平和な暮らしを取り戻しました。\"\n",
        ")"
      ],
      "id": "jev-example-04"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Noul: 二択判定"
      ],
      "id": "jev-example-05"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from typesafe_sdk import Noul, TypeSafeClient\n",
        "\n",
        "with TypeSafeClient() as client:\n",
        "    response = client.system_one(\n",
        "        model=\"jev-latest\",\n",
        "        state=momotaro_story,\n",
        "        questions={\n",
        "            \"succeeded_with_animal_help\": Noul(\n",
        "                instructions=\"桃太郎は犬・猿・雉など動物たちの協力を得て鬼退治に成功しましたか？\",\n",
        "                criteria={\n",
        "                    \"true\": \"動物たちが仲間になり、鬼退治の成功に貢献している\",\n",
        "                    \"false\": \"動物の協力がない、または鬼退治に失敗している\",\n",
        "                },\n",
        "            ),\n",
        "        },\n",
        "    )\n",
        "\n",
        "print(response.nouls[\"succeeded_with_animal_help\"].noul)"
      ],
      "id": "jev-example-06"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Choice: ジャンル分類"
      ],
      "id": "jev-example-07"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from typesafe_sdk import Choice, TypeSafeClient\n",
        "\n",
        "with TypeSafeClient() as client:\n",
        "    response = client.system_one(\n",
        "        model=\"jev-latest\",\n",
        "        state=momotaro_story,\n",
        "        questions={\n",
        "            \"genre\": Choice(\n",
        "                instructions=\"この物語のジャンルとして最も適切なものはどれですか？\",\n",
        "                criteria={\n",
        "                    \"昔話・おとぎ話\": \"口承で伝わる伝統的な民話、不思議な出来事や教訓を含む\",\n",
        "                    \"恋愛小説\": \"登場人物の恋愛関係が主題の物語\",\n",
        "                    \"推理小説\": \"謎解きや犯人捜しが主題の物語\",\n",
        "                    \"伝記\": \"実在した人物の生涯を記録した書物\",\n",
        "                },\n",
        "            ),\n",
        "        },\n",
        "    )\n",
        "\n",
        "result = response.choices[\"genre\"]\n",
        "print(result.choice)\n",
        "print(result.probabilities)\n",
        "print(result.confidence)"
      ],
      "id": "jev-example-08"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## Score: 脅威の評価"
      ],
      "id": "jev-example-09"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from typesafe_sdk import Score, TypeSafeClient\n",
        "\n",
        "with TypeSafeClient() as client:\n",
        "    response = client.system_one(\n",
        "        model=\"jev-latest\",\n",
        "        state=momotaro_story,\n",
        "        questions={\n",
        "            \"oni_threat_level\": Score(\n",
        "                instructions=\"鬼ヶ島の鬼が村にもたらしていた脅威はどの程度深刻でしたか？\",\n",
        "                criteria=[\n",
        "                    {\n",
        "                        # スコア値 0\n",
        "                        \"what\": \"村人に軽いいたずらをする程度\",\n",
        "                        \"examples\": [\"作物を少し荒らす\", \"夜中に物音を立てて驚かせる\"],\n",
        "                    },\n",
        "                    {\n",
        "                        # スコア値 1\n",
        "                        \"what\": \"村人の生活や財産に大きな被害を与えている\",\n",
        "                        \"examples\": [\"金銀財宝を略奪する\", \"家屋を破壊する\"],\n",
        "                    },\n",
        "                    {\n",
        "                        # スコア値 2\n",
        "                        \"what\": \"村人の命や安全を脅かすほど深刻な脅威となっている\",\n",
        "                        \"examples\": [\"村人に暴力を振るう\", \"村を占拠し支配する\"],\n",
        "                    },\n",
        "                ],\n",
        "            ),\n",
        "        },\n",
        "    )\n",
        "\n",
        "result = response.scores[\"oni_threat_level\"]\n",
        "print(result.score)\n",
        "print(result.legend)\n",
        "print(result.probabilities)\n",
        "print(result.confidence)"
      ],
      "id": "jev-example-10"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 複合例: 3種類をまとめて評価"
      ],
      "id": "jev-example-11"
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "from typesafe_sdk import Choice, Noul, Score, TypeSafeClient\n",
        "\n",
        "with TypeSafeClient() as client:\n",
        "    response = client.system_one(\n",
        "        model=\"jev-latest\",\n",
        "        state=momotaro_story,\n",
        "        questions={\n",
        "            \"is_happy_ending\": Noul(\n",
        "                instructions=\"この物語はハッピーエンドで終わりますか？\"\n",
        "            ),\n",
        "            \"protagonist_trait\": Choice(\n",
        "                instructions=\"主人公の桃太郎の性格として最も近いものはどれですか？\",\n",
        "                criteria={\"勇敢\": None, \"臆病\": None, \"狡猾\": None, \"怠惰\": None},\n",
        "            ),\n",
        "            \"moral_lesson_strength\": Score(\n",
        "                instructions=\"この物語の教訓性（子供向けの教育的価値）はどの程度強いですか？\",\n",
        "                criteria=[\n",
        "                    {\n",
        "                        # スコア値 0\n",
        "                        \"what\": \"教訓性はほとんどない\",\n",
        "                        \"examples\": [\"単なる出来事の羅列で教訓的な結論がない\"],\n",
        "                    },\n",
        "                    {\n",
        "                        # スコア値 1\n",
        "                        \"what\": \"ある程度の教訓が含まれている\",\n",
        "                        \"examples\": [\"努力や協力の大切さが部分的に読み取れる\"],\n",
        "                    },\n",
        "                    {\n",
        "                        # スコア値 2\n",
        "                        \"what\": \"勧善懲悪など明確な教訓が中心テーマとなっている\",\n",
        "                        \"examples\": [\"悪が裁かれ、善が報われる結末が明示されている\"],\n",
        "                    },\n",
        "                ],\n",
        "            ),\n",
        "        },\n",
        "    )\n",
        "\n",
        "score_result = response.scores[\"moral_lesson_strength\"]\n",
        "print(response.nouls[\"is_happy_ending\"].noul)\n",
        "print(response.choices[\"protagonist_trait\"].choice)\n",
        "print(score_result.score)\n",
        "print(score_result.legend)\n",
        "print(response.model)"
      ],
      "id": "jev-example-12"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.13"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
