💬 feat: Conversation Starters for Model Specs#13710
Merged
danny-avila merged 2 commits intoJun 13, 2026
Merged
Conversation
mharveybu
marked this pull request as draft
June 12, 2026 13:49
Adds an optional conversation_starters field to model specs in librechat.yaml. When the active conversation uses a spec that defines starters (and no agent/assistant starters apply), the chat landing renders clickable starter prompts between the landing content and the chat input; clicking one submits it as the first message. - data-provider: add conversation_starters to TModelSpec and tModelSpecSchema so the field survives strict config parsing - client: ConversationStarters falls back to the active spec's starters via getModelSpec; entity (agent/assistant) starters take precedence; starter cards are centered, size to content, wrap at word boundaries, stagger their fade-in, and gain a focus-visible ring - sanitizeModelSpecs passes the field through (denylist); covered by a new unit test - e2e: mock spec + tests for rendering, absence, click-to-submit, and the MAX_CONVO_STARTERS cap Closes danny-avila#3619 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mharveybu
force-pushed
the
feat/modelspec-conversation-starters
branch
from
June 12, 2026 14:59
149c420 to
9e68d86
Compare
mharveybu
marked this pull request as ready for review
June 12, 2026 16:53
Owner
|
@codex review |
|
Codex Review: Didn't find any major issues. 🎉 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
danny-avila
approved these changes
Jun 13, 2026
danny-avila
added a commit
to LibreChat-AI/librechat.ai
that referenced
this pull request
Jun 15, 2026
* 📋 docs: Add conversation_starters to Model Specs object structure Documents the new modelSpec field from danny-avila/LibreChat#13710. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: Merge model spec starter guidance --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Danny Avila <danny@librechat.ai>
fuuuzzy
pushed a commit
to fuuuzzy/LibreChat
that referenced
this pull request
Jun 18, 2026
* 💬 feat: Conversation Starters for Model Specs Adds an optional conversation_starters field to model specs in librechat.yaml. When the active conversation uses a spec that defines starters (and no agent/assistant starters apply), the chat landing renders clickable starter prompts between the landing content and the chat input; clicking one submits it as the first message. - data-provider: add conversation_starters to TModelSpec and tModelSpecSchema so the field survives strict config parsing - client: ConversationStarters falls back to the active spec's starters via getModelSpec; entity (agent/assistant) starters take precedence; starter cards are centered, size to content, wrap at word boundaries, stagger their fade-in, and gain a focus-visible ring - sanitizeModelSpecs passes the field through (denylist); covered by a new unit test - e2e: mock spec + tests for rendering, absence, click-to-submit, and the MAX_CONVO_STARTERS cap Closes danny-avila#3619 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: Sort ChatView imports --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Danny Avila <danny@librechat.ai>
ThomasVuNguyen
pushed a commit
to ThomasVuNguyen/LibreChat
that referenced
this pull request
Jul 15, 2026
* 💬 feat: Conversation Starters for Model Specs Adds an optional conversation_starters field to model specs in librechat.yaml. When the active conversation uses a spec that defines starters (and no agent/assistant starters apply), the chat landing renders clickable starter prompts between the landing content and the chat input; clicking one submits it as the first message. - data-provider: add conversation_starters to TModelSpec and tModelSpecSchema so the field survives strict config parsing - client: ConversationStarters falls back to the active spec's starters via getModelSpec; entity (agent/assistant) starters take precedence; starter cards are centered, size to content, wrap at word boundaries, stagger their fade-in, and gain a focus-visible ring - sanitizeModelSpecs passes the field through (denylist); covered by a new unit test - e2e: mock spec + tests for rendering, absence, click-to-submit, and the MAX_CONVO_STARTERS cap Closes danny-avila#3619 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * chore: Sort ChatView imports --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Danny Avila <danny@librechat.ai>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Model specs defined in
librechat.yamlcurrently have no way to offer conversation starters — only database agents/assistants do. Deployments that present curated specs as "agents" (preset + instructions + MCP servers) can't surface suggested prompts on the landing page; the closest workaround is HTML links in the specdescription(via #13662), which open in a new tab and clutter the model selector.This PR adds an optional
conversation_startersfield to model specs. When the active conversation uses a spec that defines starters, the chat landing renders clickable starter cards between the landing content and the chat input, and clicking one submits it as the first message — mirroring agent/assistant starters.Changes:
packages/data-provider/src/models.ts: addconversation_starters?: string[]toTModelSpecandtModelSpecSchema(required so the field survivesconfigSchema.strict()parsing inloadCustomConfig).client/src/components/Chat/Input/ConversationStarters.tsx: resolve the active spec viagetModelSpec(same pattern asLanding.tsx) and fall back to its starters. Entity (agent/assistant) starters keep precedence; theMAX_CONVO_STARTERScap is unchanged. Starter cards are refined: centered text, content-based width, word-boundary wrapping (replacesbreak-all), staggered fade-in, and afocus-visiblering.client/src/components/Chat/ChatView.tsx: render starters between the landing content and the chat input rather than below the input (footer slot).packages/api/src/modelSpecs/modelSpecs.test.ts: unit test assertingsanitizeModelSpecspreserves the new field while still stripping private preset fields.e2e/config/librechat.e2e.yaml+e2e/specs/mock/model-spec-starters.spec.ts: mock spec (5 starters) and Playwright coverage for rendering, absence on specs without starters, click-to-submit, and the 4-starter cap (mirrorsmodel-spec-branding.spec.ts).The yaml strings are intentionally uncapped in the zod schema: a
.max()violation would fail the strict config parse and drop all model specs; the UI's 2-line clamp handles long text gracefully.Related work: #11326 adds builder-UI conversation starters for database agents — complementary data source (DB agents vs. yaml specs); both touch the shared landing component, so whichever merges second needs a small rebase.
Change Type
Testing
npx playwright test --config=e2e/playwright.config.mock.ts model-spec-starters— 3/3 passed (rendering, absence, click-to-submit + cap)client:npm run test:ci— 204 suites / 2,526 tests passed;tsc --noEmitcleanpackages/api:npx jest src/modelSpecs— 7/7 passed (incl. new sanitize test)npm run build:data-providersucceeds; ESLint/Prettier clean on touched fileslibrechat.yamldefining starters on two specs; verified cards render on the landing for the active spec, clicking submits the prompt, and specs without starters show the unchanged landingTest Configuration:
librechat.yamlwithmodelSpecs.list[*].conversation_startersas in the example aboveChecklist
Closes
conversation_startersfield inlibrechat.yaml. (The prompt-library integration suggested there could build on this as a follow-up.)🤖 Generated with Claude Code