fixes google ai language filter and updates readme
This commit is contained in:
parent
c4a633a5d6
commit
0bbdc0b841
59
README.md
59
README.md
|
@ -1,14 +1,20 @@
|
||||||
# OAI Reverse Proxy
|
# OAI Reverse Proxy
|
||||||
|
|
||||||
Reverse proxy server for various LLM APIs.
|
Reverse proxy server for various LLM APIs.
|
||||||
|
|
||||||
### Table of Contents
|
### Table of Contents
|
||||||
- [What is this?](#what-is-this)
|
<!-- TOC -->
|
||||||
- [Features](#features)
|
* [OAI Reverse Proxy](#oai-reverse-proxy)
|
||||||
- [Usage Instructions](#usage-instructions)
|
* [Table of Contents](#table-of-contents)
|
||||||
- [Self-hosting](#self-hosting)
|
* [What is this?](#what-is-this)
|
||||||
- [Huggingface (outdated, not advised)](#huggingface-outdated-not-advised)
|
* [Features](#features)
|
||||||
- [Local Development](#local-development)
|
* [Usage Instructions](#usage-instructions)
|
||||||
|
* [Personal Use (single-user)](#personal-use-single-user)
|
||||||
|
* [Updating](#updating)
|
||||||
|
* [Local Development](#local-development)
|
||||||
|
* [Self-hosting](#self-hosting)
|
||||||
|
* [Building](#building)
|
||||||
|
* [Forking](#forking)
|
||||||
|
<!-- TOC -->
|
||||||
|
|
||||||
## What is this?
|
## What is this?
|
||||||
This project allows you to run a reverse proxy server for various LLM APIs.
|
This project allows you to run a reverse proxy server for various LLM APIs.
|
||||||
|
@ -27,37 +33,42 @@ This project allows you to run a reverse proxy server for various LLM APIs.
|
||||||
- [x] Simple role-based permissions
|
- [x] Simple role-based permissions
|
||||||
- [x] Per-model token quotas
|
- [x] Per-model token quotas
|
||||||
- [x] Temporary user accounts
|
- [x] Temporary user accounts
|
||||||
- [x] Prompt and completion logging
|
- [x] Event audit logging
|
||||||
|
- [x] Optional full logging of prompts and completions
|
||||||
- [x] Abuse detection and prevention
|
- [x] Abuse detection and prevention
|
||||||
|
- [x] IP address and user token model invocation rate limits
|
||||||
|
- [x] IP blacklists
|
||||||
|
- [x] Proof-of-work challenge for access by anonymous users
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Usage Instructions
|
## Usage Instructions
|
||||||
If you'd like to run your own instance of this server, you'll need to deploy it somewhere and configure it with your API keys. A few easy options are provided below, though you can also deploy it to any other service you'd like if you know what you're doing and the service supports Node.js.
|
If you'd like to run your own instance of this server, you'll need to deploy it somewhere and configure it with your API keys. A few easy options are provided below, though you can also deploy it to any other service you'd like if you know what you're doing and the service supports Node.js.
|
||||||
|
|
||||||
|
### Personal Use (single-user)
|
||||||
|
If you just want to run the proxy server to use yourself without hosting it for others:
|
||||||
|
1. Install [Node.js](https://nodejs.org/en/download/) >= 18.0.0
|
||||||
|
2. Clone this repository
|
||||||
|
3. Create a `.env` file in the root of the project and add your API keys. See the [.env.example](./.env.example) file for an example.
|
||||||
|
4. Install dependencies with `npm install`
|
||||||
|
5. Run `npm run build`
|
||||||
|
6. Run `npm start`
|
||||||
|
|
||||||
|
#### Updating
|
||||||
|
You must re-run `npm install` and `npm run build` whenever you pull new changes from the repository.
|
||||||
|
|
||||||
|
#### Local Development
|
||||||
|
Use `npm run start:dev` to run the proxy in development mode with watch mode enabled. Use `npm run type-check` to run the type checker across the project.
|
||||||
|
|
||||||
### Self-hosting
|
### Self-hosting
|
||||||
[See here for instructions on how to self-host the application on your own VPS or local machine.](./docs/self-hosting.md)
|
[See here for instructions on how to self-host the application on your own VPS or local machine and expose it to the internet for others to use.](./docs/self-hosting.md)
|
||||||
|
|
||||||
**Ensure you set the `TRUSTED_PROXIES` environment variable according to your deployment.** Refer to [.env.example](./.env.example) and [config.ts](./src/config.ts) for more information.
|
**Ensure you set the `TRUSTED_PROXIES` environment variable according to your deployment.** Refer to [.env.example](./.env.example) and [config.ts](./src/config.ts) for more information.
|
||||||
|
|
||||||
### Huggingface (outdated, not advised)
|
|
||||||
[See here for instructions on how to deploy to a Huggingface Space.](./docs/deploy-huggingface.md)
|
|
||||||
|
|
||||||
## Local Development
|
|
||||||
To run the proxy locally for development or testing, install Node.js >= 18.0.0 and follow the steps below.
|
|
||||||
|
|
||||||
1. Clone the repo
|
|
||||||
2. Install dependencies with `npm install`
|
|
||||||
3. Create a `.env` file in the root of the project and add your API keys. See the [.env.example](./.env.example) file for an example.
|
|
||||||
4. Start the server in development mode with `npm run start:dev`.
|
|
||||||
|
|
||||||
You can also use `npm run start:dev:tsc` to enable project-wide type checking at the cost of slower startup times. `npm run type-check` can be used to run type checking without starting the server.
|
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
To build the project, run `npm run build`. This will compile the TypeScript code to JavaScript and output it to the `build` directory.
|
To build the project, run `npm run build`. This will compile the TypeScript code to JavaScript and output it to the `build` directory. You should run this whenever you pull new changes from the repository.
|
||||||
|
|
||||||
Note that if you are trying to build the server on a very memory-constrained (<= 1GB) VPS, you may need to run the build with `NODE_OPTIONS=--max_old_space_size=2048 npm run build` to avoid running out of memory during the build process, assuming you have swap enabled. The application itself should run fine on a 512MB VPS for most reasonable traffic levels.
|
Note that if you are trying to build the server on a very memory-constrained (<= 1GB) VPS, you may need to run the build with `NODE_OPTIONS=--max_old_space_size=2048 npm run build` to avoid running out of memory during the build process, assuming you have swap enabled. The application itself should run fine on a 512MB VPS for most reasonable traffic levels.
|
||||||
|
|
||||||
## Forking
|
## Forking
|
||||||
|
|
||||||
If you are forking the repository on GitGud, you may wish to disable GitLab CI/CD or you will be spammed with emails about failed builds due not having any CI runners. You can do this by going to *Settings > General > Visibility, project features, permissions* and then disabling the "CI/CD" feature.
|
If you are forking the repository on GitGud, you may wish to disable GitLab CI/CD or you will be spammed with emails about failed builds due not having any CI runners. You can do this by going to *Settings > General > Visibility, project features, permissions* and then disabling the "CI/CD" feature.
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
"start": "node --trace-deprecation --trace-warnings build/server.js",
|
"start": "node --trace-deprecation --trace-warnings build/server.js",
|
||||||
"start:dev": "nodemon --watch src --exec ts-node --transpile-only src/server.ts",
|
"start:dev": "nodemon --watch src --exec ts-node --transpile-only src/server.ts",
|
||||||
"start:debug": "ts-node --inspect --transpile-only src/server.ts",
|
"start:debug": "ts-node --inspect --transpile-only src/server.ts",
|
||||||
"start:replit": "tsc && node build/server.js",
|
|
||||||
"start:watch": "nodemon --require source-map-support/register build/server.js",
|
"start:watch": "nodemon --require source-map-support/register build/server.js",
|
||||||
"type-check": "tsc --noEmit"
|
"type-check": "tsc --noEmit"
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { Request } from "express";
|
import { Request } from "express";
|
||||||
|
import { z } from "zod";
|
||||||
import { config } from "../../../../config";
|
import { config } from "../../../../config";
|
||||||
import { assertNever } from "../../../../shared/utils";
|
import { assertNever } from "../../../../shared/utils";
|
||||||
import { RequestPreprocessor } from "../index";
|
import { RequestPreprocessor } from "../index";
|
||||||
|
@ -8,6 +9,7 @@ import {
|
||||||
OpenAIChatMessage,
|
OpenAIChatMessage,
|
||||||
flattenAnthropicMessages,
|
flattenAnthropicMessages,
|
||||||
} from "../../../../shared/api-schemas";
|
} from "../../../../shared/api-schemas";
|
||||||
|
import { GoogleAIV1GenerateContentSchema } from "../../../../shared/api-schemas/google-ai";
|
||||||
|
|
||||||
const rejectedClients = new Map<string, number>();
|
const rejectedClients = new Map<string, number>();
|
||||||
|
|
||||||
|
@ -50,6 +52,10 @@ export const languageFilter: RequestPreprocessor = async (req) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO: this is not type safe and does not raise errors if request body zod schema
|
||||||
|
is changed.
|
||||||
|
*/
|
||||||
function getPromptFromRequest(req: Request) {
|
function getPromptFromRequest(req: Request) {
|
||||||
const service = req.outboundApi;
|
const service = req.outboundApi;
|
||||||
const body = req.body;
|
const body = req.body;
|
||||||
|
@ -75,8 +81,13 @@ function getPromptFromRequest(req: Request) {
|
||||||
case "openai-image":
|
case "openai-image":
|
||||||
case "mistral-text":
|
case "mistral-text":
|
||||||
return body.prompt;
|
return body.prompt;
|
||||||
case "google-ai":
|
case "google-ai": {
|
||||||
return body.prompt.text;
|
const b = body as z.infer<typeof GoogleAIV1GenerateContentSchema>;
|
||||||
|
return [
|
||||||
|
b.systemInstruction?.parts.map((p) => p.text),
|
||||||
|
...b.contents.flatMap((c) => c.parts.map((p) => p.text)),
|
||||||
|
].join("\n");
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
assertNever(service);
|
assertNever(service);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue