From 058dbf2d4adc35a1a62288bec2d8626c92556b0c Mon Sep 17 00:00:00 2001 From: Thyrst Date: Thu, 21 Nov 2024 21:38:14 +0100 Subject: [PATCH 1/2] helpers for orchestration variables --- CHANGELOG.md | 4 ++++ package.json | 2 +- src/handlebars-helpers.ts | 41 +++++++++++++++++++++++++++++++++++++++ src/template.ts | 10 +++++++++- 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27d68e8..3745d18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.13.8 + +- New Handlebars helpers: last, toJSON, formatMessage (more variants) + ## 0.13.7 - Fix react peerDependency version syntax #73 diff --git a/package.json b/package.json index 36a21c6..ff7be61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "langtail", - "version": "0.13.7", + "version": "0.13.8", "description": "", "main": "./Langtail.js", "packageManager": "pnpm@8.15.6", diff --git a/src/handlebars-helpers.ts b/src/handlebars-helpers.ts index b257784..30ce024 100644 --- a/src/handlebars-helpers.ts +++ b/src/handlebars-helpers.ts @@ -1,5 +1,6 @@ import type handlebars from "@langtail/handlebars-evalless" import { format, parseISO } from "date-fns" +import { Message } from "./schemas" const isObject = function (val: any) { return typeof val === "object" @@ -68,3 +69,43 @@ export const operatorHelpers: handlebars.HelperDeclareSpec = { return Array.prototype.slice.call(arguments, 0, -1).some(Boolean) }, } + +const formatMessage = (message: Message, includeToolCalls: boolean): string => { + if (!message) return ''; + + let result = `[${message.role}] `; + + if (message.content) { + result += message.content; + } + + if (includeToolCalls && message.tool_calls?.length) { + result += '\nTool Calls:'; + for (const tool of message.tool_calls) { + result += `\n - ${tool.function.name}(${tool.function.arguments})`; + } + } + + return result; +}; + +const formatMessages = (messages: Message[], includeToolCalls: boolean): string => { + if (!Array.isArray(messages)) return ''; + return messages.map((m) => formatMessage(m, includeToolCalls)).join('\n\n'); +}; + +export const variableHelpers: handlebars.HelperDeclareSpec = { + toJSON: function (context) { + return JSON.stringify(context, null, 2); + }, + last: function (array) { + if (Array.isArray(array) && array.length > 0) { + return array[array.length - 1]; + } + return null; + }, + formatMessage: (message: Message) => formatMessage(message, false), + formatMessages: (messages: Message[]) => formatMessages(messages, false), + formatMessageWithToolCalls: (message: Message) => formatMessage(message, true), + formatMessagesWithToolCalls: (messages: Message[]) => formatMessages(messages, true), +} diff --git a/src/template.ts b/src/template.ts index a79594a..65d00e3 100644 --- a/src/template.ts +++ b/src/template.ts @@ -1,6 +1,6 @@ import handlebarsEvalless from "@langtail/handlebars-evalless" -import { handlebarsDateHelper, operatorHelpers } from "./handlebars-helpers" +import { handlebarsDateHelper, operatorHelpers, variableHelpers } from "./handlebars-helpers" import { JSONValue } from "./jsonType" import { ContentArray } from "./schemas" @@ -8,6 +8,14 @@ const handlebars = handlebarsEvalless.default ?? handlebarsEvalless handlebars.registerHelper("$date", handlebarsDateHelper) handlebars.registerHelper(operatorHelpers) +handlebars.registerHelper(variableHelpers) + +export const LANGTAIL_HELPERS = [ + "$date", + ...Object.keys(operatorHelpers), + ...Object.keys(variableHelpers), +] + const Visitor = handlebars.Visitor /* From 059b49215be15c3262f66b416329ebf00339b0ee Mon Sep 17 00:00:00 2001 From: Thyrst Date: Fri, 22 Nov 2024 15:20:45 +0100 Subject: [PATCH 2/2] fix paginationParamsToQuery location --- CHANGELOG.md | 4 ++++ package.json | 2 +- src/LangtailMessages.ts | 2 +- src/LangtailThreads.ts | 2 +- src/bin/utils.ts | 11 ----------- src/utils.ts | 10 ++++++++++ 6 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 src/utils.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 3745d18..2ccf93c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.13.9 + +- Fix for browser runtime + ## 0.13.8 - New Handlebars helpers: last, toJSON, formatMessage (more variants) diff --git a/package.json b/package.json index ff7be61..e509b0d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "langtail", - "version": "0.13.8", + "version": "0.13.9", "description": "", "main": "./Langtail.js", "packageManager": "pnpm@8.15.6", diff --git a/src/LangtailMessages.ts b/src/LangtailMessages.ts index cd85552..709105d 100644 --- a/src/LangtailMessages.ts +++ b/src/LangtailMessages.ts @@ -1,7 +1,7 @@ import { assistantMessageListResponseSchema, assistantMessageSchema, deleteEntitySchema } from "./schemas" import { IFetcher, LangtailThreadsOptions, PaginationOptions, PublicAPI } from './types'; -import { paginationParamsToQuery } from "./bin/utils"; +import { paginationParamsToQuery } from "./utils"; export type ILangtailMessages = PublicAPI diff --git a/src/LangtailThreads.ts b/src/LangtailThreads.ts index 7e08c3a..ab8e70a 100644 --- a/src/LangtailThreads.ts +++ b/src/LangtailThreads.ts @@ -1,7 +1,7 @@ import { deleteEntitySchema, ThreadCreate, threadListResponseSchema, threadSchema } from "./schemas" import { ILangtailMessages, LangtailMessages } from "./LangtailMessages"; import { IFetcher, LangtailThreadsOptions, PaginationOptions, PublicAPI } from "./types"; -import { paginationParamsToQuery } from "./bin/utils"; +import { paginationParamsToQuery } from "./utils"; export type ILangtailThreads = PublicAPI diff --git a/src/bin/utils.ts b/src/bin/utils.ts index 2a18722..5adbcb0 100644 --- a/src/bin/utils.ts +++ b/src/bin/utils.ts @@ -60,14 +60,3 @@ export const dirExists = (dir: string): boolean => { return false; } } - -export const paginationParamsToQuery = (paginationOptions: { after?: string, limit?: number }): string => { - if (Object.values(paginationOptions ?? {}).every(value => value === undefined)) { - return ''; - } - - return `?${Object.entries(paginationOptions).reduce((params: URLSearchParams, [key, value]) => { - params.set(key, String(value)) - return params - }, new URLSearchParams()).toString()}` -} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..3e30cc1 --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,10 @@ +export const paginationParamsToQuery = (paginationOptions: { after?: string, limit?: number }): string => { + if (Object.values(paginationOptions ?? {}).every(value => value === undefined)) { + return ''; + } + + return `?${Object.entries(paginationOptions).reduce((params: URLSearchParams, [key, value]) => { + params.set(key, String(value)) + return params + }, new URLSearchParams()).toString()}` +} \ No newline at end of file