This commit is contained in:
root 2025-02-10 08:30:21 +08:00
parent ac45330965
commit d821a27d9d
6 changed files with 56 additions and 64 deletions

View File

@ -1,7 +1,6 @@
$content { padding:10px 20px; } $content { padding:10px 20px; }
$content>div.message { padding:0px; overflow:auto; } $content>div.request { background-color:#94ec69; color:black; padding:10px; float:right; }
$content>div.message>div.request { background-color:#94ec69; color:black; padding:10px; float:right; clear:both; } $content>div.response { clear:both; }
$content>div.message>div.request>span { float:right; } $content>div.response p { margin:5px 0; }
$content>div.message>div.response { padding:0px; clear:both; } $display { background-color:var(--plugin-bg-color); height:120px; }
$content>div.message>div.response p { margin:5px 0; } $display textarea { margin:10px; width:calc(100% - 20px); }
$content>div.request { padding-top:10px; }

View File

@ -9,18 +9,18 @@ import (
) )
type chat struct { type chat struct {
client client client client
list string `name:"list list" help:"大模型对话" icon:"src/main.png"` request string `name:"request model* role* content* which*"`
list string `name:"list list" help:"大模型对话" icon:"src/main.png"`
} }
func (s chat) Request(m *ice.Message, arg ...string) { func (s chat) Request(m *ice.Message, arg ...string) {
m.Optionv(web.SPIDE_STREAM, func(text string) { web.PushNoticeGrow(m.Message, m.Option("which"), text) }) m.Cmdy(web.SPIDE, OLLAMA, web.SPIDE_STREAM, http.MethodPost, "/api/chat", web.SPIDE_DATA, kit.Format(kit.Dict(
m.Cmdy(web.SPIDE, ice.DEV, web.SPIDE_STREAM, http.MethodPost, "http://localhost:11434/api/chat", web.SPIDE_DATA, kit.Format(kit.Dict( m.OptionSimple("model"), "stream", true, "messages", kit.List(kit.Dict(m.OptionSimple("role", "content"))),
"model", m.Option("model"), "stream", true, "messages", kit.List(kit.Dict("role", "user", "content", arg[0])),
))) )))
} }
func (s chat) List(m *ice.Message, arg ...string) { func (s chat) List(m *ice.Message, arg ...string) {
m.Cmdy(s.client).Display("").DisplayCSS("") m.Cmdy(s.client).Display("").DisplayCSS("")
} }
func init() { ice.Cmd("web.chat.ollama.chat", chat{}) } func init() { ice.ChatModCmd(chat{}) }

View File

@ -1,30 +1,26 @@
Volcanos(chat.ONIMPORT, { Volcanos(chat.ONIMPORT, {
_init: function(can, msg) { _init: function(can, msg) { can.require(["https://unpkg.com/showdown/dist/showdown.min.js"])
can.require(["https://unpkg.com/showdown/dist/showdown.min.js"]) can.ui = can.onappend.layout(can), can.ui.responseList = [], can.onmotion.toggle(can, can.ui.display, true)
can.ui = can.onappend.layout(can), can.ui.responseList = []
msg.Table(function(value) { can.onimport.item(can, { msg.Table(function(value) { can.onimport.item(can, {
name: value.NAME, nick: value.NAME+" ("+value.SIZE+")", name: value.NAME, nick: value.NAME+" ("+value.SIZE+")",
}, function(event, item, show, target) { }, function(event, item, show, target) {
can.onimport.tabsCache(can, item, target, function() { can.onimport.content(can, target) }) can.onimport.tabsCache(can, item, target, function() { can.onimport.content(can, target) })
can.db.model = item.name, can.ui.message = target.ui.message, can.ui.request = target.ui.request
can.onappend._status(can, msg), can.onimport.layout(can) can.onappend._status(can, msg), can.onimport.layout(can)
}) }) }) })
}, },
content: function(can, target) { content: function(can, target) {
target.ui = can.page.Append(can, can.ui.content, [ can.page.Append(can, can.ui.content, [
{view: "message", list: [ {view: chat.RESPONSE, list: [
{view: "response", list: [ {text: can.user.trans(can, "Please Ask Anything!", "有什么问题尽管问吧!")},
{text: can.user.trans(can, "Please Ask Anything!", "有什么问题尽管问吧!")},
]},
]},
{view: "request", list: [
{type: html.TEXTAREA, onkeydown: function(event) {
if (event.key == code.ENTER) {
can.onaction.request(event, can, event.target.value), event.target.value = "", can.onkeymap.prevent(event)
}
}},
]}, ]},
]) ])
can.page.Append(can, can.ui.display, [
{type: html.TEXTAREA, placeholder: can.user.trans(can, "Please Input Your Question!", "请输入的您的问题!"), onkeydown: function(event) {
if (event.key == code.ENTER) {
can.onaction.request(event, can, event.target.value), event.target.value = "", can.onkeymap.prevent(event)
}
}},
])
}, },
_grow: function(can, msg, which, text) { _grow: function(can, msg, which, text) {
var target = can.ui.responseList[parseInt(which)-1], data = JSON.parse(text) var target = can.ui.responseList[parseInt(which)-1], data = JSON.parse(text)
@ -32,18 +28,13 @@ Volcanos(chat.ONIMPORT, {
var converter = new showdown.Converter(); target.innerHTML = converter.makeHtml(target._text) var converter = new showdown.Converter(); target.innerHTML = converter.makeHtml(target._text)
} else { } else {
can.page.Append(can, target, [{text: data.message.content}]) can.page.Append(can, target, [{text: data.message.content}])
} can.ui.message.scrollBy(0, 1000) } can.ui.content.scrollBy(0, 1000)
}, },
layout: function(can) {
can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function() {
can.ui.request && can.page.style(can, can.ui.message, html.MAX_HEIGHT, can.ConfHeight()-can.ui.request.offsetHeight-20)
})
}
}) })
Volcanos(chat.ONACTION, { Volcanos(chat.ONACTION, {
request: function(event, can, text) { can.page.Append(can, can.ui.message, [{view: "request", list: [{text: text}]}]) request: function(event, can, text) { can.page.Append(can, can.ui.content, [{view: chat.REQUEST, list: [{text: text}]}])
var response = can.page.Append(can, can.ui.message, [{view: "response"}])._target; can.ui.responseList.push(response) var response = can.page.Append(can, can.ui.content, [{view: chat.RESPONSE}])._target; can.ui.responseList.push(response)
can.request(event, {which: ""+can.ui.responseList.length, model: can.db.model}) can.request(event, {model: can.db.value.name, role: "user", content: text, which: ""+can.ui.responseList.length})
can.runAction(event, "request", [text], function(msg) {}) can.runAction(event, chat.REQUEST, [], function(msg) {})
}, },
}) })

View File

@ -3,12 +3,22 @@ package client
import ( import (
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
)
const (
OLLAMA = "ollama"
) )
type client struct { type client struct {
list string `name:"list NAME auto" help:"大模型"` list string `name:"list NAME auto" help:"大模型"`
} }
func (s client) Init(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, "http://localhost:11434/api/chat", OLLAMA, nfs.SRC_MAIN_PNG)
}
func (s client) List(m *ice.Message, arg ...string) { func (s client) List(m *ice.Message, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
m.SplitIndex(s.cmdx(m, ice.LIST)) m.SplitIndex(s.cmdx(m, ice.LIST))
@ -17,8 +27,8 @@ func (s client) List(m *ice.Message, arg ...string) {
} }
} }
func init() { ice.Cmd("web.chat.ollama.client", client{}) } func init() { ice.ChatModCmd(client{}) }
func (s client) cmdx(m *ice.Message, arg ...string) string { func (s client) cmdx(m *ice.Message, arg ...string) string {
return m.Cmdx(cli.SYSTEM, "ollama", arg) return m.Cmdx(cli.SYSTEM, OLLAMA, arg)
} }

View File

@ -6,21 +6,19 @@ refer `
应用 https://feizhuke.com/ 应用 https://feizhuke.com/
` `
chapter "chat" chapter "应用"
refer ` refer `
源码 https://github.com/shylinux/ollama-story 源码 https://github.com/shylinux/ollama-story
帖子 https://bbs.shylinux.com/forum.php?mod=viewthread&tid=6&extra=page%3D1 帖子 https://bbs.shylinux.com/forum.php?mod=viewthread&tid=6&extra=page%3D1
showdown https://igithub.com/showdownjs/showdown
nodejs https://nodejs.org/en
` `
field web.chat.ollama.chat field web.chat.ollama.chat
chapter "DeepSeek"
refer `
官网 https://www.deepseek.com/
简介 https://blog.csdn.net/qq_40999403/article/details/139320266
`
chapter "常用模型" chapter "常用模型"
refer ` refer `
硅基流动 https://siliconflow.cn/
深度求索 https://www.deepseek.com/
字节豆包 https://www.doubao.com/ 字节豆包 https://www.doubao.com/
腾讯元宝 https://yuanbao.tencent.com/ 腾讯元宝 https://yuanbao.tencent.com/
通义千问 https://tongyi.aliyun.com/ 通义千问 https://tongyi.aliyun.com/
@ -28,13 +26,7 @@ refer `
月之暗面 https://kimi.moonshot.cn/ 月之暗面 https://kimi.moonshot.cn/
` `
chapter "外部依赖" chapter "常用工具"
refer `
nodejs https://nodejs.org/en
showdown https://igithub.com/showdownjs/showdown
`
chapter "外部工具"
section "AnythingLLM" section "AnythingLLM"
refer ` refer `
官网 https://anythingllm.com/ 官网 https://anythingllm.com/
@ -50,19 +42,19 @@ refer `
section "OBS Studio" section "OBS Studio"
refer ` refer `
官网 https://obsproject.com/ 官网 https://obsproject.com/
文档 https://obsproject.com/kb/quick-start-guide
源码 https://github.com/obsproject/obs-studio 源码 https://github.com/obsproject/obs-studio
` `
section "community" section "community"
refer ` refer `
https://weibo.com/ https://x.com/
https://www.douyin.com/ https://discord.com/
https://www.xiaohongshu.com/ https://telegram.org/
https://www.bilibili.com/ https://www.facebook.com/
https://www.youtube.com/ https://www.youtube.com/
https://mail.google.com/ https://mail.google.com/
https://www.facebook.com/ https://www.bilibili.com/
https://x.com https://www.xiaohongshu.com/
https://t.me https://www.douyin.com/
https://telegram.org/ https://weibo.com/
https://discord.com/
` `

View File

@ -11,4 +11,4 @@ func (s server) List(m *ice.Message, arg ...string) {
s.Hash.List(m, arg...) s.Hash.List(m, arg...)
} }
func init() { ice.Cmd("web.chat.ollama.server", server{}) } func init() { ice.ChatModCmd(server{}) }