mirror of
https://fastgit.cc/https://github.com/anomalyco/opencode
synced 2026-05-05 00:03:03 +08:00
Compare commits
3 Commits
kit/pty-no
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b70e2700ef | ||
|
|
1aed6b1d8b | ||
|
|
c1f607d206 |
@@ -158,11 +158,13 @@ export async function handler(
|
||||
Object.entries(obj).flatMap(([k, v]) => {
|
||||
if (Array.isArray(v)) return [[k, v]]
|
||||
if (typeof v === "object") return [[k, replacer(v)]]
|
||||
if (v === "$ip") return [[k, ip]]
|
||||
if (v === "$workspace") return authInfo?.workspaceID ? [[k, authInfo?.workspaceID]] : []
|
||||
if (v.startsWith("$header.")) {
|
||||
const headerValue = input.request.headers.get(v.slice(8))
|
||||
return headerValue ? [[k, headerValue]] : []
|
||||
if (typeof v === "string") {
|
||||
if (v === "$ip") return [[k, ip]]
|
||||
if (v === "$workspace") return authInfo?.workspaceID ? [[k, authInfo?.workspaceID]] : []
|
||||
if (v.startsWith("$header.")) {
|
||||
const headerValue = input.request.headers.get(v.slice(8))
|
||||
return headerValue ? [[k, headerValue]] : []
|
||||
}
|
||||
}
|
||||
return [[k, v]]
|
||||
}),
|
||||
|
||||
@@ -138,6 +138,14 @@ function useLanguageModel(sdk: any) {
|
||||
return sdk.responses === undefined && sdk.chat === undefined
|
||||
}
|
||||
|
||||
function selectAzureLanguageModel(sdk: any, modelID: string, useChat: boolean) {
|
||||
if (useChat && sdk.chat) return sdk.chat(modelID)
|
||||
if (sdk.responses) return sdk.responses(modelID)
|
||||
if (sdk.messages) return sdk.messages(modelID)
|
||||
if (sdk.chat) return sdk.chat(modelID)
|
||||
return sdk.languageModel(modelID)
|
||||
}
|
||||
|
||||
function custom(dep: CustomDep): Record<string, CustomLoader> {
|
||||
return {
|
||||
anthropic: () =>
|
||||
@@ -222,12 +230,7 @@ function custom(dep: CustomDep): Record<string, CustomLoader> {
|
||||
return {
|
||||
autoload: false,
|
||||
async getModel(sdk: any, modelID: string, options?: Record<string, any>) {
|
||||
if (useLanguageModel(sdk)) return sdk.languageModel(modelID)
|
||||
if (options?.["useCompletionUrls"]) {
|
||||
return sdk.chat(modelID)
|
||||
} else {
|
||||
return sdk.responses(modelID)
|
||||
}
|
||||
return selectAzureLanguageModel(sdk, modelID, Boolean(options?.["useCompletionUrls"]))
|
||||
},
|
||||
options: {
|
||||
resourceName: resource,
|
||||
@@ -247,12 +250,7 @@ function custom(dep: CustomDep): Record<string, CustomLoader> {
|
||||
return {
|
||||
autoload: false,
|
||||
async getModel(sdk: any, modelID: string, options?: Record<string, any>) {
|
||||
if (useLanguageModel(sdk)) return sdk.languageModel(modelID)
|
||||
if (options?.["useCompletionUrls"]) {
|
||||
return sdk.chat(modelID)
|
||||
} else {
|
||||
return sdk.responses(modelID)
|
||||
}
|
||||
return selectAzureLanguageModel(sdk, modelID, Boolean(options?.["useCompletionUrls"]))
|
||||
},
|
||||
options: {
|
||||
baseURL: resourceName ? `https://${resourceName}.cognitiveservices.azure.com/openai` : undefined,
|
||||
|
||||
@@ -5,7 +5,7 @@ import { lazy } from "@/util/lazy"
|
||||
import * as Log from "@opencode-ai/core/util/log"
|
||||
import { Flag } from "@opencode-ai/core/flag/flag"
|
||||
import { WorkspaceID } from "@/control-plane/schema"
|
||||
import { ConfigProvider, Context, Effect, Exit, Layer, Scope } from "effect"
|
||||
import { Context, Effect, Exit, Layer, Scope } from "effect"
|
||||
import { HttpRouter, HttpServer } from "effect/unstable/http"
|
||||
import { OpenApi } from "effect/unstable/httpapi"
|
||||
import * as HttpApiServer from "#httpapi-server"
|
||||
@@ -259,12 +259,6 @@ async function listenHttpApi(opts: ListenOptions, selection: ServerBackend.Selec
|
||||
}).pipe(
|
||||
Layer.provideMerge(WebSocketTracker.layer),
|
||||
Layer.provideMerge(HttpApiServer.layer({ port, hostname: opts.hostname })),
|
||||
// Install a fresh `ConfigProvider` per listener so `Config.string(...)`
|
||||
// reads reflect the current `process.env`. Effect's default
|
||||
// `ConfigProvider` snapshots `process.env` on first read and caches the
|
||||
// result on a module-singleton Reference; without overriding it here,
|
||||
// every later `Server.listen()` keeps observing that initial snapshot.
|
||||
Layer.provide(ConfigProvider.layer(ConfigProvider.fromEnv())),
|
||||
)
|
||||
|
||||
const start = async (port: number) => {
|
||||
|
||||
@@ -40,8 +40,8 @@ async function startListener(backend: "effect-httpapi" | "hono" = "effect-httpap
|
||||
return Server.listen({ hostname: "127.0.0.1", port: 0 })
|
||||
}
|
||||
|
||||
async function startNoAuthListener(backend: "effect-httpapi" | "hono" = "effect-httpapi") {
|
||||
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = backend === "effect-httpapi"
|
||||
async function startNoAuthListener() {
|
||||
Flag.OPENCODE_EXPERIMENTAL_HTTPAPI = false
|
||||
Flag.OPENCODE_SERVER_PASSWORD = undefined
|
||||
Flag.OPENCODE_SERVER_USERNAME = auth.username
|
||||
delete process.env.OPENCODE_SERVER_PASSWORD
|
||||
@@ -300,20 +300,18 @@ describe("HttpApi Server.listen", () => {
|
||||
}
|
||||
})
|
||||
|
||||
for (const backend of ["effect-httpapi", "hono"] as const) {
|
||||
testPty(`keeps PTY websocket tickets optional when server auth is disabled (${backend})`, async () => {
|
||||
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
|
||||
const listener = await startNoAuthListener(backend)
|
||||
try {
|
||||
const info = await createCat(listener, tmp.path)
|
||||
const ws = await openSocket(socketURL(listener, info.id, tmp.path))
|
||||
const message = waitForMessage(ws, (message) => message.includes(`ping-no-auth-${backend}`))
|
||||
ws.send(`ping-no-auth-${backend}\n`)
|
||||
expect(await message).toContain(`ping-no-auth-${backend}`)
|
||||
ws.close(1000)
|
||||
} finally {
|
||||
await stop(listener, "timed out cleaning up no-auth listener").catch(() => undefined)
|
||||
}
|
||||
})
|
||||
}
|
||||
testPty("keeps PTY websocket tickets optional when server auth is disabled", async () => {
|
||||
await using tmp = await tmpdir({ git: true, config: { formatter: false, lsp: false } })
|
||||
const listener = await startNoAuthListener()
|
||||
try {
|
||||
const info = await createCat(listener, tmp.path)
|
||||
const ws = await openSocket(socketURL(listener, info.id, tmp.path))
|
||||
const message = waitForMessage(ws, (message) => message.includes("ping-no-auth"))
|
||||
ws.send("ping-no-auth\n")
|
||||
expect(await message).toContain("ping-no-auth")
|
||||
ws.close(1000)
|
||||
} finally {
|
||||
await stop(listener, "timed out cleaning up no-auth listener").catch(() => undefined)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -648,17 +648,17 @@ OpenCode Go هي خطة اشتراك منخفضة التكلفة توفّر وص
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. توجّه إلى [Firmware dashboard](https://app.firmware.ai/signup)، وأنشئ حسابا، ثم أنشئ مفتاح API.
|
||||
1. توجّه إلى [FrogBot dashboard](https://app.frogbot.ai/signup)، وأنشئ حسابا، ثم أنشئ مفتاح API.
|
||||
|
||||
2. شغّل الأمر `/connect` وابحث عن **Firmware**.
|
||||
2. شغّل الأمر `/connect` وابحث عن **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. أدخل مفتاح API الخاص بـ Firmware.
|
||||
3. أدخل مفتاح API الخاص بـ FrogBot.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -653,17 +653,17 @@ Također možete dodati modele kroz svoju opencode konfiguraciju.
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Idite na [kontrolnu tablu firmvera](https://app.firmware.ai/signup), kreirajte nalog i generišite API ključ.
|
||||
1. Idite na [kontrolnu tablu firmvera](https://app.frogbot.ai/signup), kreirajte nalog i generišite API ključ.
|
||||
|
||||
2. Pokrenite naredbu `/connect` i potražite **Firmware**.
|
||||
2. Pokrenite naredbu `/connect` i potražite **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Unesite svoj Firmware API ključ.
|
||||
3. Unesite svoj FrogBot API ključ.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -644,17 +644,17 @@ Cloudflare AI Gateway lader dig få adgang til modeller fra OpenAI, Anthropic, W
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Gå til [Firmware dashboard](https://app.firmware.ai/signup), opret en konto og generer en API-nøgle.
|
||||
1. Gå til [FrogBot dashboard](https://app.frogbot.ai/signup), opret en konto og generer en API-nøgle.
|
||||
|
||||
2. Kør kommandoen `/connect` og søg efter **Firmware**.
|
||||
2. Kør kommandoen `/connect` og søg efter **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Indtast firmware API-nøglen.
|
||||
3. Indtast frogbot API-nøglen.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -650,17 +650,17 @@ Mit dem Cloudflare AI Gateway können Sie über einen einheitlichen Endpunkt auf
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Gehen Sie zu [Firmware dashboard](https://app.firmware.ai/signup), erstellen Sie ein Konto und generieren Sie einen API-Schlüssel.
|
||||
1. Gehen Sie zu [FrogBot dashboard](https://app.frogbot.ai/signup), erstellen Sie ein Konto und generieren Sie einen API-Schlüssel.
|
||||
|
||||
2. Führen Sie den Befehl `/connect` aus und suchen Sie nach **Firmware**.
|
||||
2. Führen Sie den Befehl `/connect` aus und suchen Sie nach **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Geben Sie Ihren Firmware API-Schlüssel ein.
|
||||
3. Geben Sie Ihren FrogBot API-Schlüssel ein.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -651,17 +651,17 @@ Cloudflare AI Gateway le permite acceder a modelos de OpenAI, Anthropic, Workers
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Dirígete al [Panel de firmware](https://app.firmware.ai/signup), crea una cuenta y genera una clave API.
|
||||
1. Dirígete al [Panel de frogbot](https://app.frogbot.ai/signup), crea una cuenta y genera una clave API.
|
||||
|
||||
2. Ejecute el comando `/connect` y busque **Firmware**.
|
||||
2. Ejecute el comando `/connect` y busque **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Ingrese su clave de firmware API.
|
||||
3. Ingrese su clave de frogbot API.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -654,11 +654,11 @@ Vous pouvez également ajouter des modèles via votre configuration opencode.
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Rendez-vous sur le [Tableau de bord du micrologiciel](https://app.firmware.ai/signup), créez un compte et générez une clé API.
|
||||
1. Rendez-vous sur le [Tableau de bord du micrologiciel](https://app.frogbot.ai/signup), créez un compte et générez une clé API.
|
||||
|
||||
2. Exécutez la commande `/connect` et recherchez **Firmware**.
|
||||
2. Exécutez la commande `/connect` et recherchez **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
|
||||
@@ -628,17 +628,17 @@ Cloudflare AI Gateway ti permette di accedere a modelli di OpenAI, Anthropic, Wo
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Vai alla [dashboard di Firmware](https://app.firmware.ai/signup), crea un account e genera una chiave API.
|
||||
1. Vai alla [dashboard di FrogBot](https://app.frogbot.ai/signup), crea un account e genera una chiave API.
|
||||
|
||||
2. Esegui il comando `/connect` e cerca **Firmware**.
|
||||
2. Esegui il comando `/connect` e cerca **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Inserisci la tua chiave API di Firmware.
|
||||
3. Inserisci la tua chiave API di FrogBot.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -658,9 +658,9 @@ OpenCode 設定を通じてモデルを追加することもできます。
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. [ファームウェアダッシュボード](https://app.firmware.ai/signup) に移動し、アカウントを作成し、API キーを生成します。
|
||||
1. [ファームウェアダッシュボード](https://app.frogbot.ai/signup) に移動し、アカウントを作成し、API キーを生成します。
|
||||
|
||||
2. `/connect` コマンドを実行し、**ファームウェア**を検索します。
|
||||
|
||||
|
||||
@@ -654,17 +654,17 @@ Cloudflare AI Gateway는 OpenAI, Anthropic, Workers AI 등의 모델에 액세
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. [Firmware 대시보드](https://app.firmware.ai/signup)로 이동하여 계정을 만들고 API 키를 생성합니다.
|
||||
1. [FrogBot 대시보드](https://app.frogbot.ai/signup)로 이동하여 계정을 만들고 API 키를 생성합니다.
|
||||
|
||||
2. `/connect` 명령을 실행하고 **Firmware**를 검색하십시오.
|
||||
2. `/connect` 명령을 실행하고 **FrogBot**를 검색하십시오.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Firmware API 키를 입력하십시오.
|
||||
3. FrogBot API 키를 입력하십시오.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -652,17 +652,17 @@ Cloudflare AI Gateway lar deg få tilgang til modeller fra OpenAI, Anthropic, Wo
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Gå over til [Firmware dashboard](https://app.firmware.ai/signup), opprett en konto og generer en API nøkkel.
|
||||
1. Gå over til [FrogBot dashboard](https://app.frogbot.ai/signup), opprett en konto og generer en API nøkkel.
|
||||
|
||||
2. Kjør kommandoen `/connect` og søk etter **Firmware**.
|
||||
2. Kjør kommandoen `/connect` og søk etter **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Skriv inn firmware API nøkkelen.
|
||||
3. Skriv inn frogbot API nøkkelen.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -650,17 +650,17 @@ Cloudflare AI Gateway umożliwia dostęp do modeli z OpenAI, Anthropic, Workers
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Przejdź do [Firmware dashboard](https://app.firmware.ai/signup), utwórz konto i wygeneruj klucz API.
|
||||
1. Przejdź do [FrogBot dashboard](https://app.frogbot.ai/signup), utwórz konto i wygeneruj klucz API.
|
||||
|
||||
2. Uruchom polecenie `/connect` i wyszukaj **Firmware**.
|
||||
2. Uruchom polecenie `/connect` i wyszukaj **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Wprowadź klucz API Firmware.
|
||||
3. Wprowadź klucz API FrogBot.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -721,17 +721,17 @@ Cloudflare Workers AI lets you run AI models on Cloudflare's global network dire
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Head over to the [Firmware dashboard](https://app.firmware.ai/signup), create an account, and generate an API key.
|
||||
1. Head over to the [FrogBot dashboard](https://app.frogbot.ai/signup), create an account, and generate an API key.
|
||||
|
||||
2. Run the `/connect` command and search for **Firmware**.
|
||||
2. Run the `/connect` command and search for **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Enter your Firmware API key.
|
||||
3. Enter your FrogBot API key.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -654,17 +654,17 @@ O Cloudflare AI Gateway permite que você acesse modelos do OpenAI, Anthropic, W
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Acesse o [painel Firmware](https://app.firmware.ai/signup), crie uma conta e gere uma chave da API.
|
||||
1. Acesse o [painel FrogBot](https://app.frogbot.ai/signup), crie uma conta e gere uma chave da API.
|
||||
|
||||
2. Execute o comando `/connect` e procure por **Firmware**.
|
||||
2. Execute o comando `/connect` e procure por **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Insira sua chave da API Firmware.
|
||||
3. Insira sua chave da API FrogBot.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -650,17 +650,17 @@ Cloudflare AI Gateway позволяет вам получать доступ к
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. Перейдите на [панель Firmware](https://app.firmware.ai/signup), создайте учетную запись и сгенерируйте ключ API.
|
||||
1. Перейдите на [панель FrogBot](https://app.frogbot.ai/signup), создайте учетную запись и сгенерируйте ключ API.
|
||||
|
||||
2. Запустите команду `/connect` и найдите **Firmware**.
|
||||
2. Запустите команду `/connect` и найдите **FrogBot**.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Введите ключ API Firmware.
|
||||
3. Введите ключ API FrogBot.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -650,17 +650,17 @@ Cloudflare AI Gateway ช่วยให้คุณเข้าถึงโม
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. ไปที่ [แดชบอร์ด Firmware](https://app.firmware.ai/signup) สร้างบัญชี และสร้างคีย์ API
|
||||
1. ไปที่ [แดชบอร์ด FrogBot](https://app.frogbot.ai/signup) สร้างบัญชี และสร้างคีย์ API
|
||||
|
||||
2. เรียกใช้คำสั่ง `/connect` และค้นหา **Firmware**
|
||||
2. เรียกใช้คำสั่ง `/connect` และค้นหา **FrogBot**
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. ป้อนคีย์ Firmware API ของคุณ
|
||||
3. ป้อนคีย์ FrogBot API ของคุณ
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -652,17 +652,17 @@ Cloudflare AI Gateway, OpenAI, Anthropic, Workers AI ve daha fazlasındaki model
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. [Firmware dashboard](https://app.firmware.ai/signup) adresine gidin, bir hesap oluşturun ve bir API anahtarı oluşturun.
|
||||
1. [FrogBot dashboard](https://app.frogbot.ai/signup) adresine gidin, bir hesap oluşturun ve bir API anahtarı oluşturun.
|
||||
|
||||
2. `/connect` komutunu çalıştırın ve **Firmware**'i arayın.
|
||||
2. `/connect` komutunu çalıştırın ve **FrogBot**'i arayın.
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. Firmware API anahtarınızı girin.
|
||||
3. FrogBot API anahtarınızı girin.
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -624,17 +624,17 @@ Cloudflare AI Gateway 允许你通过统一端点访问来自 OpenAI、Anthropic
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. 前往 [Firmware 仪表盘](https://app.firmware.ai/signup),创建账户并生成 API 密钥。
|
||||
1. 前往 [FrogBot 仪表盘](https://app.frogbot.ai/signup),创建账户并生成 API 密钥。
|
||||
|
||||
2. 执行 `/connect` 命令并搜索 **Firmware**。
|
||||
2. 执行 `/connect` 命令并搜索 **FrogBot**。
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. 输入你的 Firmware API 密钥。
|
||||
3. 输入你的 FrogBot API 密钥。
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
@@ -645,17 +645,17 @@ Cloudflare AI Gateway 允許您透過統一端點存取來自 OpenAI、Anthropic
|
||||
|
||||
---
|
||||
|
||||
### Firmware
|
||||
### FrogBot
|
||||
|
||||
1. 前往 [Firmware 儀表板](https://app.firmware.ai/signup),建立帳號並產生 API 金鑰。
|
||||
1. 前往 [FrogBot 儀表板](https://app.frogbot.ai/signup),建立帳號並產生 API 金鑰。
|
||||
|
||||
2. 執行 `/connect` 指令並搜尋 **Firmware**。
|
||||
2. 執行 `/connect` 指令並搜尋 **FrogBot**。
|
||||
|
||||
```txt
|
||||
/connect
|
||||
```
|
||||
|
||||
3. 輸入您的 Firmware API 金鑰。
|
||||
3. 輸入您的 FrogBot API 金鑰。
|
||||
|
||||
```txt
|
||||
┌ API key
|
||||
|
||||
Reference in New Issue
Block a user