Bỏ qua để đến nội dung

React đến AG-UI Agent

Nx Plugin for AWS cung cấp một generator để kết nối một trang web React với Strands Agent sử dụng giao thức AG-UI. Nó kết nối CopilotKit với HttpAgent của @ag-ui/client trên trang web của bạn, hỗ trợ xác thực AWS IAM và Cognito.

Trước khi sử dụng generator này, hãy đảm bảo bạn có:

  1. Một trang web React (được tạo bằng generator ts#react-website)
  2. Một Python Strands Agent với protocol=AG-UI (được tạo bằng generator py#strands-agent)
  3. Đối với các agent đã triển khai, Cognito Auth được thêm vào thông qua generator ts#react-website-auth
  1. Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
  2. Mở Nx Console trong VSCode
  3. Nhấp Generate (UI) trong phần "Common Nx Commands"
  4. Tìm kiếm @aws/nx-plugin - connection
  5. Điền các tham số bắt buộc
    • Nhấp Generate

    Bạn sẽ được nhắc chọn trang web React của mình làm dự án nguồn và dự án chứa AG-UI Strands Agent của bạn làm dự án đích. Nếu dự án đích của bạn chứa nhiều component (như nhiều agent hoặc các loại component khác), bạn sẽ được nhắc chỉ định targetComponent để phân biệt.

    Tham số Kiểu Mặc định Mô tả
    sourceProject Bắt buộc string - Dự án nguồn
    targetProject Bắt buộc string - Dự án đích để kết nối tới
    sourceComponent string - Component nguồn để kết nối từ đó (tên component, đường dẫn tương đối so với thư mục gốc của dự án nguồn, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm nguồn.
    targetComponent string - Component đích để kết nối tới (tên component, đường dẫn tương đối so với thư mục gốc của dự án đích, hoặc generator id). Sử dụng '.' để chọn rõ ràng dự án làm đích.

    Generator tạo ra một component AguiProvider được chia sẻ duy nhất và một hook cho mỗi agent được kết nối:

    • Thư mụcsrc
      • Thư mụccomponents
        • AguiProvider.tsx CopilotKitProvider duy nhất cho mọi AG-UI agent. Được tạo lần đầu tiên khi chạy connection và được cập nhật trong các lần chạy tiếp theo để đăng ký mỗi agent mới.
      • Thư mụchooks
        • useAgui<AgentName>.tsx Đăng ký một AG-UI agent. Một file cho mỗi lần chạy connection.
        • useSigV4.tsx Ký SigV4 (chỉ IAM)

    Chạy connection lần thứ hai cho một agent khác sẽ thêm một hook useAgui<AgentName>.tsx mới và cập nhật AguiProvider.tsx để đăng ký cả hai hook — mọi chỉnh sửa tùy chỉnh bạn đã thực hiện đối với provider đều được bảo toàn. main.tsx giữ wrapper <AguiProvider> duy nhất của nó — bạn không bao giờ có các provider lồng nhau.

    Các dependency sau được thêm vào package.json gốc:

    • @copilotkit/react-core — cung cấp CopilotKitProvider và các component chat (CopilotChat, CopilotSidebar, CopilotPopup)
    • @ag-ui/clientHttpAgent được sử dụng bởi các hook được tạo
    • aws4fetch, oidc-client-ts, react-oidc-context, @aws-sdk/credential-providers — chỉ xác thực IAM
    • react-oidc-context — xác thực Cognito

    Mỗi hook useAgui<AgentName> đọc giá trị runtime của agent từ Runtime Configuration và khởi tạo một HttpAgent của @ag-ui/client:

    • Đã triển khai: giá trị runtime là Bedrock AgentCore Runtime ARN, được chuyển đổi thành endpoint HTTPS của AgentCore: https://bedrock-agentcore.<region>.amazonaws.com/runtimes/<encoded-arn>/invocations?qualifier=DEFAULT
    • Phát triển cục bộ: serve-local ghi đè giá trị thành URL cục bộ của agent (ví dụ: http://localhost:8081)

    AguiProvider được chia sẻ gọi mọi hook được tạo và trải từng cái vào selfManagedAgents trên một CopilotKitProvider duy nhất, điều này hiển thị tất cả chúng cho các component CopilotKit.

    CopilotKit là client React tham chiếu chính thức cho giao thức AG-UI và cung cấp sẵn các component chat:

    • <CopilotChat /> — giao diện chat đầy đủ
    • <CopilotSidebar /> — chat bảng điều khiển bên cố định
    • <CopilotPopup /> — cửa sổ chat nổi

    Đặt bất kỳ component nào trong số này ở bất kỳ đâu bên trong wrapper <AguiProvider> (đã được kết nối vào main.tsx cho bạn).

    Mã được tạo xử lý xác thực tùy thuộc vào cấu hình agent của bạn:

    • IAM (mặc định): sử dụng các yêu cầu HTTP được ký AWS SigV4. Thông tin xác thực được lấy từ Cognito Identity Pool được cấu hình với xác thực của trang web.
    • Cognito: nhúng JWT access token vào header Authorization dưới dạng Bearer token.

    Nếu agent của bạn sử dụng xác thực IAM, vai trò đã xác thực của Cognito Identity Pool phải được cấp quyền để gọi agent.

    packages/infra/src/stacks/application-stack.ts
    const identity = new UserIdentity(this, 'Identity');
    const myAgent = new MyAgent(this, 'MyAgent');
    // Grant the authenticated Cognito role permission to invoke the agent
    myAgent.grantInvokeAccess(identity.identityPool.authenticatedRole);

    grantInvokeAccess kết nối tất cả các hành động gọi AgentCore (InvokeAgentRuntime, InvokeAgentRuntimeWithWebSocketStream) trên ARN runtime của agent.

    Nếu agent của bạn sử dụng xác thực Cognito, bạn không cần định nghĩa bất kỳ cơ sở hạ tầng bổ sung nào để kết nối trang web của bạn với agent.

    Khởi tạo các component CopilotKit với agentId để chọn agent nào sẽ sử dụng. Id là tên của agent — tên mà bạn đã chọn khi chạy generator py#strands-agent — và bạn cũng có thể tìm thấy nó trong file hook được tạo (ví dụ: key được trả về từ packages/web/src/hooks/useAgui<AgentName>.tsx):

    import { CopilotChat } from '@copilotkit/react-core/v2';
    function ChatPage() {
    return (
    <CopilotChat
    agentId="agent"
    labels={{
    welcomeMessageText: 'How can I help you today?',
    chatInputPlaceholder: 'Ask me anything...',
    }}
    />
    );
    }

    Chạy generator connection một lần cho mỗi agent. Mọi agent được đăng ký thông qua AguiProvider được chia sẻ đều hiển thị từ bất kỳ đâu trong ứng dụng — khởi tạo một component CopilotKit với agentId khác nhau để định tuyến mỗi chat đến agent bạn muốn:

    <CopilotChat agentId="story" /> {/* talks to StoryAgent */}
    <CopilotChat agentId="research" /> {/* talks to ResearchAgent */}

    <CopilotChat /> (và <CopilotSidebar />, <CopilotPopup />) sử dụng hệ thống slot đệ quy — bạn có thể ghi đè bất kỳ sub-component nào bằng chuỗi class Tailwind, đối tượng prop hoặc component React tùy chỉnh. Xem hướng dẫn slot CopilotKit để biết cây slot đầy đủ.

    <CopilotChat
    agentId="agent"
    // style the input and its children
    input={{
    textArea: 'text-blue-600',
    sendButton: 'bg-blue-600 hover:bg-blue-700',
    }}
    // style nested message slots
    messageView={{
    assistantMessage: 'bg-blue-50 rounded-xl p-2',
    userMessage: 'bg-blue-100 rounded-xl',
    }}
    />

    Bất kỳ slot nào cũng có thể nhận một component React thay vì className, vì vậy bạn có thể thay thế hoàn toàn mặc định:

    import { CopilotChat } from '@copilotkit/react-core/v2';
    const MySendButton: React.FC<{ onClick: () => void }> = ({ onClick }) => (
    <button onClick={onClick} className="my-send-btn">
    ✨ Send
    </button>
    );
    <CopilotChat
    agentId="agent"
    input={{ sendButton: MySendButton }}
    />;

    Ghi đè sâu hơn tuân theo cùng một hình dạng — ví dụ: chỉ thay thế nút sao chép trên tin nhắn trợ lý:

    <CopilotChat
    agentId="agent"
    messageView={{
    assistantMessage: {
    copyButton: ({ onClick }) => <button onClick={onClick}>Copy</button>,
    },
    }}
    />

    Generator kết nối tự động cấu hình tích hợp serve-local:

    1. Chạy nx serve-local <website> cũng sẽ khởi động máy chủ cục bộ của agent
    2. Cấu hình runtime được ghi đè để trỏ đến URL AG-UI cục bộ (ví dụ: http://localhost:8081)
    3. Cả trang web và agent đều hot-reload cùng nhau
    Terminal window
    pnpm nx serve-local <WebsiteProject>