diff --git a/langchain/.eslintrc.cjs b/langchain/.eslintrc.cjs index 86b4d538079a..a404d0cf7acb 100644 --- a/langchain/.eslintrc.cjs +++ b/langchain/.eslintrc.cjs @@ -11,7 +11,7 @@ module.exports = { project: "./tsconfig.json", sourceType: "module", }, - plugins: ["@typescript-eslint", "tree-shaking"], + plugins: ["@typescript-eslint", "tree-shaking", "no-instanceof"], ignorePatterns: [ ".eslintrc.cjs", "scripts", @@ -44,6 +44,7 @@ module.exports = { }, ], "no-process-env": 2, + "no-instanceof/no-instanceof": 2, "@typescript-eslint/explicit-module-boundary-types": 0, "@typescript-eslint/no-empty-function": 0, "@typescript-eslint/no-shadow": 0, diff --git a/langchain/package.json b/langchain/package.json index 5c1cd2969433..47ca4ea5669c 100644 --- a/langchain/package.json +++ b/langchain/package.json @@ -128,6 +128,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.6.0", "eslint-plugin-import": "^2.27.5", + "eslint-plugin-no-instanceof": "^1.0.1", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-tree-shaking": "^1.10.0", "hnswlib-node": "^1.4.2", diff --git a/langchain/src/agents/agent.ts b/langchain/src/agents/agent.ts index 1834366adca2..00ba85cf197d 100644 --- a/langchain/src/agents/agent.ts +++ b/langchain/src/agents/agent.ts @@ -312,6 +312,8 @@ export abstract class Agent extends BaseSingleActionAgent { return { returnValues: { output: action.log }, log: action.log }; } catch (err) { + // fine to use instanceof because we're in the same module + // eslint-disable-next-line no-instanceof/no-instanceof if (!(err instanceof ParseError)) { throw err; } diff --git a/langchain/src/callbacks/utils.ts b/langchain/src/callbacks/utils.ts index 89b9aad14bbb..c828521cd9a8 100644 --- a/langchain/src/callbacks/utils.ts +++ b/langchain/src/callbacks/utils.ts @@ -40,6 +40,8 @@ export async function setTracerSession( callbackManager: CallbackManager = getCallbackManager() ) { for (const handler of callbackManager.handlers) { + // fine to use instanceof here because we're in the same package + // eslint-disable-next-line no-instanceof/no-instanceof if (handler instanceof LangChainTracer) { const sessionName = options?.sessionName; if (sessionName) { diff --git a/langchain/src/chains/prompt_selector.ts b/langchain/src/chains/prompt_selector.ts index ed0635753f0f..9015491533f1 100644 --- a/langchain/src/chains/prompt_selector.ts +++ b/langchain/src/chains/prompt_selector.ts @@ -1,6 +1,7 @@ import { BaseChatModel } from "../chat_models/base.js"; import { BasePromptTemplate } from "../prompts/base.js"; import { BaseLanguageModel } from "../base_language/index.js"; +import { BaseLLM } from "../llms/base.js"; export abstract class BasePromptSelector { abstract getPrompt(llm: BaseLanguageModel): BasePromptTemplate; @@ -37,10 +38,10 @@ export class ConditionalPromptSelector extends BasePromptSelector { } } -export function isLLM(llm: BaseLanguageModel): llm is BaseLanguageModel { - return llm instanceof BaseLanguageModel; +export function isLLM(llm: BaseLanguageModel): llm is BaseLLM { + return llm._modelType() === "base_llm"; } export function isChatModel(llm: BaseLanguageModel): llm is BaseChatModel { - return llm instanceof BaseChatModel; + return llm._modelType() === "base_chat_model"; } diff --git a/langchain/src/llms/base.ts b/langchain/src/llms/base.ts index 7afb913db76e..c56114fddfe6 100644 --- a/langchain/src/llms/base.ts +++ b/langchain/src/llms/base.ts @@ -32,7 +32,7 @@ export abstract class BaseLLM extends BaseLanguageModel { constructor({ cache, concurrency, ...rest }: BaseLLMParams) { super(concurrency ? { maxConcurrency: concurrency, ...rest } : rest); - if (cache instanceof BaseCache) { + if (typeof cache === "object") { this.cache = cache; } else if (cache) { this.cache = InMemoryCache.global(); diff --git a/langchain/src/memory/base.ts b/langchain/src/memory/base.ts index af9174756b8a..6e646a8c151a 100644 --- a/langchain/src/memory/base.ts +++ b/langchain/src/memory/base.ts @@ -1,10 +1,4 @@ -import { - BaseChatMessage, - HumanChatMessage, - AIChatMessage, - SystemChatMessage, - ChatMessage, -} from "../schema/index.js"; +import { BaseChatMessage, ChatMessage } from "../schema/index.js"; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type InputValues = Record; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -42,14 +36,14 @@ export function getBufferString( const string_messages: string[] = []; for (const m of messages) { let role: string; - if (m instanceof HumanChatMessage) { + if (m._getType() === "human") { role = human_prefix; - } else if (m instanceof AIChatMessage) { + } else if (m._getType() === "ai") { role = ai_prefix; - } else if (m instanceof SystemChatMessage) { + } else if (m._getType() === "system") { role = "System"; - } else if (m instanceof ChatMessage) { - role = m.role; + } else if (m._getType() === "generic") { + role = (m as ChatMessage).role; } else { throw new Error(`Got unsupported message type: ${m}`); } diff --git a/langchain/src/output_parsers/fix.ts b/langchain/src/output_parsers/fix.ts index 1e6acc2d3070..9d66739db1a5 100644 --- a/langchain/src/output_parsers/fix.ts +++ b/langchain/src/output_parsers/fix.ts @@ -37,6 +37,7 @@ export class OutputFixingParser extends BaseOutputParser { try { return await this.parser.parse(completion); } catch (e) { + // eslint-disable-next-line no-instanceof/no-instanceof if (e instanceof OutputParserException) { const result = await this.retryChain.call({ instructions: this.parser.getFormatInstructions(), diff --git a/langchain/src/output_parsers/structured.ts b/langchain/src/output_parsers/structured.ts index 7bcc41fc662b..2ec354991d31 100644 --- a/langchain/src/output_parsers/structured.ts +++ b/langchain/src/output_parsers/structured.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-instanceof/no-instanceof */ import { z } from "zod"; import { BaseOutputParser, OutputParserException } from "../schema/index.js"; diff --git a/yarn.lock b/yarn.lock index 41db9981a022..28c3e8dc8d42 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7989,6 +7989,13 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-no-instanceof@npm:^1.0.1": + version: 1.0.1 + resolution: "eslint-plugin-no-instanceof@npm:1.0.1" + checksum: 80b152b13869fd88debb9d387ca225dd18e5a75fe33f9510e71a65070a4862bfca5a57dc42b508259d8150f318312bf26c09e570874c2871bf0f59c4b745cfe5 + languageName: node + linkType: hard + "eslint-plugin-prettier@npm:^4.2.1": version: 4.2.1 resolution: "eslint-plugin-prettier@npm:4.2.1" @@ -11468,6 +11475,7 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.6.0 eslint-plugin-import: ^2.27.5 + eslint-plugin-no-instanceof: ^1.0.1 eslint-plugin-prettier: ^4.2.1 eslint-plugin-tree-shaking: ^1.10.0 exponential-backoff: ^3.1.0