Awesome-omni-skill copilotkit-nextjs-integration
Integrate CopilotKit AI components into Next.js frontend for building agentic UIs. Enables context-aware AI agents that can read app state and trigger tools/actions. Supports custom adapters for self-hosted LLMs and multiple provider integrations.
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/copilotkit-nextjs-integration" ~/.claude/skills/diegosouzapw-awesome-omni-skill-copilotkit-nextjs-integration && rm -rf "$T"
manifest:
skills/development/copilotkit-nextjs-integration/SKILL.mdsource content
CopilotKit for Next.js Integration
Integrate CopilotKit AI components into your Next.js application to build intelligent, context-aware interfaces where AI agents can read application state and trigger actionable tools.
When to use
Use this skill when you need to:
- Build AI-powered chat interfaces in your Next.js app
- Create context-aware AI agents that understand current UI state
- Enable AI to trigger actions and mutate app state
- Integrate custom or self-hosted LLM endpoints
- Implement human-in-the-loop AI workflows
- Add AI copilots to SaaS dashboards or productivity tools
- Support multiple LLM providers with custom adapters
- Build agentic UIs with sidebar, popup, or headless chat
Core concepts
Mental Model
CopilotKit is a bridge between your Next.js frontend and an LLM runtime endpoint:
[Next.js Frontend] ↕ state/actions/messages [Copilot Runtime Endpoint] ↕ provider protocol [LLM Adapter] → [OpenAI/Claude/Groq/Custom LLM]
The runtime:
- Manages conversation history
- Calls your LLM provider through an adapter
- Executes tools/actions triggered by the model
- Syncs generated content back to your UI
Key Primitives
- Copilot Runtime: Self-hosted endpoint managing message history, tool calls, and provider integration
- Readable State: App data exposed to the model via
hooks for contextuseCopilotReadable - Actions/Tools: Executable functions the model can trigger via
useCopilotAction - UI Components:
,CopilotPopup
, or custom headless chatCopilotSidebar - Adapters: Provider integration layer (OpenAI, Groq, Google, custom self-hosted, etc.)
- Generative UI: Structured responses for interactive UI updates
Quick start
Basic Setup
npm install @copilotkit/react @copilotkit/sdk
Minimal Example
import { CopilotPopup } from "@copilotkit/react-ui"; import { CopilotKit } from "@copilotkit/react-core"; export default function App() { return ( <CopilotKit runtimeUrl="http://localhost:8080/copilot"> <YourApp /> <CopilotPopup /> </CopilotKit> ); }
Share State with AI
import { useCopilotReadable } from "@copilotkit/react-core"; export function TaskList({ tasks }) { useCopilotReadable({ description: "List of tasks for the user", value: tasks }); return ( <ul> {tasks.map(task => <li key={task.id}>{task.title}</li>)} </ul> ); }
Enable AI-Triggered Actions
import { useCopilotAction } from "@copilotkit/react-core"; export function TaskPanel({ tasks, setTasks }) { useCopilotAction({ name: "complete_task", description: "Mark a task as complete", parameters: [ { name: "task_id", description: "The ID of the task to complete", type: "string" } ], handler: (taskId) => { setTasks(tasks.map(t => t.id === taskId ? { ...t, completed: true } : t )); } }); return ( <div> {tasks.map(task => ( <TaskCard key={task.id} task={task} /> ))} </div> ); }
Capabilities
Context-Aware AI
- Read App State: Expose UI state, data, and context to the AI model
- Conversation History: Maintain conversation context across messages
- Dynamic Context: Update what the model sees as app state changes
- Structured Responses: Return structured data for interactive UI updates
Tool & Action System
- Define Custom Tools: Any JavaScript function can become an AI-callable tool
- Parameter Validation: Define required and optional parameters with types
- Error Handling: Handle tool failures gracefully with retry logic
- State Mutations: Actions can update React state, trigger API calls, or run complex workflows
- Human-in-the-Loop: Get user confirmation before executing critical actions
Provider Flexibility
- OpenAI Integration: Out-of-the-box support for GPT-4, GPT-4o, etc.
- Alternative Providers: Support for Groq, Google, Anthropic, etc.
- Custom Adapters: Implement adapters for proprietary or self-hosted models
- Provider Agnostic: Switch providers without changing your UI code
- Self-Hosting: Deploy your own LLM runtime for privacy and cost control
UI Options
- Popup UI: Floating chat popup component
- Sidebar UI: Embedded sidebar copilot
- Headless: Build completely custom UI while using CopilotKit runtime
- Customizable Styling: Theme and style components to match your app
- Accessibility: Built-in keyboard navigation and screen reader support
Workflow
When implementing CopilotKit in your Next.js app:
- Setup Runtime: Deploy or configure Copilot Runtime endpoint
- Wrap App: Wrap your Next.js app with
provider<CopilotKit> - Share State: Use
to expose relevant app datauseCopilotReadable - Define Actions: Use
to enable AI-triggered operationsuseCopilotAction - Add UI: Include
,<CopilotPopup>
, or custom chat UI<CopilotSidebar> - Test & Refine: Iterate on state exposure and action definitions
Configuration Options
Runtime Configuration
<CopilotKit runtimeUrl="http://localhost:8080/copilot" // Runtime endpoint credentials="include" // Include cookies headers={{ // Custom headers "Authorization": `Bearer ${token}` }} >
Readable State Configuration
useCopilotReadable({ description: "Clear description of this data", value: importantData, parentId: "parent-context", // Nest within context categories: ["data", "state"] // Categorize for filtering });
Action Configuration
useCopilotAction({ name: "action_name", // Unique identifier description: "What this does", // For AI model understanding parameters: [ // Function parameters { name: "param_name", description: "Parameter description", type: "string", // Type for validation required: true } ], handler: async (param) => { // Async function to execute // Perform action, update state, call APIs } });
Best Practices
State Sharing
- ✅ Expose only relevant state that the AI needs
- ✅ Use clear, descriptive names for readable state
- ✅ Update readables reactively as state changes
- ✅ Keep exposed state serializable
- ❌ Don't expose sensitive data (tokens, passwords)
- ❌ Don't expose extremely large objects
Actions
- ✅ Keep actions focused and single-purpose
- ✅ Include clear parameter descriptions
- ✅ Validate parameters before execution
- ✅ Handle errors gracefully with user feedback
- ✅ Use async/await for long-running operations
- ❌ Don't expose dangerous operations without confirmation
- ❌ Don't rely on implicit context
Security
- ✅ Validate all AI-triggered actions on the backend
- ✅ Implement proper authentication/authorization
- ✅ Log AI actions for auditing
- ✅ Use rate limiting on action endpoints
- ✅ Sanitize AI outputs before rendering
- ❌ Don't trust client-side validation alone
- ❌ Don't expose internal APIs directly
Provider Integration
OpenAI Adapter (Default)
import { CopilotKit } from "@copilotkit/react-core"; <CopilotKit runtimeUrl="http://localhost:8080/copilot" credentials="include" />
Custom Provider Adapter
// Implement custom adapter for proprietary LLM class CustomLLMAdapter extends CopilotKitAdapter { async chat(messages, model) { // Call your custom LLM endpoint const response = await fetch("https://your-llm/chat", { method: "POST", body: JSON.stringify({ messages, model }) }); return response.json(); } } // Use in runtime const adapter = new CustomLLMAdapter({ apiKey: process.env.CUSTOM_API_KEY });
Self-Hosted LLM
// Point to self-hosted Ollama, LM Studio, or vLLM <CopilotKit runtimeUrl="http://localhost:8080/copilot" // Runtime configured to use self-hosted endpoint />
Real-World Patterns
Pattern 1: Task Automation in SaaS Dashboard
// Share CRM records and deal state useCopilotReadable({ description: "Current CRM records visible to user", value: crmRecords }); // Enable bulk actions useCopilotAction({ name: "update_deal_status", description: "Update the status of one or more CRM deals", parameters: [/* ... */], handler: async (dealIds, newStatus) => { await updateDeals(dealIds, newStatus); refreshData(); } });
Pattern 2: Productivity App Assistant
// Expose task list and user preferences useCopilotReadable({ description: "User's tasks and productivity preferences", value: { tasks, preferences } }); // Enable task manipulation useCopilotAction({ name: "suggest_task_reorganization", description: "Reorganize tasks based on priority", handler: async (strategy) => { const reorganized = reorganizeTasks(tasks, strategy); setTasks(reorganized); } });
Pattern 3: E-Commerce Copilot
// Share cart state useCopilotReadable({ description: "Shopping cart contents and user profile", value: { cart, user } }); // Enable checkout actions useCopilotAction({ name: "apply_promotion", description: "Apply a promotional code to the cart", handler: async (code) => { const discount = await validatePromo(code); updateCartDiscount(discount); } });
Troubleshooting
Runtime Connection Issues
- ✓ Verify runtime endpoint is accessible
- ✓ Check CORS configuration
- ✓ Ensure credentials are correct
- ✓ Check browser console for connection errors
Actions Not Triggering
- ✓ Verify action names are unique
- ✓ Check parameter types match definitions
- ✓ Ensure handler function is provided
- ✓ Check for JavaScript errors in handler
State Not Updating
- ✓ Verify readables are wrapped with useCopilotReadable hook
- ✓ Ensure state is being updated in parent component
- ✓ Check that readables run on every render
- ✓ Verify state is serializable
Related Skills
- makefile-dev-workflow: Development workflow for the full stack
- playwright-ux-ui-capture: UI capture automation
- ux-ui-analyze-single-page: Single page UX analysis
Resources
- CopilotKit Official Documentation
- CopilotKit GitHub Repository
- Next.js Documentation
- React Hooks Documentation
Support
For issues or questions:
- Check the CopilotKit documentation
- Review the examples in the skill directory
- Check runtime logs for errors
- File an issue with reproduction steps