ขึ้นอยู่กับ openai-dotnet
แพ็คเกจ OpenAI สำหรับความสามัคคีที่จะใช้แม้ว่า API ที่พักผ่อนของพวกเขา พัฒนาอย่างอิสระนี่ไม่ใช่ห้องสมุดอย่างเป็นทางการและฉันไม่ได้เป็นพันธมิตรกับ Openai ต้องมีบัญชี OpenAI API
ลิขสิทธิ์เครื่องหมายการค้าโลโก้และสินทรัพย์ทั้งหมดเป็นทรัพย์สินของเจ้าของที่เกี่ยวข้อง
ต้องใช้เอกภาพ 2021.3 LTS หรือสูงกว่า
วิธีการติดตั้งที่แนะนำคือแม้ว่า Unity Package Manager และ OpenUPM
OpenUPMhttps://package.openupm.comcom.openaicom.utilities
My RegistriesOpenAIhttps://github.com/RageAgainstThePixel/com.openai.unity.git#upmหมายเหตุ: repo นี้มีการพึ่งพาที่เก็บอื่น ๆ ! คุณต้องรับผิดชอบในการเพิ่มสิ่งเหล่านี้ด้วยตัวคุณเอง
ตรวจสอบเอกสาร API ใหม่ของเรา!
https://rageagainstthepixel.github.io/openai-dotnet
มี 4 วิธีในการจัดหาคีย์ API ของคุณตามลำดับความสำคัญ:
คำเตือน
เราแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อโหลดคีย์ API แทนที่จะให้รหัสยากในแหล่งที่มาของคุณ ไม่แนะนำให้ใช้วิธีนี้ในการผลิต แต่สำหรับการยอมรับข้อมูลรับรองผู้ใช้การทดสอบในท้องถิ่นและสถานการณ์เริ่มต้นอย่างรวดเร็ว
คุณใช้ OpenAIAuthentication เมื่อคุณเริ่มต้น API ดังที่แสดง:
คำเตือน
เราแนะนำให้ใช้ตัวแปรสภาพแวดล้อมเพื่อโหลดคีย์ API แทนที่จะให้รหัสยากในแหล่งที่มาของคุณ ไม่แนะนำให้ใช้วิธีนี้ในการผลิต แต่สำหรับการยอมรับข้อมูลรับรองผู้ใช้การทดสอบในท้องถิ่นและสถานการณ์เริ่มต้นอย่างรวดเร็ว
var api = new OpenAIClient ( " sk-apiKey " ) ; หรือสร้างวัตถุ OpenAIAuthentication ด้วยตนเอง
var api = new OpenAIClient ( new OpenAIAuthentication ( " sk-apiKey " , " org-yourOrganizationId " , " proj_yourProjectId " ) ) ; คุณสามารถบันทึกคีย์ได้โดยตรงลงในวัตถุสคริปต์ที่อยู่ในโฟลเดอร์ Assets/Resources
คุณสามารถสร้างใหม่ได้โดยใช้เมนูบริบทของบานหน้าต่างโครงการและสร้างวัตถุสคริปต์ OpenAIConfiguration ใหม่
คำเตือน
ระวังการตรวจสอบไฟล์นี้ลงในการควบคุมแหล่งที่มาเนื่องจากคนอื่น ๆ จะสามารถดูคีย์ API ของคุณได้ ขอแนะนำให้ใช้ผู้ใช้ Openai-Dotnet-Proxy และตรวจสอบความถูกต้องกับผู้ให้บริการ OAuth ที่คุณต้องการ

พยายามโหลดคีย์ 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 ในไดเรกทอรีที่ระบุ: var api = new OpenAIClient ( new OpenAIAuthentication ( ) . LoadFromDirectory ( " path/to/your/directory " ) ) ;.openai ตราบเท่าที่มันสอดคล้องกับรูปแบบ JSON: var api = new OpenAIClient ( new OpenAIAuthentication ( ) . LoadFromPath ( " path/to/your/file.json " ) ) ; ใช้ตัวแปรสภาพแวดล้อมของระบบของคุณระบุคีย์ API และองค์กรที่จะใช้
OPENAI_API_KEY สำหรับคีย์ API ของคุณOPENAI_ORGANIZATION_ID เพื่อระบุองค์กรOPENAI_PROJECT_ID เพื่อระบุโครงการ var api = new OpenAIClient ( new OpenAIAuthentication ( ) . LoadFromEnvironment ( ) ) ;นอกจากนี้คุณยังสามารถเลือกใช้การปรับใช้ 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 ในการตั้งค่าไคลเอนต์เพื่อใช้การปรับใช้ของคุณคุณจะต้องผ่าน OpenAISettings ไปยังตัวสร้างไคลเอนต์
var auth = new OpenAIAuthentication ( " sk-apiKey " ) ;
var settings = new OpenAISettings ( resourceName : " your-resource-name " , deploymentId : " deployment-id " , apiVersion : " api-version " ) ;
var api = new OpenAIClient ( auth , settings ) ; รับรองความถูกต้องด้วย MSAL ตามปกติและรับโทเค็นการเข้าถึงจากนั้นใช้โทเค็นการเข้าถึงเมื่อสร้าง OpenAIAuthentication ของคุณ จากนั้นให้แน่ใจว่าได้ตั้งค่า useazureactivedirectory ให้เป็นจริงเมื่อสร้าง OpenAISettings ของคุณ
บทช่วยสอน: แอพเดสก์ท็อปที่เรียกเว็บ API: รับโทเค็น
// get your access token using any of the MSAL methods
var accessToken = result . AccessToken ;
var auth = new OpenAIAuthentication ( accessToken ) ;
var settings = new OpenAISettings ( resourceName : " your-resource " , deploymentId : " deployment-id " , apiVersion : " api-version " , useActiveDirectoryAuthentication : true ) ;
var api = new OpenAIClient ( auth , settings ) ;การใช้แพ็คเกจ OpenAI-DOTNET หรือ COM.OPENAI.UNITY โดยตรงในแอพส่วนหน้าของคุณอาจเปิดเผยปุ่ม API และข้อมูลที่ละเอียดอ่อนอื่น ๆ ของคุณ เพื่อลดความเสี่ยงนี้ขอแนะนำให้ตั้งค่า API ระดับกลางที่ให้การร้องขอ OpenAI ในนามของแอพส่วนหน้าของคุณ ห้องสมุดนี้สามารถใช้สำหรับการกำหนดค่าโฮสต์ทั้งด้านหน้าและตัวกลางเพื่อให้มั่นใจว่าการสื่อสารที่ปลอดภัยกับ OpenAI API
ในตัวอย่างด้านหน้าคุณจะต้องตรวจสอบสิทธิ์ผู้ใช้ของคุณอย่างปลอดภัยโดยใช้ผู้ให้บริการ OAuth ที่คุณต้องการ เมื่อผู้ใช้ได้รับการรับรองความถูกต้องแล้วให้แลกเปลี่ยนโทเค็นการรับรองความถูกต้องของคุณด้วยคีย์ API ของคุณบนแบ็กเอนด์
ทำตามขั้นตอนเหล่านี้:
OpenAIAuthentication ใหม่และส่งต่อในโทเค็นที่กำหนดเองด้วยคำนำหน้า sess-OpenAISettings ใหม่และระบุโดเมนที่ API ระดับกลางของคุณตั้งอยู่auth และ settings ใหม่ของคุณไปยัง OpenAIClient Constructor เมื่อคุณสร้างอินสแตนซ์ไคลเอนต์นี่คือตัวอย่างของวิธีการตั้งค่าส่วนหน้า:
var authToken = await LoginAsync ( ) ;
var auth = new OpenAIAuthentication ( $" sess- { authToken } " ) ;
var settings = new OpenAISettings ( domain : " api.your-custom-domain.com " ) ;
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
แสดงรายการรุ่นที่มีอยู่ในปัจจุบันและให้ข้อมูลพื้นฐานเกี่ยวกับแต่ละรายการเช่นเจ้าของและความพร้อมใช้งาน
var api = new OpenAIClient ( ) ;
var models = await api . ModelsEndpoint . GetModelsAsync ( ) ;
foreach ( var model in models )
{
Debug . Log ( model . ToString ( ) ) ;
} ดึงอินสแตนซ์แบบจำลองโดยให้ข้อมูลพื้นฐานเกี่ยวกับโมเดลเช่นเจ้าของและสิทธิ์
var api = new OpenAIClient ( ) ;
var model = await api . ModelsEndpoint . GetModelDetailsAsync ( " gpt-4o " ) ;
Debug . Log ( model . ToString ( ) ) ; ลบโมเดลที่ปรับจูน คุณต้องมีบทบาทเจ้าของในองค์กรของคุณ
var api = new OpenAIClient ( ) ;
var isDeleted = await api . ModelsEndpoint . DeleteFineTuneModelAsync ( " your-fine-tuned-model " ) ;
Assert . IsTrue ( isDeleted ) ;คำเตือน
คุณสมบัติเบต้า API อาจมีการเปลี่ยนแปลง
API เรียลไทม์ช่วยให้คุณสามารถสร้างประสบการณ์การสนทนาที่มีความยาวต่ำและมีหลายโหมด ปัจจุบันรองรับข้อความและเสียงเป็นทั้งอินพุตและเอาต์พุตรวมถึงการเรียกใช้ฟังก์ชัน
ผู้ช่วย API สามารถเข้าถึงได้ผ่าน OpenAIClient.RealtimeEndpoint
นี่คือตัวอย่างง่ายๆของวิธีการสร้างเซสชันเรียลไทม์และเพื่อส่งและรับข้อความจากโมเดล
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 :
Debug . Log ( 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! " ) ) ;
Debug . Log ( serverEvent . ToJsonString ( ) ) ;
serverEvent = await session . SendAsync ( new CreateResponseRequest ( ) ) ;
Debug . Log ( 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 ที่จะเสร็จสมบูรณ์เมื่อเซสชันถูกปิดหรือเมื่อโทเค็นยกเลิกถูกเรียกใช้ วิธีการนี้ควรเรียกว่าครั้งเดียวและทำงานในช่วงระยะเวลาของเซสชัน
บันทึก
นอกจากนี้คุณยังสามารถรับการเรียกกลับ IClientEvent ได้เช่นกันโดยใช้อินเตอร์เฟส IRealtimeEvent แทน IServerEvent
await session . ReceiveUpdatesAsync < IServerEvent > ( ServerEvents , cancellationTokenSource . Token ) ;
void ServerEvents ( IServerEvent @event )
{
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
ส่งคืนรายชื่อผู้ช่วย
var api = new OpenAIClient ( ) ;
var assistantsList = await api . AssistantsEndpoint . ListAssistantsAsync ( ) ;
foreach ( var assistant in assistantsList . Items )
{
Debug . Log ( $" { assistant } -> { assistant . CreatedAt } " ) ;
} สร้างผู้ช่วยด้วยแบบจำลองและคำแนะนำ
var api = new OpenAIClient ( ) ;
var request = new CreateAssistantRequest ( Model . GPT4o ) ;
var assistant = await api . AssistantsEndpoint . CreateAssistantAsync ( request ) ; ดึงผู้ช่วย
var api = new OpenAIClient ( ) ;
var assistant = await api . AssistantsEndpoint . RetrieveAssistantAsync ( " assistant-id " ) ;
Debug . Log ( $" { assistant } -> { assistant . CreatedAt } " ) ; ปรับเปลี่ยนผู้ช่วย
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 ) ; ลบผู้ช่วย
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
สร้างเธรด
var api = new OpenAIClient ( ) ;
var thread = await api . ThreadsEndpoint . CreateThreadAsync ( ) ;
Debug . Log ( $" Create thread { thread . Id } -> { thread . CreatedAt } " ) ; สร้างเธรดและเรียกใช้ในคำขอเดียว
ดูเพิ่มเติม: เธรดรัน
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 ) ;
Debug . Log ( $" Created thread and run: { run . ThreadId } -> { run . Id } -> { run . CreatedAt } " ) ; สร้างเธรดและเรียกใช้ในคำขอเดียวในขณะที่สตรีมเหตุการณ์
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 )
{
Debug . Log ( $" Tool Output: { toolOutput } " ) ;
}
await runResponse . SubmitToolOutputsAsync ( toolOutputs , StreamEventHandler ) ;
}
break ;
default :
Debug . Log ( 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 ( ) )
{
Debug . Log ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
} ดึงเธรด
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 ( ) ;
Debug . Log ( $" Retrieve thread { thread . Id } -> { thread . CreatedAt } " ) ; ปรับเปลี่ยนเธรด
หมายเหตุ: เฉพาะข้อมูลเมตาเท่านั้นที่สามารถแก้ไขได้
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 ) ;
Debug . Log ( $" Modify thread { thread . Id } -> { thread . Metadata [ " key " ] } " ) ; ลบเธรด
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 ) ; สร้างข้อความภายในเธรด
ส่งคืนรายการข้อความสำหรับเธรดที่กำหนด
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 )
{
Debug . Log ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ;
} สร้างข้อความ
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! " ) ;
Debug . Log ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ; ดึงข้อความ
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 ( ) ;
Debug . Log ( $" { message . Id } : { message . Role } : { message . PrintContent ( ) } " ) ; แก้ไขข้อความ
หมายเหตุ: เฉพาะข้อมูลเมตาของข้อความเท่านั้นที่สามารถแก้ไขได้
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 ) ;
Debug . Log ( $" Modify message metadata: { message . Id } -> { message . Metadata [ " key " ] } " ) ; หมายถึงการดำเนินการทำงานบนเธรด
ส่งคืนรายการการรันที่เป็นของเธรด
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 )
{
Debug . Log ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ;
} สร้างการวิ่ง
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 ) ;
Debug . Log ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ; สร้างการเรียกใช้และสตรีมเหตุการณ์
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 =>
{
Debug . Log ( streamEvent . ToJsonString ( ) ) ;
await Task . CompletedTask ;
} ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items . Reverse ( ) )
{
Debug . Log ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
} เรียกใช้การวิ่ง
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 ( ) ;
Debug . Log ( $" [ { run . Id } ] { run . Status } | { run . CreatedAt } " ) ; ปรับเปลี่ยนการวิ่ง
หมายเหตุ: เฉพาะข้อมูลเมตาเท่านั้นที่สามารถแก้ไขได้
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 ) ;
Debug . Log ( $" Modify run { run . Id } -> { run . Metadata [ " key " ] } " ) ; เมื่อการเรียกใช้มีสถานะ: requires_action และ required_action.type คือ submit_tool_outputs จุดสิ้นสุดนี้สามารถใช้เพื่อส่งเอาต์พุตจากการโทรเครื่องมือเมื่อเสร็จสมบูรณ์ทั้งหมด เอาต์พุตทั้งหมดจะต้องส่งในคำขอเดียว
บันทึก
ดูสร้างเธรดและเรียกใช้ตัวอย่างการสตรีมเกี่ยวกับวิธีการสตรีมเหตุการณ์เอาต์พุตของเครื่องมือ
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 )
{
Debug . Log ( $" 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 ) )
{
Debug . Log ( $" { message . Role } : { message . PrintContent ( ) } " ) ;
} เอาต์พุตที่มีโครงสร้างคือวิวัฒนาการของโหมด JSON ในขณะที่ทั้งคู่ตรวจสอบให้แน่ใจว่ามีการผลิต JSON ที่ถูกต้อง แต่มีเพียงการจัดโครงสร้างผลลัพธ์เท่านั้นที่ทำให้มั่นใจได้ว่าสคีมา
สำคัญ
finish_reason คือความยาวซึ่งบ่งชี้ว่าการสร้างเกิน max_tokens หรือการสนทนาเกินขีด จำกัด โทเค็น เพื่อป้องกันสิ่งนี้ให้ตรวจสอบ finish_reason ก่อนที่จะแยกวิเคราะห์การตอบกลับก่อนกำหนดโครงสร้างของการตอบสนองของคุณ สิ่งเหล่านี้จะถูกใช้เป็นสคีมาของคุณ นี่คือวัตถุที่คุณจะได้รับดังนั้นโปรดใช้โมเดลวัตถุ JSON มาตรฐาน
public class MathResponse
{
[ JsonProperty ( " steps " ) ]
public IReadOnlyList < MathStep > Steps { get ; private set ; }
[ JsonProperty ( " final_answer " ) ]
public string FinalAnswer { get ; private set ; }
}
public class MathStep
{
[ JsonProperty ( " explanation " ) ]
public string Explanation { get ; private set ; }
[ JsonProperty ( " output " ) ]
public string Output { get ; private set ; }
} หากต้องการใช้เพียงแค่ระบุประเภท MathResponse เป็นข้อ จำกัด ทั่วไปใน CreateAssistantAsync , CreateRunAsync หรือ CreateThreadAndRunAsync
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 )
{
Debug . Log ( @event . ToJsonString ( ) ) ;
break ;
}
var mathResponse = message . FromSchema < MathResponse > ( ) ;
for ( var i = 0 ; i < mathResponse . Steps . Count ; i ++ )
{
var step = mathResponse . Steps [ i ] ;
Debug . Log ( $" Step { i } : { step . Explanation } " ) ;
Debug . Log ( $" Result: { step . Output } " ) ;
}
Debug . Log ( $" Final Answer: { mathResponse . FinalAnswer } " ) ;
break ;
default :
Debug . Log ( @event . ToJsonString ( ) ) ;
break ;
}
}
catch ( Exception e )
{
Debug . Log ( 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 ( ) ;
Debug . Log ( $" 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 ) )
{
Debug . Log ( $" { 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 ข้อมูลการตอบกลับของคุณ:
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 =>
{
Debug . Log ( @event . ToJsonString ( ) ) ;
await Task . CompletedTask ;
} ) ;
thread = await run . GetThreadAsync ( ) ;
run = await run . WaitForStatusChangeAsync ( ) ;
Debug . Log ( $" Created thread and run: { run . ThreadId } -> { run . Id } -> { run . CreatedAt } " ) ;
var messages = await thread . ListMessagesAsync ( ) ;
foreach ( var response in messages . Items )
{
Debug . Log ( $" { response . Role } : { response . PrintContent ( ) } " ) ;
}
}
finally
{
await assistant . DeleteAsync ( deleteToolResources : thread == null ) ;
if ( thread != null )
{
var isDeleted = await thread . DeleteAsync ( deleteToolResources : true ) ;
Assert . IsTrue ( isDeleted ) ;
}
} ส่งคืนรายการขั้นตอนการรันที่เป็นของการวิ่ง
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 )
{
Debug . Log ( $" [ { runStep . Id } ] { runStep . Status } { runStep . CreatedAt } -> { runStep . ExpiresAt } " ) ;
} ดึงขั้นตอนการเรียกใช้
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 ( ) ;
Debug . Log ( $" [ { runStep . Id } ] { runStep . Status } { runStep . CreatedAt } -> { runStep . ExpiresAt } " ) ; ยกเลิกการเรียกใช้ที่ in_progress
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
ส่งคืนรายชื่อร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var vectorStores = await api . VectorStoresEndpoint . ListVectorStoresAsync ( ) ;
foreach ( var vectorStore in vectorStores . Items )
{
Debug . Log ( vectorStore ) ;
} สร้างร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var createVectorStoreRequest = new CreateVectorStoreRequest ( " test-vector-store " ) ;
var vectorStore = await api . VectorStoresEndpoint . CreateVectorStoreAsync ( createVectorStoreRequest ) ;
Debug . Log ( vectorStore ) ; ดึงร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var vectorStore = await api . VectorStoresEndpoint . GetVectorStoreAsync ( " vector-store-id " ) ;
Debug . Log ( vectorStore ) ; ปรับเปลี่ยนร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var metadata = new Dictionary < string , object > { { " Test " , DateTime . UtcNow } } ;
var vectorStore = await api . VectorStoresEndpoint . ModifyVectorStoreAsync ( " vector-store-id " , metadata : metadata ) ;
Debug . Log ( vectorStore ) ; ลบร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreAsync ( " vector-store-id " ) ;
Assert . IsTrue ( isDeleted ) ; ไฟล์ vector store แสดงไฟล์ภายในร้านค้าเวกเตอร์
ส่งคืนรายการไฟล์ vector store
var api = new OpenAIClient ( ) ;
var files = await api . VectorStoresEndpoint . ListVectorStoreFilesAsync ( " vector-store-id " ) ;
foreach ( var file in vectorStoreFiles . Items )
{
Debug . Log ( file ) ;
} สร้างไฟล์ vector store โดยแนบไฟล์ไปยังที่เก็บเวกเตอร์
var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . CreateVectorStoreFileAsync ( " vector-store-id " , " file-id " , new ChunkingStrategy ( ChunkingStrategyType . Static ) ) ;
Debug . Log ( file ) ; ดึงไฟล์ร้านค้าเวกเตอร์
var api = new OpenAIClient ( ) ;
var file = await api . VectorStoresEndpoint . GetVectorStoreFileAsync ( " vector-store-id " , " vector-store-file-id " ) ;
Debug . Log ( file ) ; ลบไฟล์ vector store สิ่งนี้จะลบไฟล์ออกจากร้านค้าเวกเตอร์ แต่ตัวเองจะไม่ถูกลบ ในการลบไฟล์ให้ใช้จุดสิ้นสุดไฟล์ลบ
var api = new OpenAIClient ( ) ;
var isDeleted = await api . VectorStoresEndpoint . DeleteVectorStoreFileAsync ( " vector-store-id " , vectorStoreFile ) ;
Assert . IsTrue ( isDeleted ) ; ไฟล์ vector store แสดงไฟล์ภายในร้านค้าเวกเตอร์
สร้างชุดไฟล์ Vector Store
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 ) ;
Debug . Log ( vectorStoreFileBatch ) ; ดึงชุดไฟล์ Vector Store
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 ในแบทช์
var api = new OpenAIClient ( ) ;
var files = await api . VectorStoresEndpoint . ListVectorStoreBatchFilesAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;
foreach ( var file in files . Items )
{
Debug . Log ( file ) ;
} ยกเลิกแบทช์ไฟล์ Vector Store ความพยายามที่จะยกเลิกการประมวลผลไฟล์ในชุดนี้โดยเร็วที่สุด
var api = new OpenAIClient ( ) ;
var isCancelled = await api . VectorStoresEndpoint . CancelVectorStoreFileBatchAsync ( " vector-store-id " , " vector-store-file-batch-id " ) ;ด้วยการสนทนาการแชทโมเดลจะส่งคืนการตอบกลับการแชท
API แชทสามารถเข้าถึงได้ผ่าน OpenAIClient.ChatEndpoint
สร้างความสมบูรณ์สำหรับข้อความแชท
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 ;
Debug . Log ( $" [ { choice . Index } ] { choice . Message . Role } : { choice . Message } | Finish Reason: { choice . FinishReason } " ) ; 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 =>
{
Debug . Log ( partialResponse . FirstChoice . Delta . ToString ( ) ) ;
await Task . CompletedTask ;
} ) ;
var choice = response . FirstChoice ;
Debug . Log ( $" [ { choice . Index } ] { choice . Message . Role } : { choice . Message } | Finish Reason: { choice . FinishReason } " ) ; 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 )
{
Debug . Log ( $" { 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 ) ;
Debug . Log ( $" { 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 ) ;
Debug . Log ( $" { 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 " )
{
Debug . Log ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice } | Finish Reason: { response . FirstChoice . FinishReason } " ) ;
var unitMessage = new Message ( Role . User , " Fahrenheit " ) ;
messages . Add ( unitMessage ) ;
Debug . Log ( $" { 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 )
{
Debug . Log ( $" { response . FirstChoice . Message . Role } : { toolCall . Function . Name } | Finish Reason: { response . FirstChoice . FinishReason } " ) ;
Debug . Log ( $" { 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 ) ) ;
Debug . Log ( $" { 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 อาจมีการเปลี่ยนแปลง
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 ) ;
Debug . Log ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice . Message . Content } | Finish Reason: { response . FirstChoice . FinishDetails } " ) ; คุณยังสามารถผ่าน Texture2D ได้!
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? " ,
texture
} )
} ;
var chatRequest = new ChatRequest ( messages , model : Model . GPT4o ) ;
var result = await api . ChatEndpoint . GetCompletionAsync ( chatRequest ) ;
Debug . Log ( $" { result . FirstChoice . Message . Role } : { result . FirstChoice } | Finish Reason: { result . FirstChoice . FinishDetails } " ) ; 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 ) ;
Debug . Log ( $" { response . FirstChoice . Message . Role } : { response . FirstChoice } | Finish Reason: { response . FirstChoice . FinishDetails } " ) ;
audioSource . PlayOneShot ( response . FirstChoice . Message . AudioOutput . AudioClip ) ; วิวัฒนาการของโหมด JSON ในขณะที่ทั้งคู่ตรวจสอบให้แน่ใจว่ามีการผลิต JSON ที่ถูกต้อง แต่มีเพียงการจัดโครงสร้างผลลัพธ์เท่านั้นที่ทำให้มั่นใจได้ว่าสคีมา
สำคัญ
finish_reason คือความยาวซึ่งบ่งชี้ว่าการสร้างเกิน max_tokens หรือการสนทนาเกินขีด จำกัด โทเค็น เพื่อป้องกันสิ่งนี้ให้ตรวจสอบ finish_reason ก่อนที่จะแยกวิเคราะห์การตอบกลับก่อนกำหนดโครงสร้างของการตอบสนองของคุณ สิ่งเหล่านี้จะถูกใช้เป็นสคีมาของคุณ นี่คือวัตถุที่คุณจะได้รับดังนั้นโปรดใช้โมเดลวัตถุ JSON มาตรฐาน
public class MathResponse
{
[ JsonProperty ( " steps " ) ]
public IReadOnlyList < MathStep > Steps { get ; private set ; }
[ JsonProperty ( " final_answer " ) ]
public string FinalAnswer { get ; private set ; }
}
public class MathStep
{
[ JsonProperty ( " explanation " ) ]
public string Explanation { get ; private set ; }
[ JsonProperty ( " output " ) ]
public string Output { get ; private set ; }
} หากต้องการใช้เพียงแค่ระบุประเภท MathResponse เป็นข้อ จำกัด ทั่วไปเมื่อขอความสำเร็จ
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 ] ;
Debug . Log ( $" Step { i } : { step . Explanation } " ) ;
Debug . Log ( $" Result: { step . Output } " ) ;
}
Debug . Log ( $" 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 )
{
Debug . Log ( $" [ { choice . Index } ] { choice . Message . Role } : { choice } | Finish Reason: { choice . FinishReason } " ) ;
}
response . GetUsage ( ) ;แปลงเสียงเป็นข้อความ
Audio API สามารถเข้าถึงได้ผ่าน OpenAIClient.AudioEndpoint
สร้างเสียงจากข้อความอินพุต
var api = new OpenAIClient ( ) ;
var request = new SpeechRequest ( " Hello world! " ) ;
var speechClip = await api . AudioEndpoint . GetSpeechAsync ( request ) ;
audioSource . PlayOneShot ( speechClip ) ;
Debug . Log ( speechClip ) ; สร้างเสียงสตรีมจากข้อความอินพุต
var api = new OpenAIClient ( ) ;
var request = new SpeechRequest ( " Hello world! " , responseFormat : SpeechResponseFormat . PCM ) ;
var speechClip = await api . AudioEndpoint . GetSpeechAsync ( request , partialClip =>
{
audioSource . PlayOneShot ( partialClip ) ;
} ) ;
Debug . Log ( speechClip ) ; บันทึก
เช็คเอาต์ฉากสาธิตใด ๆ สำหรับแนวทางปฏิบัติที่ดีที่สุดในการจัดการการเล่นด้วย OnAudioFilterRead
ถอดเสียงออกเป็นภาษาอินพุต
var api = new OpenAIClient ( ) ;
var request = new AudioTranscriptionRequest ( audioClip , language : " en " ) ;
var result = await api . AudioEndpoint . CreateTranscriptionAsync ( request ) ;
Debug . Log ( result ) ; นอกจากนี้คุณยังสามารถรับข้อมูลโดยละเอียดโดยใช้ verbose_json เพื่อรับเม็ดละเอียดการประทับเวลา:
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 )
{
Debug . Log ( $" [ { word . Start } - { word . End } ] " { word . Word } " " ) ;
} แปลเสียงเป็นภาษาอังกฤษ
var api = new OpenAIClient ( ) ;
var request = new AudioTranslationRequest ( audioClip ) ;
var result = await api . AudioEndpoint . CreateTranslationAsync ( request ) ;
Debug . Log ( result ) ;ด้วยภาพแจ้งและ/หรือภาพอินพุตโมเดลจะสร้างภาพใหม่
รูปภาพ API สามารถเข้าถึงได้ผ่าน OpenAIClient.ImagesEndpoint
สร้างภาพที่ได้รับพรอมต์
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 result in imageResults )
{
Debug . Log ( result . ToString ( ) ) ;
Assert . IsNotNull ( result . Texture ) ;
} สร้างภาพที่แก้ไขหรือขยายให้ภาพต้นฉบับและพรอมต์
var api = new OpenAIClient ( ) ;
var request = new ImageEditRequest ( Path . GetFullPath ( imageAssetPath ) , Path . GetFullPath ( maskAssetPath ) , " A sunlit indoor lounge area with a pool containing a flamingo " , size : ImageSize . Small ) ;
var imageResults = await api . ImagesEndPoint . CreateImageEditAsync ( request ) ;
foreach ( var result in imageResults )
{
Debug . Log ( result . ToString ( ) ) ;
Assert . IsNotNull ( result . Texture ) ;
} สร้างรูปแบบของภาพที่กำหนด
var api = new OpenAIClient ( ) ;
var request = new ImageVariationRequest ( imageTexture , size : ImageSize . Small ) ;
var imageResults = await api . ImagesEndPoint . CreateImageVariationAsync ( request ) ;
foreach ( var result in imageResults )
{
Debug . Log ( result . ToString ( ) ) ;
Assert . IsNotNull ( result . Texture ) ;
}อีกทางเลือกหนึ่งจุดสิ้นสุดสามารถใช้ Texture2D โดยตรงด้วยการเปิดใช้งานการอ่าน/เขียนและตั้งค่าการบีบอัดเป็นไม่มี
var api = new OpenAIClient ( ) ;
var request = new ImageVariationRequest ( imageTexture , size : ImageSize . Small ) ;
var imageResults = await api . ImagesEndPoint . CreateImageVariationAsync ( request ) ;
foreach ( var result in imageResults )
{
Debug . Log ( result . ToString ( ) ) ;
Assert . IsNotNull ( result . Texture ) ;
}ไฟล์ใช้เพื่ออัปโหลดเอกสารที่สามารถใช้กับคุณสมบัติเช่นการปรับแต่ง
ไฟล์ API สามารถเข้าถึงได้ผ่าน OpenAIClient.FilesEndpoint
ส่งคืนรายการไฟล์ที่เป็นขององค์กรของผู้ใช้
var api = new OpenAIClient ( ) ;
var fileList = await api . FilesEndpoint . ListFilesAsync ( ) ;
foreach ( var file in fileList )
{
Debug . Log ( $" { file . Id } -> { file . Object } : { file . FileName } | { file . Size } bytes " ) ;
} อัปโหลดไฟล์ที่สามารถใช้ในจุดสิ้นสุดต่างๆ ขนาดของไฟล์ทั้งหมดที่อัปโหลดโดยองค์กรเดียวสามารถสูงถึง 100 GB
ขนาดของแต่ละไฟล์สามารถสูงสุด 512 MB ดูคู่มือเครื่องมือผู้ช่วยเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับประเภทของไฟล์ที่รองรับ API ที่ปรับแต่งอย่างละเอียดรองรับไฟล์. jsonl เท่านั้น
var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . UploadFileAsync ( " path/to/your/file.jsonl " , FilePurpose . FineTune ) ;
Debug . Log ( file . Id ) ; ลบไฟล์
var api = new OpenAIClient ( ) ;
var isDeleted = await api . FilesEndpoint . DeleteFileAsync ( fileId ) ;
Assert . IsTrue ( isDeleted ) ; ส่งคืนข้อมูลเกี่ยวกับไฟล์เฉพาะ
var api = new OpenAIClient ( ) ;
var file = await api . FilesEndpoint . GetFileInfoAsync ( fileId ) ;
Debug . Log ( $" { file . Id } -> { file . Object } : { file . FileName } | { file . Size } bytes " ) ; ดาวน์โหลดเนื้อหาไฟล์ไปยังไดเรกทอรีที่ระบุ
var api = new OpenAIClient ( ) ;
var downloadedFilePath = await api . FilesEndpoint . DownloadFileAsync ( fileId ) ;
Debug . Log ( downloadedFilePath ) ;
Assert . IsTrue ( File . Exists ( downloadedFilePath ) ) ;จัดการงานปรับแต่งเพื่อปรับรูปแบบให้กับข้อมูลการฝึกอบรมเฉพาะของคุณ
คู่มือที่เกี่ยวข้อง: แบบจำลองการปรับแต่ง
ไฟล์ API สามารถเข้าถึงได้ผ่าน OpenAIClient.FineTuningEndpoint
สร้างงานที่ปรับแต่งโมเดลที่ระบุจากชุดข้อมูลที่กำหนด
การตอบสนองรวมถึงรายละเอียดของงานที่ถูกยึดเข้าด้วยกันรวมถึงสถานะงานและชื่อของโมเดลที่ปรับแต่งเมื่อเสร็จสมบูรณ์
var api = new OpenAIClient ( ) ;
var fileId = " file-abc123 " ;
var request = new CreateFineTuneRequest ( fileId ) ;
var job = await api . FineTuningEndpoint . CreateJobAsync ( Model . GPT3_5_Turbo , request ) ;
Debug . Log ( $" Started { job . Id } | Status: { job . Status } " ) ; แสดงรายการงานปรับแต่งขององค์กรของคุณ
var api = new OpenAIClient ( ) ;
var jobList = await api . FineTuningEndpoint . ListJobsAsync ( ) ;
foreach ( var job in jobList . Items . OrderByDescending ( job => job . CreatedAt ) ) )
{
Debug . Log ( $" { job . Id } -> { job . CreatedAt } | { job . Status } " ) ;
} รับข้อมูลเกี่ยวกับงานปรับแต่ง
var api = new OpenAIClient ( ) ;
var job = await api . FineTuningEndpoint . GetJobInfoAsync ( fineTuneJob ) ;
Debug . Log ( $" { job . Id } -> { job . CreatedAt } | { job . Status } " ) ; ยกเลิกงานปรับแต่งทันที
var api = new OpenAIClient ( ) ;
var isCancelled = await api . FineTuningEndpoint . CancelFineTuneJobAsync ( fineTuneJob ) ;
Assert . IsTrue ( isCancelled ) ; รับการอัปเดตสถานะสำหรับงานปรับแต่ง
var api = new OpenAIClient ( ) ;
var eventList = await api . FineTuningEndpoint . ListJobEventsAsync ( fineTuneJob ) ;
Debug . Log ( $" { fineTuneJob . Id } -> status: { fineTuneJob . Status } | event count: { eventList . Events . Count } " ) ;
foreach ( var @event in eventList . Items . OrderByDescending ( @event => @event . CreatedAt ) )
{
Debug . Log ( $" { @event . CreatedAt } [ { @event . Level } ] { @event . Message } " ) ;
}สร้างคำขอ API ขนาดใหญ่สำหรับการประมวลผลแบบอะซิงโครนัส แบทช์ API ส่งคืนความสำเร็จภายใน 24 ชั่วโมงเพื่อรับส่วนลด 50%
Batches API สามารถเข้าถึงได้ผ่าน OpenAIClient.BatchesEndpoint
แสดงรายการแบทช์ขององค์กรของคุณ
var api = new OpenAIClient ( ) ;
var batches = await api . BatchEndpoint . ListBatchesAsync ( ) ;
foreach ( var batch in listResponse . Items )
{
Debug . Log ( batch ) ;
} สร้างและดำเนินการแบทช์จากไฟล์คำขอที่อัปโหลด
var api = new OpenAIClient ( ) ;
var batchRequest = new CreateBatchRequest ( " file-id " , Endpoint . ChatCompletions ) ;
var batch = await api . BatchEndpoint . CreateBatchAsync ( batchRequest ) ; ดึงชุด
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 นาทีก่อนที่จะเปลี่ยนเป็นการยกเลิกซึ่งจะมีผลลัพธ์บางส่วน (ถ้ามี) ในไฟล์เอาต์พุต
var api = new OpenAIClient ( ) ;
var isCancelled = await api . BatchEndpoint . CancelBatchAsync ( batch ) ;
Assert . IsTrue ( isCancelled ) ;รับการแสดงเวกเตอร์ของอินพุตที่กำหนดซึ่งสามารถใช้งานได้ง่ายโดยรูปแบบการเรียนรู้ของเครื่องและอัลกอริทึม
คู่มือที่เกี่ยวข้อง: Embeddings
การแก้ไข API สามารถเข้าถึงได้ผ่าน OpenAIClient.EmbeddingsEndpoint
สร้างเวกเตอร์ฝังที่แสดงข้อความอินพุต
var api = new OpenAIClient ( ) ;
var response = await api . EmbeddingsEndpoint . CreateEmbeddingAsync ( " The food was delicious and the waiter... " , Models . Embedding_Ada_002 ) ;
Debug . Log ( response ) ;เมื่อได้รับข้อความอินพุตเอาต์พุตหากโมเดลจัดประเภทว่าเป็นการละเมิดนโยบายเนื้อหาของ OpenAI
คู่มือที่เกี่ยวข้อง: การดูแล
Moderations API สามารถเข้าถึงได้ผ่าน OpenAIClient.ModerationsEndpoint
จำแนกหากข้อความละเมิดนโยบายเนื้อหาของ OpenAI
var api = new OpenAIClient ( ) ;
var isViolation = await api . ModerationsEndpoint . GetModerationAsync ( " I want to kill them. " ) ;
Assert . IsTrue ( isViolation ) ;นอกจากนี้คุณยังสามารถรับคะแนนของอินพุตที่กำหนด
var api = new OpenAIClient ( ) ;
var response = await api . ModerationsEndpoint . CreateModerationAsync ( new ModerationsRequest ( " I love you " ) ) ;
Assert . IsNotNull ( response ) ;
Debug . Log ( response . Results ? [ 0 ] ? . Scores ? . ToString ( ) ) ;