feat(iod): 重构数联网搜索功能

- 新增数联网设置页面
- 优化数联网搜索结果展示
- 添加数据集、科创场景和科技企业等不同类型的搜索结果
- 重构搜索结果卡片组件,支持加载状态和不同展示模式
- 更新数联网搜索相关的国际化文案
This commit is contained in:
zhaoweijie
2025-08-22 17:15:19 +08:00
parent efbf2a3eff
commit 17020e8755
33 changed files with 1321 additions and 773 deletions

View File

@@ -1,30 +1,31 @@
import Markdown from "../../Common/Markdown"
import React from "react"
import { Tag, Image, Tooltip, Collapse, Popover } from "antd"
import { Collapse, Image, Popover, Tag, Tooltip } from "antd"
import { WebSearch } from "./WebSearch"
import {
ArrowUpSquare,
CheckIcon,
ClipboardIcon,
InfoIcon,
MessageSquareShare,
Pen,
PlayIcon,
RotateCcw,
Square,
Star,
ThumbsUp,
ThumbsDown,
MessageSquareShare,
ArrowUpSquare
ThumbsUp
} from "lucide-react"
import { EditMessageForm } from "./EditMessageForm"
import { useTranslation } from "react-i18next"
import { MessageSource } from "./MessageSource"
import { useTTS } from "@/hooks/useTTS"
import { tagColors } from "@/utils/color"
import { removeModelSuffix } from "@/db/models"
import { GenerationInfo } from "./GenerationInfo"
import { parseReasoning } from "@/libs/reasoning"
import { humanizeMilliseconds } from "@/utils/humanize-milliseconds"
import { AllIodRegistryEntry } from "@/types/iod.ts"
type Props = {
message: string
message_type?: string
@@ -42,7 +43,7 @@ type Props = {
webSearch?: {}
isSearchingInternet?: boolean
webSources?: any[]
iodSources?: any[]
iodSources?: AllIodRegistryEntry
hideEditAndRegenerate?: boolean
onSourceClick?: (source: any) => void
isTTSEnabled?: boolean
@@ -60,7 +61,8 @@ export const PlaygroundMessage = (props: Props) => {
return (
<div className="group relative flex w-full flex-col items-end justify-center pb-2 md:px-4 text-gray-800 dark:text-gray-100">
{/* <div className="text-base md:max-w-2xl lg:max-w-xl xl:max-w-3xl flex lg:px-0 m-auto w-full"> */}
<div className={`flex flex-row gap-1 md:gap-1 my-2 m-auto w-full ${props.isBot ? "" : "flex-row-reverse"}`}>
<div
className={`flex flex-row gap-1 md:gap-1 my-2 m-auto w-full ${props.isBot ? "" : "flex-row-reverse"}`}>
<div className="w-8 flex flex-col relative items-center justify-center bottom-[8px]">
<div className="relative h-7 w-7 p-1 rounded-sm text-white flex items-center justify-center text-opacity-100r">
{props.isBot ? (
@@ -77,8 +79,7 @@ export const PlaygroundMessage = (props: Props) => {
</div>
</div>
<div className="flex w-[calc(100%-50px)] flex-col gap-2 lg:w-[calc(100%-115px)]">
<span className="text-xs font-bold text-gray-800 dark:text-white">
</span>
<span className="text-xs font-bold text-gray-800 dark:text-white"></span>
{props.isBot &&
props.isSearchingInternet &&
@@ -101,6 +102,7 @@ export const PlaygroundMessage = (props: Props) => {
return (
<Collapse
key={i}
defaultActiveKey={['reasoning']}
className="border-none !mb-3"
items={[
{
@@ -132,8 +134,7 @@ export const PlaygroundMessage = (props: Props) => {
) : (
<p
className={`prose-lg dark:prose-invert whitespace-pre-line prose-p:leading-relaxed prose-pre:p-0 dark:prose-dark ${
props.message_type &&
"italic dark:text-gray-400"
props.message_type && "italic dark:text-gray-400"
} flex flex-row-reverse`}>
{props.message}
{/*<span className="bg-[#0000000a] inline-block py-[9px] text-[#000000d9] rounded-xl px-4 font-light text-sm">{props.message}</span>*/}
@@ -170,9 +171,10 @@ export const PlaygroundMessage = (props: Props) => {
<Collapse
className="mt-6"
ghost
// defaultActiveKey={['webSources']}
items={[
{
key: "1",
key: "webSources",
label: (
<div className="italic text-gray-500 dark:text-gray-400">
{t("webCitations")}
@@ -194,13 +196,14 @@ export const PlaygroundMessage = (props: Props) => {
]}
/>
)}
{props.isBot && props?.iodSources && props?.iodSources.length > 0 && (
{props.isBot && props?.iodSources && Object.values(props?.iodSources).map(item => item.data).flat().length > 0 && (
<Collapse
className="mt-6"
ghost
// defaultActiveKey={['iod']}
items={[
{
key: "1",
key: "iod",
label: (
<div className="italic text-gray-500 dark:text-gray-400">
{t("iodCitations")}
@@ -208,7 +211,7 @@ export const PlaygroundMessage = (props: Props) => {
),
children: (
<div className="mb-3 flex flex-wrap gap-2">
{props?.iodSources?.map((source, index) => (
{Object.values(props?.iodSources).map(item => item.data).flat()?.map((source, index) => (
<MessageSource
onSourceClick={props.onSourceClick}
key={index}
@@ -315,7 +318,7 @@ export const PlaygroundMessage = (props: Props) => {
</button>
</Tooltip>
)}
{ (
{
<Tooltip title="收藏">
<button
aria-label="收藏"
@@ -323,8 +326,8 @@ export const PlaygroundMessage = (props: Props) => {
<Star className="w-3 h-3 text-gray-400 group-hover:text-gray-500" />
</button>
</Tooltip>
)}
{ (
}
{
<Tooltip title="发布语用">
<button
aria-label="发布语用"
@@ -332,8 +335,8 @@ export const PlaygroundMessage = (props: Props) => {
<ArrowUpSquare className="w-3 h-3 text-gray-400 group-hover:text-gray-500" />
</button>
</Tooltip>
)}
{ (
}
{
<Tooltip title="发布对话">
<button
aria-label="发布对话"
@@ -341,8 +344,8 @@ export const PlaygroundMessage = (props: Props) => {
<MessageSquareShare className="w-3 h-3 text-gray-400 group-hover:text-gray-500" />
</button>
</Tooltip>
)}
{ (
}
{
<Tooltip title="点赞">
<button
aria-label="点赞"
@@ -350,8 +353,8 @@ export const PlaygroundMessage = (props: Props) => {
<ThumbsUp className="w-3 h-3 text-gray-400 group-hover:text-gray-500" />
</button>
</Tooltip>
)}
{ (
}
{
<Tooltip title="点踩">
<button
aria-label="点踩"
@@ -359,7 +362,7 @@ export const PlaygroundMessage = (props: Props) => {
<ThumbsDown className="w-3 h-3 text-gray-400 group-hover:text-gray-500" />
</button>
</Tooltip>
)}
}
</div>
) : (
// add invisible div to prevent layout shift