diff --git a/examples/forms/chatgpt.own b/examples/forms/chatgpt.own
new file mode 100644
index 0000000..3e707c8
--- /dev/null
+++ b/examples/forms/chatgpt.own
@@ -0,0 +1,59 @@
+use std, okhttp, json, forms
+
+OPENAI_API_KEY=getenv("OPENAI_API_KEY", "your-api-key")
+CONTENT_TYPE = "application/json; charset=utf-8"
+
+chatHistory = newLabel("ChatGPT
")
+messageField = newTextField()
+sendButton = newButton("Send")
+
+messageField.onAction(::onSend)
+sendButton.onClick(::onSend)
+def onSend() {
+ text = messageField.getText()
+ if (length(text) == 0) return 0
+ messageField.setText("")
+ chatHistory.setText(chatHistory.getText() + "
you > " + text)
+
+ thread(def(content) {
+ r = okhttp.request()
+ .header("Authorization", "Bearer " + OPENAI_API_KEY)
+ .url("https://api.openai.com/v1/chat/completions")
+ .post(RequestBody.string(CONTENT_TYPE, jsonencode({
+ "model": "gpt-3.5-turbo",
+ "messages": [{"role": "user", "content": content}]
+ })))
+ .newCall(okhttp.client)
+ .execute()
+ .body()
+ .string()
+
+ println r
+ resp = jsondecode(r)
+ if arrayKeyExists("error", resp) {
+ error = "Error #" + resp.error.code + ": " + resp.error.message
+ chatHistory.setText(chatHistory.getText() + "
" + error + "")
+ } else {
+ answer = resp.choices[0].message.content
+ asnwer = answer.replace("\n", "
")
+ chatHistory.setText(chatHistory.getText() + "
ai > " + answer + "")
+ }
+ }, text)
+}
+
+messagePanel = newPanel()
+messagePanel.setLayout(boxLayout(messagePanel, BoxLayout.LINE_AXIS))
+messagePanel.add(messageField)
+messagePanel.add(sendButton)
+
+mainPanel = newPanel(borderLayout(10, 10))
+mainPanel.setPreferredSize(400, 250)
+mainPanel.add(chatHistory, BorderLayout.CENTER)
+mainPanel.add(messagePanel, BorderLayout.SOUTH)
+
+window = newWindow("ChatGPT")
+window.setMinimumSize(200, 220)
+window.setLocationByPlatform()
+window.add(mainPanel)
+window.pack()
+window.setVisible()