# 检查和导入技能包

读取本地技能 ZIP 包，检查清单及文件信息，再按调用方选择将同一包导入工作区。

(sdk-ai-studio-skills-prepare)=
## 准备

1. [配置 SDK 和个人访问令牌](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-configure)。
2. [选择工作区并获取工作区 ID](../../../quickstart/ai-studio/sdk.md#sdk-ai-studio-quickstart-workspaces)。
3. **技能 ZIP 包**：从技能提供方取得，或按[技能包格式](../../../../reference/api/ai-studio/agents/skills/inspect-skill-package.md#表单字段)打包一个含 SKILL.md 的目录，保存到本地。

(sdk-ai-studio-skills-s1)=
(sdk-ai-studio-skills-s2)=
(sdk-ai-studio-skills-s3)=
## 检查并按需导入技能包

先设置 SKILL_ARCHIVE，例如 `export SKILL_ARCHIVE='./skill-package.zip'`。默认仅检查并输出名称、摘要和警告；确认包内容后，设置 IMPORT_SKILL=1 再运行会创建技能。

:::::{tab-set}
:sync-group: sdk-language

::::{tab-item} Python
:sync: python

```python
import os

import moi_product_sdk as sdk

client = sdk.new_with_personal_access_token(
    os.environ["PRODUCT_API_BASE_URL"], os.environ["PRODUCT_API_KEY"]
)
workspace_id = os.environ["WORKSPACE_ID"]
workspace = client.workspace(workspace_id)
from pathlib import Path
archive = Path(os.environ["SKILL_ARCHIVE"])
data = archive.read_bytes()
service = workspace.agents()
inspection = service.inspect_skill_package(archive.name, data)
print("技能名称:", inspection.get("name"))
print("包摘要:", inspection.get("archive_digest"))
print("警告:", inspection.get("warnings"))
if os.environ.get("IMPORT_SKILL") == "1":
    result = service.import_skill_package(archive.name, data)
    skill = result.get("skill") or {}
    print("技能 ID:", skill.get("id"), "名称:", skill.get("name"), "版本:", skill.get("version"))
```

::::

::::{tab-item} Go
:sync: go

```go
package main

import (
	"bytes"
	"context"
	"fmt"
	sdk "github.com/matrixorigin/matrixflow/sdk/go-sdk"
	"os"
	"path/filepath"
)

func main() {
	ctx := context.Background()
	client, err := sdk.NewWithPersonalAccessToken(os.Getenv("PRODUCT_API_BASE_URL"), os.Getenv("PRODUCT_API_KEY"))
	if err != nil {
		panic(err)
	}
	workspaceID := os.Getenv("WORKSPACE_ID")
	workspace, err := client.Workspace(workspaceID)
	if err != nil {
		panic(err)
	}
	_ = workspace
	archivePath := os.Getenv("SKILL_ARCHIVE")
	data, err := os.ReadFile(archivePath)
	if err != nil {
		panic(err)
	}
	service := workspace.Agents()
	inspection, err := service.InspectSkillPackage(ctx, filepath.Base(archivePath), bytes.NewReader(data))
	if err != nil {
		panic(err)
	}
	values, ok := inspection.AsMap()
	if !ok {
		panic("检查返回值不是对象")
	}
	fmt.Println("技能名称:", values["name"], "包摘要:", values["archive_digest"], "警告:", values["warnings"])
	if os.Getenv("IMPORT_SKILL") == "1" {
		imported, err := service.ImportSkillPackage(ctx, filepath.Base(archivePath), bytes.NewReader(data))
		if err != nil {
			panic(err)
		}
		result, ok := imported.AsMap()
		if !ok {
			panic("导入返回值不是对象")
		}
		skill, ok := result["skill"].(map[string]any)
		if !ok {
			panic("导入结果缺少技能对象")
		}
		fmt.Println("技能 ID:", skill["id"], "名称:", skill["name"], "版本:", skill["version"])
	}
}
```

::::

:::::

(sdk-ai-studio-skills-limit)=
(sdk-ai-studio-skills-next)=
检查后核对技能名称、包摘要和警告。导入成功后保存技能 ID 与版本，再按[绑定技能](../../../../guides/ai-studio/agents/skills/bind-skills.md)配置使用。
