File size: 1,856 Bytes
c4c046d
 
 
9a44a33
c4c046d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9a44a33
 
 
 
 
 
 
 
 
 
 
c4c046d
 
 
9a44a33
c4c046d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
local cjson = require("cjson")
local websocket = require("resty.websocket.client")

local retried = 0
local conn = assert(websocket:new({max_payload_len = 1024 * 1024 * 8}))
assert(conn:connect("ws://localhost:8046/cgemma/session"))
while true do
  local data, tp, err = conn:recv_frame()
  while err == "again" do
    local frag, ct
    frag, ct, err = conn:recv_frame()
    if ct ~= "continuation" then
      conn:close()
      error(err)
    end
    data = data..frag
  end
  if tp == "text" then
    print(data)
    io.flush()
    local msg = cjson.decode(data)
    if msg.op == "init" then
      local bytes, err = conn:send_text(cjson.encode({
        op = "create",
        image = ngx.encode_base64(io.read("*a")),
        lang = "zh",
        poet = "海子"
      }))
      if not bytes then
        error(err)
      end
    elseif msg.op == "stream" and not msg.token then
      if retried == 0 then
        assert(conn:send_text(cjson.encode({op = "retry"})))
      elseif retried == 1 then
        assert(conn:send_text(cjson.encode({
          op = "retry",
          lang = "en",
          poet = "Emily Dickinson"
        })))
      elseif retried == 2 then
        assert(conn:send_text(cjson.encode({op = "retry"})))
      else
        conn:close()
        return
      end
      retried = retried + 1
    end
  elseif tp == "ping" then
    local res, err = conn:send_pong()
    if not res then
      conn:close()
      error(err)
    end
  elseif tp == "close" then
    conn:close()
    return
  elseif tp ~= "pong" then
    if err then
      if conn.fatal then
        conn:close()
        error(err)
      end
    else
      local res, err = conn:send_close(1003, "unsupported data type")
      if not res then
        conn:close()
        error(err)
      end
      conn:close()
      error("unsupported data type")
    end
  end
end