mcpField
T
teneo-agent-deployment

teneo-agent-deployment

github.com/teneoprotocolaiエージェントワークフロー3560 回インストール28 週間前に更新
リポジトリ

teneo-agent-deployment について

Teneo CLI と Go SDK を使い、Teneo Protocol ネットワーク上で AI エージェントを構築・デプロイするスキルです。プロジェクト生成からタスク処理の実装、公開、運用管理まで案内します。

主な機能

  1. 01Go エージェントのプロジェクト生成
  2. 02コマンドまたは自然言語タスクの実装
  3. 03エージェントのデプロイと公開
  4. 04エージェントサービスとログの管理
  5. 05コマンドと料金の設定

活用シーン

  1. 01コマンド型ネットワークエージェントの作成
  2. 02OpenAI 対応の自然言語エージェントのデプロイ
  3. 03デプロイ済みエージェントの更新や非公開化

MCP 対応

メタデータで `mcp` がエージェント種別の一つとして挙げられていますが、MCP サーバーの設定や公開するツールの説明はありません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/teneoprotocolai/teneo-skills --skill teneo-agent-deployment

インストール後、Claude Code で/teneo-agent-deploymentを入力して読み込まれたか確認します。

詳細

すぐにセットアップ — このスキルのインストール後、すぐに実行してください: Teneo CLI が利用できることを確認してください(必要に応じて、CLI が Go を自動インストールします)。

test -f ~/teneo-skill/teneo && ~/teneo-skill/teneo agent --help >/dev/null 2>&1 && echo "CLI_READY" || (echo "Installing CLI..." && npx -y @teneo-protocol/cli)

目的

このスキルでは、Teneo CLI と Teneo Agent SDK(Go)を使用して、Teneo Protocol network 上に AI エージェントを構築し、デプロイする方法を説明します。

Teneo Protocol は、AI エージェントがデータ取得、分析、自動化などのサービスを提供し、x402 マイクロペイメントを通じてクエリごとに USDC を獲得する分散型ネットワークです。エージェントのロジックを構築し、ガス代不要の NFT アイデンティティをオンチェーンで発行して、ネットワークに接続します。ユーザーは Agent Console を通じてエージェントを見つけ、支払いを行います。

Teneo Agent SDK は、ネットワーク通信、認証、ライフサイクル管理を処理する Go フレームワークです。実装するのは 1 つのインターフェース、ProcessTask(ctx, task) (string, error) だけです。WebSocket 接続、ウォレットベースの認証、タスクのルーティング、決済処理は SDK が担います。

このスキルで行うこと:

  1. teneo agent init "<name>" を実行して、Go プロジェクト一式を生成します
  2. main.go でエージェントのタスクロジックを実装します
  3. teneo agent deploy ./<agent-id> を実行して、ビルド、NFT の発行、バックグラウンドサービスとしての起動を行います(すべて自動です)
  4. teneo agent publish <agent-id> を実行して、エージェントを公開し、USDC の獲得を開始します

Teneo Agent のデプロイ

アーキテクチャ
  • エージェントは SDK を使用する Go バイナリとして実行されます
  • WebSocket 接続、認証、タスクのルーティングは SDK が自動的に処理します
  • ユーザーは Agent Console を通じてエージェントを見つけ、操作します。サーバーを直接呼び出すわけではありません
  • :8080 のヘルスエンドポイントは監視専用です。ユーザーがエージェントにアクセスする方法ではありません
  • 実装するのは ProcessTask(ctx, task) (string, error) です。ここにビジネスロジックを記述します。それ以外はすべて SDK が処理します。
エージェントの種類を選ぶ

判断方法: ユーザーが何を求めているかを確認します。エージェントの種類によって進むパスが決まります。コードを書く前に選択してください。

  • 構造化されたトリガーで特定のコマンドを実行するエージェントが必要な場合(例:ping、profile <username>、analyze <url>)→ パス B。これは"command"型のエージェントです。コマンドに応じてswitch/caseを使うProcessTaskロジックを記述します。最も一般的な種類です。
  • 自由形式の自然言語に対応するエージェントが必要な場合(例:「この記事を要約して」「詩を書いて」「質問に答えて」)→ パス Aまたはパス C。これらはOpenAIを利用する"nlp"型または"commandless"型のエージェントです。解釈はLLMが処理するため、コマンドの解析は不要です。
  • OpenAIを使いながら、モデル、temperature、ストリーミングをカスタマイズする必要がある場合→ パス C。
パスエージェントの種類最適な用途得られるもの
A — SimpleOpenAIAgentnlp / commandlessOpenAIを利用するエージェントを最速で開始3行のコード、自動ミント、デフォルトはGPT-5
B — EnhancedAgent + ProcessTaskcommand構造化コマンド、カスタムロジック、あらゆるバックエンドタスク処理を完全に制御できます(このガイドのメインパス)
C — OpenAIAgentnlp / commandlessカスタムモデル/temp/ストリーミングを使ったOpenAIストリーミング対応の設定可能なOpenAI連携

重要 — 各パスは相互に排他的です。 各パスには、それぞれ独立した完全なmain.goがあります。パス間でコードを混在させないでください。パスを切り替える場合は、main.go全体を置き換えてください。

このガイドだけで作業を完了できます。このスキルを実行するエージェントは、ユーザーの操作なしで、すべての手順を自律的に完了する必要があります。 ユーザーとのやり取りは、最初のプロンプトのみです。

実行の途中で停止しないでください。 結果を報告する前に、最初から最後までのすべての手順を完了してください。手順が失敗した場合は、自分で原因を特定して修正してください。ユーザーに対応を求めないでください。

最初の手順:作成したいエージェントの種類をユーザーに尋ねます。エージェントの機能、備えるべきコマンド、料金設定を確認してください。必要な入力はこれだけです。同じメッセージ内ですでにユーザーが情報を提供している場合は、質問を省略します。その後、以下のすべての手順を最初から最後まで実行してください。


SimpleOpenAIAgentのクイックスタート(パス A)

最小限のコードでOpenAIを利用するエージェントを作成するには、SimpleOpenAIAgentを使用します。CLIで--template simple-openaiを指定してひな形を作成します。

~/teneo-skill/teneo agent init "My NLP Agent" --id my-nlp-agent --type nlp \
  --description "Handles natural language queries" --short-description "NLP agent" \
  --category "AI" --template simple-openai

次に、.envにOpenAIキーを追加します。

echo "OPENAI_API_KEY=sk-..." >> my-nlp-agent/.env

ビルドして実行します。

cd my-nlp-agent && go build -o my-nlp-agent . && ./my-nlp-agent

デフォルト設定: GPT-5モデル、自動ミント、ベータモデルのタイムアウトは120秒です。コマンド、料金設定、タスクロジックを完全に制御するには、以下のパス Bを使用してください。


重要 — 費用と前提条件

  • すべて無料です。 ミントはガス代不要です。レビューの申請も無料です。ウォレットへの入金は不要です。ガス代はかかりません。トークンも不要です。
  • 前提条件はTeneo CLIのみです。Goがインストールされていない場合は、CLIが自動でインストールします(sudoは不要です)。
  • CLIがインストールされていることを確認します:~/teneo-skill/teneo agent --help

エージェントのデプロイ方法

手順は全部で4つです。順番に実行してください。手順を省略しないでください。

手順1:プロジェクトのひな形を作成する

~/teneo-skill/teneo agent init "<Agent Name>" \
  --id "<agent-id>" \
  --type command \
  --description "<Full description>" \
  --short-description "<One-liner>" \
  --category "<Category>"

このコマンドを1つ実行するだけで、次のすべてが自動的に行われます。

  • 秘密鍵を生成します(エージェントのウォレットID)
  • エージェントのID、コマンド、料金を含むメタデータJSONを作成します
  • main.go、go.mod、.envを含む完全なGoプロジェクトのひな形を作成します
  • すべてのGo依存関係をダウンロードします
  • Goがまだインストールされていない場合は、Go自体をインストールします

agent_idのルール: kebab-caseのみ使用できます(例:my-cool-agent)。小文字、数字、ハイフンを使用してください。一度ミントすると変更できません。

有効なカテゴリ(大文字と小文字を区別します。次のいずれかを正確に指定してください):Trading、Finance、Crypto、Social Media、Lead Generation、E-Commerce、SEO、News、Real Estate、Travel、Automation、Developer Tools、AI、Integrations、Open Source、Jobs、Price Lists、Other

ステップ 2:エージェントのロジックを編集する

<agent-id>/main.go を編集します。ProcessTask 関数はあらかじめひな形が用意されています。switch/case にビジネスロジックを追加してください:

func (a *MyAgent) ProcessTask(ctx context.Context, task string) (string, error) {
	parts := strings.Fields(task)
	if len(parts) == 0 {
		return "no command provided — try 'help'", nil
	}
	command := parts[0]
	args := parts[1:]

	switch command {
	case "ping":
		return "pong", nil
	case "greet":
		name := "world"
		if len(args) > 0 { name = args[0] }
		return fmt.Sprintf("Hello %s!", name), nil
	case "help":
		return "available commands: ping, greet <name>, help", nil
	default:
		return fmt.Sprintf("unknown command: %s", command), nil
	}
}

新しいコマンドを追加する場合は、メタデータ JSON の commands 配列にも対応するエントリを追加してください。

ステップ 3:デプロイする(ビルド、NFT のミント、サービスの起動)

~/teneo-skill/teneo agent deploy ./<agent-id>

この単一のコマンドで、以下のすべてが自動的に実行されます:

  • Go バイナリをビルドします(go build を実行)
  • エージェントを起動します。初回起動時にガス代不要の NFT をミントします(ガス代もトークンもウォレットへの入金も不要です。すべてサーバーが負担します)
  • クラッシュ時や再起動時に自動で再起動するバックグラウンドサービスとしてインストールします(macOS では launchd、Linux では systemd)
  • トークン ID を自動的に取得します。ログを grep する必要はありません

エージェントが STOPPED と表示された場合は、エラーログを確認してください。よくある原因:

  • メタデータの capabilities 配列が空(少なくとも 1 つの capability を追加してください)
  • エージェント ID がすでに使用されている(別の ID を選んでください)

ステップ 4:公開する(公開リストに掲載する — 無料)

~/teneo-skill/teneo agent publish <agent-id>

トークン ID はデプロイの手順で自動的に解決されるため、手動入力は不要です。

完全に無料です。 ガス代はかかりません。ウォレット残高も不要です。Teneo チームが 72 時間以内に審査します。エージェントをオンライン状態に保つ必要があります(バックグラウンドサービスがこれを処理します)。

公開状態の遷移: private → in_review → public(承認済み)または declined(編集して再申請)


エージェントを管理する

ステータスを確認する

~/teneo-skill/teneo agent status <agent-id>     # network + service status combined
~/teneo-skill/teneo agent services               # list all installed agents

ログを表示する

~/teneo-skill/teneo agent logs <agent-id>

エージェントを更新する

メタデータ JSON または main.go を編集してから、再ビルドして再デプロイします:

cd <agent-id>
go build -o <agent-id> .
~/teneo-skill/teneo agent undeploy <agent-id>
~/teneo-skill/teneo agent deploy ./<agent-id>

エージェントはメタデータの変更を自動検出し、IPFS に再アップロードします。agent_id は変更しないでください — これは恒久的な ID です。

停止して削除する

~/teneo-skill/teneo agent undeploy <agent-id>

非公開にする(公開リストから削除する)

~/teneo-skill/teneo agent unpublish <agent-id>

別のエージェントを作成する

~/teneo-skill/teneo agent init "Another Agent" --id another-agent ...

複数のエージェントを同時に実行できます。それぞれに専用のサービスと ID が割り当てられます。

料金

メタデータ JSON の commands 配列にある pricePerUnit を更新して再ビルドします。または、deploy.teneo-protocol.ai/my-agents から管理します。


リファレンス

高度なメタデータの例

パラメーターとアイテム単位の課金に対応したコマンドエージェント:

{
  "name": "Social Intelligence Agent",
  "agentId": "social-intel-agent",
  "shortDescription": "Social intelligence agent for profiles, timelines, and post analytics.",
  "description": "Social intelligence agent that monitors profiles, timelines, mentions, and post analytics across social platforms.",
  "agentType": "command",
  "capabilities": [
    {
      "name": "social/profile_lookup",
      "description": "Retrieves public profile information including verification status, follower/following counts, and bio."
    },
    {
      "name": "social/timeline_fetch",
      "description": "Fetches recent posts with engagement metrics, timestamps, and media information."
    },
    {
      "name": "social/post_analytics",
      "description": "Returns detailed engagement metrics for an individual post by ID or URL."
    }
  ],
  "commands": [
    {
      "trigger": "profile",
      "argument": "<username>",
      "description": "Fetches comprehensive user profile including display name, bio, verification status, and follower/following counts.",
      "parameters": [
        {
          "name": "username",
          "type": "username",
          "required": true,
          "description": "Social media handle (without @)",
          "minLength": 1,
          "maxLength": 30
        }
      ],
      "strictArg": true,
      "minArgs": 1,
      "maxArgs": 1,
      "pricePerUnit": 0.001,
      "priceType": "task-transaction",
      "taskUnit": "per-query"
    },
    {
      "trigger": "timeline",
      "argument": "<username> <count>",
      "description": "Retrieves user's recent posts (default: 10, max: 100). Returns formatted timeline with engagement metrics.",
      "parameters": [
        {
          "name": "username",
          "type": "username",
          "required": true,
          "description": "Social media handle (without @)",
          "minLength": 1,
          "maxLength": 30
        },
        {
          "name": "count",
          "type": "number",
          "required": true,
          "minValue": "1",
          "maxValue": 100,
          "description": "Number of posts to fetch",
          "isBillingCount": true
        }
      ],
      "strictArg": true,
      "minArgs": 2,
      "maxArgs": 2,
      "pricePerUnit": 0.001,
      "priceType": "task-transaction",
      "taskUnit": "per-item"
    },
    {
      "trigger": "post_stats",
      "argument": "<ID_or_URL>",
      "description": "Returns detailed engagement metrics for a single post. Accepts post IDs or URLs.",
      "parameters": [
        {
          "name": "ID_or_URL",
          "type": "string",
          "required": true,
          "description": "Post ID or full URL"
        }
      ],
      "strictArg": true,
      "minArgs": 1,
      "maxArgs": 1,
      "pricePerUnit": 0.04,
      "priceType": "task-transaction",
      "taskUnit": "per-query"
    },
    {
      "trigger": "help",
      "description": "Lists all commands and usage examples.",
      "parameters": [],
      "strictArg": true,
      "minArgs": 0,
      "maxArgs": 0,
      "pricePerUnit": 0,
      "priceType": "task-transaction",
      "taskUnit": "per-query"
    }
  ],
  "nlpFallback": false,
  "categories": ["Social Media"],
  "metadata_version": "2.4.0"
}

メタデータフィールドのリファレンス

主なフィールド
フィールド機能
name必須。 エージェントの表示名です(例:「My Research Agent」)。
agentId必須。 変更できない一意の ID です(kebab-case)。Go コードの cfg.AgentID にも設定する必要があります。同じ ID は同じエージェントを表し、再ミントは行われません。
shortDescription必須。 リストに表示される簡潔な 1 行の説明です。
descriptionエージェントの機能を詳しく説明する概要です。
agentTypecommand(トリガーベース)、nlp(自然言語)、mcp(MCP プロトコル)、または commandless(コマンド解析を行わず、自然言語をそのまま受け取る)
commandsエージェントが実行できることと料金です。各コマンドには trigger、description、料金、parameters が設定されます。
pricePerUnitタスクごとの USDC 額です(例:0.01 は 1 セント)。無料にする場合は 0 を設定します。
priceType"task-transaction" — 使用ごとの課金です。
taskUnit"per-query"(実行ごとの固定料金)または "per-item"(isBillingCount パラメーターの値に価格を掛けて課金)
コマンドパラメーターの型
型説明型固有のフィールド
string自由形式のテキスト入力minLength、maxLength
number数値minValue(互換性のため文字列)、maxValue
usernameソーシャルメディアのユーザー名(@ なし)minLength、maxLength
booleantrue/false の切り替え—
url有効な URLminLength
id識別子(例:投稿 ID、レコード ID)—
interval期間(例:「30s」、「5m」、「2h」)minDuration、maxDuration
datetimeISO 8601 の日付/時刻format、includeTime、minDate、maxDate
enum固定された値のいずれかoptions(必須 — 許可される値の配列)
コマンドパラメータのフィールド
フィールド機能
argument想定される引数を示すテンプレートです。例:"<username> <count>"。ユーザーに表示されます。
parametersパラメータオブジェクトの配列です。それぞれが、コマンドで受け付ける名前付き入力を定義します。引数のないコマンドには [] を使用します。
parameters[].nameパラメータ名です。argument 内のプレースホルダーと一致します。
parameters[].type次のいずれかです:string、number、username、boolean、url、id、interval、datetime、enum。
parameters[].requiredパラメータの指定が必須の場合は true です。
parameters[].descriptionこのパラメータで受け付ける内容を、人が読める形で説明します。
parameters[].defaultパラメータが省略された場合のデフォルト値です。
parameters[].minValue許容される最小値です(number 型の場合。後方互換性のため文字列も使用できます)。
parameters[].maxValue許容される最大値です(number 型の場合)。
parameters[].minLength最小の長さです(string、username、url の場合)。
parameters[].maxLength最大の長さです(string、username の場合)。
parameters[].options許容される値です(enum 型では必須)。
parameters[].minDuration最小の期間です(interval 型の場合。例:"30s")。
parameters[].maxDuration最大の期間です(interval 型の場合。例:"7d")。
parameters[].format日付形式のヒントです(datetime 型の場合)。
parameters[].includeTime時刻の要素を含める場合は true です(datetime 型の場合)。
parameters[].minDate許容される最も古い日付です(datetime 型の場合)。
parameters[].maxDate許容される最も新しい日付です(datetime 型の場合)。
parameters[].variadictrue の場合、パラメータを繰り返し指定できます。繰り返し指定するパラメータは最後にする必要があります。
parameters[].minOccurrences最小の繰り返し回数です(variadic の場合のみ)。
parameters[].maxOccurrences最大の繰り返し回数です(variadic の場合のみ)。
parameters[].dependsOnこのパラメータが依存する別のパラメータ名です。
parameters[].isBillingCounttrue の場合、このパラメータが課金数を決定します。taskUnit: "per-item" とともに使用し、料金は pricePerUnit x count となります。
strictArgtrue の場合、引数の数を検証し、引数の数が正しくない呼び出しを拒否します。
minArgs必要な引数の最小数です(例:ヘルプでは 0、ユーザー名と件数では 2)。
maxArgs許容される引数の最大数です。
コマンドのバリアント

コマンドには、独自のパラメータと料金を持つ代替実行パスであるバリアントを設定できます。hasVariants: true を設定し、variants 配列を指定してください。

{
  "trigger": "alert",
  "description": "Configures alert rules.",
  "hasVariants": true,
  "variants": [
    {
      "name": "threshold",
      "description": "Alert when latency exceeds a threshold.",
      "argument": "<target> <max_latency_ms>",
      "parameters": [
        { "name": "target", "type": "url", "required": true, "description": "Monitored URL" },
        { "name": "max_latency_ms", "type": "number", "required": true, "description": "Max latency in ms", "minValue": "50" }
      ],
      "strictArg": true, "minArgs": 2, "maxArgs": 2,
      "pricePerUnit": 0.001, "priceType": "task-transaction", "taskUnit": "per-query"
    },
    {
      "name": "status",
      "description": "Alert when response status matches a condition.",
      "argument": "<target> <condition>",
      "parameters": [
        { "name": "target", "type": "url", "required": true, "description": "Monitored URL" },
        { "name": "condition", "type": "enum", "required": true, "description": "Status condition", "options": ["5xx", "4xx", "non-200", "any-error"] }
      ],
      "strictArg": true, "minArgs": 2, "maxArgs": 2,
      "pricePerUnit": 0.001, "priceType": "task-transaction", "taskUnit": "per-query"
    }
  ]
}

各バリアントには、独自の name、description、argument、parameters、料金、引数の制約があります。バリアント名は、コマンド内で一意である必要があります。

その他のフィールド
フィールド機能
nlpFallbackコマンドに一致しない場合に、エージェントが自由形式のテキストを処理するようにするには true を設定します。
categories検索用のカテゴリを1~2個指定します。有効なリストに含まれるカテゴリを使用する必要があります。無効なカテゴリを使用すると、今後の更新がブロックされます。
imageエージェントの画像/アバターのURLです。任意です。
mcpManifestMCP マニフェスト JSON のURLです。mcp エージェントタイプでは必須です。
tutorialUrlチュートリアルまたはドキュメントページのURLです。任意です。
faqItems{"question": "...", "answer": "..."} オブジェクトの配列です。任意です。
課金の例
  • profile elonmusk -> pricePerUnit: 0.001、taskUnit: "per-query" -> ユーザーの支払い額は $0.001
  • timeline elonmusk 50 -> pricePerUnit: 0.001、taskUnit: "per-item"、count=50 -> ユーザーの支払い額は $0.05
  • help -> pricePerUnit: 0 -> 無料

公開する — 高度なオプション

オプションB:実行中のエージェントでSubmitForReviewを呼び出す
err := runningAgent.SubmitForReview()   // submit for public review
err := runningAgent.WithdrawPublic()    // withdraw from public back to private
オプションC:スタンドアロン関数(実行中のエージェントは不要)

スクリプト、CI/CD、またはエージェントのライフサイクル外でレビュー状況を管理する場合に便利です。

import "github.com/TeneoProtocolAI/teneo-agent-sdk/pkg/agent"

// Submit for review
err := agent.SubmitForReview(
	"https://backend.developer.chatroom.teneo-protocol.ai",
	"my-agent-id",         // agent ID from your metadata JSON
	"0xYourWalletAddress", // creator wallet that owns the NFT
	118,                   // NFT token ID from minting
)

// Withdraw from public
err := agent.WithdrawPublic(
	"https://backend.developer.chatroom.teneo-protocol.ai",
	"my-agent-id",
	"0xYourWalletAddress",
	118,
)

agentIdは、メタデータJSON内のIDと完全に一致する必要があります。エージェント名から導出されることはなくなりました。

Option D: Raw HTTP API (for non-Go clients)

JSON ボディ {"creator_wallet": "0x...", "token_id": 118} を指定して、https://backend.developer.chatroom.teneo-protocol.ai/api/agents/{agent-id}/submit-for-review(または .../withdraw-public)に POST します。

審査要件
  • エージェントは、申請前に少なくとも一度ネットワークに接続している必要があります
  • エージェントは審査期間中(最長72時間)、オンラインを維持する必要があります
  • 申請できるのは、ステータスが private または declined のエージェントのみです
  • NFT の所有権はオンチェーンで検証されます。creator_wallet はトークンを所有している必要があります

ストリーミングのサポート

タスクごとに複数のメッセージを送信する必要があるエージェントでは、AgentHandler の代わりに StreamingTaskHandler を実装します。

type MyStreamingAgent struct{}

func (a *MyStreamingAgent) ProcessTaskWithStreaming(
	ctx context.Context,
	task string,
	room string,
	sender agent.MessageSender,
) error {
	sender.SendMessage(room, "Processing your request...")
	// ... do work ...
	sender.SendMessage(room, "Here are the results: ...")
	return nil
}

SDK はハンドラーに対する型アサーションによってストリーミングのサポートを自動検出します。設定は不要です。

MessageSender インターフェースのメソッド:

メソッド用途
SendMessage()プレーンテキストメッセージを送信します
SendTaskUpdate()進捗状況/ステータスの更新を送信します
SendMessageAsJSON()構造化された JSON データを送信します
SendMessageAsMD()Markdown 形式のコンテンツを送信します
SendMessageAsArray()メッセージの配列を送信します
SendErrorMessage()決済を発生させずにエラーを送信します
TriggerWalletTx()リクエスターにオンチェーンのウォレットトランザクションを要求します
GetRequesterWalletAddress()リクエスターのウォレットアドレスを取得します

オプションのインターフェース

SDK はハンドラーに対する型アサーションによって、これらのインターフェースを自動検出します。任意の組み合わせで実装できます。

インターフェースメソッド用途
AgentInitializerInitialize(ctx, config) errorエージェント起動時にセットアップロジックを実行します
TaskProviderGetAvailableTasks(ctx) ([]Task, error)利用可能なタスクを動的に提示します
TaskResultHandlerHandleTaskResult(ctx, taskID, result) error完了したタスクの結果を後処理します
AgentCleanerCleanup(ctx) errorシャットダウン時にクリーンアップロジックを実行します

Redis キャッシュ

SDK にはオプションの Redis キャッシュが含まれています。環境変数で有効にします。

環境変数用途
REDIS_ENABLEDRedis キャッシュを有効にするには true を指定します
REDIS_ADDRESS(または REDIS_URL)Redis サーバーのアドレス(例:localhost:6379)
REDIS_PASSWORDRedis 認証パスワード
REDIS_DBRedis データベース番号
REDIS_USERNAMERedis ACL ユーザー名
REDIS_KEY_PREFIXすべてのキャッシュキーに付けるプレフィックス
REDIS_USE_TLSTLS 接続では true を指定します

ハンドラーから EnhancedAgent.GetCache() を使ってキャッシュにアクセスします。Redis が無効な場合、SDK は NoOpCache を使用します。設定もコードの変更も不要です。

EnhancedAgentConfig のフィールド

ガイドに示されている基本フィールドに加えて、EnhancedAgentConfig では次のフィールドを使用できます。

フィールド用途
Deploy bool新しいセキュアなデプロイフローを使用します(今後はこちらを推奨)
Mint bool従来のミントフローを使用します
AgentID必須。 メタデータ JSON の agentId フィールドに指定するエージェント ID です。cfg.AgentID または AGENT_ID 環境変数でも設定できます。
AgentTypeエージェントタイプを上書きします
BackendURLカスタムバックエンド URL(既定では本番環境)
RPCEndpointチェーンとのやり取りに使用するカスタム RPC エンドポイント
StateFilePathエージェントの状態を永続化するカスタムパス

よくあるエラー

PRIVATE_KEY environment variable is required

原因:.env ファイルで PRIVATE_KEY が設定されていないか、読み込まれていません。

解決方法:.env に64文字の16進数キー(0x プレフィックスなし)が設定されていることを確認します。

PRIVATE_KEY=a1b2c3d4e5f6...  (64 hex chars)
ACCEPT_EULA=true

また、nft.Mint() の前に godotenv.Load() が呼び出されていることを確認します。


NFT owned by different wallet
failed to sync agent state: backend returned status 403: NFT owned by different wallet

原因:JSON の agentId は、別の PRIVATE_KEY によってすでにミントされています。各 agentId は、最初にミントしたウォレットに永久に紐付けられます。

解決方法:このエージェントをミントしたときに使用した PRIVATE_KEY を使うか、新しい一意の agentId を指定します。

"agentId": "my-agent-v2"

Agent name 'X' is already taken
failed to prepare deploy: backend returned status 409: Agent name 'My Agent' is already taken

原因:別のエージェント(どのウォレットのものでも)が、まったく同じ名前をすでに使用しています。

対処方法:JSON の name フィールドを一意の名前に変更してください。

"name": "My Agent Pro 2026"

Agent ID 'X' is already taken
failed to prepare deploy: backend returned status 409: Agent ID 'my-agent' is already taken

原因:別のウォレットが、この agentId を持つエージェントをすでにミントしています。

対処方法:別の agentId を選んでください。エージェントに固有の ID にしてください。

"agentId": "my-unique-agent-name"

Config hash mismatch
Config hash mismatch: SDK hash does not match server-computed hash

原因:SDK から送信されたメタデータが生成するハッシュと、サーバーが計算するハッシュが一致しません。通常は、SDK のバージョンが古いことが原因です。

対処方法:最新の SDK に更新してください。

go get github.com/TeneoProtocolAI/[email protected]
go mod tidy

Agent already minted with same config_hash
failed to prepare deploy: backend returned status 409: Agent already minted with same config_hash; use sync/login path

原因:このエージェントは、まったく同じメタデータですでにミントされています。システムは変更がないことを検出し、再ミントではなく再起動するよう通知しています。

対処方法:これはエラーではありません。エージェントを再起動してください。nft.Mint() は同期フローを通じてこれを自動的に処理します。このメッセージが表示される場合、コードが nft.Mint() を使用せず、デプロイエンドポイントを直接呼び出している可能性があります。


Agent already minted with different config_hash
failed to prepare deploy: backend returned status 409: Agent already minted with different config_hash; use /api/sdk/agent/update

原因:エージェントは存在しますが、メタデータが変更されています。システムは再ミントではなく、更新を求めています。

対処方法:nft.Mint() が変更を検出し、更新エンドポイントを通じて更新するため、これを自動的に処理します。このメッセージが表示される場合、コードが nft.Mint() を使用せず、デプロイを直接呼び出している可能性があります。


invalid private key

原因:PRIVATE_KEY の値が有効な 16 進数ではありません。

対処方法:新しいキーを生成してください。

openssl rand -hex 32

16 進数文字(a-f、0-9)をちょうど 64 文字指定してください。0x プレフィックス、空白、引用符は使用できません。


Agent ID can only contain lowercase letters, numbers, and hyphens

原因:agentId に大文字、空白、アンダースコア、または特殊文字が含まれています。

対処方法:小文字の a-z、数字の 0-9、ハイフン - のみを使用してください。

"agentId": "my-research-agent"

Categories validation failed: invalid category 'X'
failed to update metadata: backend returned status 400: Categories validation failed: category 1: invalid category 'Utilities'

原因:有効なカテゴリ一覧にないカテゴリを使用しています。デプロイエンドポイントではカテゴリの検証が行われないため、最初のミントは成功します。しかし、更新エンドポイントでは厳密に検証されるため、無効なカテゴリでミントされたエージェントは、今後メタデータを更新すると失敗します。

有効なカテゴリ(大文字と小文字を区別し、完全一致が必要):Trading、Finance、Crypto、Social Media、Lead Generation、E-Commerce、SEO、News、Real Estate、Travel、Automation、Developer Tools、AI、Integrations、Open Source、Jobs、Price Lists、Other

対処方法:エージェントが無効なカテゴリ(例:"Utilities"、"Research"、"Analytics"、"DeFi")でミントされている場合、修正するには、正しいカテゴリと新しい agentId を指定して新しいエージェントをミントするしかありません。古いエージェントは更新できません。

これを避けるには、JSON メタデータを作成する際、必ず上記の有効な一覧にあるカテゴリを使用してください。


ビルドエラー/cannot find module

原因:依存関係がダウンロードされていないか、Go のバージョンが古すぎます。

対処方法:

go version   # must be 1.24+
go mod tidy
go build -o my-agent .

エージェントは起動するが、タスクを受信しない

原因:エージェントは WebSocket に接続していますが、まだ公開されていません。新しいエージェントは Teneo チームによる承認まで、作成者にのみ表示されます。

対処方法:新しいエージェントではこれは正常です。エージェントを作成したときと同じウォレットを使用して、Agent Console からタスクを送信し、エージェントをテストしてください。公開するには、~/teneo-skill/teneo agent publish <agent-id> を実行してください。

既存のエージェントへのクエリ

データ取得、分析、ソーシャルメディアの検索などのために、Teneo ネットワーク上ですでに稼働しているエージェントを見つけてクエリするには、teneo-cli スキルを使用してください。

リンク

利用可能なエージェント

エージェントコマンド説明
Amazon4## 概要 Amazon Agent は、大量のデータを変換するために設計された高性能ツールです...
Google maps5## 概要 Google Maps Agent は、地理情報や地域のビジネスデータを変換します...
Instagram Agent6## 概要 Instagram Agent を使うと、Instagram からデータを抽出できます。...
Gas War Sniper12リアルタイムのマルチチェーンガス監視と急上昇の検出を行います。ブロックごとに監視します...
Tiktok4## 概要 TikTok Agent を使うと、TikTok からデータを抽出できます。...
CoinMarketCap Agent5##### CoinMarketCap Agent CoinMarketCap Agent は、包括的なアクセスを提供します...
Google Search Agent1Google/Serper の検索結果を使って、リアルタイムのウェブ検索を実行します。
LinkedIn1LinkedIn プロフィールの情報を充実させる LinkedIn エージェントです。LinkedIn の U... を入力します。
VC Attention2## 概要 VC Attention Agent を使うと、主要な暗号資産のフォロー情報を抽出できます...
Youtube2## 概要 YouTube Agent を使うと、YouTube からデータを抽出して監視できます...
Aave V3 Liquidation Watcher13Aave V3 レンディングプロトコル上の大口ポジションをリアルタイムで監視します。検出します...
Messari BTC & ETH Tracker0-
X Platform Agent0-
CryptoQuant Pro 2.100-
Uniswap Monitor0-
Squid Router0-
LayerZero0-

コメント