diff --git a/src/client/chat.css b/src/client/chat.css new file mode 100644 index 0000000..6fea923 --- /dev/null +++ b/src/client/chat.css @@ -0,0 +1,5 @@ +$output>div.message { padding:20px; overflow:auto; } +$output>div.message>div.request { background-color:#94ec69; padding:10px; float:right; } +$output>div.message>div.request>span { float:right; } +$output>div.message>div.response { white-space:break-spaces; padding:0px; clear:both; } +$output>div.request { padding:20px; } \ No newline at end of file diff --git a/src/client/chat.go b/src/client/chat.go new file mode 100644 index 0000000..1829909 --- /dev/null +++ b/src/client/chat.go @@ -0,0 +1,27 @@ +package client + +import ( + "net/http" + + "shylinux.com/x/ice" + "shylinux.com/x/icebergs/base/web" + kit "shylinux.com/x/toolkits" +) + +type chat struct { + list string `name:"list name auto" help:"大模型对话"` +} + +func (s chat) Request(m *ice.Message, arg ...string) { + m.Optionv(web.SPIDE_STREAM, func(text string) { web.PushNoticeGrow(m.Message, text) }) + m.Cmdy(web.SPIDE, ice.DEV, web.SPIDE_STREAM, http.MethodPost, "http://localhost:11434/api/chat", + web.SPIDE_DATA, kit.Format(kit.Dict("model", "deepseek-r1", "stream", true, + "messages", kit.List(kit.Dict("role", "user", "content", arg[0])), + )), + ) +} +func (s chat) List(m *ice.Message, arg ...string) { + m.Display("").DisplayCSS("") +} + +func init() { ice.CodeModCmd(chat{}) } diff --git a/src/client/chat.js b/src/client/chat.js new file mode 100644 index 0000000..8a1464e --- /dev/null +++ b/src/client/chat.js @@ -0,0 +1,28 @@ +Volcanos(chat.ONIMPORT, { + _init: function(can, msg) { + can.ui = can.page.Append(can, can._output, [ + {view: "message"}, + {view: "request", list: [ + {type: "textarea", onkeydown: function(event) { + if (event.key == "Enter") { + can.onaction.request(event, can, event.target.value), event.target.value = "", can.onkeymap.prevent(event) + } + }}, + ]}, + ]) + can.ui.response = can.page.Append(can, can.ui.message, [{view: "response", list: [{text: "有什么问题尽管问吧!"}]}])._target + }, + _grow: function(can, msg, text) { var data = JSON.parse(text) + can.page.Append(can, can.ui.response, [{text: data.message.content}]), can.ui.message.scrollBy(0, 1000) + }, + layout: function(can) { + can.page.style(can, can.ui.message, html.MAX_HEIGHT, can.ConfHeight()-140) + } +}) +Volcanos(chat.ONACTION, { + request: function(event, can, text) { + can.page.Append(can, can.ui.message, [{view: "request", list: [{text: text}]}]) + can.ui.response = can.page.Append(can, can.ui.message, [{view: "response"}])._target + can.runAction(event, "request", [text], function(msg) {}) + }, +}) \ No newline at end of file diff --git a/src/client/client.go b/src/client/client.go index a138721..58bc7b2 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -1,15 +1,23 @@ package client -import "shylinux.com/x/ice" +import ( + "shylinux.com/x/ice" + "shylinux.com/x/icebergs/base/cli" +) type client struct { - ice.Hash - - list string `name:"list hash auto" help:"client"` + list string `name:"list NAME auto" help:"大模型"` } func (s client) List(m *ice.Message, arg ...string) { - s.Hash.List(m, arg...) + if len(arg) == 0 { + m.SplitIndex(s.cmdx(m, "list")) + } else if len(arg) == 1 { + m.Echo(s.cmdx(m, "show", arg[0])) + } +} +func (s client) cmdx(m *ice.Message, arg ...string) string { + return m.Cmdx(cli.SYSTEM, "ollama", arg) } -func init() { ice.Cmd("web.chat.client.client", client{}) } \ No newline at end of file +func init() { ice.Cmd("web.chat.ollama.client", client{}) } diff --git a/src/server/server.go b/src/server/server.go index c838a10..5563ca0 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -12,4 +12,4 @@ func (s server) List(m *ice.Message, arg ...string) { s.Hash.List(m, arg...) } -func init() { ice.Cmd("web.chat.server.server", server{}) } \ No newline at end of file +func init() { ice.Cmd("web.chat.ollama.server", server{}) } diff --git a/src/server/server.shy b/src/server/server.shy new file mode 100644 index 0000000..17d8091 --- /dev/null +++ b/src/server/server.shy @@ -0,0 +1,6 @@ +title "ollama" +refer ` +官网 https://ollama.com/ +源码 https://github.com/ollama/ollama +简介 https://blog.csdn.net/qq_40999403/article/details/139320266 +` \ No newline at end of file