Perpustakaan C# .NET Client yang sederhana untuk OpenAi untuk menggunakan API RESTful mereka. Dikembangkan secara independen, ini bukan perpustakaan resmi dan saya tidak berafiliasi dengan openai. Diperlukan akun API OpenAI.
Awalnya bercabang dari openai-api-dotnet. Lebih banyak konteks di blog Roger Pincombe.
Instal Paket OpenAI-DotNet dari Nuget. Begini cara melalui baris perintah:
PowerShell:
Install-Package OpenAI-DotNet
dotnet:
dotnet add package OpenAI-DotNet
Ingin menggunakan OpenAI-Dotnet di Unity Game Engine? Lihat paket Unity kami di OpenUpm:
Lihat dokumen API baru kami!
https://rageagainstthepixel.github.io/openai-dotnet
Ada 3 cara untuk memberikan kunci API Anda, dalam urutan prioritas:
Peringatan
Kami merekomendasikan menggunakan variabel lingkungan untuk memuat kunci API alih -alih memiliki kode keras di sumber Anda. Tidak disarankan menggunakan metode ini dalam produksi, tetapi hanya untuk menerima kredensial pengguna, pengujian lokal dan skenario start cepat.
Peringatan
Kami merekomendasikan menggunakan variabel lingkungan untuk memuat kunci API alih -alih memiliki kode keras di sumber Anda. Tidak disarankan menggunakan metode ini dalam produksi, tetapi hanya untuk menerima kredensial pengguna, pengujian lokal dan skenario start cepat.
using var api = new OpenAIClient ( " sk-apiKey " ) ; Atau membuat objek OpenAIAuthentication secara manual
using var api = new OpenAIClient ( new OpenAIAuthentication ( " sk-apiKey " , " org-yourOrganizationId " , " proj_yourProjectId " ) ) ; Upaya memuat tombol API dari file konfigurasi, secara default .openai di direktori saat ini, secara opsional melintasi pohon direktori atau di direktori home pengguna.
Untuk membuat file konfigurasi, buat file teks baru bernama .openai dan berisi baris:
Catatan
Entri Organisasi dan ID Proyek adalah opsional.
{
"apiKey" : " sk-aaaabbbbbccccddddd " ,
"organizationId" : " org-yourOrganizationId " ,
"projectId" : " proj_yourProjectId "
}OPENAI_API_KEY=sk-aaaabbbbbccccddddd
OPENAI_ORGANIZATION_ID=org-yourOrganizationId
OPENAI_PROJECT_ID=proj_yourProjectId Anda juga dapat memuat file konfigurasi secara langsung dengan jalur yang diketahui dengan memanggil metode statis di OpenAIAuthentication :
.openai default di direktori yang ditentukan: using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromDirectory ( " path/to/your/directory " ) ) ;.openai selama itu sesuai dengan format JSON: using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromPath ( " path/to/your/file.json " ) ) ; Gunakan variabel lingkungan sistem Anda Tentukan kunci API dan organisasi untuk digunakan.
OPENAI_API_KEY untuk kunci API Anda.OPENAI_ORGANIZATION_ID untuk menentukan suatu organisasi.OPENAI_PROJECT_ID untuk menentukan proyek. using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromEnv ( ) ) ; OpenAIClient mengimplementasikan IDisposable untuk mengelola siklus hidup sumber daya yang digunakannya, termasuk HttpClient . Saat Anda menginisialisasi OpenAIClient , itu akan membuat instance HttpClient internal jika tidak disediakan. HttpClient internal ini dibuang ketika OpenAIClient dibuang. Jika Anda memberikan instance HttpClient eksternal ke OpenAIClient , Anda bertanggung jawab untuk mengelola pembuangannya.
OpenAIClient menciptakan HttpClient sendiri, ia juga akan mengurusnya saat Anda membuang OpenAIClient .HttpClient eksternal diteruskan ke OpenAIClient , itu tidak akan dibuang oleh OpenAIClient . Anda harus mengelola pelepasan HttpClient sendiri. Harap pastikan untuk membuang OpenAIClient dengan tepat untuk melepaskan sumber daya tepat waktu dan untuk mencegah potensi memori atau sumber daya dalam aplikasi Anda.
Penggunaan khas dengan HttpClient internal:
using var api = new OpenAIClient ( ) ; HttpClient khusus (yang harus Anda buang dari diri sendiri):
using var customHttpClient = new HttpClient ( ) ;
// set custom http client properties here
var api = new OpenAIClient ( client : customHttpClient ) ;Anda juga dapat memilih untuk menggunakan penyebaran OpenAI Azure Microsoft juga.
Anda dapat menemukan informasi yang diperlukan di Azure Playground dengan mengklik tombol View Code dan melihat URL seperti ini:
https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}your-resource-name nama sumber daya Openai Azure Anda.deployment-id Nama penyebaran yang Anda pilih saat Anda menggunakan model.api-version Versi API untuk digunakan untuk operasi ini. Ini mengikuti format YYYY-MM-DD. Untuk menyiapkan klien untuk menggunakan penyebaran Anda, Anda harus masuk ke OpenAIClientSettings ke dalam konstruktor klien.
var auth = new OpenAIAuthentication ( " sk-apiKey " ) ;
var settings = new OpenAIClientSettings ( resourceName : " your-resource-name " , deploymentId : " deployment-id " , apiVersion : " api-version " ) ;
using var api = new OpenAIClient ( auth , settings ) ; Otentikasi dengan MSAL seperti biasa dan dapatkan Token Access, lalu gunakan token akses saat membuat OpenAIAuthentication Anda. Kemudian pastikan untuk mengatur UseazureactiveCtore ke true saat membuat OpenAIClientSettings Anda.
Tutorial: Aplikasi Desktop Yang Menelepon Web API: Memperoleh token
// get your access token using any of the MSAL methods
var accessToken = result . AccessToken ;
var auth = new OpenAIAuthentication ( accessToken ) ;
var settings = new OpenAIClientSettings ( resourceName : " your-resource " , deploymentId : " deployment-id " , apiVersion : " api-version " , useActiveDirectoryAuthentication : true ) ;
using var api = new OpenAIClient ( auth , settings ) ;Menggunakan paket OpenAI-Dotnet atau Com.openai.unity langsung di aplikasi front-end Anda dapat mengekspos kunci API Anda dan informasi sensitif lainnya. Untuk mengurangi risiko ini, disarankan untuk mengatur API menengah yang membuat permintaan untuk OpenAi atas nama aplikasi front-end Anda. Perpustakaan ini dapat digunakan untuk konfigurasi host front-end dan perantara, memastikan komunikasi yang aman dengan API OpenAI.
Di ujung depan, Anda harus mengotentikasi pengguna Anda dengan aman menggunakan penyedia OAuth pilihan Anda. Setelah pengguna diautentikasi, bertukar token auth khusus Anda dengan kunci API Anda di backend.
Ikuti langkah -langkah ini:
OpenAIAuthentication baru dan lulus dalam token khusus dengan awalan sess- .OpenAIClientSettings baru dan tentukan domain di mana API menengah Anda berada.auth dan settings baru Anda ke OpenAIClient Constructor saat Anda membuat instance klien.Berikut adalah contoh cara mengatur ujung depan:
var authToken = await LoginAsync ( ) ;
var auth = new OpenAIAuthentication ( $" sess- { authToken } " ) ;
var settings = new OpenAIClientSettings ( domain : " api.your-custom-domain.com " ) ;
using var api = new OpenAIClient ( auth , settings ) ;Pengaturan ini memungkinkan aplikasi ujung depan Anda untuk berkomunikasi dengan aman dengan backend Anda yang akan menggunakan openai-dotnet-proxy, yang kemudian meneruskan permintaan ke API OpenAI. Ini memastikan bahwa kunci API openai Anda dan informasi sensitif lainnya tetap aman selama proses.
Dalam contoh ini, kami mendemonstrasikan cara mengatur dan menggunakan OpenAIProxy dalam aplikasi web Core ASP.NET baru. Server proxy akan menangani otentikasi dan meneruskan permintaan ke API OpenAI, memastikan bahwa kunci API Anda dan informasi sensitif lainnya tetap aman.
Install-Package OpenAI-DotNet-Proxydotnet add package OpenAI-DotNet-Proxy<PackageReference Include="OpenAI-DotNet-Proxy" />AbstractAuthenticationFilter dan override metode ValidateAuthentication . Ini akan mengimplementasikan IAuthenticationFilter yang akan Anda gunakan untuk memeriksa token sesi pengguna terhadap server internal Anda.Program.cs , buat aplikasi web proxy baru dengan memanggil metode OpenAIProxy.CreateWebApplication , meneruskan AuthenticationFilter khusus Anda sebagai argumen tipe.OpenAIAuthentication dan OpenAIClientSettings seperti biasanya dengan tombol API Anda, ID Org, atau Azure. public partial class Program
{
private class AuthenticationFilter : AbstractAuthenticationFilter
{
public override async Task ValidateAuthenticationAsync ( IHeaderDictionary request )
{
await Task . CompletedTask ; // remote resource call to verify token
// You will need to implement your own class to properly test
// custom issued tokens you've setup for your end users.
if ( ! request . Authorization . ToString ( ) . Contains ( TestUserToken ) )
{
throw new AuthenticationException ( " User is not authorized " ) ;
}
}
}
public static void Main ( string [ ] args )
{
var auth = OpenAIAuthentication . LoadFromEnv ( ) ;
var settings = new OpenAIClientSettings ( /* your custom settings if using Azure OpenAI */ ) ;
using var openAIClient = new OpenAIClient ( auth , settings ) ;
OpenAIProxy . CreateWebApplication < AuthenticationFilter > ( args , openAIClient ) . Run ( ) ;
}
}Setelah Anda mengatur server proxy Anda, pengguna akhir Anda sekarang dapat membuat permintaan yang diautentikasi ke API proxy Anda alih -alih langsung ke API OpenAI. Server proxy akan menangani otentikasi dan meneruskan permintaan ke API OpenAI, memastikan bahwa kunci API Anda dan informasi sensitif lainnya tetap aman.
Daftar dan jelaskan berbagai model yang tersedia di API. Anda dapat merujuk pada dokumentasi model untuk memahami model apa yang tersedia dan perbedaan di antara mereka.
Juga checkout model titik akhir kompatibilitas untuk memahami model mana yang bekerja dengan titik akhir mana.
Untuk menentukan model khusus yang tidak ditentukan sebelumnya di perpustakaan ini:
var model = new Model ( " model-id " ) ; API Model diakses melalui OpenAIClient.ModelsEndpoint
Daftar model yang tersedia saat ini, dan memberikan informasi dasar tentang masing -masing seperti pemilik dan ketersediaan.
using var api = new OpenAIClient ( ) ;
var models = await api . ModelsEndpoint . GetModelsAsync ( ) ;
foreach ( var model in models )
{
Console . WriteLine ( model . ToString ( ) ) ;
} Mengambil contoh model, memberikan informasi dasar tentang model seperti pemilik dan izin.
using var api = new OpenAIClient ( ) ;
var model = await api . ModelsEndpoint . GetModelDetailsAsync ( " gpt-4o " ) ;
Console . WriteLine ( model . ToString ( ) ) ; Hapus model yang disesuaikan. Anda harus memiliki peran pemilik dalam organisasi Anda.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . ModelsEndpoint . DeleteFineTuneModelAsync ( " your-fine-tuned-model " ) ;
Assert . IsTrue ( isDeleted ) ;Peringatan
Fitur Beta. API tunduk pada perubahan yang melanggar.
API realtime memungkinkan Anda untuk membangun pengalaman percakapan multi-modal yang rendah dan multi-modal. Saat ini mendukung teks dan audio sebagai input dan output, serta panggilan fungsi.
API Asisten diakses melalui OpenAIClient.RealtimeEndpoint
Berikut adalah contoh sederhana tentang cara membuat sesi realtime dan untuk mengirim dan menerima pesan dari model.
using var api = new OpenAIClient ( ) ;
var cancellationTokenSource = new CancellationTokenSource ( ) ;
var tools = new List < Tool >
{
Tool . FromFunc ( " goodbye " , ( ) =>
{
cancellationTokenSource . Cancel ( ) ;
return " Goodbye! " ;
} )
} ;
var options = new Options ( Model . GPT4oRealtime , tools : tools ) ;
using var session = await api . RealtimeEndpoint . CreateSessionAsync ( options ) ;
var responseTask = session . ReceiveUpdatesAsync < IServerEvent > ( ServerEvents , cancellationTokenSource . Token ) ;
await session . SendAsync ( new ConversationItemCreateRequest ( " Hello! " ) ) ;
await session . SendAsync ( new CreateResponseRequest ( ) ) ;
await session . SendAsync ( new InputAudioBufferAppendRequest ( new ReadOnlyMemory < byte > ( new byte [ 1024 * 4 ] ) ) , cancellationTokenSource . Token ) ;
await session . SendAsync ( new ConversationItemCreateRequest ( " GoodBye! " ) ) ;
await session . SendAsync ( new CreateResponseRequest ( ) ) ;
await responseTask ;
void ServerEvents ( IServerEvent @event )
{
switch ( @event )
{
case ResponseAudioTranscriptResponse transcriptResponse :
Console . WriteLine ( transcriptResponse . ToString ( ) ) ;
break ;
case ResponseFunctionCallArgumentsResponse functionCallResponse :
if ( functionCallResponse . IsDone )
{
ToolCall toolCall = functionCallResponse ;
toolCall . InvokeFunction ( ) ;
}
break ;
}
} Perpustakaan mengimplementasikan antarmuka IClientEvent untuk acara terkirim klien yang keluar.
UpdateSessionRequest : Perbarui sesi dengan opsi sesi baru.InputAudioBufferAppendRequest : Tambahkan audio ke buffer audio input. (Tidak seperti membuat acara klien lainnya, server tidak akan mengirim respons konfirmasi ke acara ini).InputAudioBufferCommitRequest : Komit buffer audio input. (Saat dalam mode server VAD, klien tidak perlu mengirim acara ini).InputAudioBufferClearRequest : Hapus buffer audio input.ConversationItemCreateRequest : Buat item percakapan baru. Ini adalah cara utama untuk mengirim konten pengguna ke model.ConversationItemTruncateRequest : Kirim acara ini untuk memotong audio Asisten Pesan sebelumnya.ConversationItemDeleteRequest : Hapus item percakapan. Ini berguna ketika Anda ingin menghapus pesan dari riwayat percakapan.CreateResponseRequest : Buat respons dari model. Kirim acara ini setelah membuat item percakapan baru atau memanggil panggilan alat. Ini akan memicu model untuk menghasilkan respons.ResponseCancelRequest -Mendapkan acara ini untuk membatalkan respons yang sedang berlangsung. Anda dapat mengirim acara klien kapan saja ke server dengan menghubungi metode RealtimeSession.SendAsync pada objek sesi. Panggilan Kirim akan mengembalikan pegangan IServerEvent yang paling mewakili respons yang sesuai dari server untuk acara itu. Ini berguna jika Anda ingin menangani respons server dengan cara yang lebih granular.
Idealnya, Anda mungkin ingin menangani semua respons server dengan RealtimeSession.ReceiveUpdatesAsync .
Catatan
Server tidak akan mengirim respons konfirmasi ke acara InputAudioBufferAppendRequest .
Penting
Anda juga perlu mengirim CreateResponseRequest untuk memicu model untuk menghasilkan respons.
var serverEvent = await session . SendAsync ( new ConversationItemCreateRequest ( " Hello! " ) ) ;
Console . WriteLine ( serverEvent . ToJsonString ( ) ) ;
serverEvent = await session . SendAsync ( new CreateResponseRequest ( ) ) ;
Console . WriteLine ( serverEvent . ToJsonString ( ) ) ; Perpustakaan mengimplementasikan antarmuka IServerEvent untuk acara yang masuk server yang masuk.
RealtimeEventError : dikembalikan ketika kesalahan terjadi, yang bisa menjadi masalah klien atau masalah server.SessionResponse : dikembalikan untuk session.created dan session.updated Acara Updated.RealtimeConversationResponse : dikembalikan ketika item percakapan baru dibuat.ConversationItemCreatedResponse : dikembalikan saat item percakapan baru dibuat.ConversationItemInputAudioTranscriptionResponse : dikembalikan saat transkripsi audio input selesai atau gagal.ConversationItemTruncatedResponse : dikembalikan saat item percakapan terpotong.ConversationItemDeletedResponse : dikembalikan ketika item percakapan dihapus.InputAudioBufferCommittedResponse : dikembalikan ketika buffer audio input dilakukan, baik oleh klien atau secara otomatis dalam mode VAD server.InputAudioBufferClearedResponse : dikembalikan ketika buffer audio input dihapus.InputAudioBufferStartedResponse : Dikirim oleh server ketika dalam mode server_vad untuk menunjukkan bahwa pidato telah terdeteksi dalam buffer audio. Ini dapat terjadi kapan saja audio ditambahkan ke buffer (kecuali ucapan sudah terdeteksi). Klien mungkin ingin menggunakan acara ini untuk mengganggu pemutaran audio atau memberikan umpan balik visual kepada pengguna.InputAudioBufferStoppedResponse : dikembalikan dalam mode server_vad ketika server mendeteksi akhir pidato dalam buffer audio.RealtimeResponse : dikembalikan ketika respons dibuat atau dilakukan.ResponseOutputItemResponse : dikembalikan ketika item output respons ditambahkan atau dilakukan.ResponseContentPartResponse : dikembalikan ketika bagian konten respons ditambahkan atau dilakukan.ResponseTextResponse : dikembalikan ketika teks respons diperbarui atau dilakukan.ResponseAudioTranscriptResponse : dikembalikan ketika transkrip audio respons diperbarui atau dilakukan.ResponseAudioResponse : dikembalikan ketika audio respons diperbarui atau dilakukan.ResponseFunctionCallArgumentsResponse : dikembalikan ketika argumen panggilan fungsi respons diperbarui atau dilakukan.RateLimitsResponse : dikembalikan saat batas tingkat diperbarui. Untuk menerima acara server, Anda perlu menghubungi metode RealtimeSession.ReceiveUpdatesAsync pada objek sesi. Metode ini akan mengembalikan Task atau IAsyncEnumerable<T> yang akan selesai ketika sesi ditutup atau ketika token pembatalan dipicu. Idealnya metode ini harus dipanggil sekali dan berjalan selama sesi.
Catatan
Anda juga bisa mendapatkan panggilan balik IClientEvent juga dengan menggunakan antarmuka IRealtimeEvent alih -alih IServerEvent .
await foreach ( var @event in session . ReceiveUpdatesAsync < IServerEvent > ( cts . Token ) )
{
switch ( @event )
{
case RealtimeEventError error :
// raised anytime an error occurs
break ;
case SessionResponse sessionResponse :
// raised when a session is created or updated
break ;
case RealtimeConversationResponse conversationResponse :
// raised when a new conversation is created
break ;
case ConversationItemCreatedResponse conversationItemCreated :
// raised when a new conversation item is created
break ;
case ConversationItemInputAudioTranscriptionResponse conversationItemTranscription :
// raised when the input audio transcription is completed or failed
break ;
case ConversationItemTruncatedResponse conversationItemTruncated :
// raised when a conversation item is truncated
break ;
case ConversationItemDeletedResponse conversationItemDeleted :
// raised when a conversation item is deleted
break ;
case InputAudioBufferCommittedResponse committedResponse :
// raised when an input audio buffer is committed
break ;
case InputAudioBufferClearedResponse clearedResponse :
// raised when an input audio buffer is cleared
break ;
case InputAudioBufferStartedResponse startedResponse :
// raised when speech is detected in the audio buffer
break ;
case InputAudioBufferStoppedResponse stoppedResponse :
// raised when speech stops in the audio buffer
break ;
case RealtimeResponse realtimeResponse :
// raised when a response is created or done
break ;
case ResponseOutputItemResponse outputItemResponse :
// raised when a response output item is added or done
break ;
case ResponseContentPartResponse contentPartResponse :
// raised when a response content part is added or done
break ;
case ResponseTextResponse textResponse :
// raised when a response text is updated or done
break ;
case ResponseAudioTranscriptResponse transcriptResponse :
// raised when a response audio transcript is updated or done
break ;
case ResponseFunctionCallArgumentsResponse functionCallResponse :
// raised when a response function call arguments are updated or done
break ;
case RateLimitsResponse rateLimitsResponse :
// raised when rate limits are updated
break ;
}
}Peringatan
Fitur Beta. API tunduk pada perubahan yang melanggar.
Bangun asisten yang dapat memanggil model dan menggunakan alat untuk melakukan tugas.
API Asisten diakses melalui OpenAIClient.AssistantsEndpoint
Mengembalikan daftar asisten.
using var api = new OpenAIClient ( ) ;
var assistantsList = await api . AssistantsEndpoint . ListAssistantsAsync ( ) ;
foreach ( var assistant in assistantsList . Items )
{
Console . WriteLine ( $" { assistant } -> { assistant . CreatedAt } " ) ;
} Buat asisten dengan model dan instruksi.
using var api = new OpenAIClient ( ) ;
var request = new CreateAssistantRequest ( Model . GPT4o ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync ( request ) ; Mengambil asisten.
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . RetrieveAssistantAsync ( " assistant-id " ) ;
Console . WriteLine ( $" { assistant } -> { assistant . CreatedAt } " ) ; Memodifikasi asisten.
using var api = new OpenAIClient ( ) ;
var createRequest = new CreateAssistantRequest ( Model . GPT4_Turbo ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync ( createRequest ) ;
var modifyRequest = new CreateAssistantRequest ( Model . GPT4o ) ;
var modifiedAssistant = await api . AssistantsEndpoint . ModifyAssistantAsync ( assistant . Id , modifyRequest ) ;
// OR AssistantExtension for easier use!
var modifiedAssistantEx = await assistant . ModifyAsync ( modifyRequest ) ; Hapus asisten.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . AssistantsEndpoint . DeleteAssistantAsync ( " assistant-id " ) ;
// OR AssistantExtension for easier use!
var isDeleted = await assistant . DeleteAsync ( ) ;
Assert . IsTrue ( isDeleted ) ; Catatan
Acara Asisten Stream dapat dengan mudah ditambahkan ke panggilan utas yang ada dengan menyampaikan Func<IServerSentEvent, Task> streamEventHandler ke metode yang ada yang mendukung streaming.
Buat utas yang dapat berinteraksi dengan asisten.
API utas diakses melalui OpenAIClient.ThreadsEndpoint
Buat utas.
using var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
Console . WriteLine ( $" Create thread { thread . Id } -> { thread . CreatedAt } " ) ; Buat utas dan jalankan dalam satu permintaan.
Lihat juga: Thread Runs
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync (
new CreateAssistantRequest (
name : " Math Tutor " ,
instructions : " You are a personal math tutor. Answer questions briefly, in a sentence or less. " ,
model : Model . GPT4o ) ) ;
var messages = new List < Message > { " I need to solve the equation `3x + 11 = 14`. Can you help me? " } ;
var threadRequest = new CreateThreadRequest ( messages ) ;
var run = await assistant . CreateThreadAndRunAsync ( threadRequest ) ;
Console . WriteLine ( $" Created thread and run: { run . ThreadId } -> { run . Id } -> { run . CreatedAt } " ) ; Buat utas dan jalankan dalam satu permintaan saat streaming acara.
using var api = new OpenAIClient ( ) ;
var tools = new List < Tool >
{
Tool . GetOrCreateTool ( typeof ( WeatherService ) , nameof ( WeatherService . GetCurrentWeatherAsync ) )
} ;
var assistantRequest = new CreateAssistantRequest ( tools : tools , instructions : " You are a helpful weather assistant. Use the appropriate unit based on geographical location. " ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync ( assistantRequest ) ;
ThreadResponse thread = null ;
async Task StreamEventHandler ( IServerSentEvent streamEvent )
{
switch ( streamEvent )
{
case ThreadResponse threadResponse :
thread = threadResponse ;
break ;
case RunResponse runResponse :
if ( runResponse . Status == RunStatus . RequiresAction )
{
var toolOutputs = await assistant . GetToolOutputsAsync ( runResponse ) ;
foreach ( var toolOutput in toolOutputs )
{
Console . WriteLine ( $" Tool Output: { toolOutput } " ) ;
}
await runResponse . SubmitToolOutputsAsync ( toolOutputs , StreamEventHandler ) ;
}
break ;
default :
Console . WriteLine ( streamEvent . ToJsonString ( ) ) ;
break ;
}
}
var run = await assistant . CreateThreadAndRunAsync ( " I'm in Kuala-Lumpur, please tell me what's the temperature now? " , StreamEventHandler ) ;
run = await run . WaitForStatusChangeAsync ( ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items . Reverse ( ) )
{
Console . WriteLine ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
} Mengambil utas.
using var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . RetrieveThreadAsync ( " thread-id " ) ;
// OR if you simply wish to get the latest state of a thread
thread = await thread . UpdateAsync ( ) ;
Console . WriteLine ( $" Retrieve thread { thread . Id } -> { thread . CreatedAt } " ) ; Memodifikasi utas.
Catatan: Hanya metadata yang dapat dimodifikasi.
using var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
var metadata = new Dictionary < string , string >
{
{ " key " , " custom thread metadata " }
}
thread = await api . ThreadsEndpoint . ModifyThreadAsync ( thread . Id , metadata ) ;
// OR use extension method for convenience!
thread = await thread . ModifyAsync ( metadata ) ;
Console . WriteLine ( $" Modify thread { thread . Id } -> { thread . Metadata [ " key " ] } " ) ; Hapus utas.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . ThreadsEndpoint . DeleteThreadAsync ( " thread-id " ) ;
// OR use extension method for convenience!
var isDeleted = await thread . DeleteAsync ( ) ;
Assert . IsTrue ( isDeleted ) ; Buat pesan di dalam utas.
Mengembalikan daftar pesan untuk utas yang diberikan.
using var api = new OpenAIClient ( ) ;
var messageList = await api . ThreadsEndpoint . ListMessagesAsync ( " thread-id " ) ;
// OR use extension method for convenience!
var messageList = await thread . ListMessagesAsync ( ) ;
foreach ( var message in messageList . Items )
{
Console . WriteLine ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ;
} Buat pesan.
using var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
var request = new CreateMessageRequest ( " Hello world! " ) ;
var message = await api . ThreadsEndpoint . CreateMessageAsync ( thread . Id , request ) ;
// OR use extension method for convenience!
var message = await thread . CreateMessageAsync ( " Hello World! " ) ;
Console . WriteLine ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ; Mengambil pesan.
using var api = new OpenAIClient ( ) ;
var message = await api . ThreadsEndpoint . RetrieveMessageAsync ( " thread-id " , " message-id " ) ;
// OR use extension methods for convenience!
var message = await thread . RetrieveMessageAsync ( " message-id " ) ;
var message = await message . UpdateAsync ( ) ;
Console . WriteLine ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ; Ubah pesan.
Catatan: Hanya metadata pesan yang dapat dimodifikasi.
using var api = new OpenAIClient ( ) ;
var metadata = new Dictionary < string , string >
{
{ " key " , " custom message metadata " }
} ;
var message = await api . ThreadsEndpoint . ModifyMessageAsync ( " thread-id " , " message-id " , metadata ) ;
// OR use extension method for convenience!
var message = await message . ModifyAsync ( metadata ) ;
Console . WriteLine ( $" Modify message metadata: { message . Id } -> { message . Metadata [ " key " ] } " ) ; Mewakili eksekusi yang dijalankan pada utas.
Mengembalikan daftar lari milik utas.
using var api = new OpenAIClient ( ) ;
var runList = await api . ThreadsEndpoint . ListRunsAsync ( " thread-id " ) ;
// OR use extension method for convenience!
var runList = await thread . ListRunsAsync ( ) ;
foreach ( var run in runList . Items )
{
Console . WriteLine ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ;
} Buat lari.
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync (
new CreateAssistantRequest (
name : " Math Tutor " ,
instructions : " You are a personal math tutor. Answer questions briefly, in a sentence or less. " ,
model : Model . GPT4o ) ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
var message = await thread . CreateMessageAsync ( " I need to solve the equation `3x + 11 = 14`. Can you help me? " ) ;
var run = await thread . CreateRunAsync ( assistant ) ;
Console . WriteLine ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ; Buat jalankan dan streaming acara.
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync (
new CreateAssistantRequest (
name : " Math Tutor " ,
instructions : " You are a personal math tutor. Answer questions briefly, in a sentence or less. Your responses should be formatted in JSON. " ,
model : Model . GPT4o ,
responseFormat : ChatResponseFormat . Json ) ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
var message = await thread . CreateMessageAsync ( " I need to solve the equation `3x + 11 = 14`. Can you help me? " ) ;
var run = await thread . CreateRunAsync ( assistant , async streamEvent =>
{
Console . WriteLine ( streamEvent . ToJsonString ( ) ) ;
await Task . CompletedTask ;
} ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items . Reverse ( ) )
{
Console . WriteLine ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
} Mengambil lari.
using var api = new OpenAIClient ( ) ;
var run = await api . ThreadsEndpoint . RetrieveRunAsync ( " thread-id " , " run-id " ) ;
// OR use extension method for convenience!
var run = await thread . RetrieveRunAsync ( " run-id " ) ;
var run = await run . UpdateAsync ( ) ;
Console . WriteLine ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ; Memodifikasi lari.
Catatan: Hanya metadata yang dapat dimodifikasi.
using var api = new OpenAIClient ( ) ;
var metadata = new Dictionary < string , string >
{
{ " key " , " custom run metadata " }
} ;
var run = await api . ThreadsEndpoint . ModifyRunAsync ( " thread-id " , " run-id " , metadata ) ;
// OR use extension method for convenience!
var run = await run . ModifyAsync ( metadata ) ;
Console . WriteLine ( $" Modify run { run . Id } -> { run . Metadata [ " key " ] } " ) ; Ketika menjalankan memiliki status: requires_action dan required_action.type adalah submit_tool_outputs , titik akhir ini dapat digunakan untuk mengirimkan output dari panggilan alat setelah semuanya selesai. Semua output harus dikirimkan dalam satu permintaan.
Catatan
Lihat Buat Thread dan Jalankan Contoh Streaming Tentang Cara Streaming Alat Output Events.
using var api = new OpenAIClient ( ) ;
var tools = new List < Tool >
{
// Use a predefined tool
Tool . Retrieval , Tool . CodeInterpreter ,
// Or create a tool from a type and the name of the method you want to use for function calling
Tool . GetOrCreateTool ( typeof ( WeatherService ) , nameof ( WeatherService . GetCurrentWeatherAsync ) ) ,
// Pass in an instance of an object to call a method on it
Tool . GetOrCreateTool ( api . ImagesEndPoint , nameof ( ImagesEndpoint . GenerateImageAsync ) ) ,
// Define func<,> callbacks
Tool . FromFunc ( " name_of_func " , ( ) => { /* callback function */ } ) ,
Tool . FromFunc < T1 , T2 , TResult > ( " func_with_multiple_params " , ( t1 , t2 ) => { /* logic that calculates return value */ return tResult ; } )
} ;
var assistantRequest = new CreateAssistantRequest ( tools : tools , instructions : " You are a helpful weather assistant. Use the appropriate unit based on geographical location. " ) ;
var testAssistant = await api . AssistantsEndpoint . CreateAssistantAsync ( assistantRequest ) ;
var run = await testAssistant . CreateThreadAndRunAsync ( " I'm in Kuala-Lumpur, please tell me what's the temperature now? " ) ;
// waiting while run is Queued and InProgress
run = await run . WaitForStatusChangeAsync ( ) ;
// Invoke all of the tool call functions and return the tool outputs.
var toolOutputs = await testAssistant . GetToolOutputsAsync ( run . RequiredAction . SubmitToolOutputs . ToolCalls ) ;
foreach ( var toolOutput in toolOutputs )
{
Console . WriteLine ( $" tool call output: { toolOutput . Output } " ) ;
}
// submit the tool outputs
run = await run . SubmitToolOutputsAsync ( toolOutputs ) ;
// waiting while run in Queued and InProgress
run = await run . WaitForStatusChangeAsync ( ) ;
var messages = await run . ListMessagesAsync ( ) ;
foreach ( var message in messages . Items . OrderBy ( response => response . CreatedAt ) )
{
Console . WriteLine ( $" { message . Role } : { message . PrintContent ( ) } " ) ;
} Output terstruktur adalah evolusi mode JSON. Sementara keduanya memastikan JSON yang valid diproduksi, hanya output terstruktur yang memastikan kepatuhan skema.
Penting
finish_reason panjangnya, yang menunjukkan generasi melebihi max_tokens atau percakapan melebihi batas token. Untuk menjaga terhadap hal ini, periksa finish_reason sebelum mem -parsing respons.Pertama -tama tentukan struktur tanggapan Anda. Ini akan digunakan sebagai skema Anda. Ini adalah objek yang akan Anda hapus, jadi pastikan untuk menggunakan model objek JSON standar.
public class MathResponse
{
[ JsonInclude ]
[ JsonPropertyName ( " steps " ) ]
public IReadOnlyList < MathStep > Steps { get ; private set ; }
[ JsonInclude ]
[ JsonPropertyName ( " final_answer " ) ]
public string FinalAnswer { get ; private set ; }
}
public class MathStep
{
[ JsonInclude ]
[ JsonPropertyName ( " explanation " ) ]
public string Explanation { get ; private set ; }
[ JsonInclude ]
[ JsonPropertyName ( " output " ) ]
public string Output { get ; private set ; }
} Untuk menggunakan, cukup tentukan tipe MathResponse sebagai kendala generik baik dalam CreateAssistantAsync , CreateRunAsync , atau CreateThreadAndRunAsync .
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync < MathResponse > (
new CreateAssistantRequest (
name : " Math Tutor " ,
instructions : " You are a helpful math tutor. Guide the user through the solution step by step. " ,
model : " gpt-4o-2024-08-06 " ) ) ;
ThreadResponse thread = null ;
try
{
async Task StreamEventHandler ( IServerSentEvent @event )
{
try
{
switch ( @event )
{
case MessageResponse message :
if ( message . Status != MessageStatus . Completed )
{
Console . WriteLine ( @event . ToJsonString ( ) ) ;
break ;
}
var mathResponse = message . FromSchema < MathResponse > ( ) ;
for ( var i = 0 ; i < mathResponse . Steps . Count ; i ++ )
{
var step = mathResponse . Steps [ i ] ;
Console . WriteLine ( $" Step { i } : { step . Explanation } " ) ;
Console . WriteLine ( $" Result: { step . Output } " ) ;
}
Console . WriteLine ( $" Final Answer: { mathResponse . FinalAnswer } " ) ;
break ;
default :
Console . WriteLine ( @event . ToJsonString ( ) ) ;
break ;
}
}
catch ( Exception e )
{
Console . WriteLine ( e ) ;
throw ;
}
await Task . CompletedTask ;
}
var run = await assistant . CreateThreadAndRunAsync ( " how can I solve 8x + 7 = -23 " , StreamEventHandler ) ;
thread = await run . GetThreadAsync ( ) ;
run = await run . WaitForStatusChangeAsync ( ) ;
Console . WriteLine ( $" Created thread and run: { run . ThreadId } -> { run . Id } -> { run . CreatedAt } " ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items . OrderBy ( response => response . CreatedAt ) )
{
Console . WriteLine ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
}
}
finally
{
await assistant . DeleteAsync ( deleteToolResources : thread == null ) ;
if ( thread != null )
{
var isDeleted = await thread . DeleteAsync ( deleteToolResources : true ) ;
}
}Anda juga dapat secara manual membuat JSON Skema JSON String juga, tetapi Anda akan bertanggung jawab untuk menghapus data respons Anda:
using var api = new OpenAIClient ( ) ;
var mathSchema = new JsonSchema ( " math_response " , @"
{
""type"": ""object"",
""properties"": {
""steps"": {
""type"": ""array"",
""items"": {
""type"": ""object"",
""properties"": {
""explanation"": {
""type"": ""string""
},
""output"": {
""type"": ""string""
}
},
""required"": [
""explanation"",
""output""
],
""additionalProperties"": false
}
},
""final_answer"": {
""type"": ""string""
}
},
""required"": [
""steps"",
""final_answer""
],
""additionalProperties"": false
}" ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync (
new CreateAssistantRequest (
name : " Math Tutor " ,
instructions : " You are a helpful math tutor. Guide the user through the solution step by step. " ,
model : " gpt-4o-2024-08-06 " ,
jsonSchema : mathSchema ) ) ;
ThreadResponse thread = null ;
try
{
var run = await assistant . CreateThreadAndRunAsync ( " how can I solve 8x + 7 = -23 " ,
async @event =>
{
Console . WriteLine ( @event . ToJsonString ( ) ) ;
await Task . CompletedTask ;
} ) ;
thread = await run . GetThreadAsync ( ) ;
run = await run . WaitForStatusChangeAsync ( ) ;
Console . WriteLine ( $" Created thread and run: { run . ThreadId } -> { run . Id } -> { run . CreatedAt } " ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items )
{
Console . WriteLine ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
}
}
finally
{
await assistant . DeleteAsync ( deleteToolResources : thread == null ) ;
if ( thread != null )
{
var isDeleted = await thread . DeleteAsync ( deleteToolResources : true ) ;
Assert . IsTrue ( isDeleted ) ;
}
} Mengembalikan daftar langkah lari milik lari.
using var api = new OpenAIClient ( ) ;
var runStepList = await api . ThreadsEndpoint . ListRunStepsAsync ( " thread-id " , " run-id " ) ;
// OR use extension method for convenience!
var runStepList = await run . ListRunStepsAsync ( ) ;
foreach ( var runStep in runStepList . Items )
{
Console . WriteLine ( $" [ { runStep . Id } ] { runStep . Status } { runStep . CreatedAt } -> { runStep . ExpiresAt } " ) ;
} Mengambil langkah lari.
using var api = new OpenAIClient ( ) ;
var runStep = await api . ThreadsEndpoint . RetrieveRunStepAsync ( " thread-id " , " run-id " , " step-id " ) ;
// OR use extension method for convenience!
var runStep = await run . RetrieveRunStepAsync ( " step-id " ) ;
var runStep = await runStep . UpdateAsync ( ) ;
Console . WriteLine ( $" [ { runStep . Id } ] { runStep . Status } { runStep . CreatedAt } -> { runStep . ExpiresAt } " ) ; Membatalkan lari yaitu in_progress .
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . ThreadsEndpoint . CancelRunAsync ( " thread-id " , " run-id " ) ;
// OR use extension method for convenience!
var isCancelled = await run . CancelAsync ( ) ;
Assert . IsTrue ( isCancelled ) ; Toko vektor digunakan untuk menyimpan file untuk digunakan oleh alat file_search .
Vector Stores API diakses melalui OpenAIClient.VectorStoresEndpoint
Mengembalikan daftar toko vektor.
using var api = new OpenAIClient ( ) ;
var vectorStores = await api . VectorStoresEndpoint . ListVectorStoresAsync ( ) ;
foreach ( var vectorStore in vectorStores . Items )
{
Console . WriteLine ( vectorStore ) ;
} Buat toko vektor.
using var api = new OpenAIClient ( ) ;
var createVectorStoreRequest = new CreateVectorStoreRequest ( " test-vector-store " ) ;
var vectorStore = await api . VectorStoresEndpoint . CreateVectorStoreAsync ( createVectorStoreRequest ) ;
Console . WriteLine ( vectorStore ) ; Mengambil toko vektor.
using var api = new OpenAIClient ( ) ;
var vectorStore = await api . VectorStoresEndpoint . GetVectorStoreAsync ( " vector-store-id " ) ;
Console . WriteLine ( vectorStore ) ; Memodifikasi toko vektor.
using var api = new OpenAIClient ( ) ;
var metadata = new Dictionary < string , object > { { " Test " , DateTime . UtcNow } } ;
var vectorStore = await api . VectorStoresEndpoint . ModifyVectorStoreAsync ( " vector-store-id " , metadata : metadata ) ;
Console . WriteLine ( vectorStore ) ; Hapus toko vektor.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreAsync ( " vector-store-id " ) ;
Assert . IsTrue ( isDeleted ) ; File toko vektor mewakili file di dalam toko vektor.
Mengembalikan daftar file toko vektor.
using var api = new OpenAIClient ( ) ;
var files = await api . VectorStoresEndpoint . ListVectorStoreFilesAsync ( " vector-store-id " ) ;
foreach ( var file in vectorStoreFiles . Items )
{
Console . WriteLine ( file ) ;
} Buat file toko vektor dengan memasang file ke toko vektor.
using var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . CreateVectorStoreFileAsync ( " vector-store-id " , " file-id " , new ChunkingStrategy ( ChunkingStrategyType . Static ) ) ;
Console . WriteLine ( file ) ; Mengambil file toko vektor.
using var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . GetVectorStoreFileAsync ( " vector-store-id " , " vector-store-file-id " ) ;
Console . WriteLine ( file ) ; Hapus file toko vektor. Ini akan menghapus file dari toko vektor tetapi file itu sendiri tidak akan dihapus. Untuk menghapus file, gunakan titik akhir hapus file.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreFileAsync ( " vector-store-id " , vectorStoreFile ) ;
Assert . IsTrue ( isDeleted ) ; File toko vektor mewakili file di dalam toko vektor.
Buat Batch File Toko Vektor.
using var api = new OpenAIClient ( ) ;
var files = new List < string > { " file_id_1 " , " file_id_2 " } ;
var vectorStoreFileBatch = await api . VectorStoresEndpoint . CreateVectorStoreFileBatchAsync ( " vector-store-id " , files ) ;
Console . WriteLine ( vectorStoreFileBatch ) ; Mengambil batch file toko vektor.
using var api = new OpenAIClient ( ) ;
var vectorStoreFileBatch = await api . VectorStoresEndpoint . GetVectorStoreFileBatchAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;
// you can also use convenience methods!
vectorStoreFileBatch = await vectorStoreFileBatch . UpdateAsync ( ) ;
vectorStoreFileBatch = await vectorStoreFileBatch . WaitForStatusChangeAsync ( ) ; Mengembalikan daftar file toko vektor dalam batch.
using var api = new OpenAIClient ( ) ;
var files = await api . VectorStoresEndpoint . ListVectorStoreBatchFilesAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;
foreach ( var file in files . Items )
{
Console . WriteLine ( file ) ;
} Batalkan Batch File Toko Vektor. Ini berupaya membatalkan pemrosesan file dalam batch ini sesegera mungkin.
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . VectorStoresEndpoint . CancelVectorStoreFileBatchAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;Diberi percakapan obrolan, model akan mengembalikan tanggapan penyelesaian obrolan.
API obrolan diakses melalui OpenAIClient.ChatEndpoint
Membuat penyelesaian untuk pesan obrolan
using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant. " ) ,
new Message ( Role . User , " Who won the world series in 2020? " ) ,
new Message ( Role . Assistant , " The Los Angeles Dodgers won the World Series in 2020. " ) ,
new Message ( Role . User , " Where was it played? " ) ,
} ;
var chatRequest = new ChatRequest ( messages , Model . GPT4o ) ;
var response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
var choice = response . FirstChoice ;
Console . WriteLine ( $" [ { choice . Index } ] { choice . Message . Role } : { choice . Message } | Finish Reason: { choice . FinishReason } " ) ; using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant. " ) ,
new Message ( Role . User , " Who won the world series in 2020? " ) ,
new Message ( Role . Assistant , " The Los Angeles Dodgers won the World Series in 2020. " ) ,
new Message ( Role . User , " Where was it played? " ) ,
} ;
var chatRequest = new ChatRequest ( messages ) ;
var response = await api . ChatEndpoint . StreamCompletionAsync ( chatRequest , async partialResponse =>
{
Console . Write ( partialResponse . FirstChoice . Delta . ToString ( ) ) ;
await Task . CompletedTask ;
} ) ;
var choice = response . FirstChoice ;
Console . WriteLine ( $" [ { choice . Index } ] { choice . Message . Role } : { choice . Message } | Finish Reason: { choice . FinishReason } " ) ; Atau jika menggunakan IAsyncEnumerable{T} (c# 8.0+)
using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant. " ) ,
new Message ( Role . User , " Who won the world series in 2020? " ) ,
new Message ( Role . Assistant , " The Los Angeles Dodgers won the World Series in 2020. " ) ,
new Message ( Role . User , " Where was it played? " ) ,
} ;
var cumulativeDelta = string . Empty ;
var chatRequest = new ChatRequest ( messages ) ;
await foreach ( var partialResponse in api . ChatEndpoint . StreamCompletionEnumerableAsync ( chatRequest ) )
{
foreach ( var choice in partialResponse . Choices . Where ( choice => choice . Delta ? . Content != null ) )
{
cumulativeDelta += choice . Delta . Content ;
}
}
Console . WriteLine ( cumulativeDelta ) ; using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new ( Role . System , " You are a helpful weather assistant. Always prompt the user for their location. " ) ,
new Message ( Role . User , " What's the weather like today? " ) ,
} ;
foreach ( var message in messages )
{
Console . WriteLine ( $" { message . Role } : { message } " ) ;
}
// Define the tools that the assistant is able to use:
// 1. Get a list of all the static methods decorated with FunctionAttribute
var tools = Tool . GetAllAvailableTools ( includeDefaults : false , forceUpdate : true , clearCache : true ) ;
// 2. Define a custom list of tools:
var tools = new List < Tool >
{
Tool . GetOrCreateTool ( objectInstance , " TheNameOfTheMethodToCall " ) ,
Tool . FromFunc ( " a_custom_name_for_your_function " , ( ) => { /* Some logic to run */ } )
} ;
var chatRequest = new ChatRequest ( messages , tools : tools , toolChoice : " auto " ) ;
var response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
messages . Add ( response . FirstChoice . Message ) ;
Console . WriteLine ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice } | Finish Reason: { response . FirstChoice . FinishReason } " ) ;
var locationMessage = new Message ( Role . User , " I'm in Glasgow, Scotland " ) ;
messages . Add ( locationMessage ) ;
Console . WriteLine ( $" { locationMessage . Role } : { locationMessage . Content } " ) ;
chatRequest = new ChatRequest ( messages , tools : tools , toolChoice : " auto " ) ;
response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
messages . Add ( response . FirstChoice . Message ) ;
if ( response . FirstChoice . FinishReason == " stop " )
{
Console . WriteLine ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice } | Finish Reason: { response . FirstChoice . FinishReason } " ) ;
var unitMessage = new Message ( Role . User , " Fahrenheit " ) ;
messages . Add ( unitMessage ) ;
Console . WriteLine ( $" { unitMessage . Role } : { unitMessage . Content } " ) ;
chatRequest = new ChatRequest ( messages , tools : tools , toolChoice : " auto " ) ;
response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
}
// iterate over all tool calls and invoke them
foreach ( var toolCall in response . FirstChoice . Message . ToolCalls )
{
Console . WriteLine ( $" { response . FirstChoice . Message . Role } : { toolCall . Function . Name } | Finish Reason: { response . FirstChoice . FinishReason } " ) ;
Console . WriteLine ( $" { toolCall . Function . Arguments } " ) ;
// Invokes function to get a generic json result to return for tool call.
var functionResult = await toolCall . InvokeFunctionAsync ( ) ;
// If you know the return type and do additional processing you can use generic overload
var functionResult = await toolCall . InvokeFunctionAsync < string > ( ) ;
messages . Add ( new Message ( toolCall , functionResult ) ) ;
Console . WriteLine ( $" { Role . Tool } : { functionResult } " ) ;
}
// System: You are a helpful weather assistant.
// User: What's the weather like today?
// Assistant: Sure, may I know your current location? | Finish Reason: stop
// User: I'm in Glasgow, Scotland
// Assistant: GetCurrentWeather | Finish Reason: tool_calls
// {
// "location": "Glasgow, Scotland",
// "unit": "celsius"
// }
// Tool: The current weather in Glasgow, Scotland is 39°C. Peringatan
Fitur Beta. API tunduk pada perubahan yang melanggar.
using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant. " ) ,
new Message ( Role . User , new List < Content >
{
" What's in this image? " ,
new ImageUrl ( " https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg " , ImageDetail . Low )
} )
} ;
var chatRequest = new ChatRequest ( messages , model : Model . GPT4o ) ;
var response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
Console . WriteLine ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice . Message . Content } | Finish Reason: { response . FirstChoice . FinishDetails } " ) ; using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant. " ) ,
new Message ( Role . User , " Is a golden retriever a good family dog? " )
} ;
var chatRequest = new ChatRequest ( messages , Model . GPT4oAudio , audioConfig : Voice . Alloy ) ;
var response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
Console . WriteLine ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice } | Finish Reason: { response . FirstChoice . FinishDetails } " ) ;
// todo play response.FirstChoice.Message.AudioOutput.Data Evolusi mode JSON. Sementara keduanya memastikan JSON yang valid diproduksi, hanya output terstruktur yang memastikan kepatuhan skema.
Penting
finish_reason panjangnya, yang menunjukkan generasi melebihi max_tokens atau percakapan melebihi batas token. Untuk menjaga terhadap hal ini, periksa finish_reason sebelum mem -parsing respons.Pertama -tama tentukan struktur tanggapan Anda. Ini akan digunakan sebagai skema Anda. Ini adalah objek yang akan Anda hapus, jadi pastikan untuk menggunakan model objek JSON standar.
public class MathResponse
{
[ JsonInclude ]
[ JsonPropertyName ( " steps " ) ]
public IReadOnlyList < MathStep > Steps { get ; private set ; }
[ JsonInclude ]
[ JsonPropertyName ( " final_answer " ) ]
public string FinalAnswer { get ; private set ; }
}
public class MathStep
{
[ JsonInclude ]
[ JsonPropertyName ( " explanation " ) ]
public string Explanation { get ; private set ; }
[ JsonInclude ]
[ JsonPropertyName ( " output " ) ]
public string Output { get ; private set ; }
} Untuk menggunakan, cukup tentukan tipe MathResponse sebagai kendala generik saat meminta penyelesaian.
using var api = new OpenAIClient ( ) ;
var messages = new List < Message >
{
new ( Role . System , " You are a helpful math tutor. Guide the user through the solution step by step. " ) ,
new ( Role . User , " how can I solve 8x + 7 = -23 " )
} ;
var chatRequest = new ChatRequest ( messages , model : " gpt-4o-2024-08-06 " ) ;
var ( mathResponse , chatResponse ) = await api . ChatEndpoint . GetCompletionAsync < MathResponse > ( chatRequest ) ;
for ( var i = 0 ; i < mathResponse . Steps . Count ; i ++ )
{
var step = mathResponse . Steps [ i ] ;
Console . WriteLine ( $" Step { i } : { step . Explanation } " ) ;
Console . WriteLine ( $" Result: { step . Output } " ) ;
}
Console . WriteLine ( $" Final Answer: { mathResponse . FinalAnswer } " ) ;
chatResponse . GetUsage ( ) ; Penting
finish_reason panjangnya, yang menunjukkan generasi melebihi max_tokens atau percakapan melebihi batas token. Untuk menjaga terhadap hal ini, periksa finish_reason sebelum mem -parsing respons. var messages = new List < Message >
{
new Message ( Role . System , " You are a helpful assistant designed to output JSON. " ) ,
new Message ( Role . User , " Who won the world series in 2020? " ) ,
} ;
var chatRequest = new ChatRequest ( messages , Model . GPT4o , responseFormat : ChatResponseFormat . Json ) ;
var response = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
foreach ( var choice in response . Choices )
{
Console . WriteLine ( $" [ { choice . Index } ] { choice . Message . Role } : { choice } | Finish Reason: { choice . FinishReason } " ) ;
}
response . GetUsage ( ) ;Mengubah audio menjadi teks.
API Audio diakses melalui OpenAIClient.AudioEndpoint
Menghasilkan audio dari teks input.
using var api = new OpenAIClient ( ) ;
var request = new SpeechRequest ( " Hello World! " ) ;
async Task ChunkCallback ( ReadOnlyMemory < byte > chunkCallback )
{
// TODO Implement audio playback as chunks arrive
await Task . CompletedTask ;
}
var response = await api . AudioEndpoint . CreateSpeechAsync ( request , ChunkCallback ) ;
await File . WriteAllBytesAsync ( " ../../../Assets/HelloWorld.mp3 " , response . ToArray ( ) ) ; Transkrip audio ke dalam bahasa input.
using var api = new OpenAIClient ( ) ;
using var request = new AudioTranscriptionRequest ( Path . GetFullPath ( audioAssetPath ) , language : " en " ) ;
var response = await api . AudioEndpoint . CreateTranscriptionTextAsync ( request ) ;
Console . WriteLine ( response ) ; Anda juga bisa mendapatkan informasi terperinci menggunakan verbose_json untuk mendapatkan granularitas waktu:
using var api = new OpenAIClient ( ) ;
using var request = new AudioTranscriptionRequest ( transcriptionAudio , responseFormat : AudioResponseFormat . Verbose_Json , timestampGranularity : TimestampGranularity . Word , temperature : 0.1f , language : " en " ) ;
var response = await api . AudioEndpoint . CreateTranscriptionTextAsync ( request ) ;
foreach ( var word in response . Words )
{
Console . WriteLine ( $" [ { word . Start } - { word . End } ] " { word . Word } " " ) ;
} Menerjemahkan audio ke dalam bahasa Inggris.
using var api = new OpenAIClient ( ) ;
using var request = new AudioTranslationRequest ( Path . GetFullPath ( audioAssetPath ) ) ;
var response = await api . AudioEndpoint . CreateTranslationTextAsync ( request ) ;
Console . WriteLine ( response ) ;Diberi gambar prompt dan/atau input, model akan menghasilkan gambar baru.
API Gambar diakses melalui OpenAIClient.ImagesEndpoint
Membuat gambar yang diberi prompt.
using var api = new OpenAIClient ( ) ;
var request = new ImageGenerationRequest ( " A house riding a velociraptor " , Models . Model . DallE_3 ) ;
var imageResults = await api . ImagesEndPoint . GenerateImageAsync ( request ) ;
foreach ( var image in imageResults )
{
Console . WriteLine ( image ) ;
// image == url or b64_string
} Membuat gambar yang diedit atau diperpanjang diberi gambar asli dan prompt.
using var api = new OpenAIClient ( ) ;
var request = new ImageEditRequest ( imageAssetPath , maskAssetPath , " A sunlit indoor lounge area with a pool containing a flamingo " , size : ImageSize . Small ) ;
var imageResults = await api . ImagesEndPoint . CreateImageEditAsync ( request ) ;
foreach ( var image in imageResults )
{
Console . WriteLine ( image ) ;
// image == url or b64_string
} Menciptakan variasi gambar yang diberikan.
using var api = new OpenAIClient ( ) ;
var request = new ImageVariationRequest ( imageAssetPath , size : ImageSize . Small ) ;
var imageResults = await api . ImagesEndPoint . CreateImageVariationAsync ( request ) ;
foreach ( var image in imageResults )
{
Console . WriteLine ( image ) ;
// image == url or b64_string
}File digunakan untuk mengunggah dokumen yang dapat digunakan dengan fitur seperti fine-tuning.
API File diakses melalui OpenAIClient.FilesEndpoint
Mengembalikan daftar file milik organisasi pengguna.
using var api = new OpenAIClient ( ) ;
var fileList = await api . FilesEndpoint . ListFilesAsync ( ) ;
foreach ( var file in fileList )
{
Console . WriteLine ( $" { file . Id } -> { file . Object } : { file . FileName } | { file . Size } bytes " ) ;
} Unggah file yang dapat digunakan di berbagai titik akhir. Ukuran semua file yang diunggah oleh satu organisasi dapat mencapai 100 GB.
Ukuran masing -masing file dapat maksimal 512 MB. Lihat panduan Assistants Tools untuk mempelajari lebih lanjut tentang jenis file yang didukung. API yang menyempurnakan hanya mendukung file .jsonl.
using var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . UploadFileAsync ( " path/to/your/file.jsonl " , FilePurpose . FineTune ) ;
Console . WriteLine ( file . Id ) ; Hapus file.
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . FilesEndpoint . DeleteFileAsync ( fileId ) ;
Assert . IsTrue ( isDeleted ) ; Mengembalikan informasi tentang file tertentu.
using var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . GetFileInfoAsync ( fileId ) ;
Console . WriteLine ( $" { file . Id } -> { file . Object } : { file . FileName } | { file . Size } bytes " ) ; Unduh konten file ke direktori yang ditentukan.
using var api = new OpenAIClient ( ) ;
var downloadedFilePath = await api . FilesEndpoint . DownloadFileAsync ( fileId , " path/to/your/save/directory " ) ;
Console . WriteLine ( downloadedFilePath ) ;
Assert . IsTrue ( File . Exists ( downloadedFilePath ) ) ;Kelola pekerjaan yang menyempurnakan untuk menyesuaikan model dengan data pelatihan khusus Anda.
Panduan Terkait: Model Fine-Tune
API File diakses melalui OpenAIClient.FineTuningEndpoint
Membuat pekerjaan yang menyempurnakan model tertentu dari dataset yang diberikan.
Respons termasuk rincian pekerjaan yang diaktifkan termasuk status pekerjaan dan nama model yang disesuaikan setelah selesai.
using var api = new OpenAIClient ( ) ;
var fileId = " file-abc123 " ;
var request = new CreateFineTuneRequest ( fileId ) ;
var job = await api . FineTuningEndpoint . CreateJobAsync ( Model . GPT3_5_Turbo , request ) ;
Console . WriteLine ( $" Started { job . Id } | Status: { job . Status } " ) ; Sebutkan pekerjaan penyesuaian organisasi Anda.
using var api = new OpenAIClient ( ) ;
var jobList = await api . FineTuningEndpoint . ListJobsAsync ( ) ;
foreach ( var job in jobList . Items . OrderByDescending ( job => job . CreatedAt ) )
{
Console . WriteLine ( $" { job . Id } -> { job . CreatedAt } | { job . Status } " ) ;
} Mendapat info tentang pekerjaan fine-tune.
using var api = new OpenAIClient ( ) ;
var job = await api . FineTuningEndpoint . GetJobInfoAsync ( fineTuneJob ) ;
Console . WriteLine ( $" { job . Id } -> { job . CreatedAt } | { job . Status } " ) ; Segera batalkan pekerjaan fine-tune.
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . FineTuningEndpoint . CancelFineTuneJobAsync ( fineTuneJob ) ;
Assert . IsTrue ( isCancelled ) ; Dapatkan pembaruan status untuk pekerjaan yang menyempurnakan.
using var api = new OpenAIClient ( ) ;
var eventList = await api . FineTuningEndpoint . ListJobEventsAsync ( fineTuneJob ) ;
Console . WriteLine ( $" { fineTuneJob . Id } -> status: { fineTuneJob . Status } | event count: { eventList . Events . Count } " ) ;
foreach ( var @event in eventList . Items . OrderByDescending ( @event => @event . CreatedAt ) )
{
Console . WriteLine ( $" { @event . CreatedAt } [ { @event . Level } ] { @event . Message } " ) ;
}Buat batch besar permintaan API untuk pemrosesan asinkron. Batch API mengembalikan penyelesaian dalam waktu 24 jam untuk diskon 50%.
API Batch diakses melalui OpenAIClient.BatchesEndpoint
Sebutkan batch organisasi Anda.
using var api = new OpenAIClient ( ) ;
var batches = await api . BatchEndpoint . ListBatchesAsync ( ) ;
foreach ( var batch in listResponse . Items )
{
Console . WriteLine ( batch ) ;
} Membuat dan mengeksekusi batch dari file permintaan yang diunggah
using var api = new OpenAIClient ( ) ;
var batchRequest = new CreateBatchRequest ( " file-id " , Endpoint . ChatCompletions ) ;
var batch = await api . BatchEndpoint . CreateBatchAsync ( batchRequest ) ; Mengambil batch.
using var api = new OpenAIClient ( ) ;
var batch = await api . BatchEndpoint . RetrieveBatchAsync ( " batch-id " ) ;
// you can also use convenience methods!
batch = await batch . UpdateAsync ( ) ;
batch = await batch . WaitForStatusChangeAsync ( ) ; Membatalkan batch yang sedang dalam proses. Batch akan dalam pembatalan status hingga 10 menit, sebelum berubah menjadi dibatalkan, di mana ia akan memiliki hasil parsial (jika ada) yang tersedia dalam file output.
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . BatchEndpoint . CancelBatchAsync ( batch ) ;
Assert . IsTrue ( isCancelled ) ;Dapatkan representasi vektor dari input yang diberikan yang dapat dengan mudah dikonsumsi oleh model pembelajaran mesin dan algoritma.
Panduan Terkait: Embeddings
API Edits diakses melalui OpenAIClient.EmbeddingsEndpoint
Membuat vektor embedding yang mewakili teks input.
using var api = new OpenAIClient ( ) ;
var response = await api . EmbeddingsEndpoint . CreateEmbeddingAsync ( " The food was delicious and the waiter... " , Models . Embedding_Ada_002 ) ;
Console . WriteLine ( response ) ;Diberi teks input, output jika model mengklasifikasikannya sebagai melanggar kebijakan konten OpenAI.
Panduan Terkait: Moderasi
API Moderasi dapat diakses melalui OpenAIClient.ModerationsEndpoint
Mengklasifikasikan apakah teks melanggar kebijakan konten Openai.
using var api = new OpenAIClient ( ) ;
var isViolation = await api . ModerationsEndpoint . GetModerationAsync ( " I want to kill them. " ) ;
Assert . IsTrue ( isViolation ) ;Selain itu, Anda juga bisa mendapatkan skor dari input yang diberikan.
using var api = new OpenAIClient ( ) ;
var response = await api . ModerationsEndpoint . CreateModerationAsync ( new ModerationsRequest ( " I love you " ) ) ;
Assert . IsNotNull ( response ) ;
Console . WriteLine ( response . Results ? [ 0 ] ? . Scores ? . ToString ( ) ) ;