Error occured while calling OpenAI API: 'ChatCompletion' object is not subscriptable

# ottieni tag title da gpt
#################################

#import openai
from dotenv import load_dotenv
import os
load_dotenv()  # Carica le variabili d'ambiente dal file .env

from openai import OpenAI
client = OpenAI(api_key=os.environ['openai.api_key'])

# setup richiesta gtp
merged_df8b = merged_df8.copy()

# creo dizionario delle risposte di gpt per evitare chiamate doppie
gpt_responses = {}
# Inizializza un contatore per il numero totale di token
total_tokens_used = 0
# Inizializza un contatore per le chiamate API effettive
actual_api_calls = 0

def improve_tag_title(row, gpt_responses):
    global total_tokens_used  , actual_api_calls      
    top_5_queries = row['top_5_queries']

    # Ottieni il tag title e l'URL dalla riga corrente
    tag_title = row["tag title"]
    page_url = row["page"]

    # Controllo se tag_title è presente e non vuoto
    if not tag_title:
        return None

    # Controllo per saltare la chiamata GPT quando comparison è 'greater' o check è 'Ok'
    #if row["comparison"] == "greater" or "Missing" not in row["check"]:
    #    #return row["tag title"]
    #    return None

    # Verifica se l'URL è già stato processato
    if page_url in gpt_responses:
        return gpt_responses[page_url]  # Usa il tag title migliorato se disponibile

    prompt = (      
        f"Sto cercando di migliorare il tag title per una pagina web. Il tag title attuale è: {tag_title}.\n"
        f"Le parole chiave più importanti e pertinenti alla pagina sono: {top_5_queries}.\n"
        f"Crea un nuovo tag title in {language} che incorpori queste parole chiave in modo naturale e coinvolgente. Il tag title dovrebbe:\n"
        f"1) avere al massimo 65 caratteri, spazi inclusi. Assicurati che la tua risposta non superi questo limite.\n"
        f"2) non includere il nome del brand.\n"
        f"3) non utilizzare lettere maiuscole inutili, simboli, apici o virgolette.\n"
        f"4) essere presentato da solo, senza alcuna spiegazione o contenuto aggiuntivo.\n"
        f"Per favore, segui scrupolosamente tutte queste regole nella tua risposta. Se non sei sicuro, conferma che hai seguito tutte le regole nel tuo messaggio."
    )

    try:
        # Modifica la struttura dell'input per utilizzare il formato chat
        #response = openai.ChatCompletion.create(
        #response = client.completions.create(
        #response = openai.chat.completions.create(
        response = client.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "system", "content": "Comportati come se fossi un SEO copywriter professionista."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=1000,
            temperature=0.4,
            top_p=1,
            frequency_penalty=0.1,
            presence_penalty=0.1
        )
        # Aggiungi il numero di token utilizzati per questa risposta al totale
        total_tokens_used += response['usage']['total_tokens'] 
        actual_api_calls += 1  # Incrementa il contatore per le chiamate API effettive

    # eccezioni errori gpt
    except Exception as e:
        print(f"Error occured while calling OpenAI API: {e}")
        return None

    #improved_tag_title = response.model_dump(exclude_unset=True)
    #improved_tag_title = response.choices[0].message.content.strip().lower()
    improved_tag_title = response.choices[0].message.content
    #improved_tag_title = response.choices[0].message['content'].strip().lower()
    
    #gpt_responses[tag_title] = improved_tag_title
    # modifica per usare come chiave di confronto l'URL
    gpt_responses[page_url] = improved_tag_title
    # SLEEP
    time.sleep(1)
    return improved_tag_title


# chiamate API gpt
# Dopo la definizione della funzione, esegui il loop per migliorare i tag title
merged_df8b.reset_index(drop=True, inplace=True)
processed_rows = 0

for index, row in merged_df8b.iterrows():
    # Passa la riga corrente e il dizionario delle risposte a improve_tag_title
    new_tag_title = improve_tag_title(row, gpt_responses)

    # Assegna il nuovo tag title alla riga corrente
    merged_df8b.at[index, "new tag title"] = new_tag_title
    # Aggiorna il dizionario gpt_responses con la risposta ricevuta
    gpt_responses[row["page"]] = new_tag_title
    # Stampa il progresso
    processed_rows += 1  # Incrementa il contatore di righe processate
    print(f"\rProcessed row {processed_rows}/{len(merged_df8b)} | {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | {total_tokens_used} tokens.", end="", flush=True)

# Aggiungi qui il nuovo blocco di codice per assicurarti di aggiornare tutte le righe
for index, row in merged_df8b.iterrows():
    page_url = row["page"]
    if page_url in gpt_responses:
        merged_df8b.at[index, "new tag title"] = gpt_responses[page_url]

# Stampa il totale dei token utilizzati
print(f"\nTotal tokens used: {total_tokens_used}")
print(f"Actual API calls made: {actual_api_calls}")

# https://platform.openai.com/account/usage

error:
Error occured while calling OpenAI API: ‘ChatCompletion’ object is not subscriptable

Can’t figure out the solution. Thanks for any help.

It looks like you are using new OpenAI library with old code. New library outputs a ChatCompletion object rather than a dictionary. If you don’t want to change your code significantly, you can do:
response = json.loads(response.model_dump_json())
right after this block:
response = client.chat.completions.create(

3 Likes