跳转到主要内容

SessionConfig

通过 SessionConfig 类可以进行各种设置。 Copilot::run(prompt: '...', config: $config)Copilot::start(function (CopilotSession $session) { ... }, config: $config) 的方式使用。 当你只是想指定模型这种无需用到 SessionConfig 类的情况时,也可以用数组指定。Copilot::run(prompt: '...', config: ['model' => 'auto'])
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SystemMessageConfig;
use Revolution\Copilot\Types\InfiniteSessionConfig;
use Revolution\Copilot\Types\UserInputRequest;
use Revolution\Copilot\Types\Rpc\ModelCapabilitiesOverride;
use Revolution\Copilot\Types\Rpc\ModelCapabilitiesOverrideSupports;
use Revolution\Copilot\Types\Rpc\ModelCapabilitiesOverrideLimits;
use Revolution\Copilot\Enums\ReasoningEffort;

$config = new SessionConfig(
    // 指定要使用的模型
    model: 'auto',

    // 在创建新会话时指定固定的 session ID
    sessionId: 'session-123',

    clientName: 'my-app',

    // 推理级别。仅在支持的模型上可设置。
    reasoningEffort: ReasoningEffort::HIGH,

    // 覆盖模型的 capabilities。会与运行时的默认值 deep-merge。
    // modelCapabilities: new ModelCapabilitiesOverride(
    //     supports: new ModelCapabilitiesOverrideSupports(vision: true, reasoningEffort: true),
    //     limits: new ModelCapabilitiesOverrideLimits(max_prompt_tokens: 200000),
    // ),
    // 也可以用数组指定
    // modelCapabilities: ['supports' => ['vision' => true]],

    // 覆盖 config 目录
    configDirectory: '',

    // 启用 MCP 配置和技能目录的自动发现
    // 会从工作目录自动发现 .mcp.json 或 .vscode/mcp.json,
    // 并与显式指定的 mcpServers 或 skillDirectories 合并(名称冲突时显式指定优先)
    enableConfigDiscovery: true,

    // 自定义工具
    tools: [...],

    // 系统消息
    systemMessage: new SystemMessageConfig(
        content: 'You are a helpful assistant for Laravel developers.',
    ),

    // 系统消息:replace 模式(完全替换 system prompt)
    // systemMessage: new SystemMessageConfig(
    //     mode: 'replace',
    //     content: '自定义的完整 system prompt',
    // ),

    // 系统消息:customize 模式(按段落覆盖)
    // systemMessage: new SystemMessageConfig(
    //     mode: 'customize',
    //     sections: [
    //         'tone' => new SectionOverride(action: SectionOverrideAction::REPLACE, content: 'Always respond in Japanese.'),
    //         'safety' => new SectionOverride(action: SectionOverrideAction::REMOVE),
    //         'custom_instructions' => new SectionOverride(action: SectionOverrideAction::APPEND, content: 'Additional instructions here.'),
    //     ],
    //     content: '与 append 模式类似的追加内容(可选)',
    // ),

    // 自定义提供商
    provider: new ProviderConfig(),

    // 每个会话独立的 GitHub token(多租户支持)
    // 可以在客户端级别 github_token 之外,按会话指定 token
    gitHubToken: $user->github_token,

    // 远程会话的行为模式
    // 'off' - 仅本地(默认)
    // 'export' - 将会话事件导出到 GitHub(不带远程 steering)
    // 'on' - 同时启用导出和远程 steering
    remoteSession: \Revolution\Copilot\Enums\RemoteSessionMode::Export,

    // 云端会话(不在本地而是在云端创建会话)
    // 可以选择性地关联仓库信息
    cloud: new \Revolution\Copilot\Types\CloudSessionOptions(
        repository: new \Revolution\Copilot\Types\CloudSessionRepository(
            owner: 'myorg',
            name: 'myrepo',
            branch: 'main',
        ),
    ),

    onPermissionRequest: function (array $request) {
        // 处理权限请求
    },

    onUserInputRequest: function (UserInputRequest $request) {
        // 处理用户输入请求。ask_user
    },

    // Elicitation 请求处理器
    // 设置后可以接收来自代理的基于表单的 UI 对话请求
    onElicitationRequest: function (ElicitationContext $context) {
        // 处理 elicitation 请求
        return ['action' => 'accept', 'content' => ['field' => 'value']];
    },

    // Plan 模式退出请求处理器
    // 设置后可以在代理退出 plan 模式时接收请求
    onExitPlanModeRequest: function (ExitPlanModeRequest $request) {
        // 检查 plan 内容并批准 / 拒绝
        return new ExitPlanModeResult(approved: true, selectedAction: $request->recommendedAction);
    },

    // 自动模式切换请求处理器
    // 在达到速率限制时,可以选择是否允许切换到 auto 模式
    onAutoModeSwitchRequest: function (AutoModeSwitchRequest $request) {
        // 返回 "yes"、"yes_always"、"no" 之一
        return 'yes';
    },

    // 会话钩子
    hooks: [],

    // 工作目录
    workingDirectory: '',

    // 启用流式输出
    streaming: true,

    // 是否将子代理的流式事件包含到主流中(默认: true)
    includeSubAgentStreamingEvents: true,

    // 可用的内置工具
    availableTools: ['read_file', 'write_file'],

    // 或者要排除的工具
    excludedTools: ['shell'],

    // MCP 服务器配置
    mcpServers: [
        'github' => [
            'type' => 'http',
            'url' => 'https://api.githubcopilot.com/mcp/',
        ],
    ],

    // 自定义代理
    customAgents: [
        [
            'name' => 'reviewer',
            'displayName' => 'Code Reviewer',
            'description' => 'Reviews code for best practices',
            'prompt' => 'You are an expert code reviewer.',
        ],
    ],

    // 默认代理配置。当没有选择自定义代理时使用的内置代理配置。
    // excludedTools: 从默认代理中排除的工具列表。
    // 对自定义子代理仍然可用。
    defaultAgent: ['excludedTools' => ['tool_name']],

    // 指定会话启动时激活的代理。需要与 customAgents 的 name 一致。
    agent: 'reviewer',

    // 技能目录
    skillDirectories: [],

    // 已禁用的技能
    disabledSkills: [],

    // 无限会话配置。默认启用。
    infiniteSessions: new InfiniteSessionConfig(
        enabled: true,
        backgroundCompactionThreshold: 0.80, // 上下文使用率达到 80% 时开始压缩
        bufferExhaustionThreshold: 0.95,     // 直到压缩完成前在 95% 时阻塞
    ),

    // 禁用无限会话
    // infiniteSessions: new InfiniteSessionConfig(enabled: false),

    // 在会话创建 RPC 之前注册事件处理器。
    // 用于避免遗漏 session.start 等早期事件。
    // 与之后调用 $session->on($handler) 等价,但在生命周期更早阶段注册。
    onEvent: function (SessionEvent $event) {
        // 接收所有会话事件
    },
);

$response = Copilot::run('...', config: $config);
会话恢复时使用 ResumeSessionConfig 类。它与 SessionConfig 几乎相同,只有一点点差异。ResumeSessionConfig 只指定要变更的配置项。其他会沿用新建会话时的配置。 云端执行请参考 Cloud Sessions,Plugin Directory 请参考 Plugin Directories
最新信息请参考 GitHub 仓库
最后修改于 2026年7月13日