> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Session 恢復

> 使用 listSessions()、固定 Session ID、ResumeSessionConfig 與恢復最後 Session 的方式,還原 Laravel Copilot SDK 的對話。

## Session 恢復

恢復先前 Session 的方法。

## 在 Artisan 指令中以互動式聊天使用時

```php theme={null}
// 透過 listSessions 取得目前為止的 Session 清單
$sessions = Copilot::client()->listSessions();

// 使用 Laravel\Prompts\select 等挑選要恢復的 Session ID
$sessions = collect(Copilot::client()->listSessions())
    ->mapWithKeys(function (SessionMetadata $session) {
        return [$session->sessionId => $session->summary ?? ''];
    })
    ->toArray();

$session_id = select(
    label: 'What session do you want to resume?',
    options: $sessions,
);

// 以所選 ID 恢復 Session
$session = Copilot::client()->resumeSession($session_id);

// 取得先前的訊息
$messages = $session->getMessages();
```

## 使用固定的 Session ID 時

非互動式的情況下無法讓使用者選擇,因此一開始就指定固定的 ID。可依使用者 ID 或某些 context 來準備 ID。\
例如在網頁服務上為多使用者提供服務時,應事先準備 ID,採用此方式。

```php theme={null}
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

$config = new SessionConfig(
    sessionId: 'user-123-conversation',
);

Copilot::start(function (CopilotSession $session) {
    dump('Starting Copilot session: '.$session->id());

    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');
}, config: $config);
```

恢復的方式在 `Copilot::start` 中也可以透過 `resume` 參數指定。

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\ResumeSessionConfig;

// ResumeSessionConfig 無法指定 sessionId
$config = new ResumeSessionConfig();

Copilot::start(function (CopilotSession $session) {
    dump('Starting Copilot session: '.$session->id());

    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');
}, config: $config, resume: 'user-123-conversation');
```

也可以在 `Copilot::start` 的 closure 內丟棄目前的 Session 並重新開一個。

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

Copilot::start(function (CopilotSession $session) {
    dump('Starting Copilot session: '.$session->id());

    $session->disconnect();

    $session = Copilot::client()->resumeSession(sessionId: 'user-123-conversation');

    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');
});
```

## 恢復最後的 Session

當 Session 不存在時 `getLastSessionId()` 會傳回 `null`,因此會自動作為新 Session 開始。也可以切換 `SessionConfig`。

```php theme={null}
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\ResumeSessionConfig;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

$session_id = Copilot::client()->getLastSessionId();

if (empty($session_id)) {
    $config = new SessionConfig();
} else {
    $config = new ResumeSessionConfig();
}

Copilot::start(function (CopilotSession $session) {
    dump('Starting Copilot session: '.$session->id());

    $response = $session->sendAndWait(prompt: 'Tell me something about Laravel.');
}, config: $config, resume: $session_id);
```

## 使用 SessionMetadata

`getSessionMetadata()` 在 Session 不存在時同樣會傳回 `null`,因此會作為新 Session 開始。也能取得 Session 的建立時間與更新時間等資訊。

```php theme={null}
use Revolution\Copilot\Types\SessionMetadata;
use Revolution\Copilot\Facades\Copilot;

$meta = Copilot::client()->getSessionMetadata('user-123-conversation');
```

<Info>
  最新資訊請參閱 [GitHub 儲存庫](https://github.com/invokable/laravel-copilot-sdk)。
</Info>


## Related topics

- [Agent Loop](/zh-TW/packages/laravel-copilot-sdk/agent-loop.md)
- [SessionConfig](/zh-TW/packages/laravel-copilot-sdk/session-config.md)
- [Telemetry](/zh-TW/packages/laravel-copilot-sdk/telemetry.md)
- [Streaming Events](/zh-TW/packages/laravel-copilot-sdk/streaming-events.md)
- [Session](/zh-TW/session.md)
