mirror of
https://github.com/LibreChat-AI/librechat.ai.git
synced 2026-03-27 02:38:32 +07:00
rel/v0.8.3-rc1-v2 (#504)
* chore: update GitHub Actions workflow to use latest action version for improved stability * chore: update roadmap references and enhance documentation for AWS Bedrock inference profiles - Updated footer menu and card icons to reflect the 2026 roadmap. - Adjusted default values in changelog and configuration documentation for `maxRecursionLimit`. - Added comprehensive documentation for AWS Bedrock inference profiles, including setup, configuration, and examples. - Introduced Agents API documentation for programmatic access to LibreChat agents. - Enhanced existing documentation for clarity and consistency across various sections. * feat: release Config v1.3.4 with new features and updates - Introduced `create` field in `interface.prompts` and `interface.agents` for enhanced user control. - Added `interface.remoteAgents` configuration for managing remote agent permissions. - Updated `endpoints.bedrock` with `models` and `inferenceProfiles` for better customization. - Included Moonshot as a known endpoint for AI integration. - Introduced new agent capabilities: `deferred_tools` and `programmatic_tools`. - Removed deprecated `forcePrompt` setting from configurations. - Updated default model lists and added support for new models. - Enhanced `modelSpecs` with `artifacts` field and `effort` parameter for Anthropic models. * refactor: update BlogHeader to use usePathname for route handling - Replaced useRouter with usePathname for improved routing in BlogHeader component. - Simplified page retrieval logic by directly using pathname for matching routes. * feat: add changelog for v0.8.3-rc1 release with new features and fixes - Introduced several enhancements including event-driven lazy tool loading, token usage tracking, and programmatic tool calling UI. - Added support for new models and providers, including Claude Opus 4.6 and Moonshot. - Implemented various bug fixes and improvements for better user experience and performance. * chore: nextjs artifact * first draft roadmap * feat: enhance BlogPage with Open Graph image support and layout improvements - Added support for Open Graph images in blog entries to improve visual presentation. - Refactored article layout for better structure and readability, including adjustments to the display of metadata and content. - Updated styles for improved user experience during hover interactions. * feat: enhance BlogPage with date formatting and layout adjustments - Added a new dateFormatted field to entries for improved date display. - Implemented a date formatter for consistent date presentation. - Refactored article layout to use a grid system for better responsiveness. - Updated styles for article links and metadata for enhanced user experience. * feat: add responsive image sizes to BlogPage for improved layout - Included sizes attribute for Open Graph images to enhance responsiveness on different screen sizes. * feat: update feature titles and descriptions for clarity - Changed titles for "Forking Messages and Conversations" to "Forking Chats" and "Memory" to "User Memory" for better alignment with functionality. - Updated descriptions for "Message Search" and "Upload as Text" to enhance understanding of features. * chore: update configuration version to 1.3.4 across multiple documentation files - Updated the version number in `librechat.yaml` examples to reflect the latest release (1.3.4) in various configuration and feature documentation files. * feat: enhance User Memory documentation for clarity and detail - Updated the description to clarify that User Memory is a key/value store that operates on every chat request. - Added a callout to distinguish between key/value storage and conversation memory. - Expanded on the functionality of the memory agent, including its execution process and user control features. - Introduced a section on future improvements for the memory agent's efficiency and relevance. * feat: update title and description for NGINX documentation - Changed the title from "Secure Deployment with Nginx" to "NGINX" for brevity. - Updated the description to provide a clearer overview of the guide's purpose in securing LibreChat deployment with Nginx as a reverse proxy and HTTPS. * feat: update 2026 roadmap with key accomplishments and future plans - Celebrated LibreChat's 3rd anniversary with a summary of achievements from 2025, including growth in GitHub stars and community engagement. - Clarified the timeline for open-sourcing the Code Interpreter API by the end of Q1. - Revised notes on the v1 Admin Panel's core capabilities and community-driven items for better clarity and detail. * feat: enhance blog and author components with Open Graph image support - Added optional `ogImagePosition` field to blog entries for better image placement control. - Updated BlogPage and individual post pages to utilize the new `ogImagePosition` for responsive image styling. - Improved Author component to conditionally render author images based on availability. - Updated 2026 roadmap blog post with a new Open Graph image and position for enhanced visual appeal. * feat: enhance CardComponent with icon support and layout improvements - Added optional `icon` prop to CardComponent for better visual representation. - Updated CardComponent layout to include icon alongside title and children. - Improved styling for CardComponent and CardsBase for enhanced responsiveness and user experience. * feat: update 2026 roadmap with detailed focus areas and community-driven items - Added sections for Q1 and Q2 focus areas, outlining major initiatives like Dynamic Context and Admin Panel. - Enhanced clarity on community-driven items and their prioritization based on GitHub reactions. - Included hiring information to attract full-stack developers for ongoing project support. - Improved overall structure and readability of the roadmap content. * fix: improve icon styling in CardCompat component for better responsiveness - Updated icon container styling to ensure consistent height and width for SVG icons. - Enhanced layout of CardCompat to maintain visual integrity across different screen sizes. * chore: update .gitignore to include next-env.d.ts for TypeScript support * fix: correct import statement formatting in next-env.d.ts for consistency * fix: refine wording in 2026 roadmap for clarity - Updated the description of agentic workflows to emphasize a lean approach to context pulling. - Enhanced overall readability of the section on Dynamic Context. * feat: expand Admin Panel section in 2026 roadmap with detailed capabilities - Added comprehensive descriptions of the Admin Panel's core functionalities, including GUI for configuration, configuration profiles, group and role management, and access controls. - Clarified the development approach for the Admin Panel, emphasizing ongoing iteration and community involvement. - Updated note on the Admin Panel's prioritization and requirements following the ClickHouse acquisition. * feat: add TrackedLink component for enhanced analytics tracking - Introduced a new TrackedLink component that integrates Vercel analytics to track user interactions with links. - The component allows for customizable link properties while ensuring tracking of clicks with relevant metadata. - Updated CardCompat to utilize the new TrackedLink for improved user engagement tracking. * feat: enhance blog post layout and introduce TrackedAnchor component for link tracking - Wrapped the InlineTOC component in a div for improved spacing in blog posts. - Added a new TrackedAnchor component to facilitate link tracking with Vercel analytics, allowing for customizable anchor elements. - Updated mdx-components to utilize TrackedAnchor for enhanced link interaction tracking. * feat: update TrackedLink and TrackedAnchor components for external link handling - Enhanced the TrackedLink component to differentiate between internal and external links, using Next.js Link for internal navigation. - Introduced a utility function to determine if a link is external, improving tracking accuracy. - Updated TrackedAnchor to utilize the same external link handling logic for consistency in link tracking. * feat: add uncaught exception handling section to dotenv configuration documentation - Introduced a new section on uncaught exception handling, explaining how to override the default behavior to keep the app running after exceptions. - Added an option table detailing the `CONTINUE_ON_UNCAUGHT_EXCEPTION` configuration. - Included a warning callout advising against using this feature in production environments. * feat: add ESLint rule for unused variables in TypeScript - Introduced a new ESLint rule to enforce the handling of unused variables, allowing for specific patterns to be ignored. - This enhancement aims to improve code quality by ensuring that developers are alerted to potentially unnecessary variables while maintaining flexibility in naming conventions. * fix: update copyright year in LICENSE file to 2026 * feat: update footer menu link and add 2026 roadmap blog post - Changed the roadmap link in the FooterMenu component to point to the new blog post. - Introduced a new blog post detailing the 2026 roadmap for LibreChat, outlining key features and focus areas for the upcoming year. - Updated the import statement in next-env.d.ts for consistency with the new types directory. * fix: update import path in next-env.d.ts and add comment block in agents.mdx - Changed the import statement in next-env.d.ts to reference the new development types directory. - Added a comment block in agents.mdx to indicate that the Programmatic Tool Calling feature is in private beta. * fix: remove unused ESLint disable comment in context.tsx * chore: update blog
This commit is contained in:
@@ -49,6 +49,7 @@ module.exports = {
|
||||
'@typescript-eslint/prefer-for-of': 'error',
|
||||
"no-sharp-comments": "off",
|
||||
"markdown/no-sharp-comments": "off",
|
||||
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_', destructuredArrayIgnorePattern: '^_' }],
|
||||
// todo: enable
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||
|
||||
2
.github/workflows/nextjs_bundle_analysis.yml
vendored
2
.github/workflows/nextjs_bundle_analysis.yml
vendored
@@ -59,7 +59,7 @@ jobs:
|
||||
path: .next/analyze/__bundle_analysis.json
|
||||
|
||||
- name: Download base branch bundle stats
|
||||
uses: dawidd6/action-download-artifact@v3
|
||||
uses: dawidd6/action-download-artifact@v6
|
||||
if: success() && github.event.number
|
||||
with:
|
||||
workflow: nextjs_bundle_analysis.yml
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -2,7 +2,7 @@
|
||||
.source
|
||||
node_modules
|
||||
.vercel
|
||||
|
||||
next-env.d.ts
|
||||
.env.local
|
||||
.env
|
||||
.env*.local
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 LibreChat
|
||||
Copyright (c) 2026 LibreChat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { notFound } from 'next/navigation'
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import { InlineTOC } from 'fumadocs-ui/components/inline-toc'
|
||||
import { mdxComponents } from '@/lib/mdx-components'
|
||||
@@ -51,9 +52,23 @@ export default async function BlogPostPage(props: PageProps) {
|
||||
</time>
|
||||
{(post as any).author && <span>by {(post as any).author}</span>}
|
||||
</div>
|
||||
{post.ogImage && (
|
||||
<Image
|
||||
src={post.ogImage}
|
||||
alt={post.title}
|
||||
width={1200}
|
||||
height={630}
|
||||
className="mt-6 border rounded-2xl"
|
||||
unoptimized={post.ogImage.endsWith('.gif')}
|
||||
/>
|
||||
)}
|
||||
</header>
|
||||
|
||||
{post.toc && post.toc.length > 0 && <InlineTOC items={post.toc} />}
|
||||
{post.toc && post.toc.length > 0 && (
|
||||
<div className="mb-8">
|
||||
<InlineTOC items={post.toc} />
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="prose prose-neutral dark:prose-invert max-w-none">
|
||||
<MDX components={mdxComponents} />
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import { blog } from '@/lib/source'
|
||||
import type { Metadata } from 'next'
|
||||
@@ -11,11 +12,20 @@ interface FeedEntry {
|
||||
title: string
|
||||
description?: string
|
||||
date: string
|
||||
dateFormatted: string
|
||||
url: string
|
||||
category: string
|
||||
author?: string
|
||||
ogImage?: string
|
||||
ogImagePosition?: string
|
||||
}
|
||||
|
||||
const dateFormatter = new Intl.DateTimeFormat('en-US', {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
timeZone: 'UTC',
|
||||
})
|
||||
|
||||
function getSlug(path: string): string {
|
||||
return path.replace(/\.mdx?$/, '')
|
||||
}
|
||||
@@ -24,14 +34,17 @@ export default function BlogPage() {
|
||||
const entries: FeedEntry[] = []
|
||||
|
||||
for (const post of blog) {
|
||||
const iso =
|
||||
typeof post.date === 'string' ? post.date : new Date(post.date).toISOString().split('T')[0]
|
||||
entries.push({
|
||||
title: post.title,
|
||||
description: post.description,
|
||||
date:
|
||||
typeof post.date === 'string' ? post.date : new Date(post.date).toISOString().split('T')[0],
|
||||
date: iso,
|
||||
dateFormatted: dateFormatter.format(new Date(iso + 'T00:00:00Z')),
|
||||
url: `/blog/${getSlug(post._file.path)}`,
|
||||
category: (post as any).category ?? 'guide',
|
||||
author: (post as any).author,
|
||||
ogImage: post.ogImage,
|
||||
ogImagePosition: (post as any).ogImagePosition,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -46,32 +59,46 @@ export default function BlogPage() {
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div className="space-y-4">
|
||||
<div className="grid grid-cols-1 gap-6 md:grid-cols-2">
|
||||
{entries.map((entry) => (
|
||||
<article key={entry.url}>
|
||||
<Link
|
||||
href={entry.url}
|
||||
className="group flex flex-col gap-2 rounded-lg border border-border p-6 transition-colors hover:bg-muted"
|
||||
className="group flex h-full flex-col rounded-lg border border-border overflow-hidden transition-colors hover:bg-muted"
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<time dateTime={entry.date} className="text-sm text-muted-foreground">
|
||||
{new Date(entry.date).toLocaleDateString('en-US', {
|
||||
year: 'numeric',
|
||||
month: 'long',
|
||||
day: 'numeric',
|
||||
})}
|
||||
</time>
|
||||
<span className="inline-flex rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium capitalize text-muted-foreground">
|
||||
{entry.category}
|
||||
</span>
|
||||
<div className="relative h-48 w-full overflow-hidden bg-muted">
|
||||
{entry.ogImage ? (
|
||||
<Image
|
||||
src={entry.ogImage}
|
||||
alt={entry.title}
|
||||
fill
|
||||
sizes="(max-width: 768px) 100vw, 50vw"
|
||||
className="object-cover transition-transform group-hover:scale-105"
|
||||
style={
|
||||
entry.ogImagePosition ? { objectPosition: entry.ogImagePosition } : undefined
|
||||
}
|
||||
unoptimized={entry.ogImage.endsWith('.gif')}
|
||||
/>
|
||||
) : (
|
||||
<div className="flex h-full items-center justify-center text-4xl font-bold text-muted-foreground/30">
|
||||
{entry.title.charAt(0)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex flex-1 flex-col gap-2 p-5">
|
||||
<time dateTime={entry.date} className="text-sm text-muted-foreground">
|
||||
{entry.dateFormatted}
|
||||
</time>
|
||||
<h2 className="text-lg font-semibold text-foreground group-hover:text-foreground/80 line-clamp-2">
|
||||
{entry.title}
|
||||
</h2>
|
||||
{entry.description && (
|
||||
<p className="text-sm text-muted-foreground line-clamp-2">{entry.description}</p>
|
||||
)}
|
||||
{entry.author && (
|
||||
<p className="mt-auto pt-3 text-xs text-muted-foreground">by {entry.author}</p>
|
||||
)}
|
||||
</div>
|
||||
<h2 className="text-lg font-semibold text-foreground group-hover:text-foreground/80">
|
||||
{entry.title}
|
||||
</h2>
|
||||
{entry.description && (
|
||||
<p className="text-sm text-muted-foreground line-clamp-2">{entry.description}</p>
|
||||
)}
|
||||
{entry.author && <p className="text-xs text-muted-foreground">by {entry.author}</p>}
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
|
||||
@@ -18,13 +18,15 @@ export const Author = ({ authorid }: { authorid: string }) => {
|
||||
<a href={`/authors/${authorid}`} className="group shrink-0" rel="noopener noreferrer">
|
||||
<div className="flex justify-end gap-2" key={name}>
|
||||
<div className="flex items-center gap-2">
|
||||
<Image
|
||||
src={ogImage}
|
||||
width={40}
|
||||
height={40}
|
||||
className="rounded-full"
|
||||
alt={`Picture ${name}`}
|
||||
/>
|
||||
{ogImage ? (
|
||||
<Image
|
||||
src={ogImage}
|
||||
width={40}
|
||||
height={40}
|
||||
className="rounded-full"
|
||||
alt={`Picture ${name}`}
|
||||
/>
|
||||
) : null}
|
||||
<span className="text-primary/60 group-hover:text-primary whitespace-nowrap">
|
||||
{name}
|
||||
</span>
|
||||
|
||||
@@ -8,7 +8,7 @@ export default function Roadmap() {
|
||||
<Image src="/images/cards/route.svg" alt="Roadmap Logo" width={30} height={30} />
|
||||
{/* Text */}
|
||||
<span className="ml-2 text-lg font-bold text-gray-600 dark:text-gray-300">
|
||||
2025 Roadmap
|
||||
2026 Roadmap
|
||||
</span>
|
||||
{/* CSS for hover effect */}
|
||||
<style jsx>{`
|
||||
|
||||
@@ -30,7 +30,7 @@ const menuItems: {
|
||||
},
|
||||
{
|
||||
name: 'Roadmap',
|
||||
href: '/blog/2025-02-20_2025_roadmap',
|
||||
href: '/blog/2026-02-18_2026_roadmap',
|
||||
},
|
||||
{
|
||||
name: 'Demo',
|
||||
|
||||
81
components/TrackedLink.tsx
Normal file
81
components/TrackedLink.tsx
Normal file
@@ -0,0 +1,81 @@
|
||||
'use client'
|
||||
|
||||
import Link from 'next/link'
|
||||
import { track } from '@vercel/analytics'
|
||||
import type { ReactNode, AnchorHTMLAttributes } from 'react'
|
||||
|
||||
function isExternalHref(href: string): boolean {
|
||||
return href.startsWith('http') || href.startsWith('mailto:')
|
||||
}
|
||||
|
||||
export function TrackedLink({
|
||||
href,
|
||||
title,
|
||||
children,
|
||||
className,
|
||||
...props
|
||||
}: AnchorHTMLAttributes<HTMLAnchorElement> & {
|
||||
href: string
|
||||
title?: string
|
||||
children: ReactNode
|
||||
}) {
|
||||
const handleClick = () => {
|
||||
track('card_click', {
|
||||
title: title ?? href,
|
||||
href,
|
||||
})
|
||||
}
|
||||
|
||||
if (isExternalHref(href)) {
|
||||
return (
|
||||
<a
|
||||
href={href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className={className}
|
||||
onClick={handleClick}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</a>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Link href={href} className={className} onClick={handleClick} {...props}>
|
||||
{children}
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
|
||||
export function TrackedAnchor({
|
||||
href,
|
||||
children,
|
||||
...props
|
||||
}: AnchorHTMLAttributes<HTMLAnchorElement> & { children?: ReactNode }) {
|
||||
if (!href) return <a {...props}>{children}</a>
|
||||
|
||||
const handleClick = () => {
|
||||
const label = typeof children === 'string' ? children : (props['aria-label'] ?? href)
|
||||
|
||||
track('link_click', {
|
||||
href,
|
||||
label: String(label).slice(0, 100),
|
||||
external: isExternalHref(href),
|
||||
})
|
||||
}
|
||||
|
||||
if (isExternalHref(href)) {
|
||||
return (
|
||||
<a href={href} target="_blank" rel="noopener noreferrer" onClick={handleClick} {...props}>
|
||||
{children}
|
||||
</a>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Link href={href} onClick={handleClick} {...props}>
|
||||
{children}
|
||||
</Link>
|
||||
)
|
||||
}
|
||||
@@ -1,13 +1,15 @@
|
||||
'use client'
|
||||
|
||||
import Image from 'next/image'
|
||||
import { useRouter } from 'next/router'
|
||||
import { usePathname } from 'next/navigation'
|
||||
import { getPagesUnderRoute } from 'nextra/context'
|
||||
import { Author } from '../Author/Authors'
|
||||
import { Video } from '../Video'
|
||||
|
||||
export const BlogHeader = () => {
|
||||
const router = useRouter()
|
||||
const pathname = usePathname()
|
||||
const changelogPages = getPagesUnderRoute('/blog')
|
||||
const page = changelogPages.find((page) => page.route === router.pathname)
|
||||
const page = changelogPages.find((page) => page.route === pathname)
|
||||
|
||||
const { title, description, ogImage, ogVideo, gif, date, authorid } = page.frontMatter
|
||||
|
||||
|
||||
208
content/blog/2026-02-18_2026_roadmap.mdx
Normal file
208
content/blog/2026-02-18_2026_roadmap.mdx
Normal file
@@ -0,0 +1,208 @@
|
||||
---
|
||||
title: LibreChat 2026 Roadmap
|
||||
date: 2026-02-18
|
||||
description: 'The 2026 roadmap for LibreChat: dynamic context, admin panel, and what comes next.'
|
||||
tags:
|
||||
- update
|
||||
- roadmap
|
||||
- 2026
|
||||
ogImage: /images/blog/2026-02-18_2026_roadmap.png
|
||||
ogImagePosition: center 10%
|
||||
author: danny
|
||||
---
|
||||
|
||||
import Discord from '@/components/icons/discord'
|
||||
import Github from '@/components/icons/github'
|
||||
|
||||
## LibreChat Turns 3!
|
||||
|
||||
LibreChat officially turned 3 on February 11th! 🎉🥳
|
||||
|
||||
I'm incredibly grateful to everyone who's contributed, whether through feedback, code, or just showing up and using the project.
|
||||
|
||||
## 2025 in Review
|
||||
|
||||
Before looking ahead, let's take stock of what we accomplished in 2025 (see [last year's roadmap](/blog/2025-02-20_2025_roadmap)):
|
||||
|
||||
- Started the year at 22,200 GitHub stars, reaching **33,900+** as of writing
|
||||
- Over **6,800 forks** and over 23 million container registry pulls
|
||||
- Community Discord server grown to over **9,000 members**
|
||||
- Major feature releases from v0.7.8 through **[v0.8.3-rc1](/changelog/v0.8.3-rc1)**
|
||||
- Acquired by [ClickHouse](https://clickhouse.com/blog/clickhouse-acquires-librechat) to democratize AI-driven analytics
|
||||
|
||||
**Key feature milestones:**
|
||||
- Multi-agent support through our app-agnostic [Agents framework](https://github.com/danny-avila/agents/)
|
||||
- Native web search, OCR, inline Mermaid diagrams, pinned models/agents
|
||||
- [Resumable chats](/docs/features/resumable_streams) preserving responses through disconnects, tab switches, and device changes
|
||||
- Multimodal file support: video understanding, PDFs, native provider file handling
|
||||
- [Image generation and editing](/docs/features/image_gen) with GPT-Image-1+ and Gemini (Nano Banana)
|
||||
- [MCP](https://modelcontextprotocol.io/) integrations, plus dynamic server management from the UI
|
||||
- Sharing agents, prompts, and MCP servers between users, backed by Access Control Lists (ACLs)
|
||||
- [User Memories](/docs/configuration/librechat_yaml/object_structure/memory) for personalized context across conversations
|
||||
- [OpenAI-compatible Agents API](/docs/features/agents_api) for external integrations and automation (in Beta)
|
||||
|
||||
---
|
||||
|
||||
## The 2026 Roadmap
|
||||
|
||||
This year, instead of a list of every possible feature, **we're focusing on just two quarters at a time**: Q1 and Q2. This keeps commitments honest, timelines realistic, and lets us adapt as the AI landscape continues to shift under everyone's feet.
|
||||
|
||||
We use LibreChat internally at ClickHouse to power agentic data analytics, and much of this roadmap reflects what we need to run it in production.
|
||||
|
||||
We'll revisit and publish the H2 roadmap mid-year.
|
||||
|
||||
> Note: as always, bug fixes and smaller improvements ship continuously alongside roadmap work.
|
||||
|
||||
---
|
||||
|
||||
### Q1
|
||||
|
||||
Q1 has 2 major focus areas that will define LibreChat's next chapter.
|
||||
|
||||
---
|
||||
|
||||
#### Admin Panel
|
||||
|
||||
The v1 Admin Panel ([#3137](https://github.com/danny-avila/LibreChat/issues/3137)) will have four core capabilities:
|
||||
|
||||
- **GUI for Configuration**
|
||||
- A graphical interface for everything currently managed through `librechat.yaml`, eliminating the need to edit YAML files for [custom configuration](/docs/configuration/librechat_yaml)
|
||||
- **Configuration Profiles**
|
||||
- Apply custom configuration profiles to roles initially, with group-level profiles as a stretch goal
|
||||
- **Group & Role Management**
|
||||
- Create and manage groups and roles from the UI, with user management as a stretch goal
|
||||
- **Access Controls Throughout**
|
||||
- Access controls embedded into every aspect of the admin panel, not bolted on after the fact
|
||||
|
||||
Together, these capabilities make it possible to shape LibreChat into different experiences; for example, streamlined for business users, fully open for power users.
|
||||
|
||||
Once released, the Admin Panel will continue to be developed and iterated on in public.
|
||||
|
||||
---
|
||||
|
||||
#### Dynamic Context
|
||||
|
||||
The best agentic workflows start lean and pull context as needed. Less noise, fewer tokens, better results.
|
||||
|
||||
LibreChat already implements some patterns from the dynamic context playbook, but by the end of Q1, we're going deeper:
|
||||
|
||||
- **Agent Skills** ([#11106](https://github.com/danny-avila/LibreChat/issues/11106))
|
||||
- A new standard for domain-specific instructions and bundled resources
|
||||
- **Programmatic Tool Calling (PTC)**
|
||||
- Code orchestration for tools, giving agents incredible flexibility of how tool outputs are interpreted
|
||||
- **Conversation Summarization**
|
||||
- Intelligent context compression for long-running conversations, preserving key details while reclaiming token budget
|
||||
|
||||
The goal is LibreChat agents that are smarter about what they know and when they know it.
|
||||
|
||||
To power Skills and PTC, I will be open-sourcing the [Code Interpreter API](/docs/features/code_interpreter) by end of Q1, giving agents the ability to execute code in a safe and scalable way, tailored for LibreChat's implementation of these features.
|
||||
|
||||
Notable features already completed as part of Dynamic Context:
|
||||
- [Event-driven lazy tool execution](https://github.com/danny-avila/LibreChat/pull/11588) for MCP tools
|
||||
- [Deferred tool discovery](/docs/features/agents#deferred-tools) for Agents using MCP tools
|
||||
|
||||
**For more information on these topics:**
|
||||
- [Agent Skills Overview](https://agentskills.io/home)
|
||||
- [Dynamic Context](https://cursor.com/blog/dynamic-context-discovery) in Cursor
|
||||
- [Code mode](https://blog.cloudflare.com/code-mode/) by Cloudflare
|
||||
- [Advanced Tool Use](https://www.anthropic.com/engineering/advanced-tool-use) by Anthropic
|
||||
- [My demo of Programmatic Tool Calling](https://youtu.be/5DUvTbntkAg?si=80c9J9fryLoVhYPy&t=515) from a recent ClickHouse event in NYC
|
||||
|
||||
---
|
||||
|
||||
### Q2
|
||||
|
||||
Q2 builds on Q1's foundation with new capabilities and continued iteration on existing features.
|
||||
|
||||
---
|
||||
|
||||
#### Tool UI Refresh
|
||||
|
||||
> Note: This is a major focus in Q2, but may start in Q1 time-permitting.
|
||||
|
||||
The UI that displays when an agent calls a tool is outdated and needs a refresh, especially for structured inputs and outputs.
|
||||
|
||||
[Artifacts](/docs/features/artifacts) remains a popular feature that will also see improvements, including:
|
||||
|
||||
- Rendering outputs from files and tool results
|
||||
- Dedicated tools for data visualization and analysis
|
||||
- Making generated artifacts easier to share and maintain between iterations
|
||||
|
||||
---
|
||||
|
||||
#### Workflows & Interactivity
|
||||
|
||||
- **Human-in-the-Loop** ([#5580](https://github.com/danny-avila/LibreChat/issues/5580))
|
||||
- approval gates for tool usage, letting users review and authorize agent actions before execution
|
||||
- **Message Queuing & Interruptions**
|
||||
- queuing follow-up messages and gracefully interrupting in-progress responses, for a more natural back-and-forth
|
||||
- **Background Agents and Subagents** ([#11687](https://github.com/danny-avila/LibreChat/issues/11687) adjacent)
|
||||
- agent workflows that run on a schedule and/or triggered by other agents, enabling automation and background processing
|
||||
|
||||
---
|
||||
|
||||
#### Infrastructure & Data Management
|
||||
|
||||
- File retention policies (automatic cleanup and expiry) ([#2365](https://github.com/danny-avila/LibreChat/issues/2365))
|
||||
- File storage limits per configuration profile ([#3057](https://github.com/danny-avila/LibreChat/issues/3057))
|
||||
- AWS CloudFront integration for serving images
|
||||
- Client-side field-level encryption for sensitive data (primarily message content)
|
||||
|
||||
---
|
||||
|
||||
### Community-Driven Items
|
||||
|
||||
Items with strong community support that may land alongside roadmap work, based on demand and contributions (reactions + PRs):
|
||||
|
||||
- MCP Apps ([#10641](https://github.com/danny-avila/LibreChat/issues/10641), [PR #11799](https://github.com/danny-avila/LibreChat/pull/11799))
|
||||
- Keyboard shortcuts ([#3664](https://github.com/danny-avila/LibreChat/issues/3664))
|
||||
- Chat folders and projects ([#4848](https://github.com/danny-avila/LibreChat/issues/4848))
|
||||
- A unified file upload experience ([#10941](https://github.com/danny-avila/LibreChat/discussions/10941))
|
||||
- Visible conversation cost and usage metrics ([#1215](https://github.com/danny-avila/LibreChat/issues/1215))
|
||||
|
||||
These are ranked roughly by GitHub reactions and community discussions. Several are already in active discussion with external contributors and organizations. The best way to move an item up is to react on its GitHub issue and engage in the linked threads.
|
||||
|
||||
Community contributions are always welcome and appreciated. Pull requests that include quality code, documentation, and prior discussion are more likely to be merged.
|
||||
|
||||
---
|
||||
|
||||
### We're Hiring
|
||||
|
||||
We're looking for experienced full-stack developers to help maintain LibreChat on contract, with potential to transition into a full-time role. TypeScript proficiency is required; Python is a plus.
|
||||
|
||||
**Requirements:**
|
||||
- Full-stack proficiency (backend + frontend)
|
||||
- 5+ years of professional experience
|
||||
|
||||
Interested? [Email us](mailto:danny.avila@clickhouse.com) with the subject line: **[LibreChat Job]**
|
||||
|
||||
---
|
||||
|
||||
### Conclusion
|
||||
|
||||
Three years in, LibreChat continues to be the most comprehensive open-source AI chat platform available. The focus this year is depth over breadth--making agents genuinely smarter about context, giving admins the tools they need, and building the interactive workflows that turn chat into something more.
|
||||
|
||||
We'll check back at the half-year mark with the H2 roadmap. In the meantime, share your thoughts in the discussion threads below.
|
||||
|
||||
---
|
||||
|
||||
<Cards>
|
||||
<Cards.Card
|
||||
title="GitHub Roadmap Discussion"
|
||||
href="https://github.com/danny-avila/LibreChat/discussions/11860"
|
||||
target="_blank"
|
||||
icon={<Github />}
|
||||
/>
|
||||
<Cards.Card
|
||||
title="Discord Roadmap Discussion"
|
||||
href="https://discord.com/channels/1086345563026489514/1473847210700705885"
|
||||
target="_blank"
|
||||
icon={<Discord />}
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
---
|
||||
|
||||
<Callout type="info" title="Note">
|
||||
This roadmap covers Q1-Q2 2026 and is subject to change based on community feedback and contributions. The H2 roadmap will be published mid-year.
|
||||
</Callout>
|
||||
@@ -7,7 +7,7 @@ version: "1.2.3"
|
||||
- Added `maxRecursionLimit` to [Agents Endpoint](/docs/configuration/librechat_yaml/object_structure/agents#maxrecursionlimit)
|
||||
- Sets the absolute maximum number of steps an agent can take in a run
|
||||
- Defines the upper limit for `recursionLimit` that can be set from the UI
|
||||
- If omitted, defaults to the value of `recursionLimit` or 25 if `recursionLimit` is also omitted
|
||||
- If omitted, defaults to the value of `recursionLimit` or 50 if `recursionLimit` is also omitted
|
||||
- For more information about agent steps, see [Max Agent Steps](/docs/features/agents#max-agent-steps)
|
||||
- Updated `recursionLimit` in [Agents Endpoint](/docs/configuration/librechat_yaml/object_structure/agents#recursionlimit)
|
||||
- Now represents the default number of steps an agent can take in a run
|
||||
|
||||
53
content/changelog/config_v1.3.4.mdx
Normal file
53
content/changelog/config_v1.3.4.mdx
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
date: 2026-02-18
|
||||
title: ⚙️ Config v1.3.4
|
||||
version: "1.3.4"
|
||||
---
|
||||
|
||||
- Added `create` field to `interface.prompts` and `interface.agents` configuration
|
||||
- Controls whether users can create new prompts/agents (default: `true`)
|
||||
- Complements existing `use`, `share`, and `public` permission fields
|
||||
- Boolean values still supported for backward compatibility
|
||||
- See [Interface Configuration](/docs/configuration/librechat_yaml/object_structure/interface#prompts) for details
|
||||
|
||||
- Added `interface.remoteAgents` configuration for remote agent access control
|
||||
- Added `use` setting to enable/disable remote agent usage (default: `false`)
|
||||
- Added `create` setting to control whether users can create remote agents (default: `false`)
|
||||
- Added `share` setting to control whether users can share remote agents (default: `false`)
|
||||
- Added `public` setting to enable public sharing of remote agents (default: `false`)
|
||||
- See [Interface Configuration](/docs/configuration/librechat_yaml/object_structure/interface#remoteagents) for details
|
||||
|
||||
- Added `models` and `inferenceProfiles` to `endpoints.bedrock` configuration
|
||||
- `models`: Specify custom model IDs available for Bedrock
|
||||
- `inferenceProfiles`: Map inference profile IDs to display names for cross-region inference
|
||||
- See [AWS Bedrock Configuration](/docs/configuration/librechat_yaml/object_structure/aws_bedrock#inferenceprofiles) for details
|
||||
|
||||
- Added Moonshot as a known endpoint
|
||||
- New `moonshot` known endpoint for Moonshot AI integration with icon support
|
||||
- See [Moonshot Configuration](/docs/configuration/librechat_yaml/ai_endpoints/moonshot) for details
|
||||
|
||||
- Added `deferred_tools` and `programmatic_tools` agent capabilities
|
||||
- `deferred_tools`: Enables lazy/event-driven loading of MCP tools, reducing context window usage (enabled by default)
|
||||
- `programmatic_tools`: Enables programmatic tool calling for MCP tools via code execution sandbox (disabled by default, requires latest Code Interpreter API)
|
||||
- See [Agents Configuration](/docs/configuration/librechat_yaml/object_structure/agents) for details
|
||||
|
||||
- Removed deprecated `forcePrompt` setting
|
||||
- Removed from Azure endpoint and custom endpoint configurations
|
||||
- Setting was deprecated and no longer functional
|
||||
|
||||
- Updated default model lists
|
||||
- Added `claude-sonnet-4-6` and `claude-opus-4-6` to Anthropic and Bedrock default models
|
||||
- Added `moonshotai.kimi` and `moonshotai.kimi-k2.5` to Bedrock default models
|
||||
- Added Bedrock parameter support for MoonshotAI, Z.AI, and OpenAI GPT-OSS models
|
||||
- Removed deprecated Claude models: claude-3-opus, claude-3-sonnet, claude-3-haiku, claude-2.x, claude-1.x, and claude-instant variants
|
||||
|
||||
- Added `artifacts` field to `modelSpecs` list entries
|
||||
- Enables the Artifacts capability for a model spec
|
||||
- Set to `true` to enable with default mode, or a mode string (e.g., `"default"`) for a specific mode
|
||||
- See [Model Specs Configuration](/docs/configuration/librechat_yaml/object_structure/model_specs#artifacts) for details
|
||||
|
||||
- Added `effort` parameter for Anthropic Adaptive Thinking in `modelSpecs` presets
|
||||
- Controls the thinking effort level for supported Anthropic models (e.g., Claude Opus 4.6)
|
||||
- Options: `"low"`, `"medium"`, `"high"`, `"max"`, or unset (model decides)
|
||||
- Supported by `anthropic` and `bedrock` (Anthropic models) endpoints
|
||||
- See [Model Specs Configuration](/docs/configuration/librechat_yaml/object_structure/model_specs#effort) for details
|
||||
108
content/changelog/v0.8.3-rc1.mdx
Normal file
108
content/changelog/v0.8.3-rc1.mdx
Normal file
@@ -0,0 +1,108 @@
|
||||
---
|
||||
date: 2026-02-18
|
||||
title: 🚀 LibreChat v0.8.3-rc1
|
||||
description: The v0.8.3-rc1 release of LibreChat
|
||||
version: "0.8.3-rc1"
|
||||
---
|
||||
|
||||
## What's Changed
|
||||
|
||||
### ✨ Features
|
||||
|
||||
* 🦥 Event-Driven Lazy Tool Loading by [@danny-avila](https://github.com/danny-avila) in [#11588](https://github.com/danny-avila/LibreChat/pull/11588)
|
||||
* 📉 Add Token Usage Tracking for Agents API Routes by [@danny-avila](https://github.com/danny-avila) in [#11600](https://github.com/danny-avila/LibreChat/pull/11600)
|
||||
* 🎯 Add Programmatic Tool Calling UI for MCP Tools by [@danny-avila](https://github.com/danny-avila) in [#11604](https://github.com/danny-avila/LibreChat/pull/11604)
|
||||
* 🌙 Moonshot Provider Support by [@danny-avila](https://github.com/danny-avila) in [#11621](https://github.com/danny-avila/LibreChat/pull/11621)
|
||||
* 📬 Implement Delta Buffering System for Out-of-Order SSE Events by [@danny-avila](https://github.com/danny-avila) in [#11643](https://github.com/danny-avila/LibreChat/pull/11643)
|
||||
* 🤖 Claude Opus 4.6 - 1M Context, Premium Pricing, Adaptive Thinking by [@danny-avila](https://github.com/danny-avila) in [#11670](https://github.com/danny-avila/LibreChat/pull/11670)
|
||||
* 🎮 Bedrock Parameters for OpenAI GPT-OSS models by [@danny-avila](https://github.com/danny-avila) in [#11798](https://github.com/danny-avila/LibreChat/pull/11798)
|
||||
* 🛰️ Add Bedrock Parameter Settings for MoonshotAI and Z.AI Models by [@danny-avila](https://github.com/danny-avila) in [#11783](https://github.com/danny-avila/LibreChat/pull/11783)
|
||||
* 🤖 Claude Sonnet 4.6 support by [@danny-avila](https://github.com/danny-avila) in [#11829](https://github.com/danny-avila/LibreChat/pull/11829)
|
||||
* 🎭 Override Custom Endpoint Schema with Specified Params Endpoint by [@danny-avila](https://github.com/danny-avila) in [#11788](https://github.com/danny-avila/LibreChat/pull/11788)
|
||||
* 🏎️ Smart Reinstall with Turborepo Caching for Better DX by [@danny-avila](https://github.com/danny-avila) in [#11785](https://github.com/danny-avila/LibreChat/pull/11785)
|
||||
* 💎 Add Redis as Optional Sub-chart Dependency in Helm Chart by [@SharpLu](https://github.com/SharpLu) in [#11664](https://github.com/danny-avila/LibreChat/pull/11664)
|
||||
* ⛵ Expose enableServiceLinks in Helm Deployment Templates by [@bhat-ganesh](https://github.com/bhat-ganesh) in [#11741](https://github.com/danny-avila/LibreChat/pull/11741)
|
||||
* 🔧 `deleteRagFile` utility for Consistent RAG API document deletion by [@ethanlaj](https://github.com/ethanlaj) in [#11493](https://github.com/danny-avila/LibreChat/pull/11493)
|
||||
|
||||
### 🐛 Fixes
|
||||
|
||||
* 🔐 MCP OAuth Tool Discovery and Event Emission by [@danny-avila](https://github.com/danny-avila) in [#11599](https://github.com/danny-avila/LibreChat/pull/11599)
|
||||
* 🔦 Tool resource files not visible in event-driven mode by [@usnavy13](https://github.com/usnavy13) in [#11610](https://github.com/danny-avila/LibreChat/pull/11610)
|
||||
* 👆 Web Search and Code Interpreter Toggle Cursor Hover Behavior by [@dustinhealy](https://github.com/dustinhealy) in [#11614](https://github.com/danny-avila/LibreChat/pull/11614)
|
||||
* 📱 Mention Touch UX and MCP Tool UI Consistency by [@danny-avila](https://github.com/danny-avila) in [#11627](https://github.com/danny-avila/LibreChat/pull/11627)
|
||||
* 🛡️ Preserve CREATE/SHARE/SHARE_PUBLIC Permissions with Boolean Config by [@danny-avila](https://github.com/danny-avila) in [#11647](https://github.com/danny-avila/LibreChat/pull/11647)
|
||||
* 🗣️ Add Various State Change Announcements by [@dustinhealy](https://github.com/dustinhealy) in [#11495](https://github.com/danny-avila/LibreChat/pull/11495)
|
||||
* 🎬 Code Session Context In Event Driven Mode by [@danny-avila](https://github.com/danny-avila) in [#11673](https://github.com/danny-avila/LibreChat/pull/11673)
|
||||
* 🆔 Atomic File Dedupe, Bedrock Tokens Fix, and Allowed MIME Types by [@danny-avila](https://github.com/danny-avila) in [#11675](https://github.com/danny-avila/LibreChat/pull/11675)
|
||||
* 🌊 Prevent Truncations When Redis Resumable Streams Are Enabled by [@danny-avila](https://github.com/danny-avila) in [#11710](https://github.com/danny-avila/LibreChat/pull/11710)
|
||||
* 🪟 Update Link Target to Open in Separate Tabs by [@flyinggrizzly](https://github.com/flyinggrizzly) in [#11669](https://github.com/danny-avila/LibreChat/pull/11669)
|
||||
* 🔧 Update z-index for ImagePreview Dialog by [@danny-avila](https://github.com/danny-avila) in [#11714](https://github.com/danny-avila/LibreChat/pull/11714)
|
||||
* 🛡️ Implement TOCTOU-Safe SSRF Protection for Actions and MCP by [@danny-avila](https://github.com/danny-avila) in [#11722](https://github.com/danny-avila/LibreChat/pull/11722)
|
||||
* 🛡️ Secure MCP/Actions OAuth Flows, Resolve Race Condition & Tool Cache Cleanup by [@danny-avila](https://github.com/danny-avila) in [#11756](https://github.com/danny-avila/LibreChat/pull/11756)
|
||||
* 🏁 Resolve Content Aggregation Race Condition in Agent Event Handlers by [@danny-avila](https://github.com/danny-avila) in [#11757](https://github.com/danny-avila/LibreChat/pull/11757)
|
||||
* 🔎 Include Legacy Documents With Undefined `_meiliIndex` in Search Sync by [@ablizorukov](https://github.com/ablizorukov) in [#11745](https://github.com/danny-avila/LibreChat/pull/11745)
|
||||
* 🔒 Prevent Race Condition in RedisJobStore by [@danny-avila](https://github.com/danny-avila) in [#11764](https://github.com/danny-avila/LibreChat/pull/11764)
|
||||
* 🦙 Memory Agent Fails to Initialize with Ollama Provider by [@calkeo](https://github.com/calkeo) in [#11680](https://github.com/danny-avila/LibreChat/pull/11680)
|
||||
* 🔒 Secure Cookie Localhost Bypass and OpenID Token Selection in AuthService by [@danny-avila](https://github.com/danny-avila) in [#11782](https://github.com/danny-avila/LibreChat/pull/11782)
|
||||
* 🧰 Convert `const` to `enum` in MCP Schemas for Gemini Compatibility by [@danny-avila](https://github.com/danny-avila) in [#11784](https://github.com/danny-avila/LibreChat/pull/11784)
|
||||
* 🪟 Tab Isolation for Agent Favorites + MCP Selections by [@danny-avila](https://github.com/danny-avila) in [#11786](https://github.com/danny-avila/LibreChat/pull/11786)
|
||||
* 🕵️♂️ Handle 404 errors on agent queries for favorites by [@ethanlaj](https://github.com/ethanlaj) in [#11587](https://github.com/danny-avila/LibreChat/pull/11587)
|
||||
* 🏢 Handle Group Overage for Azure Entra Authentication by [@WhammyLeaf](https://github.com/WhammyLeaf) in [#11557](https://github.com/danny-avila/LibreChat/pull/11557)
|
||||
* 🌙 Accessible Contrast for Theme Switcher Icons by [@dustinhealy](https://github.com/dustinhealy) in [#11795](https://github.com/danny-avila/LibreChat/pull/11795)
|
||||
* 👻 Prevent Async Title Generation From Recreating Deleted Conversations by [@danny-avila](https://github.com/danny-avila) in [#11797](https://github.com/danny-avila/LibreChat/pull/11797)
|
||||
* 🎛️ Google JSON Schema Normalization/Resolution Logic by [@danny-avila](https://github.com/danny-avila) in [#11804](https://github.com/danny-avila/LibreChat/pull/11804)
|
||||
* 🪂 Handle MongoDB Connection Errors to Prevent Process Crashes by [@SharpLu](https://github.com/SharpLu) in [#11809](https://github.com/danny-avila/LibreChat/pull/11809)
|
||||
* 🪪 Pass Scope in OpenID Refresh Token Grant for Azure Custom API by [@seung-myung](https://github.com/seung-myung) in [#11770](https://github.com/danny-avila/LibreChat/pull/11770)
|
||||
* 🐛 Normalize `output_text` blocks in Responses API input conversion by [@danny-avila](https://github.com/danny-avila) in [#11835](https://github.com/danny-avila/LibreChat/pull/11835)
|
||||
* 🪹 Prevent whitespace-only Chat input Submissions by [@dobernike](https://github.com/dobernike) in [#11838](https://github.com/danny-avila/LibreChat/pull/11838)
|
||||
* 🔗 Preserve Stream State Across Reconnects to Prevent Reorder Buffer Desync by [@danny-avila](https://github.com/danny-avila) in [#11842](https://github.com/danny-avila/LibreChat/pull/11842)
|
||||
* 🧭 Robust 404 Conversation Not Found Redirect by [@danny-avila](https://github.com/danny-avila) in [#11853](https://github.com/danny-avila/LibreChat/pull/11853)
|
||||
* 🧬 Backfill Missing SHARE Permissions and Migrate Legacy SHARED_GLOBAL Fields by [@danny-avila](https://github.com/danny-avila) in [#11854](https://github.com/danny-avila/LibreChat/pull/11854)
|
||||
* 💡 System Theme Picker Selection by [@dustinhealy](https://github.com/dustinhealy) in [#11220](https://github.com/danny-avila/LibreChat/pull/11220)
|
||||
|
||||
### 🔧 Refactoring
|
||||
|
||||
* 🧩 Tool Context Builders for Web Search & Image Gen by [@danny-avila](https://github.com/danny-avila) in [#11644](https://github.com/danny-avila/LibreChat/pull/11644)
|
||||
* ✈️ Single-Flight Deduplication for MCP Server Configs and Optimize Redis Batch Fetching by [@danny-avila](https://github.com/danny-avila) in [#11628](https://github.com/danny-avila/LibreChat/pull/11628)
|
||||
* 🔄 Sequential Event Ordering in Redis Streaming Mode by [@danny-avila](https://github.com/danny-avila) in [#11650](https://github.com/danny-avila/LibreChat/pull/11650)
|
||||
* 🪙 Distinguish ID Tokens from Access Tokens in OIDC Federated Auth by [@jlevy](https://github.com/jlevy) in [#11711](https://github.com/danny-avila/LibreChat/pull/11711)
|
||||
* 🗃️ Separate Tool Cache Namespace for Blue/Green Deployments by [@danny-avila](https://github.com/danny-avila) in [#11738](https://github.com/danny-avila/LibreChat/pull/11738)
|
||||
* 📳 Optimize Model Selector by [@danny-avila](https://github.com/danny-avila) in [#11787](https://github.com/danny-avila/LibreChat/pull/11787)
|
||||
* 🗨️ Better Whitespace handling in Chat Message rendering by [@danny-avila](https://github.com/danny-avila) in [#11791](https://github.com/danny-avila/LibreChat/pull/11791)
|
||||
* 🗂️ Artifacts via Model Specs & Scope Badge Persistence by Spec Context by [@danny-avila](https://github.com/danny-avila) in [#11796](https://github.com/danny-avila/LibreChat/pull/11796)
|
||||
* 🥠 Always set OIDC refresh token cookie to survive session expiry by [@danny-avila](https://github.com/danny-avila) in [#11810](https://github.com/danny-avila/LibreChat/pull/11810)
|
||||
* 🪆 Internalize Producer Event Handling into Agent Graph Context by [@danny-avila](https://github.com/danny-avila) in [#11816](https://github.com/danny-avila/LibreChat/pull/11816)
|
||||
* ⚛️ Redis Scalability Improvements for High-Throughput Deployments by [@danny-avila](https://github.com/danny-avila) in [#11840](https://github.com/danny-avila/LibreChat/pull/11840)
|
||||
* ♻️ On-demand MCP connections: remove proactive reconnect, default to available by [@danny-avila](https://github.com/danny-avila) in [#11839](https://github.com/danny-avila/LibreChat/pull/11839)
|
||||
|
||||
### ⚙️ Other Changes
|
||||
|
||||
* 🗑️ Remove Dev Artifacts for Deferred Tools Capability by [@danny-avila](https://github.com/danny-avila) in [#11601](https://github.com/danny-avila/LibreChat/pull/11601)
|
||||
* 🔓 Comment Out MCP Permissions in `librechat.example.yaml` by [@dustinhealy](https://github.com/dustinhealy) in [#11620](https://github.com/danny-avila/LibreChat/pull/11620)
|
||||
* ⚠️ Remove Deprecated `forcePrompt` setting by [@danny-avila](https://github.com/danny-avila) in [#11622](https://github.com/danny-avila/LibreChat/pull/11622)
|
||||
* 🎭 Padding to Maskable Icon for Android adaptive icons by [@hellojaccc](https://github.com/hellojaccc) in [#11626](https://github.com/danny-avila/LibreChat/pull/11626)
|
||||
* 🪢 Add Langfuse to `.env.example` by [@jannikmaierhoefer](https://github.com/jannikmaierhoefer) in [#11632](https://github.com/danny-avila/LibreChat/pull/11632)
|
||||
* 🧽 Remove deprecated Claude models from Default List by [@saneroen](https://github.com/saneroen) in [#11639](https://github.com/danny-avila/LibreChat/pull/11639)
|
||||
* 🔱 Harden API Routes Against IDOR and DoS Attacks by [@danny-avila](https://github.com/danny-avila) in [#11760](https://github.com/danny-avila/LibreChat/pull/11760)
|
||||
* ♿ Enhance MCP dialog accessibility and styling consistency by [@berry-13](https://github.com/berry-13) in [#11585](https://github.com/danny-avila/LibreChat/pull/11585)
|
||||
* 📋 Document Uncaught Exception Config and Fix Empty Text Export by [@danny-avila](https://github.com/danny-avila) in [#11812](https://github.com/danny-avila/LibreChat/pull/11812)
|
||||
* 📦 Bump `@librechat/agents` to v3.1.33–v3.1.45, `@modelcontextprotocol/sdk` to v1.26.0, `axios`, `fast-xml-parser`, and other dependencies by [@danny-avila](https://github.com/danny-avila) in [#11606](https://github.com/danny-avila/LibreChat/pull/11606), [#11623](https://github.com/danny-avila/LibreChat/pull/11623), [#11630](https://github.com/danny-avila/LibreChat/pull/11630), [#11636](https://github.com/danny-avila/LibreChat/pull/11636), [#11665](https://github.com/danny-avila/LibreChat/pull/11665), [#11723](https://github.com/danny-avila/LibreChat/pull/11723), [#11759](https://github.com/danny-avila/LibreChat/pull/11759), [#11790](https://github.com/danny-avila/LibreChat/pull/11790), [#11805](https://github.com/danny-avila/LibreChat/pull/11805), [#11811](https://github.com/danny-avila/LibreChat/pull/11811), [#11815](https://github.com/danny-avila/LibreChat/pull/11815), [#11836](https://github.com/danny-avila/LibreChat/pull/11836), [#11841](https://github.com/danny-avila/LibreChat/pull/11841)
|
||||
|
||||
### 🌍 Internationalization
|
||||
|
||||
* 🌍 i18n: Support for Icelandic, Lithuanian, Nynorsk and Slovak languages by [@berry-13](https://github.com/berry-13) in [#11649](https://github.com/danny-avila/LibreChat/pull/11649)
|
||||
* 🌍 i18n: Update translation.json with latest translations by [@github-actions[bot]](https://github.com/apps/github-actions) in [#11655](https://github.com/danny-avila/LibreChat/pull/11655), [#11672](https://github.com/danny-avila/LibreChat/pull/11672), [#11739](https://github.com/danny-avila/LibreChat/pull/11739), [#11813](https://github.com/danny-avila/LibreChat/pull/11813), [#11831](https://github.com/danny-avila/LibreChat/pull/11831)
|
||||
|
||||
## New Contributors
|
||||
|
||||
* [@hellojaccc](https://github.com/hellojaccc) made their first contribution in [#11626](https://github.com/danny-avila/LibreChat/pull/11626)
|
||||
* [@jannikmaierhoefer](https://github.com/jannikmaierhoefer) made their first contribution in [#11632](https://github.com/danny-avila/LibreChat/pull/11632)
|
||||
* [@saneroen](https://github.com/saneroen) made their first contribution in [#11639](https://github.com/danny-avila/LibreChat/pull/11639)
|
||||
* [@flyinggrizzly](https://github.com/flyinggrizzly) made their first contribution in [#11669](https://github.com/danny-avila/LibreChat/pull/11669)
|
||||
* [@jlevy](https://github.com/jlevy) made their first contribution in [#11711](https://github.com/danny-avila/LibreChat/pull/11711)
|
||||
* [@calkeo](https://github.com/calkeo) made their first contribution in [#11680](https://github.com/danny-avila/LibreChat/pull/11680)
|
||||
* [@bhat-ganesh](https://github.com/bhat-ganesh) made their first contribution in [#11741](https://github.com/danny-avila/LibreChat/pull/11741)
|
||||
* [@seung-myung](https://github.com/seung-myung) made their first contribution in [#11770](https://github.com/danny-avila/LibreChat/pull/11770)
|
||||
* [@dobernike](https://github.com/dobernike) made their first contribution in [#11838](https://github.com/danny-avila/LibreChat/pull/11838)
|
||||
|
||||
**Full Changelog**: https://github.com/danny-avila/LibreChat/compare/v0.8.2...v0.8.3-rc1
|
||||
@@ -78,7 +78,7 @@ AZURE_CONTAINER_NAME=files
|
||||
Update your LibreChat configuration file (`librechat.yaml`) to specify that the application should use Azure Blob Storage for file handling:
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
fileStrategy: "azure_blob"
|
||||
```
|
||||
|
||||
@@ -108,7 +108,7 @@ FIREBASE_APP_ID=1:your_app_id #appId
|
||||
Finally, to enable the app use Firebase, you must set the following in your `librechat.yaml` config file.
|
||||
|
||||
```yaml
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
fileStrategy: "firebase"
|
||||
```
|
||||
|
||||
@@ -106,7 +106,7 @@ If you are using **IRSA** on Kubernetes, you do **not** need to set `AWS_ACCESS_
|
||||
Update your LibreChat configuration file (`librechat.yaml`) to specify that the application should use Amazon S3 for file handling:
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
fileStrategy: "s3"
|
||||
```
|
||||
|
||||
@@ -255,6 +255,20 @@ By default, LibreChat will exit with an error (exit code 1) if the `librechat.ya
|
||||
Using `CONFIG_BYPASS_VALIDATION=true` is not recommended for production environments. It is intended as a temporary workaround while debugging configuration issues. Always fix validation errors in your configuration file.
|
||||
</Callout>
|
||||
|
||||
### Uncaught Exception Handling
|
||||
|
||||
By default, LibreChat will exit the process when an uncaught exception occurs, which is the standard Node.js behavior. You can override this to keep the app running after uncaught exceptions.
|
||||
|
||||
<OptionTable
|
||||
options={[
|
||||
['CONTINUE_ON_UNCAUGHT_EXCEPTION', 'boolean', 'When set to `true`, the app will continue running after encountering uncaught exceptions instead of exiting the process.', '# CONTINUE_ON_UNCAUGHT_EXCEPTION=false'],
|
||||
]}
|
||||
/>
|
||||
|
||||
<Callout type="warning" title="Warning">
|
||||
Not recommended for production unless necessary. Uncaught exceptions may leave the application in an unpredictable state.
|
||||
</Callout>
|
||||
|
||||
## Endpoints
|
||||
In this section, you can configure the endpoints and models selection, their API keys, and the proxy and reverse proxy settings for the endpoints that support it.
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ icon: FileCode
|
||||
This example config includes all documented endpoints (Except Azure, LiteLLM, MLX, and Ollama, which all require additional configurations)
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
|
||||
cache: true
|
||||
|
||||
@@ -273,7 +273,7 @@ This example configuration file sets up LibreChat with detailed options across s
|
||||
# https://www.librechat.ai/docs/configuration/librechat_yaml
|
||||
|
||||
# Configuration version (required)
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
|
||||
# Cache settings: Set to true to enable caching
|
||||
cache: true
|
||||
|
||||
@@ -47,7 +47,7 @@ For more information about agent steps, see [Max Agent Steps](/docs/features/age
|
||||
]}
|
||||
/>
|
||||
|
||||
**Default:** If omitted, defaults to the value of recursionLimit or 25 if recursionLimit is also omitted.
|
||||
**Default:** If omitted, defaults to the value of recursionLimit or 50 if recursionLimit is also omitted.
|
||||
|
||||
**Example:**
|
||||
```yaml filename="endpoints / agents / maxRecursionLimit"
|
||||
|
||||
@@ -73,6 +73,66 @@ availableRegions:
|
||||
- "us-west-2"
|
||||
```
|
||||
|
||||
## models
|
||||
|
||||
**Key:**
|
||||
<OptionTable
|
||||
options={[
|
||||
['models', 'Array of Strings', 'Specifies custom model IDs available for the Bedrock endpoint.', 'When provided, these models appear in the model selector for Bedrock.'],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Default:** Not specified (uses default Bedrock model list)
|
||||
|
||||
**Example:**
|
||||
```yaml filename="models"
|
||||
endpoints:
|
||||
bedrock:
|
||||
models:
|
||||
- "anthropic.claude-sonnet-4-20250514-v1:0"
|
||||
- "anthropic.claude-haiku-4-20250514-v1:0"
|
||||
- "us.anthropic.claude-sonnet-4-20250514-v1:0"
|
||||
```
|
||||
|
||||
## inferenceProfiles
|
||||
|
||||
**Key:**
|
||||
<OptionTable
|
||||
options={[
|
||||
['inferenceProfiles', 'Object (Record)', 'Maps model IDs to inference profile ARNs for cross-region inference. Keys are model IDs and values are the inference profile ARN or an environment variable reference.', 'When a selected model matches a key, the corresponding ARN is used as the application inference profile.'],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Default:** Not specified
|
||||
|
||||
**Example:**
|
||||
```yaml filename="inferenceProfiles"
|
||||
endpoints:
|
||||
bedrock:
|
||||
inferenceProfiles:
|
||||
"us.anthropic.claude-sonnet-4-20250514-v1:0": "${BEDROCK_INFERENCE_PROFILE_CLAUDE_SONNET}"
|
||||
"anthropic.claude-3-7-sonnet-20250219-v1:0": "arn:aws:bedrock:us-west-2:123456789012:application-inference-profile/abc123"
|
||||
```
|
||||
|
||||
**Notes:**
|
||||
- Inference profiles enable cross-region inference, allowing you to route requests to models in different AWS regions
|
||||
- Values support environment variable interpolation with `${ENV_VAR}` syntax
|
||||
- The model ID in the key must match the model selected by the user in the UI
|
||||
- Use with the `models` field to make cross-region model IDs available in the model selector
|
||||
- For a complete guide on creating and managing inference profiles, see [AWS Bedrock Inference Profiles](/docs/configuration/pre_configured_ai/bedrock_inference_profiles)
|
||||
|
||||
**Combined Example:**
|
||||
```yaml filename="Bedrock with inference profiles"
|
||||
endpoints:
|
||||
bedrock:
|
||||
models:
|
||||
- "us.anthropic.claude-sonnet-4-20250514-v1:0"
|
||||
- "us.anthropic.claude-haiku-4-20250514-v1:0"
|
||||
inferenceProfiles:
|
||||
"us.anthropic.claude-sonnet-4-20250514-v1:0": "${BEDROCK_CLAUDE_SONNET_PROFILE}"
|
||||
"us.anthropic.claude-haiku-4-20250514-v1:0": "${BEDROCK_CLAUDE_HAIKU_PROFILE}"
|
||||
```
|
||||
|
||||
## guardrailConfig
|
||||
|
||||
**Key:**
|
||||
|
||||
@@ -10,7 +10,7 @@ icon: Settings
|
||||
|
||||
<OptionTable
|
||||
options={[
|
||||
['version', 'String', 'Specifies the version of the configuration file.', 'version: 1.2.9' ],
|
||||
['version', 'String', 'Specifies the version of the configuration file.', 'version: 1.3.4' ],
|
||||
]}
|
||||
/>
|
||||
|
||||
|
||||
@@ -423,6 +423,41 @@ interface:
|
||||
public: false
|
||||
```
|
||||
|
||||
## remoteAgents
|
||||
|
||||
Controls access to the Agents API (OpenAI-compatible and Open Responses API endpoints), which allows external applications to interact with LibreChat agents programmatically via API keys.
|
||||
|
||||
**Key:**
|
||||
<OptionTable
|
||||
options={[
|
||||
['remoteAgents', 'Object', 'Configuration for remote agent API access control. All fields default to `false`.', ''],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Sub-keys:**
|
||||
<OptionTable
|
||||
options={[
|
||||
['use', 'Boolean', 'Controls whether users can access the remote agents API.', 'false'],
|
||||
['create', 'Boolean', 'Controls whether users can create API keys for remote agents.', 'false'],
|
||||
['share', 'Boolean', 'Controls whether users can share remote agents.', 'false'],
|
||||
['public', 'Boolean', 'Controls whether users can share remote agents publicly.', 'false'],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Default:** All fields default to `false` (disabled).
|
||||
|
||||
**Example:**
|
||||
```yaml filename="interface / remoteAgents"
|
||||
interface:
|
||||
remoteAgents:
|
||||
use: true
|
||||
create: true
|
||||
share: false
|
||||
public: false
|
||||
```
|
||||
|
||||
**Note:** Admin users have all remote agent permissions enabled by default regardless of this configuration.
|
||||
|
||||
## temporaryChat
|
||||
|
||||
Controls whether the temporary chat feature is available to users. Temporary chats are not saved to conversation history and are automatically deleted after a configurable retention period.
|
||||
|
||||
@@ -193,7 +193,7 @@ When using custom agent configuration, the following fields are available:
|
||||
Here's a comprehensive example showing all memory configuration options:
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
|
||||
memory:
|
||||
|
||||
@@ -424,6 +424,31 @@ modelSpecs:
|
||||
|
||||
---
|
||||
|
||||
### artifacts
|
||||
|
||||
<OptionTable
|
||||
options={[
|
||||
['artifacts', 'String | Boolean', 'Enables the Artifacts capability for this model spec and optionally sets the artifact mode.', 'Set to `true` to enable with the default mode, `false` or omit to disable, or a specific mode string (e.g., `"default"`) to enable with that mode.'],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Description:**
|
||||
Enables the Artifacts capability for this model spec, allowing the model to generate and display interactive artifacts such as React components, HTML, and Mermaid diagrams. When set to `true`, the default artifact mode is used. You can also specify a mode string directly.
|
||||
|
||||
**Example:**
|
||||
```yaml filename="modelSpecs / artifacts"
|
||||
modelSpecs:
|
||||
list:
|
||||
- name: "artifact-assistant"
|
||||
label: "Artifact Assistant"
|
||||
artifacts: true
|
||||
preset:
|
||||
endpoint: "openAI"
|
||||
model: "gpt-4o"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### preset
|
||||
|
||||
<OptionTable
|
||||
@@ -707,7 +732,7 @@ preset:
|
||||
> **Note:** Each parameter below includes a note on which endpoints support it.
|
||||
> **OpenAI / AzureOpenAI / Custom** typically support `temperature`, `presence_penalty`, `frequency_penalty`, `stop`, `top_p`, `max_tokens`.
|
||||
> **Google / Anthropic** typically support `topP`, `topK`, `maxOutputTokens`.
|
||||
> **Anthropic / Bedrock (Anthropic models)** support `promptCache`.
|
||||
> **Anthropic / Bedrock (Anthropic and Nova models)** support `promptCache`.
|
||||
> **Bedrock** supports `region`, `maxTokens`, and a few others.
|
||||
|
||||
#### model
|
||||
@@ -1085,6 +1110,28 @@ preset:
|
||||
|
||||
---
|
||||
|
||||
#### effort
|
||||
|
||||
> **Supported by:** `anthropic`, `bedrock` (Anthropic models)
|
||||
|
||||
<OptionTable
|
||||
options={[
|
||||
['effort', 'String', 'Controls the Adaptive Thinking effort level for supported Anthropic models (e.g., Claude Opus 4.6). Higher effort levels allocate more thinking tokens for complex problems.', ''],
|
||||
]}
|
||||
/>
|
||||
|
||||
**Options:** `""` (unset/auto), `"low"`, `"medium"`, `"high"`, `"max"`
|
||||
|
||||
**Default:** `""` (unset — model decides)
|
||||
|
||||
**Example:**
|
||||
```yaml
|
||||
preset:
|
||||
effort: "high"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
#### thinking
|
||||
|
||||
> **Supported by:** `google`, `anthropic`, `bedrock` (Anthropic models)
|
||||
|
||||
@@ -83,6 +83,21 @@ endpoints:
|
||||
- `trace`: (Optional) Enable trace logging: `"enabled"`, `"disabled"`, or `"enabled_full"`.
|
||||
- See [AWS Bedrock Guardrails documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-how.html) for creating and managing guardrails.
|
||||
|
||||
## Inference Profiles
|
||||
|
||||
AWS Bedrock inference profiles let you create custom routing configurations for foundation models, enabling cross-region load balancing, cost allocation, and compliance controls. You can map model IDs to custom inference profile ARNs in your `librechat.yaml`:
|
||||
|
||||
```yaml
|
||||
endpoints:
|
||||
bedrock:
|
||||
inferenceProfiles:
|
||||
"us.anthropic.claude-3-7-sonnet-20250219-v1:0": "${BEDROCK_CLAUDE_37_PROFILE}"
|
||||
```
|
||||
|
||||
For the full guide on creating profiles, configuring LibreChat, setting up logging, and troubleshooting, see **[Bedrock Inference Profiles](/docs/configuration/pre_configured_ai/bedrock_inference_profiles)**.
|
||||
|
||||
For the YAML field reference, see **[AWS Bedrock Object Structure](/docs/configuration/librechat_yaml/object_structure/aws_bedrock#inferenceprofiles)**.
|
||||
|
||||
## Notes
|
||||
|
||||
- The following models are not supported due to lack of streaming capability:
|
||||
|
||||
@@ -0,0 +1,464 @@
|
||||
---
|
||||
title: Bedrock Inference Profiles
|
||||
icon: Bot
|
||||
description: Configure and use AWS Bedrock custom inference profiles with LibreChat for cross-region load balancing, cost allocation, and compliance controls.
|
||||
---
|
||||
|
||||
This guide explains how to configure and use AWS Bedrock custom inference profiles with LibreChat, allowing you to route model requests through custom application inference profiles for better control, cost allocation, and cross-region load balancing.
|
||||
|
||||
## Overview
|
||||
|
||||
AWS Bedrock inference profiles allow you to create custom routing configurations for foundation models. When you create a custom (application) inference profile, AWS generates a unique ARN that doesn't contain model name information:
|
||||
|
||||
```
|
||||
arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123def456
|
||||
```
|
||||
|
||||
LibreChat's inference profile mapping feature allows you to:
|
||||
1. Map friendly model IDs to custom inference profile ARNs
|
||||
2. Route requests through your custom profiles while maintaining model capability detection
|
||||
3. Use environment variables for secure ARN management
|
||||
|
||||
## Why Use Custom Inference Profiles?
|
||||
|
||||
| Benefit | Description |
|
||||
|---------|-------------|
|
||||
| **Cross-Region Load Balancing** | Automatically distribute requests across multiple AWS regions |
|
||||
| **Cost Allocation** | Tag and track costs per application or team |
|
||||
| **Throughput Management** | Configure dedicated throughput for your applications |
|
||||
| **Compliance** | Route requests through specific regions for data residency |
|
||||
| **Monitoring** | Track usage per inference profile in CloudWatch |
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before you begin, ensure you have:
|
||||
|
||||
1. **AWS Account** with Bedrock access enabled
|
||||
2. **AWS CLI** installed and configured
|
||||
3. **IAM Permissions**:
|
||||
- `bedrock:CreateInferenceProfile`
|
||||
- `bedrock:ListInferenceProfiles`
|
||||
- `bedrock:GetInferenceProfile`
|
||||
- `bedrock:InvokeModel` / `bedrock:InvokeModelWithResponseStream`
|
||||
4. **LibreChat** with Bedrock endpoint configured (see [AWS Bedrock Setup](/docs/configuration/pre_configured_ai/bedrock))
|
||||
|
||||
## Creating Custom Inference Profiles
|
||||
|
||||
> **Important**: Custom inference profiles can only be created via API (AWS CLI, SDK, etc.) and cannot be created from the AWS Console.
|
||||
|
||||
### Method 1: AWS CLI (Recommended)
|
||||
|
||||
#### Step 1: List Available System Inference Profiles
|
||||
|
||||
```bash
|
||||
# List all inference profiles
|
||||
aws bedrock list-inference-profiles --region us-east-1
|
||||
|
||||
# Filter for Claude models
|
||||
aws bedrock list-inference-profiles --region us-east-1 \
|
||||
--query "inferenceProfileSummaries[?contains(inferenceProfileId, 'claude')]"
|
||||
```
|
||||
|
||||
#### Step 2: Create a Custom Inference Profile
|
||||
|
||||
```bash
|
||||
# Get the system inference profile ARN to copy from
|
||||
export SOURCE_PROFILE_ARN=$(aws bedrock list-inference-profiles --region us-east-1 \
|
||||
--query "inferenceProfileSummaries[?inferenceProfileId=='us.anthropic.claude-3-7-sonnet-20250219-v1:0'].inferenceProfileArn" \
|
||||
--output text)
|
||||
|
||||
# Create your custom inference profile
|
||||
aws bedrock create-inference-profile \
|
||||
--inference-profile-name "MyApp-Claude-3-7-Sonnet" \
|
||||
--description "Custom inference profile for my application" \
|
||||
--model-source copyFrom="$SOURCE_PROFILE_ARN" \
|
||||
--region us-east-1
|
||||
```
|
||||
|
||||
#### Step 3: Verify Creation
|
||||
|
||||
```bash
|
||||
# List your custom profiles
|
||||
aws bedrock list-inference-profiles --type-equals APPLICATION --region us-east-1
|
||||
|
||||
# Get details of a specific profile
|
||||
aws bedrock get-inference-profile \
|
||||
--inference-profile-identifier "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123" \
|
||||
--region us-east-1
|
||||
```
|
||||
|
||||
### Method 2: Python Script
|
||||
|
||||
```python
|
||||
import boto3
|
||||
|
||||
AWS_REGION = 'us-east-1'
|
||||
|
||||
def create_inference_profile(profile_name: str, source_model_id: str):
|
||||
"""
|
||||
Create a custom inference profile for LibreChat.
|
||||
|
||||
Args:
|
||||
profile_name: Name for your custom profile
|
||||
source_model_id: The system inference profile ID to copy from
|
||||
(e.g., 'us.anthropic.claude-3-7-sonnet-20250219-v1:0')
|
||||
"""
|
||||
bedrock = boto3.client('bedrock', region_name=AWS_REGION)
|
||||
|
||||
profiles = bedrock.list_inference_profiles()
|
||||
source_arn = None
|
||||
for profile in profiles['inferenceProfileSummaries']:
|
||||
if profile['inferenceProfileId'] == source_model_id:
|
||||
source_arn = profile['inferenceProfileArn']
|
||||
break
|
||||
|
||||
if not source_arn:
|
||||
raise ValueError(f"Source profile {source_model_id} not found")
|
||||
|
||||
response = bedrock.create_inference_profile(
|
||||
inferenceProfileName=profile_name,
|
||||
description=f'Custom inference profile for {profile_name}',
|
||||
modelSource={'copyFrom': source_arn},
|
||||
tags=[
|
||||
{'key': 'Application', 'value': 'LibreChat'},
|
||||
{'key': 'Environment', 'value': 'Production'}
|
||||
]
|
||||
)
|
||||
|
||||
print(f"Created profile: {response['inferenceProfileArn']}")
|
||||
return response['inferenceProfileArn']
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_inference_profile(
|
||||
"LibreChat-Claude-3-7-Sonnet",
|
||||
"us.anthropic.claude-3-7-sonnet-20250219-v1:0"
|
||||
)
|
||||
create_inference_profile(
|
||||
"LibreChat-Claude-Sonnet-4-5",
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0"
|
||||
)
|
||||
```
|
||||
|
||||
## Configuring LibreChat
|
||||
|
||||
### librechat.yaml Configuration
|
||||
|
||||
Add the `bedrock` endpoint configuration to your `librechat.yaml`. For full field reference, see [AWS Bedrock Object Structure](/docs/configuration/librechat_yaml/object_structure/aws_bedrock).
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
endpoints:
|
||||
bedrock:
|
||||
# List the models you want available in the UI
|
||||
models:
|
||||
- "us.anthropic.claude-3-7-sonnet-20250219-v1:0"
|
||||
- "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
|
||||
- "global.anthropic.claude-opus-4-5-20251101-v1:0"
|
||||
# Map model IDs to their custom inference profile ARNs
|
||||
inferenceProfiles:
|
||||
# Using environment variable (recommended for security)
|
||||
"us.anthropic.claude-3-7-sonnet-20250219-v1:0": "${BEDROCK_CLAUDE_37_PROFILE}"
|
||||
# Using direct ARN
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123"
|
||||
# Another env variable example
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": "${BEDROCK_OPUS_45_PROFILE}"
|
||||
# Optional: Configure available regions for cross-region inference
|
||||
availableRegions:
|
||||
- "us-east-1"
|
||||
- "us-west-2"
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Add your AWS credentials and inference profile ARNs to your `.env` file:
|
||||
|
||||
```bash filename=".env"
|
||||
#===================================#
|
||||
# AWS Bedrock Configuration #
|
||||
#===================================#
|
||||
|
||||
# AWS Credentials
|
||||
BEDROCK_AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
|
||||
BEDROCK_AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
||||
BEDROCK_AWS_DEFAULT_REGION=us-east-1
|
||||
|
||||
# Optional: Session token for temporary credentials
|
||||
# BEDROCK_AWS_SESSION_TOKEN=your-session-token
|
||||
|
||||
# Inference Profile ARNs
|
||||
BEDROCK_CLAUDE_37_PROFILE=arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
|
||||
BEDROCK_OPUS_45_PROFILE=arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/def456
|
||||
```
|
||||
|
||||
## Setting Up Logging
|
||||
|
||||
To verify that your inference profiles are being used correctly, enable AWS Bedrock model invocation logging.
|
||||
|
||||
### 1. Create CloudWatch Log Group
|
||||
|
||||
```bash
|
||||
aws logs create-log-group \
|
||||
--log-group-name /aws/bedrock/model-invocations \
|
||||
--region us-east-1
|
||||
```
|
||||
|
||||
### 2. Create IAM Role for Bedrock Logging
|
||||
|
||||
Create the trust policy file (`bedrock-logging-trust.json`):
|
||||
|
||||
```json filename="bedrock-logging-trust.json"
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Principal": {
|
||||
"Service": "bedrock.amazonaws.com"
|
||||
},
|
||||
"Action": "sts:AssumeRole",
|
||||
"Condition": {
|
||||
"StringEquals": {
|
||||
"aws:SourceAccount": "YOUR_ACCOUNT_ID"
|
||||
},
|
||||
"ArnLike": {
|
||||
"aws:SourceArn": "arn:aws:bedrock:us-east-1:YOUR_ACCOUNT_ID:*"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
Create the role:
|
||||
|
||||
```bash
|
||||
aws iam create-role \
|
||||
--role-name BedrockLoggingRole \
|
||||
--assume-role-policy-document file://bedrock-logging-trust.json
|
||||
```
|
||||
|
||||
Attach CloudWatch Logs permissions:
|
||||
|
||||
```bash
|
||||
aws iam put-role-policy \
|
||||
--role-name BedrockLoggingRole \
|
||||
--policy-name BedrockLoggingPolicy \
|
||||
--policy-document '{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"logs:CreateLogStream",
|
||||
"logs:PutLogEvents"
|
||||
],
|
||||
"Resource": "arn:aws:logs:us-east-1:YOUR_ACCOUNT_ID:log-group:/aws/bedrock/model-invocations:*"
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
Create S3 bucket for large data (required):
|
||||
|
||||
```bash
|
||||
aws s3 mb s3://bedrock-logs-YOUR_ACCOUNT_ID --region us-east-1
|
||||
|
||||
aws iam put-role-policy \
|
||||
--role-name BedrockLoggingRole \
|
||||
--policy-name BedrockS3Policy \
|
||||
--policy-document '{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": ["s3:PutObject"],
|
||||
"Resource": "arn:aws:s3:::bedrock-logs-YOUR_ACCOUNT_ID/*"
|
||||
}
|
||||
]
|
||||
}'
|
||||
```
|
||||
|
||||
### 3. Enable Model Invocation Logging
|
||||
|
||||
```bash
|
||||
aws bedrock put-model-invocation-logging-configuration \
|
||||
--logging-config '{
|
||||
"cloudWatchConfig": {
|
||||
"logGroupName": "/aws/bedrock/model-invocations",
|
||||
"roleArn": "arn:aws:iam::YOUR_ACCOUNT_ID:role/BedrockLoggingRole",
|
||||
"largeDataDeliveryS3Config": {
|
||||
"bucketName": "bedrock-logs-YOUR_ACCOUNT_ID",
|
||||
"keyPrefix": "large-data"
|
||||
}
|
||||
},
|
||||
"textDataDeliveryEnabled": true,
|
||||
"imageDataDeliveryEnabled": true,
|
||||
"embeddingDataDeliveryEnabled": true
|
||||
}' \
|
||||
--region us-east-1
|
||||
```
|
||||
|
||||
Verify logging is enabled:
|
||||
|
||||
```bash
|
||||
aws bedrock get-model-invocation-logging-configuration --region us-east-1
|
||||
```
|
||||
|
||||
## Verifying Your Configuration
|
||||
|
||||
### View Logs via CLI
|
||||
|
||||
After making a request through LibreChat, check the logs:
|
||||
|
||||
```bash
|
||||
# Tail logs in real-time
|
||||
aws logs tail /aws/bedrock/model-invocations --follow --region us-east-1
|
||||
|
||||
# View recent logs
|
||||
aws logs tail /aws/bedrock/model-invocations --since 5m --region us-east-1
|
||||
```
|
||||
|
||||
### What to Look For
|
||||
|
||||
In the log output, look for the `modelId` field:
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2026-01-16T16:56:15Z",
|
||||
"accountId": "123456789012",
|
||||
"region": "us-east-1",
|
||||
"requestId": "a8b9d8c9-87b3-41ea-8a02-e8bfdba7782f",
|
||||
"operation": "ConverseStream",
|
||||
"modelId": "arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123",
|
||||
"inferenceRegion": "us-west-2"
|
||||
}
|
||||
```
|
||||
|
||||
**Success indicators:**
|
||||
- `modelId` shows your custom inference profile ARN (contains `application-inference-profile`)
|
||||
- `inferenceRegion` may vary (shows cross-region routing is working)
|
||||
|
||||
**If mapping isn't working:**
|
||||
- `modelId` will show the raw model ID instead of the ARN
|
||||
|
||||
### View Logs via AWS Console
|
||||
|
||||
1. Open **CloudWatch** in the AWS Console
|
||||
2. Navigate to **Logs** > **Log groups**
|
||||
3. Select `/aws/bedrock/model-invocations`
|
||||
4. Click on the latest log stream
|
||||
5. Search for your inference profile ID
|
||||
|
||||
## Monitoring Usage
|
||||
|
||||
### CloudWatch Metrics
|
||||
|
||||
View Bedrock metrics in CloudWatch:
|
||||
|
||||
```bash
|
||||
aws cloudwatch list-metrics --namespace AWS/Bedrock --region us-east-1
|
||||
```
|
||||
|
||||
### AWS Console
|
||||
|
||||
1. **Bedrock Console** > **Inference profiles** > **Application** tab
|
||||
2. Click on your custom profile
|
||||
3. View invocation metrics and usage statistics
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
| Issue | Cause | Solution |
|
||||
|-------|-------|----------|
|
||||
| Model not recognized | Missing model in `models` array | Add the model ID to `models` in librechat.yaml |
|
||||
| ARN not being used | Model ID doesn't match | Ensure the model ID in `inferenceProfiles` exactly matches what's in `models` |
|
||||
| Env variable not resolved | Typo or not set | Check `.env` file and ensure variable name matches `${VAR_NAME}` |
|
||||
| Access Denied | Missing IAM permissions | Add `bedrock:InvokeModel*` permissions for the inference profile ARN |
|
||||
| Profile not found | Wrong region | Ensure you're creating/using profiles in the same region |
|
||||
|
||||
### Debug Checklist
|
||||
|
||||
1. Model ID is in the `models` array
|
||||
2. Model ID in `inferenceProfiles` exactly matches (case-sensitive)
|
||||
3. Environment variable is set (if using `${VAR}` syntax)
|
||||
4. AWS credentials have permission to invoke the inference profile
|
||||
5. LibreChat has been restarted after config changes
|
||||
|
||||
### Verify Config Loading
|
||||
|
||||
Check that your config is being read correctly by examining the server logs when LibreChat starts.
|
||||
|
||||
## Complete Example
|
||||
|
||||
### librechat.yaml
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.3.4
|
||||
|
||||
endpoints:
|
||||
bedrock:
|
||||
models:
|
||||
- "us.anthropic.claude-3-7-sonnet-20250219-v1:0"
|
||||
- "us.anthropic.claude-sonnet-4-5-20250929-v1:0"
|
||||
- "global.anthropic.claude-opus-4-5-20251101-v1:0"
|
||||
- "us.amazon.nova-pro-v1:0"
|
||||
inferenceProfiles:
|
||||
"us.anthropic.claude-3-7-sonnet-20250219-v1:0": "${BEDROCK_CLAUDE_37_PROFILE}"
|
||||
"us.anthropic.claude-sonnet-4-5-20250929-v1:0": "${BEDROCK_SONNET_45_PROFILE}"
|
||||
"global.anthropic.claude-opus-4-5-20251101-v1:0": "${BEDROCK_OPUS_45_PROFILE}"
|
||||
availableRegions:
|
||||
- "us-east-1"
|
||||
- "us-west-2"
|
||||
```
|
||||
|
||||
### .env
|
||||
|
||||
```bash filename=".env"
|
||||
# AWS Bedrock
|
||||
BEDROCK_AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
|
||||
BEDROCK_AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
|
||||
BEDROCK_AWS_DEFAULT_REGION=us-east-1
|
||||
|
||||
# Inference Profiles
|
||||
BEDROCK_CLAUDE_37_PROFILE=arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/abc123
|
||||
BEDROCK_SONNET_45_PROFILE=arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/def456
|
||||
BEDROCK_OPUS_45_PROFILE=arn:aws:bedrock:us-east-1:123456789012:application-inference-profile/ghi789
|
||||
```
|
||||
|
||||
### Quick Setup Script
|
||||
|
||||
```bash filename="setup-bedrock-profiles.sh"
|
||||
#!/bin/bash
|
||||
|
||||
REGION="us-east-1"
|
||||
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
|
||||
|
||||
# Create inference profiles
|
||||
for MODEL in "us.anthropic.claude-3-7-sonnet-20250219-v1:0" "us.anthropic.claude-sonnet-4-5-20250929-v1:0"; do
|
||||
PROFILE_NAME="LibreChat-${MODEL//[.:]/-}"
|
||||
SOURCE_ARN=$(aws bedrock list-inference-profiles --region $REGION \
|
||||
--query "inferenceProfileSummaries[?inferenceProfileId=='$MODEL'].inferenceProfileArn" \
|
||||
--output text)
|
||||
if [ -n "$SOURCE_ARN" ]; then
|
||||
echo "Creating profile for $MODEL..."
|
||||
aws bedrock create-inference-profile \
|
||||
--inference-profile-name "$PROFILE_NAME" \
|
||||
--model-source copyFrom="$SOURCE_ARN" \
|
||||
--region $REGION
|
||||
fi
|
||||
done
|
||||
|
||||
# List created profiles
|
||||
echo ""
|
||||
echo "Your custom inference profiles:"
|
||||
aws bedrock list-inference-profiles --type-equals APPLICATION --region $REGION \
|
||||
--query "inferenceProfileSummaries[].{Name:inferenceProfileName,ARN:inferenceProfileArn}" \
|
||||
--output table
|
||||
```
|
||||
|
||||
## Related Resources
|
||||
|
||||
- [AWS Bedrock Inference Profiles Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles.html)
|
||||
- [AWS Bedrock Object Structure](/docs/configuration/librechat_yaml/object_structure/aws_bedrock) - YAML config field reference
|
||||
- [AWS Bedrock Setup](/docs/configuration/pre_configured_ai/bedrock) - Basic Bedrock configuration
|
||||
- [AWS Bedrock Model Invocation Logging](https://docs.aws.amazon.com/bedrock/latest/userguide/model-invocation-logging.html)
|
||||
@@ -7,6 +7,7 @@
|
||||
"openai",
|
||||
"google",
|
||||
"bedrock",
|
||||
"bedrock_inference_profiles",
|
||||
"assistants"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ The balance system in LibreChat allows administrators to configure how token cre
|
||||
### Complete Balance Settings
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
|
||||
# Balance settings
|
||||
balance:
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
---
|
||||
title: AI Agents
|
||||
title: Agents
|
||||
icon: Bot
|
||||
description: Learn how to create, customize, and leverage LibreChat's AI Agents - a powerful framework for building custom AI assistants with any model provider.
|
||||
---
|
||||
|
||||
# Agents: Build Custom AI Assistants
|
||||
|
||||
LibreChat's AI Agents feature provides a flexible framework for creating custom AI assistants powered by various model providers.
|
||||
|
||||
This feature is similar to OpenAI's Assistants API and ChatGPT's GPTs, but with broader model support and a no-code implementation, letting you build sophisticated assistants with specialized capabilities.
|
||||
@@ -110,6 +112,44 @@ Learn More:
|
||||
- [Configuring MCP Servers](/docs/features/mcp)
|
||||
- [Model Context Protocol Introduction](https://modelcontextprotocol.io/introduction)
|
||||
|
||||
### Deferred Tools
|
||||
|
||||
Deferred tools allow agents to have access to many MCP tools without loading them all into the LLM context upfront. Instead, deferred tools are discoverable at runtime via a **Tool Search** mechanism.
|
||||
|
||||
This is especially useful when an agent has access to many MCP servers with dozens of tools—loading them all would consume a large portion of the context window and degrade response quality.
|
||||
|
||||
**How it works:**
|
||||
- Tools marked as "deferred" are excluded from the initial LLM context
|
||||
- A `ToolSearch` tool is automatically added, allowing the LLM to discover and load deferred tools on demand
|
||||
- Once discovered, the tool is available for the rest of the conversation
|
||||
|
||||
**Configuring deferred tools:**
|
||||
1. Open the Agent Builder and add MCP tools
|
||||
2. Click the dropdown on any MCP tool
|
||||
3. Toggle "Defer Loading" — deferred tools show a clock icon
|
||||
|
||||
**Note:** The `deferred_tools` capability is enabled by default. It can be toggled via the [`librechat.yaml` agents configuration](/docs/configuration/librechat_yaml/object_structure/agents#capabilities).
|
||||
|
||||
{/*
|
||||
### Programmatic Tool Calling
|
||||
|
||||
**Note:** this feature is still in private beta and not accessible to all users.
|
||||
|
||||
Programmatic Tool Calling (PTC) allows MCP tools to be executed via code in a sandbox environment rather than being called directly by the LLM. This enables more complex tool orchestration—for example, calling multiple tools in sequence, processing results with code, or building dynamic workflows.
|
||||
|
||||
**How it works:**
|
||||
- Tools marked for "code execution" calling are routed through the Code Interpreter sandbox
|
||||
- The LLM writes code that calls the tools programmatically, allowing for loops, conditionals, and data transformations
|
||||
- Results flow back through the sandbox to the LLM
|
||||
|
||||
**Configuring programmatic tools:**
|
||||
1. Open the Agent Builder and add MCP tools
|
||||
2. Click the dropdown on any MCP tool
|
||||
3. Toggle "Code Execution" calling — programmatic tools show a code icon
|
||||
|
||||
**Note:** The `programmatic_tools` capability is **disabled by default** and requires the latest [Code Interpreter API](/docs/features/code_interpreter). It can be enabled via the [`librechat.yaml` agents configuration](/docs/configuration/librechat_yaml/object_structure/agents#capabilities).
|
||||
*/}
|
||||
|
||||
### Artifacts
|
||||
|
||||
The Artifacts capability enables your agent to generate and display interactive content:
|
||||
@@ -359,9 +399,7 @@ docker-compose exec api npm run migrate:agent-permissions
|
||||
docker-compose exec api npm run migrate:agent-permissions:batch
|
||||
```
|
||||
|
||||
#### 2. For the `deploy-compose.yml` (if you followed the Ubuntu Docker Guide):
|
||||
|
||||
See the [Ubuntu Docker Guide](/docs/remote/docker_linux) for reference.
|
||||
#### 2. For the `deploy-compose.yml` (if you followed the [Ubuntu Docker Guide](/docs/remote/docker_linux)):
|
||||
|
||||
**Preview changes (dry run):**
|
||||
```bash
|
||||
@@ -407,6 +445,12 @@ You can adjust the resulting agent permissions via the Agent Builder UI.
|
||||
The same migration process applies to prompts. If you also have existing prompts, run the prompt permissions migration using the same commands but replace `agent` with `prompt` in the command names.
|
||||
</Callout>
|
||||
|
||||
## Agents API (Beta)
|
||||
|
||||
LibreChat agents can also be accessed programmatically via API, enabling external applications and scripts to interact with your agents using OpenAI-compatible SDKs or the Open Responses format.
|
||||
|
||||
See the [Agents API documentation](/docs/features/agents_api) for setup and usage details.
|
||||
|
||||
## What's next?
|
||||
|
||||
LibreChat Agents usher in a new era for the app where future pipelines can be streamlined via Agents for specific tasks and workflows across your experience in LibreChat.
|
||||
|
||||
126
content/docs/features/agents_api.mdx
Normal file
126
content/docs/features/agents_api.mdx
Normal file
@@ -0,0 +1,126 @@
|
||||
---
|
||||
title: Agents API (Beta)
|
||||
icon: Plug
|
||||
description: Access LibreChat agents programmatically via OpenAI-compatible and Open Responses API endpoints
|
||||
---
|
||||
|
||||
<Callout type="warning" title="Beta Feature">
|
||||
The Agents API is currently in beta. Endpoints, request/response formats, and behavior may change as we iterate toward a stable release.
|
||||
</Callout>
|
||||
|
||||
LibreChat exposes your agents through two API-compatible interfaces, allowing external applications, scripts, and services to interact with your agents programmatically.
|
||||
|
||||
## Overview
|
||||
|
||||
The Agents API provides two interfaces:
|
||||
|
||||
- **OpenAI-compatible Chat Completions** — `POST /api/agents/v1/chat/completions`
|
||||
- **Open Responses API** — `POST /api/agents/v1/responses`
|
||||
|
||||
Both are authenticated via API keys and support streaming responses, making it easy to integrate LibreChat agents into existing workflows that already use OpenAI SDKs or similar tooling.
|
||||
|
||||
LibreChat is adopting [Open Responses](https://www.openresponses.org/) as its primary API framework for serving agents. While the Chat Completions endpoint provides backward compatibility with existing OpenAI-compatible tooling, the Open Responses endpoint represents the future direction. See our [blog post](/blog/2026-01-17_open_responses) for more on this decision.
|
||||
|
||||
## Enabling the Agents API
|
||||
|
||||
The Agents API is gated behind the `remoteAgents` interface configuration. All permissions default to `false`.
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
interface:
|
||||
remoteAgents:
|
||||
use: true
|
||||
create: true
|
||||
```
|
||||
|
||||
See [Interface Configuration — remoteAgents](/docs/configuration/librechat_yaml/object_structure/interface#remoteagents) for all available options.
|
||||
|
||||
**Note:** Admin users have all remote agent permissions enabled by default.
|
||||
|
||||
## API Key Management
|
||||
|
||||
Once `remoteAgents.use` and `remoteAgents.create` are enabled, users can generate API keys from the LibreChat UI. These keys authenticate requests to the Agents API.
|
||||
|
||||
## Endpoints
|
||||
|
||||
### Chat Completions (OpenAI-compatible)
|
||||
|
||||
```
|
||||
POST /api/agents/v1/chat/completions
|
||||
```
|
||||
|
||||
Use any OpenAI-compatible SDK by pointing it at your LibreChat instance. The `model` parameter corresponds to an agent ID.
|
||||
|
||||
**Example with curl:**
|
||||
```bash
|
||||
curl -X POST https://your-librechat-instance/api/agents/v1/chat/completions \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "agent_abc123",
|
||||
"messages": [
|
||||
{"role": "user", "content": "Hello, what can you help me with?"}
|
||||
],
|
||||
"stream": true
|
||||
}'
|
||||
```
|
||||
|
||||
**Example with OpenAI SDK (Python):**
|
||||
```python
|
||||
from openai import OpenAI
|
||||
|
||||
client = OpenAI(
|
||||
base_url="https://your-librechat-instance/api/agents/v1",
|
||||
api_key="YOUR_API_KEY"
|
||||
)
|
||||
|
||||
response = client.chat.completions.create(
|
||||
model="agent_abc123",
|
||||
messages=[{"role": "user", "content": "Hello!"}],
|
||||
stream=True
|
||||
)
|
||||
|
||||
for chunk in response:
|
||||
print(chunk.choices[0].delta.content, end="")
|
||||
```
|
||||
|
||||
### List Models
|
||||
|
||||
```
|
||||
GET /api/agents/v1/models
|
||||
```
|
||||
|
||||
Returns available agents as models. Useful for discovering which agents are accessible with your API key.
|
||||
|
||||
### Open Responses API
|
||||
|
||||
```
|
||||
POST /api/agents/v1/responses
|
||||
```
|
||||
|
||||
The Open Responses endpoint follows the [Open Responses specification](https://www.openresponses.org/), an open inference standard initiated by OpenAI and built by the open-source AI community. It is designed for agentic workflows with native support for reasoning, tool use, structured outputs, and streaming semantic events.
|
||||
|
||||
```bash
|
||||
curl -X POST https://your-librechat-instance/api/agents/v1/responses \
|
||||
-H "Authorization: Bearer YOUR_API_KEY" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"model": "agent_abc123",
|
||||
"input": "What is the weather today?"
|
||||
}'
|
||||
```
|
||||
|
||||
## Token Usage Tracking
|
||||
|
||||
All Agents API requests track token usage against the user's balance (when token spending is configured). Both input and output tokens are counted, including cache tokens for providers that support them (OpenAI, Anthropic).
|
||||
|
||||
## Roadmap
|
||||
|
||||
- **Open Responses as primary interface** — We plan to expand the Open Responses endpoint with full support for agentic loops, tool orchestration, and streaming semantic events.
|
||||
- **Anthropic Messages API** — We may add support for the Anthropic Messages API format as an additional interface in the future.
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Agents](/docs/features/agents) — Creating and configuring agents
|
||||
- [Interface Configuration — remoteAgents](/docs/configuration/librechat_yaml/object_structure/interface#remoteagents) — Access control settings
|
||||
- [Token Usage](/docs/configuration/token_usage) — Configuring token spending and balance
|
||||
- [Open Responses Specification](https://www.openresponses.org/) — The open inference standard
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Forking Messages and Conversations
|
||||
title: Forking Chats
|
||||
icon: GitFork
|
||||
description: A guide on how to use the "Fork Messages/Conversations" feature in our app to create new conversations from specific messages with desired behavior.
|
||||
---
|
||||
|
||||
@@ -1,22 +1,30 @@
|
||||
---
|
||||
title: Memory
|
||||
title: User Memory
|
||||
icon: Bookmark
|
||||
description: Enable conversation memory and personalization features in LibreChat
|
||||
description: Key/value store for user memory that runs on every chat request in LibreChat
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Memory in LibreChat allows the system to remember information across conversations, providing a more personalized and context-aware experience. When enabled, the AI can recall user preferences, important facts, and conversation context to enhance future interactions.
|
||||
User Memory in LibreChat is a **key/value store** that persists user-specific information across conversations. A dedicated memory agent runs at the start of **every chat request**, reading from and writing to this store to provide personalized context to the main AI response.
|
||||
|
||||
<Callout type="info" title="Key/Value Store, Not Conversation Memory">
|
||||
This is **not** semantic memory over your entire conversation history. It does not index, embed, or search past conversations. Instead, it maintains a structured set of key/value pairs (e.g., `user_preferences`, `learned_facts`) that are injected into each request as context. Think of it as a persistent notepad the AI reads before every response.
|
||||
|
||||
For context about previous messages within a single conversation, LibreChat already uses the standard message history window — that is separate from this feature.
|
||||
</Callout>
|
||||
|
||||
<Callout type="important" title="⚠️ Configuration Required">
|
||||
- Memory functionality must be explicitly configured in your `librechat.yaml` file to work. It is not enabled by default.
|
||||
Memory functionality must be explicitly configured in your `librechat.yaml` file to work. It is not enabled by default.
|
||||
</Callout>
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Persistent Context**: Information learned in one conversation can be recalled in future conversations
|
||||
- **Runs Every Request**: The memory agent executes at the start of each chat request, ensuring stored context is always available
|
||||
- **Key/Value Storage**: Information is stored as structured key/value pairs, not as raw conversation logs
|
||||
- **Manual Entries**: Users can manually add, edit, or remove memory entries directly, giving full control over what the AI remembers
|
||||
- **User Control**: When enabled, users can toggle memory on/off for their individual chats
|
||||
- **Customizable Storage**: Control what types of information can be stored using valid keys
|
||||
- **Customizable Keys**: Restrict what categories of information can be stored using `validKeys`
|
||||
- **Token Management**: Set limits on memory usage to control costs
|
||||
- **Agent Integration**: Use AI agents to intelligently manage what gets remembered
|
||||
|
||||
@@ -25,7 +33,7 @@ Memory in LibreChat allows the system to remember information across conversatio
|
||||
To enable memory features, you need to add the `memory` configuration to your `librechat.yaml` file:
|
||||
|
||||
```yaml filename="librechat.yaml"
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
|
||||
memory:
|
||||
@@ -47,23 +55,25 @@ See the [Memory Configuration Guide](/docs/configuration/librechat_yaml/object_s
|
||||
## How It Works
|
||||
|
||||
<Callout type="note" title="Memory Agent Execution">
|
||||
Until smart detection of memory-relevant requests (beyond the LLM's own agency) is implemented, the memory agent runs on every request when memory is enabled.
|
||||
The memory agent runs on **every chat request** when memory is enabled. It executes concurrently with the main chat response — it begins before the main response starts and is limited to the duration of the main request plus up to 3 seconds after it finishes.
|
||||
|
||||
Timing and order:
|
||||
- The memory agent runs before the main chat response.
|
||||
- It is limited to the amount of time it takes the main chat request to completely finish, plus up to 3 seconds after the initial chat request finishes.
|
||||
- This design ensures memory updates are applied promptly and are expected to finish sooner if updates are needed, without delaying the user's chat experience.
|
||||
This means every message you send triggers the memory agent to:
|
||||
1. **Read** the current key/value store and inject relevant entries as context
|
||||
2. **Analyze** the recent message window for information worth storing or updating
|
||||
3. **Write** any new or modified entries back to the store
|
||||
</Callout>
|
||||
|
||||
### 1. Information Storage
|
||||
When memory is enabled, the system can store:
|
||||
### 1. Key/Value Storage
|
||||
Memory entries are stored as key/value pairs. When memory is enabled, the system can store entries such as:
|
||||
- User preferences (communication style, topics of interest)
|
||||
- Important facts and context from conversations
|
||||
- Personal information explicitly shared by users
|
||||
- Important facts explicitly shared by users
|
||||
- Ongoing projects or tasks mentioned
|
||||
- Any category you define via `validKeys`
|
||||
|
||||
Users can also **manually create, edit, and delete** memory entries through the interface, giving direct control over what the AI knows about them.
|
||||
|
||||
### 2. Context Window
|
||||
The `messageWindowSize` parameter determines how many recent messages are analyzed for memory updates. This helps the system decide what information is worth remembering.
|
||||
The `messageWindowSize` parameter determines how many recent messages are analyzed for memory updates. This helps the memory agent decide what information is worth storing or updating in the key/value store.
|
||||
|
||||
### 3. User Control
|
||||
When `personalize` is set to `true`:
|
||||
@@ -72,7 +82,7 @@ When `personalize` is set to `true`:
|
||||
- Memory settings persist across sessions
|
||||
|
||||
### 4. Valid Keys
|
||||
You can restrict what types of information are stored by specifying `validKeys`:
|
||||
You can restrict what categories of information are stored by specifying `validKeys`:
|
||||
|
||||
```yaml filename="memory / validKeys"
|
||||
memory:
|
||||
@@ -215,6 +225,13 @@ memory:
|
||||
3. Check that the custom endpoint is working for regular chat completions before testing with memory
|
||||
4. Review server logs for authentication errors from the custom endpoint API
|
||||
|
||||
## Future Improvements
|
||||
|
||||
The current implementation runs the memory agent on every chat request unconditionally. Planned improvements include:
|
||||
|
||||
- **Semantic Trigger for Writes**: Detect when a user has explicitly asked the model to remember something (e.g., "Remember that I prefer Python") and only run the memory write agent in those cases, reducing unnecessary processing on routine messages.
|
||||
- **Vector Similarity Recall**: Instead of injecting all stored memory entries into every request, use vector embeddings to retrieve only the entries most relevant to the current conversation context, improving both efficiency and relevance.
|
||||
|
||||
## Related Features
|
||||
|
||||
- [Agents](/docs/features/agents) - Build custom AI assistants
|
||||
|
||||
@@ -3,27 +3,28 @@
|
||||
"icon": "Sparkles",
|
||||
"pages": [
|
||||
"index",
|
||||
"---AI & Agents---",
|
||||
"---Agentic AI---",
|
||||
"mcp",
|
||||
"agents",
|
||||
"code_interpreter",
|
||||
"agents_api",
|
||||
"artifacts",
|
||||
"code_interpreter",
|
||||
"---Search & Knowledge---",
|
||||
"web_search",
|
||||
"search",
|
||||
"rag_api",
|
||||
"memory",
|
||||
"ocr",
|
||||
"rag_api",
|
||||
"---Media---",
|
||||
"image_gen",
|
||||
"upload_as_text",
|
||||
"ocr",
|
||||
"image_gen",
|
||||
"---Chat---",
|
||||
"resumable_streams",
|
||||
"fork",
|
||||
"import_convos",
|
||||
"shareable_links",
|
||||
"temporary_chat",
|
||||
"url_query",
|
||||
"resumable_streams",
|
||||
"import_convos",
|
||||
"---Security---",
|
||||
"authentication",
|
||||
"password_reset",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Search
|
||||
title: Message Search
|
||||
icon: ListFilter
|
||||
description: Quickly search in past conversations with LibreChat's integrated Meilisearch
|
||||
---
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Upload as Text
|
||||
title: Upload Files as Text
|
||||
icon: Upload
|
||||
description: Upload files to include their full content in conversations without requiring OCR configuration.
|
||||
---
|
||||
|
||||
@@ -42,7 +42,7 @@ services:
|
||||
- As an example, here is a configuration for both **OpenRouter** and **Ollama**:
|
||||
|
||||
```yaml
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
cache: true
|
||||
endpoints:
|
||||
custom:
|
||||
|
||||
@@ -204,7 +204,7 @@ You will enter the editor screen, and you can paste the following:
|
||||
# https://www.librechat.ai/docs/configuration/librechat_yaml
|
||||
|
||||
# Configuration version (required)
|
||||
version: 1.2.8
|
||||
version: 1.3.4
|
||||
# This setting caches the config file for faster loading across app lifecycle
|
||||
cache: true
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Secure Deployment with Nginx
|
||||
title: NGINX
|
||||
icon: Shield
|
||||
description: Step-by-step guide for securing your LibreChat deployment with Nginx as a reverse proxy and HTTPS
|
||||
---
|
||||
|
||||
@@ -11,6 +11,7 @@ import { LocalInstallHub } from '@/components/LocalInstallHub'
|
||||
import { QuickStartHub } from '@/components/QuickStartHub'
|
||||
import { FeaturesHub } from '@/components/FeaturesHub'
|
||||
import Carousel from '@/components/carousel/Carousel'
|
||||
import { TrackedLink, TrackedAnchor } from '@/components/TrackedLink'
|
||||
import type { ReactNode } from 'react'
|
||||
|
||||
function mapCalloutType(type?: string): 'info' | 'warn' | 'error' {
|
||||
@@ -136,7 +137,7 @@ function CardCompat({
|
||||
}) {
|
||||
const content = (
|
||||
<div className="flex flex-col gap-2">
|
||||
{icon && <div className="text-2xl">{icon}</div>}
|
||||
{icon && <div className="[&>svg]:h-6 [&>svg]:w-6">{icon}</div>}
|
||||
{title && <h3 className="font-semibold text-fd-foreground">{title}</h3>}
|
||||
{children && <div className="text-sm text-fd-muted-foreground">{children}</div>}
|
||||
</div>
|
||||
@@ -144,8 +145,9 @@ function CardCompat({
|
||||
|
||||
if (href) {
|
||||
return (
|
||||
<a
|
||||
<TrackedLink
|
||||
href={href}
|
||||
title={title}
|
||||
className="group block rounded-xl border border-fd-border bg-fd-card p-5 transition-all hover:border-fd-primary/30 hover:bg-fd-accent hover:shadow-sm"
|
||||
{...props}
|
||||
>
|
||||
@@ -155,7 +157,7 @@ function CardCompat({
|
||||
→
|
||||
</span>
|
||||
)}
|
||||
</a>
|
||||
</TrackedLink>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -165,7 +167,7 @@ function CardCompat({
|
||||
</div>
|
||||
)
|
||||
}
|
||||
;(CardsCompat as any).Card = CardCompat
|
||||
const CardsWithCard = Object.assign(CardsCompat, { Card: CardCompat })
|
||||
|
||||
function FileTreeCompat({ children, ...props }: { children?: ReactNode; [key: string]: any }) {
|
||||
return <Files {...props}>{children}</Files>
|
||||
@@ -190,11 +192,9 @@ function FileCompat({
|
||||
/>
|
||||
)
|
||||
}
|
||||
;(FileTreeCompat as any).File = FileCompat
|
||||
;(FileTreeCompat as any).Folder = Folder
|
||||
const FileTreeWithChildren = Object.assign(FileTreeCompat, { File: FileCompat, Folder })
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function ImgCompat({ image, ...props }: { image?: boolean; [key: string]: any }) {
|
||||
function ImgCompat({ image: _, ...props }: { image?: boolean; [key: string]: any }) {
|
||||
const src = typeof props.src === 'string' ? props.src : ''
|
||||
const isExternal = src.startsWith('http://') || src.startsWith('https://')
|
||||
if (isExternal) {
|
||||
@@ -209,15 +209,16 @@ function ImgCompat({ image, ...props }: { image?: boolean; [key: string]: any })
|
||||
|
||||
export const mdxComponents = {
|
||||
...defaultMdxComponents,
|
||||
a: TrackedAnchor,
|
||||
img: ImgCompat,
|
||||
Callout: CalloutCompat,
|
||||
Steps,
|
||||
Step,
|
||||
Tab: TabCompat,
|
||||
Tabs: TabsCompat,
|
||||
Cards: CardsCompat,
|
||||
Cards: CardsWithCard,
|
||||
Card: CardCompat,
|
||||
FileTree: FileTreeCompat,
|
||||
FileTree: FileTreeWithChildren,
|
||||
File: FileCompat,
|
||||
Folder,
|
||||
Files,
|
||||
|
||||
@@ -32,20 +32,34 @@ function CardComponent({
|
||||
children,
|
||||
title,
|
||||
href,
|
||||
icon,
|
||||
...props
|
||||
}: ChildrenProps & { title?: string; href?: string }) {
|
||||
}: ChildrenProps & { title?: string; href?: string; icon?: ReactNode }) {
|
||||
const content = (
|
||||
<div className="nextra-card" {...props}>
|
||||
{title && <h3>{title}</h3>}
|
||||
<div
|
||||
className="nextra-card flex items-center gap-3 rounded-lg border border-gray-200 dark:border-gray-800 p-4 transition-colors hover:bg-gray-100 dark:hover:bg-gray-800/50"
|
||||
{...props}
|
||||
>
|
||||
{icon && <span className="shrink-0 [&>svg]:h-6 [&>svg]:w-6">{icon}</span>}
|
||||
{title && <h3 className="m-0 text-base font-medium">{title}</h3>}
|
||||
{children}
|
||||
</div>
|
||||
)
|
||||
if (href) return <a href={href}>{content}</a>
|
||||
if (href)
|
||||
return (
|
||||
<a
|
||||
href={href}
|
||||
className="no-underline"
|
||||
{...(props.target ? { target: props.target, rel: 'noopener noreferrer' } : {})}
|
||||
>
|
||||
{content}
|
||||
</a>
|
||||
)
|
||||
return content
|
||||
}
|
||||
|
||||
function CardsBase({ children }: ChildrenProps) {
|
||||
return <div className="nextra-cards">{children}</div>
|
||||
return <div className="nextra-cards mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2">{children}</div>
|
||||
}
|
||||
|
||||
export const Cards = Object.assign(CardsBase, { Card: CardComponent })
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
/**
|
||||
* Nextra compatibility shim for `nextra/context`.
|
||||
* Provides stub implementations so existing pages/ components
|
||||
|
||||
2
next-env.d.ts
vendored
2
next-env.d.ts
vendored
@@ -1,7 +1,7 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
/// <reference types="next/navigation-types/compat/navigation" />
|
||||
import './.next/types/routes.d.ts'
|
||||
import "./.next/dev/types/routes.d.ts";
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
|
||||
BIN
public/images/blog/2026-02-18_2026_roadmap.png
Normal file
BIN
public/images/blog/2026-02-18_2026_roadmap.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 MiB |
@@ -14,6 +14,7 @@ export const blog = defineCollections({
|
||||
date: z.string().or(z.date()),
|
||||
author: z.string().optional(),
|
||||
ogImage: z.string().optional(),
|
||||
ogImagePosition: z.string().optional(),
|
||||
category: z.enum(['release', 'feature', 'guide', 'announcement']).optional(),
|
||||
featured: z.boolean().optional(),
|
||||
tags: z.array(z.string()).optional(),
|
||||
|
||||
Reference in New Issue
Block a user