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 | ✅ |
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_interpreter
nebo 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()
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()
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é
- Další informace o asistentech a interpretu kódu
- Další informace o asistentech a volání funkcí
- Ukázky rozhraní API pro asistenty Azure OpenAI