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

ในหน้านี้
ในการส่งคำขอจาก C# ไปยัง CheapTokens ให้ใช้ไลบรารี OpenAI อย่างเป็นทางการสำหรับ .NET และตั้งค่า OpenAIClientOptions. เป็น https:/ ส่ง model id แบบเต็ม เช่น deepseek- และอ่านคีย์จาก 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:/(รองรับ OpenAI Chat Completions);/ api. cheaptokens. dev/ v1 - model id:
deepseek-ใช้ id แบบเต็ม ชื่อย่อจากตารางราคาจะไม่ถูกยอมรับ DeepSeek-V4-Flash มี context window 380K และสร้าง output ได้สูงสุด 32,768 โทเค็นต่อคำตอบ ราคาเดียวตลอดทั้งวัน;ai/ DeepSeek- V4- Flash- 0731 - API key จากบัญชี CheapTokens ของคุณ เก็บไว้ใน environment variable หากไม่แน่ใจวิธีจัดเก็บ อ่าน วิธีจัดเก็บ API key อย่างปลอดภัย
สร้างแอปคอนโซล#
ทีละขั้นตอน
สร้างโปรเจกต์และรัน
สร้างโปรเจกต์คอนโซล
dotnet new console -o FirstRequest
cd FirstRequestเพิ่มแพ็กเกจ
dotnet add package OpenAIใส่คีย์ใน environment variable
ใน bash หรือ zsh:
export CHEAPTOKENS_API_KEY=your-keyใน Windows PowerShell:
$env:CHEAPTOKENS_API_KEY = "your-key"วางโค้ดและรัน
แทนที่เนื้อหาใน Program.cs ด้วยโค้ดจากส่วนถัดไป จากนั้นรัน dotnet run

โค้ดทีละบรรทัด#
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. จึงต้องมี using ตัวแรก) การตรวจสอบด้านบนเป็นของเรา: จะให้ข้อความชัดเจนหากไม่ได้ตั้งค่าตัวแปร
CompleteChat ด้วยสตริงธรรมดาจะส่งข้อความผู้ใช้หนึ่งข้อความและรอคำตอบทั้งหมด ข้อความตอบกลับอยู่ใน completion. เหตุผลการสิ้นสุดอยู่ใน completion.

สิ่งที่คุณควรเห็น#
คุณควรได้คำอธิบายสั้นๆ เกี่ยวกับโทเค็นและบรรทัดที่มีเหตุผลการสิ้นสุด หลังจบปกติจะเป็น Stop (README เปรียบเทียบ FinishReason กับ ChatFinishReason.) ถ้อยคำของคำตอบจะเปลี่ยนไปในแต่ละครั้ง
บรรทัดที่สองคือบรรทัดที่ควรอ่าน README เปรียบเทียบ FinishReason กับ ChatFinishReason. (โมเดลจบเอง) และ ChatFinishReason. (โมเดลต้องการเรียกเครื่องมือ) อะไรก็ตามที่ไม่ใช่ Stop ในการแชทธรรมดา หมายความว่าคำตอบสิ้นสุดด้วยเหตุผลอื่น และตัวการที่พบบ่อยคือขีดจำกัดความยาว หากคุณเห็นคำตอบที่หยุดกลางประโยค บทความนี้อธิบาย finish_reason และ max_tokens
การสลับบริการที่มีอยู่#
หากบริการของคุณสร้าง ChatClient สำหรับ OpenAI อยู่แล้ว คุณเปลี่ยนสองอย่าง: สตริงโมเดลและตัวเลือก การเรียกที่เหลือยังคงทำงานได้
เปรียบเทียบ
ไคลเอนต์เดิม เปลี่ยนสองบรรทัด
ก่อน
ChatClient client = new(
model: "your-current-model",
credential: new ApiKeyCredential(apiKey));หลัง
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- (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 แสดงสิ่งที่โมเดลมีให้
| โมเดล | Input $/1M | Output $/1M | ต่อคำขอ | 1,000 คำขอ | OpenRouter, 1,000 คำขอ |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000022 | $0.022 | $0.0433 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000045 | $0.0445 | $0.077 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.000075 | $0.075 | $0.90 |
300 โทเค็นอินพุตและ 400 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน
หากใช้งานไม่ได้#
- 401. คีย์หายหรือผิด พิมพ์ว่าตัวแปรถูกตั้งค่าหรือไม่ (การตรวจสอบในโค้ดทำสิ่งนี้) และตรวจสอบว่า
dotnet runเริ่มในเทอร์มินัลเดียวกับที่คุณรันexport(หรือ$env:): ตัวแปรมีอยู่เฉพาะในเซสชันนั้น - 404. บ่อยที่สุดคือ model id: ชื่อย่อแทน
deepseek-แบบเต็ม หรือ endpoint ที่ไม่มีai/ DeepSeek- V4- Flash- 0731 /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



