@librechat/agents 2.0.3 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -139,10 +139,10 @@ class SplitStreamHandler {
139
139
  if (content.includes('```')) {
140
140
  this.inCodeBlock = !this.inCodeBlock;
141
141
  }
142
- if (content === '<think>' && !this.inCodeBlock) {
142
+ if (content.includes('<think>') && !this.inCodeBlock) {
143
143
  this.inThinkBlock = true;
144
144
  }
145
- else if (this.lastToken === '</think>' && !this.inCodeBlock) {
145
+ else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {
146
146
  this.inThinkBlock = false;
147
147
  }
148
148
  this.lastToken = content;
@@ -1 +1 @@
1
- {"version":3,"file":"splitStream.cjs","sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string,\n accumulate?: boolean,\n handlers: t.SplitStreamHandlers\n blockThreshold?: number,\n reasoningKey?: 'reasoning_content' | 'reasoning',\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (type?: ContentTypes.TEXT | ContentTypes.THINK): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({ event: GraphEvents.ON_MESSAGE_DELTA, data: messageDelta });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({ event: GraphEvents.ON_REASONING_DELTA, data: reasoningDelta });\n };\n handleContent = (content: string, _type: ContentTypes.TEXT | ContentTypes.THINK): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (this.currentLength > this.blockThreshold && SEPARATORS.some(sep => content.includes(sep))) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = chunk.choices?.[0]?.delta.content ?? '';\n const reasoning_content = chunk.choices?.[0]?.delta[this.reasoningKey] ?? '';\n\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content === '<think>' && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken === '</think>' && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock ? ContentTypes.THINK : ContentTypes.TEXT;\n const initialType = reasoning_content ? ContentTypes.THINK : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}"],"names":["nanoid","GraphEvents","ContentTypes","StepTypes"],"mappings":"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"}
1
+ {"version":3,"file":"splitStream.cjs","sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string,\n accumulate?: boolean,\n handlers: t.SplitStreamHandlers\n blockThreshold?: number,\n reasoningKey?: 'reasoning_content' | 'reasoning',\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (type?: ContentTypes.TEXT | ContentTypes.THINK): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({ event: GraphEvents.ON_MESSAGE_DELTA, data: messageDelta });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({ event: GraphEvents.ON_REASONING_DELTA, data: reasoningDelta });\n };\n handleContent = (content: string, _type: ContentTypes.TEXT | ContentTypes.THINK): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (this.currentLength > this.blockThreshold && SEPARATORS.some(sep => content.includes(sep))) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = chunk.choices?.[0]?.delta.content ?? '';\n const reasoning_content = chunk.choices?.[0]?.delta[this.reasoningKey] ?? '';\n\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content.includes('<think>') && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock ? ContentTypes.THINK : ContentTypes.TEXT;\n const initialType = reasoning_content ? ContentTypes.THINK : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}"],"names":["nanoid","GraphEvents","ContentTypes","StepTypes"],"mappings":"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"}
@@ -137,10 +137,10 @@ class SplitStreamHandler {
137
137
  if (content.includes('```')) {
138
138
  this.inCodeBlock = !this.inCodeBlock;
139
139
  }
140
- if (content === '<think>' && !this.inCodeBlock) {
140
+ if (content.includes('<think>') && !this.inCodeBlock) {
141
141
  this.inThinkBlock = true;
142
142
  }
143
- else if (this.lastToken === '</think>' && !this.inCodeBlock) {
143
+ else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {
144
144
  this.inThinkBlock = false;
145
145
  }
146
146
  this.lastToken = content;
@@ -1 +1 @@
1
- {"version":3,"file":"splitStream.mjs","sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string,\n accumulate?: boolean,\n handlers: t.SplitStreamHandlers\n blockThreshold?: number,\n reasoningKey?: 'reasoning_content' | 'reasoning',\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (type?: ContentTypes.TEXT | ContentTypes.THINK): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({ event: GraphEvents.ON_MESSAGE_DELTA, data: messageDelta });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({ event: GraphEvents.ON_REASONING_DELTA, data: reasoningDelta });\n };\n handleContent = (content: string, _type: ContentTypes.TEXT | ContentTypes.THINK): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (this.currentLength > this.blockThreshold && SEPARATORS.some(sep => content.includes(sep))) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = chunk.choices?.[0]?.delta.content ?? '';\n const reasoning_content = chunk.choices?.[0]?.delta[this.reasoningKey] ?? '';\n\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content === '<think>' && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken === '</think>' && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock ? ContentTypes.THINK : ContentTypes.TEXT;\n const initialType = reasoning_content ? ContentTypes.THINK : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"splitStream.mjs","sources":["../../src/splitStream.ts"],"sourcesContent":["import { nanoid } from 'nanoid';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes } from '@/common';\n\nexport const SEPARATORS = ['.', '?', '!', '۔', '。', '‥', ';', '¡', '¿', '\\n', '```'];\n\nexport class SplitStreamHandler {\n private inCodeBlock = false;\n private inThinkBlock = false;\n private accumulate: boolean;\n tokens: string[] = [];\n lastToken = '';\n reasoningTokens: string[] = [];\n currentStepId?: string;\n currentMessageId?: string;\n currentType?: ContentTypes.TEXT | ContentTypes.THINK;\n currentLength = 0;\n reasoningKey: 'reasoning_content' | 'reasoning' = 'reasoning_content';\n currentIndex = -1;\n blockThreshold = 4500;\n /** The run ID AKA the Message ID associated with the complete generation */\n runId: string;\n handlers?: t.SplitStreamHandlers;\n constructor({\n runId,\n handlers,\n accumulate,\n reasoningKey,\n blockThreshold,\n }: {\n runId: string,\n accumulate?: boolean,\n handlers: t.SplitStreamHandlers\n blockThreshold?: number,\n reasoningKey?: 'reasoning_content' | 'reasoning',\n }) {\n this.runId = runId;\n this.handlers = handlers;\n if (reasoningKey) {\n this.reasoningKey = reasoningKey;\n }\n if (blockThreshold != null) {\n this.blockThreshold = blockThreshold;\n }\n this.accumulate = accumulate ?? false;\n }\n getMessageId = (): string | undefined => {\n const messageId = this.currentMessageId;\n if (messageId != null && messageId) {\n return messageId;\n }\n return undefined;\n };\n createMessageStep = (type?: ContentTypes.TEXT | ContentTypes.THINK): [string, string] => {\n if (type != null && this.currentType !== type) {\n this.currentType = type;\n }\n this.currentLength = 0;\n this.currentIndex += 1;\n this.currentStepId = `step_${nanoid()}`;\n this.currentMessageId = `msg_${nanoid()}`;\n return [this.currentStepId, this.currentMessageId];\n };\n dispatchRunStep = (stepId: string, stepDetails: t.StepDetails): void => {\n const runStep: t.RunStep = {\n id: stepId,\n runId: this.runId,\n type: stepDetails.type,\n index: this.currentIndex,\n stepDetails,\n // usage: null,\n };\n this.handlers?.[GraphEvents.ON_RUN_STEP]?.({ event: GraphEvents.ON_RUN_STEP, data: runStep });\n };\n dispatchMessageDelta = (stepId: string, delta: t.MessageDelta): void => {\n const messageDelta: t.MessageDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_MESSAGE_DELTA]?.({ event: GraphEvents.ON_MESSAGE_DELTA, data: messageDelta });\n };\n dispatchReasoningDelta = (stepId: string, delta: t.ReasoningDelta): void => {\n const reasoningDelta: t.ReasoningDeltaEvent = {\n id: stepId,\n delta,\n };\n this.handlers?.[GraphEvents.ON_REASONING_DELTA]?.({ event: GraphEvents.ON_REASONING_DELTA, data: reasoningDelta });\n };\n handleContent = (content: string, _type: ContentTypes.TEXT | ContentTypes.THINK): void => {\n let type = _type;\n if (this.inThinkBlock && type === ContentTypes.TEXT) {\n type = ContentTypes.THINK;\n }\n if (this.accumulate) {\n if (type === ContentTypes.THINK) {\n this.reasoningTokens.push(content);\n } else {\n this.tokens.push(content);\n }\n }\n\n if (this.currentType !== type) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n\n const stepId = this.currentStepId ?? '';\n if (type === ContentTypes.THINK) {\n this.dispatchReasoningDelta(stepId, {\n content: [{\n type: ContentTypes.THINK,\n think: content,\n }],\n });\n } else {\n this.dispatchMessageDelta(stepId, {\n content: [{\n type: ContentTypes.TEXT,\n text: content,\n }],\n });\n }\n\n this.currentLength += content.length;\n if (this.inCodeBlock) {\n return;\n }\n\n if (this.currentLength > this.blockThreshold && SEPARATORS.some(sep => content.includes(sep))) {\n const [newStepId, newMessageId] = this.createMessageStep(type);\n this.dispatchRunStep(newStepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id: newMessageId,\n },\n });\n }\n };\n handle(chunk?: t.CustomChunk): void {\n if (!chunk) {\n return;\n }\n\n const content = chunk.choices?.[0]?.delta.content ?? '';\n const reasoning_content = chunk.choices?.[0]?.delta[this.reasoningKey] ?? '';\n\n if (!content.length && !reasoning_content.length) {\n return;\n }\n\n if (content.includes('```')) {\n this.inCodeBlock = !this.inCodeBlock;\n }\n\n if (content.includes('<think>') && !this.inCodeBlock) {\n this.inThinkBlock = true;\n } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {\n this.inThinkBlock = false;\n }\n\n this.lastToken = content;\n\n const message_id = this.getMessageId() ?? '';\n\n if (!message_id) {\n const initialContentType = this.inThinkBlock ? ContentTypes.THINK : ContentTypes.TEXT;\n const initialType = reasoning_content ? ContentTypes.THINK : initialContentType;\n const [stepId, message_id] = this.createMessageStep(initialType);\n this.dispatchRunStep(stepId, {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: {\n message_id,\n },\n });\n }\n\n if (reasoning_content) {\n this.handleContent(reasoning_content, ContentTypes.THINK);\n } else {\n this.handleContent(content, ContentTypes.TEXT);\n }\n }\n}"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "main": "./dist/cjs/main.cjs",
5
5
  "module": "./dist/esm/main.mjs",
6
6
  "types": "./dist/types/index.d.ts",
@@ -157,9 +157,9 @@ export class SplitStreamHandler {
157
157
  this.inCodeBlock = !this.inCodeBlock;
158
158
  }
159
159
 
160
- if (content === '<think>' && !this.inCodeBlock) {
160
+ if (content.includes('<think>') && !this.inCodeBlock) {
161
161
  this.inThinkBlock = true;
162
- } else if (this.lastToken === '</think>' && !this.inCodeBlock) {
162
+ } else if (this.lastToken.includes('</think>') && !this.inCodeBlock) {
163
163
  this.inThinkBlock = false;
164
164
  }
165
165