กลับไปที่บล็อก

API และ SDKคู่มือ

คำขอแรกใน C# ด้วย openai-dotnet: endpoint, คีย์, คำตอบ

ส่ง chat completion แรกจากแอปคอนโซล C#: ตั้งค่า Endpoint ในไลบรารี OpenAI .NET อย่างเป็นทางการ อ่านคีย์จาก env พิมพ์คำตอบและเหตุผลการสิ้นสุด

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 4 นาที

ภาพปก: C# และไลบรารี OpenAI .NET เชื่อมต่อกับ endpoint ของ CheapTokens
ในหน้านี้
  1. สิ่งที่คุณต้องมี
  2. สร้างแอปคอนโซล
  3. โค้ดทีละบรรทัด
  4. สิ่งที่คุณควรเห็น
  5. การสลับบริการที่มีอยู่
  6. หนึ่งคำขอมีค่าใช้จ่ายเท่าไร
  7. หากใช้งานไม่ได้

ในการส่งคำขอจาก C# ไปยัง CheapTokens ให้ใช้ไลบรารี OpenAI อย่างเป็นทางการสำหรับ .NET และตั้งค่า OpenAIClientOptions.Endpoint เป็น https://api.cheaptokens.dev/v1 ส่ง model id แบบเต็ม เช่น deepseek-ai/DeepSeek-V4-Flash-0731 และอ่านคีย์จาก environment variable การเรียก ChatClient และ CompleteChat ยังคงเหมือนเดิมทุกประการกับตัวอย่างของ OpenAI

สมมติว่าคุณมีบริการ ASP.NET ที่สื่อสารกับ OpenAI อยู่แล้ว และต้องการลอง endpoint และโมเดลอื่นโดยไม่แตะโค้ดส่วนที่เหลือ ก่อนจะเชื่อมต่ออะไรเข้ากับบริการ ให้ตรวจสอบสามสิ่งที่มักผิดพลาด (คีย์, endpoint, model id) ในแอปคอนโซลเล็กๆ ก่อน นั่นคือสิ่งที่เราจะสร้างในบทความนี้ รายละเอียดด้านล่างมาจาก README ของไลบรารีบน GitHub (openai/openai-dotnet, ตรวจสอบเมื่อ 5 พฤศจิกายน 2026) และจากเอกสาร CheapTokens: หน้าคู่มือ มี base URL เดียวกัน

สิ่งที่คุณต้องมี#

แพ็กเกจชื่อ OpenAI บน NuGet เวอร์ชันเสถียรล่าสุด ณ 5 พฤศจิกายน 2026 คือ 2.15.0 (รายการ changelog ลงวันที่ 4 พฤศจิกายน) รองรับ .NET 8 และ .NET Standard 2.0 และ README ระบุว่าใช้งานได้กับแอปพลิเคชัน .NET Standard 2.0 ทั้งหมด ดังนั้นโปรเจกต์เก่าก็ใช้ได้เช่นกัน

มีค่าสามค่าที่ต้องใส่ในแอป:

  • base URL: https://api.cheaptokens.dev/v1 (รองรับ OpenAI Chat Completions);
  • model id: deepseek-ai/DeepSeek-V4-Flash-0731 ใช้ id แบบเต็ม ชื่อย่อจากตารางราคาจะไม่ถูกยอมรับ DeepSeek-V4-Flash มี context window 380K และสร้าง output ได้สูงสุด 32,768 โทเค็นต่อคำตอบ ราคาเดียวตลอดทั้งวัน;
  • API key จากบัญชี CheapTokens ของคุณ เก็บไว้ใน environment variable หากไม่แน่ใจวิธีจัดเก็บ อ่าน วิธีจัดเก็บ API key อย่างปลอดภัย

สร้างแอปคอนโซล#

ทีละขั้นตอน

สร้างโปรเจกต์และรัน

สร้างโปรเจกต์คอนโซล

bash
dotnet new console -o FirstRequest
cd FirstRequest

เพิ่มแพ็กเกจ

bash
dotnet add package OpenAI

ใส่คีย์ใน environment variable

ใน bash หรือ zsh:

bash
export CHEAPTOKENS_API_KEY=your-key

ใน Windows PowerShell:

powershell
$env:CHEAPTOKENS_API_KEY = "your-key"

วางโค้ดและรัน

แทนที่เนื้อหาใน Program.cs ด้วยโค้ดจากส่วนถัดไป จากนั้นรัน dotnet run

เทอร์มินัลพร้อมห้าคำสั่งที่สร้างและรันแอปคอนโซล
ห้าคำสั่ง: สร้างโปรเจกต์ เข้าโฟลเดอร์ เพิ่มแพ็กเกจ ตั้งค่าคีย์ รัน

โค้ดทีละบรรทัด#

csharp
using System.ClientModel;
using OpenAI;
using OpenAI.Chat;

string? apiKey = Environment.GetEnvironmentVariable("CHEAPTOKENS_API_KEY");
if (string.IsNullOrEmpty(apiKey))
{
    Console.WriteLine("Set CHEAPTOKENS_API_KEY first.");
    return;
}

ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

ChatCompletion completion = client.CompleteChat("Explain in two sentences what a token is.");

Console.WriteLine(completion.Content[0].Text);
Console.WriteLine($"finish_reason: {completion.FinishReason}");

README แสดงรูปแบบนี้สำหรับ "พร็อกซีหรือ LLM ที่โฮสต์เองซึ่งรองรับ OpenAI": endpoint ใส่ใน OpenAIClientOptions คีย์ใส่ใน ApiKeyCredential (ซึ่งอยู่ใน System.ClientModel จึงต้องมี using ตัวแรก) การตรวจสอบด้านบนเป็นของเรา: จะให้ข้อความชัดเจนหากไม่ได้ตั้งค่าตัวแปร

CompleteChat ด้วยสตริงธรรมดาจะส่งข้อความผู้ใช้หนึ่งข้อความและรอคำตอบทั้งหมด ข้อความตอบกลับอยู่ใน completion.Content[0].Text เหตุผลการสิ้นสุดอยู่ใน completion.FinishReason

ลำดับ: คีย์จาก env, ChatClient พร้อม Endpoint, CompleteChat, ข้อความและ FinishReason
สิ่งที่เกิดขึ้นในโปรแกรมตั้งแต่คีย์จนถึงคำตอบที่พิมพ์ออกมา

สิ่งที่คุณควรเห็น#

คุณควรได้คำอธิบายสั้นๆ เกี่ยวกับโทเค็นและบรรทัดที่มีเหตุผลการสิ้นสุด หลังจบปกติจะเป็น Stop (README เปรียบเทียบ FinishReason กับ ChatFinishReason.Stop) ถ้อยคำของคำตอบจะเปลี่ยนไปในแต่ละครั้ง

บรรทัดที่สองคือบรรทัดที่ควรอ่าน README เปรียบเทียบ FinishReason กับ ChatFinishReason.Stop (โมเดลจบเอง) และ ChatFinishReason.ToolCalls (โมเดลต้องการเรียกเครื่องมือ) อะไรก็ตามที่ไม่ใช่ Stop ในการแชทธรรมดา หมายความว่าคำตอบสิ้นสุดด้วยเหตุผลอื่น และตัวการที่พบบ่อยคือขีดจำกัดความยาว หากคุณเห็นคำตอบที่หยุดกลางประโยค บทความนี้อธิบาย finish_reason และ max_tokens

การสลับบริการที่มีอยู่#

หากบริการของคุณสร้าง ChatClient สำหรับ OpenAI อยู่แล้ว คุณเปลี่ยนสองอย่าง: สตริงโมเดลและตัวเลือก การเรียกที่เหลือยังคงทำงานได้

เปรียบเทียบ

ไคลเอนต์เดิม เปลี่ยนสองบรรทัด

ก่อน

csharp
ChatClient client = new(
    model: "your-current-model",
    credential: new ApiKeyCredential(apiKey));

หลัง

csharp
ChatClient client = new(
    model: "deepseek-ai/DeepSeek-V4-Flash-0731",
    credential: new ApiKeyCredential(apiKey),
    options: new OpenAIClientOptions
    {
        Endpoint = new Uri("https://api.cheaptokens.dev/v1")
    });

สำหรับคำขอสั้นๆ มีตัวเลือกที่สอง: zai-org/GLM-5.3-Flash (context 390K, output สูงสุด 8,192 โทเค็น) คุณเพียงเปลี่ยนสตริง model รายการ id ที่คีย์ของคุณใช้ได้อยู่ห่างเพียงหนึ่งคำขอ ดู แสดงรายการโมเดลด้วย GET /v1/models

หนึ่งคำขอมีค่าใช้จ่ายเท่าไร#

สมมติว่าบริการจัดการ 1,000 คำขอต่อวัน แต่ละคำขอประมาณ 300 โทเค็นขาเข้าและ 400 โทเค็นขาออก คำขอหนึ่งครั้งมีค่าใช้จ่าย $0.000045 บน DeepSeek-V4-Flash ตารางด้านล่างแสดง 1,000 คำขอเดียวกันบนทั้งสามโมเดลเทียบกับ OpenRouter โดยรวมเมื่อนับ input และ output รวมกัน DeepSeek-V4-Flash ถูกกว่า OpenRouter ราคาปัจจุบันอยู่ในหน้าราคา และหน้า DeepSeek แสดงสิ่งที่โมเดลมีให้

โมเดล ต่อคำขอ 1,000 คำขอ OpenRouter, 1,000 คำขอ
GLM-5.3-Flash $0.000022 $0.022 $0.0433
DeepSeek-V4-Flash $0.000045 $0.0445 $0.077
MiniMax-M2.7 $0.000075 $0.075 $0.90

300 โทเค็นอินพุตและ 400 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

หากใช้งานไม่ได้#

  • 401. คีย์หายหรือผิด พิมพ์ว่าตัวแปรถูกตั้งค่าหรือไม่ (การตรวจสอบในโค้ดทำสิ่งนี้) และตรวจสอบว่า dotnet run เริ่มในเทอร์มินัลเดียวกับที่คุณรัน export (หรือ $env:): ตัวแปรมีอยู่เฉพาะในเซสชันนั้น
  • 404. บ่อยที่สุดคือ model id: ชื่อย่อแทน deepseek-ai/DeepSeek-V4-Flash-0731 แบบเต็ม หรือ endpoint ที่ไม่มี /v1 (ตรวจสอบด้วยว่า OpenAIClientOptions ถูกส่งไปยัง ChatClient จริง) รายละเอียดอยู่ใน API 401 หรือ 404: คีย์, base URL หรือ model id ผิด
  • error CS0246: The type or namespace name 'ApiKeyCredential' could not be found. บรรทัด using System.ClientModel; หายไปที่ด้านบนของ Program.cs

แนวคิดเดียวกันในภาษาอื่น: เวอร์ชัน Go กับ openai-go