Sdílet prostřednictvím


Začínáme s pomocníky Azure OpenAI (Preview)

Asistenti Azure OpenAI (Náhled) umožňují vytvářet asistenty umělé inteligence přizpůsobené vašim potřebám prostřednictvím vlastních pokynů a jsou rozšířené o pokročilé nástroje, jako je interpret kódu a vlastní funkce. V tomto článku poskytujeme podrobný návod, jak začít s rozhraním API asistentů.

Poznámka:

  • Hledání souborů může ingestovat až 10 000 souborů na asistenta – 500krát více než dříve. Je to rychlý způsob, podporuje paralelní dotazy prostřednictvím vícevláknového vyhledávání a vylepšeného řazení a přepisování dotazů.
    • Vektorové úložiště je nový objekt v rozhraní API. Jakmile se soubor přidá do úložiště vektorů, automaticky se parsuje, zachytá a vloží a připraví k hledání. Vektorová úložiště se dají používat napříč asistenty a vlákny, což zjednodušuje správu souborů a fakturaci.
  • Přidali jsme podporu parametru tool_choice , který se dá použít k vynucení použití konkrétního nástroje (například vyhledávání souborů, interpret kódu nebo funkce) v určitém spuštění.

Podpora asistentů

Podpora oblastí a modelů

Interpret kódu je dostupný ve všech oblastech podporovaných pomocníky Azure OpenAI. Stránka modelů obsahuje nejaktuálnější informace o oblastech nebo modelech, ve kterých jsou aktuálně podporováni asistenti.

Verze rozhraní API

  • 2024-02-15-preview
  • 2024-05-01-preview

Podporované typy souborů

File format Typ MIME Interpret kódu
c. text/x-c
.Cpp text/x-c++
.csv application/csv
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html, text/html
.java text/x-java
.json application/json
.md text/markdown
.pdf aplikace/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py text/x-python
.py text/x-script.python
.rubidium text/x-ruby
.Tex text/x-tex
.txt text/plain
.Css text/css
.jpeg image/jpeg
.jpg image/jpeg
.js text/javascript
.gif image/gif
.png image/png
.dehet application/x-tar
.Ts application/typescript
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xml application/xml nebo "text/xml"
.zip aplikace/zip

Nástroje

Tip

Přidali jsme podporu parametru tool_choice , který lze použít k vynucení použití konkrétního nástroje (například file_search, code_interpreternebo a function) v určitém spuštění.

Jednotlivý asistent má přístup až k 128 nástrojům, včetně interpretu kódu a vyhledávání souborů, ale můžete také definovat vlastní nástroje prostřednictvím funkcí.

Soubory

Soubory se dají nahrát přes Studio nebo programově. Parametr file_ids je nutný k poskytnutí nástrojů, jako code_interpreter je přístup k souborům. Při použití koncového bodu pro nahrání souboru musíte mít purpose nastavené na asistenty, které se mají používat s rozhraním API asistentů.

Dětské hřiště Asistenti

V naší příručce pro rychlý start poskytujeme návod na hřiště Asistentů. Poskytuje prostředí bez kódu pro otestování možností asistentů.

Komponenty pomocníků

Součást Popis
Asistent Vlastní AI, která používá modely Azure OpenAI ve spojení s nástroji.
Vlákno Relace konverzace mezi asistentem a uživatelem Vlákna ukládají zprávy a automaticky zpracovávají zkrácení tak, aby se vešel do kontextu modelu.
Zpráva Zpráva vytvořená asistentem nebo uživatelem Zprávy můžou obsahovat text, obrázky a další soubory. Zprávy jsou uloženy jako seznam ve vlákně.
Běžet Aktivace pomocníka, který začne běžet na základě obsahu vlákna. Pomocník používá svou konfiguraci a zprávy vlákna k provádění úloh voláním modelů a nástrojů. V rámci spuštění připojí Pomocník zprávy do vlákna.
Spustit krok Podrobný seznam kroků, které pomocník provedl jako součást spuštění. Pomocník může během spuštění volat nástroje nebo vytvářet zprávy. Zkoumání kroků spuštění vám umožní pochopit, jak se pomocník dostává k posledním výsledkům.

Nastavení prvního asistenta

Vytvoření asistenta

V tomto příkladu vytvoříme asistenta, který napíše kód pro generování vizualizací pomocí funkcí code_interpreter nástroje. Následující příklady jsou určené k postupnému spuštění v prostředí, jako jsou poznámkové bloky Jupyter.

import os
import json
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

# Create an assistant
assistant = client.beta.assistants.create(
    name="Data Visualization",
    instructions=f"You are a helpful AI assistant who makes interesting visualizations based on data." 
    f"You have access to a sandboxed environment for writing and testing code."
    f"When you are asked to create a visualization you should follow these steps:"
    f"1. Write the code."
    f"2. Anytime you write new code display a preview of the code to show your work."
    f"3. Run the code to confirm that it runs."
    f"4. If the code is successful display the visualization."
    f"5. If the code is unsuccessful display the error message and try to revise the code and rerun going through the steps from above again.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview" #You must replace this value with the deployment name for your model.
)

Z výše uvedené konfigurace byste měli poznamenat několik podrobností:

  • Umožňujeme tomuto asistentovi přístup k interpretu kódu pomocí řádku tools=[{"type": "code_interpreter"}],. Díky tomu má model přístup k prostředí Pythonu s pískem, aby se spustil a spustil kód, který pomáhá formulaci odpovědí na otázku uživatele.
  • V pokynech připomínáme modelu, že může spouštět kód. Model někdy potřebuje pomoct ho nasměrovat k správnému nástroji k vyřešení daného dotazu. Pokud víte, že chcete použít určitou knihovnu k vygenerování určité odpovědi, kterou znáte, je součástí interpreta kódu, může vám pomoct poskytnout pokyny tak, že řeknete něco jako "Použít Matplotlib k tomu, abyste udělali x".
  • Vzhledem k tomu, že se jedná o Azure OpenAI, musí hodnota, pro model= kterou zadáte, odpovídat názvu nasazení.

V dalším kroku vytiskneme obsah asistenta, který jsme právě vytvořili, abychom potvrdili, že vytvoření bylo úspěšné:

print(assistant.model_dump_json(indent=2))
{
  "id": "asst_7AZSrv5I3XzjUqWS40X5UgRr",
  "created_at": 1705972454,
  "description": null,
  "file_ids": [],
  "instructions": "You are a helpful AI assistant who makes interesting visualizations based on data.You have access to a sandboxed environment for writing and testing code.When you are asked to create a visualization you should follow these steps:1. Write the code.2. Anytime you write new code display a preview of the code to show your work.3. Run the code to confirm that it runs.4. If the code is successful display the visualization.5. If the code is unsuccessful display the error message and try to revise the code and rerun going through the steps from above again.",
  "metadata": {},
  "model": "gpt-4-1106-preview",
  "name": "Data Visualization",
  "object": "assistant",
  "tools": [
    {
      "type": "code_interpreter"
    }
  ]
}

Vytvoření vlákna

Teď vytvoříme vlákno.

# Create a thread
thread = client.beta.threads.create()
print(thread)
Thread(id='thread_6bunpoBRZwNhovwzYo7fhNVd', created_at=1705972465, metadata={}, object='thread')

Vlákno je v podstatě záznam relace konverzace mezi asistentem a uživatelem. Podobá se poli nebo seznamu zpráv v typickém volání rozhraní API pro dokončování chatu. Jedním z klíčových rozdílů je na rozdíl od pole zpráv o dokončení chatu, nemusíte při každém volání sledovat tokeny, abyste měli jistotu, že zůstanete pod délkou kontextu modelu. Vlákna abstrahují tyto podrobnosti o správě a podle potřeby komprimují historii vláken, aby konverzace mohla pokračovat. Při použití nejnovějších modelů, které mají větší kontextové délky a podporu nejnovějších funkcí, se zvyšuje schopnost vláken toho dosáhnout s většími konverzacemi.

Dále vytvořte první otázku uživatele, která se má přidat do vlákna.

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Create a visualization of a sinewave"
)

Výpis zpráv vláken

thread_messages = client.beta.threads.messages.list(thread.id)
print(thread_messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705972476,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_6bunpoBRZwNhovwzYo7fhNVd"
    }
  ],
  "object": "list",
  "first_id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
  "last_id": "msg_JnkmWPo805Ft8NQ0gZF6vA2W",
  "has_more": false
}

Spuštění vlákna

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
  #instructions="New instructions" #You can optionally provide new instructions but these will override the default instructions
)

Mohli bychom zde také předat instructions parametr, ale přepíše se stávající pokyny, které jsme už pro asistenta poskytli.

Načtení stavu vlákna

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status
print(status)
completed

V závislosti na složitosti dotazu, který spouštíte, může spuštění vlákna trvat déle. V takovém případě můžete vytvořit smyčku pro monitorování stavu spuštění vlákna pomocí kódu jako v následujícím příkladu:

import time
from IPython.display import clear_output

start_time = time.time()

status = run.status

while status not in ["completed", "cancelled", "expired", "failed"]:
    time.sleep(5)
    run = client.beta.threads.runs.retrieve(thread_id=thread.id,run_id=run.id)
    print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))
    status = run.status
    print(f'Status: {status}')
    clear_output(wait=True)

messages = client.beta.threads.messages.list(
  thread_id=thread.id
) 

print(f'Status: {status}')
print("Elapsed time: {} minutes {} seconds".format(int((time.time() - start_time) // 60), int((time.time() - start_time) % 60)))
print(messages.model_dump_json(indent=2))

Pokud je in_progress spuštění nebo v jiných netermiálních stavech, vlákno je uzamčeno. Pokud je vlákno uzamčeno, nelze přidat nové zprávy a nelze vytvořit nová spuštění.

Zobrazení seznamu zpráv vlákna po spuštění

Jakmile stav spuštění značí úspěšné dokončení, můžete znovu vypsat obsah vlákna a načíst odpověď modelu a všech nástrojů:

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

Načtení ID souboru

Požádali jsme, aby model vygeneroval obrázek sinusové vlny. Aby bylo možné image stáhnout, musíme nejprve načíst ID souboru obrázků.

data = json.loads(messages.model_dump_json(indent=2))  # Load JSON data into a Python object
image_file_id = data['data'][0]['content'][0]['image_file']['file_id']

print(image_file_id)  # Outputs: assistant-1YGVTvNzc2JXajI5JU9F0HMD

Stažení image

content = client.files.content(image_file_id)

image= content.write_to_file("sinewave.png")

Po stažení otevřete image místně:

from PIL import Image

# Display the image in the default image viewer
image = Image.open("sinewave.png")
image.show()

Snímek obrazovky s vygenerovanou vlnou sinusového interpreta kódu

Položte následnou otázku ve vlákně.

Vzhledem k tomu, že asistent nesplní naše pokyny a zahrne kód, který se spustil v textové části odpovědi, explicitně požádá o tyto informace.

# Add a new user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="Show me the code you used to generate the sinewave"
)

Znovu budeme muset spustit a načíst stav vlákna:

run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
  #instructions="New instructions" #You can optionally provide new instructions  but these will override the default instructions
)

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status
print(status)

completed

Jakmile se stav spuštění dokončí, znovu vypíšeme zprávy ve vlákně, které by teď měly obsahovat odpověď na naši nejnovější otázku.

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Certainly, here is the code I used to generate the sine wave visualization:\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Generating data for the sinewave\nx = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi\ny = np.sin(x)  # Compute the sine of these values\n\n# Plotting the sine wave\nplt.plot(x, y)\nplt.title('Sine Wave')\nplt.xlabel('x')\nplt.ylabel('sin(x)')\nplt.grid(True)\nplt.show()\n```\n\nThis code snippet uses `numpy` to generate an array of x values and then computes the sine for each x value. It then uses `matplotlib` to plot these values and display the resulting graph."
          },
          "type": "text"
        }
      ],
      "created_at": 1705969710,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_oDS3fH7NorCUVwROTZejKcZN",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_moYE3aNwFYuRq2aXpxpt2Wb0",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Show me the code you used to generate the sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705969678,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

Extrahování pouze odpovědi na naši nejnovější otázku:

data = json.loads(messages.model_dump_json(indent=2))
code = data['data'][0]['content'][0]['text']['value']
print(code)

Jistě, tady je kód, který jsem použil k vygenerování sinusové vizualizace:

import numpy as np
import matplotlib.pyplot as plt

# Generating data for the sinewave
x = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi
y = np.sin(x)  # Compute the sine of these values

# Plotting the sine wave
plt.plot(x, y)
plt.title('Sine Wave')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()

Tmavý režim

Pojďme do vlákna přidat poslední otázku, abychom zjistili, jestli interpret kódu může prohodit graf do tmavého režimu.

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
)

# Run the thread
run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status
print(status)
completed
messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

print(messages.model_dump_json(indent=2))
{
  "data": [
    {
      "id": "msg_KKzOHCArWGvGpuPo0pVZTHgV",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "You're viewing the dark mode version of the sine wave visualization in the image above. The plot is set against a dark background with a cyan colored sine wave for better contrast and visibility. If there's anything else you'd like to adjust or any other assistance you need, feel free to let me know!"
          },
          "type": "text"
        }
      ],
      "created_at": 1705971199,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_izZFyTVB1AlFM1VVMItggRn4",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_30pXFVYNgP38qNEMS4Zbozfk",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971194,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_3j31M0PaJLqO612HLKVsRhlw",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-kfqzMAKN1KivQXaEJuU0u9YS"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the dark mode version of the sine wave visualization. I've used the 'dark_background' style in Matplotlib and chosen a cyan color for the plot line to ensure it stands out against the dark background."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971123,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_B91erEPWro4bZIfryQeIDDlx",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_FgDZhBvvM1CLTTFXwgeJLdua",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I prefer visualizations in darkmode can you change the colors to make a darkmode version of this visualization."
          },
          "type": "text"
        }
      ],
      "created_at": 1705971052,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oaF1PUeozAvj3KrNnbKSy4LQ",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Certainly, here is the code I used to generate the sine wave visualization:\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Generating data for the sinewave\nx = np.linspace(0, 4 * np.pi, 1000)  # Generate values from 0 to 4*pi\ny = np.sin(x)  # Compute the sine of these values\n\n# Plotting the sine wave\nplt.plot(x, y)\nplt.title('Sine Wave')\nplt.xlabel('x')\nplt.ylabel('sin(x)')\nplt.grid(True)\nplt.show()\n```\n\nThis code snippet uses `numpy` to generate an array of x values and then computes the sine for each x value. It then uses `matplotlib` to plot these values and display the resulting graph."
          },
          "type": "text"
        }
      ],
      "created_at": 1705969710,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_oDS3fH7NorCUVwROTZejKcZN",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_moYE3aNwFYuRq2aXpxpt2Wb0",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Show me the code you used to generate the sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705969678,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_M5pz73YFsJPNBbWvtVs5ZY3U",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Is there anything else you would like to visualize or any additional features you'd like to add to the sine wave plot?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705967782,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_AGQHJrrfV3eM0eI9T3arKgYY",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_oJbUanImBRpRran5HSa4Duy4",
      "assistant_id": "asst_eHwhP4Xnad0bZdJrjHO2hfB4",
      "content": [
        {
          "image_file": {
            "file_id": "assistant-1YGVTvNzc2JXajI5JU9F0HMD"
          },
          "type": "image_file"
        },
        {
          "text": {
            "annotations": [],
            "value": "Here is the visualization of a sine wave: \n\nThe wave is plotted using values from 0 to \\( 4\\pi \\) on the x-axis, and the corresponding sine values on the y-axis. I've also added grid lines for easier reading of the plot."
          },
          "type": "text"
        }
      ],
      "created_at": 1705967044,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_8PsweDFn6gftUd91H87K0Yts",
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    },
    {
      "id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "Create a visualization of a sinewave"
          },
          "type": "text"
        }
      ],
      "created_at": 1705966634,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_ow1Yv29ptyVtv7ixbiKZRrHd"
    }
  ],
  "object": "list",
  "first_id": "msg_KKzOHCArWGvGpuPo0pVZTHgV",
  "last_id": "msg_Pu3eHjM10XIBkwqh7IhnKKdG",
  "has_more": false
}

Extrahujte nové ID souboru obrázku a stáhněte a zobrazte obrázek:

data = json.loads(messages.model_dump_json(indent=2))  # Load JSON data into a Python object
image_file_id = data['data'][0]['content'][0]['image_file']['file_id'] # index numbers can vary if you have had a different conversation over the course of the thread.

print(image_file_id)

content = client.files.content(image_file_id)
image= content.write_to_file("dark_sine.png")

# Display the image in the default image viewer
image = Image.open("dark_sine.png")
image.show()

Snímek obrazovky s interpretem kódu vygenerovanou vlnou sinus v tmavém režimu

Další referenční informace

Spuštění definic stavu

Stav Definition
queued Při prvním vytvoření spuštění nebo po dokončení required_action se přesunou do stavu ve frontě. Měli by téměř okamžitě přejít na in_progress.
in_progress Zatímco in_progress, Pomocník k provádění kroků používá model a nástroje. Průběh spuštění můžete zobrazit prozkoumáním kroků spuštění.
completed Spuštění bylo úspěšně dokončeno. Teď můžete zobrazit všechny zprávy, které asistent přidal do vlákna, a všechny kroky, které spuštění provedlo. Konverzaci můžete pokračovat také přidáním dalších uživatelských zpráv do vlákna a vytvořením dalšího spuštění.
requires_action Při použití volajícího nástroje funkce se spuštění přesune do required_action stavu, jakmile model určí názvy a argumenty funkcí, které se mají volat. Tyto funkce pak musíte spustit a odeslat výstupy před zahájením. Pokud se výstupy nezadají před vypršením časového razítka expires_at (přibližně 10 minut po vytvoření), spuštění se přesune na stav, jehož platnost vypršela.
expired K tomu dochází v případě, že se výstupy volání funkce neodeslaly před expires_at a platnost spuštění vyprší. Kromě toho platí, že pokud spuštění trvá příliš dlouho a překročí dobu uvedenou v expires_at, platnost spuštění vyprší.
cancelling Můžete se pokusit zrušit in_progress spuštění pomocí koncového bodu Zrušit spuštění. Jakmile bude pokus o zrušení úspěšný, stav spuštění se zruší. Zrušení se pokouší, ale není zaručeno.
cancelled Spuštění bylo úspěšně zrušeno.
failed Příčinu selhání můžete zobrazit tak, že se podíváte na last_error objekt ve spuštění. Časové razítko selhání se zaznamená v failed_at.

Poznámky ke zprávám

Poznámky ke zprávám pomocníka se liší od poznámek filtrování obsahu, které jsou k dispozici při dokončování a odpovědích rozhraní API pro dokončování chatu. Poznámky asistenta mohou nastat v rámci pole obsahu objektu. Poznámky obsahují informace o tom, jak byste měli text v odpovědích uživateli přidávat poznámkami.

Když jsou poznámky v poli obsahu Zpráva, uvidíte v textu, který potřebujete nahradit správnými poznámkami, nečitelné podřetětězené modelem vygenerovanými modelem. Tyto řetězce můžou vypadat nějak takto 【13†source】 nebo sandbox:/mnt/data/file.csv. Tady je fragment kódu Pythonu z OpenAI, který nahrazuje tyto řetězce informacemi v poznámkách.


from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-05-01-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

# Retrieve the message object
message = client.beta.threads.messages.retrieve(
  thread_id="...",
  message_id="..."
)

# Extract the message content
message_content = message.content[0].text
annotations = message_content.annotations
citations = []

# Iterate over the annotations and add footnotes
for index, annotation in enumerate(annotations):
    # Replace the text with a footnote
    message_content.value = message_content.value.replace(annotation.text, f' [{index}]')

    # Gather citations based on annotation attributes
    if (file_citation := getattr(annotation, 'file_citation', None)):
        cited_file = client.files.retrieve(file_citation.file_id)
        citations.append(f'[{index}] {file_citation.quote} from {cited_file.filename}')
    elif (file_path := getattr(annotation, 'file_path', None)):
        cited_file = client.files.retrieve(file_path.file_id)
        citations.append(f'[{index}] Click <here> to download {cited_file.filename}')
        # Note: File download functionality not implemented above for brevity

# Add footnotes to the end of the message before displaying to user
message_content.value += '\n' + '\n'.join(citations)

Poznámka ke zprávě Popis
file_citation Citace souborů jsou vytvořeny nástrojem pro načítání a definují odkazy na konkrétní citaci v konkrétním souboru, který nahrál a použil Pomocník k vygenerování odpovědi.
file_path Poznámky k cestě k souboru jsou vytvořeny nástrojem code_interpreter a obsahují odkazy na soubory vygenerované nástrojem.

Viz také