diff --git a/apps/api/prisma/schema.prisma b/apps/api/prisma/schema.prisma index 9959abbb2..18508ef34 100644 --- a/apps/api/prisma/schema.prisma +++ b/apps/api/prisma/schema.prisma @@ -146,31 +146,33 @@ model ActionResult { model ActionStep { /// Primary key - pk BigInt @id @default(autoincrement()) + pk BigInt @id @default(autoincrement()) /// Action result id which this step belongs to - resultId String @map("result_id") + resultId String @map("result_id") /// Action result version - version Int @default(0) @map("version") + version Int @default(0) @map("version") /// Step order - order Int @default(0) @map("order") + order Int @default(0) @map("order") /// Step name - name String @map("name") + name String @map("name") /// Step content - content String @map("content") + content String @map("content") + /// Step reasoning content + reasoningContent String? @map("reasoning_content") /// Structured data output (JSON) - structuredData String @default("{}") @map("structured_data") + structuredData String @default("{}") @map("structured_data") /// Action logs - logs String @default("[]") @map("logs") + logs String @default("[]") @map("logs") /// Action artifacts (JSON array) - artifacts String @default("[]") @map("artifacts") + artifacts String @default("[]") @map("artifacts") /// Token usage summary (JSON array) - tokenUsage String @default("[]") @map("token_usage") + tokenUsage String @default("[]") @map("token_usage") /// Create timestamp - createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz() + createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz() /// Update timestamp - updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz() + updatedAt DateTime @updatedAt @map("updated_at") @db.Timestamptz() /// Soft delete timestamp - deletedAt DateTime? @map("deleted_at") @db.Timestamptz() + deletedAt DateTime? @map("deleted_at") @db.Timestamptz() @@index([resultId, version, order]) @@map("action_steps") diff --git a/apps/api/src/action/action.dto.ts b/apps/api/src/action/action.dto.ts index 213a5ccb8..f4c973857 100644 --- a/apps/api/src/action/action.dto.ts +++ b/apps/api/src/action/action.dto.ts @@ -15,7 +15,7 @@ import { modelInfoPO2DTO } from '@/misc/misc.dto'; export function actionStepPO2DTO(step: ActionStepModel): ActionStep { return { - ...pick(step, ['name', 'content']), + ...pick(step, ['name', 'content', 'reasoningContent']), logs: JSON.parse(step.logs || '[]'), artifacts: JSON.parse(step.artifacts || '[]'), structuredData: JSON.parse(step.structuredData || '{}'), diff --git a/apps/api/src/knowledge/knowledge.controller.ts b/apps/api/src/knowledge/knowledge.controller.ts index d4f96cb27..0bc8725e3 100644 --- a/apps/api/src/knowledge/knowledge.controller.ts +++ b/apps/api/src/knowledge/knowledge.controller.ts @@ -7,7 +7,10 @@ import { UseGuards, ParseIntPipe, DefaultValuePipe, + UseInterceptors, + UploadedFile, } from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; import { User, UpsertResourceRequest, @@ -84,6 +87,37 @@ export class KnowledgeController { return buildSuccessResponse(resourcePO2DTO(resource)); } + @UseGuards(JwtAuthGuard) + @Post('resource/createWithFile') + @UseInterceptors(FileInterceptor('file')) + async createResourceWithFile( + @LoginedUser() user: User, + @UploadedFile() file: Express.Multer.File, + @Body() body: UpsertResourceRequest, + ): Promise { + if (!file) { + throw new ParamsError('File is required'); + } + + // Convert file content to string + const content = file.buffer.toString('utf-8'); + + // Create resource with file content + const resource = await this.knowledgeService.createResource( + user, + { + ...body, + content, + }, + { + checkStorageQuota: true, + }, + ); + + await this.knowledgeService.syncStorageUsage(user); + return buildSuccessResponse(resourcePO2DTO(resource)); + } + @UseGuards(JwtAuthGuard) @Post('resource/batchCreate') async importResource( diff --git a/apps/api/src/misc/misc.controller.ts b/apps/api/src/misc/misc.controller.ts index bba40cf37..34121d415 100644 --- a/apps/api/src/misc/misc.controller.ts +++ b/apps/api/src/misc/misc.controller.ts @@ -81,6 +81,7 @@ export class MiscController { return buildSuccessResponse({ content: result }); } + @UseGuards(JwtAuthGuard) @Get('static/:objectKey') @Header('Access-Control-Allow-Origin', '*') @Header('Cross-Origin-Resource-Policy', 'cross-origin') diff --git a/apps/api/src/skill/skill.service.ts b/apps/api/src/skill/skill.service.ts index 8a65893a7..9a145cf99 100644 --- a/apps/api/src/skill/skill.service.ts +++ b/apps/api/src/skill/skill.service.ts @@ -5,6 +5,7 @@ import { Queue } from 'bullmq'; import * as Y from 'yjs'; import { InjectQueue } from '@nestjs/bullmq'; import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { getWholeParsedContent } from '@refly-packages/utils'; import { Prisma, SkillTrigger as SkillTriggerModel, @@ -632,7 +633,7 @@ export class SkillService { ? steps.map( (step) => new AIMessage({ - content: step.content, // TODO: dump artifact content to message + content: getWholeParsedContent(step.reasoningContent, step.content), // // TODO: dump artifact content to message additional_kwargs: { skillMeta: result.actionMeta, structuredData: step.structuredData, diff --git a/apps/api/src/utils/result.ts b/apps/api/src/utils/result.ts index cc6c0e1a2..3dc467c06 100644 --- a/apps/api/src/utils/result.ts +++ b/apps/api/src/utils/result.ts @@ -109,12 +109,14 @@ export class ResultAggregator { version: number; }): Prisma.ActionStepCreateManyInput[] { return this.stepNames.map((stepName, order) => { - const { name, content, structuredData, artifacts, usageItems, logs } = this.data[stepName]; + const { name, content, structuredData, artifacts, usageItems, logs, reasoningContent } = + this.data[stepName]; const aggregatedUsage = aggregateTokenUsage(usageItems); return { name, content, + reasoningContent, resultId, version, order, diff --git a/apps/extension/src/hooks/use-save-resource.ts b/apps/extension/src/hooks/use-save-resource.ts index 028d71b67..4d2ddd291 100644 --- a/apps/extension/src/hooks/use-save-resource.ts +++ b/apps/extension/src/hooks/use-save-resource.ts @@ -1,4 +1,4 @@ -import { CreateResourceData, type BaseResponse } from '@refly/openapi-schema'; +import { UpsertResourceRequest, type BaseResponse } from '@refly/openapi-schema'; import { getMarkdown, preprocessHtmlContent } from '@refly/utils/html2md'; import { convertHTMLToMarkdown } from '@refly/utils/markdown'; import getClient from '@refly-packages/ai-workspace-common/requests/proxiedRequest'; @@ -54,19 +54,23 @@ export const useSaveCurrentWeblinkAsResource = () => { isPublic: false, readOnly: true, collabEnabled: false, - content: pageContent || '', }; - const createResourceData: CreateResourceData = { - body: { - title: resource?.title, - resourceType: 'weblink', - data: resource?.data, - content: resource?.content, - }, + const textBlob = new Blob([pageContent], { type: 'text/plain' }); + const textFile = new File([textBlob], 'content.txt', { type: 'text/plain' }); + + const createResourceData: UpsertResourceRequest = { + title: resource?.title, + resourceType: 'weblink', + data: resource?.data, }; - const { error } = await getClient().createResource(createResourceData); + const { error } = await getClient().createResourceWithFile({ + body: { + ...createResourceData, + file: textFile, + }, + }); // const resourceId = data?.data?.resourceId; // const url = `${getClientOrigin(false)}/resource/${resourceId}`; const url = `${getClientOrigin(false)}`; diff --git a/apps/extension/src/hooks/use-save-selected-content.ts b/apps/extension/src/hooks/use-save-selected-content.ts index b301ba131..a10848fe0 100644 --- a/apps/extension/src/hooks/use-save-selected-content.ts +++ b/apps/extension/src/hooks/use-save-selected-content.ts @@ -19,18 +19,23 @@ export const useSaveSelectedContent = () => { const title = metadata?.title || document?.title || 'Untitled'; const url = metadata?.url || document?.location?.href || 'https://www.refly.ai'; + // Create a text file from the content + const textBlob = new Blob([content], { type: 'text/plain' }); + const textFile = new File([textBlob], 'content.txt', { type: 'text/plain' }); const createResourceData: UpsertResourceRequest = { resourceType: 'text', title, - content: content || '', data: { url, title, }, }; - const { error } = await getClient().createResource({ - body: createResourceData, + const { error } = await getClient().createResourceWithFile({ + body: { + ...createResourceData, + file: textFile, + }, }); // const resourceId = data?.data?.resourceId; diff --git a/packages/ai-workspace-common/src/components/canvas/common/node-selector/index.tsx b/packages/ai-workspace-common/src/components/canvas/common/node-selector/index.tsx index cf8d52ba8..fe37fdb56 100644 --- a/packages/ai-workspace-common/src/components/canvas/common/node-selector/index.tsx +++ b/packages/ai-workspace-common/src/components/canvas/common/node-selector/index.tsx @@ -57,8 +57,8 @@ export const NodeSelector = (props: NodeSelectorProps) => { const { nodes } = useCanvasData(); - const targetNodes = nodes.filter((node) => !['group'].includes(node?.type)); - const sortedItems: IContextItem[] = targetNodes.map((node) => ({ + const targetNodes = nodes.filter((node) => !['group', 'skill'].includes(node?.type)); + const sortedItems: IContextItem[] = [...targetNodes].reverse().map((node) => ({ title: node.data?.title, entityId: node.data?.entityId, type: node.type, @@ -66,10 +66,8 @@ export const NodeSelector = (props: NodeSelectorProps) => { })); const processedItems = useMemo(() => { - return ( - sortedItems?.filter((item) => - item?.title?.toLowerCase().includes(searchValue.toLowerCase()), - ) ?? [] + return sortedItems.filter((item) => + item?.title?.toLowerCase().includes(searchValue.toLowerCase()), ); }, [sortedItems, searchValue]); diff --git a/packages/ai-workspace-common/src/components/canvas/launchpad/chat-input.tsx b/packages/ai-workspace-common/src/components/canvas/launchpad/chat-input.tsx index f41513a76..ab7bc3215 100644 --- a/packages/ai-workspace-common/src/components/canvas/launchpad/chat-input.tsx +++ b/packages/ai-workspace-common/src/components/canvas/launchpad/chat-input.tsx @@ -194,7 +194,7 @@ const ChatInputComponent = forwardRef( ref={ref} className={cn( 'w-full h-full flex flex-col flex-grow overflow-y-auto relative', - isDragging && 'ring-2 ring-blue-500 ring-opacity-50', + isDragging && 'ring-2 ring-green-500 ring-opacity-50 rounded-lg', )} onPaste={handlePaste} onDragOver={(e) => { @@ -227,8 +227,8 @@ const ChatInputComponent = forwardRef( }} > {isDragging && ( -
-
{t('common.dropImageHere')}
+
+
{t('common.dropImageHere')}
)} // Memoize the filtered and sorted nodes to prevent unnecessary recalculations const processedNodes = useMemo(() => { - const sortedItems: IContextItem[] = [ - ...(selectedItems || []), - ...( - targetNodes?.filter( + // First get unselected nodes and reverse them to show most recent first + const unselectedNodes = + targetNodes + ?.filter( (node) => !selectedItems.some((selected) => selected.entityId === node.data?.entityId), - ) || [] - ).map((node) => ({ - title: - node?.type === 'memo' - ? node.data?.contentPreview - ? `${node.data?.title} - ${node.data?.contentPreview?.slice(0, 10)}` - : node.data?.title - : node.data?.title, - entityId: node.data?.entityId, - type: node.type, - metadata: node.data?.metadata, - })), - ]; - - const filteredItems = - sortedItems?.filter((item) => - item?.title?.toLowerCase().includes(searchValue.toLowerCase()), - ) ?? []; - - return [ - ...(selectedItems ?? []), - ...(filteredItems?.filter( - (item) => !selectedItems?.some((selected) => selected?.entityId === item?.entityId), - ) ?? []), - ]; + ) + .reverse() + .map((node) => ({ + title: + node?.type === 'memo' + ? node.data?.contentPreview + ? `${node.data?.title} - ${node.data?.contentPreview?.slice(0, 10)}` + : node.data?.title + : node.data?.title, + entityId: node.data?.entityId, + type: node.type, + metadata: node.data?.metadata, + })) ?? []; + + // Filter based on search value + const filteredUnselectedNodes = unselectedNodes.filter((item) => + item?.title?.toLowerCase().includes(searchValue.toLowerCase()), + ); + + // Return selected items first, followed by filtered & reversed unselected nodes + return [...(selectedItems ?? []), ...filteredUnselectedNodes]; }, [targetNodes, searchValue, selectedItems]); // Memoize the render data transformation diff --git a/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/action-step.tsx b/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/action-step.tsx index f39f52a3c..0cac2a445 100644 --- a/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/action-step.tsx +++ b/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/action-step.tsx @@ -16,7 +16,7 @@ import { getArtifactIcon } from '@refly-packages/ai-workspace-common/components/ import { RecommendQuestions } from '@refly-packages/ai-workspace-common/components/canvas/node-preview/skill-response/recommend-questions'; import { useNodeSelection } from '@refly-packages/ai-workspace-common/hooks/canvas/use-node-selection'; import { IContextItem } from '@refly-packages/ai-workspace-common/stores/context-panel'; -import { getWholeParsedContent } from '@refly-packages/ai-workspace-common/utils/content-parser'; +import { getWholeParsedContent } from '@refly-packages/utils/content-parser'; const parseStructuredData = (structuredData: Record, field: string) => { return typeof structuredData[field] === 'string' diff --git a/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/index.tsx b/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/index.tsx index 5a37498ba..61766459f 100644 --- a/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/index.tsx +++ b/packages/ai-workspace-common/src/components/canvas/node-preview/skill-response/index.tsx @@ -26,7 +26,7 @@ import { useCanvasContext } from '@refly-packages/ai-workspace-common/context/ca import { IconRerun } from '@refly-packages/ai-workspace-common/components/common/icon'; import { locateToNodePreviewEmitter } from '@refly-packages/ai-workspace-common/events/locateToNodePreview'; -import { getWholeParsedContent } from '@refly-packages/ai-workspace-common/utils/content-parser'; +import { getWholeParsedContent } from '@refly-packages/utils/content-parser'; interface SkillResponseNodePreviewProps { node: CanvasNode; resultId: string; diff --git a/packages/ai-workspace-common/src/hooks/canvas/use-update-action-result.ts b/packages/ai-workspace-common/src/hooks/canvas/use-update-action-result.ts index 772fc8d98..6cf6c9cea 100644 --- a/packages/ai-workspace-common/src/hooks/canvas/use-update-action-result.ts +++ b/packages/ai-workspace-common/src/hooks/canvas/use-update-action-result.ts @@ -8,7 +8,7 @@ import { } from '@refly-packages/ai-workspace-common/components/canvas/nodes'; import { aggregateTokenUsage } from '@refly-packages/utils/models'; import { useSetNodeDataByEntity } from './use-set-node-data-by-entity'; -import { getWholeParsedContent } from '@refly-packages/ai-workspace-common/utils/content-parser'; +import { getWholeParsedContent } from '@refly-packages/utils/content-parser'; const generateFullNodeDataUpdates = ( payload: ActionResult, diff --git a/packages/ai-workspace-common/src/queries/common.ts b/packages/ai-workspace-common/src/queries/common.ts index 1ca4fd0c9..90abf3603 100644 --- a/packages/ai-workspace-common/src/queries/common.ts +++ b/packages/ai-workspace-common/src/queries/common.ts @@ -16,6 +16,7 @@ import { createLabelInstance, createPortalSession, createResource, + createResourceWithFile, createShare, createSkillInstance, createSkillTrigger, @@ -371,6 +372,14 @@ export const UseCreateResourceKeyFn = (mutationKey?: Array) => [ useCreateResourceKey, ...(mutationKey ?? []), ]; +export type CreateResourceWithFileMutationResult = Awaited< + ReturnType +>; +export const useCreateResourceWithFileKey = 'CreateResourceWithFile'; +export const UseCreateResourceWithFileKeyFn = (mutationKey?: Array) => [ + useCreateResourceWithFileKey, + ...(mutationKey ?? []), +]; export type BatchCreateResourceMutationResult = Awaited>; export const useBatchCreateResourceKey = 'BatchCreateResource'; export const UseBatchCreateResourceKeyFn = (mutationKey?: Array) => [ diff --git a/packages/ai-workspace-common/src/queries/queries.ts b/packages/ai-workspace-common/src/queries/queries.ts index 8577fa2a3..5e80b42e5 100644 --- a/packages/ai-workspace-common/src/queries/queries.ts +++ b/packages/ai-workspace-common/src/queries/queries.ts @@ -16,6 +16,7 @@ import { createLabelInstance, createPortalSession, createResource, + createResourceWithFile, createShare, createSkillInstance, createSkillTrigger, @@ -99,6 +100,8 @@ import { CreatePortalSessionError, CreateResourceData, CreateResourceError, + CreateResourceWithFileData, + CreateResourceWithFileError, CreateShareData, CreateShareError, CreateSkillInstanceData, @@ -725,6 +728,24 @@ export const useCreateResource = < mutationFn: (clientOptions) => createResource(clientOptions) as unknown as Promise, ...options, }); +export const useCreateResourceWithFile = < + TData = Common.CreateResourceWithFileMutationResult, + TError = CreateResourceWithFileError, + TQueryKey extends Array = unknown[], + TContext = unknown, +>( + mutationKey?: TQueryKey, + options?: Omit< + UseMutationOptions, TContext>, + 'mutationKey' | 'mutationFn' + >, +) => + useMutation, TContext>({ + mutationKey: Common.UseCreateResourceWithFileKeyFn(mutationKey), + mutationFn: (clientOptions) => + createResourceWithFile(clientOptions) as unknown as Promise, + ...options, + }); export const useBatchCreateResource = < TData = Common.BatchCreateResourceMutationResult, TError = BatchCreateResourceError, diff --git a/packages/ai-workspace-common/src/requests/services.gen.ts b/packages/ai-workspace-common/src/requests/services.gen.ts index 14d711a4f..069ec78e3 100644 --- a/packages/ai-workspace-common/src/requests/services.gen.ts +++ b/packages/ai-workspace-common/src/requests/services.gen.ts @@ -54,6 +54,9 @@ import type { CreateResourceData, CreateResourceError, CreateResourceResponse, + CreateResourceWithFileData, + CreateResourceWithFileError, + CreateResourceWithFileResponse, BatchCreateResourceData, BatchCreateResourceError, BatchCreateResourceResponse2, @@ -455,6 +458,28 @@ export const createResource = ( }); }; +/** + * Create new resource with file upload + * Create a new resource with file upload in a single request + */ +export const createResourceWithFile = ( + options: Options, +) => { + return (options?.client ?? client).post< + CreateResourceWithFileResponse, + CreateResourceWithFileError, + ThrowOnError + >({ + ...options, + ...formDataBodySerializer, + headers: { + 'Content-Type': null, + ...options?.headers, + }, + url: '/knowledge/resource/createWithFile', + }); +}; + /** * Batch create new resources * Batch create a new resource diff --git a/packages/ai-workspace-common/src/requests/types.gen.ts b/packages/ai-workspace-common/src/requests/types.gen.ts index d0eced848..129bf872c 100644 --- a/packages/ai-workspace-common/src/requests/types.gen.ts +++ b/packages/ai-workspace-common/src/requests/types.gen.ts @@ -3049,6 +3049,35 @@ export type CreateResourceResponse = UpsertResourceResponse; export type CreateResourceError = unknown; +export type CreateResourceWithFileData = { + body: { + /** + * File to upload + */ + file: Blob | File; + /** + * Resource title + */ + title: string; + /** + * Resource type + */ + resourceType: ResourceType; + /** + * Resource ID (only used for update) + */ + resourceId?: string; + /** + * Resource metadata + */ + data?: ResourceMeta; + }; +}; + +export type CreateResourceWithFileResponse = UpsertResourceResponse; + +export type CreateResourceWithFileError = unknown; + export type BatchCreateResourceData = { /** * Resource creation request diff --git a/packages/openapi-schema/schema.yml b/packages/openapi-schema/schema.yml index 6609fd50b..2d3b9d296 100644 --- a/packages/openapi-schema/schema.yml +++ b/packages/openapi-schema/schema.yml @@ -391,6 +391,51 @@ paths: $ref: '#/components/schemas/UpsertResourceResponse' security: - api_key: [] + /knowledge/resource/createWithFile: + post: + tags: + - knowledge + summary: Create new resource with file upload + description: Create a new resource with file upload in a single request + operationId: createResourceWithFile + requestBody: + required: true + content: + multipart/form-data: + schema: + type: object + required: + - file + - title + - resourceType + properties: + file: + type: string + format: binary + description: File to upload + title: + type: string + description: Resource title + example: My Resource + resourceType: + description: Resource type + $ref: '#/components/schemas/ResourceType' + resourceId: + type: string + description: Resource ID (only used for update) + example: r-g30e1b80b5g1itbemc0g5jj3 + data: + description: Resource metadata + $ref: '#/components/schemas/ResourceMeta' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/UpsertResourceResponse' + security: + - api_key: [] /knowledge/resource/batchCreate: post: tags: diff --git a/packages/openapi-schema/src/services.gen.ts b/packages/openapi-schema/src/services.gen.ts index 14d711a4f..069ec78e3 100644 --- a/packages/openapi-schema/src/services.gen.ts +++ b/packages/openapi-schema/src/services.gen.ts @@ -54,6 +54,9 @@ import type { CreateResourceData, CreateResourceError, CreateResourceResponse, + CreateResourceWithFileData, + CreateResourceWithFileError, + CreateResourceWithFileResponse, BatchCreateResourceData, BatchCreateResourceError, BatchCreateResourceResponse2, @@ -455,6 +458,28 @@ export const createResource = ( }); }; +/** + * Create new resource with file upload + * Create a new resource with file upload in a single request + */ +export const createResourceWithFile = ( + options: Options, +) => { + return (options?.client ?? client).post< + CreateResourceWithFileResponse, + CreateResourceWithFileError, + ThrowOnError + >({ + ...options, + ...formDataBodySerializer, + headers: { + 'Content-Type': null, + ...options?.headers, + }, + url: '/knowledge/resource/createWithFile', + }); +}; + /** * Batch create new resources * Batch create a new resource diff --git a/packages/openapi-schema/src/types.gen.ts b/packages/openapi-schema/src/types.gen.ts index d0eced848..129bf872c 100644 --- a/packages/openapi-schema/src/types.gen.ts +++ b/packages/openapi-schema/src/types.gen.ts @@ -3049,6 +3049,35 @@ export type CreateResourceResponse = UpsertResourceResponse; export type CreateResourceError = unknown; +export type CreateResourceWithFileData = { + body: { + /** + * File to upload + */ + file: Blob | File; + /** + * Resource title + */ + title: string; + /** + * Resource type + */ + resourceType: ResourceType; + /** + * Resource ID (only used for update) + */ + resourceId?: string; + /** + * Resource metadata + */ + data?: ResourceMeta; + }; +}; + +export type CreateResourceWithFileResponse = UpsertResourceResponse; + +export type CreateResourceWithFileError = unknown; + export type BatchCreateResourceData = { /** * Resource creation request diff --git a/packages/skill-template/src/engine/index.ts b/packages/skill-template/src/engine/index.ts index 26d6f0a3d..15ec688b4 100644 --- a/packages/skill-template/src/engine/index.ts +++ b/packages/skill-template/src/engine/index.ts @@ -157,9 +157,11 @@ export class SkillEngine { this.config = config; } - chatModel(params?: Partial): ChatDeepSeek { + chatModel(params?: Partial, useDefaultChatModel = false): ChatDeepSeek { return new ChatDeepSeek({ - model: this.config?.configurable?.modelInfo?.name || this.options.defaultModel, + model: useDefaultChatModel + ? this.options.defaultModel + : this.config?.configurable?.modelInfo?.name || this.options.defaultModel, apiKey: process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY, configuration: { baseURL: process.env.OPENROUTER_API_KEY && 'https://openrouter.ai/api/v1', diff --git a/packages/skill-template/src/scheduler/module/multiLingualSearch/index.ts b/packages/skill-template/src/scheduler/module/multiLingualSearch/index.ts index f810fe3e9..1037350ec 100644 --- a/packages/skill-template/src/scheduler/module/multiLingualSearch/index.ts +++ b/packages/skill-template/src/scheduler/module/multiLingualSearch/index.ts @@ -82,7 +82,7 @@ export const callMultiLingualWebSearch = async ( const timeTracker = new TimeTracker(); let finalResults: Source[] = []; - const model = engine.chatModel({ temperature: 0.1 }); + const model = engine.chatModel({ temperature: 0.1 }, true); const enableQueryRewrite = params.enableQueryRewrite ?? true; diff --git a/packages/skill-template/src/scheduler/utils/chatHistory.ts b/packages/skill-template/src/scheduler/utils/chatHistory.ts index e6323908b..389a2e710 100644 --- a/packages/skill-template/src/scheduler/utils/chatHistory.ts +++ b/packages/skill-template/src/scheduler/utils/chatHistory.ts @@ -31,7 +31,7 @@ just reformulate it if needed and otherwise return it as is. new MessagesPlaceholder('chatHistory'), ['human', `The user's question is {question}, please output answer in ${locale} language:`], ]); - const llm = engine.chatModel({ temperature: 0 }); + const llm = engine.chatModel({ temperature: 0 }, true); const contextualizeQChain = contextualizeQPrompt.pipe(llm).pipe(new StringOutputParser()); const contextualUserQuery = await contextualizeQChain.invoke({ diff --git a/packages/skill-template/src/scheduler/utils/query-rewrite/core.ts b/packages/skill-template/src/scheduler/utils/query-rewrite/core.ts index e77fe922d..5cce47816 100644 --- a/packages/skill-template/src/scheduler/utils/query-rewrite/core.ts +++ b/packages/skill-template/src/scheduler/utils/query-rewrite/core.ts @@ -186,7 +186,7 @@ ${summarizedChatHistory} Please analyze the query, focusing primarily on the current query and available context. Only consider the chat history if it's directly relevant to understanding the current query.`; - const model = ctx.ctxThis.engine.chatModel({ temperature: 0.3 }); + const model = ctx.ctxThis.engine.chatModel({ temperature: 0.3 }, true); try { const result = await extractStructuredData( diff --git a/packages/skill-template/src/skills/generate-doc.ts b/packages/skill-template/src/skills/generate-doc.ts index 770224ba6..0c4fbd83c 100644 --- a/packages/skill-template/src/skills/generate-doc.ts +++ b/packages/skill-template/src/skills/generate-doc.ts @@ -137,7 +137,7 @@ export class GenerateDoc extends BaseSkill { const { query = '' } = state; const { locale = 'en', uiLocale = 'en' } = config.configurable; - const model = this.engine.chatModel({ temperature: 0.1 }); + const model = this.engine.chatModel({ temperature: 0.1 }, true); // Prepare context snippet if available let contextSnippet = ''; diff --git a/packages/ai-workspace-common/src/utils/content-parser.ts b/packages/utils/src/content-parser.ts similarity index 100% rename from packages/ai-workspace-common/src/utils/content-parser.ts rename to packages/utils/src/content-parser.ts diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 9dd1ef8d6..d2ba776a2 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -13,3 +13,4 @@ export * from './timeTracker'; export * from './search-source-converter'; export * from './translate'; export * from './cookie'; +export * from './content-parser';