mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-19 18:00:15 +01:00
* feat: bare bones implementation of claude client (WIP) * feat: client implementation of Claude (WIP) * fix: add claude to store * feat: bare bones implementation of claude client (WIP) * switch eventsource * Try new method of calling claude with anthropic sdk * (WIP) Finish initial claude client implementation and api * debugging update * fix(ClaudeClient.js): fix prompt prefixes for HUMAN_PROMPT and AI_PROMPT fix(ClaudeClient.js): refactor buildMessages logic for correct handling of messages refactor(ClaudeClient.js): refactor buildPrompt method to buildMessages for use in BaseClient sendMessage method refactor(ClaudeClient.js): refactor getCompletion method to sendCompletion for use in BaseClient sendMessage method refactor(ClaudeClient.js): omit getMessageMapMethod method for future refactoring refactor(ClaudeClient.js): remove unused sendMessage method to prefer BaseClient message fix(askClaude.js): error in getIds method was causing a frontend crash, userMessage was not defined fix(askClaude.js): import abortMessage function from utils module feat(askClaude.js): add /abort route to handle message abort requests feat(askClaude.js): create abortControllers map to store abort controllers feat(askClaude.js): implement abortAsk function to handle message abort logic feat(askClaude.js): add onStart callback to handle message start logic feat(HoverButtons.jsx): add 'claude' as a supported endpoint for branching * fix(ClaudeClient.js): update defaultPrefix and promptPrefix messages includes 'Remember your instructions' as Claude is trained to recognize labels preceding colons as participants of a conversation * Change name from claude to anthropic * add settings to handleSubmit and models to endpoints * Implement Claude settings * use svg for anthropic icon * Implement abort * Implement reverse proxy * remove png icons * replace web browser plugin * remove default prefix * fix styling of claude icon * fix console error from svg properties * remove single quote requirement from eslintrc * fix(AnthropicClient.js): fix labels for HUMAN_PROMPT and AI_PROMPT feat(AnthropicClient.js): add support for custom userLabel and modelLabel options feat(AnthropicClient.js): add user_id metadata to requestOptions in getCompletion method feat(anthropic, AnthropicClient.js): add debug logging * refactor(AnthropicClient.js): change promptSuffix variable declaration from let to const * fix(EndpointOptionsDialog.jsx): remove unnecessary code that changes endpointName from 'anthropic' to 'Claude' fix(utils/index.jsx): fix alternateName value for 'anthropic' from 'Claude' to 'Anthropic' * fix(AnthropicIcon): fix sizing/rendering/name of anthropic icon * fix(AnthropicClient.js): change maxContextTokens default value to 99999 fix(AnthropicClient.js): change maxResponseTokens default value to 1500 fix(AnthropicClient.js): remove unnecessary code for setting maxContextTokens and maxResponseTokens based on modelOptions fix(AnthropicClient.js): change max_tokens_to_sample default value to 1500 fix(anthropic.js): pass endpointOption.token to AnthropicClient constructor * Update .env.example * fix(AnthropicClient.js): remove exceeding message when it puts us over the token limit fix(AnthropicClient.js): handle case when the first message exceeds the token limit fix(AnthropicClient.js): throw error when prompt is too long fix(AnthropicClient.js): adjust max tokens calculation to use maxOutputTokens fix(anthropic.js): remove console.log statement in ask route * feat(server/index): increase incoming json payload allowed size --------- Co-authored-by: Danny Avila <messagedaniel@protonmail.com>
107 lines
3.5 KiB
JavaScript
107 lines
3.5 KiB
JavaScript
const express = require('express');
|
|
const session = require('express-session');
|
|
const connectDb = require('../lib/db/connectDb');
|
|
const migrateDb = require('../lib/db/migrateDb');
|
|
const indexSync = require('../lib/db/indexSync');
|
|
const path = require('path');
|
|
const cors = require('cors');
|
|
const routes = require('./routes');
|
|
const errorController = require('./controllers/ErrorController');
|
|
const passport = require('passport');
|
|
const port = process.env.PORT || 3080;
|
|
const host = process.env.HOST || 'localhost';
|
|
const projectPath = path.join(__dirname, '..', '..', 'client');
|
|
|
|
// Init the config and validate it
|
|
const config = require('../../config/loader');
|
|
config.validate(); // Validate the config
|
|
|
|
(async () => {
|
|
await connectDb();
|
|
console.log('Connected to MongoDB');
|
|
await migrateDb();
|
|
await indexSync();
|
|
|
|
const app = express();
|
|
app.use(errorController);
|
|
app.use(express.json({ limit: '3mb' }));
|
|
app.use(express.urlencoded({ extended: true, limit: '3mb' }));
|
|
app.use(express.static(path.join(projectPath, 'dist')));
|
|
app.use(express.static(path.join(projectPath, 'public')));
|
|
|
|
app.set('trust proxy', 1); // trust first proxy
|
|
app.use(cors());
|
|
|
|
// OAUTH
|
|
app.use(passport.initialize());
|
|
require('../strategies/jwtStrategy');
|
|
require('../strategies/localStrategy');
|
|
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
|
require('../strategies/googleStrategy');
|
|
}
|
|
if (process.env.FACEBOOK_CLIENT_ID && process.env.FACEBOOK_CLIENT_SECRET) {
|
|
require('../strategies/facebookStrategy');
|
|
}
|
|
if (process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET) {
|
|
require('../strategies/githubStrategy');
|
|
}
|
|
if (process.env.DISCORD_CLIENT_ID && process.env.DISCORD_CLIENT_SECRET) {
|
|
require('../strategies/discordStrategy');
|
|
}
|
|
if (process.env.OPENID_CLIENT_ID && process.env.OPENID_CLIENT_SECRET &&
|
|
process.env.OPENID_ISSUER && process.env.OPENID_SCOPE &&
|
|
process.env.OPENID_SESSION_SECRET) {
|
|
app.use(session({
|
|
secret: process.env.OPENID_SESSION_SECRET,
|
|
resave: false,
|
|
saveUninitialized: false
|
|
}));
|
|
app.use(passport.session());
|
|
require('../strategies/openidStrategy');
|
|
}
|
|
app.use('/oauth', routes.oauth);
|
|
// api endpoint
|
|
app.use('/api/auth', routes.auth);
|
|
app.use('/api/user', routes.user);
|
|
app.use('/api/search', routes.search);
|
|
app.use('/api/ask', routes.ask);
|
|
app.use('/api/messages', routes.messages);
|
|
app.use('/api/convos', routes.convos);
|
|
app.use('/api/presets', routes.presets);
|
|
app.use('/api/prompts', routes.prompts);
|
|
app.use('/api/tokenizer', routes.tokenizer);
|
|
app.use('/api/endpoints', routes.endpoints);
|
|
app.use('/api/plugins', routes.plugins);
|
|
app.use('/api/config', routes.config);
|
|
|
|
// static files
|
|
app.get('/*', function (req, res) {
|
|
res.sendFile(path.join(projectPath, 'dist', 'index.html'));
|
|
});
|
|
|
|
app.listen(port, host, () => {
|
|
if (host == '0.0.0.0')
|
|
console.log(
|
|
`Server listening on all interface at port ${port}. Use http://localhost:${port} to access it`
|
|
);
|
|
else
|
|
console.log(`Server listening at http://${host == '0.0.0.0' ? 'localhost' : host}:${port}`);
|
|
});
|
|
})();
|
|
|
|
let messageCount = 0;
|
|
process.on('uncaughtException', (err) => {
|
|
if (!err.message.includes('fetch failed')) {
|
|
console.error('There was an uncaught error:');
|
|
console.error(err);
|
|
}
|
|
|
|
if (err.message.includes('fetch failed')) {
|
|
if (messageCount === 0) {
|
|
console.error('Meilisearch error, search will be disabled');
|
|
messageCount++;
|
|
}
|
|
} else {
|
|
process.exit(1);
|
|
}
|
|
});
|