diff --git a/.eslintignore b/.eslintignore index 375f1db78a..18e9f7cb20 100644 --- a/.eslintignore +++ b/.eslintignore @@ -13,3 +13,4 @@ _site temp* static/ packages/common +packages/ai-core diff --git a/.gitignore b/.gitignore index dca38afadc..5a7c22ff57 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store .idea temp* +.tmp-aigc-dts robotMsg.json .history diff --git a/.gitmodules b/.gitmodules index bd2d737bd8..acdf6e2266 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "packages/common"] path = packages/common url = https://github.com/Tencent/tdesign-common.git +[submodule "packages/ai-core"] + path = packages/ai-core + url = https://github.com/TDesignOteam/tdesign-ai-core.git diff --git a/package.json b/package.json index 0661f2ecf3..d1c0c405a7 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "glob": "^9.0.3", "happy-dom": "^15.11.0", "husky": "^7.0.4", + "immer": "^10.0.0", "jest-canvas-mock": "^2.4.0", "jsdom": "^20.0.1", "less": "4.4.2", @@ -146,6 +147,7 @@ "@popperjs/core": "~2.11.2", "tdesign-react": "workspace:^", "@tdesign-react/chat": "workspace:^", + "@tdesign/ai-chat-engine": "workspace:^", "@tdesign/common": "workspace:^", "@tdesign/common-docs": "workspace:^", "@tdesign/common-js": "workspace:^", diff --git a/packages/ai-core b/packages/ai-core new file mode 160000 index 0000000000..b2028b75a5 --- /dev/null +++ b/packages/ai-core @@ -0,0 +1 @@ +Subproject commit b2028b75a5c4b8b40acb3cb1e7406e13c5587d3b diff --git a/packages/pro-components/chat/chat-engine/_example/agui-history-test.tsx b/packages/pro-components/chat/chat-engine/_example/agui-history-test.tsx index 332867e8de..6769db5371 100644 --- a/packages/pro-components/chat/chat-engine/_example/agui-history-test.tsx +++ b/packages/pro-components/chat/chat-engine/_example/agui-history-test.tsx @@ -1,7 +1,7 @@ import React, { useState, useMemo } from 'react'; import { Card, Space, Button, Divider } from 'tdesign-react'; -import { AGUIAdapter } from 'tdesign-web-components/lib/chat-engine'; -import type { AGUIHistoryMessage, AGUIActivityMessage } from 'tdesign-web-components/lib/chat-engine'; +import { AGUIAdapter } from '@tdesign-react/chat'; +import type { AGUIHistoryMessage, AGUIActivityMessage } from '@tdesign-react/chat'; /** * AG-UI 历史消息转换测试 diff --git a/packages/pro-components/chat/chat-engine/_example/headless-eventbus.tsx b/packages/pro-components/chat/chat-engine/_example/headless-eventbus.tsx index a9c2c167b4..573451af9e 100644 --- a/packages/pro-components/chat/chat-engine/_example/headless-eventbus.tsx +++ b/packages/pro-components/chat/chat-engine/_example/headless-eventbus.tsx @@ -1,10 +1,6 @@ import React, { useEffect, useState, useRef } from 'react'; import { Button, Card, Space, Tag, Divider, List, MessagePlugin } from 'tdesign-react'; -import ChatEngine, { - ChatEngineEventType, - type SSEChunkData, - type AIMessageContent, -} from 'tdesign-web-components/lib/chat-engine'; +import { ChatEngine, ChatEngineEventType, type SSEChunkData, type AIMessageContent } from '@tdesign-react/chat'; /** * Headless 事件总线示例 diff --git a/packages/pro-components/chat/chat-engine/_example/headless-pure.tsx b/packages/pro-components/chat/chat-engine/_example/headless-pure.tsx index 975c92bede..bdc26bf2f1 100644 --- a/packages/pro-components/chat/chat-engine/_example/headless-pure.tsx +++ b/packages/pro-components/chat/chat-engine/_example/headless-pure.tsx @@ -1,10 +1,6 @@ import React, { useEffect, useRef } from 'react'; import { Card, Button, Space, Divider } from 'tdesign-react'; -import ChatEngine, { - ChatEngineEventType, - type SSEChunkData, - type AIMessageContent, -} from 'tdesign-web-components/lib/chat-engine'; +import { ChatEngine, ChatEngineEventType, type SSEChunkData, type AIMessageContent } from '@tdesign-react/chat'; /** * 纯 Headless 示例 - 无 UI 依赖的 ChatEngine 使用方式 diff --git a/packages/pro-components/chat/chat-engine/components/activity/render.tsx b/packages/pro-components/chat/chat-engine/components/activity/render.tsx index bd0d4e07f9..df3d88860f 100644 --- a/packages/pro-components/chat/chat-engine/components/activity/render.tsx +++ b/packages/pro-components/chat/chat-engine/components/activity/render.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ import React, { useState, useEffect, useMemo, Component, ErrorInfo } from 'react'; import isEqual from 'react-fast-compare'; -import { type ActivityData } from 'tdesign-web-components'; +import { type ActivityData } from '@tdesign/ai-chat-engine'; import type { ActivityComponentProps } from './types'; import { activityRegistry } from './registry'; diff --git a/packages/pro-components/chat/chat-engine/components/toolcall/render.tsx b/packages/pro-components/chat/chat-engine/components/toolcall/render.tsx index 14adcf13c8..59e8c5f26f 100644 --- a/packages/pro-components/chat/chat-engine/components/toolcall/render.tsx +++ b/packages/pro-components/chat/chat-engine/components/toolcall/render.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect, useCallback, useMemo, Component, ErrorInfo } from 'react'; -import { AGUIEventType, ToolCall } from 'tdesign-web-components/lib/chat-engine'; +import { AGUIEventType, ToolCall } from '@tdesign/ai-chat-engine'; import { isNonInteractiveConfig, type ToolcallComponentProps } from './types'; import { agentToolcallRegistry } from './registry'; import { AgentStateContext, useAgentStateDataByKey } from '../../hooks/useAgentState'; diff --git a/packages/pro-components/chat/chat-engine/hooks/useAgentState.ts b/packages/pro-components/chat/chat-engine/hooks/useAgentState.ts index fbec8d3c73..33a9201dc6 100644 --- a/packages/pro-components/chat/chat-engine/hooks/useAgentState.ts +++ b/packages/pro-components/chat/chat-engine/hooks/useAgentState.ts @@ -1,7 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ import { useState, useEffect, useRef, createContext, useContext, useMemo } from 'react'; -// import { stateManager } from 'tdesign-web-components/lib/chat-engine'; -import { stateManager } from 'tdesign-web-components/lib/chat-engine'; +import { stateManager } from '@tdesign/ai-chat-engine'; /** * 状态订阅相关类型定义 diff --git a/packages/pro-components/chat/chat-engine/hooks/useChat.ts b/packages/pro-components/chat/chat-engine/hooks/useChat.ts index a11e2cf228..fa65dc73b6 100644 --- a/packages/pro-components/chat/chat-engine/hooks/useChat.ts +++ b/packages/pro-components/chat/chat-engine/hooks/useChat.ts @@ -1,8 +1,6 @@ import { useEffect, useRef, useState } from 'react'; -import ChatEngine from 'tdesign-web-components/lib/chat-engine'; -import type { ChatMessagesData, ChatServiceConfig, ChatStatus } from 'tdesign-web-components/lib/chat-engine'; -// import ChatEngine from 'tdesign-web-components/lib/chat-engine'; -// import type { ChatMessagesData, ChatServiceConfig, ChatStatus } from 'tdesign-web-components/lib/chat-engine'; +import ChatEngine from '@tdesign/ai-chat-engine'; +import type { ChatMessagesData, ChatServiceConfig, ChatStatus } from '@tdesign/ai-chat-engine'; export type IUseChat = { defaultMessages?: ChatMessagesData[]; diff --git a/packages/pro-components/chat/chat-engine/index.ts b/packages/pro-components/chat/chat-engine/index.ts index 49a21e8806..73b0c4b1a9 100644 --- a/packages/pro-components/chat/chat-engine/index.ts +++ b/packages/pro-components/chat/chat-engine/index.ts @@ -1,7 +1,68 @@ +// React hooks export * from './hooks/useChat'; export * from './hooks/useAgentToolcall'; export * from './hooks/useAgentState'; export * from './hooks/useAgentActivity'; +// React components export * from './components'; -// export * from './core'; // 用于调试 -export * from 'tdesign-web-components/lib/chat-engine'; + +// Re-export core API from @tdesign/ai-chat-engine +// For full core API, use: import { ... } from '@tdesign/ai-chat-engine' +export { default as ChatEngine } from '@tdesign/ai-chat-engine'; +export { ChatEngineEventType, ChatEventBus, createEventBus } from '@tdesign/ai-chat-engine'; +export { AGUIAdapter, stateManager, activityManager } from '@tdesign/ai-chat-engine'; +export { + isAIMessage, + isUserMessage, + isTextContent, + isMarkdownContent, + isToolCallContent, + isActivityContent, + isThinkingContent, + isSearchContent, + isSuggestionContent, + isAttachmentContent, + isImageContent, + applyJsonPatch, + safeParseJSON, + getMessageContentForCopy, + findTargetElement, +} from '@tdesign/ai-chat-engine'; +export { AGUIEventType } from '@tdesign/ai-chat-engine'; + +// Re-export commonly used types +export type { + ChatMessagesData, + ChatServiceConfig, + ChatServiceConfigSetter, + ChatStatus, + ChatMessageStatus, + ChatMessageRole, + ChatRequestParams, + ChatMessageSetterMode, + AIMessageContent, + UserMessageContent, + SSEChunkData, + IChatEngine, + IChatEventBus, + UserMessage, + AIMessage, + SystemMessage, + ToolCall, + ToolCallContent, + ActivityData, + ActivityContent, + TextContent, + MarkdownContent, + ThinkingContent, + SearchContent, + SuggestionContent, + ImageContent, + AttachmentContent, + AttachmentItem, + ChatBaseContent, + ChatContentType, + ChatEventBusOptions, + AGUIHistoryMessage, + AGUIActivityMessage, +} from '@tdesign/ai-chat-engine'; diff --git a/packages/tdesign-react-aigc/site/vite.config.js b/packages/tdesign-react-aigc/site/vite.config.js index 6344c7aa34..7eab466567 100644 --- a/packages/tdesign-react-aigc/site/vite.config.js +++ b/packages/tdesign-react-aigc/site/vite.config.js @@ -29,6 +29,7 @@ export default ({ mode }) => resolve: { alias: { '@tdesign-react/chat': path.resolve(__dirname, '../../pro-components/chat'), + '@tdesign/ai-chat-engine': path.resolve(__dirname, '../../ai-core/packages/chat-engine/index.ts'), '@tdesign/react-aigc-site': path.resolve(__dirname, './'), 'tdesign-react/es': path.resolve(__dirname, '../../components'), 'tdesign-react': path.resolve(__dirname, '../../components'), @@ -42,6 +43,9 @@ export default ({ mode }) => }, }, }, + define: { + __VERSION__: JSON.stringify(pkg.version), + }, jsx: 'react', server: { host: '0.0.0.0', diff --git a/script/rollup.aigc.config.js b/script/rollup.aigc.config.js index fa0d9ee11b..609144cdae 100644 --- a/script/rollup.aigc.config.js +++ b/script/rollup.aigc.config.js @@ -15,7 +15,8 @@ import { resolve } from 'path'; import pkg from '../packages/tdesign-react-aigc/package.json'; const name = 'tdesign'; -const externalDeps = Object.keys(pkg.dependencies || {}); +const internalWorkspaceDeps = ['@tdesign/ai-chat-engine', '@tdesign/ai-shared']; +const externalDeps = Object.keys(pkg.dependencies || {}).filter((dep) => !internalWorkspaceDeps.includes(dep)); const externalPeerDeps = Object.keys(pkg.peerDependencies || {}); // 分析模式配置 diff --git a/tsconfig.aigc.build.json b/tsconfig.aigc.build.json index 149cbfef43..20729ce2e8 100644 --- a/tsconfig.aigc.build.json +++ b/tsconfig.aigc.build.json @@ -1,7 +1,14 @@ { "extends": "./tsconfig", "include": ["packages/pro-components/chat"], - "exclude": ["**/**/__tests__/*", "**/**/_example/*", "**/**/_example-js/*","**/**/_usage/*", "es", "node_modules"], + "exclude": [ + "**/**/__tests__/*", + "**/**/_example/*", + "**/**/_example-js/*", + "**/**/_usage/*", + "es", + "node_modules" + ], "compilerOptions": { "jsx": "react-jsx", "emitDeclarationOnly": true, diff --git a/tsconfig.json b/tsconfig.json index 6996525832..244253835b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -33,7 +33,7 @@ ], "@common/*": [ "packages/common/*" - ] + ], }, "allowJs": true, "checkJs": true,