diff --git a/package-lock.json b/package-lock.json index 2b56f36..2b7a616 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "lucide-vue-next": "^0.563.0", "markstream-vue": "^0.0.7-beta.4", "mermaid": "^11.12.2", + "naive-ui": "^2.44.1", "pinia": "^3.0.4", "shiki": "^3.22.0", "stream-markdown": "^0.0.14", @@ -220,6 +221,30 @@ "integrity": "sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==", "license": "Apache-2.0" }, + "node_modules/@css-render/plugin-bem": { + "version": "0.15.14", + "resolved": "https://mirrors.cloud.tencent.com/npm/@css-render/plugin-bem/-/plugin-bem-0.15.14.tgz", + "integrity": "sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==", + "license": "MIT", + "peerDependencies": { + "css-render": "~0.15.14" + } + }, + "node_modules/@css-render/vue3-ssr": { + "version": "0.15.14", + "resolved": "https://mirrors.cloud.tencent.com/npm/@css-render/vue3-ssr/-/vue3-ssr-0.15.14.tgz", + "integrity": "sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.0.11" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -741,6 +766,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" + }, "node_modules/@mermaid-js/parser": { "version": "1.0.1", "resolved": "https://mirrors.cloud.tencent.com/npm/@mermaid-js/parser/-/parser-1.0.1.tgz", @@ -1819,6 +1850,21 @@ "@types/unist": "*" } }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://mirrors.cloud.tencent.com/npm/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", @@ -2838,6 +2884,12 @@ "url": "https://github.com/sponsors/sxzz" } }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://mirrors.cloud.tencent.com/npm/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, "node_modules/autoprefixer": { "version": "10.4.24", "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.24.tgz", @@ -3173,6 +3225,22 @@ "node": ">= 8" } }, + "node_modules/css-render": { + "version": "0.15.14", + "resolved": "https://mirrors.cloud.tencent.com/npm/css-render/-/css-render-0.15.14.tgz", + "integrity": "sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "~0.8.0", + "csstype": "~3.0.5" + } + }, + "node_modules/css-render/node_modules/csstype": { + "version": "3.0.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.0.11.tgz", + "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", + "license": "MIT" + }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-3.1.0.tgz", @@ -3700,6 +3768,25 @@ "lodash-es": "^4.17.21" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-tz": { + "version": "3.2.0", + "resolved": "https://mirrors.cloud.tencent.com/npm/date-fns-tz/-/date-fns-tz-3.2.0.tgz", + "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", + "license": "MIT", + "peerDependencies": { + "date-fns": "^3.0.0 || ^4.0.0" + } + }, "node_modules/dayjs": { "version": "1.11.19", "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", @@ -3927,6 +4014,12 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, + "node_modules/evtd": { + "version": "0.2.4", + "resolved": "https://mirrors.cloud.tencent.com/npm/evtd/-/evtd-0.2.4.tgz", + "integrity": "sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==", + "license": "MIT" + }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://mirrors.cloud.tencent.com/npm/expect-type/-/expect-type-1.3.0.tgz", @@ -4121,6 +4214,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", @@ -4872,6 +4974,38 @@ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "license": "MIT" }, + "node_modules/naive-ui": { + "version": "2.44.1", + "resolved": "https://mirrors.cloud.tencent.com/npm/naive-ui/-/naive-ui-2.44.1.tgz", + "integrity": "sha512-reo8Esw0p58liZwbUutC7meW24Xbn3EwNv91zReWKm2W4JPu+zfgJRn/F7aO0BFmvN+h2brA2M5lRvYqLq4kuA==", + "license": "MIT", + "dependencies": { + "@css-render/plugin-bem": "^0.15.14", + "@css-render/vue3-ssr": "^0.15.14", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "async-validator": "^4.2.5", + "css-render": "^0.15.14", + "csstype": "^3.1.3", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "evtd": "^0.2.4", + "highlight.js": "^11.8.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "seemly": "^0.3.10", + "treemate": "^0.3.11", + "vdirs": "^0.1.8", + "vooks": "^0.2.12", + "vueuc": "^0.4.65" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", @@ -5363,6 +5497,12 @@ "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "license": "MIT" }, + "node_modules/seemly": { + "version": "0.3.10", + "resolved": "https://mirrors.cloud.tencent.com/npm/seemly/-/seemly-0.3.10.tgz", + "integrity": "sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://mirrors.cloud.tencent.com/npm/semver/-/semver-7.7.4.tgz", @@ -5749,6 +5889,12 @@ "node": ">=6" } }, + "node_modules/treemate": { + "version": "0.3.11", + "resolved": "https://mirrors.cloud.tencent.com/npm/treemate/-/treemate-0.3.11.tgz", + "integrity": "sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==", + "license": "MIT" + }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", @@ -6055,6 +6201,18 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/vdirs": { + "version": "0.1.8", + "resolved": "https://mirrors.cloud.tencent.com/npm/vdirs/-/vdirs-0.1.8.tgz", + "integrity": "sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", @@ -6239,6 +6397,18 @@ } } }, + "node_modules/vooks": { + "version": "0.2.12", + "resolved": "https://mirrors.cloud.tencent.com/npm/vooks/-/vooks-0.2.12.tgz", + "integrity": "sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==", + "license": "MIT", + "dependencies": { + "evtd": "^0.2.2" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://mirrors.cloud.tencent.com/npm/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -6423,6 +6593,24 @@ "typescript": ">=5.0.0" } }, + "node_modules/vueuc": { + "version": "0.4.65", + "resolved": "https://mirrors.cloud.tencent.com/npm/vueuc/-/vueuc-0.4.65.tgz", + "integrity": "sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==", + "license": "MIT", + "dependencies": { + "@css-render/vue3-ssr": "^0.15.10", + "@juggle/resize-observer": "^3.3.1", + "css-render": "^0.15.10", + "evtd": "^0.2.4", + "seemly": "^0.3.6", + "vdirs": "^0.1.4", + "vooks": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.11" + } + }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", diff --git a/package.json b/package.json index 3d4aa95..e4661d8 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "lucide-vue-next": "^0.563.0", "markstream-vue": "^0.0.7-beta.4", "mermaid": "^11.12.2", + "naive-ui": "^2.44.1", "pinia": "^3.0.4", "shiki": "^3.22.0", "stream-markdown": "^0.0.14", diff --git a/server/adapters/glm_adapter.py b/server/adapters/glm_adapter.py index 3d20c78..89e57d0 100644 --- a/server/adapters/glm_adapter.py +++ b/server/adapters/glm_adapter.py @@ -29,7 +29,7 @@ GLM_MODELS = [ ), ModelInfo( id="glm-4.6v", - name="GLM-4.6V(推荐)", + name="GLM-4.6V", description="最新旗舰模型,支持文本/图像/文档/深度思考", max_tokens=128000, provider="ZhipuAI", diff --git a/server/middleware/auth.py b/server/middleware/auth.py index 190bdda..47c9199 100644 --- a/server/middleware/auth.py +++ b/server/middleware/auth.py @@ -20,7 +20,6 @@ def get_current_user_id(request) -> str: Returns: 用户 ID 字符串 """ - # TODO: 实现 token 验证逻辑 # 示例: # auth_header = request.headers.get("Authorization") # if auth_header and auth_header.startswith("Bearer "): diff --git a/server/utils/oss_uploader.py b/server/utils/oss_uploader.py index b090970..a32dee0 100644 --- a/server/utils/oss_uploader.py +++ b/server/utils/oss_uploader.py @@ -61,7 +61,6 @@ def _generate_object_key(filename: str, prefix: str = "chat-ui") -> str: 根据文件名生成唯一的 OSS 对象 Key 格式: {prefix}/{日期}/{uuid}_{原始文件名} """ - # TODO: 需要按用户ID分目录 date_str = datetime.now().strftime("%Y%m%d") unique_id = uuid.uuid4().hex[:8] safe_name = Path(filename).name # 只取文件名,去掉路径 diff --git a/src/App.vue b/src/App.vue index f41da5c..ac99e7a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,24 +1,28 @@ - - + + + + - - - - - - - - {{ toast.message }} - - - - + + + + + + + + {{ toast.message }} + + + + + + diff --git a/src/components/icons/custom/CodeIcon.vue b/src/components/icons/custom/CodeIcon.vue new file mode 100644 index 0000000..40c83c2 --- /dev/null +++ b/src/components/icons/custom/CodeIcon.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/components/icons/custom/DeleteIcon.vue b/src/components/icons/custom/DeleteIcon.vue new file mode 100644 index 0000000..96637ab --- /dev/null +++ b/src/components/icons/custom/DeleteIcon.vue @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/components/icons/custom/EditIcon.vue b/src/components/icons/custom/EditIcon.vue new file mode 100644 index 0000000..0d1b17e --- /dev/null +++ b/src/components/icons/custom/EditIcon.vue @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/components/icons/custom/GuideIcon.vue b/src/components/icons/custom/GuideIcon.vue new file mode 100644 index 0000000..37908ad --- /dev/null +++ b/src/components/icons/custom/GuideIcon.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/components/icons/custom/MessageIcon.vue b/src/components/icons/custom/MessageIcon.vue new file mode 100644 index 0000000..8916cca --- /dev/null +++ b/src/components/icons/custom/MessageIcon.vue @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/src/components/icons/custom/PinIcon.vue b/src/components/icons/custom/PinIcon.vue new file mode 100644 index 0000000..330013a --- /dev/null +++ b/src/components/icons/custom/PinIcon.vue @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/src/components/icons/custom/SendIcon.vue b/src/components/icons/custom/SendIcon.vue new file mode 100644 index 0000000..10c652a --- /dev/null +++ b/src/components/icons/custom/SendIcon.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/components/icons/custom/ShareIcon.vue b/src/components/icons/custom/ShareIcon.vue new file mode 100644 index 0000000..0e17c96 --- /dev/null +++ b/src/components/icons/custom/ShareIcon.vue @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/components/icons/custom/SidebarCollapseIcon.vue b/src/components/icons/custom/SidebarCollapseIcon.vue new file mode 100644 index 0000000..118ffd9 --- /dev/null +++ b/src/components/icons/custom/SidebarCollapseIcon.vue @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/src/components/icons/custom/SidebarExpandIcon.vue b/src/components/icons/custom/SidebarExpandIcon.vue new file mode 100644 index 0000000..b5da105 --- /dev/null +++ b/src/components/icons/custom/SidebarExpandIcon.vue @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/src/components/icons/custom/StudyIcon.vue b/src/components/icons/custom/StudyIcon.vue new file mode 100644 index 0000000..efddff6 --- /dev/null +++ b/src/components/icons/custom/StudyIcon.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/components/icons/custom/ThesisIcon.vue b/src/components/icons/custom/ThesisIcon.vue new file mode 100644 index 0000000..3e7ec0c --- /dev/null +++ b/src/components/icons/custom/ThesisIcon.vue @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/src/components/icons/custom/WritingIcon.vue b/src/components/icons/custom/WritingIcon.vue new file mode 100644 index 0000000..e0245e5 --- /dev/null +++ b/src/components/icons/custom/WritingIcon.vue @@ -0,0 +1,16 @@ + + + + + + + diff --git a/src/components/input/ChatInput.vue b/src/components/input/ChatInput.vue index 9f195e8..aeeaeaa 100644 --- a/src/components/input/ChatInput.vue +++ b/src/components/input/ChatInput.vue @@ -1,137 +1,82 @@ - + - + - + - - + + - + - - - - - - - - - - - + - + - + @click="!isForceDeepThinkingModel && supports_thinking && toggleDeepThink()"> 深度思考 - + 深度搜索 - + 联网搜索 + + + + + + + + + + + @@ -155,6 +100,7 @@ import type { Attachment } from "@/types/chat"; import { chatApi } from "@/services/api"; import { useAuthStore } from "@/stores/auth"; import { useSettingsStore } from "@/stores/settings"; +import SendIcon from "../icons/custom/SendIcon.vue"; interface AttachmentWithProgress extends Attachment { uploading?: boolean; @@ -562,7 +508,7 @@ onMounted(() => {