플러그인
anchor alias
anchor alias
플러그인
Hermes에는 핵심 코드를 수정하지 않고도 사용자 정의 도구, 훅, 통합을 추가할 수 있는 플러그인 시스템이 있습니다.
자신이나 팀, 혹은 하나의 프로젝트를 위해 사용자 정의 도구를 만들고 싶다면,
보통 이것이 올바른 경로입니다. 개발자 가이드의
도구 추가 페이지는 ... 및 ...에 있는 빌트인 Hermes
핵심 도구를 위한 것입니다.
→ Hermes 플러그인 만들기 — 완전한 작동 예제와 함께 단계별 안내.
간단한 개요
~/.hermes/plugins/에 디렉토리를 plugin.yaml와 Python 코드와 함께 드롭하세요:
~/.hermes/plugins/my-plugin/
├── plugin.yaml # manifest
├── __init__.py # register() — wires schemas to handlers
├── schemas.py # tool schemas (what the LLM sees)
└── tools.py # tool handlers (what runs when called)
Hermes 시작 — 도구가 내장 도구와 함께 나타납니다. 모델이 즉시 이를 호출할 수 있습니다.
최소 동작 예제
여기 hello_world 도구를 추가하고 모든 도구 호출을 훅을 통해 기록하는 완전한 플러그인이 있습니다.
~/.hermes/plugins/hello-world/plugin.yaml
name: hello-world
version: "1.0"
description: A minimal example plugin
~/.hermes/plugins/hello-world/__init__.py
"""Minimal Hermes plugin — registers a tool and a hook."""
import json
def register(ctx):
# --- Tool: hello_world ---
schema = {
"name": "hello_world",
"description": "Returns a friendly greeting for the given name.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name to greet",
}
},
"required": ["name"],
},
}
def handle_hello(params, **kwargs):
del kwargs
name = params.get("name", "World")
return json.dumps({"success": True, "greeting": f"Hello, {name}!"})
ctx.register_tool(
name="hello_world",
toolset="hello_world",
schema=schema,
handler=handle_hello,
description="Return a friendly greeting for the given name.",
)
# --- Hook: log every tool call ---
def on_tool_call(tool_name, params, result):
print(f"[hello-world] tool called: {tool_name}")
ctx.register_hook("post_tool_call", on_tool_call)
두 파일을 ~/.hermes/plugins/hello-world/에 넣고 Hermes를 재시작하면, 모델이 즉시 hello_world를 호출할 수 있습니다. 훅은 각 도구 호출 후 로그 라인을 출력합니다.
./.hermes/plugins/ 아래의 프로젝트 로컬 플러그인은 기본적으로 비활성화되어 있습니다. Hermes를 시작하기 전에 신뢰할 수 있는 저장소에 대해서만 HERMES_ENABLE_PROJECT_PLUGINS=true를 설정하여 활성화하세요.
플러그인이 할 수 있는 것
아래의 모든 ctx.* API는 플러그인의 register(ctx) 함수 안에서 사용할 수 있습니다.
| 능력 | 어떻게 |
|---|---|
| 도구 추가 | ctx.register_tool(name=..., toolset=..., schema=..., handler=...) |
| 후크 추가 | ctx.register_hook("post_tool_call", callback) |
| 슬래시 명령어 추가 | ctx.register_command(name, handler, description) — CLI 및 게이트웨이 세션에 /name 추가 |
| 명령어에서 도구 배포 | ctx.dispatch_tool(name, args) — 상위 에이전트 컨텍스트가 자동 연결된 등록된 도구를 호출합니다 |
| CLI 명령어 추가 | ctx.register_cli_command(name, help, setup_fn, handler_fn) — hermes <plugin> <subcommand>를 추가합니다 |
| 메시지 주입 | ctx.inject_message(content, role="user") — 메시지 삽입 참조 |
| 선박 데이터 파일 | Path(__file__).parent / "data" / "file.yaml" |
| 기술 번들 | ctx.register_skill(name, path) — plugin:skill라는 네임스페이스로, skill_view("plugin:skill")를 통해 로드됨 |
| 환경 변수에 대한 게이트 | requires_env: [API_KEY] in plugin.yaml — hermes plugins install 중에 프롬프트됨 |
| pip을 통해 배포 | [project.entry-points."hermes_agent.plugins"] |
| 게이트웨이 플랫폼(Discord, Telegram, IRC 등)을 등록하세요 | ctx.register_platform(name, label, adapter_factory, check_fn,...) — 플랫폼 어댑터 추가 참조 |
| 이미지 생성 백엔드를 등록하세요 | ctx.register_image_gen_provider(provider) — 이미지 생성 제공자 플러그인 참조 |
| 비디오 생성 백엔드 등록 | ctx.register_video_gen_provider(provider) — 비디오 생성 제공자 플러그인 참조 |
| 컨텍스트 압축 엔진 등록 | ctx.register_context_engine(engine) — 컨텍스트 엔진 플러그인 참조 |
| 메모리 백엔드 등록 | plugins/memory/<name>/__init__.py의 서브클래스 MemoryProvider — 메모리 제공자 플러그인 참조 (별도의 검색 시스템 사용) |
| 호스트가 소유한 LLM 호출 실행 | ctx.llm.complete(...) / ctx.llm.complete_structured(...) — 사용자의 활성 모델과 인증을 빌려 옵션 JSON 스키마 검증과 함께 일회성 완료를 수행합니다. 자세한 내용은 플러그인 LLM 액세스를 참조하세요. |
| 추론 백엔드(LLM 제공자)를 등록하세요 | register_provider(ProviderProfile(...)) in plugins/model-providers/<name>/__init__.py — 모델 제공자 플러그인 참조 (별도의 검색 시스템 사용) |
플러그인 검색
| 출처 | 경로 | 사용 사례 |
|---|---|---|
| 묶음으로 제공된 | <repo>/plugins/ | 헤르메스가 장착된 선박 — 내장 플러그인을 참조하세요 |
| 사용자 | ~/.hermes/plugins/ | 개인 플러그인 |
| 프로젝트 | .hermes/plugins/ | 프로젝트별 플러그인 (HERMES_ENABLE_PROJECT_PLUGINS=true 필요) |
| 파이프 | hermes_agent.plugins 진입점 | 배포된 패키지 |
| 아무 것도 | services.hermes-agent.extraPlugins / extraPythonPackages | NixOS 선언적 설치 — Nix 설정을 참조하세요 |
이후의 출처가 이름 충돌에 대해 이전 출처를 덮어쓰므로, 동일한 이름을 가진 사용자 플러그인은 번들된 플러그인을 대체합니다.
플러그인 하위 카테고리
각 소스 내에서 Hermes는 플러그인을 전문 검색 시스템으로 연결하는 하위 카테고리 디렉터리도 인식합니다:
| 하위 디렉토리 | 그것이 담고 있는 것 | 발견 시스템 |
|---|---|---|
plugins/ (루트) | 일반 플러그인 — 도구, 훅, 슬래시 명령어, CLI 명령어, 번들된 스킬 | PluginManager (종류: standalone 또는 backend) |
plugins/platforms/<name>/ | 게이트웨이 채널 어댑터 (ctx.register_platform()) | PluginManager (종류: platform, 한 단계 더 깊음) |
plugins/image_gen/<name>/ | 이미지 생성 백엔드 (ctx.register_image_gen_provider()) | PluginManager (종류: backend, 한 단계 더 깊음) |
plugins/memory/<name>/ | 메모리 제공자 (하위 클래스 MemoryProvider) | 자체 로더 in plugins/memory/__init__.py (종류: exclusive — 한 번에 하나만 활성화됨) |
plugins/context_engine/<name>/ | 문맥 압축 엔진 (ctx.register_context_engine()) | 자체 로더 in plugins/context_engine/__init__.py (한 번에 하나만 활성화 가능) |
plugins/model-providers/<name>/ | LLM 제공자 프로필 (register_provider(ProviderProfile(...))) | 자체 로더 in providers/__init__.py (첫 get_provider_profile() 호출 시 지연 스캔됨) |
사용자 플러그인은 ~/.hermes/plugins/model-providers/<name>/ 및 ~/.hermes/plugins/memory/<name>/에서 동일한 이름의 번들 플러그인을 덮어씌웁니다 — register_provider() / register_memory_provider()에서는 최종 작성자가 승리합니다. 디렉토리를 넣으면, 저장소를 수정하지 않고도 내장된 것을 대체합니다.
플러그인은 선택적입니다(일부 예외를 제외하고)
일반 플러그인 및 사용자가 설치한 백엔드는 기본적으로 비활성화되어 있습니다 — 검색에서는 이를 찾을 수 있습니다(그래서 hermes plugins 및 /plugins에 표시되지만), 플러그인의 이름을 plugins.enabled에 ~/.hermes/config.yaml에서 추가할 때까지 훅이나 도구가 로드되지 않습니다. 이는 사용자의 명시적인 동의 없이는 서드파티 코드가 실행되지 않도록 합니다.
plugins:
enabled:
- my-tool-plugin
- disk-cleanup
disabled: # optional deny-list — always wins if a name appears in both
- noisy-plugin
상태를 전환하는 세 가지 방법:
hermes plugins # interactive toggle (space to check/uncheck)
hermes plugins enable <name> # add to allow-list
hermes plugins disable <name> # remove from allow-list + add to disabled
``hermes plugins install owner/repo` 후에, `Enable 'name' now? [y/N]`가 요청됩니다 — 기본값은 아니오입니다. 스크립트 설치에서는 `--enable` 또는 `--no-enable`로 프롬프트를 건너뜁니다.
### 허용 목록이 제한하지 않는 것 \{#what-the-allow-list-does-not-gate}
여러 가지 플러그인 우회 `plugins.enabled` — 이들은 Hermes의 내장 인터페이스의 일부이며 기본적으로 차단되면 기본 기능이 손상될 수 있습니다:
| 플러그인 종류 | 대신 어떻게 활성화되는지 |
|---|---|
| **번들 플랫폼 플러그인** (`plugins/platforms/` 아래의 IRC, Teams 등) | 자동으로 로드되므로 배송된 모든 게이트웨이 채널을 사용할 수 있습니다. 실제 채널은 `config.yaml`의 `gateway.platforms.<name>.enabled`을 통해 켜집니다. |
| **번들 백엔드** (`plugins/image_gen/` 등 아래의 이미지 생성 제공자) | 자동으로 로드되어 기본 백엔드가 '그냥 작동'합니다. 선택은 `<category>.provider`에서 `config.yaml`을 통해 이루어집니다(예: `image_gen.provider: openai`). |
| **메모리 제공자** (`plugins/memory/`) | 모두 발견됨; 정확히 하나가 활성 상태이며, `config.yaml`에서 `memory.provider`에 의해 선택됨. |
| **컨텍스트 엔진** (`plugins/context_engine/`) | 모두 발견됨; 하나는 활성 상태이며, `config.yaml`에서 `context.engine`에 의해 선택됨. |
| **모델 제공자** (`plugins/model-providers/`) | `plugins/model-providers/` 아래의 모든 번들 제공자는 첫 번째 `get_provider_profile()` 호출 시 검색되고 등록됩니다. 사용자는 `--provider` 또는 `config.yaml`를 통해 한 번에 하나씩 선택합니다. |
| **Pip로 설치된 `backend` 플러그인** | 일반 플러그인과 동일하게 `plugins.enabled`를 통해 옵트인하세요. |
| **사용자 설치 플랫폼** (`~/.hermes/plugins/platforms/` 아래) | `plugins.enabled`을 통해 옵트인 — 제3자 게이트웨이 어댑터는 명시적인 동의를 필요로 합니다. |
요약하면: **번들된 '항상 작동하는' 인프라는 자동으로 로드되며, 서드파티 일반 플러그인은 선택적입니다.** `plugins.enabled` 허용 목록은 사용자가 `~/.hermes/plugins/`에 넣은 임의 코드에 대한 게이트입니다.
### 기존 사용자를 위한 마이그레이션 \{#migration-for-existing-users}
Hermes를 옵트인 플러그인(config schema v21 이상) 버전으로 업그레이드하면, 이미 `~/.hermes/plugins/`에 설치되어 있지만 `plugins.disabled`에는 없던 사용자 플러그인은 **자동으로 `plugins.enabled`로 이전**됩니다. 기존 설정은 계속 작동합니다. 번들로 제공되는 독립 실행형 플러그인은 이전되지 않습니다 — 기존 사용자도 명시적으로 옵트인해야 합니다. (번들로 제공되는 플랫폼/백엔드 플러그인은 게이트가 걸린 적이 없기 때문에 이전이 필요하지 않았습니다.)
## 사용 가능한 후크 \{#available-hooks}
플러그인은 이러한 라이프사이클 이벤트에 대한 콜백을 등록할 수 있습니다. 전체 세부 사항, 콜백 시그니처 및 예제는 **[이벤트 훅 페이지](/docs/user-guide/features/hooks#plugin-hooks)**를 참조하세요.
| 갈고리 | 발사할 때 |
|------|-----------|
| [`pre_tool_call`](/docs/user-guide/features/hooks#pre_tool_call) | 어떤 도구가 실행되기 전에 |
| [`post_tool_call`](/docs/user-guide/features/hooks#post_tool_call) | 어떤 도구가 반환된 후 |
| [`pre_llm_call`](/docs/user-guide/features/hooks#pre_llm_call) | 한 턴에 한 번, LLM 루프 전에 — `{"context": "..."}`를 [사용자 메시지에 컨텍스트 주입](/docs/user-guide/features/hooks#pre_llm_call)할 수 있습니다. |
| [`post_llm_call`](/docs/user-guide/features/hooks#post_llm_call) | 턴마다 한 번, LLM 루프 이후에 (성공한 턴에만) |
| [`on_session_start`](/docs/user-guide/features/hooks#on_session_start) | 새 세션이 생성되었습니다 (첫 번째 턴만) |
| [`on_session_end`](/docs/user-guide/features/hooks#on_session_end) | 모든 `run_conversation` 호출 종료 + CLI 종료 처리기 |
| [`on_session_finalize`](/docs/user-guide/features/hooks#on_session_finalize) | CLI/게이트웨이가 활성 세션을 종료합니다 (`/new`, GC, CLI 종료) |
| [`on_session_reset`](/docs/user-guide/features/hooks#on_session_reset) | 게이트웨이는 새로운 세션 키로 교체합니다 (`/new`, `/reset`, `/clear`, 유휴 회전) |
| [`subagent_stop`](/docs/user-guide/features/hooks#subagent_stop) | `delegate_task`가 끝난 후 각 어린이마다 한 번 |
| [`pre_gateway_dispatch`](/docs/user-guide/features/hooks#pre_gateway_dispatch) | 게이트웨이가 인증 및 디스패치 이전에 사용자 메시지를 받았습니다. `{"action": "skip"}`를 반환합니다.| "다시 쓰기" \"| "흐름에 영향을 주기 위해 'allow',...`를 사용합니다. |
## 플러그인 유형 \{#plugin-types}
Hermes에는 네 가지 종류의 플러그인이 있습니다:
| 타입 | 그것이 하는 일 | 선택 | 위치 |
|------|-------------|-----------|----------|
| **일반 플러그인** | 도구, 훅, 슬래시 명령어, CLI 명령어 추가 | 다중 선택 (사용/사용 안 함) | `~/.hermes/plugins/` |
| **메모리 제공자** | 내장 메모리를 교체하거나 보충하세요 | 단일 선택(하나 활성) | `plugins/memory/` |
| **컨텍스트 엔진** | 내장 컨텍스트 압축기를 교체하세요 | 단일 선택(하나 활성) | `plugins/context_engine/` |
| **모델 제공자** | 추론 백엔드(OpenRouter, Anthropic 등)를 선언하십시오 | 다중 레지스터, `--provider` / `config.yaml`에 의해 선택됨 | `plugins/model-providers/` |
메모리 제공자와 컨텍스트 엔진은 **제공자 플러그인**입니다 — 각 유형은 한 번에 하나만 활성화될 수 있습니다. 모델 제공자도 플러그인이지만 여러 개가 동시에 로드될 수 있으며, 사용자는 `--provider` 또는 `config.yaml`을 통해 한 번에 하나씩 선택합니다. 일반 플러그인은 어떤 조합으로든 활성화할 수 있습니다.
## 플러그형 인터페이스 — 각 경우 어디로 가야 하는가 \{#pluggable-interfaces--where-to-go-for-each}
위의 표는 네 가지 플러그인 카테고리를 보여주지만, "일반 플러그인" 내에서 `PluginContext`는 여러 개의 개별 확장 포인트를 제공합니다 — 그리고 Hermes는 Python 플러그인 시스템 외부의 확장도 허용합니다(구성 기반 백엔드, 셸 연결 명령, 외부 서버 등). 만들고자 하는 것에 맞는 문서를 찾기 위해 이 표를 사용하세요:
| 추가하고 싶어요… | 어떻게 | 저작 가이드 |
|---|---|---|
| LLM이 호출할 수 있는 **도구** | 파이썬 플러그인 — `ctx.register_tool()` | [Hermes 플러그인 만들기](/docs/guides/build-a-hermes-plugin) · [도구 추가하기](/docs/developer-guide/adding-tools) |
| **라이프사이클 훅** (사전/사후 LLM, 세션 시작/종료, 도구 필터) | 파이썬 플러그인 — `ctx.register_hook()` | [Hooks 참조](/docs/user-guide/features/hooks) · [Hermes 플러그인 만들기](/docs/guides/build-a-hermes-plugin) |
| CLI / 게이트웨이를 위한 **슬래시 명령어** | 파이썬 플러그인 — `ctx.register_command()` | [Hermes 플러그인 만들기](/docs/guides/build-a-hermes-plugin) · [CLI 확장하기](/docs/developer-guide/extending-the-cli) |
| `hermes <thing>`의 **하위 명령어** | 파이썬 플러그인 — `ctx.register_cli_command()` | [CLI 확장하기](/docs/developer-guide/extending-the-cli) |
| 플러그인이 제공하는 번들 **스킬** | 파이썬 플러그인 — `ctx.register_skill()` | [스킬 만들기](/docs/developer-guide/creating-skills) |
| **추론 백엔드** (LLM 제공자: OpenAI-호환, Codex, Anthropic-Messages, Bedrock) | 프로바이더 플러그인 — `register_provider(ProviderProfile(...))` in `plugins/model-providers/<name>/` | **[모델 제공자 플러그인](/docs/developer-guide/model-provider-plugin)** · [제공자 추가](/docs/developer-guide/adding-providers) |
| 게이트웨이 채널(Discord / Telegram / IRC / Teams 등) | 플랫폼 플러그인 — `ctx.register_platform()` in `plugins/platforms/<name>/` | [플랫폼 어댑터 추가하기](/docs/developer-guide/adding-platform-adapters) |
| **메모리 백엔드** (Honcho, Mem0, Supermemory, …) | 메모리 플러그인 — `plugins/memory/<name>/`의 하위 클래스 `MemoryProvider` | [메모리 제공자 플러그인](/docs/developer-guide/memory-provider-plugin) |
| **문맥 압축 전략** | 컨텍스트 엔진 플러그인 — `ctx.register_context_engine()` | [컨텍스트 엔진 플러그인](/docs/developer-guide/context-engine-plugin) |
| **이미지 생성 백엔드** (DALL·E, SDXL, …) | 백엔드 플러그인 — `ctx.register_image_gen_provider()` | [이미지 생성 제공자 플러그인](/docs/developer-guide/image-gen-provider-plugin) |
| **비디오 생성 백엔드** (Veo, Kling, Pixverse, Grok-Imagine, Runway, …) | 백엔드 플러그인 — `ctx.register_video_gen_provider()` | [비디오 생성 제공자 플러그인](/docs/developer-guide/video-gen-provider-plugin) |
| **TTS 백엔드** (모든 CLI — Piper, VoxCPM, Kokoro, xtts, 음성 복제 스크립트, …) | 구성 기반 — `config.yaml`에서 `type: command`와 함께 `tts.providers.<name>` 아래에 선언 | [TTS 설정](/docs/user-guide/features/tts#custom-command-providers) |
| STT 백엔드(커스텀 위스퍼 바이너리, 로컬 ASR CLI) | 구성 기반 — `HERMES_LOCAL_STT_COMMAND` 환경 변수를 셸 템플릿으로 설정 | [음성 메시지 전사(STT)](/docs/user-guide/features/tts#voice-message-transcription-stt) |
| **MCP를 통한 외부 도구** (파일 시스템, GitHub, Linear, Notion, 모든 MCP 서버) | 구성 기반 — `config.yaml`에서 `command:` / `url:`로 `mcp_servers.<name>`를 선언합니다. Hermes는 서버의 도구를 자동으로 검색하고 내장 도구와 함께 등록합니다. | [MCP](/docs/user-guide/features/mcp) |
| **추가 스킬 소스** (커스텀 GitHub 저장소, 개인 스킬 인덱스) | CLI — `hermes skills tap add <repo>` | [스킬 허브](/docs/user-guide/features/skills#skills-hub) · [맞춤 탭 게시](/docs/user-guide/features/skills#publishing-a-custom-skill-tap) |
| **게이트웨이 이벤트 훅** (`gateway:startup`, `session:start`, `agent:end`, `command:*`에서 실행) | `HOOK.yaml` + `handler.py`을 `~/.hermes/hooks/<name>/`에 넣으세요 | [이벤트 훅](/docs/user-guide/features/hooks#gateway-event-hooks) |
| **셸 훅** (이벤트 시 셸 명령 실행 — 알림, 감사 로그, 데스크톱 알림) | 구성 기반 — `config.yaml` 안의 `hooks:` 아래에 선언 | [셸 후크](/docs/user-guide/features/hooks#shell-hooks) |
:::note
모든 것이 Python 플러그인은 아닙니다. 일부 확장 기능은 **구성 기반 셸 명령**(TTS, STT, 셸 훅)을 의도적으로 사용하여 이미 가지고 있는 CLI가 Python을 작성하지 않고도 플러그인이 되도록 합니다. 다른 것들은 에이전트가 연결하고 도구를 자동으로 등록하는 **외부 서버**(MCP)입니다. 그리고 일부는 자체 매니페스트 형식을 가진 **드롭인 디렉터리**(게이트웨이 훅)입니다. 사용 사례에 맞는 통합 스타일에 적합한 surface를 선택하세요; 위 표의 작성 가이드 각각은 플레이스홀더, 탐색 및 예제를 다룹니다.
:::
## NixOS 선언적 플러그인 \{#nixos-declarative-plugins}
NixOS에서는 플러그인을 모듈 옵션을 통해 선언적으로 설치할 수 있습니다 — `hermes plugins install`가 필요하지 않습니다. 자세한 내용은 **[Nix 설정 가이드](/docs/getting-started/nix-setup#plugins)**를 참조하세요.
```nix
services.hermes-agent = {
# Directory plugin (source tree with plugin.yaml)
extraPlugins = [ (pkgs.fetchFromGitHub {... }) ];
# Entry-point plugin (pip package)
extraPythonPackages = [ (pkgs.python312Packages.buildPythonPackage {... }) ];
# Enable in config
settings.plugins.enabled = [ "my-plugin" ];
};
선언적 플러그인은 nix-managed- 접두사로 심볼릭 링크됩니다 — 이들은 수동으로 설치된 플러그인과 공존하며 Nix 구성에서 제거될 때 자동으로 정리됩니다.
플러그인 관리
hermes plugins # unified interactive UI
hermes plugins list # table: enabled / disabled / not enabled
hermes plugins install user/repo # install from Git, then prompt Enable? [y/N]
hermes plugins install user/repo --enable # install AND enable (no prompt)
hermes plugins install user/repo --no-enable # install but leave disabled (no prompt)
hermes plugins update my-plugin # pull latest
hermes plugins remove my-plugin # uninstall
hermes plugins enable my-plugin # add to allow-list
hermes plugins disable my-plugin # remove from allow-list + add to disabled
인터랙티브 UI
인수 없이 hermes plugins를 실행하면 복합 대화형 화면이 열립니다:
Plugins
↑↓ navigate SPACE toggle ENTER configure/confirm ESC done
General Plugins
→ [✓] my-tool-plugin — Custom search tool
webhook-notifier — Event hooks
disk-cleanup — Auto-cleanup of ephemeral files [bundled]
Provider Plugins
Memory Provider ▸ honcho
컨텍스트 Engine ▸ compressor
- 일반 플러그인 섹션 — 체크박스, SPACE로 전환. 체크됨 =
plugins.enabled에 있음, 체크 해제됨 =plugins.disabled에 있음 (명시적 비활성). - 제공자 플러그인 섹션 — 현재 선택 항목을 보여줍니다. ENTER를 눌러 라디오 선택기 안으로 들어가 하나의 활성 제공자를 선택할 수 있습니다.
- 번들로 제공되는 플러그인은
[bundled]태그와 함께 동일한 목록에 표시됩니다.
제공자 플러그인 선택 사항이 config.yaml에 저장되었습니다:
memory:
provider: "honcho" # empty string = built-in only
컨텍스트:
engine: "compressor" # default built-in compressor
활성화 vs. 비활성화 vs. 해당 없음
플러그인은 세 가지 상태 중 하나를 차지합니다:
| 주 | 의미 | plugins.enabled에서? | plugins.disabled 안에? |
|---|---|---|---|
enabled | 다음 세션에 로드됨 | 예 | No |
disabled | 명시적으로 꺼짐 — enabled에도 있어도 로드되지 않음 | (무관한) | 예 |
not enabled | 발견되었지만 선택하지 않음 | No | No |
새로 설치되거나 번들로 제공되는 플러그인의 기본값은 not enabled입니다. hermes plugins list은 세 가지 서로 다른 상태를 모두 보여주므로 명시적으로 꺼진 것과 단순히 활성화를 기다리고 있는 것을 구분할 수 있습니다.
실행 세션에서 /plugins는 현재 로드된 플러그인을 표시합니다.
메시지 주입
플러그인은 ctx.inject_message()을 사용하여 활성 대화에 메시지를 삽입할 수 있습니다:
ctx.inject_message("New data arrived from the webhook", role="user")
서명: ctx.inject_message(content: str, role: str = "user") -> bool
작동 방식:
- 에이전트가 유휴 상태(사용자 입력을 기다리는 중)인 경우, 메시지는 다음 입력으로 대기열에 쌓이고 새 턴이 시작됩니다.
- 에이전트가 중간 실행(mid-turn) 상태일 경우(활성으로 실행 중일 때), 메시지는 현재 작업을 중단시킵니다 — 이는 사용자가 새 메시지를 입력하고 Enter를 누르는 것과 동일합니다.
- 비-
"user"역할의 경우, 콘텐츠는[role]로 접두사가 붙습니다 (예:[system]...). - 메시지가 성공적으로 큐에 추가되면
True를 반환하고, CLI 참조가 없는 경우(예: 게이트웨이 모드)False를 반환합니다.
이것은 원격 제어 뷰어, 메시지 브리지 또는 웹후크 수신기와 같은 플러그인이 외부 소스에서 대화로 메시지를 전달할 수 있도록 합니다.
inject_message는 CLI 모드에서만 사용할 수 있습니다. 게이트웨이 모드에서는 CLI 참조가 없으며 이 메서드는 False을 반환합니다.
핸들러 계약, 스키마 형식, 후크 동작, 오류 처리 및 일반적인 실수에 대해 **전체 가이드**를 참조하세요.