[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-openai-api-gpt4o-sdk-guide-all--*":3,"academy-blog-translations-zybalt8x8wve6gw":88},{"data":4,"page":74,"perPage":74,"totalItems":74,"totalPages":74},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":82,"keywords":83,"locale":55,"published_at":84,"scheduled_at":13,"school_blog":78,"short_description":85,"status":76,"title":86,"updated":87,"updated_by":13,"slug":79,"views":81},"โค้ดภาษา Go สำหรับเชื่อมต่อกับ OpenAI API GPT-4o","sclblg987654321","school_blog_translations","\u003Cp>ใน EP.144 นี้ เราจะเริ่มลงมือเชื่อมต่อ Go Backend เข้ากับ \u003Cstrong>GPT-4o\u003C\u002Fstrong> ของ OpenAI กันครับ หลังจากที่เราคุยเรื่องทฤษฎีและช่องทางสื่อสาร (REST vs gRPC) ไปในตอนที่แล้ว วันนี้เราจะลงมือเขียนโค้ดจริงโดยใช้ \u003Cstrong>SDK มาตรฐาน\u003C\u002Fstrong> เพื่อให้การรับส่งข้อมูลระหว่างระบบของเรากับ OpenAI ทำงานได้อย่างเสถียรและมีความปลอดภัยตามหลักการพัฒนาซอฟต์แวร์ครับ\u003C\u002Fp>\u003Ch2>1Setup SDK และการจัดการ API Key ให้ปลอดภัย\u003C\u002Fh2>\u003Cp>กฎข้อแรกที่สำคัญที่สุดคือ \u003Cstrong>\"ห้าม Hardcode API Key ลงในโค้ดเด็ดขาด\"\u003C\u002Fstrong> เพราะถ้าคุณเผลอ Push โค้ดขึ้น GitHub เมื่อไหร่ บอทที่คอยสแกนหา Key จะนำไปใช้จนโควต้าของคุณหมดเกลี้ยงภายในเวลาไม่กี่นาทีครับ\u003C\u002Fp>\u003Ch3>การติดตั้ง SDK\u003C\u002Fh3>\u003Cp>เราจะใช้ Library ที่เป็นมาตรฐานนิยมในชุมชน Go คือ \u003Ccode>go-openai\u003C\u002Fcode> ของคุณ sashabaranov ครับ ให้รันคำสั่งนี้ใน Terminal:\u003C\u002Fp>\u003Cp>Bash\u003C\u002Fp>\u003Cpre>\u003Ccode>go get github.com\u002Fsashabaranov\u002Fgo-openai\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>การจัดการ Key ให้เป็นระบบ\u003C\u002Fh3>\u003Cp>วิธีที่ปลอดภัยและเป็นสากลคือการใช้ \u003Cstrong>Environment Variables\u003C\u002Fstrong> หรือเก็บไว้ในไฟล์ \u003Ccode>.env\u003C\u002Fcode> (และต้องมั่นใจว่าใส่ชื่อไฟล์ \u003Ccode>.env\u003C\u002Fcode> ไว้ใน \u003Ccode>.gitignore\u003C\u002Fcode> แล้ว เพื่อไม่ให้ไฟล์นี้ติดไปบน Server หรือ Repo ส่วนกลาง)\u003C\u002Fp>\u003Cp>\u003Cstrong>ตัวอย่างโค้ดการเรียกใช้:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>import (\n    \"os\"\n    \"github.com\u002Fsashabaranov\u002Fgo-openai\"\n)\n\nfunc main() {\n    \u002F\u002F ดึงค่า Key จากระบบปฏิบัติการหรือ Environment Variable ที่เราตั้งไว้\n    apiKey := os.Getenv(\"OPENAI_API_KEY\")\n    \n    if apiKey == \"\" {\n        \u002F\u002F จัดการกรณีที่ลืมตั้งค่า Key เพื่อไม่ให้โปรแกรมทำงานผิดพลาด\n        panic(\"กรุณาตั้งค่า OPENAI_API_KEY ใน Environment Variable\")\n    }\n\n    client := openai.NewClient(apiKey)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Chat Completion: การส่ง Prompt และรับคำตอบ\u003C\u002Fh2>\u003Cp>หัวใจสำคัญของการใช้งาน GPT-4o คือการส่งข้อมูลผ่าน \u003Ccode>ChatCompletionRequest\u003C\u002Fcode> ครับ สิ่งที่เราต้องให้ความสำคัญคือการกำหนด \u003Cstrong>Role\u003C\u002Fstrong> (บทบาท) และ \u003Cstrong>Content\u003C\u002Fstrong> (เนื้อหา) ให้ชัดเจน เพื่อให้โมเดลเข้าใจบริบทของคำถาม\u003C\u002Fp>\u003Cp>\u003Cstrong>ตัวอย่างโค้ด:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>package main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"github.com\u002Fsashabaranov\u002Fgo-openai\"\n)\n\nfunc main() {\n    \u002F\u002F ... (โค้ดการสร้าง client จากข้อที่ 1)\n\n    resp, err := client.CreateChatCompletion(\n        context.Background(),\n        openai.ChatCompletionRequest{\n            Model: openai.GPT4o, \u002F\u002F ระบุรุ่นของ Model ที่ต้องการใช้\n            Messages: []openai.ChatCompletionMessage{\n                {\n                    Role:    openai.ChatMessageRoleUser, \u002F\u002F กำหนดว่าเป็นข้อความจากฝั่ง User\n                    Content: \"ช่วยอธิบายข้อดีของภาษา Go ใน 1 ประโยคหน่อย\",\n                },\n            },\n        },\n    )\n\n    if err != nil {\n        fmt.Printf(\"เกิดข้อผิดพลาด: %v\\n\", err)\n        return\n    }\n\n    \u002F\u002F คำตอบจะถูกเก็บไว้ใน Choices ซึ่งปกติเราจะดึงค่าแรกสุดมาใช้งาน\n    fmt.Println(resp.Choices[0].Message.Content)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>สรุปสิ่งที่ควรรู้:\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Role:\u003C\u002Fstrong> โดยทั่วไปจะมี \u003Ccode>System\u003C\u002Fcode> (กำหนดบุคลิก AI), \u003Ccode>User\u003C\u002Fcode> (คำถามจากผู้ใช้) และ \u003Ccode>Assistant\u003C\u002Fcode> (คำตอบก่อนหน้าจาก AI สำหรับทำประวัติการคุย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Choices:\u003C\u002Fstrong> ระบบจะส่งคำตอบกลับมาเป็น Array เพราะในบางการตั้งค่า AI อาจจะสร้างคำตอบสำรองมาให้เลือก แต่ในการใช้งานพื้นฐาน เรามักจะใช้ \u003Ccode>Choices[0]\u003C\u002Fcode> เป็นหลักครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Streaming Mode: การรับคำตอบแบบทยอยแสดงผล (Real-time)\u003C\u002Fh2>\u003Cp>หากคุณต้องการให้แอปพลิเคชันแสดงคำตอบแบบค่อยๆ พิมพ์ออกมาทีละคำเหมือนในหน้าเว็บ ChatGPT คุณจำเป็นต้องใช้ \u003Cstrong>Streaming Mode\u003C\u002Fstrong> ครับ วิธีนี้จะช่วยลดความรู้สึกว่าระบบ \"ค้าง\" ระหว่างรอโมเดลประมวลผลคำตอบยาวๆ\u003C\u002Fp>\u003Cp>ในภาษา Go เราจะจัดการเรื่องนี้ผ่านการวนลูปเพื่อรับข้อมูลจาก Stream จนกว่าจะจบการทำงาน\u003C\u002Fp>\u003Cp>\u003Cstrong>ตัวอย่างโค้ด:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>\u002F\u002F สร้าง Stream แทนการเรียกใช้ CreateChatCompletion แบบปกติ\nstream, err := client.CreateChatCompletionStream(context.Background(), request)\nif err != nil {\n    fmt.Printf(\"เปิด Stream ไม่สำเร็จ: %v\\n\", err)\n    return\n}\ndefer stream.Close() \u002F\u002F ปิด Stream เมื่อทำงานเสร็จเพื่อคืนทรัพยากรระบบ\n\nfor {\n    \u002F\u002F วนลูปรับข้อมูลทีละส่วน (Chunk)\n    response, err := stream.Recv()\n    \n    \u002F\u002F ตรวจสอบว่าข้อมูลส่งมาครบหรือยัง (io.EOF คือสัญญาณว่าจบการส่ง)\n    if errors.Is(err, io.EOF) {\n        fmt.Println(\"\\n[จบการรับข้อมูล]\")\n        break\n    }\n\n    if err != nil {\n        fmt.Printf(\"\\nเกิดข้อผิดพลาดระหว่างรับข้อมูล: %v\\n\", err)\n        break\n    }\n\n    \u002F\u002F ในโหมด Stream ข้อมูลคำตอบจะอยู่ในฟิลด์ Delta\n    fmt.Print(response.Choices[0].Delta.Content)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>ความแตกต่างที่สำคัญ:\u003C\u002Fh3>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>CreateChatCompletionStream:\u003C\u002Fstrong> จะส่งข้อมูลกลับมาเป็นก้อนเล็กๆ (Chunks) อย่างต่อเนื่องแทนที่จะรอให้เสร็จทั้งหมด\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Delta.Content:\u003C\u002Fstrong> ในโหมดปกติข้อมูลจะอยู่ใน \u003Ccode>Message.Content\u003C\u002Fcode> แต่ถ้าเป็น Streaming ข้อมูลจะถูกส่งมาใน \u003Ccode>Delta.Content\u003C\u002Fcode> แทนครับ\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Error Handling: การรับมือเมื่อ API มีปัญหา\u003C\u002Fh2>\u003Cp>ในการใช้งานจริง เราไม่สามารถคุมปัจจัยภายนอกอย่างระบบของ OpenAI หรือความเสถียรของอินเทอร์เน็ตได้ ดังนั้นการเขียน Go ที่ดีต้องรับมือกับความผิดพลาด (Error Handling) ให้ครอบคลุม โดยเฉพาะปัญหาเรื่องโควต้าและข้อจำกัดของ API ครับ\u003C\u002Fp>\u003Cp>\u003Cstrong>ปัญหาที่พบบ่อย:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Rate Limit (429):\u003C\u002Fstrong> เกิดจากการส่ง Request ถี่เกินไปจนเกินเพดานที่เขากำหนด วิธีแก้คือต้องรอสักพักแล้วค่อยลองใหม่ (Exponential Backoff)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Insufficient Quota:\u003C\u002Fstrong> แจ้งเตือนว่ายอดเงินคงเหลือในบัญชีไม่พอ หรือใช้ Token เกินจำนวนที่กำหนด\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003Cstrong>ตัวอย่างการจัดการ Error แบบเจาะจง:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cp>Go\u003C\u002Fp>\u003Cpre>\u003Ccode>if err != nil {\n    \u002F\u002F ตรวจสอบว่าเป็น Error จากทาง OpenAI API โดยเฉพาะหรือไม่\n    var apiErr *openai.APIError\n    if errors.As(err, &amp;apiErr) {\n        switch apiErr.HTTPStatusCode {\n        case 429:\n            \u002F\u002F กรณีเรียกใช้งานถี่เกินไป (Rate Limit)\n            fmt.Println(\"เรียกใช้งานบ่อยเกินไป กรุณารอสักครู่แล้วลองใหม่\")\n        case 401:\n            \u002F\u002F กรณี API Key ไม่ถูกต้องหรือหมดอายุ\n            fmt.Println(\"API Key มีปัญหา กรุณาตรวจสอบการตั้งค่า\")\n        case 402:\n            \u002F\u002F กรณีเงินในบัญชี OpenAI หมด (Insufficient Quota)\n            fmt.Println(\"ยอดเงินคงเหลือไม่เพียงพอ กรุณาเติมเงินในระบบ OpenAI\")\n        default:\n            fmt.Printf(\"เกิดข้อผิดพลาดจาก API: %s (Status: %d)\\n\", apiErr.Message, apiErr.HTTPStatusCode)\n        }\n    } else {\n        \u002F\u002F กรณีเป็น Error ทั่วไป เช่น Network มีปัญหา\n        fmt.Printf(\"เกิดข้อผิดพลาดทั่วไป: %v\\n\", err)\n    }\n    return\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch3>สรุปหลักการจัดการ:\u003C\u002Fh3>\u003Cp>การแยกแยะ \u003Cstrong>HTTP Status Code\u003C\u002Fstrong> ช่วยให้เราตัดสินใจได้ว่าโปรแกรมควรทำอย่างไรต่อ เช่น ถ้าเป็น 429 เราอาจจะเขียน Logic ให้โปรแกรมหยุดรอแล้วลองใหม่โดยอัตโนมัติ แต่ถ้าเป็น 401 หรือ 402 เราควรหยุดทำงานและแจ้งเตือนให้ Admin ทราบเพื่อแก้ไขปัญหาเรื่องบัญชีครับ\u003C\u002Fp>\u003Ch2>🎯 ท้าให้ลอง (Daily Mission)\u003C\u002Fh2>\u003Cp>เพื่อให้เข้าใจการทำงานของ Streaming และการจัดการ Client ได้ชัดเจนขึ้น ผมอยากให้ทุกคนลองสร้างโปรแกรม CLI (Command Line Interface) ง่ายๆ ด้วยตัวเองครับ\u003C\u002Fp>\u003Cp>\u003Cstrong>โจทย์:\u003C\u002Fstrong> เขียนโปรแกรมที่รับคำถามจาก Keyboard ผ่าน \u003Ccode>fmt.Scanln\u003C\u002Fcode> หรือ \u003Ccode>bufio.NewScanner\u003C\u002Fcode> แล้วส่งไปถาม GPT-4o โดยกำหนดให้แสดงผลลัพธ์แบบ \u003Cstrong>Streaming\u003C\u002Fstrong> ออกมาทางหน้าจอทันที\u003C\u002Fp>\u003Ch3>🔥 การบ้านเพิ่มความเซียน (Level Up!)\u003C\u002Fh3>\u003Cp>การคุมค่าใช้จ่ายเป็นเรื่องสำคัญมากในการทำระบบ AI ครับ \u003Cstrong>โจทย์เพิ่มเติม:\u003C\u002Fstrong> ลองค้นหาวิธีการกำหนดค่า \u003Cstrong>\u003Ccode>MaxTokens\u003C\u002Fcode>\u003C\u002Fstrong> ใน \u003Ccode>ChatCompletionRequest\u003C\u002Fcode> เพื่อจำกัดความยาวของคำตอบจาก AI ไม่ให้ยาวจนเกินไป ซึ่งจะช่วยให้คุณควบคุมงบประมาณและประหยัด Token ในแต่ละ Request ได้ครับ\u003C\u002Fp>\u003Cp>\u003C\u002Fp>\u003Cdiv data-type=\"horizontalRule\">\u003Chr>\u003C\u002Fdiv>\u003Ch2>บทสรุป: ก้าวแรกสู่โลกของ AI-Powered Application\u003C\u002Fh2>\u003Cp>การเชื่อมต่อกับ GPT-4o ผ่าน SDK ในภาษา Go ไม่ใช่เรื่องยาก แต่สิ่งที่ทำให้โปรแกรมเมอร์มืออาชีพต่างจากมือใหม่ คือการให้ความสำคัญกับ \u003Cstrong>ระบบความปลอดภัย\u003C\u002Fstrong> และการจัดการ \u003Cstrong>User Experience\u003C\u002Fstrong> ที่ดีครับ การเก็บ Key ให้มิดชิดและการเลือกใช้ Streaming Mode จะช่วยให้แอปพลิเคชันของคุณดูน่าเชื่อถือและตอบโจทย์การใช้งานจริงได้มากขึ้น\u003C\u002Fp>\u003Cp>อย่าลืมลองทำการบ้านเรื่องการจำกัด Token กันดูนะครับ เพราะในงานระดับ Production การคุมค่าใช้จ่าย (Cost Optimization) คือทักษะที่สำคัญไม่แพ้การเขียนโค้ดเลยครับ\u003C\u002Fp>\u003Ch3>ตอนต่อไป | EP.145: Local LLM with Ollama: รันโมเดลในเครื่องและควบคุมผ่าน Go\u003C\u002Fh3>\u003Cp>สำหรับใครที่กังวลเรื่องค่าใช้จ่าย API ที่อาจบานปลาย หรือมีโจทย์ที่ต้องรักษาความลับของข้อมูลขั้นสุดจนไม่อยากส่งข้อมูลออกไปนอกเครื่อง ตอนหน้าคือคำตอบครับ! เราจะมาทำความรู้จักกับ \u003Cstrong>Ollama\u003C\u002Fstrong> เครื่องมือที่จะเปลี่ยนเครื่องคอมพิวเตอร์ของคุณให้กลายเป็นเซิร์ฟเวอร์ AI ส่วนตัว\u003C\u002Fp>\u003Cp>\u003Cstrong>สิ่งที่เราจะลุยกันใน EP.145:\u003C\u002Fstrong>\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>Ollama Setup:\u003C\u002Fstrong> วิธีติดตั้งและรันโมเดลอย่าง Llama 3 หรือ Mistral ในเครื่องตัวเอง\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Go with Ollama:\u003C\u002Fstrong> การใช้ Library เพื่อสั่งการ Local LLM ผ่านภาษา Go\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>Privacy &amp; Cost:\u003C\u002Fstrong> เปรียบเทียบข้อดี-ข้อเสีย เมื่อต้องเลือกใช้งานแบบ Local แทน Cloud API\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>สายฟรีและสาย Privacy ห้ามพลาดตอนหน้าครับ!\u003C\u002Fp>\u003Cp>\u003Cstrong>ฝากกดติดตามพวกเราได้ที่ Superdev Academy\u003C\u002Fstrong> ในทุกช่องทางนะครับ!\u003C\u002Fp>\u003Cul>\u003Cli>\u003Cp>\u003Cstrong>🔵 Facebook: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.facebook.com\u002Fsuperdev.academy.th\">\u003Cstrong>Superdev Academy Thailand\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(อัปเดตข่าวสารและบทความใหม่)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 YouTube: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.youtube.com\u002F@SuperdevAcademy\">\u003Cstrong>Superdev Academy Channel\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(ติวเข้มแบบวิดีโอ)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>📸 Instagram: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.instagram.com\u002Fsuperdevacademy\u002F\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(เกร็ดความรู้สั้นๆ และเบื้องหลังการทำงาน)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🎬 TikTok: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener\" class=\"ng-star-inserted\" href=\"https:\u002F\u002Fwww.tiktok.com\u002F@superdevacademy?lang=th-TH\">\u003Cstrong>@superdevacademy\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(Tips &amp; Tricks ฉบับย่อยง่าย)\u003C\u002Fp>\u003C\u002Fli>\u003Cli>\u003Cp>\u003Cstrong>🌐 Website: \u003C\u002Fstrong>\u003Ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"http:\u002F\u002Fsuperdevacademy.com\">\u003Cstrong>superdevacademy.com\u003C\u002Fstrong>\u003C\u002Fa>\u003Cstrong> \u003C\u002Fstrong>(คลังบทความและคอร์สเรียนฉบับเต็ม)\u003C\u002Fp>\u003C\u002Fli>\u003C\u002Ful>\u003Cp>\u003C\u002Fp>","7k9r4uz6ekw_i6bahsgofw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F9sxqwtz31ndwv1s\u002F7k9r4uz6ekw_i6bahsgofw.png","2026-05-11 06:34:05.932Z","",{"keywords":15,"locale":49,"school_blog":59},[16,23,28,32,36,40,44],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":29,"updated_by":13},"2026-05-11 06:33:36.935Z","xp9ljhapsv79n2f","OpenAI API",{"collectionId":17,"collectionName":18,"created":33,"created_by":13,"id":34,"name":35,"updated":33,"updated_by":13},"2026-05-11 06:33:42.663Z","zaz00cag9km798l","GPT-4o",{"collectionId":17,"collectionName":18,"created":37,"created_by":13,"id":38,"name":39,"updated":37,"updated_by":13},"2026-05-11 06:33:48.022Z","9kb92fayji137ra","Go SDK",{"collectionId":17,"collectionName":18,"created":41,"created_by":13,"id":42,"name":43,"updated":41,"updated_by":13},"2026-05-11 06:33:54.162Z","3vum1z6wl8ko4hd","Streaming Mode",{"collectionId":17,"collectionName":18,"created":45,"created_by":13,"id":46,"name":47,"updated":48,"updated_by":13},"2026-03-04 08:47:46.433Z","z10c0wt82q6hzh4","AI development","2026-04-10 16:13:33.710Z",{"code":50,"collectionId":51,"collectionName":52,"created":53,"flag":54,"id":55,"is_default":56,"label":57,"updated":58},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":60,"collectionId":61,"collectionName":62,"created":63,"expand":64,"id":78,"slug":79,"updated":80,"views":81},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs","2026-05-11 06:34:05.494Z",{"category":65},{"blogIds":66,"collectionId":67,"collectionName":68,"created":69,"created_by":13,"id":60,"image":70,"image_alt":13,"image_path":71,"label":72,"name":73,"priority":74,"publish_at":75,"scheduled_at":13,"status":76,"updated":77,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":73,"th":73},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","zybalt8x8wve6gw","golang-openai-api-gpt4o-sdk-guide","2026-05-11 11:03:34.373Z",113,"9sxqwtz31ndwv1s",[20,25,30,34,38,42,46],"2026-05-17 17:00:00.000Z","สอนเขียน Go เชื่อมต่อสมองกล GPT-4o ตั้งแต่การ Setup SDK อย่างปลอดภัย การใช้ Streaming Mode และการจัดการ Error เมื่อ API มีปัญหา","Golang The Series EP.144: วิธีเชื่อมต่อ OpenAI API (GPT-4o) ด้วย Go SDK แบบมือโปร","2026-05-17 17:00:00.065Z",{"th":79,"en":79}]