привет перемести промпт от сюда в файл txt import openai
import base64
import requests
import os
import csv
import re
from configparser import ConfigParser
from concurrent.futures import ThreadPoolExecutor, as_completed

# Function to encode the image
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

# Function to process the image and extract text using OpenAI Vision API
def extract_and_process_image(image_path, api_key):
    try:
        # Encode the image to base64
        base64_image = encode_image(image_path)

        # Prepare the headers and payload for the API request
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {api_key}"
        }

        prompt = """Извлеките ФИО, дату рождения и дату смерти из следующего изображения. Замените любые отсутствующие символы знаком '-'. Даты должны быть в формате арабских цифр с полным указанием дня, месяца и года (день.месяц.год).

        Особые указания:
        - Если год указан двумя цифрами, используйте здравый смысл для определения полного года (например, '12' преобразуйте в '2012', а '59' в '1959').
        - Всегда приводите даты к формату с четырьмя цифрами года.
        - Обеспечьте единообразие формата дат: день и месяц должны содержать ведущий ноль, если необходимо (например, '09.05.1968').

        Форматируйте вывод в следующем виде в JSON:
        [
            {
                "фамилия": "<фамилия>",
                "имя": "<имя>",
                "отчество": "<отчество>",
                "дата рождения": "<дата рождения>",
                "дата смерти": "<дата смерти>",
                "статус": "<статус>"
            },
            ...
        ]

        Инструкции по заполнению полей и статусу:
        - Если ФИО не полное или содержит '-', установите Статус 'Обработка'.
        - Если даты содержат '-', установите Статус 'Обработка даты'.
        - Если и ФИО, и даты полные, установите Статус 'Готово'.
        - Если на изображении отсутствуют любые надписи или данные, выведите JSON с полями ФИО и датами, заполненными '-', и установите Статус 'Нет данных'.
        - Если ты сомневаешься в правильности написания данных, не придумывай от себя ничего, просто пиши '-', прочерк вместо данных на поле.
        """
        
        payload = {
            "model": "gpt-4o",
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"type": "text", "text": prompt},
                        {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}", "detail": "high"}}
                    ]
                }
            ],
            "max_tokens": 300,
            "response_format": { 
                "type": "json_object"
            }
        }

        response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)
                
        response_json = response.json()

        if response.status_code != 200:
            print(f"Error: {response_json}")
            return None

        return response_json['choices'][0]['message']['content']

    except Exception as e:
        print(f"Error processing image: {e}")
        return None

# Function to manually parse the extracted text
def parse_extracted_text(text):
    objects_pattern = re.compile(r'\{\s*([^}]+)\s*\}')
    key_value_pattern = re.compile(r'\"([^\"]+)\": \"([^\"]*)\"')
    
    objects = objects_pattern.findall(text)
    parsed_results = []
    
    for obj in objects:
        parsed_data = {}
        for match in key_value_pattern.finditer(obj):
            key = match.group(1).lower()
            value = match.group(2)
            parsed_data[key] = value
        
        parsed_results.append(parsed_data)
    
    return parsed_results

# Function to handle image processing and CSV writing
def process_image_and_write_to_csv(filename, api_key, csv_writer):
    image_path = os.path.join(os.getcwd(), 'photos', filename)
    result = extract_and_process_image(image_path, api_key)
    if result:
        print(f"Result for {filename}:\n{result}\n")
        cleaned_result = result.strip('```json').strip('```').strip()
        parsed_results = parse_extracted_text(cleaned_result)
        
        for parsed_data in parsed_results:
            # Ensure all keys are present in the parsed data
            last_name = parsed_data.get('фамилия', '-')
            first_name = parsed_data.get('имя', '-')
            middle_name = parsed_data.get('отчество', '-')
            birth_date = parsed_data.get('дата рождения', '-')
            death_date = parsed_data.get('дата смерти', '-')
            status = parsed_data.get('статус', 'Обработка')

            csv_writer.writerow([filename, last_name, first_name, middle_name, birth_date, death_date, status])
    else:
        print(f"Error processing image: {filename}")

# Main function to run the program
def main():
    directory_path = os.path.join(os.getcwd(), 'photos')
    
    # Load API key from config
    config = ConfigParser()
    config.read('config.ini')
    api_key = config.get('openai', 'api_key')
    
    # Open the results file in append mode
    with open('results.csv', 'a', newline='', encoding='utf-8') as results_file:
        writer = csv.writer(results_file)
        
        # Write the header if the file is empty
        if os.stat('results.csv').st_size == 0:
            writer.writerow(['Filename', 'Фамилия', 'Имя', 'Отчество', 'Дата рождения', 'Дата смерти', 'Статус'])

        # List of image files
        image_files = [f for f in os.listdir(directory_path) if f.lower().endswith(('.png', '.jpg', '.jpeg'))]

        # Process images using ThreadPoolExecutor for multithreading
        with ThreadPoolExecutor(max_workers=5) as executor:
            futures = [executor.submit(process_image_and_write_to_csv, filename, api_key, writer) for filename in image_files]
            for future in as_completed(futures):
                future.result()

# Run the main function
if __name__ == "__main__":
    main()
 и еще сделай чтобы у меня на каждом выполненной картинке также выводилось сколько токенов потрачено сколько входящий исходиящих и общих и сколько по деньгам это вышло и общие по всем фоткам тоже самое сделай