generated from chiffre-io/template-library
-
-
Notifications
You must be signed in to change notification settings - Fork 228
doc: support markdown response for AI #1171
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
aryasaatvik
wants to merge
16
commits into
47ng:next
Choose a base branch
from
aryasaatvik:feat/llm-docs
base: next
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 8 commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
439f2de
chore(deps): update fumadocs-core to 15.8.5 and fumadocs-mdx to 12.0.…
aryasaatvik 61a800d
feat(docs): implement LLM markdown rewrites and add new routes for LL…
aryasaatvik b0441c7
ref(docs): replace middleware with static rewrites for LLM content
aryasaatvik 24d0d0c
chore(deps): update fumadocs-ui to 15.8.5 in package.json and pnpm-lo…
aryasaatvik cb4dd17
chore: move llms.txt and llms-full.txt to the root
aryasaatvik a133fe4
feat(docs): add new redirect for manually requesting markdown files i…
aryasaatvik 9ee7547
feat(docs): add copy button and view options for markdown files
aryasaatvik 4bc7213
chore(docs): update test script to include next typegen before tsc
aryasaatvik 82b59ad
fix(docs): use consistent cn utility import
aryasaatvik 683b3dd
feat(docs): use nuqs serializer for ChatGPT URL construction
aryasaatvik 22ef450
feat(docs): add Suspense boundary with buttonVariants skeleton
aryasaatvik 5cd30b9
feat(docs): move PageActionsSkeleton to page-actions component
aryasaatvik 0027b7c
Merge branch 'next' into feat/llm-docs
aryasaatvik af1b68c
feat(docs): restructure LLM documentation output
aryasaatvik 82120b0
feat(docs): add page exclusions for LLM text generation
aryasaatvik bf1fac4
fix(docs): filter out excluded pages in LLM text generation
aryasaatvik File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| import { source } from '@/src/app/source'; | ||
| import { getLLMText } from '@/src/lib/get-llm-text'; | ||
|
|
||
| // cached forever | ||
| export const revalidate = false; | ||
|
|
||
| export async function GET() { | ||
| const scan = source.getPages().map(getLLMText); | ||
| const scanned = await Promise.all(scan); | ||
|
|
||
| return new Response(scanned.join('\n\n')); | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| import { source } from '@/src/app/source'; | ||
| import { getLLMText } from '@/src/lib/get-llm-text'; | ||
|
|
||
| // cached forever | ||
| export const revalidate = false; | ||
|
|
||
| export async function GET() { | ||
| const scan = source.getPages().map(getLLMText); | ||
| const scanned = await Promise.all(scan); | ||
|
|
||
| return new Response(scanned.join('\n\n')); | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,24 @@ | ||
| import { getLLMText } from '@/src/lib/get-llm-text'; | ||
| import { source } from '@/src/app/source'; | ||
| import { notFound } from 'next/navigation'; | ||
|
|
||
| export const revalidate = false; | ||
|
|
||
| export async function GET( | ||
| _req: Request, | ||
| { params }: RouteContext<'/llms/docs/[[...slug]]'>, | ||
| ) { | ||
| const { slug } = await params; | ||
| const page = source.getPage(slug); | ||
| if (!page) notFound(); | ||
|
|
||
| return new Response(await getLLMText(page), { | ||
| headers: { | ||
| 'Content-Type': 'text/markdown', | ||
| }, | ||
| }); | ||
| } | ||
|
|
||
| export function generateStaticParams() { | ||
| return source.generateParams(); | ||
| } |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,247 @@ | ||
| 'use client'; | ||
| import { useMemo, useState } from 'react'; | ||
| import { | ||
| Check, | ||
| ChevronDown, | ||
| Copy, | ||
| ExternalLinkIcon, | ||
| MessageCircleIcon, | ||
| } from 'lucide-react'; | ||
| import { cn } from '../lib/cn'; | ||
| import { useCopyButton } from 'fumadocs-ui/utils/use-copy-button'; | ||
| import { buttonVariants } from './ui/button'; | ||
| import { | ||
| Popover, | ||
| PopoverContent, | ||
| PopoverTrigger, | ||
| } from 'fumadocs-ui/components/ui/popover'; | ||
| import { cva } from 'class-variance-authority'; | ||
|
|
||
| const cache = new Map<string, string>(); | ||
|
|
||
| export function LLMCopyButton({ | ||
| /** | ||
| * A URL to fetch the raw Markdown/MDX content of page | ||
| */ | ||
| markdownUrl, | ||
| }: { | ||
| markdownUrl: string; | ||
| }) { | ||
| const [isLoading, setLoading] = useState(false); | ||
| const [checked, onClick] = useCopyButton(async () => { | ||
| const cached = cache.get(markdownUrl); | ||
| if (cached) return navigator.clipboard.writeText(cached); | ||
|
|
||
| setLoading(true); | ||
|
|
||
| try { | ||
| await navigator.clipboard.write([ | ||
| new ClipboardItem({ | ||
| 'text/plain': fetch(markdownUrl).then(async (res) => { | ||
| const content = await res.text(); | ||
| cache.set(markdownUrl, content); | ||
|
|
||
| return content; | ||
| }), | ||
| }), | ||
| ]); | ||
| } finally { | ||
| setLoading(false); | ||
| } | ||
| }); | ||
|
|
||
| return ( | ||
| <button | ||
| disabled={isLoading} | ||
| className={cn( | ||
| buttonVariants({ | ||
| variant: 'secondary', | ||
| size: 'sm', | ||
| className: 'gap-2 [&_svg]:size-3.5 [&_svg]:text-fd-muted-foreground', | ||
| }), | ||
| )} | ||
| onClick={onClick} | ||
| > | ||
| {checked ? <Check /> : <Copy />} | ||
| Copy Markdown | ||
| </button> | ||
| ); | ||
| } | ||
|
|
||
| const optionVariants = cva( | ||
| 'text-sm p-2 rounded-lg inline-flex items-center gap-2 hover:text-fd-accent-foreground hover:bg-fd-accent [&_svg]:size-4', | ||
| ); | ||
|
|
||
| export function ViewOptions({ | ||
| markdownUrl, | ||
| githubUrl, | ||
| }: { | ||
| /** | ||
| * A URL to the raw Markdown/MDX content of page | ||
| */ | ||
| markdownUrl: string; | ||
|
|
||
| /** | ||
| * Source file URL on GitHub | ||
| */ | ||
| githubUrl: string; | ||
| }) { | ||
| const items = useMemo(() => { | ||
| const fullMarkdownUrl = | ||
| typeof window !== 'undefined' | ||
| ? new URL(markdownUrl, window.location.origin) | ||
| : 'loading'; | ||
| const q = `Read ${fullMarkdownUrl}, I want to ask questions about it.`; | ||
|
|
||
| return [ | ||
| { | ||
| title: 'Open in GitHub', | ||
| href: githubUrl, | ||
| icon: ( | ||
| <svg fill="currentColor" role="img" viewBox="0 0 24 24"> | ||
| <title>GitHub</title> | ||
| <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" /> | ||
| </svg> | ||
| ), | ||
| }, | ||
| { | ||
| title: 'Open in Scira AI', | ||
aryasaatvik marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| href: `https://scira.ai/?${new URLSearchParams({ | ||
| q, | ||
| })}`, | ||
| icon: ( | ||
| <svg | ||
| width="910" | ||
| height="934" | ||
| viewBox="0 0 910 934" | ||
| fill="none" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| > | ||
| <title>Scira AI</title> | ||
| <path | ||
| d="M647.664 197.775C569.13 189.049 525.5 145.419 516.774 66.8849C508.048 145.419 464.418 189.049 385.884 197.775C464.418 206.501 508.048 250.131 516.774 328.665C525.5 250.131 569.13 206.501 647.664 197.775Z" | ||
| fill="currentColor" | ||
| stroke="currentColor" | ||
| strokeWidth="8" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M516.774 304.217C510.299 275.491 498.208 252.087 480.335 234.214C462.462 216.341 439.058 204.251 410.333 197.775C439.059 191.3 462.462 179.209 480.335 161.336C498.208 143.463 510.299 120.06 516.774 91.334C523.25 120.059 535.34 143.463 553.213 161.336C571.086 179.209 594.49 191.3 623.216 197.775C594.49 204.251 571.086 216.341 553.213 234.214C535.34 252.087 523.25 275.491 516.774 304.217Z" | ||
| fill="currentColor" | ||
| stroke="currentColor" | ||
| strokeWidth="8" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M857.5 508.116C763.259 497.644 710.903 445.288 700.432 351.047C689.961 445.288 637.605 497.644 543.364 508.116C637.605 518.587 689.961 570.943 700.432 665.184C710.903 570.943 763.259 518.587 857.5 508.116Z" | ||
| stroke="currentColor" | ||
| strokeWidth="20" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M700.432 615.957C691.848 589.05 678.575 566.357 660.383 548.165C642.191 529.973 619.499 516.7 592.593 508.116C619.499 499.533 642.191 486.258 660.383 468.066C678.575 449.874 691.848 427.181 700.432 400.274C709.015 427.181 722.289 449.874 740.481 468.066C758.673 486.258 781.365 499.533 808.271 508.116C781.365 516.7 758.673 529.973 740.481 548.165C722.289 566.357 709.015 589.05 700.432 615.957Z" | ||
| stroke="currentColor" | ||
| strokeWidth="20" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M889.949 121.237C831.049 114.692 798.326 81.9698 791.782 23.0692C785.237 81.9698 752.515 114.692 693.614 121.237C752.515 127.781 785.237 160.504 791.782 219.404C798.326 160.504 831.049 127.781 889.949 121.237Z" | ||
| fill="currentColor" | ||
| stroke="currentColor" | ||
| strokeWidth="8" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M791.782 196.795C786.697 176.937 777.869 160.567 765.16 147.858C752.452 135.15 736.082 126.322 716.226 121.237C736.082 116.152 752.452 107.324 765.16 94.6152C777.869 81.9065 786.697 65.5368 791.782 45.6797C796.867 65.5367 805.695 81.9066 818.403 94.6152C831.112 107.324 847.481 116.152 867.338 121.237C847.481 126.322 831.112 135.15 818.403 147.858C805.694 160.567 796.867 176.937 791.782 196.795Z" | ||
| fill="currentColor" | ||
| stroke="currentColor" | ||
| strokeWidth="8" | ||
| strokeLinejoin="round" | ||
| /> | ||
| <path | ||
| d="M760.632 764.337C720.719 814.616 669.835 855.1 611.872 882.692C553.91 910.285 490.404 924.255 426.213 923.533C362.022 922.812 298.846 907.419 241.518 878.531C184.19 849.643 134.228 808.026 95.4548 756.863C56.6815 705.7 30.1238 646.346 17.8129 583.343C5.50207 520.339 7.76433 455.354 24.4266 393.359C41.089 331.364 71.7099 274.001 113.947 225.658C156.184 177.315 208.919 139.273 268.117 114.442" | ||
| stroke="currentColor" | ||
| strokeWidth="30" | ||
| strokeLinecap="round" | ||
| strokeLinejoin="round" | ||
| /> | ||
| </svg> | ||
| ), | ||
| }, | ||
| { | ||
| title: 'Open in ChatGPT', | ||
| href: `https://chatgpt.com/?${new URLSearchParams({ | ||
| hints: 'search', | ||
| q, | ||
aryasaatvik marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| })}`, | ||
| icon: ( | ||
| <svg | ||
| role="img" | ||
| viewBox="0 0 24 24" | ||
| fill="currentColor" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| > | ||
| <title>OpenAI</title> | ||
| <path d="M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z" /> | ||
| </svg> | ||
| ), | ||
| }, | ||
| { | ||
| title: 'Open in Claude', | ||
| href: `https://claude.ai/new?${new URLSearchParams({ | ||
| q, | ||
| })}`, | ||
| icon: ( | ||
| <svg | ||
| fill="currentColor" | ||
| role="img" | ||
| viewBox="0 0 24 24" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| > | ||
| <title>Anthropic</title> | ||
| <path d="M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z" /> | ||
| </svg> | ||
| ), | ||
| }, | ||
| { | ||
| title: 'Open in T3 Chat', | ||
| href: `https://t3.chat/new?${new URLSearchParams({ | ||
| q, | ||
| })}`, | ||
| icon: <MessageCircleIcon />, | ||
| }, | ||
| ]; | ||
| }, [githubUrl, markdownUrl]); | ||
|
|
||
| return ( | ||
| <Popover> | ||
| <PopoverTrigger | ||
| className={cn( | ||
| buttonVariants({ | ||
| variant: 'secondary', | ||
| size: 'sm', | ||
| className: 'gap-2', | ||
| }), | ||
| )} | ||
| > | ||
| Open | ||
| <ChevronDown className="size-3.5 text-fd-muted-foreground" /> | ||
| </PopoverTrigger> | ||
| <PopoverContent className="flex flex-col overflow-auto"> | ||
| {items.map((item) => ( | ||
| <a | ||
| key={item.href} | ||
| href={item.href} | ||
| rel="noreferrer noopener" | ||
| target="_blank" | ||
| className={cn(optionVariants())} | ||
| > | ||
| {item.icon} | ||
| {item.title} | ||
| <ExternalLinkIcon className="text-fd-muted-foreground size-3.5 ms-auto" /> | ||
| </a> | ||
| ))} | ||
| </PopoverContent> | ||
| </Popover> | ||
| ); | ||
| } | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| export { twMerge as cn } from 'tailwind-merge'; | ||
aryasaatvik marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.