{"version":3,"file":"chroma.cjs","names":["BaseTranslator","Operators","Comparators"],"sources":["../../src/structured_query/chroma.ts"],"sourcesContent":["import {\n  BaseTranslator,\n  Comparator,\n  Comparators,\n  Comparison,\n  Operation,\n  Operator,\n  Operators,\n  StructuredQuery,\n  Visitor,\n  isFilterEmpty,\n  castValue,\n} from \"@langchain/core/structured_query\";\nimport { Chroma } from \"../vectorstores/chroma.js\";\n\n/**\n * Specialized translator for the Chroma vector database. It extends the\n * BasicTranslator class and translates internal query language elements\n * to valid filters. The class defines a subset of allowed logical\n * operators and comparators that can be used in the translation process.\n * @example\n * ```typescript\n * const chromaTranslator = new ChromaTranslator();\n * const selfQueryRetriever = new SelfQueryRetriever({\n *   llm: new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n *   vectorStore: new Chroma(),\n *   documentContents: \"Brief summary of a movie\",\n *   attributeInfo: [],\n *   structuredQueryTranslator: chromaTranslator,\n * });\n *\n * const relevantDocuments = await selfQueryRetriever.getRelevantDocuments(\n *   \"Which movies are directed by Greta Gerwig?\",\n * );\n * ```\n */\nexport class ChromaTranslator<T extends Chroma> extends BaseTranslator<T> {\n  declare VisitOperationOutput: T[\"FilterType\"];\n\n  declare VisitComparisonOutput: T[\"FilterType\"];\n\n  allowedOperators: Operator[] = [Operators.and, Operators.or];\n\n  allowedComparators: Comparator[] = [\n    Comparators.eq,\n    Comparators.ne,\n    Comparators.gt,\n    Comparators.gte,\n    Comparators.lt,\n    Comparators.lte,\n  ];\n\n  formatFunction(func: Operator | Comparator): string {\n    if (func in Comparators) {\n      if (\n        this.allowedComparators.length > 0 &&\n        this.allowedComparators.indexOf(func as Comparator) === -1\n      ) {\n        throw new Error(\n          `Comparator ${func} not allowed. Allowed comparators: ${this.allowedComparators.join(\n            \", \"\n          )}`\n        );\n      }\n    } else if (func in Operators) {\n      if (\n        this.allowedOperators.length > 0 &&\n        this.allowedOperators.indexOf(func as Operator) === -1\n      ) {\n        throw new Error(\n          `Operator ${func} not allowed. Allowed operators: ${this.allowedOperators.join(\n            \", \"\n          )}`\n        );\n      }\n    } else {\n      throw new Error(\"Unknown comparator or operator\");\n    }\n    return `$${func}`;\n  }\n\n  visitOperation(operation: Operation): this[\"VisitOperationOutput\"] {\n    const args = operation.args?.map((arg) => arg.accept(this as Visitor));\n    return {\n      [this.formatFunction(operation.operator)]: args,\n    } as this[\"VisitOperationOutput\"];\n  }\n\n  visitComparison(comparison: Comparison): this[\"VisitComparisonOutput\"] {\n    return {\n      [comparison.attribute]: {\n        [this.formatFunction(comparison.comparator)]: castValue(\n          comparison.value\n        ),\n      },\n    } as this[\"VisitComparisonOutput\"];\n  }\n\n  visitStructuredQuery(\n    query: StructuredQuery\n  ): this[\"VisitStructuredQueryOutput\"] {\n    let nextArg = {} as this[\"VisitStructuredQueryOutput\"];\n    if (query.filter) {\n      nextArg = {\n        filter: query.filter.accept(this as Visitor),\n      } as this[\"VisitStructuredQueryOutput\"];\n    }\n    return nextArg;\n  }\n\n  mergeFilters(\n    defaultFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n    generatedFilter: this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined,\n    mergeType: \"and\" | \"or\" | \"replace\" = \"and\",\n    forceDefaultFilter = false\n  ): this[\"VisitStructuredQueryOutput\"][\"filter\"] | undefined {\n    if (isFilterEmpty(defaultFilter) && isFilterEmpty(generatedFilter)) {\n      return undefined;\n    }\n    if (isFilterEmpty(defaultFilter) || mergeType === \"replace\") {\n      if (isFilterEmpty(generatedFilter)) {\n        return undefined;\n      }\n      return generatedFilter;\n    }\n    if (isFilterEmpty(generatedFilter)) {\n      if (forceDefaultFilter) {\n        return defaultFilter;\n      }\n      if (mergeType === \"and\") {\n        return undefined;\n      }\n      return defaultFilter;\n    }\n    if (mergeType === \"and\") {\n      return {\n        $and: [defaultFilter, generatedFilter],\n      } as this[\"VisitStructuredQueryOutput\"][\"filter\"];\n    } else if (mergeType === \"or\") {\n      return {\n        $or: [defaultFilter, generatedFilter],\n      } as this[\"VisitStructuredQueryOutput\"][\"filter\"];\n    } else {\n      throw new Error(\"Unknown merge type\");\n    }\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,IAAa,mBAAb,cAAwDA,iCAAAA,eAAkB;CAKxE,mBAA+B,CAACC,iCAAAA,UAAU,KAAKA,iCAAAA,UAAU,GAAG;CAE5D,qBAAmC;EACjCC,iCAAAA,YAAY;EACZA,iCAAAA,YAAY;EACZA,iCAAAA,YAAY;EACZA,iCAAAA,YAAY;EACZA,iCAAAA,YAAY;EACZA,iCAAAA,YAAY;EACb;CAED,eAAe,MAAqC;AAClD,MAAI,QAAQA,iCAAAA;OAER,KAAK,mBAAmB,SAAS,KACjC,KAAK,mBAAmB,QAAQ,KAAmB,KAAK,GAExD,OAAM,IAAI,MACR,cAAc,KAAK,qCAAqC,KAAK,mBAAmB,KAC9E,KACD,GACF;aAEM,QAAQD,iCAAAA;OAEf,KAAK,iBAAiB,SAAS,KAC/B,KAAK,iBAAiB,QAAQ,KAAiB,KAAK,GAEpD,OAAM,IAAI,MACR,YAAY,KAAK,mCAAmC,KAAK,iBAAiB,KACxE,KACD,GACF;QAGH,OAAM,IAAI,MAAM,iCAAiC;AAEnD,SAAO,IAAI;;CAGb,eAAe,WAAoD;EACjE,MAAM,OAAO,UAAU,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAgB,CAAC;AACtE,SAAO,GACJ,KAAK,eAAe,UAAU,SAAS,GAAG,MAC5C;;CAGH,gBAAgB,YAAuD;AACrE,SAAO,GACJ,WAAW,YAAY,GACrB,KAAK,eAAe,WAAW,WAAW,IAAA,GAAA,iCAAA,WACzC,WAAW,MACZ,EACF,EACF;;CAGH,qBACE,OACoC;EACpC,IAAI,UAAU,EAAE;AAChB,MAAI,MAAM,OACR,WAAU,EACR,QAAQ,MAAM,OAAO,OAAO,KAAgB,EAC7C;AAEH,SAAO;;CAGT,aACE,eACA,iBACA,YAAsC,OACtC,qBAAqB,OACqC;AAC1D,OAAA,GAAA,iCAAA,eAAkB,cAAc,KAAA,GAAA,iCAAA,eAAkB,gBAAgB,CAChE;AAEF,OAAA,GAAA,iCAAA,eAAkB,cAAc,IAAI,cAAc,WAAW;AAC3D,QAAA,GAAA,iCAAA,eAAkB,gBAAgB,CAChC;AAEF,UAAO;;AAET,OAAA,GAAA,iCAAA,eAAkB,gBAAgB,EAAE;AAClC,OAAI,mBACF,QAAO;AAET,OAAI,cAAc,MAChB;AAEF,UAAO;;AAET,MAAI,cAAc,MAChB,QAAO,EACL,MAAM,CAAC,eAAe,gBAAgB,EACvC;WACQ,cAAc,KACvB,QAAO,EACL,KAAK,CAAC,eAAe,gBAAgB,EACtC;MAED,OAAM,IAAI,MAAM,qBAAqB"}