This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/dubbo-go-samples.git


The following commit(s) were added to refs/heads/main by this push:
     new a150316c bug fix and rewirte image encode and decode logic (#807)
a150316c is described below

commit a150316c7837b1247070e050466af94cfcccd576
Author: Alan <[email protected]>
AuthorDate: Mon Mar 10 23:59:53 2025 +0800

    bug fix and rewirte image encode and decode logic (#807)
    
    * fix import
    
    * fix readme dir
    
    * rewrite image encode and decode logic to support image files robustness 
and fix out of bounds err
    
    * fix typo
    
    * limit upload file types and add clarification in the readme
    
    * limit upload file types and add clarification in the readme
    
    * Revert "limit upload file types and add clarification in the readme"
    
    This reverts commit 8c514464208b43e982258724fabd58d09bf2bcb6.
    
    * limit upload file types and add clarification in the readme
---
 llm/README.md                               |  7 ++++---
 llm/README_zh.md                            | 10 +++++-----
 llm/go-client/frontend/handlers/chat.go     | 18 +++++++++++++++---
 llm/go-client/frontend/static/script.js     |  3 +++
 llm/go-client/frontend/templates/index.html |  2 +-
 llm/go-server/cmd/server.go                 | 12 +++++++-----
 6 files changed, 35 insertions(+), 17 deletions(-)

diff --git a/llm/README.md b/llm/README.md
index ed909b81..a7472907 100644
--- a/llm/README.md
+++ b/llm/README.md
@@ -48,7 +48,7 @@ The server integrates the Ollama model and uses Dubbo-go's 
RPC service for invoc
 Run the server by executing:
 
 ```shell
-$ go run llm/go-server/cmd/server.go
+$ go run go-server/cmd/server.go
 ```
 
 ### **Run the Client**
@@ -58,7 +58,7 @@ The client invokes the server's RPC interface to retrieve the 
inference results
 Run the cli client by executing:
 
 ```shell
-$ go run llm/go-client/cmd/client.go
+$ go run go-client/cmd/client.go
 ```
 
 Cli client supports multi-turn conversations, command interact, context 
management.
@@ -66,7 +66,8 @@ Cli client supports multi-turn conversations, command 
interact, context manageme
 We also support a frontend using Gin framework for users to interact. If you 
want run the frontend client you can executing the following command and open 
it in ```localhost:8080``` by default:
 
 ```shell
-$ go run llm/go-client/frontend/main.go
+$ go run go-client/frontend/main.go
 ```
 
 Frontend client supports multi-turn conversations, binary file (image) support 
for LLM interactions.
+Currently the supported uploaded image types are limited to png, jpeg and gif, 
with plans to support more binary file types in the future.
diff --git a/llm/README_zh.md b/llm/README_zh.md
index 7f81488f..3000c1fc 100644
--- a/llm/README_zh.md
+++ b/llm/README_zh.md
@@ -48,7 +48,7 @@ $ cd llm
 在服务端目录下运行:
 
 ```shell
-$ go run llm/go-server/cmd/server.go
+$ go run go-server/cmd/server.go
 ```
 
 ### **客户端运行**
@@ -58,7 +58,7 @@ $ go run llm/go-server/cmd/server.go
 在客户端目录下运行:
 
 ```shell
-$ go run llm/go-client/cmd/client.go
+$ go run go-client/cmd/client.go
 ```
 
 命令行客户端支持多轮对话、命令交互、上下文管理功能。
@@ -66,8 +66,8 @@ $ go run llm/go-client/cmd/client.go
 我们也提供了包含前端页面的基于Gin框架的客户端进行交互,运行以下命令然后访问 ```localhost:8080``` 即可使用:
 
 ```shell
-$ go run llm/go-client/frontend/main.go
+$ go run go-client/frontend/main.go
 ```
 
-包含前端页面的客户端支持多轮对话,支持进行二进制文件(图片)传输并与大模型进行交互.
-
+包含前端页面的客户端支持多轮对话,支持进行二进制文件(图片)传输并与大模型进行交互。
+目前所支持上传的图片类型被限制为 png,jpeg 和 gif 类型,计划在将来支持更多的二进制文件类型。
\ No newline at end of file
diff --git a/llm/go-client/frontend/handlers/chat.go 
b/llm/go-client/frontend/handlers/chat.go
index c65ab5d9..e16197e2 100644
--- a/llm/go-client/frontend/handlers/chat.go
+++ b/llm/go-client/frontend/handlers/chat.go
@@ -22,8 +22,8 @@ import (
        "io"
        "log"
        "net/http"
+       "regexp"
        "runtime/debug"
-       "strings"
        "time"
 )
 
@@ -82,13 +82,25 @@ func (h *ChatHandler) Chat(c *gin.Context) {
                return
        }
 
-       sepIndex := strings.Index(",", req.Bin)
+       var img string
+       if len(req.Bin) > 0 {
+               re := 
regexp.MustCompile(`^data:image/([a-zA-Z]+);base64,([^"]+)$`)
+               // this regex does not support file types like svg
+               matches := re.FindStringSubmatch(req.Bin)
+
+               if len(matches) != 3 {
+                       c.JSON(http.StatusBadRequest, gin.H{"error": "invalid 
base64 data format"})
+                       return
+               }
+
+               img = matches[2]
+       }
 
        messages := h.ctxManager.GetHistory(ctxID)
        messages = append(messages, &chat.ChatMessage{
                Role:    "human",
                Content: req.Message,
-               Bin:     []byte(req.Bin[sepIndex+1:]),
+               Bin:     []byte(img),
        })
 
        stream, err := h.svc.Chat(context.Background(), &chat.ChatRequest{
diff --git a/llm/go-client/frontend/static/script.js 
b/llm/go-client/frontend/static/script.js
index d09d1517..3b56d2cc 100644
--- a/llm/go-client/frontend/static/script.js
+++ b/llm/go-client/frontend/static/script.js
@@ -23,6 +23,7 @@ const createChatLi = (message, className) => {
 
 const handleChat = () => {
     userMessage = chatInput.value.trim(); // Get user entered message and 
remove extra whitespace
+    userBin = null
     if (fileBlobArr.length > 0) {
         userBin = fileBlobArr[0]
     }
@@ -204,6 +205,8 @@ function clear() {
     document.getElementById("drop").style.display = "none";
     addBtn.style.display = "flex";
     fileInput.value = "";
+    fileBlobArr = [];
+    fileArr = [];
 }
 
 document.getElementById("drop").addEventListener('click', clear);
\ No newline at end of file
diff --git a/llm/go-client/frontend/templates/index.html 
b/llm/go-client/frontend/templates/index.html
index 68eefdc5..35aef33a 100644
--- a/llm/go-client/frontend/templates/index.html
+++ b/llm/go-client/frontend/templates/index.html
@@ -41,7 +41,7 @@
 
     </div>
 
-    <input id="input" accept="image/*" type="file" style="display: none" >
+    <input id="input" accept="image/png, image/jpeg, image/gif" type="file" 
style="display: none" >
 
   </body>
 
diff --git a/llm/go-server/cmd/server.go b/llm/go-server/cmd/server.go
index c4e752fb..8f2b88ec 100644
--- a/llm/go-server/cmd/server.go
+++ b/llm/go-server/cmd/server.go
@@ -19,8 +19,10 @@ package main
 
 import (
        "context"
+       "encoding/base64"
        "fmt"
        "log"
+       "net/http"
        "runtime/debug"
 )
 
@@ -81,13 +83,13 @@ func (s *ChatServer) Chat(ctx context.Context, req 
*chat.ChatRequest, stream cha
                }
 
                if msg.Bin != nil && len(msg.Bin) != 0 {
-                       img := string(msg.Bin)
+                       decodeByte, err := 
base64.StdEncoding.DecodeString(string(msg.Bin))
                        if err != nil {
-                               log.Println("Decode image error:", err)
-                               return fmt.Errorf("decode image error: %s", err)
+                               log.Println("GenerateContent failed: %v", err)
+                               return fmt.Errorf("GenerateContent failed")
                        }
-
-                       messageContent.Parts = append(messageContent.Parts, 
llms.BinaryPart("image/png", img))
+                       imgType := http.DetectContentType(decodeByte)
+                       messageContent.Parts = append(messageContent.Parts, 
llms.BinaryPart(imgType, decodeByte))
                }
 
                messages = append(messages, messageContent)

Reply via email to