ไลบรารีไคลเอนต์ C# .NET ที่เรียบง่ายสำหรับ OpenAI เพื่อใช้แม้ว่า API ที่เหลือของพวกเขา พัฒนาอย่างอิสระนี่ไม่ใช่ห้องสมุดอย่างเป็นทางการและฉันไม่ได้เป็นพันธมิตรกับ Openai ต้องมีบัญชี OpenAI API
เดิมทีแยกจาก Openai-Api-Dotnet บริบทเพิ่มเติมเกี่ยวกับบล็อกของ Roger Pincombe
ติดตั้งแพ็คเกจ OpenAI-DotNet จาก NUGET นี่คือวิธีผ่านบรรทัดคำสั่ง:
PowerShell:
Install-Package OpenAI-DotNet
dotnet:
dotnet add package OpenAI-DotNet
กำลังมองหาการใช้ Openai-Dotnet ใน Unity Game Engine หรือไม่? ตรวจสอบแพ็คเกจ Unity ของเราบน OpenUPM:
ตรวจสอบเอกสาร API ใหม่ของเรา!
https://rageagainstthepixel.github.io/openai-dotnet
มี 3 วิธีในการจัดหาคีย์ API ของคุณตามลำดับความสำคัญ:
คำเตือน
เราแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อโหลดคีย์ API แทนที่จะให้รหัสยากในแหล่งที่มาของคุณ ไม่แนะนำให้ใช้วิธีนี้ในการผลิต แต่สำหรับการยอมรับข้อมูลรับรองผู้ใช้การทดสอบในท้องถิ่นและสถานการณ์เริ่มต้นอย่างรวดเร็ว
คำเตือน
เราแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อโหลดคีย์ API แทนที่จะให้รหัสยากในแหล่งที่มาของคุณ ไม่แนะนำให้ใช้วิธีนี้ในการผลิต แต่สำหรับการยอมรับข้อมูลรับรองผู้ใช้การทดสอบในท้องถิ่นและสถานการณ์เริ่มต้นอย่างรวดเร็ว
using var api = new OpenAIClient ( " sk-apiKey " ) ; หรือสร้างวัตถุ OpenAIAuthentication ด้วยตนเอง
using var api = new OpenAIClient ( new OpenAIAuthentication ( " sk-apiKey " , " org-yourOrganizationId " , " proj_yourProjectId " ) ) ; พยายามโหลดคีย์ API จากไฟล์การกำหนดค่าโดยค่าเริ่มต้น .openai ในไดเรกทอรีปัจจุบันโดยเลือกข้ามแผนผังไดเรกทอรีหรือในไดเรกทอรีบ้านของผู้ใช้
ในการสร้างไฟล์การกำหนดค่าให้สร้างไฟล์ข้อความใหม่ชื่อ .openai และมีบรรทัด:
บันทึก
รายการรหัสองค์กรและโครงการเป็นทางเลือก
{
"apiKey" : " sk-aaaabbbbbccccddddd " ,
"organizationId" : " org-yourOrganizationId " ,
"projectId" : " proj_yourProjectId "
}OPENAI_API_KEY=sk-aaaabbbbbccccddddd
OPENAI_ORGANIZATION_ID=org-yourOrganizationId
OPENAI_PROJECT_ID=proj_yourProjectId นอกจากนี้คุณยังสามารถโหลดไฟล์การกำหนดค่าได้โดยตรงด้วยเส้นทางที่รู้จักโดยเรียกวิธีการคงที่ใน OpenAIAuthentication :
.openai config ในไดเรกทอรีที่ระบุ: using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromDirectory ( " path/to/your/directory " ) ) ;.openai ตราบเท่าที่มันสอดคล้องกับรูปแบบ JSON: using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromPath ( " path/to/your/file.json " ) ) ; ใช้ตัวแปรสภาพแวดล้อมของระบบของคุณระบุคีย์ API และองค์กรที่จะใช้
OPENAI_API_KEY สำหรับคีย์ API ของคุณOPENAI_ORGANIZATION_ID เพื่อระบุองค์กรOPENAI_PROJECT_ID เพื่อระบุโครงการ using var api = new OpenAIClient ( OpenAIAuthentication . LoadFromEnv ( ) ) ; OpenAIClient ใช้ IDisposable เพื่อจัดการวงจรชีวิตของทรัพยากรที่ใช้รวมถึง HttpClient เมื่อคุณเริ่มต้น OpenAIClient มันจะสร้างอินสแตนซ์ HttpClient ภายในหากไม่มีการจัดเตรียม HttpClient ภายในนี้จะถูกกำจัดเมื่อ OpenAIClient ถูกกำจัด หากคุณให้อินสแตนซ์ HttpClient ภายนอกแก่ OpenAIClient คุณจะต้องรับผิดชอบในการจัดการการกำจัด
OpenAIClient สร้าง HttpClient ของตัวเองมันจะดูแลการกำจัดเมื่อคุณกำจัด OpenAIClientHttpClient ภายนอกถูกส่งผ่านไปยัง OpenAIClient มันจะไม่ถูกกำจัดโดย OpenAIClient คุณต้องจัดการการกำจัด HttpClient ด้วยตัวเอง โปรดตรวจสอบให้แน่ใจว่ามีการกำจัด OpenAIClient อย่างเหมาะสมเพื่อปล่อยทรัพยากรที่เหมาะสมและเพื่อป้องกันการรั่วไหลของหน่วยความจำหรือทรัพยากรที่อาจเกิดขึ้นในแอปพลิเคชันของคุณ
การใช้งานทั่วไปด้วย HttpClient ภายใน:
using var api = new OpenAIClient ( ) ; HttpClient ที่กำหนดเอง (ซึ่งคุณต้องกำจัดตัวเอง):
using var customHttpClient = new HttpClient ( ) ;
// set custom http client properties here
var api = new OpenAIClient ( client : customHttpClient ) ;นอกจากนี้คุณยังสามารถเลือกใช้การปรับใช้ Azure Openai ของ Microsoft ได้เช่นกัน
คุณสามารถค้นหาข้อมูลที่จำเป็นในสนามเด็กเล่น Azure ได้โดยคลิกที่ปุ่ม View Code และดู URL เช่นนี้:
https://{your-resource-name}.openai.azure.com/openai/deployments/{deployment-id}/chat/completions?api-version={api-version}your-resource-name ทรัพยากร Azure OpenAI ของคุณdeployment-id ชื่อการปรับใช้ที่คุณเลือกเมื่อคุณปรับใช้โมเดลapi-version เวอร์ชัน API เพื่อใช้สำหรับการดำเนินการนี้ สิ่งนี้เป็นไปตามรูปแบบ YYYY-MM-DD ในการตั้งค่าไคลเอนต์เพื่อใช้การปรับใช้ของคุณคุณจะต้องผ่าน OpenAIClientSettings ไปยังตัวสร้างไคลเอนต์
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 ) ; รับรองความถูกต้องด้วย MSAL ตามปกติและรับโทเค็นการเข้าถึงจากนั้นใช้โทเค็นการเข้าถึงเมื่อสร้าง OpenAIAuthentication ของคุณ จากนั้นให้แน่ใจว่าได้ตั้งค่า useazureactivedirectory ให้เป็นจริงเมื่อสร้าง OpenAIClientSettings ของคุณ
บทช่วยสอน: แอพเดสก์ท็อปที่เรียกเว็บ API: รับโทเค็น
// 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 ) ;การใช้แพ็คเกจ OpenAI-DOTNET หรือ COM.OPENAI.UNITY โดยตรงในแอพส่วนหน้าของคุณอาจเปิดเผยปุ่ม API และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณ เพื่อลดความเสี่ยงนี้ขอแนะนำให้ตั้งค่า API ระดับกลางที่ให้การร้องขอ OpenAI ในนามของแอพส่วนหน้าของคุณ ห้องสมุดนี้สามารถใช้สำหรับการกำหนดค่าโฮสต์ทั้งด้านหน้าและตัวกลางเพื่อให้มั่นใจว่าการสื่อสารที่ปลอดภัยกับ OpenAI API
ในตัวอย่างด้านหน้าคุณจะต้องตรวจสอบสิทธิ์ผู้ใช้ของคุณอย่างปลอดภัยโดยใช้ผู้ให้บริการ OAuth ที่คุณต้องการ เมื่อผู้ใช้ได้รับการรับรองความถูกต้องแล้วให้แลกเปลี่ยนโทเค็นการรับรองความถูกต้องของคุณด้วยคีย์ API ของคุณบนแบ็กเอนด์
ทำตามขั้นตอนเหล่านี้:
OpenAIAuthentication ใหม่และส่งต่อในโทเค็นที่กำหนดเองด้วยคำนำหน้า sess-OpenAIClientSettings ใหม่และระบุโดเมนที่ API ระดับกลางของคุณตั้งอยู่auth และ settings ใหม่ของคุณไปยัง OpenAIClient Constructor เมื่อคุณสร้างอินสแตนซ์ไคลเอนต์นี่คือตัวอย่างของวิธีการตั้งค่าส่วนหน้า:
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 ) ;การตั้งค่านี้ช่วยให้แอปพลิเคชันส่วนหน้าของคุณสามารถสื่อสารกับแบ็กเอนด์ของคุณได้อย่างปลอดภัยซึ่งจะใช้ Openai-Dotnet-Proxy ซึ่งจะส่งต่อการร้องขอไปยัง OpenAI API สิ่งนี้ทำให้มั่นใจได้ว่าคีย์ OpenAI API ของคุณและข้อมูลที่ละเอียดอ่อนอื่น ๆ ยังคงปลอดภัยตลอดกระบวนการ
ในตัวอย่างนี้เราสาธิตวิธีการตั้งค่าและใช้ OpenAIProxy ในแอป ASP.NET Core Web ใหม่ พร็อกซีเซิร์ฟเวอร์จะจัดการการรับรองความถูกต้องและส่งต่อไปยัง OpenAI API เพื่อให้มั่นใจว่าคีย์ API ของคุณและข้อมูลที่ละเอียดอ่อนอื่น ๆ ยังคงปลอดภัย
Install-Package OpenAI-DotNet-Proxydotnet add package OpenAI-DotNet-Proxy<PackageReference Include="OpenAI-DotNet-Proxy" />AbstractAuthenticationFilter และแทนที่วิธีการ ValidateAuthentication สิ่งนี้จะใช้ IAuthenticationFilter ที่คุณจะใช้เพื่อตรวจสอบโทเค็นเซสชันผู้ใช้กับเซิร์ฟเวอร์ภายในของคุณProgram.cs สร้างแอปพลิเคชันเว็บพร็อกซีใหม่โดยเรียกใช้วิธี OpenAIProxy.CreateWebApplication ผ่าน AuthenticationFilter ของคุณเองเป็นอาร์กิวเมนต์ประเภทOpenAIAuthentication และ OpenAIClientSettings ตามปกติด้วยคีย์ API ของคุณ org id หรือการตั้งค่า 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 ( ) ;
}
}เมื่อคุณตั้งค่าพร็อกซีเซิร์ฟเวอร์ของคุณแล้วผู้ใช้ปลายทางของคุณสามารถทำการร้องขอการรับรองความถูกต้องไปยังพร็อกซี API ของคุณแทน OpenAI API โดยตรง พร็อกซีเซิร์ฟเวอร์จะจัดการการรับรองความถูกต้องและส่งต่อไปยัง OpenAI API เพื่อให้มั่นใจว่าคีย์ API ของคุณและข้อมูลที่ละเอียดอ่อนอื่น ๆ ยังคงปลอดภัย
แสดงรายการและอธิบายโมเดลต่าง ๆ ที่มีอยู่ใน API คุณสามารถอ้างถึงเอกสารโมเดลเพื่อทำความเข้าใจว่ามีโมเดลใดบ้างและความแตกต่างระหว่างพวกเขา
นอกจากนี้ยังตรวจสอบความเข้ากันได้ของจุดสิ้นสุดรุ่นเพื่อทำความเข้าใจว่าโมเดลใดทำงานกับจุดสิ้นสุดใด
ในการระบุโมเดลที่กำหนดเองที่ไม่ได้กำหนดไว้ล่วงหน้าในไลบรารีนี้:
var model = new Model ( " model-id " ) ; Models API สามารถเข้าถึงได้ผ่าน OpenAIClient.ModelsEndpoint
แสดงรายการรุ่นที่มีอยู่ในปัจจุบันและให้ข้อมูลพื้นฐานเกี่ยวกับแต่ละรายการเช่นเจ้าของและความพร้อมใช้งาน
using var api = new OpenAIClient ( ) ;
var models = await api . ModelsEndpoint . GetModelsAsync ( ) ;
foreach ( var model in models )
{
Console . WriteLine ( model . ToString ( ) ) ;
} ดึงอินสแตนซ์แบบจำลองโดยให้ข้อมูลพื้นฐานเกี่ยวกับโมเดลเช่นเจ้าของและสิทธิ์
using var api = new OpenAIClient ( ) ;
var model = await api . ModelsEndpoint . GetModelDetailsAsync ( " gpt-4o " ) ;
Console . WriteLine ( model . ToString ( ) ) ; ลบโมเดลที่ปรับจูน คุณต้องมีบทบาทเจ้าของในองค์กรของคุณ
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . ModelsEndpoint . DeleteFineTuneModelAsync ( " your-fine-tuned-model " ) ;
Assert . IsTrue ( isDeleted ) ;คำเตือน
คุณสมบัติเบต้า API อาจมีการเปลี่ยนแปลง
API เรียลไทม์ช่วยให้คุณสามารถสร้างประสบการณ์การสนทนาที่มีความยาวต่ำและมีหลายโหมด ปัจจุบันรองรับข้อความและเสียงเป็นทั้งอินพุตและเอาต์พุตรวมถึงการเรียกใช้ฟังก์ชัน
ผู้ช่วย API สามารถเข้าถึงได้ผ่าน OpenAIClient.RealtimeEndpoint
นี่คือตัวอย่างง่ายๆของวิธีการสร้างเซสชันเรียลไทม์และเพื่อส่งและรับข้อความจากโมเดล
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 ;
}
} ไลบรารีใช้อินเตอร์เฟส IClientEvent สำหรับการส่งไคลเอนต์ที่ส่งออกไป
UpdateSessionRequest : อัปเดตเซสชันด้วยตัวเลือกเซสชันใหม่InputAudioBufferAppendRequest : ผนวกเสียงเข้ากับบัฟเฟอร์เสียงอินพุต (ไม่เหมือนกับเหตุการณ์ไคลเอนต์อื่น ๆ เซิร์ฟเวอร์จะไม่ส่งการตอบสนองการยืนยันไปยังเหตุการณ์นี้)InputAudioBufferCommitRequest : ส่งบัฟเฟอร์เสียงอินพุต (เมื่ออยู่ในโหมดเซิร์ฟเวอร์ VAD ไคลเอนต์ไม่จำเป็นต้องส่งเหตุการณ์นี้)InputAudioBufferClearRequest : ล้างบัฟเฟอร์เสียงอินพุตConversationItemCreateRequest : สร้างรายการสนทนาใหม่ นี่เป็นวิธีหลักในการส่งเนื้อหาผู้ใช้ไปยังรุ่นConversationItemTruncateRequest : ส่งกิจกรรมนี้เพื่อตัดทอนเสียงของผู้ช่วยคนก่อนหน้าConversationItemDeleteRequest : ลบรายการสนทนา สิ่งนี้มีประโยชน์เมื่อคุณต้องการลบข้อความจากประวัติการสนทนาCreateResponseRequest : สร้างการตอบสนองจากโมเดล ส่งเหตุการณ์นี้หลังจากสร้างรายการสนทนาใหม่หรือเรียกใช้การโทรเครื่องมือ สิ่งนี้จะทำให้โมเดลสร้างการตอบสนองResponseCancelRequest -ส่งเหตุการณ์นี้เพื่อยกเลิกการตอบกลับที่กำลังดำเนินการอยู่ คุณสามารถส่งเหตุการณ์ไคลเอนต์ได้ตลอดเวลาไปยังเซิร์ฟเวอร์โดยเรียกใช้วิธี RealtimeSession.SendAsync บนวัตถุเซสชัน การโทรส่งจะส่งคืนการจัดการ IServerEvent ที่ดีที่สุดแสดงถึงการตอบสนองที่เหมาะสมจากเซิร์ฟเวอร์สำหรับเหตุการณ์นั้น สิ่งนี้มีประโยชน์หากคุณต้องการจัดการการตอบสนองของเซิร์ฟเวอร์ด้วยวิธีที่ละเอียดยิ่งขึ้น
แม้ว่าคุณอาจต้องการจัดการการตอบสนองของเซิร์ฟเวอร์ทั้งหมดด้วย RealtimeSession.ReceiveUpdatesAsync
บันทึก
เซิร์ฟเวอร์จะไม่ส่งการตอบสนองการยืนยันไปยังเหตุการณ์ InputAudioBufferAppendRequest
สำคัญ
คุณจะต้องส่ง CreateResponseRequest เพื่อเรียกใช้โมเดลเพื่อสร้างการตอบกลับ
var serverEvent = await session . SendAsync ( new ConversationItemCreateRequest ( " Hello! " ) ) ;
Console . WriteLine ( serverEvent . ToJsonString ( ) ) ;
serverEvent = await session . SendAsync ( new CreateResponseRequest ( ) ) ;
Console . WriteLine ( serverEvent . ToJsonString ( ) ) ; ไลบรารีใช้อินเตอร์เฟส IServerEvent สำหรับเซิร์ฟเวอร์ที่ส่งเหตุการณ์ที่ส่งมา
RealtimeEventError : ส่งคืนเมื่อเกิดข้อผิดพลาดซึ่งอาจเป็นปัญหาไคลเอนต์หรือปัญหาเซิร์ฟเวอร์SessionResponse : ส่งคืนสำหรับทั้งสอง session.created created และ session.updated เหตุการณ์RealtimeConversationResponse : ส่งคืนเมื่อมีการสร้างรายการสนทนาใหม่ConversationItemCreatedResponse : ส่งคืนเมื่อมีการสร้างรายการสนทนาใหม่ConversationItemInputAudioTranscriptionResponse : ส่งคืนเมื่อการถอดรหัสเสียงอินพุตเสร็จสมบูรณ์หรือล้มเหลวConversationItemTruncatedResponse : ส่งคืนเมื่อรายการสนทนาถูกตัดทอนConversationItemDeletedResponse : ส่งคืนเมื่อลบรายการสนทนาInputAudioBufferCommittedResponse : ส่งคืนเมื่อมีการกระทำบัฟเฟอร์เสียงอินพุตไม่ว่าจะโดยไคลเอนต์หรือโดยอัตโนมัติในโหมดเซิร์ฟเวอร์ VADInputAudioBufferClearedResponse : ส่งคืนเมื่อล้างบัฟเฟอร์เสียงอินพุตInputAudioBufferStartedResponse : ส่งโดยเซิร์ฟเวอร์เมื่ออยู่ในโหมด Server_vad เพื่อระบุว่าคำพูดถูกตรวจพบในบัฟเฟอร์เสียง สิ่งนี้สามารถเกิดขึ้นได้ทุกเวลาที่เพิ่มเสียงลงในบัฟเฟอร์ (เว้นแต่จะตรวจพบคำพูดแล้ว) ลูกค้าอาจต้องการใช้กิจกรรมนี้เพื่อขัดจังหวะการเล่นเสียงหรือให้ข้อเสนอแนะด้วยภาพแก่ผู้ใช้InputAudioBufferStoppedResponse : ส่งคืนในโหมด server_vad เมื่อเซิร์ฟเวอร์ตรวจจับการสิ้นสุดของคำพูดในบัฟเฟอร์เสียงRealtimeResponse : ส่งคืนเมื่อการตอบกลับถูกสร้างหรือทำResponseOutputItemResponse : ส่งคืนเมื่อมีการเพิ่มหรือทำรายการตอบกลับResponseContentPartResponse : ส่งคืนเมื่อมีการเพิ่มหรือทำส่วนเนื้อหาการตอบกลับResponseTextResponse : ส่งคืนเมื่อข้อความตอบกลับได้รับการอัปเดตหรือทำResponseAudioTranscriptResponse : ส่งคืนเมื่อมีการอัพเดตหรือทำบันทึกเสียงตอบกลับResponseAudioResponse : ส่งคืนเมื่อมีการอัปเดตหรือทำเสียงตอบกลับResponseFunctionCallArgumentsResponse : ส่งคืนเมื่ออาร์กิวเมนต์การเรียกใช้ฟังก์ชั่นการตอบกลับได้รับการอัปเดตหรือทำRateLimitsResponse : ส่งคืนเมื่อมีการอัพเดทอัตราการ จำกัด อัตรา ในการรับเหตุการณ์เซิร์ฟเวอร์คุณจะต้องโทรหาวิธี RealtimeSession.ReceiveUpdatesAsync บนวัตถุเซสชัน วิธีนี้จะส่งคืน Task หรือ IAsyncEnumerable<T> ที่จะเสร็จสมบูรณ์เมื่อเซสชันถูกปิดหรือเมื่อโทเค็นยกเลิกถูกเรียกใช้ วิธีการนี้ควรเรียกว่าครั้งเดียวและทำงานในช่วงระยะเวลาของเซสชัน
บันทึก
นอกจากนี้คุณยังสามารถรับการเรียกกลับ IClientEvent ได้เช่นกันโดยใช้อินเตอร์เฟส IRealtimeEvent แทน 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 ;
}
}คำเตือน
คุณสมบัติเบต้า API อาจมีการเปลี่ยนแปลง
สร้างผู้ช่วยที่สามารถโทรแบบจำลองและใช้เครื่องมือในการทำงาน
ผู้ช่วย API สามารถเข้าถึงได้ผ่าน OpenAIClient.AssistantsEndpoint
ส่งคืนรายชื่อผู้ช่วย
using var api = new OpenAIClient ( ) ;
var assistantsList = await api . AssistantsEndpoint . ListAssistantsAsync ( ) ;
foreach ( var assistant in assistantsList . Items )
{
Console . WriteLine ( $" { assistant } -> { assistant . CreatedAt } " ) ;
} สร้างผู้ช่วยด้วยแบบจำลองและคำแนะนำ
using var api = new OpenAIClient ( ) ;
var request = new CreateAssistantRequest ( Model . GPT4o ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync ( request ) ; ดึงผู้ช่วย
using var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . RetrieveAssistantAsync ( " assistant-id " ) ;
Console . WriteLine ( $" { assistant } -> { assistant . CreatedAt } " ) ; ปรับเปลี่ยนผู้ช่วย
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 ) ; ลบผู้ช่วย
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 ) ; บันทึก
ผู้ช่วยเหตุการณ์สตรีมสามารถเพิ่มได้อย่างง่ายดายในการโทรเธรดที่มีอยู่โดยผ่าน Func<IServerSentEvent, Task> streamEventHandler Callback ไปยังวิธีใด ๆ ที่มีอยู่ที่รองรับการสตรีม
สร้างเธรดที่ผู้ช่วยสามารถโต้ตอบกับ
เธรด API สามารถเข้าถึงได้ผ่าน OpenAIClient.ThreadsEndpoint
สร้างเธรด
using var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
Console . WriteLine ( $" Create thread { thread . Id } -> { thread . CreatedAt } " ) ; สร้างเธรดและเรียกใช้ในคำขอเดียว
ดูเพิ่มเติม: เธรดรัน
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 } " ) ; สร้างเธรดและเรียกใช้ในคำขอเดียวในขณะที่สตรีมเหตุการณ์
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 ( ) } " ) ;
} ดึงเธรด
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 } " ) ; ปรับเปลี่ยนเธรด
หมายเหตุ: เฉพาะข้อมูลเมตาเท่านั้นที่สามารถแก้ไขได้
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 " ] } " ) ; ลบเธรด
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 ) ; สร้างข้อความภายในเธรด
ส่งคืนรายการข้อความสำหรับเธรดที่กำหนด
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 ( ) } " ) ;
} สร้างข้อความ
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 ( ) } " ) ; ดึงข้อความ
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 ( ) } " ) ; แก้ไขข้อความ
หมายเหตุ: เฉพาะข้อมูลเมตาของข้อความเท่านั้นที่สามารถแก้ไขได้
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 " ] } " ) ; หมายถึงการดำเนินการทำงานบนเธรด
ส่งคืนรายการการรันที่เป็นของเธรด
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 } " ) ;
} สร้างการวิ่ง
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 } " ) ; สร้างการเรียกใช้และสตรีมเหตุการณ์
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 ( ) } " ) ;
} เรียกใช้การวิ่ง
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 } " ) ; ปรับเปลี่ยนการวิ่ง
หมายเหตุ: เฉพาะข้อมูลเมตาเท่านั้นที่สามารถแก้ไขได้
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 " ] } " ) ; เมื่อการเรียกใช้มีสถานะ: requires_action และ required_action.type คือ submit_tool_outputs จุดสิ้นสุดนี้สามารถใช้เพื่อส่งเอาต์พุตจากการโทรเครื่องมือเมื่อเสร็จสมบูรณ์ทั้งหมด เอาต์พุตทั้งหมดจะต้องส่งในคำขอเดียว
บันทึก
ดูสร้างเธรดและเรียกใช้ตัวอย่างการสตรีมเกี่ยวกับวิธีการสตรีมเหตุการณ์เอาต์พุตของเครื่องมือ
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 ( ) } " ) ;
} เอาต์พุตที่มีโครงสร้างคือวิวัฒนาการของโหมด JSON ในขณะที่ทั้งคู่ตรวจสอบให้แน่ใจว่ามีการผลิต JSON ที่ถูกต้อง แต่มีเพียงการจัดโครงสร้างผลลัพธ์เท่านั้นที่ทำให้มั่นใจได้ว่าสคีมา
สำคัญ
finish_reason คือความยาวซึ่งบ่งชี้ว่าการสร้างเกิน max_tokens หรือการสนทนาเกินขีด จำกัด โทเค็น เพื่อป้องกันสิ่งนี้ให้ตรวจสอบ finish_reason ก่อนที่จะแยกวิเคราะห์การตอบกลับก่อนกำหนดโครงสร้างของการตอบสนองของคุณ สิ่งเหล่านี้จะถูกใช้เป็นสคีมาของคุณ นี่คือวัตถุที่คุณจะได้รับดังนั้นโปรดใช้โมเดลวัตถุ JSON มาตรฐาน
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 ; }
} หากต้องการใช้เพียงแค่ระบุประเภท MathResponse เป็นข้อ จำกัด ทั่วไปใน CreateAssistantAsync , CreateRunAsync หรือ 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 ) ;
}
}นอกจากนี้คุณยังสามารถสร้างสตริง JSON Schema JSON ด้วยตนเองได้เช่นกัน แต่คุณจะต้องรับผิดชอบในการ deserializing ข้อมูลการตอบกลับของคุณ:
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 ) ;
}
} ส่งคืนรายการขั้นตอนการรันที่เป็นของการวิ่ง
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 } " ) ;
} ดึงขั้นตอนการเรียกใช้
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 } " ) ; ยกเลิกการเรียกใช้ที่ 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 ) ; การจัดเก็บเวกเตอร์ใช้เพื่อจัดเก็บไฟล์เพื่อใช้งานโดยเครื่องมือ file_search
Vector Stores API สามารถเข้าถึงได้ผ่าน OpenAIClient.VectorStoresEndpoint
ส่งคืนรายชื่อร้านค้าเวกเตอร์
using var api = new OpenAIClient ( ) ;
var vectorStores = await api . VectorStoresEndpoint . ListVectorStoresAsync ( ) ;
foreach ( var vectorStore in vectorStores . Items )
{
Console . WriteLine ( vectorStore ) ;
} สร้างร้านค้าเวกเตอร์
using var api = new OpenAIClient ( ) ;
var createVectorStoreRequest = new CreateVectorStoreRequest ( " test-vector-store " ) ;
var vectorStore = await api . VectorStoresEndpoint . CreateVectorStoreAsync ( createVectorStoreRequest ) ;
Console . WriteLine ( vectorStore ) ; ดึงร้านค้าเวกเตอร์
using var api = new OpenAIClient ( ) ;
var vectorStore = await api . VectorStoresEndpoint . GetVectorStoreAsync ( " vector-store-id " ) ;
Console . WriteLine ( vectorStore ) ; ปรับเปลี่ยนร้านค้าเวกเตอร์
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 ) ; ลบร้านค้าเวกเตอร์
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreAsync ( " vector-store-id " ) ;
Assert . IsTrue ( isDeleted ) ; ไฟล์ vector store แสดงไฟล์ภายในร้านค้าเวกเตอร์
ส่งคืนรายการไฟล์ vector store
using var api = new OpenAIClient ( ) ;
var files = await api . VectorStoresEndpoint . ListVectorStoreFilesAsync ( " vector-store-id " ) ;
foreach ( var file in vectorStoreFiles . Items )
{
Console . WriteLine ( file ) ;
} สร้างไฟล์ vector store โดยแนบไฟล์ไปยังที่เก็บเวกเตอร์
using var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . CreateVectorStoreFileAsync ( " vector-store-id " , " file-id " , new ChunkingStrategy ( ChunkingStrategyType . Static ) ) ;
Console . WriteLine ( file ) ; ดึงไฟล์ร้านค้าเวกเตอร์
using var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . GetVectorStoreFileAsync ( " vector-store-id " , " vector-store-file-id " ) ;
Console . WriteLine ( file ) ; ลบไฟล์ vector store สิ่งนี้จะลบไฟล์ออกจากร้านค้าเวกเตอร์ แต่ตัวเองจะไม่ถูกลบ ในการลบไฟล์ให้ใช้จุดสิ้นสุดไฟล์ลบ
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreFileAsync ( " vector-store-id " , vectorStoreFile ) ;
Assert . IsTrue ( isDeleted ) ; ไฟล์ vector store แสดงไฟล์ภายในร้านค้าเวกเตอร์
สร้างชุดไฟล์ Vector Store
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 ) ; ดึงชุดไฟล์ Vector Store
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 ( ) ; ส่งคืนรายการไฟล์ vector store ในแบทช์
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 ) ;
} ยกเลิกแบทช์ไฟล์ Vector Store ความพยายามที่จะยกเลิกการประมวลผลไฟล์ในชุดนี้โดยเร็วที่สุด
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . VectorStoresEndpoint . CancelVectorStoreFileBatchAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;ด้วยการสนทนาการแชทโมเดลจะส่งคืนการตอบกลับการแชท
API แชทสามารถเข้าถึงได้ผ่าน OpenAIClient.ChatEndpoint
สร้างความสมบูรณ์สำหรับข้อความแชท
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 } " ) ; หรือถ้าใช้ 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. คำเตือน
คุณสมบัติเบต้า API อาจมีการเปลี่ยนแปลง
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 วิวัฒนาการของโหมด JSON ในขณะที่ทั้งคู่ตรวจสอบให้แน่ใจว่ามีการผลิต JSON ที่ถูกต้อง แต่มีเพียงการจัดโครงสร้างผลลัพธ์เท่านั้นที่ทำให้มั่นใจได้ว่าสคีมา
สำคัญ
finish_reason คือความยาวซึ่งบ่งชี้ว่าการสร้างเกิน max_tokens หรือการสนทนาเกินขีด จำกัด โทเค็น เพื่อป้องกันสิ่งนี้ให้ตรวจสอบ finish_reason ก่อนที่จะแยกวิเคราะห์การตอบกลับก่อนกำหนดโครงสร้างของการตอบสนองของคุณ สิ่งเหล่านี้จะถูกใช้เป็นสคีมาของคุณ นี่คือวัตถุที่คุณจะได้รับดังนั้นโปรดใช้โมเดลวัตถุ JSON มาตรฐาน
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 ; }
} หากต้องการใช้เพียงแค่ระบุประเภท MathResponse เป็นข้อ จำกัด ทั่วไปเมื่อขอความสำเร็จ
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 ( ) ; สำคัญ
finish_reason คือความยาวซึ่งบ่งชี้ว่าการสร้างเกิน max_tokens หรือการสนทนาเกินขีด จำกัด โทเค็น เพื่อป้องกันสิ่งนี้ให้ตรวจสอบ finish_reason ก่อนที่จะแยกวิเคราะห์การตอบกลับ 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 ( ) ;แปลงเสียงเป็นข้อความ
Audio API สามารถเข้าถึงได้ผ่าน OpenAIClient.AudioEndpoint
สร้างเสียงจากข้อความอินพุต
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 ( ) ) ; ถอดเสียงออกเป็นภาษาอินพุต
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 ) ; นอกจากนี้คุณยังสามารถรับข้อมูลโดยละเอียดโดยใช้ verbose_json เพื่อรับเม็ดละเอียดการประทับเวลา:
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 } " " ) ;
} แปลเสียงเป็นภาษาอังกฤษ
using var api = new OpenAIClient ( ) ;
using var request = new AudioTranslationRequest ( Path . GetFullPath ( audioAssetPath ) ) ;
var response = await api . AudioEndpoint . CreateTranslationTextAsync ( request ) ;
Console . WriteLine ( response ) ;ด้วยภาพแจ้งและ/หรือภาพอินพุตโมเดลจะสร้างภาพใหม่
รูปภาพ API สามารถเข้าถึงได้ผ่าน OpenAIClient.ImagesEndpoint
สร้างภาพที่ได้รับพรอมต์
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
} สร้างภาพที่แก้ไขหรือขยายให้ภาพต้นฉบับและพรอมต์
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
} สร้างรูปแบบของภาพที่กำหนด
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
}ไฟล์ใช้เพื่ออัปโหลดเอกสารที่สามารถใช้กับคุณสมบัติเช่นการปรับแต่ง
ไฟล์ API สามารถเข้าถึงได้ผ่าน OpenAIClient.FilesEndpoint
ส่งคืนรายการไฟล์ที่เป็นขององค์กรของผู้ใช้
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 " ) ;
} อัปโหลดไฟล์ที่สามารถใช้ในจุดสิ้นสุดต่างๆ ขนาดของไฟล์ทั้งหมดที่อัปโหลดโดยองค์กรเดียวสามารถสูงถึง 100 GB
ขนาดของแต่ละไฟล์สามารถสูงสุด 512 MB ดูคู่มือเครื่องมือผู้ช่วยเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับประเภทของไฟล์ที่รองรับ API ที่ปรับแต่งอย่างละเอียดรองรับไฟล์. jsonl เท่านั้น
using var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . UploadFileAsync ( " path/to/your/file.jsonl " , FilePurpose . FineTune ) ;
Console . WriteLine ( file . Id ) ; ลบไฟล์
using var api = new OpenAIClient ( ) ;
var isDeleted = await api . FilesEndpoint . DeleteFileAsync ( fileId ) ;
Assert . IsTrue ( isDeleted ) ; ส่งคืนข้อมูลเกี่ยวกับไฟล์เฉพาะ
using var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . GetFileInfoAsync ( fileId ) ;
Console . WriteLine ( $" { file . Id } -> { file . Object } : { file . FileName } | { file . Size } bytes " ) ; ดาวน์โหลดเนื้อหาไฟล์ไปยังไดเรกทอรีที่ระบุ
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 ) ) ;จัดการงานปรับแต่งเพื่อปรับรูปแบบให้กับข้อมูลการฝึกอบรมเฉพาะของคุณ
คู่มือที่เกี่ยวข้อง: แบบจำลองการปรับแต่ง
ไฟล์ API สามารถเข้าถึงได้ผ่าน OpenAIClient.FineTuningEndpoint
สร้างงานที่ปรับแต่งโมเดลที่ระบุจากชุดข้อมูลที่กำหนด
การตอบสนองรวมถึงรายละเอียดของงานที่ถูกยึดเข้าด้วยกันรวมถึงสถานะงานและชื่อของโมเดลที่ปรับแต่งเมื่อเสร็จสมบูรณ์
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 } " ) ; แสดงรายการงานปรับแต่งขององค์กรของคุณ
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 } " ) ;
} รับข้อมูลเกี่ยวกับงานปรับแต่ง
using var api = new OpenAIClient ( ) ;
var job = await api . FineTuningEndpoint . GetJobInfoAsync ( fineTuneJob ) ;
Console . WriteLine ( $" { job . Id } -> { job . CreatedAt } | { job . Status } " ) ; ยกเลิกงานปรับแต่งทันที
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . FineTuningEndpoint . CancelFineTuneJobAsync ( fineTuneJob ) ;
Assert . IsTrue ( isCancelled ) ; รับการอัปเดตสถานะสำหรับงานปรับแต่ง
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 } " ) ;
}สร้างคำขอ API ขนาดใหญ่สำหรับการประมวลผลแบบอะซิงโครนัส แบทช์ API ส่งคืนความสำเร็จภายใน 24 ชั่วโมงเพื่อรับส่วนลด 50%
Batches API สามารถเข้าถึงได้ผ่าน OpenAIClient.BatchesEndpoint
แสดงรายการแบทช์ขององค์กรของคุณ
using var api = new OpenAIClient ( ) ;
var batches = await api . BatchEndpoint . ListBatchesAsync ( ) ;
foreach ( var batch in listResponse . Items )
{
Console . WriteLine ( batch ) ;
} สร้างและดำเนินการแบทช์จากไฟล์คำขอที่อัปโหลด
using var api = new OpenAIClient ( ) ;
var batchRequest = new CreateBatchRequest ( " file-id " , Endpoint . ChatCompletions ) ;
var batch = await api . BatchEndpoint . CreateBatchAsync ( batchRequest ) ; ดึงชุด
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 ( ) ; ยกเลิกแบทช์ที่กำลังดำเนินอยู่ แบทช์จะอยู่ในสถานะที่ยกเลิกได้นานถึง 10 นาทีก่อนที่จะเปลี่ยนเป็นการยกเลิกซึ่งจะมีผลลัพธ์บางส่วน (ถ้ามี) ในไฟล์เอาต์พุต
using var api = new OpenAIClient ( ) ;
var isCancelled = await api . BatchEndpoint . CancelBatchAsync ( batch ) ;
Assert . IsTrue ( isCancelled ) ;รับการแสดงเวกเตอร์ของอินพุตที่กำหนดซึ่งสามารถใช้งานได้ง่ายโดยรูปแบบการเรียนรู้ของเครื่องและอัลกอริทึม
คู่มือที่เกี่ยวข้อง: Embeddings
การแก้ไข API สามารถเข้าถึงได้ผ่าน OpenAIClient.EmbeddingsEndpoint
สร้างเวกเตอร์ฝังที่แสดงข้อความอินพุต
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 ) ;เมื่อได้รับข้อความอินพุตเอาต์พุตหากโมเดลจัดประเภทว่าเป็นการละเมิดนโยบายเนื้อหาของ OpenAI
คู่มือที่เกี่ยวข้อง: การดูแล
Moderations API สามารถเข้าถึงได้ผ่าน OpenAIClient.ModerationsEndpoint
จำแนกหากข้อความละเมิดนโยบายเนื้อหาของ OpenAI
using var api = new OpenAIClient ( ) ;
var isViolation = await api . ModerationsEndpoint . GetModerationAsync ( " I want to kill them. " ) ;
Assert . IsTrue ( isViolation ) ;นอกจากนี้คุณยังสามารถรับคะแนนของอินพุตที่กำหนด
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 ( ) ) ;