BabyWriterPro2 / third.py
Yasu777's picture
Update third.py
2901d59 verified
# -*- coding: utf-8 -*-
import os
import openai
import json
import requests
from langchain.chat_models import ChatOpenAI
from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
from langchain.llms import OpenAI
from langchain.agents.tools import Tool
from bs4 import BeautifulSoup
import asyncio
from datetime import timedelta
# APIキーの設定
openai.api_key = os.getenv("OPENAI_API_KEY")
TAVILY_API_KEY = os.getenv('TAVILY_API_KEY')
# Tavily APIのツールを定義
class TavilySearchTool:
@staticmethod
def search(query):
response = requests.post('https://api.tavily.com/search', headers={
'Content-Type': 'application/json'
}, json={
'api_key': TAVILY_API_KEY,
'query': query,
'max_results': 10,
'include_answers': True
})
if response.status_code == 200:
return response.json()['results']
else:
raise Exception("Failed to fetch data from Tavily API")
# 実行された指示を追跡するリスト
executed_instructions = []
# 調査結果を保存するリスト
research_results = []
async def main(editable_output2, keyword_id):
tavily_search_tool = Tool(
name="TavilySearch",
func=TavilySearchTool.search,
description="Search tool using Tavily API"
)
tools = [tavily_search_tool]
# PlannerとExecutorの定義
model_name = "gpt-3.5-turbo-1106"
llm = ChatOpenAI(model_name=model_name, temperature=0, max_tokens=1000)
planner = load_chat_planner(llm)
executor = load_agent_executor(llm, tools, verbose=True)
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
# HTML解析
soup = BeautifulSoup(editable_output2, 'html.parser')
h1_text = soup.find('h1').get_text()
h2_texts = [h2.get_text() for h2 in soup.find_all('h2')]
h3_texts = [h3.get_text() for h3 in soup.find_all('h3')]
purpose = f"about {h1_text}, focusing particularly on {' and '.join(h2_texts)} and {' and '.join(h3_texts)}, to investigate the latest information and details"
# 特定情報の指定
if "人物" in h1_text or any("人物" in h2 for h2 in h2_texts) or any("人物" in h3 for h3 in h3_texts):
purpose += " including the person's name and career"
elif "商品" in h1_text or any("商品" in h2 for h2 in h2_texts) or any("商品" in h3 for h3 in h3_texts):
purpose += " including the brand name, product name, and price"
elif "イベント" in h1_text or any("イベント" in h2 for h2 in h2_texts) or any("イベント" in h3 for h3 in h3_texts):
purpose += " including the event's content, schedule, and venue"
instruction = f"Can you research {purpose} and include specific details in your response? Please provide the information in Japanese."
if instruction not in executed_instructions:
raw_output = agent.run(instruction)
executed_instructions.append(instruction)
response_content = raw_output
research_results.append(response_content)
else:
index = executed_instructions.index(instruction)
response_content = research_results[index]
system_message = {
"role": "system",
"content": "あなたはプロのライターです。すべての回答を日本語でお願いします。"
}
research_summary = "\n".join(research_results)
instructions = []
instructions.append(f"""
<h1>{h1_text}</h1>
"{h1_text}"に関する導入文を日本語で作成してください。直接的なコピーまたは近いフレーズを避けて、オリジナルな内容にしてください。""")
sentences = research_summary.split('。')
for idx, h2_text in enumerate(h2_texts):
h3_for_this_h2 = [h3 for h3 in h3_texts if h3.startswith(f"{idx+1}-")]
instructions.append(f"""
<h2>{h2_text}</h2>
"{h2_text}"に関する導入文を日本語で作成してください。この導入文は、以下の小見出しの内容を考慮してください:{"、".join(h3_for_this_h2)}。直接的なコピーまたは近いフレーズを避けて、オリジナルな内容にしてください。""")
for h3 in h3_for_this_h2:
related_sentences = [sentence for sentence in sentences if h3 in sentence]
if related_sentences:
content_for_h3 = "。".join(related_sentences) + "。"
instructions.append(f"""
<h3>{h3}</h3>
"{h3}"に関する詳細な内容として、以下の情報を日本語で記述してください:{content_for_h3} ここでも、オリジナルな内容を心がけてください。""")
else:
instructions.append(f"""
<h3>{h3}</h3>
"{h3}"に関する詳細な内容を日本語で記述してください。オリジナルな内容を心がけてください。""")
user_message = {
"role": "user",
"content": "\n".join(instructions)
}
response = openai.ChatCompletion.create(
model="gpt-4-0125-preview",
messages=[system_message, user_message],
temperature=0.7,
)
result = response.choices[0]["message"]["content"]
with open('output3.txt', 'w', encoding='utf-8') as f:
f.write(result)
print(result)