言語モデル統合

アシスタントパネル

アシスタントパネルは、OpenAIの大規模言語モデルと対話する方法を提供します。アシスタントは、コードの生成、既存のコードに関する質問、メールやドキュメントなどのプレーンテキストの作成など、さまざまなタスクに役立ちます。アシスタントパネルを開くには、コマンドパレット(cmd-shift-p)でworkspace: toggle right dockアクションを使用して、右側のドックを切り替えます。

:設定で右ドックを切り替えるためのデフォルトのバインドを設定できます。

セットアップ

  1. OpenAI APIキーを作成します。

  2. OpenAIアカウントにクレジットがあることを確認してください。

  3. コマンドパレット(cmd-shift-p)でassistant: toggle focusまたはworkspace: toggle right dockアクションを使用して、アシスタントパネルを開きます。

  4. アシスタントパネルにフォーカスが当たっていることを確認してください。

    The focused assistant panel

  5. コマンドパレット(cmd-shift-p)を開き、使用可能になったassistant: reset keyアクションを使用してOpenAI APIキーを設定します:右側のフィールドにOpenAI APIキーを入力してReturnキーを押します

OpenAI APIキーはキーチェーンに保存されます。

Zedは、OPENAI_API_KEY環境変数が定義されている場合にも使用します。 OpenAI APIキーをリセットする必要がある場合は、アシスタントパネルにフォーカスを当て、コマンドパレットアクションassistant: reset keyを実行します。

会話をする

Zedのアシスタントエディターは、他のエディターと同様に機能します。カスタムキーバインドを使用し、複数のカーソルを操作できるため、コーディングと言語モデルとのディスカッションをシームレスに切り替えることができます。ただし、アシスタントエディターは、メッセージブロックが含まれている点が異なります。これらのブロックは、会話内の異なる役割に対応するテキストのコンテナとして機能します。これらの役割には以下が含まれます。

  • あなた
  • アシスタント
  • システム

開始するには、モデルを選択し、あなたブロックにメッセージを入力します。

Asking a question

入力すると、選択したモデルの残りのトークン数が更新されます。

エディターからテキストを挿入するには、テキストを強調表示してcmd->assistant: quote selection)を実行するだけです。コードの場合は、Zedがフェンス付きコードブロックで囲みます。

Quoting a selection

メッセージを送信するには、cmd-enterassistant: assist)を使用します。 enterキーを押すとメッセージが送信される一般的なチャットアプリケーションとは異なり、アシスタントエディターでは、できるだけ通常のエディターに近い感覚にすることを目標としていました。そのため、enterキーを押すと、単に新しい行が挿入されます。

メッセージを送信した後、アシスタントの応答は、アシスタントメッセージブロックにストリーミングされます。

Receiving an answer

ストリームは、escapeでいつでもキャンセルできます。これは、応答が探しているものではないことに早期に気付いた場合に役立ちます。

いつでも新しい会話を開始する場合は、cmd-nを押すか、パネルの左上にあるハンバーガーメニューの[新しいコンテキスト]メニューオプションを使用できます。

簡単なやり取りの会話は、アシスタントでうまく機能します。ただし、会話の前のテキストを変更して、別の方向に進む必要がある場合があります。

会話を編集する

アシスタントは、会話を自由に制御できるようにします。アシスタントからの応答を含め、以前のテキストを自由に編集できます。メッセージブロック全体を削除する場合は、カーソルをブロックの先頭に置いてdeleteキーを使用するだけです。典型的なワークフローには、問い合わせを絞り込んだり、追加のコンテキストを提供したりするために、会話全体で編集や調整を行うことが含まれる場合があります。次に例を示します。

  1. あなたブロックにテキストを書き込みます。
  2. cmd-enterでメッセージを送信します。
  3. 期待どおりのアシスタント応答が得られません。
  4. escapeで応答をキャンセルします。
  5. アシスタントメッセージブロックの内容を消去し、ブロック全体を削除します。
  6. 元のメッセージに追加のコンテキストを追加します。
  7. cmd-enterでメッセージを送信します。

以前のメッセージを編集できることで、トークンの使用方法を制御できます。間違いを修正したり、追加のコンテキストを追加したりするために新しいコンテキストを起動する必要はなく、フォローアップの修正を送信することでトークンを無駄にする必要もありません。

注意すべき追加事項

  • 会話の途中でモデルタイプを自由に変更できます。
  • 役割をクリックすることでメッセージブロックの役割を切り替えることができます。これは、アシスタントブロックで応答を受信し、それを編集してあなたブロックとして送り返したい場合に役立ちます。

会話の保存と読み込み

最初のメッセージを送信した後、言語モデルによって会話の名前が生成され、会話はファイルシステムの~/.config/zed/conversationsに自動的に保存されます。アシスタントパネルの左上隅にあるハンバーガーボタンをクリックすると、以前のメッセージにアクセスして読み込むことができます。

Viewing assistant history

OpenAIのカスタムAPIエンドポイントを使用する

OpenAI API構造と互換性がある限り、OpenAIのカスタムAPIエンドポイントを使用できます。

そのためには、Zedのsettings.jsonに以下を追加します。

{
  "assistant": {
    "version": "1",
    "provider": {
      "name": "openai",
      "type": "openai",
      "default_model": "gpt-4-turbo-preview",
      "api_url": "http://localhost:11434/v1"
    }
  }
}

ここでのカスタムURLはhttp://localhost:11434/v1です。

macOSでOllamaを使用する

OllamaをOpenAPIエンドポイントとして表示させることで、ZedアシスタントでOllamaを使用できます。

  1. Zedのsettings.jsonに以下を追加します。
{
  "assistant": {
    "version": "1",
    "provider": {
      "name": "openai",
      "type": "openai",
      "default_model": "gpt-4-turbo-preview",
      "api_url": "http://localhost:11434/v1"
    }
  }
}
  1. たとえば、Ollamaでmistralモデルをダウンロードします。
ollama run mistral
  1. モデルをコピーし、Zedのsettings.jsonのモデルと一致するように名前を変更します。
ollama cp mistral gpt-4-turbo-preview
  1. assistant: reset key(上記のセットアップセクションを参照)を使用し、次のAPIキーを入力します。
ollama
  1. Zedを再起動します。

Claude 3.5 Sonnetを使用する

次の設定を追加することで、ZedアシスタントでClaudeを使用できます。

"assistant": {
  "version": "1",
  "provider": {
    "default_model": "claude-3-5-sonnet",
    "name": "anthropic"
  }
},

設定を保存すると、アシスタントパネルが開き、Anthropic APIキーを追加するように求められます。このキーはこちらから取得できます。

Claude Proの料金を支払った場合でも、API経由で使用する場合は追加のクレジットの料金を支払う必要があります。

インライン生成

テキストを選択してctrl-enterを押すと、任意のエディターでテキストを生成および変換できます。複数のカーソルでctrl-enterを押すか、マルチバッファの複数の抜粋にまたがる選択でctrl-enterを押すと、複数の生成リクエストを並行して実行することもできます。プロンプトを事前入力するカスタムキーバインドを作成するには、キーマップに次の形式を追加します。

[
  {
    "context": "Editor && mode == full",
    "bindings": {
      "ctrl-shift-enter": [
        "assistant::InlineAssist",
        { "prompt": "Build a snake game" }
      ]
    }
  }
]