From 5a81d530457fab4807433182cf3c25cbcd458be8 Mon Sep 17 00:00:00 2001 From: "jinhui.li" Date: Tue, 25 Feb 2025 16:44:06 +0800 Subject: [PATCH] add server --- .gitignore | 1 + README.md | 29 +- index.mjs | 284 ++++++++++++ package-lock.json | 1001 +++++++++++++++++++++++++++++++++++++++++ package.json | 17 + screenshoots/demo.png | Bin 0 -> 53033 bytes 6 files changed, 1331 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 index.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 screenshoots/demo.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/README.md b/README.md index 0dc35fd..3bfeb8e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,33 @@ # Claude Code Reverse -> You can switch the API endpoint by modifying the ANTHROPIC_BASE_URL environment variable. +![demo.png](https://github.com/musistudio/claude-code-reverse/blob/main/screenshoots/demo.png) + +## Usage +1. Clone this repo +```shell +git clone git@github.com:musistudio/claude-code-reverse.git +``` + +2. Install dependencies +```shell +npm i +``` + +3. Change OpenAI apiKey and baseUrl in index.mjs file + +4. Start server +```shell +node index.mjs +``` + +5. Set environment variable +```shell +export DISABLE_PROMPT_CACHING=1 +export ANTHROPIC_BASE_URL="http://127.0.0.1:3456" +``` - Init Request + POST /v1/messages?beta=true ```json { @@ -30,6 +55,7 @@ POST /v1/messages?beta=true - Ask Request + POST /v1/messages?beta=true ```json { @@ -59,6 +85,7 @@ POST /v1/messages?beta=true - Ask Request 2 + POST /v1/messages?beta=true ```json { diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..65fd04d --- /dev/null +++ b/index.mjs @@ -0,0 +1,284 @@ +import express from "express"; +import { OpenAI } from "openai"; + +const app = express(); +const port = 3456; + +app.use(express.json()); + +const chatClient = new OpenAI({ + apiKey: "", + baseURL: "", +}); + +// Define POST /v1/messages interface +app.post("/v1/messages", async (req, res) => { + try { + let { + model, + max_tokens, + messages, + system = [], + temperature, + metadata, + tools, + } = req.body; + messages = messages.map((item) => { + if (item.content instanceof Array) { + return { + role: item.role, + content: item.content.map((it) => { + return { + type: ["tool_result", "tool_use"].includes(it?.type) + ? "text" + : it?.type, + text: it?.content || it?.text || "", + }; + }), + }; + } + return { + role: item.role, + content: item.content, + }; + }); + const data = { + model: "qwen-max-2025-01-25", + messages: [ + ...system.map((item) => ({ + role: "system", + content: item.text, + })), + ...messages, + ], + temperature, + stream: true, + }; + if (tools) { + data.tools = tools.map((item) => ({ + type: "function", + function: { + name: item.name, + description: item.description, + parameters: item.input_schema, + }, + })); + } + const completion = await chatClient.chat.completions.create(data); + + // Set SSE response headers + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache"); + res.setHeader("Connection", "keep-alive"); + + const messageId = "msg_" + Date.now(); + let contentBlockIndex = 0; + let currentContentBlocks = []; + + // Send message_start event + const messageStart = { + type: "message_start", + message: { + id: messageId, + type: "message", + role: "assistant", + content: [], + model, + stop_reason: null, + stop_sequence: null, + usage: { input_tokens: 1, output_tokens: 1 }, + }, + }; + res.write( + `event: message_start\ndata: ${JSON.stringify(messageStart)}\n\n` + ); + + let isToolUse = false; + let toolUseJson = ""; + let currentToolCall = null; + let hasStartedTextBlock = false; + + for await (const chunk of completion) { + const delta = chunk.choices[0].delta; + + // Handle tool call response + if (delta.tool_calls && delta.tool_calls.length > 0) { + const toolCall = delta.tool_calls[0]; + + if (!isToolUse) { + // Start new tool call block + isToolUse = true; + currentToolCall = toolCall; + + const toolBlockStart = { + type: "content_block_start", + index: contentBlockIndex, + content_block: { + type: "tool_use", + id: `toolu_${Date.now()}`, + name: toolCall.function.name, + input: {}, + }, + }; + + // Add to content blocks list + currentContentBlocks.push({ + type: "tool_use", + id: toolBlockStart.content_block.id, + name: toolCall.function.name, + input: {}, + }); + + res.write( + `event: content_block_start\ndata: ${JSON.stringify( + toolBlockStart + )}\n\n` + ); + toolUseJson = ""; + } + + // Stream tool call JSON + if (toolCall.function.arguments) { + const jsonDelta = { + type: "content_block_delta", + index: contentBlockIndex, + delta: { + type: "input_json_delta", + partial_json: toolCall.function.arguments, + }, + }; + + toolUseJson += toolCall.function.arguments; + + // Try to parse complete JSON and update content block + try { + const parsedJson = JSON.parse(toolUseJson); + currentContentBlocks[contentBlockIndex].input = parsedJson; + } catch (e) { + // JSON not yet complete, continue accumulating + } + + res.write( + `event: content_block_delta\ndata: ${JSON.stringify(jsonDelta)}\n\n` + ); + } + } else if (delta.content) { + // Handle regular text content + if (isToolUse) { + // End previous tool call block + const contentBlockStop = { + type: "content_block_stop", + index: contentBlockIndex, + }; + + res.write( + `event: content_block_stop\ndata: ${JSON.stringify( + contentBlockStop + )}\n\n` + ); + contentBlockIndex++; + isToolUse = false; + } + + if (!delta.content) continue; + + // If text block not yet started, send content_block_start + if (!hasStartedTextBlock) { + const textBlockStart = { + type: "content_block_start", + index: contentBlockIndex, + content_block: { + type: "text", + text: "", + }, + }; + + // Add to content blocks list + currentContentBlocks.push({ + type: "text", + text: "", + }); + + res.write( + `event: content_block_start\ndata: ${JSON.stringify( + textBlockStart + )}\n\n` + ); + hasStartedTextBlock = true; + } + + // Send regular text content + const contentDelta = { + type: "content_block_delta", + index: contentBlockIndex, + delta: { + type: "text_delta", + text: delta.content, + }, + }; + + // Update content block text + if (currentContentBlocks[contentBlockIndex]) { + currentContentBlocks[contentBlockIndex].text += delta.content; + } + + res.write( + `event: content_block_delta\ndata: ${JSON.stringify( + contentDelta + )}\n\n` + ); + } + } + + // Close last content block + const contentBlockStop = { + type: "content_block_stop", + index: contentBlockIndex, + }; + + res.write( + `event: content_block_stop\ndata: ${JSON.stringify( + contentBlockStop + )}\n\n` + ); + + // Send message_delta event with appropriate stop_reason + const messageDelta = { + type: "message_delta", + delta: { + stop_reason: isToolUse ? "tool_use" : "end_turn", + stop_sequence: null, + content: currentContentBlocks, + }, + usage: { input_tokens: 100, output_tokens: 150 }, + }; + + res.write( + `event: message_delta\ndata: ${JSON.stringify( + messageDelta + )}\n\n` + ); + + // Send message_stop event + const messageStop = { + type: "message_stop", + }; + + res.write( + `event: message_stop\ndata: ${JSON.stringify( + messageStop + )}\n\n` + ); + res.end(); + } catch (error) { + console.error("Error in streaming response:", error); + res.status(400).json({ + status: "error", + message: error.message, + }); + } +}); + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`); +}); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5b77d94 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1001 @@ +{ + "name": "claude-code-reverse", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "claude-code-reverse", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^4.21.2", + "openai": "^4.85.4" + } + }, + "node_modules/@types/node": { + "version": "18.19.76", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.76.tgz", + "integrity": "sha512-yvR7Q9LdPz2vGpmpJX5LolrgRdWvB67MJKDPSgIIzpFbaf9a1j/f5DnLp5VDyHGMR0QZHlTr1afsD87QCXFHKw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/openai": { + "version": "4.85.4", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.85.4.tgz", + "integrity": "sha512-Nki51PBSu+Aryo7WKbdXvfm0X/iKkQS2fq3O0Uqb/O3b4exOZFid2te1BZ52bbO5UwxQZ5eeHJDCTqtrJLPw0w==", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..abe04bf --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "claude-code-reverse", + "version": "1.0.0", + "description": "> You can switch the API endpoint by modifying the ANTHROPIC_BASE_URL environment variable.", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.21.2", + "openai": "^4.85.4" + } +} diff --git a/screenshoots/demo.png b/screenshoots/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea7a38b7477e51bac478d933336a3311fa284af GIT binary patch literal 53033 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
amY3n0>H|S@!!8W^<1Uv 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 literal 0 HcmV?d00001