From 8a24fbde3b59a4400192cd9d8abd948297e2944c Mon Sep 17 00:00:00 2001 From: Adrian Lopez Date: Wed, 25 Jun 2025 17:37:21 +0200 Subject: [PATCH 1/2] fix(formatters): safely access tools in request body formatter Avoid exception if tools are not defined. --- src/formatters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/formatters.ts b/src/formatters.ts index e08460b..72d16df 100644 --- a/src/formatters.ts +++ b/src/formatters.ts @@ -98,7 +98,7 @@ export function formatRequestBody({ if (cliOptions.tools === 'none') { return JSON.stringify(omit(parsed, 'tools'), null, 2); } else if (cliOptions.tools === 'name') { - const toolNames = parsed.tools.map( + const toolNames = parsed.tools?.map( (tool) => tool.name ?? tool?.function?.name, ); // only show tool names const output = { ...parsed, tools: toolNames }; From ff2c9a878be9eaec108639f8ed190128070e1c79 Mon Sep 17 00:00:00 2001 From: "Adrian Lopez (aider)" Date: Wed, 25 Jun 2025 17:43:47 +0200 Subject: [PATCH 2/2] feat: make package runnable with npx --- bin/llm-proxy.js | 3 +++ package-lock.json | 3 +++ package.json | 11 ++++++++++- src/formatters.ts | 7 +++---- 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100755 bin/llm-proxy.js diff --git a/bin/llm-proxy.js b/bin/llm-proxy.js new file mode 100755 index 0000000..bfa430a --- /dev/null +++ b/bin/llm-proxy.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node + +require('../dist/src/index'); diff --git a/package-lock.json b/package-lock.json index 2502237..727384d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,9 @@ "undici-types": "^6.20.0", "yargs": "^17.7.2" }, + "bin": { + "llm-proxy": "bin/llm-proxy.js" + }, "devDependencies": { "@types/express": "^5.0.0", "@types/jest": "^29.5.14", diff --git a/package.json b/package.json index 46740b7..96e6076 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,14 @@ }, "name": "llm-proxy", "version": "1.0.0", - "main": "index.js", + "main": "dist/src/index.js", + "bin": { + "llm-proxy": "bin/llm-proxy.js" + }, + "files": [ + "dist", + "bin" + ], "dependencies": { "axios": "^1.7.9", "express": "^4.21.2", @@ -29,6 +36,8 @@ "yargs": "^17.7.2" }, "scripts": { + "build": "tsc", + "prepare": "npm run build", "start": "ts-node --transpileOnly src/index.ts", "test": "jest", "lint": "eslint . --ext .ts", diff --git a/src/formatters.ts b/src/formatters.ts index 72d16df..4a3db18 100644 --- a/src/formatters.ts +++ b/src/formatters.ts @@ -4,7 +4,6 @@ import { omit } from 'lodash'; import OpenAI from 'openai'; import { URL } from 'url'; import { CliOptions } from './cli'; -import { ChatCompletionToolRunnerParams } from 'openai/lib/ChatCompletionRunner'; export function parseTargetUrl(targetUrlParam: string | undefined) { if (!targetUrlParam) { @@ -94,12 +93,12 @@ export function formatRequestBody({ try { const parsed = JSON.parse( requestData, - ) as ChatCompletionToolRunnerParams; + ) as OpenAI.Chat.ChatCompletionCreateParams; if (cliOptions.tools === 'none') { return JSON.stringify(omit(parsed, 'tools'), null, 2); } else if (cliOptions.tools === 'name') { - const toolNames = parsed.tools?.map( - (tool) => tool.name ?? tool?.function?.name, + const toolNames = parsed.tools?.map((tool) => + tool.type === 'function' ? tool.function.name : tool.type, ); // only show tool names const output = { ...parsed, tools: toolNames }; return JSON.stringify(output, null, 2);