Skip to main content
Select language: current language is Simplified Chinese
搜索或询问 Copilot
打开菜单

为后端服务设置 Copilot SDK

在服务器端应用程序中运行 GitHub Copilot SDK ,例如 API、Web 后端、微服务和后台辅助角色。

谁可以使用此功能?

GitHub Copilot SDK 适用于所有 Copilot 计划。

注意

          Copilot SDK 当前处于 技术预览版. 功能和可用性可能会发生更改。

CLI 作为一个无头服务器运行,你的后端代码通过网络连接到它。

          **最适合:** Web 应用后端、API 服务、内部工具、CI/CD 集成、任何服务器端工作负载。

工作原理

与生成 CLI 子进程的 SDK 相反,可以在 无外设服务器模式下独立运行 CLI。 后端通过 TCP 使用 cliUrl 选项连接到它。 有关无外设服务器体系结构的详细关系图及其与默认自动管理的 CLI 的比较方式,请参阅 github/copilot-sdk存储库

主要特征:

  • CLI 作为持久性服务器进程运行,而不是每个请求生成。
  • SDK 通过 TCP 进行连接 — CLI 和应用可以在不同的容器中运行。
  • 多个 SDK 客户端可以共享一个 CLI 服务器。
  • 适用于任何身份验证方法(GitHub 令牌、环境变量、BYOK)。

步骤 1:在无头模式下启动 CLI

在后台服务器模式下运行 CLI。

# Start with a specific port
copilot --headless --port 4321

# Or let it pick a random port (prints the URL)
copilot --headless
# Output: Listening on http://localhost:52431

对于生产,请将其作为系统服务或在容器中运行:

# Docker
docker run -d --name copilot-cli \
    -p 4321:4321 \
    -e COPILOT_GITHUB_TOKEN="$TOKEN" \
    ghcr.io/github/copilot-cli:latest \
    --headless --port 4321
# systemd
[Service]
ExecStart=/usr/local/bin/copilot --headless --port 4321
Environment=COPILOT_GITHUB_TOKEN=YOUR-GITHUB-TOKEN
Restart=always

步骤 2:连接 SDK

Node.js/TypeScript

import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient({
    cliUrl: "localhost:4321",
});

const session = await client.createSession({
    sessionId: `user-${userId}-${Date.now()}`,
    model: "gpt-4.1",
});

const response = await session.sendAndWait({ prompt: req.body.message });
res.json({ content: response?.data.content });

Python

from copilot import CopilotClient

client = CopilotClient({
    "cli_url": "localhost:4321",
})
await client.start()

session = await client.create_session({
    "session_id": f"user-{user_id}-{int(time.time())}",
    "model": "gpt-4.1",
})

response = await session.send_and_wait({"prompt": message})

Go

client := copilot.NewClient(&copilot.ClientOptions{
    CLIUrl: "localhost:4321",
})
client.Start(ctx)
defer client.Stop()

session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
    SessionID: fmt.Sprintf("user-%s-%d", userID, time.Now().Unix()),
    Model:     "gpt-4.1",
})

response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: message})

.NET

var client = new CopilotClient(new CopilotClientOptions
{
    CliUrl = "localhost:4321",
    UseStdio = false,
});

await using var session = await client.CreateSessionAsync(new SessionConfig
{
    SessionId = $"user-{userId}-{DateTimeOffset.UtcNow.ToUnixTimeSeconds()}",
    Model = "gpt-4.1",
});

var response = await session.SendAndWaitAsync(
    new MessageOptions { Prompt = message });

后端服务的身份验证

环境变量令牌

最简单的方法 - 在 CLI 服务器上设置令牌:

# All requests use this token
export COPILOT_GITHUB_TOKEN="YOUR-SERVICE-ACCOUNT-TOKEN"
copilot --headless --port 4321

替换 YOUR-SERVICE-ACCOUNT-TOKEN,使用服务帐户的 GitHubpersonal access token 或 OAuth 令牌。

每用户令牌 (OAuth)

创建会话时传递单个用户令牌:

// Your API receives user tokens from your auth layer
app.post("/chat", authMiddleware, async (req, res) => {
    const client = new CopilotClient({
        cliUrl: "localhost:4321",
        githubToken: req.user.githubToken,
        useLoggedInUser: false,
    });

    const session = await client.createSession({
        sessionId: `user-${req.user.id}-chat`,
        model: "gpt-4.1",
    });

    const response = await session.sendAndWait({
        prompt: req.body.message,
    });

    res.json({ content: response?.data.content });
});

BYOK (无 GitHub 身份验证)

请为模型提供商使用自己的 API 密钥:

const client = new CopilotClient({
    cliUrl: "localhost:4321",
});

const session = await client.createSession({
    model: "gpt-4.1",
    provider: {
        type: "openai",
        baseUrl: "https://api.openai.com/v1",
        apiKey: process.env.OPENAI_API_KEY,
    },
});

常见后端模式

使用 Express 的 Web API

import express from "express";
import { CopilotClient } from "@github/copilot-sdk";

const app = express();
app.use(express.json());

// Single shared CLI connection
const client = new CopilotClient({
    cliUrl: process.env.CLI_URL || "localhost:4321",
});

app.post("/api/chat", async (req, res) => {
    const { sessionId, message } = req.body;

    // Create or resume session
    let session;
    try {
        session = await client.resumeSession(sessionId);
    } catch {
        session = await client.createSession({
            sessionId,
            model: "gpt-4.1",
        });
    }

    const response = await session.sendAndWait({ prompt: message });
    res.json({
        sessionId,
        content: response?.data.content,
    });
});

app.listen(3000);

后台工作者

import { CopilotClient } from "@github/copilot-sdk";

const client = new CopilotClient({
    cliUrl: process.env.CLI_URL || "localhost:4321",
});

// Process jobs from a queue
async function processJob(job: Job) {
    const session = await client.createSession({
        sessionId: `job-${job.id}`,
        model: "gpt-4.1",
    });

    const response = await session.sendAndWait({
        prompt: job.prompt,
    });

    await saveResult(job.id, response?.data.content);
    await session.disconnect(); // Clean up after job completes
}

Docker Compose 部署

version: "3.8"

services:
  copilot-cli:
    image: ghcr.io/github/copilot-cli:latest
    command: ["--headless", "--port", "4321"]
    environment:
      - COPILOT_GITHUB_TOKEN=${COPILOT_GITHUB_TOKEN}
    ports:
      - "4321:4321"
    restart: always
    volumes:
      - session-data:/root/.copilot/session-state

  api:
    build: .
    environment:
      - CLI_URL=copilot-cli:4321
    depends_on:
      - copilot-cli
    ports:
      - "3000:3000"

volumes:
  session-data:

健康检查

监视 CLI 服务器的运行状况:

// Periodic health check
async function checkCLIHealth(): Promise<boolean> {
    try {
        const status = await client.getStatus();
        return status !== undefined;
    } catch {
        return false;
    }
}

会话清理

后端服务应主动清理会话,以避免资源泄漏:

// Clean up expired sessions periodically
async function cleanupSessions(maxAgeMs: number) {
    const sessions = await client.listSessions();
    const now = Date.now();

    for (const session of sessions) {
        const age = now - new Date(session.createdAt).getTime();
        if (age > maxAgeMs) {
            await client.deleteSession(session.sessionId);
        }
    }
}

// Run every hour
setInterval(() => cleanupSessions(24 * 60 * 60 * 1000), 60 * 60 * 1000);

局限性

限度详细信息
          **单 CLI 服务器 = 单一故障点** | 考虑生产部署的高可用性模式。 |

| SDK 和 CLI 之间没有内置身份验证 | 保护网络路径(同一主机、网吧等)。 | | 本地磁盘上的会话状态 | 装载持久存储以便容器重启时使用。 | | 30 分钟空闲超时 | 不活动的会话将被自动清理。 |

后续步骤

  • 有关安装和第一条消息,请参阅 开始使用 Copilot SDK
  • 有关在重启期间恢复会话的信息,请参阅存储库中的github/copilot-sdk
  • 有关添加用户身份验证的信息,请参阅存储库中的 github/copilot-sdk
Morty Proxy This is a proxified and sanitized view of the page, visit original site.