跳轉到主要內容

安裝

go get github.com/arouter-ai/arouter-go

快速開始

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

// 透過 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!"},
    },
})

串流輸出

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

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

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

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

刪除 API Key

err := mgmtClient.DeleteKey(ctx, "KEY_HASH")

Provider 代理

直接存取上游,無需透過模型欄位路由:
resp, err := client.ProxyRequest(ctx, "openai", "v1/chat/completions", map[string]any{
    "model":    "gpt-5.4",
    "messages": []map[string]string{{"role": "user", "content": "Hello!"}},
})

客戶端選項

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)

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

solanaKey := ed25519.PrivateKey(yourKeyBytes)

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

僅 SIWx(不自動支付)

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 支付指南

錯誤處理

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 錯誤")
        }
    }
}