Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

📅 feat: Add 2025 Roadmap Blog Post #242

Merged
merged 5 commits into from
Feb 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 48 additions & 13 deletions components/blog/BlogIndex.tsx
Original file line number Diff line number Diff line change
@@ -1,25 +1,61 @@
import React, { useEffect, useState } from 'react'
import { getPagesUnderRoute } from 'nextra/context'
import { Page } from 'nextra'
import type { Page } from 'nextra'
import BlogCard from './BlogCard'
import Select from 'react-select'
import { AuthorSmall } from '../Author/AuthorsSmall'

interface FrontMatter {
date: string
title: string
tags?: string[]
authorid?: string
}

type BlogPage = Page & {
frontMatter: FrontMatter
route: string
}

export const BlogIndex = ({ maxItems }: { maxItems?: number }) => {
const [selectedTags, setSelectedTags] = useState<string[]>([])

const [selectedAuthor, setSelectedAuthor] = useState<string | null>(null)
const [menuPortalTarget, setMenuPortalTarget] = useState<HTMLElement | null>(null)

const allPages = getPagesUnderRoute('/blog') as Array<Page & { frontMatter: any }>
const allPages = getPagesUnderRoute('/blog') as BlogPage[]

const allTags = Array.from(new Set(allPages.flatMap((page) => page.frontMatter.tags || []))).sort(
(a, b) => a.toLowerCase().localeCompare(b.toLowerCase()),
)
const allTags = Array.from(
new Set(
allPages
.flatMap((page) => page.frontMatter?.tags || [])
.filter((tag): tag is string => typeof tag === 'string' && tag.length > 0),
),
).sort((a, b) => {
if (typeof a === 'string' && typeof b === 'string') {
return a.toLowerCase().localeCompare(b.toLowerCase())
}
return 0
})

const allAuthors = Array.from(new Set(allPages.map((page) => page.frontMatter.authorid))).sort()
const allAuthors = Array.from(
new Set(
allPages
.map((page) => page.frontMatter?.authorid)
.filter((author): author is string => typeof author === 'string' && author.length > 0),
),
).sort((a, b) => {
if (typeof a === 'string' && typeof b === 'string') {
return a.localeCompare(b)
}
return 0
})

const sortedPages = allPages
.sort((a, b) => new Date(b.frontMatter.date).getTime() - new Date(a.frontMatter.date).getTime())
.sort((a, b) => {
const dateA = new Date(a.frontMatter?.date || 0).getTime()
const dateB = new Date(b.frontMatter?.date || 0).getTime()
return dateB - dateA
})
.slice(0, maxItems)

const handleTagClick = (tag: string) => {
Expand All @@ -31,23 +67,22 @@ export const BlogIndex = ({ maxItems }: { maxItems?: number }) => {
})
}

const handleAuthorClick = (author: string) => {
const handleAuthorClick = (author: string | null) => {
setSelectedAuthor(author === 'all' ? null : author)
}

const filteredPages = selectedTags.length
? sortedPages.filter(
(page) =>
page.frontMatter.tags && selectedTags.every((tag) => page.frontMatter.tags.includes(tag)),
page.frontMatter?.tags &&
selectedTags.every((tag) => page.frontMatter.tags?.includes(tag)),
)
: sortedPages

const finalFilteredPages = selectedAuthor
? filteredPages.filter((page) => page.frontMatter.authorid === selectedAuthor)
? filteredPages.filter((page) => page.frontMatter?.authorid === selectedAuthor)
: filteredPages

const [menuPortalTarget, setMenuPortalTarget] = useState(null)

useEffect(() => {
setMenuPortalTarget(document.body)
}, [])
Expand Down
7 changes: 6 additions & 1 deletion pages/api/subscribe.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import type { NextApiRequest, NextApiResponse } from 'next'
import validator from 'validator'
import dbConnect from '@/utils/dbConnect'
import Subscriber from '@/utils/Subscriber'

export default async function handler(req, res) {
type ResponseData = {
message: string
}

export default async function handler(req: NextApiRequest, res: NextApiResponse<ResponseData>) {
const { method, body } = req

if (method !== 'POST') {
Expand Down
169 changes: 169 additions & 0 deletions pages/blog/2025-02-20_2025_roadmap.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
---
title: LibreChat 2025 Roadmap
date: 2025/02/20
description: 'The 2025 roadmap for LibreChat: upcoming features, partnerships, and more.'
tags:
- update
- roadmap
- 2025
ogImage: /images/blog/2025-02-20_2025_roadmap.jpg
authorid: danny
---

import { BlogHeader } from '@/components/blog/BlogHeader'
import Discord from '@/components/icons/discord'
import Github from '@/components/icons/github'

<BlogHeader />

# LibreChat Turns 2! 🎉

I'm excited to announce that LibreChat is now officially 2 years old, making it the longest-running, active AI Chat UI! Since being the first major open-source offering following ChatGPT's release, we've come a long way and accomplished so much together.

## 2024 Achievements

Before diving into our plans for 2025, let's celebrate what we've accomplished in 2024:
- ✨ Started January 2024 with 4,000 GitHub Stars, now at 22,200+
- 📈 Reached Top 25 on GitHub Trending for All Languages over 15 times, including #1
- ⬇️ Over 3 million container registry pull downs
- 👐 Top-rated AI App for Digital Accessibility thanks to partnership with Harvard University
- 🏢 Leading Open-source AI Chat UI of choice for Large Orgs, Small Businesses, and Higher Education

**As well as key feature updates:**
- Agentic Tooling for all Supported Providers via [LibreChat Agents](https://www.librechat.ai/docs/features/agents)
- [Code Interpreter API](https://code.librechat.ai/pricing) for secure, sandboxed Execution in Python, Node.js (JS/TS), Go, C/C++, Java, PHP, Rust, Rscript, and Fortran
- Enhanced OpenAI Compatibility via [Custom Endpoints](https://www.librechat.ai/docs/quick_start/custom_endpoints), including Local LLM Integrations
- Artifacts for Generative UI (inspired by claude.ai)
- Improved Chat UI and Backend Optimizations
- Multiple Response Streaming (experimental)
- Speech-to-Text and Text-to-Speech
- In-line Text Commands for Prompts and Agent/Model switching
- [18next Internationalization Support](https://www.librechat.ai/blog/2025-02-13_translation)
- Local RAG for Extended File Support
- Temporary Chats

## The 2025 Roadmap

> Note: for all planned/proposed items as they are being worked on, other items, especially bug fixes, may be addressed as needed.
### Upcoming Features

These features will release within the next month, as part of v0.7.8 and/or v0.7.9, with some already in active development.

- Add ability to upload files as text:
- Similar to claude.ai, whatever can be parsed from the file as text goes straight into your prompt
- After upload, the file's text is treated as an attachment and can be "sourced," that is attached/detached, whenever needed in the conversation and/or agent, just as existing files
- Add ability to send files to provider ([#4616](https://github.com/danny-avila/LibreChat/issues/4616)):
- Google supports ["Video Understanding"](https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/video-understanding) & ["Document Understanding"](https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/document-understanding)
- Anthropic supports [PDFs](https://docs.anthropic.com/en/docs/build-with-claude/pdf-support)
- "Grounding" Google Search for Gemini models
- `librechat.yaml`: Specify vision models per provider or for all providers, as well as the default vision model ([#1634](https://github.com/danny-avila/LibreChat/issues/1634))
- `librechat.yaml`: Custom token rates for Endpoints ([#1633](https://github.com/danny-avila/LibreChat/issues/1633))
- `librechat.yaml`: Custom Welcome Message for Landing ([#2967](https://github.com/danny-avila/LibreChat/issues/2967))
- Chat UI Refresh, with streamlined features
- Modernized Landing Screen with Tool toggles for a simpler, starting chat UX
- Update Messages UI for a modern look/experience
- Experimental: Mixture-of-Agents
- Ability to create custom "Chain-of-thought" agents which leverage a ["Mixture-of-Agents"](https://arxiv.org/abs/2406.04692) to help optimize LLM performance and cost
- Note: This is upcoming as most of the work for this has already been prototyped, and simply requires UI/UX polish


Deadline: March 15th, 2025
### Focus Item: Admin Panel

Work on this year's focus item will start once the upcoming/short-term items are completed and/or nearing completion. This is a big project, where a lot of resources will go into in hopes of accelerating the release much sooner than the projected deadline.

The Admin panel will be a separate, optional app that acts as a Content Management System (CMS) for LibreChat, including management of usage, chats, users, settings, and access controls.

The core vision is to provide a Graphical User Interface for configuration/security related settings from the environment file, as well as providing all present/future [librechat.yaml](https://www.librechat.ai/docs/configuration/librechat_yaml) configurations an interface, while also extending the ability to apply these configurations at a role and even user level.

More details will be released as the project nears completion.

Deadline: June 6th, 2025
### Planned Items

Planned items are effectively on the docket based on community interest but without a current estimation/deadline. They are also **not** listed in any particular order, and may be completed at any point this year.

- OAuth Client Credentials Flow for Actions (Agents/Assistants)
- OAuth Authorization flow is already implemented.
- OpenAI-compatible API for LibreChat Agents
- Add [MCP Resources](https://modelcontextprotocol.io/docs/concepts/resources) for wider, ad-hoc data integrations
- Sources UI, to better understand what files/images are included in the active conversation
- Side Panel UI Refresh, for less obtrusion and more intuitiveness
- Dynamic prompt variables for Agent instructions ([#5007](https://github.com/danny-avila/LibreChat/issues/5007))
- User-specific memories ([#5494](https://github.com/danny-avila/LibreChat/issues/5494))
- Extension of Prompt Library features to Agent/Assistant Conversation Starters ([#5053](https://github.com/danny-avila/LibreChat/issues/5053))
- Favoriting and Custom Ordering of Prompt Library Entries ([#4875](https://github.com/danny-avila/LibreChat/issues/4875))
- Keyboard shortcuts for Quick-access/navigation ([#3664](https://github.com/danny-avila/LibreChat/issues/3664))
- Enhancing Artifacts to support markdown/notes, similar to ChatGPT's canvas ([#3995](https://github.com/danny-avila/LibreChat/issues/3995))
- Extending Artfiacts code-editing to also support the LibreChat Code Interpreter API, in order to execute Python, Rust, Go, C++, and more, as artifacts
- Human-in-the-loop for tool usage (allow user to approve a tool when used) ([#5580](https://github.com/danny-avila/LibreChat/issues/5580))
- Creation of teams, groups, workspaces ([#4730](https://github.com/danny-avila/LibreChat/issues/4730))
- Deep research tool
- Better search integration, including UI elements for sources/citations ([#4615](https://github.com/danny-avila/LibreChat/issues/4615))
- Chat rating for feedback ([#901](https://github.com/danny-avila/LibreChat/issues/901))
- Info/metadata for individual messages and conversations ([#1241](https://github.com/danny-avila/LibreChat/issues/1241), [#1215](https://github.com/danny-avila/LibreChat/issues/1215), [#5199](https://github.com/danny-avila/LibreChat/issues/5199))
- Includes projected cost, timestamp, etc.
- Scheduled Tasks (Agent workflows)
- OpenAI Realtime audio + Gemini Multimodal support ([#4382](https://github.com/danny-avila/LibreChat/issues/4382))
- User-provided API Keys for Tools + RAG API ([#4758](https://github.com/danny-avila/LibreChat/issues/4758))
- If `user_provided` API KEY value is used, fetch models for user ([#1028](https://github.com/danny-avila/LibreChat/issues/1028))
- Conversation/file retention settings ([#2365](https://github.com/danny-avila/LibreChat/issues/2365))
- Conversation/message limits per user ([#3058](https://github.com/danny-avila/LibreChat/issues/3058))
- File storage limits per user ([#3057](https://github.com/danny-avila/LibreChat/issues/3057))
- Organize chats into folders/projects ([#4848](https://github.com/danny-avila/LibreChat/issues/4848))
- Allow Title Endpoint/Models to be used for different Endpoints ([#3321](https://github.com/danny-avila/LibreChat/issues/3321))
- Setting to Display the model name in the conversation ([#3203](https://github.com/danny-avila/LibreChat/issues/3203))
- Allow import/export function for all chats ([#3768](https://github.com/danny-avila/LibreChat/issues/3768))
- S3 and S3-like File Storage support ([#2898](https://github.com/danny-avila/LibreChat/issues/2898))
- Send messages that contain only images ([#3157](https://github.com/danny-avila/LibreChat/issues/3157))
### Partnerships

Besides the awesome contributions from the open-source community, LibreChat will have some help developing this year!

A strategic partnership will enlist developers to contribute the following to open-source this year:

- RAG API Optimizations and Improvements, for higher quality semantic search
- An Agent Marketplace UI, functionally similar to https://chatgpt.com/gpts but for LibreChat Agents
- Better/more granular access controls for Agent Sharing

The core LC team will help lead these improvements but will not be as involved in early/prototype stages, allowing more time for planned items.

There are other partnerships still in the works, so stay tuned!

### Beyond the Core Project

Here are some items that are also planned this year, but less involved with the core project.

- LC Code Interpreter API - Pay-as-you-go Pricing, ETA TBD.
- Fully hosted, public LibreChat offering, likely launching Q3.

### Proposed Items

Additional items that were not mentioned--whether already proposed or suggested in the future by the community, in both our [Discussions](https://github.com/danny-avila/LibreChat/discussions/categories/feature-requests-suggestions) and [Issues](https://github.com/danny-avila/LibreChat/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22%E2%9C%A8%20enhancement%22) pages--will continue to be reviewed and may be implemented based on demand and contributions. The best way to support one of these items is to leave a reaction on their appropriate page (all of them will be programmatically tallied for a thorough analysis), as well as mention them in the dedicated Roadmap threads linked below.


### Conclusion

Thank you all for using and improving LibreChat. I'm very optimistic about 2025 being our biggest year of updates, new features, and improvements.

Please share your thoughts in the dedicated discussion threads, we've love to hear feedback and suggestions!

<Cards>
<Cards.Card
title="GitHub Roadmap Discussion"
href="https://github.com/danny-avila/LibreChat/discussions/5960"
target="_blank"
icon={<Github />}
/>
<Cards.Card
title="Discord Roadmap Discussion"
href="https://discord.com/channels/1086345563026489514/1342217637748408392"
target="_blank"
icon={<Discord />}
/>
</Cards>

<Callout type="info" title="Note">
This roadmap is subject to change based on community feedback and contributions. Items may be
implemented sooner or later than projected based on demand and resources.
</Callout>
Binary file added public/images/blog/2025-02-20_2025_roadmap.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"**/*.ts",
"**/*.tsx",
"**/*.mdx",
"utils/Subscriber.js",
"utils/Subscriber.ts",
"utils/dbConnect.js",
"pages/api/subscribe.js",
"components/NewsletterForm.js",
Expand Down
18 changes: 0 additions & 18 deletions utils/Subscriber.js

This file was deleted.

24 changes: 24 additions & 0 deletions utils/Subscriber.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import mongoose, { Schema, Model, Document } from 'mongoose'

interface ISubscriber extends Document {
email: string
status: string
}

const SubscriberSchema = new Schema({
email: {
type: String,
lowercase: true,
required: true,
unique: true,
},
status: {
type: String,
default: 'subscribed',
},
})

const Subscriber: Model<ISubscriber> =
mongoose.models.Subscriber || mongoose.model<ISubscriber>('Subscriber', SubscriberSchema)

export default Subscriber
Loading