😺

ファイル書き込みのみの簡易エージェント

に公開

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