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

# Go

> 공식 Go SDK로 ARouter를 사용하세요.

## 설치

```bash theme={null}
go get github.com/arouter-ai/arouter-go
```

## 빠른 시작

```go theme={null}
package main

import (
    "context"
    "fmt"
    "log"

    arouter "github.com/arouter-ai/arouter-go"
)

func main() {
    client := arouter.NewClient(
        "https://api.arouter.ai",
        "lr_live_xxxx",
    )

    resp, err := client.ChatCompletion(context.Background(), arouter.ChatCompletionRequest{
        Model: "openai/gpt-5.4",
        Messages: []arouter.Message{
            {Role: "user", Content: "Hello!"},
        },
    })
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(resp.Choices[0].Message.Content)
}
```

## 멀티 Provider

```go theme={null}
// ARouter를 통한 Anthropic 사용
resp, _ := client.ChatCompletion(ctx, arouter.ChatCompletionRequest{
    Model: "anthropic/claude-sonnet-4.6",
    Messages: []arouter.Message{
        {Role: "user", Content: "Hello!"},
    },
})

// ARouter를 통한 DeepSeek 사용
resp, _ = client.ChatCompletion(ctx, arouter.ChatCompletionRequest{
    Model: "deepseek/deepseek-v3.2",
    Messages: []arouter.Message{
        {Role: "user", Content: "Hello!"},
    },
})
```

## 스트리밍

```go theme={null}
stream, err := client.ChatCompletionStream(context.Background(), arouter.ChatCompletionRequest{
    Model: "openai/gpt-5.4",
    Messages: []arouter.Message{
        {Role: "user", Content: "Go에 대한 하이쿠를 써주세요."},
    },
})
if err != nil {
    log.Fatal(err)
}
defer stream.Close()

for {
    chunk, err := stream.Recv()
    if err == arouter.ErrStreamDone {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Print(chunk.Choices[0].Delta.Content)
}
```

## Key 관리

관리 키（`lr_mgmt_`）를 사용하여 API key를 프로그래밍 방식으로 생성하고 관리합니다.

### API Key 생성

```go theme={null}
mgmtClient := arouter.NewClient("https://api.arouter.ai", "lr_mgmt_xxxx")

key, err := mgmtClient.CreateKey(ctx, &arouter.CreateKeyRequest{
    Name:             "production-backend",
    AllowedProviders: []string{"openai", "anthropic"},
    AllowedModels:    []string{"gpt-5.4", "claude-sonnet-4.6"},
    Limit:            float64Ptr(150),
    LimitReset:       "monthly",
})
if err != nil {
    log.Fatal(err)
}
fmt.Println("API Key:", key.Key)
```

### API Key 목록

```go theme={null}
keys, err := mgmtClient.ListKeys(ctx, &arouter.ListKeysOptions{
    PageSize: 20,
})
if err != nil {
    log.Fatal(err)
}
for _, k := range keys.Data {
    fmt.Printf("- %s (%s) disabled=%t\n", k.Name, k.Hash, k.Disabled)
}
```

### API Key 업데이트

```go theme={null}
_, err := mgmtClient.UpdateKey(ctx, "KEY_HASH", &arouter.UpdateKeyRequest{
    Disabled: boolPtr(true),
})
```

### API Key 삭제

```go theme={null}
err := mgmtClient.DeleteKey(ctx, "KEY_HASH")
```

## Provider 프록시

모델 필드 라우팅 없이 업스트림에 직접 접근합니다:

```go theme={null}
resp, err := client.ProxyRequest(ctx, "openai", "v1/chat/completions", map[string]any{
    "model":    "gpt-5.4",
    "messages": []map[string]string{{"role": "user", "content": "Hello!"}},
})
```

## 클라이언트 옵션

```go theme={null}
client := arouter.NewClient(
    "https://api.arouter.ai",
    "lr_live_xxxx",
    arouter.WithTimeout(30 * time.Second),
    arouter.WithHTTPClient(customHTTPClient),
)
```

## 지갑 JWT + x402 결제

암호화폐 지갑을 가진 AI 에이전트는 SIWx로 인증하고 x402로 크레딧을 결제할 수 있습니다.
SDK는 지갑 JWT를 캐시하고 이후 요청의 Bearer token으로 사용합니다.

### EVM（Base）

```go theme={null}
import (
    "github.com/ethereum/go-ethereum/crypto"
    arouter "github.com/arouter-ai/arouter-go"
)

key, _ := crypto.HexToECDSA("your-private-key-hex")

// 한 번의 호출로 지갑 JWT 갱신 + 자동 x402 결제 설정
client := arouter.NewClient(
    "https://api.arouter.ai",
    "",  // API key 불필요
    arouter.WithX402CoinbasePayment(key),
)

resp, err := client.ChatCompletion(ctx, arouter.ChatCompletionRequest{
    Model:    "openai/gpt-5.4",
    Messages: []arouter.Message{{Role: "user", Content: "Hello"}},
})
```

### Solana

```go theme={null}
solanaKey := ed25519.PrivateKey(yourKeyBytes)

client := arouter.NewClient(
    "https://api.arouter.ai",
    "",
    arouter.WithX402SolanaPayment(solanaKey),
)
```

### SIWx만（자동 결제 없음）

```go theme={null}
signer := arouter.NewEvmWalletSigner(privateKey)
result, err := arouter.AuthenticateWithSIWx(ctx, "https://api.arouter.ai", signer, nil)
client := arouter.NewClient("https://api.arouter.ai", result.JWT)
```

전체 프로토콜 흐름은 [x402 결제 가이드](/ko/guides/x402-payments)를 참고하세요.

## 에러 처리

```go theme={null}
resp, err := client.ChatCompletion(ctx, req)
if err != nil {
    var apiErr *arouter.APIError
    if errors.As(err, &apiErr) {
        switch apiErr.StatusCode {
        case 401:
            log.Fatal("API key가 유효하지 않습니다")
        case 429:
            log.Println("요청 제한, 재시도 중...")
        case 502:
            log.Println("업스트림 provider 오류")
        }
    }
}
```
