You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js API代理无法正确转发更新后的Cookie问题求助

问题描述

我正在使用Next.js API路由作为代理调用CopilotKit runtime URL,尝试通过自定义fetch将传入请求的Cookie和请求头转发至CopilotKit runtime。但代理始终使用应用启动时接收的首个Cookie,无法获取传入请求中的更新Cookie(已确认请求中存在更新后的Cookie)。我已尝试提取Cookie并将访问令牌作为自定义请求头传递,但问题仍未解决。

相关代码

import { copilotKitEndpoint, CopilotRuntime, copilotRuntimeNextJSPagesRouterEndpoint, OpenAIAdapter } from "@copilotkit/runtime";
import { NextApiRequest, NextApiResponse } from "next";
import OpenAI from "openai";

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
    // Extract cookies from the request
    const originalCookies = Object.entries(req.cookies)
        .map(([key, value]) => `${key}=${value}`)
        .join("; ");

    // Extract sAccessToken for x-access-token header
    const accessToken = req.cookies['sAccessToken'] || '';

    console.log("Original cookies captured:", originalCookies);
    console.log("Access token for x-access-token:", accessToken);

    // Store the original fetch function
    const originalFetch = global.fetch;
    global.fetch = async (input: RequestInfo | URL, init?: RequestInit) => {
        const url = typeof input === "string" ? input : input.toString();

        // Add custom headers for requests to the /copilotkit endpoint
        if (url.includes(`${process.env.ADMIN_AGENT}/copilotkit`)) {
            const modifiedInit = {
                ...init,
                headers: {
                    ...init?.headers,
                    Cookie: originalCookies, // Retain original cookies
                    'x-access-token': accessToken // Add custom x-access-token header
                }
            };

            console.log("Adding cookies and x-access-token to request:", {
                cookies: originalCookies,
                'x-access-token': accessToken
            });
            console.log("Full fetch init:", JSON.stringify(modifiedInit, null, 2));
            return originalFetch(input, modifiedInit);
        }

        // Fallback to original fetch for other requests
        return originalFetch(input, init);
    };

    // Initialize CopilotRuntime with remote endpoint
    const runtime = new CopilotRuntime({
        remoteEndpoints: [
            copilotKitEndpoint({
                url: `${process.env.ADMIN_AGENT}/copilotkit`
            })
        ]
    });

    // Create the request handler
    const handleRequest = copilotRuntimeNextJSPagesRouterEndpoint({
        endpoint: "/api/copilotkit",
        runtime,
        serviceAdapter: new OpenAIAdapter({ openai: new OpenAI({ apiKey: "" }) })
    });

    try {
        return await handleRequest(req, res);
    } finally {
        // Restore original fetch function
        global.fetch = originalFetch;
    }
};

export default handler;
解决方案

问题出在你通过替换global.fetch注入请求头的方式——这种全局修改的方式不可靠,CopilotRuntime内部可能在初始化阶段就绑定了原始fetch方法,或者并发请求时全局fetch的修改会被覆盖,导致后续请求复用旧Cookie。

正确做法是利用CopilotKit官方提供的copilotKitEndpoint配置项,直接在创建远程端点时注入当前请求的上下文头信息,无需修改全局fetch:

import { copilotKitEndpoint, CopilotRuntime, copilotRuntimeNextJSPagesRouterEndpoint, OpenAIAdapter } from "@copilotkit/runtime";
import { NextApiRequest, NextApiResponse } from "next";
import OpenAI from "openai";

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
    // Extract cookies from the request
    const originalCookies = Object.entries(req.cookies)
        .map(([key, value]) => `${key}=${value}`)
        .join("; ");

    // Extract sAccessToken for x-access-token header
    const accessToken = req.cookies['sAccessToken'] || '';

    console.log("Original cookies captured:", originalCookies);
    console.log("Access token for x-access-token:", accessToken);

    // Initialize CopilotRuntime with remote endpoint, using requestInit to inject headers
    const runtime = new CopilotRuntime({
        remoteEndpoints: [
            copilotKitEndpoint({
                url: `${process.env.ADMIN_AGENT}/copilotkit`,
                // 每次CopilotRuntime发起请求时,都会执行这个回调注入当前请求的最新头信息
                requestInit: () => ({
                    headers: {
                        Cookie: originalCookies,
                        'x-access-token': accessToken
                    }
                })
            })
        ]
    });

    // Create the request handler
    const handleRequest = copilotRuntimeNextJSPagesRouterEndpoint({
        endpoint: "/api/copilotkit",
        runtime,
        serviceAdapter: new OpenAIAdapter({ openai: new OpenAI({ apiKey: "" }) })
    });

    return await handleRequest(req, res);
};

export default handler;

关键改动说明

  1. 移除全局fetch的替换与恢复逻辑,避免全局状态污染和并发请求冲突
  2. 在copilotKitEndpoint中添加requestInit回调函数,确保每次请求都使用当前上下文的最新Cookie和自定义头
  3. 该方案是CopilotKit官方设计的自定义请求配置方式,更稳定且符合框架规范

内容的提问来源于stack exchange,提问作者Akhil Varghese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:45:19