mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
docs: fix inaccuracies, add translations, and expand channel docs (#1837)
## Config field fixes (cross-verified against Go source) - MaixCam: server_address → host + port - IRC: use_tls → tls, channels_to_join → channels (all 6 languages) - WeCom AI Bot: callback port 18791 → 18790 - credential_encryption: base_url → api_base, add required model field, remove incorrect passphrase-only mode docs - providers.md: agents.defaults.model → model_name (×4), remove non-existent session.backlog_limit - migration guide, troubleshooting: agents.defaults.model → model_name - ANTIGRAVITY_AUTH: fix file path, Go 1.21 → 1.25, model → model_name - spawn-tasks: fix truncated file, add Heartbeat introduction - tools_configuration: add Tavily/SearXNG/GLMSearch, exec allow_remote/ timeout_seconds/custom_allow_patterns, cron allow_command, skills github/search_cache, clawhub timeout/max_zip_size/max_response_size - configuration: fix builtin skills path (build-time embedded, not cwd), HEARTBEAT.md marked auto-generated ## Broken link fixes (15 total) - chat-apps.md: WeCom/Matrix links with wrong relative paths - providers.md: migration link with extra docs/ prefix - hardware-compatibility.md: README links with wrong depth (all 5 langs) - chat-apps.md: WhatsApp dead links → anchor links (zh/ja) ## Getting-started accuracy - README (all 6 langs): add picoclaw.io as recommended download, add missing picoclaw model CLI command - docker.md: clarify first-run trigger condition (all 6 langs) - configuration.md: fix builtin skills path description (all 6 langs) ## QQ channel - Add quick setup via q.qq.com/qqbot/openclaw (one-click bot creation) - Add manual setup as fallback (all 6 languages) ## Feishu channel - Update setup flow: WebSocket/SDK mode, no webhook URL needed - Preserve Lark international domain note (all 6 languages) ## chat-apps.md - Add Feishu, Slack, IRC, OneBot detail sections (all 6 languages) - Add MaixCam section to ja/fr/pt-br/vi - Fix all channel doc links to point to correct language version ## New translations (25 files, 5 docs × 5 languages) debug.md, credential_encryption.md, hardware-compatibility.md, ANTIGRAVITY_AUTH.md, ANTIGRAVITY_USAGE.md → zh/ja/fr/pt-br/vi ## Channel docs (6 languages each, 60 new files) telegram, discord, qq, feishu, maixcam, dingtalk, line, slack, onebot, wecom/wecom_aibot, wecom/wecom_app, wecom/wecom_bot Co-authored-by: BeaconCat <BeaconCat@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,809 @@
|
||||
> [README](../../README.ja.md) に戻る
|
||||
|
||||
# Antigravity 認証・統合ガイド
|
||||
|
||||
## 概要
|
||||
|
||||
**Antigravity**(Google Cloud Code Assist)は、Google が提供する AI モデルプロバイダーで、Google のクラウドインフラストラクチャを通じて Claude Opus 4.6 や Gemini などのモデルへのアクセスを提供します。本ドキュメントでは、認証の仕組み、モデルの取得方法、PicoClaw での新しいプロバイダーの実装方法について完全なガイドを提供します。
|
||||
|
||||
---
|
||||
|
||||
## 目次
|
||||
|
||||
1. [認証フロー](#認証フロー)
|
||||
2. [OAuth 実装の詳細](#oauth-実装の詳細)
|
||||
3. [トークン管理](#トークン管理)
|
||||
4. [モデルリストの取得](#モデルリストの取得)
|
||||
5. [使用量トラッキング](#使用量トラッキング)
|
||||
6. [プロバイダープラグイン構造](#プロバイダープラグイン構造)
|
||||
7. [統合要件](#統合要件)
|
||||
8. [API エンドポイント](#api-エンドポイント)
|
||||
9. [設定](#設定)
|
||||
10. [PicoClaw での新しいプロバイダーの作成](#picoclaw-での新しいプロバイダーの作成)
|
||||
|
||||
---
|
||||
|
||||
## 認証フロー
|
||||
|
||||
### 1. PKCE 付き OAuth 2.0
|
||||
|
||||
Antigravity はセキュアな認証のために **OAuth 2.0 with PKCE(Proof Key for Code Exchange)** を使用します:
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────────┐
|
||||
│ Client │ ───(1) Generate PKCE Pair────────> │ │
|
||||
│ │ ───(2) Open Auth URL─────────────> │ Google OAuth │
|
||||
│ │ │ Server │
|
||||
│ │ <──(3) Redirect with Code───────── │ │
|
||||
│ │ └─────────────────┘
|
||||
│ │ ───(4) Exchange Code for Tokens──> │ Token URL │
|
||||
│ │ │ │
|
||||
│ │ <──(5) Access + Refresh Tokens──── │ │
|
||||
└─────────────┘ └─────────────────┘
|
||||
```
|
||||
|
||||
### 2. 詳細手順
|
||||
|
||||
#### ステップ 1:PKCE パラメータの生成
|
||||
```typescript
|
||||
function generatePkce(): { verifier: string; challenge: string } {
|
||||
const verifier = randomBytes(32).toString("hex");
|
||||
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
||||
return { verifier, challenge };
|
||||
}
|
||||
```
|
||||
|
||||
#### ステップ 2:認可 URL の構築
|
||||
```typescript
|
||||
const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
||||
const REDIRECT_URI = "http://localhost:51121/oauth-callback";
|
||||
|
||||
function buildAuthUrl(params: { challenge: string; state: string }): string {
|
||||
const url = new URL(AUTH_URL);
|
||||
url.searchParams.set("client_id", CLIENT_ID);
|
||||
url.searchParams.set("response_type", "code");
|
||||
url.searchParams.set("redirect_uri", REDIRECT_URI);
|
||||
url.searchParams.set("scope", SCOPES.join(" "));
|
||||
url.searchParams.set("code_challenge", params.challenge);
|
||||
url.searchParams.set("code_challenge_method", "S256");
|
||||
url.searchParams.set("state", params.state);
|
||||
url.searchParams.set("access_type", "offline");
|
||||
url.searchParams.set("prompt", "consent");
|
||||
return url.toString();
|
||||
}
|
||||
```
|
||||
|
||||
**必要なスコープ:**
|
||||
```typescript
|
||||
const SCOPES = [
|
||||
"https://www.googleapis.com/auth/cloud-platform",
|
||||
"https://www.googleapis.com/auth/userinfo.email",
|
||||
"https://www.googleapis.com/auth/userinfo.profile",
|
||||
"https://www.googleapis.com/auth/cclog",
|
||||
"https://www.googleapis.com/auth/experimentsandconfigs",
|
||||
];
|
||||
```
|
||||
|
||||
#### ステップ 3:OAuth コールバックの処理
|
||||
|
||||
**自動モード(ローカル開発):**
|
||||
- ポート 51121 でローカル HTTP サーバーを起動
|
||||
- Google からのリダイレクトを待機
|
||||
- クエリパラメータから認可コードを抽出
|
||||
|
||||
**手動モード(リモート/ヘッドレス):**
|
||||
- ユーザーに認可 URL を表示
|
||||
- ユーザーがブラウザで認証を完了
|
||||
- ユーザーが完全なリダイレクト URL をターミナルに貼り付け
|
||||
- 貼り付けられた URL からコードを解析
|
||||
|
||||
#### ステップ 4:コードをトークンに交換
|
||||
```typescript
|
||||
const TOKEN_URL = "https://oauth2.googleapis.com/token";
|
||||
|
||||
async function exchangeCode(params: {
|
||||
code: string;
|
||||
verifier: string;
|
||||
}): Promise<{ access: string; refresh: string; expires: number }> {
|
||||
const response = await fetch(TOKEN_URL, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
body: new URLSearchParams({
|
||||
client_id: CLIENT_ID,
|
||||
client_secret: CLIENT_SECRET,
|
||||
code: params.code,
|
||||
grant_type: "authorization_code",
|
||||
redirect_uri: REDIRECT_URI,
|
||||
code_verifier: params.verifier,
|
||||
}),
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
return {
|
||||
access: data.access_token,
|
||||
refresh: data.refresh_token,
|
||||
expires: Date.now() + data.expires_in * 1000 - 5 * 60 * 1000, // 5 min buffer
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
#### ステップ 5:追加のユーザーデータの取得
|
||||
|
||||
**ユーザーメール:**
|
||||
```typescript
|
||||
async function fetchUserEmail(accessToken: string): Promise<string | undefined> {
|
||||
const response = await fetch(
|
||||
"https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
|
||||
{ headers: { Authorization: `Bearer ${accessToken}` } }
|
||||
);
|
||||
const data = await response.json();
|
||||
return data.email;
|
||||
}
|
||||
```
|
||||
|
||||
**プロジェクト ID(API 呼び出しに必須):**
|
||||
```typescript
|
||||
async function fetchProjectId(accessToken: string): Promise<string> {
|
||||
const headers = {
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": "google-api-nodejs-client/9.15.1",
|
||||
"X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
|
||||
"Client-Metadata": JSON.stringify({
|
||||
ideType: "IDE_UNSPECIFIED",
|
||||
platform: "PLATFORM_UNSPECIFIED",
|
||||
pluginType: "GEMINI",
|
||||
}),
|
||||
};
|
||||
|
||||
const response = await fetch(
|
||||
"https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",
|
||||
{
|
||||
method: "POST",
|
||||
headers,
|
||||
body: JSON.stringify({
|
||||
metadata: {
|
||||
ideType: "IDE_UNSPECIFIED",
|
||||
platform: "PLATFORM_UNSPECIFIED",
|
||||
pluginType: "GEMINI",
|
||||
},
|
||||
}),
|
||||
}
|
||||
);
|
||||
|
||||
const data = await response.json();
|
||||
return data.cloudaicompanionProject || "rising-fact-p41fc"; // デフォルトのフォールバック
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## OAuth 実装の詳細
|
||||
|
||||
### クライアント認証情報
|
||||
|
||||
**重要:** これらは pi-ai との同期のためにソースコード内で base64 エンコードされています:
|
||||
|
||||
```typescript
|
||||
const decode = (s: string) => Buffer.from(s, "base64").toString();
|
||||
|
||||
const CLIENT_ID = decode(
|
||||
"MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ=="
|
||||
);
|
||||
const CLIENT_SECRET = decode("R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=");
|
||||
```
|
||||
|
||||
### OAuth フローモード
|
||||
|
||||
1. **自動フロー**(ブラウザのあるローカルマシン):
|
||||
- ブラウザを自動的に開く
|
||||
- ローカルコールバックサーバーがリダイレクトをキャプチャ
|
||||
- 初回認証後はユーザー操作不要
|
||||
|
||||
2. **手動フロー**(リモート/ヘッドレス/WSL2):
|
||||
- 手動コピー&ペースト用の URL を表示
|
||||
- ユーザーが外部ブラウザで認証を完了
|
||||
- ユーザーが完全なリダイレクト URL を貼り付け
|
||||
|
||||
```typescript
|
||||
function shouldUseManualOAuthFlow(isRemote: boolean): boolean {
|
||||
return isRemote || isWSL2Sync();
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## トークン管理
|
||||
|
||||
### 認証プロファイル構造
|
||||
|
||||
```typescript
|
||||
type OAuthCredential = {
|
||||
type: "oauth";
|
||||
provider: "google-antigravity";
|
||||
access: string; // アクセストークン
|
||||
refresh: string; // リフレッシュトークン
|
||||
expires: number; // 有効期限タイムスタンプ(エポックからのミリ秒)
|
||||
email?: string; // ユーザーメール
|
||||
projectId?: string; // Google Cloud プロジェクト ID
|
||||
};
|
||||
```
|
||||
|
||||
### トークンの更新
|
||||
|
||||
認証情報にはリフレッシュトークンが含まれており、現在のアクセストークンが期限切れになった際に新しいアクセストークンを取得するために使用できます。有効期限は競合状態を防ぐために 5 分のバッファを設けています。
|
||||
|
||||
---
|
||||
|
||||
## モデルリストの取得
|
||||
|
||||
### 利用可能なモデルの取得
|
||||
|
||||
```typescript
|
||||
const BASE_URL = "https://cloudcode-pa.googleapis.com";
|
||||
|
||||
async function fetchAvailableModels(
|
||||
accessToken: string,
|
||||
projectId: string
|
||||
): Promise<Model[]> {
|
||||
const headers = {
|
||||
Authorization: `Bearer ${accessToken}`,
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": "antigravity",
|
||||
"X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
|
||||
};
|
||||
|
||||
const response = await fetch(
|
||||
`${BASE_URL}/v1internal:fetchAvailableModels`,
|
||||
{
|
||||
method: "POST",
|
||||
headers,
|
||||
body: JSON.stringify({ project: projectId }),
|
||||
}
|
||||
);
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
// クォータ情報付きのモデルを返す
|
||||
return Object.entries(data.models).map(([modelId, modelInfo]) => ({
|
||||
id: modelId,
|
||||
displayName: modelInfo.displayName,
|
||||
quotaInfo: {
|
||||
remainingFraction: modelInfo.quotaInfo?.remainingFraction,
|
||||
resetTime: modelInfo.quotaInfo?.resetTime,
|
||||
isExhausted: modelInfo.quotaInfo?.isExhausted,
|
||||
},
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
### レスポンス形式
|
||||
|
||||
```typescript
|
||||
type FetchAvailableModelsResponse = {
|
||||
models?: Record<string, {
|
||||
displayName?: string;
|
||||
quotaInfo?: {
|
||||
remainingFraction?: number | string;
|
||||
resetTime?: string; // ISO 8601 タイムスタンプ
|
||||
isExhausted?: boolean;
|
||||
};
|
||||
}>;
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用量トラッキング
|
||||
|
||||
### 使用量データの取得
|
||||
|
||||
```typescript
|
||||
export async function fetchAntigravityUsage(
|
||||
token: string,
|
||||
timeoutMs: number
|
||||
): Promise<ProviderUsageSnapshot> {
|
||||
// 1. クレジットとプラン情報を取得
|
||||
const loadCodeAssistRes = await fetch(
|
||||
`${BASE_URL}/v1internal:loadCodeAssist`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
Authorization: `Bearer ${token}`,
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
metadata: {
|
||||
ideType: "ANTIGRAVITY",
|
||||
platform: "PLATFORM_UNSPECIFIED",
|
||||
pluginType: "GEMINI",
|
||||
},
|
||||
}),
|
||||
}
|
||||
);
|
||||
|
||||
// クレジット情報を抽出
|
||||
const { availablePromptCredits, planInfo, currentTier } = data;
|
||||
|
||||
// 2. モデルクォータを取得
|
||||
const modelsRes = await fetch(
|
||||
`${BASE_URL}/v1internal:fetchAvailableModels`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
body: JSON.stringify({ project: projectId }),
|
||||
}
|
||||
);
|
||||
|
||||
// 使用量ウィンドウを構築
|
||||
return {
|
||||
provider: "google-antigravity",
|
||||
displayName: "Google Antigravity",
|
||||
windows: [
|
||||
{ label: "Credits", usedPercent: calculateUsedPercent(available, monthly) },
|
||||
// 個別モデルクォータ...
|
||||
],
|
||||
plan: currentTier?.name || planType,
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### 使用量レスポンス構造
|
||||
|
||||
```typescript
|
||||
type ProviderUsageSnapshot = {
|
||||
provider: "google-antigravity";
|
||||
displayName: string;
|
||||
windows: UsageWindow[];
|
||||
plan?: string;
|
||||
error?: string;
|
||||
};
|
||||
|
||||
type UsageWindow = {
|
||||
label: string; // "Credits" またはモデル ID
|
||||
usedPercent: number; // 0-100
|
||||
resetAt?: number; // クォータがリセットされるタイムスタンプ
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## プロバイダープラグイン構造
|
||||
|
||||
### プラグイン定義
|
||||
|
||||
```typescript
|
||||
const antigravityPlugin = {
|
||||
id: "google-antigravity-auth",
|
||||
name: "Google Antigravity Auth",
|
||||
description: "OAuth flow for Google Antigravity (Cloud Code Assist)",
|
||||
configSchema: emptyPluginConfigSchema(),
|
||||
|
||||
register(api: PicoClawPluginApi) {
|
||||
api.registerProvider({
|
||||
id: "google-antigravity",
|
||||
label: "Google Antigravity",
|
||||
docsPath: "/providers/models",
|
||||
aliases: ["antigravity"],
|
||||
|
||||
auth: [
|
||||
{
|
||||
id: "oauth",
|
||||
label: "Google OAuth",
|
||||
hint: "PKCE + localhost callback",
|
||||
kind: "oauth",
|
||||
run: async (ctx: ProviderAuthContext) => {
|
||||
// OAuth 実装はここに記述
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
### ProviderAuthContext
|
||||
|
||||
```typescript
|
||||
type ProviderAuthContext = {
|
||||
config: PicoClawConfig;
|
||||
agentDir?: string;
|
||||
workspaceDir?: string;
|
||||
prompter: WizardPrompter; // UI プロンプト/通知
|
||||
runtime: RuntimeEnv; // ログなど
|
||||
isRemote: boolean; // リモート実行かどうか
|
||||
openUrl: (url: string) => Promise<void>; // ブラウザオープナー
|
||||
oauth: {
|
||||
createVpsAwareHandlers: Function;
|
||||
};
|
||||
};
|
||||
```
|
||||
|
||||
### ProviderAuthResult
|
||||
|
||||
```typescript
|
||||
type ProviderAuthResult = {
|
||||
profiles: Array<{
|
||||
profileId: string;
|
||||
credential: AuthProfileCredential;
|
||||
}>;
|
||||
configPatch?: Partial<PicoClawConfig>;
|
||||
defaultModel?: string;
|
||||
notes?: string[];
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 統合要件
|
||||
|
||||
### 1. 必要な環境/依存関係
|
||||
|
||||
- Go ≥ 1.25
|
||||
- PicoClaw コードベース(`pkg/providers/` および `pkg/auth/`)
|
||||
- `crypto` および `net/http` 標準ライブラリパッケージ
|
||||
|
||||
### 2. API 呼び出しに必要なヘッダー
|
||||
|
||||
```typescript
|
||||
const REQUIRED_HEADERS = {
|
||||
"Authorization": `Bearer ${accessToken}`,
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": "antigravity", // または "google-api-nodejs-client/9.15.1"
|
||||
"X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
|
||||
};
|
||||
|
||||
// loadCodeAssist 呼び出しには以下も含める:
|
||||
const CLIENT_METADATA = {
|
||||
ideType: "ANTIGRAVITY", // または "IDE_UNSPECIFIED"
|
||||
platform: "PLATFORM_UNSPECIFIED",
|
||||
pluginType: "GEMINI",
|
||||
};
|
||||
```
|
||||
|
||||
### 3. モデルスキーマのサニタイズ
|
||||
|
||||
Antigravity は Gemini 互換モデルを使用するため、ツールスキーマのサニタイズが必要です:
|
||||
|
||||
```typescript
|
||||
const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
|
||||
"patternProperties",
|
||||
"additionalProperties",
|
||||
"$schema",
|
||||
"$id",
|
||||
"$ref",
|
||||
"$defs",
|
||||
"definitions",
|
||||
"examples",
|
||||
"minLength",
|
||||
"maxLength",
|
||||
"minimum",
|
||||
"maximum",
|
||||
"multipleOf",
|
||||
"pattern",
|
||||
"format",
|
||||
"minItems",
|
||||
"maxItems",
|
||||
"uniqueItems",
|
||||
"minProperties",
|
||||
"maxProperties",
|
||||
]);
|
||||
|
||||
// 送信前にスキーマをクリーンアップ
|
||||
function cleanToolSchemaForGemini(schema: Record<string, unknown>): unknown {
|
||||
// サポートされていないキーワードを削除
|
||||
// トップレベルに type: "object" があることを確認
|
||||
// anyOf/oneOf ユニオンをフラット化
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 思考ブロックの処理(Claude モデル)
|
||||
|
||||
Antigravity の Claude モデルでは、思考ブロックに特別な処理が必要です:
|
||||
|
||||
```typescript
|
||||
const ANTIGRAVITY_SIGNATURE_RE = /^[A-Za-z0-9+/]+={0,2}$/;
|
||||
|
||||
export function sanitizeAntigravityThinkingBlocks(
|
||||
messages: AgentMessage[]
|
||||
): AgentMessage[] {
|
||||
// 思考シグネチャを検証
|
||||
// シグネチャフィールドを正規化
|
||||
// 署名されていない思考ブロックを破棄
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API エンドポイント
|
||||
|
||||
### 認証エンドポイント
|
||||
|
||||
| エンドポイント | メソッド | 用途 |
|
||||
|---------------|---------|------|
|
||||
| `https://accounts.google.com/o/oauth2/v2/auth` | GET | OAuth 認可 |
|
||||
| `https://oauth2.googleapis.com/token` | POST | トークン交換 |
|
||||
| `https://www.googleapis.com/oauth2/v1/userinfo` | GET | ユーザー情報(メール) |
|
||||
|
||||
### Cloud Code Assist エンドポイント
|
||||
|
||||
| エンドポイント | メソッド | 用途 |
|
||||
|---------------|---------|------|
|
||||
| `https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist` | POST | プロジェクト情報、クレジット、プランの読み込み |
|
||||
| `https://cloudcode-pa.googleapis.com/v1internal:fetchAvailableModels` | POST | クォータ付き利用可能モデルの一覧 |
|
||||
| `https://cloudcode-pa.googleapis.com/v1internal:streamGenerateContent?alt=sse` | POST | チャットストリーミングエンドポイント |
|
||||
|
||||
**API リクエスト形式(チャット):**
|
||||
`v1internal:streamGenerateContent` エンドポイントは、標準の Gemini リクエストをラップするエンベロープ形式を期待します:
|
||||
|
||||
```json
|
||||
{
|
||||
"project": "your-project-id",
|
||||
"model": "model-id",
|
||||
"request": {
|
||||
"contents": [...],
|
||||
"systemInstruction": {...},
|
||||
"generationConfig": {...},
|
||||
"tools": [...]
|
||||
},
|
||||
"requestType": "agent",
|
||||
"userAgent": "antigravity",
|
||||
"requestId": "agent-timestamp-random"
|
||||
}
|
||||
```
|
||||
|
||||
**API レスポンス形式(SSE):**
|
||||
各 SSE メッセージ(`data: {...}`)は `response` フィールドでラップされます:
|
||||
|
||||
```json
|
||||
{
|
||||
"response": {
|
||||
"candidates": [...],
|
||||
"usageMetadata": {...},
|
||||
"modelVersion": "...",
|
||||
"responseId": "..."
|
||||
},
|
||||
"traceId": "...",
|
||||
"metadata": {}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 設定
|
||||
|
||||
### config.json の設定
|
||||
|
||||
```json
|
||||
{
|
||||
"model_list": [
|
||||
{
|
||||
"model_name": "gemini-flash",
|
||||
"model": "antigravity/gemini-3-flash",
|
||||
"auth_method": "oauth"
|
||||
}
|
||||
],
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"model_name": "gemini-flash"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 認証プロファイルの保存
|
||||
|
||||
認証プロファイルは `~/.picoclaw/auth.json` に保存されます:
|
||||
|
||||
```json
|
||||
{
|
||||
"credentials": {
|
||||
"google-antigravity": {
|
||||
"access_token": "ya29...",
|
||||
"refresh_token": "1//...",
|
||||
"expires_at": "2026-01-01T00:00:00Z",
|
||||
"provider": "google-antigravity",
|
||||
"auth_method": "oauth",
|
||||
"email": "user@example.com",
|
||||
"project_id": "my-project-id"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## PicoClaw での新しいプロバイダーの作成
|
||||
|
||||
PicoClaw のプロバイダーは `pkg/providers/` 配下の Go パッケージとして実装されます。新しいプロバイダーを追加するには:
|
||||
|
||||
### ステップバイステップの実装
|
||||
|
||||
#### 1. プロバイダーファイルの作成
|
||||
|
||||
`pkg/providers/` に新しい Go ファイルを作成します:
|
||||
|
||||
```
|
||||
pkg/providers/
|
||||
└── your_provider.go
|
||||
```
|
||||
|
||||
#### 2. Provider インターフェースの実装
|
||||
|
||||
プロバイダーは `pkg/providers/types.go` で定義された `Provider` インターフェースを実装する必要があります:
|
||||
|
||||
```go
|
||||
package providers
|
||||
|
||||
type YourProvider struct {
|
||||
apiKey string
|
||||
apiBase string
|
||||
}
|
||||
|
||||
func NewYourProvider(apiKey, apiBase, proxy string) *YourProvider {
|
||||
if apiBase == "" {
|
||||
apiBase = "https://api.your-provider.com/v1"
|
||||
}
|
||||
return &YourProvider{apiKey: apiKey, apiBase: apiBase}
|
||||
}
|
||||
|
||||
func (p *YourProvider) Chat(ctx context.Context, messages []Message, tools []Tool, cb StreamCallback) error {
|
||||
// ストリーミング付きチャット補完を実装
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. ファクトリーへの登録
|
||||
|
||||
`pkg/providers/factory.go` のプロトコルスイッチにプロバイダーを追加します:
|
||||
|
||||
```go
|
||||
case "your-provider":
|
||||
return NewYourProvider(sel.apiKey, sel.apiBase, sel.proxy), nil
|
||||
```
|
||||
|
||||
#### 4. デフォルト設定の追加(オプション)
|
||||
|
||||
`pkg/config/defaults.go` にデフォルトエントリを追加します:
|
||||
|
||||
```go
|
||||
{
|
||||
ModelName: "your-model",
|
||||
Model: "your-provider/model-name",
|
||||
APIKey: "",
|
||||
},
|
||||
```
|
||||
|
||||
#### 5. 認証サポートの追加(オプション)
|
||||
|
||||
プロバイダーが OAuth や特別な認証を必要とする場合、`cmd/picoclaw/internal/auth/helpers.go` にケースを追加します:
|
||||
|
||||
```go
|
||||
case "your-provider":
|
||||
authLoginYourProvider()
|
||||
```
|
||||
|
||||
#### 6. `config.json` での設定
|
||||
|
||||
```json
|
||||
{
|
||||
"model_list": [
|
||||
{
|
||||
"model_name": "your-model",
|
||||
"model": "your-provider/model-name",
|
||||
"api_key": "your-api-key",
|
||||
"api_base": "https://api.your-provider.com/v1"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 実装のテスト
|
||||
|
||||
### CLI コマンド
|
||||
|
||||
```bash
|
||||
# プロバイダーで認証
|
||||
picoclaw auth login --provider your-provider
|
||||
|
||||
# モデルの一覧表示(Antigravity 用)
|
||||
picoclaw auth models
|
||||
|
||||
# ゲートウェイの起動
|
||||
picoclaw gateway
|
||||
|
||||
# 特定のモデルでエージェントを実行
|
||||
picoclaw agent -m "Hello" --model your-model
|
||||
```
|
||||
|
||||
### テスト用環境変数
|
||||
|
||||
```bash
|
||||
# デフォルトモデルの上書き
|
||||
export PICOCLAW_AGENTS_DEFAULTS_MODEL=your-model
|
||||
|
||||
# プロバイダー設定の上書き
|
||||
export PICOCLAW_MODEL_LIST='[{"model_name":"your-model","model":"your-provider/model-name","api_key":"..."}]'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 参考資料
|
||||
|
||||
- **ソースファイル:**
|
||||
- `pkg/providers/antigravity_provider.go` - Antigravity プロバイダー実装
|
||||
- `pkg/auth/oauth.go` - OAuth フロー実装
|
||||
- `pkg/auth/store.go` - 認証情報ストレージ(`~/.picoclaw/auth.json`)
|
||||
- `pkg/providers/factory.go` - プロバイダーファクトリーとプロトコルルーティング
|
||||
- `pkg/providers/types.go` - プロバイダーインターフェース定義
|
||||
- `cmd/picoclaw/internal/auth/helpers.go` - 認証 CLI コマンド
|
||||
|
||||
- **ドキュメント:**
|
||||
- `docs/ANTIGRAVITY_USAGE.md` - Antigravity 使用ガイド
|
||||
- `docs/migration/model-list-migration.md` - 移行ガイド
|
||||
|
||||
---
|
||||
|
||||
## 注意事項
|
||||
|
||||
1. **Google Cloud プロジェクト:** Antigravity は Google Cloud プロジェクトで Gemini for Google Cloud が有効になっている必要があります
|
||||
2. **クォータ:** Google Cloud プロジェクトのクォータを使用します(個別の課金ではありません)
|
||||
3. **モデルアクセス:** 利用可能なモデルは Google Cloud プロジェクトの設定に依存します
|
||||
4. **思考ブロック:** Antigravity 経由の Claude モデルは、署名付き思考ブロックの特別な処理が必要です
|
||||
5. **スキーマサニタイズ:** ツールスキーマはサポートされていない JSON Schema キーワードを削除するためにサニタイズが必要です
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 一般的なエラー処理
|
||||
|
||||
### 1. レート制限(HTTP 429)
|
||||
|
||||
プロジェクト/モデルのクォータが枯渇すると、Antigravity は 429 エラーを返します。エラーレスポンスには通常、`details` フィールドに `quotaResetDelay` が含まれます。
|
||||
|
||||
**429 エラーの例:**
|
||||
```json
|
||||
{
|
||||
"error": {
|
||||
"code": 429,
|
||||
"message": "You have exhausted your capacity on this model. Your quota will reset after 4h30m28s.",
|
||||
"status": "RESOURCE_EXHAUSTED",
|
||||
"details": [
|
||||
{
|
||||
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
|
||||
"metadata": {
|
||||
"quotaResetDelay": "4h30m28.060903746s"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 空のレスポンス(制限付きモデル)
|
||||
|
||||
一部のモデルは利用可能モデルリストに表示されますが、空のレスポンスを返す場合があります(200 OK だが SSE ストリームが空)。これは通常、現在のプロジェクトに使用権限がないプレビュー版または制限付きモデルで発生します。
|
||||
|
||||
**対処法:** 空のレスポンスをエラーとして扱い、そのモデルがプロジェクトに対して制限されているか無効である可能性があることをユーザーに通知します。
|
||||
|
||||
---
|
||||
|
||||
## トラブルシューティング
|
||||
|
||||
### "Token expired"(トークン期限切れ)
|
||||
- OAuth トークンを更新:`picoclaw auth login --provider antigravity`
|
||||
|
||||
### "Gemini for Google Cloud is not enabled"(Gemini for Google Cloud が有効になっていない)
|
||||
- Google Cloud Console で API を有効にしてください
|
||||
|
||||
### "Project not found"(プロジェクトが見つからない)
|
||||
- Google Cloud プロジェクトで必要な API が有効になっていることを確認してください
|
||||
- 認証中にプロジェクト ID が正しく取得されているか確認してください
|
||||
|
||||
### モデルがリストに表示されない
|
||||
- OAuth 認証が正常に完了したことを確認してください
|
||||
- 認証プロファイルストレージを確認:`~/.picoclaw/auth.json`
|
||||
- `picoclaw auth login --provider antigravity` を再実行してください
|
||||
@@ -0,0 +1,72 @@
|
||||
> [README](../../README.ja.md) に戻る
|
||||
|
||||
# PicoClaw で Antigravity プロバイダーを使用する
|
||||
|
||||
このガイドでは、PicoClaw で **Antigravity**(Google Cloud Code Assist)プロバイダーをセットアップして使用する方法を説明します。
|
||||
|
||||
## 前提条件
|
||||
|
||||
1. Google アカウント。
|
||||
2. Google Cloud Code Assist が有効であること(通常「Gemini for Google Cloud」のオンボーディングから利用可能)。
|
||||
|
||||
## 1. 認証
|
||||
|
||||
Antigravity で認証するには、以下のコマンドを実行します:
|
||||
|
||||
```bash
|
||||
picoclaw auth login --provider antigravity
|
||||
```
|
||||
|
||||
### 手動認証(ヘッドレス/VPS)
|
||||
サーバー(Coolify/Docker)上で実行しており、`localhost` にアクセスできない場合は、以下の手順に従ってください:
|
||||
1. 上記のコマンドを実行します。
|
||||
2. 表示された URL をコピーし、ローカルブラウザで開きます。
|
||||
3. ログインを完了します。
|
||||
4. ブラウザが `localhost:51121` URL にリダイレクトされます(ページは読み込めません)。
|
||||
5. **ブラウザのアドレスバーからその最終 URL をコピーします**。
|
||||
6. **PicoClaw が待機しているターミナルにそれを貼り付けます**。
|
||||
|
||||
PicoClaw が自動的に認証コードを抽出し、プロセスを完了します。
|
||||
|
||||
## 2. モデルの管理
|
||||
|
||||
### 利用可能なモデルの一覧
|
||||
プロジェクトがアクセスできるモデルとそのクォータを確認するには:
|
||||
|
||||
```bash
|
||||
picoclaw auth models
|
||||
```
|
||||
|
||||
### モデルの切り替え
|
||||
`~/.picoclaw/config.json` でデフォルトモデルを変更するか、CLI でオーバーライドできます:
|
||||
|
||||
```bash
|
||||
# 単一コマンドでオーバーライド
|
||||
picoclaw agent -m "Hello" --model claude-opus-4-6-thinking
|
||||
```
|
||||
|
||||
## 3. 実際の使用方法(Coolify/Docker)
|
||||
|
||||
Coolify または Docker でデプロイしている場合、以下の手順でテストしてください:
|
||||
|
||||
1. **環境変数**:
|
||||
* `PICOCLAW_AGENTS_DEFAULTS_MODEL=gemini-flash`
|
||||
2. **認証の永続化**:
|
||||
ローカルでログイン済みの場合、認証情報をサーバーにコピーできます:
|
||||
```bash
|
||||
scp ~/.picoclaw/auth.json user@your-server:~/.picoclaw/
|
||||
```
|
||||
*または*、ターミナルアクセスがある場合、サーバー上で `auth login` コマンドを一度実行してください。
|
||||
|
||||
## 4. トラブルシューティング
|
||||
|
||||
* **空のレスポンス**:モデルが空の応答を返す場合、プロジェクトで制限されている可能性があります。`gemini-3-flash` または `claude-opus-4-6-thinking` を試してください。
|
||||
* **429 レート制限**:Antigravity には厳格なクォータがあります。制限に達した場合、PicoClaw はエラーメッセージに「リセット時間」を表示します。
|
||||
* **404 Not Found**:`picoclaw auth models` リストのモデル ID を使用していることを確認してください。フルパスではなく、短い ID(例:`gemini-3-flash`)を使用してください。
|
||||
|
||||
## 5. 動作確認済みモデルのまとめ
|
||||
|
||||
テストに基づき、以下のモデルが最も信頼性が高いです:
|
||||
* `gemini-3-flash`(高速、高可用性)
|
||||
* `gemini-2.5-flash-lite`(軽量)
|
||||
* `claude-opus-4-6-thinking`(高性能、推論機能を含む)
|
||||
+74
-41
@@ -12,19 +12,19 @@ PicoClaw は複数のチャットプラットフォームをサポートして
|
||||
|
||||
| チャネル | セットアップ難易度 | 特徴 | ドキュメント |
|
||||
| -------------------- | ------------------ | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
|
||||
| **Telegram** | ⭐ 簡単 | 推奨、音声テキスト変換対応、ロングポーリング(公開 IP 不要) | [ドキュメント](../channels/telegram/README.zh.md) |
|
||||
| **Discord** | ⭐ 簡単 | Socket Mode、グループ/DM 対応、Bot エコシステム充実 | [ドキュメント](../channels/discord/README.zh.md) |
|
||||
| **WhatsApp** | ⭐ 簡単 | ネイティブ (QR スキャン) または Bridge URL | [ドキュメント](../channels/whatsapp/README.zh.md) |
|
||||
| **Slack** | ⭐ 簡単 | **Socket Mode** (公開 IP 不要)、エンタープライズ対応 | [ドキュメント](../channels/slack/README.zh.md) |
|
||||
| **Matrix** | ⭐⭐ 中程度 | フェデレーションプロトコル、セルフホスト対応 | [ドキュメント](../channels/matrix/README.zh.md) |
|
||||
| **QQ** | ⭐⭐ 中程度 | 公式ボット API、中国コミュニティ向け | [ドキュメント](../channels/qq/README.zh.md) |
|
||||
| **DingTalk** | ⭐⭐ 中程度 | Stream モード(公開 IP 不要)、企業向け | [ドキュメント](../channels/dingtalk/README.zh.md) |
|
||||
| **LINE** | ⭐⭐⭐ やや難 | HTTPS Webhook が必要 | [ドキュメント](../channels/line/README.zh.md) |
|
||||
| **WeCom (企業微信)** | ⭐⭐⭐ やや難 | グループ Bot (Webhook)、カスタムアプリ (API)、AI Bot 対応 | [Bot](../channels/wecom/wecom_bot/README.zh.md) / [App](../channels/wecom/wecom_app/README.zh.md) / [AI Bot](../channels/wecom/wecom_aibot/README.zh.md) |
|
||||
| **Feishu (飛書)** | ⭐⭐⭐ やや難 | エンタープライズコラボレーション、機能豊富 | [ドキュメント](../channels/feishu/README.zh.md) |
|
||||
| **Telegram** | ⭐ 簡単 | 推奨、音声テキスト変換対応、ロングポーリング(公開 IP 不要) | [ドキュメント](../channels/telegram/README.ja.md) |
|
||||
| **Discord** | ⭐ 簡単 | Socket Mode、グループ/DM 対応、Bot エコシステム充実 | [ドキュメント](../channels/discord/README.ja.md) |
|
||||
| **WhatsApp** | ⭐ 簡単 | ネイティブ (QR スキャン) または Bridge URL | [ドキュメント](#whatsapp) |
|
||||
| **Slack** | ⭐ 簡単 | **Socket Mode** (公開 IP 不要)、エンタープライズ対応 | [ドキュメント](../channels/slack/README.ja.md) |
|
||||
| **Matrix** | ⭐⭐ 中程度 | フェデレーションプロトコル、セルフホスト対応 | [ドキュメント](../channels/matrix/README.ja.md) |
|
||||
| **QQ** | ⭐⭐ 中程度 | 公式ボット API、中国コミュニティ向け | [ドキュメント](../channels/qq/README.ja.md) |
|
||||
| **DingTalk** | ⭐⭐ 中程度 | Stream モード(公開 IP 不要)、企業向け | [ドキュメント](../channels/dingtalk/README.ja.md) |
|
||||
| **LINE** | ⭐⭐⭐ やや難 | HTTPS Webhook が必要 | [ドキュメント](../channels/line/README.ja.md) |
|
||||
| **WeCom (企業微信)** | ⭐⭐⭐ やや難 | グループ Bot (Webhook)、カスタムアプリ (API)、AI Bot 対応 | [Bot](../channels/wecom/wecom_bot/README.ja.md) / [App](../channels/wecom/wecom_app/README.ja.md) / [AI Bot](../channels/wecom/wecom_aibot/README.ja.md) |
|
||||
| **Feishu (飛書)** | ⭐⭐⭐ やや難 | エンタープライズコラボレーション、機能豊富 | [ドキュメント](../channels/feishu/README.ja.md) |
|
||||
| **IRC** | ⭐⭐ 中程度 | サーバー + TLS 設定 | - |
|
||||
| **OneBot** | ⭐⭐ 中程度 | NapCat/Go-CQHTTP 互換、コミュニティエコシステム充実 | [ドキュメント](../channels/onebot/README.zh.md) |
|
||||
| **MaixCam** | ⭐ 簡単 | Sipeed AI カメラハードウェア統合チャネル | [ドキュメント](../channels/maixcam/README.zh.md) |
|
||||
| **OneBot** | ⭐⭐ 中程度 | NapCat/Go-CQHTTP 互換、コミュニティエコシステム充実 | [ドキュメント](../channels/onebot/README.ja.md) |
|
||||
| **MaixCam** | ⭐ 簡単 | Sipeed AI カメラハードウェア統合チャネル | [ドキュメント](../channels/maixcam/README.ja.md) |
|
||||
| **Pico** | ⭐ 簡単 | PicoClaw ネイティブプロトコルチャネル | |
|
||||
|
||||
---
|
||||
@@ -207,12 +207,13 @@ picoclaw gateway
|
||||
<details>
|
||||
<summary><b>QQ</b></summary>
|
||||
|
||||
**1. Bot を作成**
|
||||
**クイックセットアップ(推奨)**
|
||||
|
||||
- [QQ 開放プラットフォーム](https://q.qq.com/#) にアクセス
|
||||
- アプリケーションを作成 → **AppID** と **AppSecret** を取得
|
||||
QQ 開放プラットフォームでは、OpenClaw 互換ボットのワンクリックセットアップページが提供されています:
|
||||
|
||||
**2. 設定**
|
||||
1. [QQ Bot クイックスタート](https://q.qq.com/qqbot/openclaw/index.html) を開き、QR コードをスキャンしてログイン
|
||||
2. ボットが自動的に作成されます — **App ID** と **App Secret** をコピー
|
||||
3. PicoClaw を設定:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -227,13 +228,20 @@ picoclaw gateway
|
||||
}
|
||||
```
|
||||
|
||||
> `allow_from` を空にするとすべてのユーザーを許可します。QQ 番号を指定してアクセスを制限することもできます。
|
||||
4. `picoclaw gateway` を実行し、QQ を開いてボットとチャット
|
||||
|
||||
**3. 実行**
|
||||
> App Secret は一度しか表示されません。すぐに保存してください — 再度表示するとリセットされます。
|
||||
>
|
||||
> クイックセットアップで作成されたボットは、最初は作成者のみが使用でき、グループチャットには対応していません。グループアクセスを有効にするには、[QQ 開放プラットフォーム](https://q.qq.com/) でサンドボックスモードを設定してください。
|
||||
|
||||
```bash
|
||||
picoclaw gateway
|
||||
```
|
||||
**手動セットアップ**
|
||||
|
||||
ボットを手動で作成する場合:
|
||||
|
||||
* [QQ 開放プラットフォーム](https://q.qq.com/) にログインして開発者登録
|
||||
* QQ ボットを作成 — アバターと名前をカスタマイズ
|
||||
* ボット設定から **App ID** と **App Secret** をコピー
|
||||
* 上記の設定を行い、`picoclaw gateway` を実行
|
||||
|
||||
</details>
|
||||
|
||||
@@ -242,9 +250,10 @@ picoclaw gateway
|
||||
|
||||
**1. Slack App を作成**
|
||||
|
||||
* [Slack API](https://api.slack.com/apps) でアプリを作成
|
||||
* **Socket Mode** を有効化
|
||||
* **Bot Token** と **App-Level Token** を取得
|
||||
* [Slack API](https://api.slack.com/apps) にアクセスして新しいアプリを作成
|
||||
* **OAuth & Permissions** で Bot スコープを追加:`chat:write`、`app_mentions:read`、`im:history`、`im:read`、`im:write`
|
||||
* アプリをワークスペースにインストール
|
||||
* **Bot Token**(`xoxb-...`)と **App-Level Token**(`xapp-...`、Socket Mode を有効にして取得)をコピー
|
||||
|
||||
**2. 設定**
|
||||
|
||||
@@ -253,8 +262,8 @@ picoclaw gateway
|
||||
"channels": {
|
||||
"slack": {
|
||||
"enabled": true,
|
||||
"bot_token": "xoxb-YOUR_BOT_TOKEN",
|
||||
"app_token": "xapp-YOUR_APP_TOKEN",
|
||||
"bot_token": "xoxb-YOUR-BOT-TOKEN",
|
||||
"app_token": "xapp-YOUR-APP-TOKEN",
|
||||
"allow_from": []
|
||||
}
|
||||
}
|
||||
@@ -280,21 +289,26 @@ picoclaw gateway
|
||||
"irc": {
|
||||
"enabled": true,
|
||||
"server": "irc.libera.chat:6697",
|
||||
"tls": true,
|
||||
"nick": "picoclaw-bot",
|
||||
"use_tls": true,
|
||||
"channels_to_join": ["#your-channel"],
|
||||
"channels": ["#your-channel"],
|
||||
"password": "",
|
||||
"allow_from": []
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
オプション:NickServ 認証用の `nickserv_password`、SASL 認証用の `sasl_user`/`sasl_password`。
|
||||
|
||||
**2. 実行**
|
||||
|
||||
```bash
|
||||
picoclaw gateway
|
||||
```
|
||||
|
||||
ボットは IRC サーバーに接続し、指定されたチャネルに参加します。
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
@@ -382,11 +396,14 @@ picoclaw gateway
|
||||
<details>
|
||||
<summary><b>Feishu (飛書)</b></summary>
|
||||
|
||||
PicoClaw は WebSocket/SDK モードで飛書に接続します — 公開 Webhook URL やコールバックサーバーは不要です。
|
||||
|
||||
**1. アプリを作成**
|
||||
|
||||
* [飛書開放プラットフォーム](https://open.feishu.cn/) にアクセス
|
||||
* 企業カスタムアプリを作成
|
||||
* **App ID** と **App Secret** を取得
|
||||
* [飛書開放プラットフォーム](https://open.feishu.cn/) にアクセスしてアプリケーションを作成
|
||||
* アプリ設定で **ボット** 機能を有効化
|
||||
* バージョンを作成してアプリを公開(アプリは公開しないと有効になりません)
|
||||
* **App ID**(`cli_` で始まる)と **App Secret** をコピー
|
||||
|
||||
**2. 設定**
|
||||
|
||||
@@ -396,21 +413,25 @@ picoclaw gateway
|
||||
"feishu": {
|
||||
"enabled": true,
|
||||
"app_id": "cli_xxx",
|
||||
"app_secret": "xxx",
|
||||
"encrypt_key": "",
|
||||
"verification_token": "",
|
||||
"app_secret": "YOUR_APP_SECRET",
|
||||
"allow_from": []
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**3. 実行**
|
||||
オプション:`encrypt_key` と `verification_token` でイベント暗号化(本番環境推奨)。
|
||||
|
||||
**3. 実行してチャット**
|
||||
|
||||
```bash
|
||||
picoclaw gateway
|
||||
```
|
||||
|
||||
飛書を開き、ボット名を検索してチャットを開始できます。ボットをグループに追加することもできます — `group_trigger.mention_only: true` を設定すると @メンション時のみ応答します。
|
||||
|
||||
詳細なオプションについては [飛書チャネル設定ガイド](../channels/feishu/README.ja.md) を参照してください。
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
@@ -422,7 +443,7 @@ PicoClaw は 3 種類の WeCom 統合をサポートしています:
|
||||
**方式 2: カスタムアプリ (App)** — より多機能、プロアクティブメッセージング、プライベートチャットのみ
|
||||
**方式 3: AI Bot** — 公式 AI Bot、ストリーミング返信、グループ・プライベートチャット対応
|
||||
|
||||
詳細なセットアップ手順は [WeCom AI Bot 設定ガイド](../channels/wecom/wecom_aibot/README.zh.md) を参照してください。
|
||||
詳細なセットアップ手順は [WeCom AI Bot 設定ガイド](../channels/wecom/wecom_aibot/README.ja.md) を参照してください。
|
||||
|
||||
**クイックセットアップ — グループ Bot:**
|
||||
|
||||
@@ -496,7 +517,7 @@ picoclaw gateway
|
||||
**1. AI Bot を作成**
|
||||
|
||||
* WeCom 管理コンソール → アプリ管理 → AI Bot
|
||||
* AI Bot 設定でコールバック URL を設定:`http://your-server:18791/webhook/wecom-aibot`
|
||||
* AI Bot 設定でコールバック URL を設定:`http://your-server:18790/webhook/wecom-aibot`
|
||||
* **Token** をコピーし、「ランダム生成」をクリックして **EncodingAESKey** を取得
|
||||
|
||||
**2. 設定**
|
||||
@@ -528,24 +549,36 @@ picoclaw gateway
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>OneBot</b></summary>
|
||||
<summary><b>OneBot(OneBot プロトコル経由の QQ)</b></summary>
|
||||
|
||||
**1. 設定**
|
||||
OneBot は QQ ボット向けのオープンプロトコルです。PicoClaw は OneBot v11 互換の実装(例:[Lagrange](https://github.com/LagrangeDev/Lagrange.Core)、[NapCat](https://github.com/NapNeko/NapCatQQ))に WebSocket で接続します。
|
||||
|
||||
NapCat / Go-CQHTTP などの OneBot 実装と互換性があります。
|
||||
**1. OneBot 実装をセットアップ**
|
||||
|
||||
OneBot v11 互換の QQ ボットフレームワークをインストールして実行します。WebSocket サーバーを有効にしてください。
|
||||
|
||||
**2. 設定**
|
||||
|
||||
```json
|
||||
{
|
||||
"channels": {
|
||||
"onebot": {
|
||||
"enabled": true,
|
||||
"ws_url": "ws://127.0.0.1:8080",
|
||||
"access_token": "",
|
||||
"allow_from": []
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**2. 実行**
|
||||
| フィールド | 説明 |
|
||||
|-------|-------------|
|
||||
| `ws_url` | OneBot 実装の WebSocket URL |
|
||||
| `access_token` | 認証用アクセストークン(OneBot 側で設定している場合) |
|
||||
| `reconnect_interval` | 再接続間隔(秒)(デフォルト:5) |
|
||||
|
||||
**3. 実行**
|
||||
|
||||
```bash
|
||||
picoclaw gateway
|
||||
|
||||
@@ -57,7 +57,7 @@ PicoClaw は設定されたワークスペース(デフォルト: `~/.picoclaw
|
||||
|
||||
1. `~/.picoclaw/workspace/skills`(ワークスペース)
|
||||
2. `~/.picoclaw/skills`(グローバル)
|
||||
3. `<current-working-directory>/skills`(ビルトイン)
|
||||
3. `<ビルド時埋め込みパス>/skills`(ビルトイン)
|
||||
|
||||
高度な/テスト用セットアップでは、以下の環境変数でビルトインスキルのルートを上書きできます:
|
||||
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
> [README](../../README.ja.md) に戻る
|
||||
|
||||
# クレデンシャル暗号化
|
||||
|
||||
PicoClaw は `model_list` 設定エントリの `api_key` 値の暗号化をサポートしています。
|
||||
暗号化されたキーは `enc://<base64>` 文字列として保存され、起動時に自動的に復号されます。
|
||||
|
||||
---
|
||||
|
||||
## クイックスタート
|
||||
|
||||
**1. パスフレーズを設定する**
|
||||
|
||||
```bash
|
||||
export PICOCLAW_KEY_PASSPHRASE="your-passphrase"
|
||||
```
|
||||
|
||||
**2. API キーを暗号化する**
|
||||
|
||||
`picoclaw onboard` を実行します — パスフレーズの入力を求められ、SSH キーが生成されます。
|
||||
その後、次の `SaveConfig` 呼び出し時に、設定内のすべての平文 `api_key` エントリが自動的に再暗号化されます。生成される `enc://` 値は以下のようになります:
|
||||
|
||||
```
|
||||
enc://AAAA...base64...
|
||||
```
|
||||
|
||||
**3. 出力を設定に貼り付ける**
|
||||
|
||||
```json
|
||||
{
|
||||
"model_list": [
|
||||
{
|
||||
"model_name": "gpt-4o",
|
||||
"model": "openai/gpt-4o",
|
||||
"api_key": "enc://AAAA...base64...",
|
||||
"api_base": "https://api.openai.com/v1"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## サポートされる `api_key` 形式
|
||||
|
||||
| 形式 | 例 | 動作 |
|
||||
|------|---|------|
|
||||
| 平文 | `sk-abc123` | そのまま使用 |
|
||||
| ファイル参照 | `file://openai.key` | 設定ファイルと同じディレクトリから内容を読み取り |
|
||||
| 暗号化 | `enc://<base64>` | 起動時に `PICOCLAW_KEY_PASSPHRASE` を使用して復号 |
|
||||
| 空 | `""` | そのまま渡される(`auth_method: oauth` で使用) |
|
||||
|
||||
---
|
||||
|
||||
## 暗号設計
|
||||
|
||||
### 鍵導出
|
||||
|
||||
暗号化には **HKDF-SHA256** を使用し、SSH 秘密鍵を第二要素とします。
|
||||
|
||||
```
|
||||
sshHash = SHA256(ssh_private_key_file_bytes)
|
||||
ikm = HMAC-SHA256(key=sshHash, message=passphrase)
|
||||
aes_key = HKDF-SHA256(ikm, salt, info="picoclaw-credential-v1", 32 bytes)
|
||||
```
|
||||
|
||||
### 暗号化
|
||||
|
||||
```
|
||||
AES-256-GCM(key=aes_key, nonce=random[12], plaintext=api_key)
|
||||
```
|
||||
|
||||
### ワイヤーフォーマット
|
||||
|
||||
```
|
||||
enc://<base64( salt[16] + nonce[12] + ciphertext )>
|
||||
```
|
||||
|
||||
| フィールド | サイズ | 説明 |
|
||||
|-----------|--------|------|
|
||||
| `salt` | 16 バイト | 暗号化ごとにランダム生成;HKDF に入力 |
|
||||
| `nonce` | 12 バイト | 暗号化ごとにランダム生成;AES-GCM IV |
|
||||
| `ciphertext` | 可変 | AES-256-GCM 暗号文 + 16 バイト認証タグ |
|
||||
|
||||
GCM 認証タグは暗号文に自動的に付加されます。改ざんがあった場合、破損した平文を返すのではなく、エラーで復号が失敗します。
|
||||
|
||||
### パフォーマンス
|
||||
|
||||
| 操作 | 所要時間 (ARM Cortex-A) |
|
||||
|------|------------------------|
|
||||
| 鍵導出 (HKDF) | < 1 ms |
|
||||
| AES-256-GCM 復号 | < 1 ms |
|
||||
| **起動時の総オーバーヘッド** | **キーあたり < 2 ms** |
|
||||
|
||||
---
|
||||
|
||||
## SSH キーによる二要素セキュリティ
|
||||
|
||||
SSH 秘密鍵が提供されている場合、暗号を破るには**両方**が必要です:
|
||||
|
||||
1. **パスフレーズ** (`PICOCLAW_KEY_PASSPHRASE`)
|
||||
2. **SSH 秘密鍵ファイル**
|
||||
|
||||
これは、設定ファイルが漏洩しただけでは、パスフレーズが弱い場合でも API キーを復元できないことを意味します。SSH キーはパスフレーズの強度に関係なく、256 ビットのエントロピー(Ed25519)を提供します。
|
||||
|
||||
### 脅威モデル
|
||||
|
||||
| 攻撃者が持っているもの | 復号可能か? |
|
||||
|----------------------|-------------|
|
||||
| 設定ファイルのみ | いいえ — パスフレーズ + SSH キーが必要 |
|
||||
| SSH キーのみ | いいえ — パスフレーズが必要 |
|
||||
| パスフレーズのみ | いいえ — SSH キーが必要 |
|
||||
| 設定ファイル + SSH キー + パスフレーズ | はい — 完全な侵害 |
|
||||
|
||||
---
|
||||
|
||||
## 環境変数
|
||||
|
||||
| 変数 | 必須 | 説明 |
|
||||
|------|------|------|
|
||||
| `PICOCLAW_KEY_PASSPHRASE` | はい(`enc://` 使用時) | 鍵導出に使用するパスフレーズ |
|
||||
| `PICOCLAW_SSH_KEY_PATH` | いいえ | SSH 秘密鍵のパス。未設定の場合、`~/.ssh/picoclaw_ed25519.key` から自動検出 |
|
||||
|
||||
### SSH キーの自動検出
|
||||
|
||||
`PICOCLAW_SSH_KEY_PATH` が設定されていない場合、PicoClaw は専用キーを探します:
|
||||
|
||||
```
|
||||
~/.ssh/picoclaw_ed25519.key
|
||||
```
|
||||
|
||||
この専用ファイルにより、ユーザーの既存の SSH キーとの競合を回避します。
|
||||
`picoclaw onboard` を実行すると自動的に生成されます。
|
||||
|
||||
`os.UserHomeDir()` はクロスプラットフォームのホームディレクトリ解決に使用されます(Windows では `USERPROFILE`、Unix/macOS では `HOME` を読み取ります)。
|
||||
|
||||
> **注意:** SSH キーファイルはクレデンシャル暗号化に必須です。キーが見つからず `PICOCLAW_SSH_KEY_PATH` も設定されていない場合、暗号化/復号は失敗します。`picoclaw onboard` を実行してキーを自動生成してください。
|
||||
|
||||
---
|
||||
|
||||
## 移行
|
||||
|
||||
唯一の秘密情報は `PICOCLAW_KEY_PASSPHRASE` と SSH 秘密鍵ファイルであるため、移行は簡単です:
|
||||
|
||||
1. 設定ファイルを新しいマシンにコピーします。
|
||||
2. `PICOCLAW_KEY_PASSPHRASE` を同じ値に設定します。
|
||||
3. SSH 秘密鍵ファイルを同じパスにコピーします(または `PICOCLAW_SSH_KEY_PATH` を新しい場所に設定します)。
|
||||
|
||||
再暗号化は不要です。
|
||||
|
||||
---
|
||||
|
||||
## セキュリティに関する考慮事項
|
||||
|
||||
- **パスフレーズと SSH キーの両方が必須です。** SSH キーは第二要素として機能します — これがなければ暗号化/復号は失敗します。キーが存在しない場合は `picoclaw onboard` を実行して生成してください。
|
||||
- **SSH キーは実行時に読み取り専用です。** PicoClaw は SSH キーファイルへの書き込みや変更を行いません。
|
||||
- **平文キーは引き続きサポートされます。** `enc://` を使用しない既存の設定は影響を受けません。
|
||||
- **`enc://` 形式はバージョン管理されています。** HKDF `info` フィールド(`picoclaw-credential-v1`)により、既存の暗号化値を壊すことなく将来のアルゴリズムアップグレードが可能です。
|
||||
@@ -0,0 +1,36 @@
|
||||
# PicoClaw のデバッグ
|
||||
|
||||
> [README](../../README.ja.md) に戻る
|
||||
|
||||
PicoClaw は、受信するすべてのリクエストに対して、メッセージのルーティングや複雑度の評価、ツールの実行、モデル障害への適応など、多くの複雑な処理をバックグラウンドで実行しています。何が起きているかを正確に把握できることは、潜在的な問題のトラブルシューティングだけでなく、エージェントの動作を真に理解するためにも非常に重要です。
|
||||
|
||||
## デバッグモードで PicoClaw を起動する
|
||||
|
||||
エージェントの動作に関する詳細情報(LLM リクエスト、ツール呼び出し、メッセージルーティング)を取得するには、デバッグフラグを付けて PicoClaw ゲートウェイを起動します:
|
||||
|
||||
```bash
|
||||
picoclaw gateway --debug
|
||||
# or
|
||||
picoclaw gateway -d
|
||||
```
|
||||
|
||||
このモードでは、システムがログを詳細にフォーマットし、システムプロンプトやツール実行結果のプレビューを表示します。
|
||||
|
||||
## ログの切り詰めを無効にする(完全なログ)
|
||||
|
||||
デフォルトでは、PicoClaw はコンソールの可読性を保つために、デバッグログ内の非常に長い文字列(*システムプロンプト*や大きな JSON 出力結果など)を切り詰めます。
|
||||
|
||||
コマンドの完全な出力や、LLM モデルに送信された正確なペイロードを確認する必要がある場合は、`--no-truncate` フラグを使用できます。
|
||||
|
||||
**注意:** このフラグは `--debug` モードと組み合わせた場合に*のみ*機能します。
|
||||
|
||||
```bash
|
||||
picoclaw gateway --debug --no-truncate
|
||||
|
||||
```
|
||||
|
||||
このフラグが有効な場合、グローバルな切り詰め機能が無効になります。これは以下の場合に非常に便利です:
|
||||
|
||||
* プロバイダーに送信されるメッセージの正確な構文を確認する。
|
||||
* `exec`、`web_fetch`、`read_file` などのツールの完全な出力を読む。
|
||||
* メモリに保存されたセッション履歴をデバッグする。
|
||||
@@ -12,6 +12,7 @@ git clone https://github.com/sipeed/picoclaw.git
|
||||
cd picoclaw
|
||||
|
||||
# 2. 初回実行 — docker/data/config.json を自動生成して終了
|
||||
# (config.json と workspace/ の両方が存在しない場合のみ実行)
|
||||
docker compose -f docker/docker-compose.yml --profile gateway up
|
||||
# コンテナが "First-run setup complete." と表示して停止します
|
||||
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
> [README](../../README.ja.md) に戻る
|
||||
|
||||
# 🖥️ PicoClaw ハードウェア互換性リスト
|
||||
|
||||
PicoClaw はほぼすべての Linux デバイスで動作します。このページでは、検証済みのチップ、製品、開発ボードを記録しています。
|
||||
|
||||
**お使いのハードウェアがリストにない場合は?** PR を送信して追加してください!ハードウェアベンダーの貢献と共同プロモーションを歓迎します。
|
||||
|
||||
---
|
||||
|
||||
## 1. 検証済みチップサポート
|
||||
|
||||
### x86
|
||||
|
||||
| ベンダー | チップ | 備考 |
|
||||
|----------|--------|------|
|
||||
| Intel | Any x86 CPU (i386+) | すべてのデスクトップ/サーバー/ノートPC プロセッサ |
|
||||
| AMD | Any x86 CPU | すべてのデスクトップ/サーバー/ノートPC プロセッサ |
|
||||
|
||||
### ARM
|
||||
|
||||
| サブアーキテクチャ | 代表的なチップ | 備考 |
|
||||
|--------------------|----------------|------|
|
||||
| ARMv6 | [BCM2835](https://www.raspberrypi.com/documentation/computers/processors.html#bcm2835) (Raspberry Pi 1/Zero) | シングルコア ARM1176JZF-S |
|
||||
| ARMv7 | [Allwinner V3s](https://linux-sunxi.org/V3s) | シングルコア Cortex-A7、LicheePi Zero で使用 |
|
||||
| ARM64 | [Allwinner H618](https://linux-sunxi.org/H618) | クアッドコア Cortex-A53、Orange Pi Zero 3 で使用 |
|
||||
| ARM64 | [BCM2711](https://www.raspberrypi.com/documentation/computers/processors.html#bcm2711) (Raspberry Pi 4) | クアッドコア Cortex-A72 |
|
||||
| ARM64 | [BCM2712](https://www.raspberrypi.com/documentation/computers/processors.html#bcm2712) (Raspberry Pi 5) | クアッドコア Cortex-A76 |
|
||||
| ARM64 | [AX630C](https://www.axera-tech.com/) (爱芯元智) | デュアルコア Cortex-A53 + NPU、NanoKVM-Pro / MaixCAM2 で使用 |
|
||||
|
||||
### RISC-V (riscv64)
|
||||
|
||||
| ベンダー | チップ | コア | 備考 |
|
||||
|----------|--------|------|------|
|
||||
| [SOPHGO (算能)](https://www.sophgo.com/) | SG2002 | C906 @ 1GHz | 256MB DDR3 オンチップ、LicheeRV-Nano / NanoKVM / MaixCAM で使用 |
|
||||
| [Allwinner (全志)](https://www.allwinnertech.com/) | V861 | Dual C907 | 128MB DDR3L オンチップ、1 TOPS NPU、4K AI カメラ SiP |
|
||||
| [Allwinner (全志)](https://www.allwinnertech.com/) | V881 | C907 | RISC-V AI カメラシリーズ |
|
||||
| [Arterytek (匠芯创)](https://www.arterytek.com/) | D213 | RISC-V | HaaS506-LD1 産業用 RTU で使用 |
|
||||
| [SpacemiT (进迭)](https://www.spacemit.com/) | K1 | 8x X60 @ 1.8GHz | Milk-V Jupiter, BananaPi BPI-F3 で使用 |
|
||||
| [SpacemiT (进迭)](https://www.spacemit.com/) | K3 | 8x X100 @ 2.5GHz | RVA23 準拠、1024 ビット RVV、FP8 AI 推論 |
|
||||
| [Zhihe (知合)](https://www.zhihe-tech.com/) | A210 | High-perf RISC-V | 8 コア、16MB L3 キャッシュ、デスクトップクラス |
|
||||
| [Canaan (嘉楠)](https://www.canaan-creative.com/) | K230 | Dual C908 @ 1.6GHz | 6 TOPS KPU、CanMV-K230 で使用 |
|
||||
|
||||
### MIPS
|
||||
|
||||
| ベンダー | チップ | 備考 |
|
||||
|----------|--------|------|
|
||||
| MediaTek | [MT7620](https://www.mediatek.com/products/home-networking/mt7620) | MIPS24KEc @ 580MHz、多くの OpenWrt ルーターで使用(例:Xiaomi Router 3G) |
|
||||
|
||||
### LoongArch (loong64)
|
||||
|
||||
| ベンダー | チップ | 備考 |
|
||||
|----------|--------|------|
|
||||
| [Loongson (龙芯)](https://www.loongson.cn/) | 3A5000 | クアッドコア LA464 @ 2.5GHz、デスクトップ/ワークステーション |
|
||||
| [Loongson (龙芯)](https://www.loongson.cn/) | 3A6000 | クアッドコア 4C/8T @ 2.5GHz、IPC は Intel 第10世代に匹敵 |
|
||||
| [Loongson (龙芯)](https://www.loongson.cn/) | 2K1000LA | デュアルコア @ 1GHz、産業/IoT アプリケーション |
|
||||
|
||||
---
|
||||
|
||||
## 2. 検証済み製品(発売日順)
|
||||
|
||||
PicoClaw でテスト済みのコンシューマー製品、ルーター、産業用デバイス。
|
||||
|
||||
| 年 | 製品 | アーキテクチャ | SoC | RAM | カテゴリ |
|
||||
|----|------|----------------|-----|-----|----------|
|
||||
| 2009 | Nokia N900 | ARM (A8) | OMAP3430 | 256MB | スマートフォン |
|
||||
| 2012 | Samsung Galaxy Note 10.1 (N8000) | ARM (A9) | Exynos 4412 | 2GB | タブレット |
|
||||
| 2016 | Xiaomi Router 3G (小米路由器3G) | MIPS | MT7620 | 256MB | ルーター (OpenWrt) |
|
||||
| 2018 | Phicomm N1 (斐讯N1) | ARM64 (A53) | S905D | 2GB | TV ボックス / ホームサーバー |
|
||||
| 2019 | Xiaomi AI Speaker (小爱音箱) | ARM64 (A53) | — | 256MB | スマートスピーカー |
|
||||
| 2024 | [NanoKVM](https://wiki.sipeed.com/hardware/en/kvm/NanoKVM/introduction.html) | RISC-V | SG2002 | 256MB | IP-KVM |
|
||||
| 2025 | HaaS506-LD1 | RISC-V | D213 | 128MB | 産業用 RTU |
|
||||
| 2025 | [NanoKVM-Pro](https://wiki.sipeed.com/hardware/en/kvm/NanoKVM_Pro/introduction.html) | ARM64 (A53) | AX630C | 1GB | プロ IP-KVM |
|
||||
| 2026 | [MaixCAM2](https://wiki.sipeed.com/hardware/en/maixcam/index.html) | ARM64 (A53) | AX630C | 1/4GB | 4K AI カメラ |
|
||||
|
||||
---
|
||||
|
||||
## 3. 検証済み開発ボード(発売日順)
|
||||
|
||||
| 年 | ボード | アーキテクチャ | SoC | RAM | 購入リンク |
|
||||
|----|--------|----------------|-----|-----|------------|
|
||||
| 2012 | [Raspberry Pi 1 Model B](https://www.raspberrypi.com/products/) | ARMv6 | BCM2835 | 512MB | — |
|
||||
| 2015 | [Raspberry Pi 2 Model B](https://www.raspberrypi.com/products/raspberry-pi-2-model-b/) | ARMv7 (A7) | BCM2836 | 1GB | — |
|
||||
| 2015 | [Raspberry Pi Zero](https://www.raspberrypi.com/products/raspberry-pi-zero/) | ARMv6 | BCM2835 | 512MB | — |
|
||||
| 2016 | [Raspberry Pi 3 Model B](https://www.raspberrypi.com/products/raspberry-pi-3-model-b/) | ARM64 (A53) | BCM2837 | 1GB | — |
|
||||
| 2017 | [LicheePi Zero](https://wiki.sipeed.com/hardware/en/lichee/Zero/Zero.html) | ARMv7 (A7) | Allwinner V3s | 64MB | [Sipeed](https://sipeed.com/) |
|
||||
| 2019 | [Raspberry Pi 4 Model B](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/) | ARM64 (A72) | BCM2711 | 1~8GB | [RPi](https://www.raspberrypi.com/) |
|
||||
| 2023 | [Raspberry Pi 5](https://www.raspberrypi.com/products/raspberry-pi-5/) | ARM64 (A76) | BCM2712 | 2~8GB | [RPi](https://www.raspberrypi.com/) |
|
||||
| 2024 | [LicheeRV-Nano](https://wiki.sipeed.com/hardware/en/lichee/RV_Nano/1_intro.html) | RISC-V | SG2002 | 256MB | [AliExpress](https://www.aliexpress.com/item/1005006519668532.html) |
|
||||
| 2024 | [MaixCAM-Pro](https://wiki.sipeed.com/hardware/en/maixcam/index.html) | RISC-V | SG2002 | 256MB | [Sipeed](https://sipeed.com/) |
|
||||
| 2024 | [Milk-V Duo 64M](https://milkv.io/docs/duo/getting-started/duo) | RISC-V | CV1800B | 64MB | [Milk-V](https://milkv.io/) |
|
||||
| 2024 | [CanMV-K230](https://developer.canaan-creative.com/k230_canmv/en/main/) | RISC-V | K230 | 512MB | [Canaan](https://www.canaan-creative.com/) |
|
||||
|
||||
---
|
||||
|
||||
## 4. その他の対応環境
|
||||
|
||||
### Android スマートフォン(Termux 経由)
|
||||
|
||||
1GB 以上の RAM を搭載した ARM64 Android スマートフォン(2015年以降)。[Termux](https://github.com/termux/termux-app) をインストールし、`proot` を使用して PicoClaw を実行します。
|
||||
|
||||
> セットアップ手順は [README:古い Android スマートフォンで実行](../../README.ja.md#-run-on-old-android-phones) を参照してください。
|
||||
|
||||
### デスクトップ / サーバー / クラウド
|
||||
|
||||
| プラットフォーム | 備考 |
|
||||
|------------------|------|
|
||||
| x86_64 Linux | ネイティブバイナリ、依存関係なし |
|
||||
| x86_64 Windows | ネイティブバイナリ |
|
||||
| macOS (Intel / Apple Silicon) | ネイティブバイナリ |
|
||||
| Docker (any platform) | `docker compose` ワンライナー、[Docker ガイド](docker.md) を参照 |
|
||||
| OpenWrt routers | MIPS/ARM ビルド、32MB 以上の空きメモリが必要 |
|
||||
| FreeBSD / NetBSD | x86_64 および arm64 ビルドが利用可能 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 最小要件
|
||||
|
||||
| リソース | 最小 | 推奨 |
|
||||
|----------|------|------|
|
||||
| RAM | 10MB 空き | 32MB 以上空き |
|
||||
| ストレージ | 20MB(バイナリ) | 50MB 以上(ワークスペース含む) |
|
||||
| CPU | 任意(シングルコア 0.6GHz 以上) | — |
|
||||
| OS | Linux (kernel 3.x+) | Linux 5.x+ |
|
||||
| ネットワーク | 必須(LLM API 呼び出し用) | イーサネットまたは WiFi |
|
||||
|
||||
---
|
||||
|
||||
## 6. テストと貢献の方法
|
||||
|
||||
```bash
|
||||
# 1. お使いのアーキテクチャ向けをダウンロード
|
||||
wget https://github.com/sipeed/picoclaw/releases/latest/download/picoclaw_Linux_arm64.tar.gz
|
||||
tar xzf picoclaw_Linux_arm64.tar.gz
|
||||
|
||||
# 2. 初期化
|
||||
./picoclaw onboard
|
||||
|
||||
# 3. テスト
|
||||
./picoclaw agent -m "Hello, what board am I running on?"
|
||||
```
|
||||
|
||||
利用可能なビルド:`linux-amd64`, `linux-arm64`, `linux-arm`, `linux-riscv64`, `linux-loong64`, `linux-mipsle`
|
||||
|
||||
### ハードウェアを追加する
|
||||
|
||||
1. このリポジトリをフォーク
|
||||
2. 該当するテーブルにチップ/製品/ボードを追加
|
||||
3. 名前、アーキテクチャ、SoC、RAM、年、リンク(あれば)を含める
|
||||
4. PR を送信
|
||||
|
||||
ハードウェアベンダーの方へ:公式サポートの追加や共同プロモーションをご希望ですか?Issue を作成するか、[Discord](https://discord.gg/V4sAZ9XWpN) でお問い合わせください。
|
||||
@@ -93,7 +93,7 @@
|
||||
],
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"model": "gpt-5.4"
|
||||
"model_name": "gpt-5.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -266,7 +266,7 @@ PicoClaw はリクエスト送信前に外側の `litellm/` プレフィック
|
||||
],
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"model": "glm-4.7"
|
||||
"model_name": "glm-4.7"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -298,7 +298,7 @@ PicoClaw はプロトコルファミリーごとに Provider をルーティン
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"workspace": "~/.picoclaw/workspace",
|
||||
"model": "glm-4.7",
|
||||
"model_name": "glm-4.7",
|
||||
"max_tokens": 8192,
|
||||
"temperature": 0.7,
|
||||
"max_tool_iterations": 20
|
||||
@@ -328,12 +328,11 @@ picoclaw agent -m "こんにちは"
|
||||
{
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"model": "anthropic/claude-opus-4-5"
|
||||
"model_name": "anthropic/claude-opus-4-5"
|
||||
}
|
||||
},
|
||||
"session": {
|
||||
"dm_scope": "per-channel-peer",
|
||||
"backlog_limit": 20
|
||||
"dm_scope": "per-channel-peer"
|
||||
},
|
||||
"providers": {
|
||||
"openrouter": {
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
**修正方法:** `~/.picoclaw/config.json`(またはお使いの設定パス)で:
|
||||
|
||||
1. **agents.defaults.model** は `model_list` 内の `model_name` と一致する必要があります(例:`"openrouter-free"`)。
|
||||
1. **agents.defaults.model_name** は `model_list` 内の `model_name` と一致する必要があります(例:`"openrouter-free"`)。
|
||||
2. そのエントリの **model** は有効な OpenRouter モデル ID である必要があります。例:
|
||||
- `"openrouter/free"` – 自動無料枠
|
||||
- `"google/gemini-2.0-flash-exp:free"`
|
||||
@@ -28,7 +28,7 @@
|
||||
{
|
||||
"agents": {
|
||||
"defaults": {
|
||||
"model": "openrouter-free"
|
||||
"model_name": "openrouter-free"
|
||||
}
|
||||
},
|
||||
"model_list": [
|
||||
|
||||
Reference in New Issue
Block a user