Slide 1

Slide 1 text

GoとServer-Sent Events shuntaka 2022/04/12 Let's Go Talk #9 (GoのLT会)

Slide 2

Slide 2 text

自己紹介 宜しくお願いします😌 埼玉からお送りしています! GitHub: https://github.com/shuntaka9576 blog: https://shuntaka.dev 仕事: AWS,IoT,サーバサイド,TypeScript,Pythonなど Go歴: 仕事ではほぼなく、ときどき趣味で書きます、、

Slide 3

Slide 3 text

目次 ・そもそもServer-Sent Events ・Server-Sent Eventsを調査した経緯 ・Goで実装する ・作ったツールの紹介

Slide 4

Slide 4 text

そもそも Server-Sent Events

Slide 5

Slide 5 text

Server-Sent Events(出典,詳細: MDN) リアルタイム通信をWebアプリケーションに実装するための技術 ・HTTP/1.1とHTTP/2に対応 ・単方向通信 WebSocketは双方向で、専用プロトコル

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

フィールドは複数ある(出典,詳細: MDN) ・event … イベントの種別 ・data … メッセージ内容(今回はdataだけ知っていればOK) ・id … EventSourceに設定するイベント ID ・retry … 指定時間待機後再接続要求

Slide 9

Slide 9 text

Server-Sent Eventsを調査した 経緯

Slide 10

Slide 10 text

OpenAI API ・OpenAIのAPIのサービス ・ChatGPTのWeb版(chat.openai.com)の機能がAPIとして提供 されている

Slide 11

Slide 11 text

ChatGPTの課金体系 ・ChatGPTのサブスクとAPIは課金体系が**別** ・ChatGPT Plusはサブスク$20 ・OpenAI APIは従量課金 ※ Open AI APIのGPT-4は、waitlistに登録しないと使えない。

Slide 12

Slide 12 text

仮説 使い方次第ではサブスクよりAPIを使った方が安くなるケースがあ りそう。

Slide 13

Slide 13 text

CLIを作ろう Gopher CLI作りがち問題...

Slide 14

Slide 14 text

CLI設計 ・Web版のような徐々に出力される体験にしたい 🤔

Slide 15

Slide 15 text

参考

Slide 16

Slide 16 text

Goで実装する

Slide 17

Slide 17 text

実装方法 1. github.com/sashabaranov/go-openai 2. github.com/r3labs/sse 3. 自前

Slide 18

Slide 18 text

3を選択 1. github.com/sashabaranov/go-openai => 多分一番穏便(ライブラリ内でSSEは自前実装) 2. github.com/r3labs/sse => GET以外のメソッドで未対応。パッチ当てればOK 3. 自前 => 2.を参考にしつつ実装した

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

GitHubコード Response.Bodyをリアルタイム逐次読み出し

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

*bufio.Scanner *Response.Body (io.Reader) ストリーム読み 取りgoroutine ① ReadEvent ② Response GitHubコード 改行\n\nで逐次読み出し scanner.Split(splitFunc) メインgoroutine channel ② Response ③ ④ 標準出力 Server-Sent Event

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

作ったツールの紹介 github.com/shuntaka9576/oax

Slide 26

Slide 26 text

詳細はZennのブログ記事へ

Slide 27

Slide 27 text

oax(OpenAI eXecuter) 動作 その1 所要2分くらいあれば実演

Slide 28

Slide 28 text

oax(OpenAI eXecuter) 動作 その1

Slide 29

Slide 29 text

oax(OpenAI eXecuter) 動作 その2

Slide 30

Slide 30 text

使ってよかったライブラリ github.com/alecthomas/kong github.com/itchyny/timefmt-go github.com/ktr0731/go-fuzzyfinder(2つ目Gifは99.9%こちらのラ イブラリのおかげ)

Slide 31

Slide 31 text

まとめ SSEのリアルタイムイベントハンドリングは、Goの得意分野 ・net/httpの豊富な機能 ・io.Readerのリアルタイムストリームを読み出し ・goroutineやchannelを使った並行処理

Slide 32

Slide 32 text

ご静聴ありがとうございました。