# Default setup (bundled CLI)
The Node.js and .NET SDKs include the Copilot CLI as a dependency—your app ships with everything it needs, with no extra installation or configuration required.
The Python SDK recommends a one-time download step after installation:
```bash
python -m copilot download-runtime
```
This downloads the matching runtime and caches it locally. If you skip this step, the SDK will attempt to download it automatically on first use as a fallback.
**Best for:** Most applications—desktop apps, standalone tools, CLI utilities, prototypes, and more.
## How it works
When you install the SDK, the Copilot runtime is included automatically (Node.js, .NET) or downloaded via `python -m copilot download-runtime` (Python). The SDK starts it as a child process and communicates over stdio. There's nothing extra to configure.
```mermaid
flowchart TB
subgraph Bundle["Your Application"]
App["Application Code"]
SDK["SDK Client"]
CLIBin["Copilot CLI Binary
(included with SDK)"]
end
App --> SDK
SDK --> CLIBin
CLIBin -- "API calls" --> Copilot["☁️ GitHub Copilot"]
style Bundle fill:#0d1117,stroke:#58a6ff,color:#c9d1d9
```
**Key characteristics:**
* CLI binary is included with the SDK—no separate install needed
* The SDK manages the CLI version to ensure compatibility
* Users authenticate through your app (or use env vars / BYOK)
* Sessions are managed per-user on their machine
## Quick start
Node.js / TypeScript
```typescript
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient();
const session = await client.createSession({ model: "gpt-4.1" });
const response = await session.sendAndWait({ prompt: "Hello!" });
console.log(response?.data.content);
await client.stop();
```
Python
```python
from copilot import CopilotClient
from copilot.session import PermissionHandler
client = CopilotClient()
await client.start()
session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model="gpt-4.1")
response = await session.send_and_wait("Hello!")
print(response.data.content)
await client.stop()
```
Go
> [!NOTE]
> The Go SDK does not bundle the CLI. You must install the CLI separately or set `Connection` to point to an existing binary. See [Local CLI Setup](./local-cli.md) for details.
```go
package main
import (
"context"
"fmt"
"log"
copilot "github.com/github/copilot-sdk/go"
)
func main() {
ctx := context.Background()
client := copilot.NewClient(nil)
if err := client.Start(ctx); err != nil {
log.Fatal(err)
}
defer client.Stop()
session, _ := client.CreateSession(ctx, &copilot.SessionConfig{Model: "gpt-4.1"})
response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: "Hello!"})
if d, ok := response.Data.(*copilot.AssistantMessageData); ok {
fmt.Println(d.Content)
}
}
```
```go
client := copilot.NewClient(nil)
if err := client.Start(ctx); err != nil {
log.Fatal(err)
}
defer client.Stop()
session, _ := client.CreateSession(ctx, &copilot.SessionConfig{Model: "gpt-4.1"})
response, _ := session.SendAndWait(ctx, copilot.MessageOptions{Prompt: "Hello!"})
if d, ok := response.Data.(*copilot.AssistantMessageData); ok {
fmt.Println(d.Content)
}
```
.NET
```csharp
await using var client = new CopilotClient();
await using var session = await client.CreateSessionAsync(
new SessionConfig { Model = "gpt-4.1" });
var response = await session.SendAndWaitAsync(
new MessageOptions { Prompt = "Hello!" });
Console.WriteLine(response?.Data.Content);
```
Java
> [!NOTE]
> The Java SDK does not bundle or embed the Copilot CLI. You must install the CLI separately and configure its path via `Connection` or the `COPILOT_CLI_PATH` environment variable.
```java
import com.github.copilot.CopilotClient;
import com.github.copilot.rpc.*;
var client = new CopilotClient(new CopilotClientOptions()
// Point to the CLI binary installed on the system
.setCliPath("/path/to/vendor/copilot")
);
client.start().get();
var session = client.createSession(new SessionConfig()
.setModel("gpt-4.1")
.setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
).get();
var response = session.sendAndWait(new MessageOptions()
.setPrompt("Hello!")).get();
System.out.println(response.getData().content());
client.stop().get();
```
## Authentication strategies
You need to decide how your users will authenticate. Here are the common patterns:
```mermaid
flowchart TB
App["Bundled App"]
App --> A["User signs in to CLI
(keychain credentials)"]
App --> B["App provides token
(OAuth / env var)"]
App --> C["BYOK
(your own API keys)"]
A --> Note1["User runs 'copilot' once
to authenticate"]
B --> Note2["Your app handles login
and passes token"]
C --> Note3["No GitHub auth needed
Uses your model provider"]
style App fill:#0d1117,stroke:#58a6ff,color:#c9d1d9
```
### Option A: user's signed-in credentials (simplest)
The user signs in to the CLI once, and your app uses those credentials. No extra code needed—this is the default behavior.
```typescript
const client = new CopilotClient();
// Default: uses signed-in user credentials
```
### Option B: token via environment variable
Ship your app with instructions to set a token, or set it programmatically:
```typescript
const client = new CopilotClient({
env: {
COPILOT_GITHUB_TOKEN: getUserToken(), // Your app provides the token
},
});
```
### Option C: BYOK (no GitHub auth needed)
If you manage your own model provider keys, users don't need GitHub accounts at all:
```typescript
const client = new CopilotClient();
const session = await client.createSession({
model: "gpt-4.1",
provider: {
type: "openai",
baseUrl: "https://api.openai.com/v1",
apiKey: process.env.OPENAI_API_KEY,
},
});
```
See the **[BYOK guide](../auth/byok.md)** for full details.
## Session management
Apps typically want named sessions so users can resume conversations:
```typescript
const client = new CopilotClient();
// Create a session tied to the user's project
const sessionId = `project-${projectName}`;
const session = await client.createSession({
sessionId,
model: "gpt-4.1",
});
// User closes app...
// Later, resume where they left off
const resumed = await client.resumeSession(sessionId);
```
Session state persists at `~/.copilot/session-state/{sessionId}/`.
## When to move on
| Need | Next Guide |
|------|-----------|
| Users signing in with GitHub accounts | [GitHub OAuth](./github-oauth.md) |
| Run on a server instead of user machines | [Backend Services](./backend-services.md) |
| Use your own model keys | [BYOK](../auth/byok.md) |
## Next steps
* **[BYOK guide](../auth/byok.md)**: Use your own model provider keys
* **[Session Persistence](../features/session-persistence.md)**: Advanced session management
* **[Getting Started tutorial](../getting-started.md)**: Build a complete app