😺
ファイル書き込みのみの簡易エージェント
llmから提示されたコードを毎回張り付けており、非効率だったので、
ファイルの書き込みのみの簡易エージェント?を作成しました。
自動でバリバリ開発してくれるようなものではありませんので、ご注意ください。
llm.py
import os
import groq
from dotenv import load_dotenv
import re
# .envファイルから環境変数を読み込む
load_dotenv()
# Groqクライアントの初期化
client = groq.Groq(api_key=os.getenv("GROQ_API_KEY"))
base_dir = "sample_project"
def save_code_to_file(file_name, code_content):
"""
指定されたファイル名でコードを保存する関数
"""
try:
if not os.path.exists(base_dir):
# ディレクトリが存在しない場合、ディレクトリを作成する
os.makedirs(base_dir)
with open(os.path.join(base_dir,file_name), "w", encoding="utf-8") as f:
f.write(code_content)
print(f"✅ コードを {file_name} に保存しました。")
except IOError as e:
print(f"❌ ファイルの保存中にエラーが発生しました: {e}")
def extract_files_from_response(ai_response):
"""
AIの応答からファイル名とコードブロックのペアをすべて抽出する関数
"""
# name **ファイル名** とコードブロックを一つのパターンでマッチ
# この正規表現は、'name **ファイル名**' から次の 'name **' または文字列の終わりまでのコードブロックをキャプチャします
pattern = re.compile(r"\*\*(.*?)\*\*\s*```(?:\w+)?\s*([\s\S]*?)```")
matches = pattern.finditer(ai_response)
files_to_save = []
for match in matches:
file_name = match.group(1).strip()
code_content = match.group(2).strip()
if file_name and code_content:
files_to_save.append({"name": file_name, "content": code_content})
return files_to_save
base_dir = input("作業dir: ")
# ループ処理の開始
while True:
user_input = input("あなた: ")
# 終了コマンド
if user_input.lower() == "exit":
break
# Groq API呼び出し
completion = client.chat.completions.create(
model="openai/gpt-oss-120b", # 利用するモデルを指定
messages=[
{
"role": "system",
"content": "コードを提示するときは、`**ファイル名**` の形式で保存ファイル名を記述し、その後にコードをMarkdownのコードブロック(```言語名 ... ```)で囲んでください。例: `**index.html**\n```html...``` この形式を厳守してください"
},
{
"role": "user",
"content": user_input
}
]
)
ai_response = completion.choices[0].message.content
print(f"AI:\n{ai_response}")
# 応答からすべてのファイルとコードを抽出
files_to_save = extract_files_from_response(ai_response)
if files_to_save:
print("\nAIが以下のファイルを提示しました。これらを保存しますか? (y/n)")
for file in files_to_save:
print(f"- {file['name']}")
if input().lower() == "y":
for file in files_to_save:
save_code_to_file(file['name'], file['content'])
print("対話を終了します。")
.env
GROQ_API_KEY=YOUR_API_KEY
Discussion