refactor: prefer import type (#10190)

* style(linter): enable consistent-type-imports rule in typescript

* chore: add biome to lint script for improved code formatting

* chore: add oxlint-specific lint script for faster linting

* refactor: use type-only imports for better type safety and clarity
This commit is contained in:
Phantom
2025-09-17 12:32:53 +08:00
committed by GitHub
parent 59bf94b118
commit d4b0272fe7
779 changed files with 1845 additions and 1498 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
import { ApiServerConfig } from '@types'
import type { ApiServerConfig } from '@types'
import { v4 as uuidv4 } from 'uuid'
import { loggerService } from '../services/LoggerService'
+1 -1
View File
@@ -1,5 +1,5 @@
import crypto from 'crypto'
import { NextFunction, Request, Response } from 'express'
import type { NextFunction, Request, Response } from 'express'
import { config } from '../config'
+1 -1
View File
@@ -1,4 +1,4 @@
import { NextFunction, Request, Response } from 'express'
import type { NextFunction, Request, Response } from 'express'
import { loggerService } from '../../services/LoggerService'
+1 -1
View File
@@ -1,4 +1,4 @@
import { Express } from 'express'
import type { Express } from 'express'
import swaggerJSDoc from 'swagger-jsdoc'
import swaggerUi from 'swagger-ui-express'
+3 -2
View File
@@ -1,6 +1,7 @@
import express, { Request, Response } from 'express'
import type { Request, Response } from 'express'
import express from 'express'
import OpenAI from 'openai'
import { ChatCompletionCreateParams } from 'openai/resources'
import type { ChatCompletionCreateParams } from 'openai/resources'
import { loggerService } from '../../services/LoggerService'
import { chatCompletionService } from '../services/chat-completion'
+2 -1
View File
@@ -1,4 +1,5 @@
import express, { Request, Response } from 'express'
import type { Request, Response } from 'express'
import express from 'express'
import { loggerService } from '../../services/LoggerService'
import { mcpApiService } from '../services/mcp'
+2 -1
View File
@@ -1,4 +1,5 @@
import express, { Request, Response } from 'express'
import type { Request, Response } from 'express'
import express from 'express'
import { loggerService } from '../../services/LoggerService'
import { chatCompletionService } from '../services/chat-completion'
@@ -1,12 +1,12 @@
import OpenAI from 'openai'
import { ChatCompletionCreateParams } from 'openai/resources'
import type { ChatCompletionCreateParams } from 'openai/resources'
import { loggerService } from '../../services/LoggerService'
import type { OpenAICompatibleModel } from '../utils'
import {
getProviderByModel,
getRealProviderModel,
listAllAvailableModels,
OpenAICompatibleModel,
transformModelToOpenAI,
validateProvider
} from '../utils'
+5 -9
View File
@@ -1,16 +1,12 @@
import mcpService from '@main/services/MCPService'
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp'
import {
isJSONRPCRequest,
JSONRPCMessage,
JSONRPCMessageSchema,
MessageExtraInfo
} from '@modelcontextprotocol/sdk/types'
import { MCPServer } from '@types'
import type { JSONRPCMessage, MessageExtraInfo } from '@modelcontextprotocol/sdk/types'
import { isJSONRPCRequest, JSONRPCMessageSchema } from '@modelcontextprotocol/sdk/types'
import type { MCPServer } from '@types'
import { randomUUID } from 'crypto'
import { EventEmitter } from 'events'
import { Request, Response } from 'express'
import { IncomingMessage, ServerResponse } from 'http'
import type { Request, Response } from 'express'
import type { IncomingMessage, ServerResponse } from 'http'
import { loggerService } from '../../services/LoggerService'
import { reduxService } from '../../services/ReduxService'
+1 -1
View File
@@ -1,6 +1,6 @@
import { loggerService } from '@main/services/LoggerService'
import { reduxService } from '@main/services/ReduxService'
import { Model, Provider } from '@types'
import type { Model, Provider } from '@types'
const logger = loggerService.withContext('ApiServerUtils')
+3 -2
View File
@@ -1,7 +1,8 @@
import mcpService from '@main/services/MCPService'
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { CallToolRequestSchema, ListToolsRequestSchema, ListToolsResult } from '@modelcontextprotocol/sdk/types.js'
import { MCPServer } from '@types'
import type { ListToolsResult } from '@modelcontextprotocol/sdk/types.js'
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'
import type { MCPServer } from '@types'
import { loggerService } from '../../services/LoggerService'
import { reduxService } from '../../services/ReduxService'
@@ -4,7 +4,7 @@ import { toDataApiError } from '@shared/data/api/errorCodes'
import { IpcChannel } from '@shared/IpcChannel'
import { ipcMain } from 'electron'
import { ApiServer } from '../ApiServer'
import type { ApiServer } from '../ApiServer'
const logger = loggerService.withContext('DataApiIpcAdapter')
@@ -5,7 +5,7 @@ import { DefaultPreferences } from '@shared/data/preference/preferenceSchemas'
import { and, eq } from 'drizzle-orm'
import { configManager } from '../../../../services/ConfigManager'
import { DataRefactorMigrateService } from '../DataRefactorMigrateService'
import type { DataRefactorMigrateService } from '../DataRefactorMigrateService'
import { ELECTRON_STORE_MAPPINGS, REDUX_STORE_MAPPINGS } from './PreferencesMappings'
const logger = loggerService.withContext('PreferencesMigrator')
+5 -4
View File
@@ -10,13 +10,14 @@ import { generateSignature } from '@main/integration/cherryin'
import anthropicService from '@main/services/AnthropicService'
import { getBinaryPath, isBinaryExists, runInstallScript } from '@main/utils/process'
import { handleZoomFactor } from '@main/utils/zoom'
import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core'
import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core'
import { MIN_WINDOW_HEIGHT, MIN_WINDOW_WIDTH } from '@shared/config/constant'
import { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import type { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import { IpcChannel } from '@shared/IpcChannel'
import { FileMetadata, Notification, OcrProvider, Provider, Shortcut, SupportedOcrFile } from '@types'
import type { FileMetadata, Notification, OcrProvider, Provider, Shortcut, SupportedOcrFile } from '@types'
import checkDiskSpace from 'check-disk-space'
import { BrowserWindow, dialog, ipcMain, ProxyConfig, session, shell, systemPreferences, webContents } from 'electron'
import type { ProxyConfig } from 'electron'
import { BrowserWindow, dialog, ipcMain, session, shell, systemPreferences, webContents } from 'electron'
import fontList from 'font-list'
import { apiServerService } from './services/ApiServerService'
@@ -1,6 +1,6 @@
import type { BaseEmbeddings } from '@cherrystudio/embedjs-interfaces'
import { TraceMethod } from '@mcp-trace/trace-core'
import { ApiClient } from '@types'
import type { ApiClient } from '@types'
import EmbeddingsFactory from './EmbeddingsFactory'
@@ -2,7 +2,7 @@ import type { BaseEmbeddings } from '@cherrystudio/embedjs-interfaces'
import { OllamaEmbeddings } from '@cherrystudio/embedjs-ollama'
import { OpenAiEmbeddings } from '@cherrystudio/embedjs-openai'
import { AzureOpenAiEmbeddings } from '@cherrystudio/embedjs-openai/src/azure-openai-embeddings'
import { ApiClient } from '@types'
import type { ApiClient } from '@types'
import { VoyageEmbeddings } from './VoyageEmbeddings'
+4 -3
View File
@@ -1,10 +1,11 @@
import { JsonLoader, LocalPathLoader, RAGApplication, TextLoader } from '@cherrystudio/embedjs'
import type { RAGApplication } from '@cherrystudio/embedjs'
import { JsonLoader, LocalPathLoader, TextLoader } from '@cherrystudio/embedjs'
import type { AddLoaderReturn } from '@cherrystudio/embedjs-interfaces'
import { WebLoader } from '@cherrystudio/embedjs-loader-web'
import { loggerService } from '@logger'
import { readTextFileWithAutoEncoding } from '@main/utils/file'
import { LoaderReturn } from '@shared/config/types'
import { FileMetadata, KnowledgeBaseParams } from '@types'
import type { LoaderReturn } from '@shared/config/types'
import type { FileMetadata, KnowledgeBaseParams } from '@types'
import { DraftsExportLoader } from './draftsExportLoader'
import { EpubLoader } from './epubLoader'
@@ -3,7 +3,8 @@ import { cleanString } from '@cherrystudio/embedjs-utils'
import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'
import { loggerService } from '@logger'
import md5 from 'md5'
import { OfficeParserConfig, parseOfficeAsync } from 'officeparser'
import type { OfficeParserConfig } from 'officeparser'
import { parseOfficeAsync } from 'officeparser'
const logger = loggerService.withContext('OdLoader')
@@ -4,7 +4,7 @@ import path from 'node:path'
import { loggerService } from '@logger'
import { windowService } from '@main/services/WindowService'
import { getFileExt, getTempDir } from '@main/utils/file'
import { FileMetadata, PreprocessProvider } from '@types'
import type { FileMetadata, PreprocessProvider } from '@types'
import { PDFDocument } from 'pdf-lib'
const logger = loggerService.withContext('BasePreprocessProvider')
@@ -1,4 +1,4 @@
import { FileMetadata, PreprocessProvider } from '@types'
import type { FileMetadata, PreprocessProvider } from '@types'
import BasePreprocessProvider from './BasePreprocessProvider'
@@ -3,7 +3,7 @@ import path from 'node:path'
import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { FileMetadata, PreprocessProvider } from '@types'
import type { FileMetadata, PreprocessProvider } from '@types'
import AdmZip from 'adm-zip'
import { net } from 'electron'
@@ -3,7 +3,7 @@ import path from 'node:path'
import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { FileMetadata, PreprocessProvider } from '@types'
import type { FileMetadata, PreprocessProvider } from '@types'
import AdmZip from 'adm-zip'
import { net } from 'electron'
@@ -4,11 +4,12 @@ import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { MistralClientManager } from '@main/services/MistralClientManager'
import { MistralService } from '@main/services/remotefile/MistralService'
import { Mistral } from '@mistralai/mistralai'
import { DocumentURLChunk } from '@mistralai/mistralai/models/components/documenturlchunk'
import { ImageURLChunk } from '@mistralai/mistralai/models/components/imageurlchunk'
import { OCRResponse } from '@mistralai/mistralai/models/components/ocrresponse'
import { FileMetadata, FileTypes, PreprocessProvider, Provider } from '@types'
import type { Mistral } from '@mistralai/mistralai'
import type { DocumentURLChunk } from '@mistralai/mistralai/models/components/documenturlchunk'
import type { ImageURLChunk } from '@mistralai/mistralai/models/components/imageurlchunk'
import type { OCRResponse } from '@mistralai/mistralai/models/components/ocrresponse'
import type { FileMetadata, PreprocessProvider, Provider } from '@types'
import { FileTypes } from '@types'
import path from 'path'
import BasePreprocessProvider from './BasePreprocessProvider'
@@ -1,6 +1,6 @@
import { FileMetadata, PreprocessProvider as Provider } from '@types'
import type { FileMetadata, PreprocessProvider as Provider } from '@types'
import BasePreprocessProvider from './BasePreprocessProvider'
import type BasePreprocessProvider from './BasePreprocessProvider'
import PreprocessProviderFactory from './PreprocessProviderFactory'
export default class PreprocessProvider {
@@ -1,6 +1,6 @@
import { PreprocessProvider } from '@types'
import type { PreprocessProvider } from '@types'
import BasePreprocessProvider from './BasePreprocessProvider'
import type BasePreprocessProvider from './BasePreprocessProvider'
import DefaultPreprocessProvider from './DefaultPreprocessProvider'
import Doc2xPreprocessProvider from './Doc2xPreprocessProvider'
import MineruPreprocessProvider from './MineruPreprocessProvider'
+2 -2
View File
@@ -1,7 +1,7 @@
import { DEFAULT_DOCUMENT_COUNT, DEFAULT_RELEVANT_SCORE } from '@main/utils/knowledge'
import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import { MultiModalDocument, RerankStrategy } from './strategies/RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './strategies/RerankStrategy'
import { StrategyFactory } from './strategies/StrategyFactory'
export default abstract class BaseReranker {
@@ -1,4 +1,4 @@
import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import { net } from 'electron'
import BaseReranker from './BaseReranker'
+1 -1
View File
@@ -1,4 +1,4 @@
import { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import type { KnowledgeBaseParams, KnowledgeSearchResult } from '@types'
import GeneralReranker from './GeneralReranker'
@@ -1,4 +1,4 @@
import { MultiModalDocument, RerankStrategy } from './RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './RerankStrategy'
export class BailianStrategy implements RerankStrategy {
buildUrl(): string {
return 'https://dashscope.aliyuncs.com/api/v1/services/rerank/text-rerank/text-rerank'
@@ -1,4 +1,4 @@
import { MultiModalDocument, RerankStrategy } from './RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './RerankStrategy'
export class DefaultStrategy implements RerankStrategy {
buildUrl(baseURL?: string): string {
if (baseURL && baseURL.endsWith('/')) {
@@ -1,4 +1,4 @@
import { MultiModalDocument, RerankStrategy } from './RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './RerankStrategy'
export class JinaStrategy implements RerankStrategy {
buildUrl(baseURL?: string): string {
if (baseURL && baseURL.endsWith('/')) {
@@ -1,7 +1,7 @@
import { BailianStrategy } from './BailianStrategy'
import { DefaultStrategy } from './DefaultStrategy'
import { JinaStrategy } from './JinaStrategy'
import { RerankStrategy } from './RerankStrategy'
import type { RerankStrategy } from './RerankStrategy'
import { TEIStrategy } from './TeiStrategy'
import { isTEIProvider, RERANKER_PROVIDERS } from './types'
import { VoyageAIStrategy } from './VoyageStrategy'
@@ -1,4 +1,4 @@
import { MultiModalDocument, RerankStrategy } from './RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './RerankStrategy'
export class TEIStrategy implements RerankStrategy {
buildUrl(baseURL?: string): string {
if (baseURL && baseURL.endsWith('/')) {
@@ -1,4 +1,4 @@
import { MultiModalDocument, RerankStrategy } from './RerankStrategy'
import type { MultiModalDocument, RerankStrategy } from './RerankStrategy'
export class VoyageAIStrategy implements RerankStrategy {
buildUrl(baseURL?: string): string {
if (baseURL && baseURL.endsWith('/')) {
+2 -1
View File
@@ -2,7 +2,8 @@
// port https://github.com/modelcontextprotocol/servers/blob/main/src/brave-search/index.ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { CallToolRequestSchema, ListToolsRequestSchema, Tool } from '@modelcontextprotocol/sdk/types.js'
import type { Tool } from '@modelcontextprotocol/sdk/types.js'
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'
import { net } from 'electron'
const WEB_SEARCH_TOOL: Tool = {
+3 -2
View File
@@ -1,6 +1,7 @@
import { loggerService } from '@logger'
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { BuiltinMCPServerName, BuiltinMCPServerNames } from '@types'
import type { Server } from '@modelcontextprotocol/sdk/server/index.js'
import type { BuiltinMCPServerName } from '@types'
import { BuiltinMCPServerNames } from '@types'
import BraveSearchServer from './brave-search'
import DifyKnowledgeServer from './dify-knowledge'
+2 -1
View File
@@ -3,7 +3,8 @@
import { loggerService } from '@logger'
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { CallToolRequestSchema, ListToolsRequestSchema, Tool } from '@modelcontextprotocol/sdk/types.js'
import type { Tool } from '@modelcontextprotocol/sdk/types.js'
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js'
// Fixed chalk import for ESM
import chalk from 'chalk'
+1 -1
View File
@@ -1,5 +1,5 @@
import { IpcChannel } from '@shared/IpcChannel'
import { ApiServerConfig } from '@types'
import type { ApiServerConfig } from '@types'
import { ipcMain } from 'electron'
import { apiServer } from '../apiServer'
+6 -3
View File
@@ -7,9 +7,12 @@ import { generateUserAgent } from '@main/utils/systemInfo'
import { FeedUrl } from '@shared/config/constant'
import { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import { IpcChannel } from '@shared/IpcChannel'
import { CancellationToken, UpdateInfo } from 'builder-util-runtime'
import { app, BrowserWindow, dialog, net } from 'electron'
import { AppUpdater as _AppUpdater, autoUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater'
import type { UpdateInfo } from 'builder-util-runtime'
import { CancellationToken } from 'builder-util-runtime'
import type { BrowserWindow } from 'electron'
import { app, dialog, net } from 'electron'
import type { AppUpdater as _AppUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater'
import { autoUpdater } from 'electron-updater'
import path from 'path'
import semver from 'semver'
+3 -3
View File
@@ -1,14 +1,14 @@
import { loggerService } from '@logger'
import { IpcChannel } from '@shared/IpcChannel'
import { WebDavConfig } from '@types'
import { S3Config } from '@types'
import type { WebDavConfig } from '@types'
import type { S3Config } from '@types'
import archiver from 'archiver'
import { exec } from 'child_process'
import { app } from 'electron'
import * as fs from 'fs-extra'
import StreamZip from 'node-stream-zip'
import * as path from 'path'
import { CreateDirectoryOptions, FileStat } from 'webdav'
import type { CreateDirectoryOptions, FileStat } from 'webdav'
import { getDataPath } from '../utils'
import S3Storage from './S3Storage'
+1 -1
View File
@@ -1,5 +1,5 @@
import { ZOOM_SHORTCUTS } from '@shared/config/constant'
import { Shortcut } from '@types'
import type { Shortcut } from '@types'
import Store from 'electron-store'
export enum ConfigKeys {
+2 -1
View File
@@ -1,5 +1,6 @@
import { getI18n } from '@main/utils/language'
import { Menu, MenuItemConstructorOptions } from 'electron'
import type { MenuItemConstructorOptions } from 'electron'
import { Menu } from 'electron'
class ContextMenu {
public contextMenu(w: Electron.WebContents) {
+5 -11
View File
@@ -10,19 +10,13 @@ import {
scanDir
} from '@main/utils/file'
import { documentExts, imageExts, KB, MB } from '@shared/config/constant'
import { FileMetadata, NotesTreeNode } from '@types'
import type { FileMetadata, NotesTreeNode } from '@types'
import chardet from 'chardet'
import chokidar, { FSWatcher } from 'chokidar'
import type { FSWatcher } from 'chokidar'
import chokidar from 'chokidar'
import * as crypto from 'crypto'
import {
dialog,
net,
OpenDialogOptions,
OpenDialogReturnValue,
SaveDialogOptions,
SaveDialogReturnValue,
shell
} from 'electron'
import type { OpenDialogOptions, OpenDialogReturnValue, SaveDialogOptions, SaveDialogReturnValue } from 'electron'
import { dialog, net, shell } from 'electron'
import * as fs from 'fs'
import { writeFileSync } from 'fs'
import { readFile } from 'fs/promises'
+3 -2
View File
@@ -16,7 +16,8 @@
import * as fs from 'node:fs'
import path from 'node:path'
import { RAGApplication, RAGApplicationBuilder } from '@cherrystudio/embedjs'
import type { RAGApplication } from '@cherrystudio/embedjs'
import { RAGApplicationBuilder } from '@cherrystudio/embedjs'
import { LibSqlDb } from '@cherrystudio/embedjs-libsql'
import { SitemapLoader } from '@cherrystudio/embedjs-loader-sitemap'
import { WebLoader } from '@cherrystudio/embedjs-loader-web'
@@ -34,7 +35,7 @@ import { TraceMethod } from '@mcp-trace/trace-core'
import { MB } from '@shared/config/constant'
import type { LoaderReturn } from '@shared/config/types'
import { IpcChannel } from '@shared/IpcChannel'
import { FileMetadata, KnowledgeBaseParams, KnowledgeItem, KnowledgeSearchResult } from '@types'
import type { FileMetadata, KnowledgeBaseParams, KnowledgeItem, KnowledgeSearchResult } from '@types'
import { v4 as uuidv4 } from 'uuid'
const logger = loggerService.withContext('MainKnowledgeService')
+3 -2
View File
@@ -10,7 +10,8 @@ import { buildFunctionCallToolName } from '@main/utils/mcp'
import { getBinaryName, getBinaryPath } from '@main/utils/process'
import { TraceMethod, withSpanFunc } from '@mcp-trace/trace-core'
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { SSEClientTransport, SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js'
import type { SSEClientTransportOptions } from '@modelcontextprotocol/sdk/client/sse.js'
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js'
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
import {
StreamableHTTPClientTransport,
@@ -29,7 +30,7 @@ import {
ToolListChangedNotificationSchema
} from '@modelcontextprotocol/sdk/types.js'
import { nanoid } from '@reduxjs/toolkit'
import { MCPProgressEvent } from '@shared/config/types'
import type { MCPProgressEvent } from '@shared/config/types'
import { IpcChannel } from '@shared/IpcChannel'
import { defaultAppHeaders } from '@shared/utils'
import {
+1 -1
View File
@@ -1,5 +1,5 @@
import { Mistral } from '@mistralai/mistralai'
import { Provider } from '@types'
import type { Provider } from '@types'
export class MistralClientManager {
private static instance: MistralClientManager
+2 -1
View File
@@ -2,7 +2,8 @@ import { loggerService } from '@logger'
import { isDev } from '@main/constant'
import { CacheBatchSpanProcessor, FunctionSpanExporter } from '@mcp-trace/trace-core'
import { NodeTracer as MCPNodeTracer } from '@mcp-trace/trace-node/nodeTracer'
import { context, SpanContext, trace } from '@opentelemetry/api'
import type { SpanContext } from '@opentelemetry/api'
import { context, trace } from '@opentelemetry/api'
import { BrowserWindow, ipcMain } from 'electron'
import * as path from 'path'
+1 -1
View File
@@ -1,4 +1,4 @@
import { Notification } from '@types'
import type { Notification } from '@types'
import { Notification as ElectronNotification } from 'electron'
import { windowService } from './WindowService'
+2 -1
View File
@@ -1,6 +1,7 @@
import { loggerService } from '@logger'
import axios from 'axios'
import { app, ProxyConfig, session } from 'electron'
import type { ProxyConfig } from 'electron'
import { app, session } from 'electron'
import { socksDispatcher } from 'fetch-socks'
import http from 'http'
import https from 'https'
+2 -1
View File
@@ -1,6 +1,7 @@
import { randomUUID } from 'node:crypto'
import { BrowserWindow, ipcMain } from 'electron'
import type { BrowserWindow } from 'electron'
import { ipcMain } from 'electron'
interface PythonExecutionRequest {
id: string
+3 -2
View File
@@ -1,8 +1,9 @@
import { preferenceService } from '@data/PreferenceService'
import { loggerService } from '@logger'
import { handleZoomFactor } from '@main/utils/zoom'
import { Shortcut } from '@types'
import { BrowserWindow, globalShortcut } from 'electron'
import type { Shortcut } from '@types'
import type { BrowserWindow } from 'electron'
import { globalShortcut } from 'electron'
import { configManager } from './ConfigManager'
import selectionService from './SelectionService'
+3 -2
View File
@@ -1,8 +1,9 @@
import { preferenceService } from '@data/PreferenceService'
import { loggerService } from '@logger'
import { Attributes, convertSpanToSpanEntity, SpanEntity, TokenUsage, TraceCache } from '@mcp-trace/trace-core'
import type { Attributes, SpanEntity, TokenUsage, TraceCache } from '@mcp-trace/trace-core'
import { convertSpanToSpanEntity } from '@mcp-trace/trace-core'
import { SpanStatusCode } from '@opentelemetry/api'
import { ReadableSpan } from '@opentelemetry/sdk-trace-base'
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'
import fs from 'fs/promises'
import * as os from 'os'
import * as path from 'path'
+2 -1
View File
@@ -1,7 +1,8 @@
import { preferenceService } from '@data/PreferenceService'
import { isLinux, isMac, isWin } from '@main/constant'
import { getI18n } from '@main/utils/language'
import { app, Menu, MenuItemConstructorOptions, nativeImage, nativeTheme, Tray } from 'electron'
import type { MenuItemConstructorOptions } from 'electron'
import { app, Menu, nativeImage, nativeTheme, Tray } from 'electron'
import icon from '../../../build/tray_icon.png?asset'
import iconDark from '../../../build/tray_icon_dark.png?asset'
+4 -4
View File
@@ -1,16 +1,16 @@
import { loggerService } from '@logger'
import { WebDavConfig } from '@types'
import type { WebDavConfig } from '@types'
import https from 'https'
import path from 'path'
import Stream from 'stream'
import {
import type Stream from 'stream'
import type {
BufferLike,
createClient,
CreateDirectoryOptions,
GetFileContentsOptions,
PutFileContentsOptions,
WebDAVClient
} from 'webdav'
import { createClient } from 'webdav'
const logger = loggerService.withContext('WebDav')
+2 -2
View File
@@ -1,9 +1,9 @@
import { loggerService } from '@logger'
import EventEmitter from 'events'
import type EventEmitter from 'events'
import http from 'http'
import { URL } from 'url'
import { OAuthCallbackServerOptions } from './types'
import type { OAuthCallbackServerOptions } from './types'
const logger = loggerService.withContext('MCP:OAuthCallbackServer')
+7 -3
View File
@@ -2,13 +2,17 @@ import path from 'node:path'
import { loggerService } from '@logger'
import { getConfigDir } from '@main/utils/file'
import { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth'
import { OAuthClientInformation, OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth'
import type { OAuthClientProvider } from '@modelcontextprotocol/sdk/client/auth'
import type {
OAuthClientInformation,
OAuthClientInformationFull,
OAuthTokens
} from '@modelcontextprotocol/sdk/shared/auth'
import open from 'open'
import { sanitizeUrl } from 'strict-url-sanitise'
import { JsonFileStorage } from './storage'
import { OAuthProviderOptions } from './types'
import type { OAuthProviderOptions } from './types'
const logger = loggerService.withContext('MCP:OAuthClientProvider')
+3 -2
View File
@@ -1,5 +1,5 @@
import { loggerService } from '@logger'
import {
import type {
OAuthClientInformation,
OAuthClientInformationFull,
OAuthTokens
@@ -7,7 +7,8 @@ import {
import fs from 'fs/promises'
import path from 'path'
import { IOAuthStorage, OAuthStorageData, OAuthStorageSchema } from './types'
import type { IOAuthStorage, OAuthStorageData } from './types'
import { OAuthStorageSchema } from './types'
const logger = loggerService.withContext('MCP:OAuthStorage')
+2 -2
View File
@@ -1,9 +1,9 @@
import {
import type {
OAuthClientInformation,
OAuthClientInformationFull,
OAuthTokens
} from '@modelcontextprotocol/sdk/shared/auth.js'
import EventEmitter from 'events'
import type EventEmitter from 'events'
import { z } from 'zod'
export interface OAuthStorageData {
+2 -1
View File
@@ -1,4 +1,5 @@
import { Client, createClient } from '@libsql/client'
import type { Client } from '@libsql/client'
import { createClient } from '@libsql/client'
import { loggerService } from '@logger'
import Embeddings from '@main/knowledge/embedjs/embeddings/Embeddings'
import type {
+2 -1
View File
@@ -1,6 +1,7 @@
import { loggerService } from '@logger'
import { isLinux } from '@main/constant'
import { BuiltinOcrProviderIds, OcrHandler, OcrProvider, OcrResult, SupportedOcrFile } from '@types'
import type { OcrHandler, OcrProvider, OcrResult, SupportedOcrFile } from '@types'
import { BuiltinOcrProviderIds } from '@types'
import { ppocrService } from './builtin/PpocrService'
import { systemOcrService } from './builtin/SystemOcrService'
@@ -1,4 +1,4 @@
import { OcrHandler } from '@types'
import type { OcrHandler } from '@types'
export abstract class OcrBaseService {
abstract ocr: OcrHandler
@@ -1,5 +1,6 @@
import { loadOcrImage } from '@main/utils/ocr'
import { ImageFileMetadata, isImageFileMetadata, OcrPpocrConfig, OcrResult, SupportedOcrFile } from '@types'
import type { ImageFileMetadata, OcrPpocrConfig, OcrResult, SupportedOcrFile } from '@types'
import { isImageFileMetadata } from '@types'
import { net } from 'electron'
import { z } from 'zod'
@@ -1,7 +1,8 @@
import { isLinux, isWin } from '@main/constant'
import { loadOcrImage } from '@main/utils/ocr'
import { OcrAccuracy, recognize } from '@napi-rs/system-ocr'
import { ImageFileMetadata, isImageFileMetadata, OcrResult, OcrSystemConfig, SupportedOcrFile } from '@types'
import type { ImageFileMetadata, OcrResult, OcrSystemConfig, SupportedOcrFile } from '@types'
import { isImageFileMetadata } from '@types'
import { OcrBaseService } from './OcrBaseService'
@@ -2,12 +2,15 @@ import { loggerService } from '@logger'
import { getIpCountry } from '@main/utils/ipService'
import { loadOcrImage } from '@main/utils/ocr'
import { MB } from '@shared/config/constant'
import { ImageFileMetadata, isImageFileMetadata, OcrResult, OcrTesseractConfig, SupportedOcrFile } from '@types'
import type { ImageFileMetadata, OcrResult, OcrTesseractConfig, SupportedOcrFile } from '@types'
import { isImageFileMetadata } from '@types'
import { app } from 'electron'
import fs from 'fs'
import { isEqual } from 'lodash'
import path from 'path'
import Tesseract, { createWorker, LanguageCode } from 'tesseract.js'
import type { LanguageCode } from 'tesseract.js'
import type Tesseract from 'tesseract.js'
import { createWorker } from 'tesseract.js'
import { OcrBaseService } from './OcrBaseService'
@@ -1,4 +1,4 @@
import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
export abstract class BaseFileService {
protected readonly provider: Provider
@@ -1,6 +1,6 @@
import { Provider } from '@types'
import type { Provider } from '@types'
import { BaseFileService } from './BaseFileService'
import type { BaseFileService } from './BaseFileService'
import { GeminiService } from './GeminiService'
import { MistralService } from './MistralService'
import { OpenaiService } from './OpenAIService'
@@ -1,8 +1,9 @@
import { cacheService } from '@data/CacheService'
import { File, Files, FileState, GoogleGenAI } from '@google/genai'
import type { File, Files } from '@google/genai'
import { FileState, GoogleGenAI } from '@google/genai'
import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import { v4 as uuidv4 } from 'uuid'
import { BaseFileService } from './BaseFileService'
@@ -2,8 +2,8 @@ import fs from 'node:fs/promises'
import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { Mistral } from '@mistralai/mistralai'
import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import type { Mistral } from '@mistralai/mistralai'
import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import { MistralClientManager } from '../MistralClientManager'
import { BaseFileService } from './BaseFileService'
@@ -1,7 +1,7 @@
import { cacheService } from '@data/CacheService'
import { loggerService } from '@logger'
import { fileStorage } from '@main/services/FileStorage'
import { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import type { FileListResponse, FileMetadata, FileUploadResponse, Provider } from '@types'
import * as fs from 'fs'
import OpenAI from 'openai'
+1 -1
View File
@@ -1,7 +1,7 @@
import { loggerService } from '@logger'
import { nanoid } from '@reduxjs/toolkit'
import { IpcChannel } from '@shared/IpcChannel'
import { MCPServer } from '@types'
import type { MCPServer } from '@types'
import { windowService } from '../WindowService'
+2 -1
View File
@@ -5,7 +5,8 @@ import path from 'node:path'
import { loggerService } from '@logger'
import { audioExts, documentExts, imageExts, MB, textExts, videoExts } from '@shared/config/constant'
import { FileMetadata, FileTypes, NotesTreeNode } from '@types'
import type { FileMetadata, NotesTreeNode } from '@types'
import { FileTypes } from '@types'
import chardet from 'chardet'
import { app } from 'electron'
import iconv from 'iconv-lite'
+1 -1
View File
@@ -1,6 +1,6 @@
import { preferenceService } from '@data/PreferenceService'
import { defaultLanguage } from '@shared/config/constant'
import { LanguageVarious } from '@shared/data/preference/preferenceTypes'
import type { LanguageVarious } from '@shared/data/preference/preferenceTypes'
import { app } from 'electron'
import EnUs from '../../renderer/src/i18n/locales/en-us.json'
+1 -1
View File
@@ -1,4 +1,4 @@
import { ImageFileMetadata } from '@types'
import type { ImageFileMetadata } from '@types'
import { readFile } from 'fs/promises'
import sharp from 'sharp'
+1 -1
View File
@@ -1,4 +1,4 @@
import { BrowserWindow } from 'electron'
import type { BrowserWindow } from 'electron'
import { isDev, isWin } from '../constant'
+1 -1
View File
@@ -1,4 +1,4 @@
import { BrowserWindow } from 'electron'
import type { BrowserWindow } from 'electron'
import { configManager } from '../services/ConfigManager'
+7 -6
View File
@@ -1,6 +1,6 @@
import { electronAPI } from '@electron-toolkit/preload'
import { SpanEntity, TokenUsage } from '@mcp-trace/trace-core'
import { SpanContext } from '@opentelemetry/api'
import type { SpanEntity, TokenUsage } from '@mcp-trace/trace-core'
import type { SpanContext } from '@opentelemetry/api'
import type { LogLevel, LogSourceWithContext } from '@shared/config/logger'
import type { FileChangeEvent } from '@shared/config/types'
import type { CacheSyncMessage } from '@shared/data/cache/cacheTypes'
@@ -9,10 +9,10 @@ import type {
PreferenceKeyType,
SelectionActionItem
} from '@shared/data/preference/preferenceTypes'
import { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import type { UpgradeChannel } from '@shared/data/preference/preferenceTypes'
import { IpcChannel } from '@shared/IpcChannel'
import type { Notification } from '@types'
import {
import type {
AddMemoryOptions,
AssistantMessage,
FileListResponse,
@@ -33,8 +33,9 @@ import {
SupportedOcrFile,
WebDavConfig
} from '@types'
import { contextBridge, ipcRenderer, OpenDialogOptions, shell, webUtils } from 'electron'
import { CreateDirectoryOptions } from 'webdav'
import type { OpenDialogOptions } from 'electron'
import { contextBridge, ipcRenderer, shell, webUtils } from 'electron'
import type { CreateDirectoryOptions } from 'webdav'
export function tracedInvoke(channel: string, spanContext: SpanContext | undefined, ...args: any[]) {
if (spanContext) {
+1 -1
View File
@@ -1,4 +1,4 @@
import { ElectronAPI } from '@electron-toolkit/preload'
import type { ElectronAPI } from '@electron-toolkit/preload'
import type { WindowApiType } from './index'
+2 -1
View File
@@ -1,6 +1,7 @@
import '@renderer/databases'
import { FC, useMemo } from 'react'
import type { FC } from 'react'
import { useMemo } from 'react'
import { HashRouter, Route, Routes } from 'react-router-dom'
import Sidebar from './components/app/Sidebar'
@@ -4,8 +4,10 @@
*/
import { loggerService } from '@logger'
import { AISDKWebSearchResult, MCPTool, WebSearchResults, WebSearchSource } from '@renderer/types'
import { Chunk, ChunkType } from '@renderer/types/chunk'
import type { AISDKWebSearchResult, MCPTool, WebSearchResults } from '@renderer/types'
import { WebSearchSource } from '@renderer/types'
import type { Chunk } from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import { convertLinks, flushLinkConverterBuffer } from '@renderer/utils/linkConverter'
import type { TextStreamPart, ToolSet } from 'ai'
@@ -6,8 +6,9 @@
import { loggerService } from '@logger'
import { processKnowledgeReferences } from '@renderer/services/KnowledgeService'
import { BaseTool, MCPTool, MCPToolResponse, NormalToolResponse } from '@renderer/types'
import { Chunk, ChunkType } from '@renderer/types/chunk'
import type { BaseTool, MCPTool, MCPToolResponse, NormalToolResponse } from '@renderer/types'
import type { Chunk } from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import type { ToolSet, TypedToolCall, TypedToolError, TypedToolResult } from 'ai'
const logger = loggerService.withContext('ToolCallChunkHandler')
+4 -3
View File
@@ -11,15 +11,16 @@ import { createExecutor } from '@cherrystudio/ai-core'
import { preferenceService } from '@data/PreferenceService'
import { loggerService } from '@logger'
import { addSpan, endSpan } from '@renderer/services/SpanManagerService'
import { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity'
import type { StartSpanParams } from '@renderer/trace/types/ModelSpanEntity'
import type { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types'
import type { AiSdkModel, StreamTextParams } from '@renderer/types/aiCoreTypes'
import { type ImageModel, type LanguageModel, type Provider as AiSdkProvider, wrapLanguageModel } from 'ai'
import AiSdkToChunkAdapter from './chunk/AiSdkToChunkAdapter'
import LegacyAiProvider from './legacy/index'
import { CompletionsParams, CompletionsResult } from './legacy/middleware/schemas'
import { AiSdkMiddlewareConfig, buildAiSdkMiddlewares } from './middleware/AiSdkMiddlewareBuilder'
import type { CompletionsParams, CompletionsResult } from './legacy/middleware/schemas'
import type { AiSdkMiddlewareConfig } from './middleware/AiSdkMiddlewareBuilder'
import { buildAiSdkMiddlewares } from './middleware/AiSdkMiddlewareBuilder'
import { buildPlugins } from './plugins/PluginBuilder'
import { buildClaudeCodeSystemMessage } from './provider/config/anthropic'
import { createAiSdkProvider } from './provider/factory'
@@ -1,10 +1,10 @@
import { loggerService } from '@logger'
import { Provider } from '@renderer/types'
import type { Provider } from '@renderer/types'
import { AihubmixAPIClient } from './aihubmix/AihubmixAPIClient'
import { AnthropicAPIClient } from './anthropic/AnthropicAPIClient'
import { AwsBedrockAPIClient } from './aws/AwsBedrockAPIClient'
import { BaseApiClient } from './BaseApiClient'
import type { BaseApiClient } from './BaseApiClient'
import { CherryinAPIClient } from './cherryin/CherryinAPIClient'
import { GeminiAPIClient } from './gemini/GeminiAPIClient'
import { VertexAPIClient } from './gemini/VertexAPIClient'
@@ -8,29 +8,31 @@ import {
import { isSupportServiceTierProvider } from '@renderer/config/providers'
import { getLMStudioKeepAliveTime } from '@renderer/hooks/useLMStudio'
import { getAssistantSettings } from '@renderer/services/AssistantService'
import {
import type {
Assistant,
FileTypes,
GenerateImageParams,
GroqServiceTiers,
isGroqServiceTier,
isOpenAIServiceTier,
KnowledgeReference,
MCPCallToolResponse,
MCPTool,
MCPToolResponse,
MemoryItem,
Model,
OpenAIServiceTiers,
OpenAIVerbosity,
Provider,
SystemProviderIds,
ToolCallResponse,
WebSearchProviderResponse,
WebSearchResponse
} from '@renderer/types'
import { Message } from '@renderer/types/newMessage'
import {
FileTypes,
GroqServiceTiers,
isGroqServiceTier,
isOpenAIServiceTier,
OpenAIServiceTiers,
SystemProviderIds
} from '@renderer/types'
import type { Message } from '@renderer/types/newMessage'
import type {
RequestOptions,
SdkInstance,
SdkMessageParam,
@@ -49,8 +51,8 @@ import { REFERENCE_PROMPT } from '@shared/config/prompts'
import { defaultAppHeaders } from '@shared/utils'
import { isEmpty } from 'lodash'
import { CompletionsContext } from '../middleware/types'
import { ApiClient, RequestTransformer, ResponseChunkTransformer } from './types'
import type { CompletionsContext } from '../middleware/types'
import type { ApiClient, RequestTransformer, ResponseChunkTransformer } from './types'
const logger = loggerService.withContext('BaseApiClient')
@@ -1,4 +1,4 @@
import {
import type {
GenerateImageParams,
MCPCallToolResponse,
MCPTool,
@@ -7,7 +7,7 @@ import {
Provider,
ToolCallResponse
} from '@renderer/types'
import {
import type {
RequestOptions,
SdkInstance,
SdkMessageParam,
@@ -19,13 +19,13 @@ import {
SdkToolCall
} from '@renderer/types/sdk'
import { CompletionsContext } from '../middleware/types'
import { AnthropicAPIClient } from './anthropic/AnthropicAPIClient'
import type { CompletionsContext } from '../middleware/types'
import type { AnthropicAPIClient } from './anthropic/AnthropicAPIClient'
import { BaseApiClient } from './BaseApiClient'
import { GeminiAPIClient } from './gemini/GeminiAPIClient'
import { OpenAIAPIClient } from './openai/OpenAIApiClient'
import { OpenAIResponseAPIClient } from './openai/OpenAIResponseAPIClient'
import { RequestTransformer, ResponseChunkTransformer } from './types'
import type { GeminiAPIClient } from './gemini/GeminiAPIClient'
import type { OpenAIAPIClient } from './openai/OpenAIApiClient'
import type { OpenAIResponseAPIClient } from './openai/OpenAIResponseAPIClient'
import type { RequestTransformer, ResponseChunkTransformer } from './types'
/**
* MixedAPIClient - Provider
@@ -1,4 +1,4 @@
import { Provider } from '@renderer/types'
import type { Provider } from '@renderer/types'
import { isOpenAIProvider } from '@renderer/utils'
import { beforeEach, describe, expect, it, vi } from 'vitest'
@@ -6,7 +6,7 @@ import { VertexAPIClient } from '@renderer/aiCore/legacy/clients/gemini/VertexAP
import { NewAPIClient } from '@renderer/aiCore/legacy/clients/newapi/NewAPIClient'
import { OpenAIAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIApiClient'
import { OpenAIResponseAPIClient } from '@renderer/aiCore/legacy/clients/openai/OpenAIResponseAPIClient'
import { EndpointType, Model, Provider } from '@renderer/types'
import type { EndpointType, Model, Provider } from '@renderer/types'
import { beforeEach, describe, expect, it, vi } from 'vitest'
vi.mock('@renderer/config/models', () => ({
@@ -1,8 +1,8 @@
import { isOpenAILLMModel } from '@renderer/config/models'
import { Model, Provider } from '@renderer/types'
import type { Model, Provider } from '@renderer/types'
import { AnthropicAPIClient } from '../anthropic/AnthropicAPIClient'
import { BaseApiClient } from '../BaseApiClient'
import type { BaseApiClient } from '../BaseApiClient'
import { GeminiAPIClient } from '../gemini/GeminiAPIClient'
import { MixedBaseAPIClient } from '../MixedBaseApiClient'
import { OpenAIAPIClient } from '../openai/OpenAIApiClient'
@@ -1,5 +1,5 @@
import Anthropic from '@anthropic-ai/sdk'
import {
import type {
Base64ImageSource,
ImageBlockParam,
MessageParam,
@@ -8,7 +8,7 @@ import {
ToolUseBlock,
WebSearchTool20250305
} from '@anthropic-ai/sdk/resources'
import {
import type {
ContentBlock,
ContentBlockParam,
MessageCreateParamsBase,
@@ -23,27 +23,24 @@ import {
WebSearchToolResultError
} from '@anthropic-ai/sdk/resources/messages'
import { MessageStream } from '@anthropic-ai/sdk/resources/messages/messages'
import AnthropicVertex from '@anthropic-ai/vertex-sdk'
import type AnthropicVertex from '@anthropic-ai/vertex-sdk'
import { loggerService } from '@logger'
import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant'
import { findTokenLimit, isClaudeReasoningModel, isReasoningModel, isWebSearchModel } from '@renderer/config/models'
import { getAssistantSettings } from '@renderer/services/AssistantService'
import FileManager from '@renderer/services/FileManager'
import { estimateTextTokens } from '@renderer/services/TokenService'
import {
import type {
Assistant,
EFFORT_RATIO,
FileTypes,
MCPCallToolResponse,
MCPTool,
MCPToolResponse,
Model,
Provider,
ToolCallResponse,
WebSearchSource
ToolCallResponse
} from '@renderer/types'
import {
ChunkType,
import { EFFORT_RATIO, FileTypes, WebSearchSource } from '@renderer/types'
import type {
ErrorChunk,
LLMWebSearchCompleteChunk,
LLMWebSearchInProgressChunk,
@@ -53,8 +50,9 @@ import {
ThinkingDeltaChunk,
ThinkingStartChunk
} from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import { type Message } from '@renderer/types/newMessage'
import {
import type {
AnthropicSdkMessageParam,
AnthropicSdkParams,
AnthropicSdkRawChunk,
@@ -70,9 +68,9 @@ import {
import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/find'
import { t } from 'i18next'
import { GenericChunk } from '../../middleware/schemas'
import type { GenericChunk } from '../../middleware/schemas'
import { BaseApiClient } from '../BaseApiClient'
import { AnthropicStreamListener, RawStreamListener, RequestTransformer, ResponseChunkTransformer } from '../types'
import type { AnthropicStreamListener, RawStreamListener, RequestTransformer, ResponseChunkTransformer } from '../types'
const logger = loggerService.withContext('AnthropicAPIClient')
@@ -1,8 +1,8 @@
import Anthropic from '@anthropic-ai/sdk'
import type Anthropic from '@anthropic-ai/sdk'
import AnthropicVertex from '@anthropic-ai/vertex-sdk'
import { loggerService } from '@logger'
import { getVertexAILocation, getVertexAIProjectId, getVertexAIServiceAccount } from '@renderer/hooks/useVertexAI'
import { Provider } from '@renderer/types'
import type { Provider } from '@renderer/types'
import { isEmpty } from 'lodash'
import { AnthropicAPIClient } from './AnthropicAPIClient'
@@ -6,7 +6,7 @@ import {
InvokeModelWithResponseStreamCommand
} from '@aws-sdk/client-bedrock-runtime'
import { loggerService } from '@logger'
import { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas'
import type { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas'
import { DEFAULT_MAX_TOKENS } from '@renderer/config/constant'
import { findTokenLimit, isReasoningModel } from '@renderer/config/models'
import {
@@ -16,10 +16,8 @@ import {
} from '@renderer/hooks/useAwsBedrock'
import { getAssistantSettings } from '@renderer/services/AssistantService'
import { estimateTextTokens } from '@renderer/services/TokenService'
import {
import type {
Assistant,
EFFORT_RATIO,
FileTypes,
GenerateImageParams,
MCPCallToolResponse,
MCPTool,
@@ -28,15 +26,11 @@ import {
Provider,
ToolCallResponse
} from '@renderer/types'
import {
ChunkType,
MCPToolCreatedChunk,
TextDeltaChunk,
ThinkingDeltaChunk,
ThinkingStartChunk
} from '@renderer/types/chunk'
import { Message } from '@renderer/types/newMessage'
import {
import { EFFORT_RATIO, FileTypes } from '@renderer/types'
import type { MCPToolCreatedChunk, TextDeltaChunk, ThinkingDeltaChunk, ThinkingStartChunk } from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import type { Message } from '@renderer/types/newMessage'
import type {
AwsBedrockSdkInstance,
AwsBedrockSdkMessageParam,
AwsBedrockSdkParams,
@@ -58,7 +52,7 @@ import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/fi
import { t } from 'i18next'
import { BaseApiClient } from '../BaseApiClient'
import { RequestTransformer, ResponseChunkTransformer } from '../types'
import type { RequestTransformer, ResponseChunkTransformer } from '../types'
const logger = loggerService.withContext('AwsBedrockAPIClient')
@@ -1,6 +1,6 @@
import { Provider } from '@renderer/types'
import { OpenAISdkParams, OpenAISdkRawOutput } from '@renderer/types/sdk'
import OpenAI from 'openai'
import type { Provider } from '@renderer/types'
import type { OpenAISdkParams, OpenAISdkRawOutput } from '@renderer/types/sdk'
import type OpenAI from 'openai'
import { OpenAIAPIClient } from '../openai/OpenAIApiClient'
@@ -1,14 +1,9 @@
import {
import type {
Content,
createPartFromUri,
File,
FunctionCall,
GenerateContentConfig,
GenerateImagesConfig,
GoogleGenAI,
HarmBlockThreshold,
HarmCategory,
Modality,
Model as GeminiModel,
Part,
SafetySetting,
@@ -16,6 +11,7 @@ import {
ThinkingConfig,
Tool
} from '@google/genai'
import { createPartFromUri, GoogleGenAI, HarmBlockThreshold, HarmCategory, Modality } from '@google/genai'
import { loggerService } from '@logger'
import { nanoid } from '@reduxjs/toolkit'
import {
@@ -26,11 +22,9 @@ import {
isVisionModel
} from '@renderer/config/models'
import { estimateTextTokens } from '@renderer/services/TokenService'
import {
import type {
Assistant,
EFFORT_RATIO,
FileMetadata,
FileTypes,
FileUploadResponse,
GenerateImageParams,
MCPCallToolResponse,
@@ -38,12 +32,13 @@ import {
MCPToolResponse,
Model,
Provider,
ToolCallResponse,
WebSearchSource
ToolCallResponse
} from '@renderer/types'
import { ChunkType, LLMWebSearchCompleteChunk, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk'
import { Message } from '@renderer/types/newMessage'
import {
import { EFFORT_RATIO, FileTypes, WebSearchSource } from '@renderer/types'
import type { LLMWebSearchCompleteChunk, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import type { Message } from '@renderer/types/newMessage'
import type {
GeminiOptions,
GeminiSdkMessageParam,
GeminiSdkParams,
@@ -62,9 +57,9 @@ import { findFileBlocks, findImageBlocks, getMainTextContent } from '@renderer/u
import { defaultTimeout, MB } from '@shared/config/constant'
import { t } from 'i18next'
import { GenericChunk } from '../../middleware/schemas'
import type { GenericChunk } from '../../middleware/schemas'
import { BaseApiClient } from '../BaseApiClient'
import { RequestTransformer, ResponseChunkTransformer } from '../types'
import type { RequestTransformer, ResponseChunkTransformer } from '../types'
const logger = loggerService.withContext('GeminiAPIClient')
@@ -1,7 +1,7 @@
import { GoogleGenAI } from '@google/genai'
import { loggerService } from '@logger'
import { createVertexProvider, isVertexAIConfigured, isVertexProvider } from '@renderer/hooks/useVertexAI'
import { Model, Provider, VertexProvider } from '@renderer/types'
import type { Model, Provider, VertexProvider } from '@renderer/types'
import { isEmpty } from 'lodash'
import { AnthropicVertexClient } from '../anthropic/AnthropicVertexClient'
@@ -1,10 +1,10 @@
import { loggerService } from '@logger'
import { isSupportedModel } from '@renderer/config/models'
import { Model, Provider } from '@renderer/types'
import { NewApiModel } from '@renderer/types/sdk'
import type { Model, Provider } from '@renderer/types'
import type { NewApiModel } from '@renderer/types/sdk'
import { AnthropicAPIClient } from '../anthropic/AnthropicAPIClient'
import { BaseApiClient } from '../BaseApiClient'
import type { BaseApiClient } from '../BaseApiClient'
import { GeminiAPIClient } from '../gemini/GeminiAPIClient'
import { MixedBaseAPIClient } from '../MixedBaseApiClient'
import { OpenAIAPIClient } from '../openai/OpenAIApiClient'
@@ -41,25 +41,28 @@ import { mapLanguageToQwenMTModel } from '@renderer/config/translate'
import { processPostsuffixQwen3Model, processReqMessages } from '@renderer/services/ModelMessageService'
import { estimateTextTokens } from '@renderer/services/TokenService'
// For Copilot token
import {
import type {
Assistant,
EFFORT_RATIO,
FileTypes,
isSystemProvider,
isTranslateAssistant,
MCPCallToolResponse,
MCPTool,
MCPToolResponse,
Model,
OpenAIServiceTier,
Provider,
ToolCallResponse
} from '@renderer/types'
import {
EFFORT_RATIO,
FileTypes,
isSystemProvider,
isTranslateAssistant,
SystemProviderIds,
ToolCallResponse,
WebSearchSource
} from '@renderer/types'
import { ChunkType, TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk'
import { Message } from '@renderer/types/newMessage'
import {
import type { TextStartChunk, ThinkingStartChunk } from '@renderer/types/chunk'
import { ChunkType } from '@renderer/types/chunk'
import type { Message } from '@renderer/types/newMessage'
import type {
OpenAIExtraBody,
OpenAIModality,
OpenAISdkMessageParam,
@@ -78,11 +81,12 @@ import {
} from '@renderer/utils/mcp-tools'
import { findFileBlocks, findImageBlocks } from '@renderer/utils/messageUtils/find'
import { t } from 'i18next'
import OpenAI, { AzureOpenAI } from 'openai'
import { ChatCompletionContentPart, ChatCompletionContentPartRefusal, ChatCompletionTool } from 'openai/resources'
import type { AzureOpenAI } from 'openai'
import type OpenAI from 'openai'
import type { ChatCompletionContentPart, ChatCompletionContentPartRefusal, ChatCompletionTool } from 'openai/resources'
import { GenericChunk } from '../../middleware/schemas'
import { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types'
import type { GenericChunk } from '../../middleware/schemas'
import type { RequestTransformer, ResponseChunkTransformer, ResponseChunkTransformerContext } from '../types'
import { OpenAIBaseClient } from './OpenAIBaseClient'
const logger = loggerService.withContext('OpenAIApiClient')
@@ -8,9 +8,9 @@ import {
import { getStoreSetting } from '@renderer/hooks/useSettings'
import { getAssistantSettings } from '@renderer/services/AssistantService'
import store from '@renderer/store'
import { SettingsState } from '@renderer/store/settings'
import { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types'
import {
import type { SettingsState } from '@renderer/store/settings'
import type { Assistant, GenerateImageParams, Model, Provider } from '@renderer/types'
import type {
OpenAIResponseSdkMessageParam,
OpenAIResponseSdkParams,
OpenAIResponseSdkRawChunk,
@@ -1,6 +1,6 @@
import { loggerService } from '@logger'
import { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas'
import { CompletionsContext } from '@renderer/aiCore/legacy/middleware/types'
import type { GenericChunk } from '@renderer/aiCore/legacy/middleware/schemas'
import type { CompletionsContext } from '@renderer/aiCore/legacy/middleware/types'
import {
isGPT5SeriesModel,
isOpenAIChatCompletionOnlyModel,
@@ -12,21 +12,20 @@ import {
} from '@renderer/config/models'
import { isSupportDeveloperRoleProvider } from '@renderer/config/providers'
import { estimateTextTokens } from '@renderer/services/TokenService'
import {
import type {
FileMetadata,
FileTypes,
MCPCallToolResponse,
MCPTool,
MCPToolResponse,
Model,
OpenAIServiceTier,
Provider,
ToolCallResponse,
WebSearchSource
ToolCallResponse
} from '@renderer/types'
import { FileTypes, WebSearchSource } from '@renderer/types'
import { ChunkType } from '@renderer/types/chunk'
import { Message } from '@renderer/types/newMessage'
import {
import type { Message } from '@renderer/types/newMessage'
import type {
OpenAIResponseSdkMessageParam,
OpenAIResponseSdkParams,
OpenAIResponseSdkRawChunk,
@@ -46,9 +45,9 @@ import { MB } from '@shared/config/constant'
import { t } from 'i18next'
import { isEmpty } from 'lodash'
import OpenAI, { AzureOpenAI } from 'openai'
import { ResponseInput } from 'openai/resources/responses/responses'
import type { ResponseInput } from 'openai/resources/responses/responses'
import { RequestTransformer, ResponseChunkTransformer } from '../types'
import type { RequestTransformer, ResponseChunkTransformer } from '../types'
import { OpenAIAPIClient } from './OpenAIApiClient'
import { OpenAIBaseClient } from './OpenAIBaseClient'
@@ -1,7 +1,7 @@
import { loggerService } from '@logger'
import { isSupportedModel } from '@renderer/config/models'
import { Model, Provider } from '@renderer/types'
import OpenAI from 'openai'
import type { Model, Provider } from '@renderer/types'
import type OpenAI from 'openai'
import { OpenAIAPIClient } from '../openai/OpenAIApiClient'
@@ -1,7 +1,7 @@
import Anthropic from '@anthropic-ai/sdk'
import { Assistant, MCPTool, MCPToolResponse, Model, ToolCallResponse } from '@renderer/types'
import { Provider } from '@renderer/types'
import {
import type Anthropic from '@anthropic-ai/sdk'
import type { Assistant, MCPTool, MCPToolResponse, Model, ToolCallResponse } from '@renderer/types'
import type { Provider } from '@renderer/types'
import type {
AnthropicSdkRawChunk,
OpenAIResponseSdkRawChunk,
OpenAIResponseSdkRawOutput,
@@ -13,10 +13,10 @@ import {
SdkTool,
SdkToolCall
} from '@renderer/types/sdk'
import OpenAI from 'openai'
import type OpenAI from 'openai'
import { CompletionsParams, GenericChunk } from '../middleware/schemas'
import { CompletionsContext } from '../middleware/types'
import type { CompletionsParams, GenericChunk } from '../middleware/schemas'
import type { CompletionsContext } from '../middleware/types'
/**
*
@@ -1,7 +1,7 @@
import { loggerService } from '@logger'
import { Provider } from '@renderer/types'
import { GenerateImageParams } from '@renderer/types'
import OpenAI from 'openai'
import type { Provider } from '@renderer/types'
import type { GenerateImageParams } from '@renderer/types'
import type OpenAI from 'openai'
import { OpenAIAPIClient } from '../openai/OpenAIApiClient'

Some files were not shown because too many files have changed in this diff Show More