page.tsx 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import Link from "next/link";
  2. import { Code } from "@/components/code";
  3. export const metadata = {
  4. title: "AI SDK Integration | json-render",
  5. };
  6. export default function AiSdkPage() {
  7. return (
  8. <article>
  9. <h1 className="text-3xl font-bold mb-4">AI SDK Integration</h1>
  10. <p className="text-muted-foreground mb-8">
  11. Use json-render with the Vercel AI SDK for seamless streaming.
  12. </p>
  13. <h2 className="text-xl font-semibold mt-12 mb-4">Installation</h2>
  14. <Code lang="bash">npm install ai @ai-sdk/openai</Code>
  15. <h2 className="text-xl font-semibold mt-12 mb-4">API Route Setup</h2>
  16. <Code lang="typescript">{`// app/api/generate/route.ts
  17. import { streamText } from 'ai';
  18. import { openai } from '@ai-sdk/openai';
  19. import { generateCatalogPrompt } from '@json-render/core';
  20. import { catalog } from '@/lib/catalog';
  21. export async function POST(req: Request) {
  22. const { prompt, currentTree } = await req.json();
  23. const systemPrompt = generateCatalogPrompt(catalog);
  24. // Optionally include current UI state for context
  25. const contextPrompt = currentTree
  26. ? \`\\n\\nCurrent UI state:\\n\${JSON.stringify(currentTree, null, 2)}\`
  27. : '';
  28. const result = streamText({
  29. model: openai('gpt-4o'),
  30. system: systemPrompt + contextPrompt,
  31. prompt,
  32. });
  33. return new Response(result.textStream, {
  34. headers: {
  35. 'Content-Type': 'text/plain; charset=utf-8',
  36. 'Transfer-Encoding': 'chunked',
  37. },
  38. });
  39. }`}</Code>
  40. <h2 className="text-xl font-semibold mt-12 mb-4">Using Gateway</h2>
  41. <p className="text-sm text-muted-foreground mb-4">
  42. For multi-provider support, use the AI Gateway:
  43. </p>
  44. <Code lang="typescript">{`import { gateway } from '@ai-sdk/gateway';
  45. const result = streamText({
  46. model: gateway('openai/gpt-4o'),
  47. // ...
  48. });`}</Code>
  49. <h2 className="text-xl font-semibold mt-12 mb-4">Client-Side Hook</h2>
  50. <p className="text-sm text-muted-foreground mb-4">
  51. Use <code className="text-foreground">useUIStream</code> on the client:
  52. </p>
  53. <Code lang="tsx">{`'use client';
  54. import { useUIStream } from '@json-render/react';
  55. function GenerativeUI() {
  56. const { tree, isLoading, error, generate } = useUIStream({
  57. endpoint: '/api/generate',
  58. });
  59. return (
  60. <div>
  61. <button
  62. onClick={() => generate('Create a dashboard with metrics')}
  63. disabled={isLoading}
  64. >
  65. {isLoading ? 'Generating...' : 'Generate'}
  66. </button>
  67. {error && <p className="text-red-500">{error.message}</p>}
  68. <Renderer tree={tree} registry={registry} />
  69. </div>
  70. );
  71. }`}</Code>
  72. <h2 className="text-xl font-semibold mt-12 mb-4">Prompt Engineering</h2>
  73. <p className="text-sm text-muted-foreground mb-4">
  74. The <code className="text-foreground">generateCatalogPrompt</code> function creates an optimized prompt that:
  75. </p>
  76. <ul className="list-disc list-inside text-sm text-muted-foreground space-y-1 mb-4">
  77. <li>Lists all available components and their props</li>
  78. <li>Describes available actions</li>
  79. <li>Specifies the expected JSON output format</li>
  80. <li>Includes examples for better generation</li>
  81. </ul>
  82. <h2 className="text-xl font-semibold mt-12 mb-4">Custom System Prompts</h2>
  83. <Code lang="typescript">{`const basePrompt = generateCatalogPrompt(catalog);
  84. const customPrompt = \`
  85. \${basePrompt}
  86. Additional instructions:
  87. - Always use Card components for grouping related content
  88. - Prefer horizontal layouts (Row) for metrics
  89. - Use consistent spacing with padding="md"
  90. \`;`}</Code>
  91. <h2 className="text-xl font-semibold mt-12 mb-4">Next</h2>
  92. <p className="text-sm text-muted-foreground">
  93. Learn about <Link href="/docs/streaming" className="text-foreground hover:underline">progressive streaming</Link>.
  94. </p>
  95. </article>
  96. );
  97. }