ChatGPTにAPIで阿部寛のホームページについて訊く

![Mar-18-2025 07-37-33.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5f48f7be-c9e6-4752-b93e-62461d182611.gif)


### インストール

```shell
pip install openai
pip install bs4
```

```shell
export OPENAI_API_KEY="your_api_key"
```

### アシスタント実行クラスを作る

```python
import openai
import os
import time
import requests
from bs4 import BeautifulSoup

class Assistant:
    def __init__(self, assistant_id=None, instructions=None):
        api_key = os.environ.get('OPENAI_API_KEY')
        if api_key is None:
            raise ValueError("環境変数 'OPENAI_API_KEY' が設定されていません。");

        self.client = openai.OpenAI(api_key=api_key)
        self.instructions = instructions
        self.assistant_id = assistant_id

        if not self.assistant_id:
            self.assistant_id = self.create_assistant()

    def fetch_and_summarize_webpage(self, url):
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        text = soup.get_text(separator=" ")
        summary_prompt = f"以下のテキストを200文字以内に要約してください。:\n\n{text[:4000]}"
        completion = self.client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": summary_prompt}],
            temperature=0.5
        )
        return completion.choices[0].message.content.strip()

    def create_assistant(self):
        instructions = self.instructions
        assistant = self.client.beta.assistants.create(
            name=f"紹介bot",
            instructions=instructions,
            model="gpt-4o",
            temperature=0.7
        )
        return assistant.id

    def create_description(self, prompt, web_url=None, stream=False):
        thread = self.client.beta.threads.create()
        if web_url:
            webpage_summary = self.fetch_and_summarize_webpage(web_url)
            prompt += f"\n\n【参考Webページ要約】\n{webpage_summary}"
        print(webpage_summary)
        user_message = prompt

        self.client.beta.threads.messages.create(
            thread_id=thread.id,
            role="user",
            content=user_message
        )

        run = self.client.beta.threads.runs.create(
            thread_id=thread.id,
            assistant_id=self.assistant_id,
            stream=stream
        )

        if stream:
            return run, thread.id

        while True:
            run_status = self.client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id)
            if run_status.status == "completed":
                break
            elif run_status.status in ["failed", "cancelled", "expired"]:
                raise Exception(f"実行エラー: {run_status.status}")
            time.sleep(1)

        messages = self.client.beta.threads.messages.list(thread_id=thread.id)

        for message in messages.data:
            if message.role == "assistant":
                return message.content[0].text.value.strip()
```

### 実行

```python
instructions = """
    あなたは芸能人の紹介文を作るプロです。対象芸能人の特徴を分かりやすく具体的に伝え、
    読者の関心を引く魅力的な紹介文を400文字程度で作成してください。
"""

bot = Assistant(instructions=instructions)

prompt = "この人について教えて"
web_url = "http://abehiroshi.la.coocan.jp/prof/prof.htm"

run, thread_id = bot.create_description(prompt,web_url=web_url, stream=True)
for event in run:
    if event.event == 'thread.message.delta':
        content = event.data.delta.content
        if content:
            print(content[0].text.value, end='', flush=True)
```

WEB情報をまとめたもの
>1964年生まれの日本の俳優であり、多くの映画やテレビドラマに出演している。彼は国内外で数々の賞を受賞しており、特にアジア映画界での功績が認められている。代表作には「メンズノンノ」や「テルマエ・ロマエ」などがあり、幅広いジャンルで活躍している。彼の演技は高く評価され、観客からも支持を受けている。

応答
>1964年生まれの日本の俳優であるこの人物は、多くの映画やテレビドラマでその存在感を発揮してきました。国内外で数々の賞を受賞し、特にアジア映画界での功績が高く評価されています。彼の代表作として知られる「メンズノンノ」や「テルマエ・ロマエ」は、彼の多才な演技力を示す絶好の例です。これらの作品で披露する彼の演技は、観客の心を掴んで離さず、批評家からも高い評価を受けています。
>
>幅広いジャンルで活躍する彼は、シリアスなドラマからコメディまで、さまざまな役柄を自在に演じ分けることができ、その多面性が魅力の一つです。彼の演技には、キャラクターの内面を深く掘り下げ、視聴者に感情移入させる力があります。このような演技スタイルは、彼が出演する作品において、物語に深みを与える重要な要素となっています。
>
>また、彼の演技は単に技術的な面だけでなく、自然体の魅力を放つことでも知られています。これにより、彼のキャラクターは常に観客に親しみやすく、共感を呼び起こします。彼は日本国内のみならず、国際的にもその名を知られ、今後も多くの作品で新たな魅力を発揮していくことでしょう