オープンインタープリターでプロンプトデータベースを作成し、アイアンマンのような開発体験をした話

## はじめに
こんにちは、今日は皆さんにとっても興味深いテクノロジー、オープンインタープリターについてお話しします。このツールを使って、プロンプトデータベースを作成しました。それだけでなく、アイアンマンのような開発体験もできたので、その楽しさを共有したいと思います。

## オープンインタープリターとは？
オープンインタープリターは、自然言語でプログラムやデータベースを操作できるツールです。

## プロンプトデータベースの仕様
- Google Chromeの拡張機能「プロンプトツクール」でプロンプトをエクスポート
- フォルダスクリプトを実行してファイルを分析し、データベースに登録
- プロンプトを分析して、タグを３つ生成
- 目的や行動を短い説明文で表現し、データベースに登録

## 開発手順
1. SQLライトのスキーマをオープンインタプリタで作成
2. ファイル情報を受け取り、Pythonプログラムで分析してデータベースに登録するソースをinterpreterに依頼
3. 「テストしてください」と指示すると、テスト用のファイルを用意し、データベースに登録
4.フォルダアクション用のアップルスクリプト生成を依頼
5.フォルダアクションにスクリプトを設定

![スクリーンショット 2023-09-14 5.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51085/8ac52d0e-6e58-55a3-d0eb-a3148ffcd6d5.png)

![スクリーンショット 2023-09-14 5.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51085/ac00f759-3f84-e28f-9d47-42159594c2c8.png)

## アイアンマン体験
このツールを使っていると、まるでアイアンマンのように「ジャービス、これを作って」と指示するだけで、必要なものが作成されます。特に、テストについては「テストしてみてください」と言うだけで、テスト用のファイルが生成され、テストが実行されました。

## まとめ
オープンインタープリターを使うと、プログラミングがより直感的で楽しいものになります。プロンプトデータベースの作成も簡単で、アイアンマンのような開発体験ができました。是非、このツールを使って、新しい開発の形を体験してみてください。

## 注意事項
デバッグしながら手作業はありますが、最初のコードを生成してくれるだけでかなり簡単に作成できます。
オープンインタープリターはAPIの課金がかなりかかります。
履歴を毎回全部送信しているためと思われます。
テストでいろんな生成をやっていると数時間で１５＄ほど行ってしまいました。
一つのアクションがおわったら起動しなおして、履歴０から始めるとよいと思います。

## 参考リンク
- [Open Interpreterを使ってデータ分析ができるかやってみる](https://dev.classmethod.jp/articles/open-interpreter-demo/)

promptDB.py
```python

import os
import sys
import sqlite3
import openai
from datetime import datetime

# Set your OpenAI API key here
openai.api_key = 'your-key'

# Check if a file path is passed as an argument
if len(sys.argv) > 1:
    file_path = sys.argv[1]
    
    # Read the content of the file
    with open(file_path, 'r') as file:
        file_content = file.read()
    
    # Use ChatGPT to analyze the file content
    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=[
            {'role': 'system', 'content': 'Prerequisite: You are a good analyst of AI prompts. No explanation or summary will be output. Lets consider it step by step. Goal: Output three tags that are important to users as analysis results. 　Process: Analyze the entire prompt included in the content and deeply understand the meaning of the written instructions. We deeply determine the purpose, meaning, and function of the tag, and extract simple tags as a result. Choose only the three tags that are most important to user value. Output the three tags as text separated by commas. One tag is either a word or a short structure (up to 100 characters) such as "to do ~", and one of each tag must be used. The tag or character string "~条件" is a fixed title and is not unique, so it will not be output. There is no need for summaries, summaries, or explanations. Tag evaluation criteria: Indicate the users purpose, indicate the nature of the function, indicate the reason for the action. Deliverables: Output only three comma-separated tags. '},
            
            {'role': 'user', 'content': file_content}
        ]
    )
    
    # Get the analysis result
    analysis_result = response.choices[0].message['content']

    prompt = \
    '前提条件:あなたはAIプロンプトの優秀な分析者です。深呼吸をしてステップバイステップで検討します。指示のない限り補足説明やまとめや指示の復唱は行いません'\
    '#ゴール：ユーザーにとって重要なこのプロンプトの説明を出力します。'\
    '#プロセス：'\
    '・最初のAIプロンプトを抽出します。'\
    '・プロンプトの全体を俯瞰して分析し書かれている指示の項目の意味を深く読み解いてください。'\
    '・実行する目的と意味と機能を深く割り出してこのプロンプトの目的、意味、機能、効果をまとめて１文で出力します。'\
    '#成果物:プロンプトの分析結果を３００文字以下で出力します'
   
   # Use ChatGPT to analyze the file content
    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=[
            {'role': 'system', 'content': prompt},
            {'role': 'user', 'content': file_content}
        ]
    )
    
    # Get the analysis result
    analysis_result2 = response.choices[0].message['content']
   
    # Connect to the SQLite database
    conn = sqlite3.connect('/Users/hayashieiichi/Desktop/prompt_database.sqlite')
    
    # Create a cursor object
    cur = conn.cursor()
    
    # Get the current date and time in ISO 8601 format
    current_date = datetime.now().isoformat()
    
    # Execute a query to insert data into the table
    cur.execute(
        'INSERT INTO prompt_table (title, tag, prompt, registration_date, update_date, memo) VALUES (?, ?, ?, ?, ?, ?);',
        (os.path.basename(file_path), analysis_result, file_content, current_date, current_date, analysis_result2)
    )
    
    # Commit the changes
    conn.commit()
    
    # Close the connection
    conn.close()
else:
    print('No file path provided.')

```

pythonRun.scpt
```AppleScript
property pythonScriptPath : "/Users/hayashieiichi/Desktop/PromptDBProject/promptDB.py"
property pythonPath : "/Users/hayashieiichi/.pyenv/shims/python "

on adding folder items to this_folder after receiving addedItems
	try
		repeat with i from 1 to number of items in addedItems
			set thisItem to item i of addedItems
			set thisItemPath to quoted form of POSIX path of thisItem
			set pythonCommand to pythonPath & pythonScriptPath & " " & thisItemPath
			do shell script pythonCommand
		end repeat
	on error error_message number error_number
		if the error_number is not -128 then
			tell application "Finder"
				activate
				display dialog error_message buttons {"Cancel"} default button 1 giving up after 120
			end tell
		end if
	end try
end adding folder items to
```

SQL Lightスキーマ
```SQL
CREATE TABLE prompt_table (
            primary_key INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT,
            tag TEXT,
            prompt TEXT,
            registration_date TEXT,
            update_date TEXT,
            memo TEXT
        )

```

![スクリーンショット 2023-09-25 15.52.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51085/f1508d31-35be-cfe5-7dba-8cbc37d02b8c.png)