Hermes를 Python 라이브러리로 사용
Hermes는 단순한 CLI 도구가 아닙니다. AIAgent을 직접 가져와서 Python 스크립트, 웹 애플리케이션 또는 자동화 파이프라인에서 프로그래밍 방식으로 사용할 수 있습니다. 이 가이드에서는 방법을 보여줍니다.
설치
저장소에서 Hermes를 직접 설치하세요.
pip install git+https://github.com/NousResearch/hermes-agent.git
또는 uv를 사용하면 다음과 같습니다.
uv pip install git+https://github.com/NousResearch/hermes-agent.git
``requirements.txt`에 고정할 수도 있습니다.
```text
hermes-agent @ git+https://github.com/NousResearch/hermes-agent.git
Hermes를 라이브러리로 사용할 때는 CLI에서 사용하는 것과 동일한 환경 변수가 필요합니다. 최소한 OPENROUTER_API_KEY(또는 직접 공급자 액세스를 사용하는 경우 OPENAI_API_KEY / ANTHROPIC_API_KEY)을 설정하세요.
기본 사용법
Hermes를 사용하는 가장 간단한 방법은 chat() 메서드입니다. 메시지를 전달하고 문자열을 다시 가져옵니다.
from run_agent import AIAgent
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
response = agent.chat("What is the capital of France?")
print(response)
``chat()`은 도구 호출, 재시도 등 모든 대화 루프를 내부적으로 처리하고 최종 텍스트 응답만 반환합니다.
:::warning
자신의 코드에 Hermes를 삽입할 때는 항상 `quiet_mode=True`을 설정하세요. 이것이 없으면 에이전트는 애플리케이션 출력을 복잡하게 만드는 CLI 스피너, 진행률 표시기 및 기타 터미널 출력을 인쇄합니다.
:::
---
## 완전한 대화 제어 \{#basic-usage}
대화를 더 효과적으로 제어하려면 `run_conversation()`을 직접 사용하세요. 전체 응답, 메시지 기록 및 메타데이터가 포함된 사전을 반환합니다.
```python
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
result = agent.run_conversation(
user_message="Search for recent Python 3.13 features",
task_id="my-task-1",
)
print(result["final_response"])
print(f"Messages exchanged: {len(result['messages'])}")
반환된 사전에는 다음이 포함됩니다.
final_response— 에이전트의 최종 문자 응답messages— 전체 메시지 기록(시스템, 사용자, 보조자, 도구 호출)
(전달한 task_id은 VM 격리를 위해 에이전트 인스턴스에 저장되지만 반환 사전에는 다시 에코되지 않습니다.)
해당 호출에 대한 임시 시스템 프롬프트를 재정의하는 사용자 지정 시스템 메시지를 전달할 수도 있습니다.
result = agent.run_conversation(
user_message="Explain quicksort",
system_message="You are a computer science tutor. Use simple analogies.",
)
도구 구성
enabled_toolsets 또는 disabled_toolsets을 사용하여 에이전트가 액세스할 수 있는 도구 세트를 제어합니다.
# Only enable web tools (browsing, search)
agent = AIAgent(
model="anthropic/claude-sonnet-4",
enabled_toolsets=["web"],
quiet_mode=True,
)
# Enable everything except terminal access
agent = AIAgent(
model="anthropic/claude-sonnet-4",
disabled_toolsets=["terminal"],
quiet_mode=True,
)
최소한의 잠긴 에이전트를 원할 때(예: 연구 봇에 대한 웹 검색만) enabled_toolsets을 사용하세요. 대부분의 기능을 원하지만 특정 기능을 제한해야 하는 경우(예: 공유 환경에서 터미널 액세스 없음) disabled_toolsets을 사용하세요.
여러 차례 대화
메시지 기록을 다시 전달하여 여러 차례에 걸쳐 대화 상태를 유지합니다.
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
)
# First turn
result1 = agent.run_conversation("My name is Alice")
history = result1["messages"]
# Second turn — agent remembers the context
result2 = agent.run_conversation(
"What's my name?",
conversation_history=history,
)
print(result2["final_response"]) # "Your name is Alice."
``conversation_history` 매개변수는 이전 결과의 `messages` 목록을 허용합니다. 에이전트는 이를 내부적으로 복사하므로 원본 목록이 변경되지 않습니다.
---
## 궤적 저장 \{#saving-trajectories}
ShareGPT 형식으로 대화를 캡처하려면 궤적 저장을 활성화하세요. 훈련 데이터 생성이나 디버깅에 유용합니다.
```python
agent = AIAgent(
model="anthropic/claude-sonnet-4",
save_trajectories=True,
quiet_mode=True,
)
agent.chat("Write a Python function to sort a list")
# Saves to trajectory_samples.jsonl in ShareGPT format
각 대화는 단일 JSONL 줄로 추가되므로 자동화된 실행에서 데이터 세트를 쉽게 수집할 수 있습니다.
사용자 정의 시스템 프롬프트
ephemeral_system_prompt을 사용하여 에이전트의 동작을 안내하지만 궤적 파일에 저장되지 않는 사용자 지정 시스템 프롬프트를 설정합니다(훈련 데이터를 깨끗하게 유지).
agent = AIAgent(
model="anthropic/claude-sonnet-4",
ephemeral_system_prompt="You are a SQL expert. Only answer database questions.",
quiet_mode=True,
)
response = agent.chat("How do I write a JOIN query?")
print(response)
이는 모두 동일한 기본 도구를 사용하여 코드 검토자, 문서 작성자, SQL 도우미 등 전문 에이전트를 구축하는 데 이상적입니다.
일괄 처리
많은 프롬프트를 병렬로 실행하기 위해 Hermes에는 batch_runner.py이 포함되어 있습니다. 적절한 리소스 격리를 통해 동시 AIAgent 인스턴스를 관리합니다.
python batch_runner.py --input prompts.jsonl --output results.jsonl
각 프롬프트는 자체 task_id 및 격리된 환경을 갖습니다. 사용자 정의 배치 로직이 필요한 경우 AIAgent을 직접 사용하여 직접 구축할 수 있습니다.
import concurrent.futures
from run_agent import AIAgent
prompts = [
"Explain recursion",
"What is a hash table?",
"How does garbage collection work?",
]
def process_prompt(prompt):
# Create a fresh agent per task for thread safety
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_memory=True,
)
return agent.chat(prompt)
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
results = list(executor.map(process_prompt, prompts))
for prompt, result in zip(prompts, results):
print(f"Q: {prompt}\nA: {result}\n")
항상 스레드 또는 작업별로 새 AIAgent 인스턴스를 생성하세요. 에이전트는 공유하기에 스레드로부터 안전하지 않은 내부 상태(대화 기록, 도구 세션, 반복 카운터)를 유지합니다.
통합 예
FastAPI 엔드포인트
from fastapi import FastAPI
from pydantic import BaseModel
from run_agent import AIAgent
app = FastAPI()
class ChatRequest(BaseModel):
message: str
model: str = "anthropic/claude-sonnet-4"
@app.post("/chat")
async def chat(request: ChatRequest):
agent = AIAgent(
model=request.model,
quiet_mode=True,
skip_컨텍스트_files=True,
skip_memory=True,
)
response = agent.chat(request.message)
return {"response": response}
디스코드 봇
import discord
from run_agent import AIAgent
client = discord.Client(intents=discord.Intents.default())
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.startswith("!hermes "):
query = message.content[8:]
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_컨텍스트_files=True,
skip_memory=True,
platform="discord",
)
response = agent.chat(query)
await message.channel.send(response[:2000])
client.run("YOUR_DISCORD_TOKEN")
CI/CD 파이프라인 단계
#!/usr/bin/env python3
"""CI step: auto-review a PR diff."""
import subprocess
from run_agent import AIAgent
diff = subprocess.check_output(["git", "diff", "main...HEAD"]).decode()
agent = AIAgent(
model="anthropic/claude-sonnet-4",
quiet_mode=True,
skip_컨텍스트_files=True,
skip_memory=True,
disabled_toolsets=["terminal", "browser"],
)
review = agent.chat(
f"Review this PR diff for bugs, security issues, and style problems:\n\n{diff}"
)
print(review)
주요 생성자 매개변수
| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
model | str | "anthropic/claude-opus-4.6" | OpenRouter 형식의 모델 |
quiet_mode | bool | False | CLI 출력 억제 |
enabled_toolsets | List[str] | None | 화이트리스트 특정 도구 세트 |
disabled_toolsets | List[str] | None | 블랙리스트 관련 도구 세트 |
save_trajectories | bool | False | 대화를 JSONL에 저장 |
ephemeral_system_prompt | str | None | 사용자 정의 시스템 프롬프트(궤적에 저장되지 않음) |
max_iterations | int | 90 | 대화당 최대 도구 호출 반복 |
skip_context_files | bool | False | AGENTS.md 파일 로드 건너뛰기 |
skip_memory | bool | False | 영구 메모리 읽기/쓰기 비활성화 |
api_key | str | None | API 키(env var로 대체) |
base_url | str | None | 사용자 정의 API 엔드포인트 URL |
platform | str | None | 플랫폼 힌트("discord", "telegram" 등) |
중요 사항
- 작업 디렉터리의
AGENTS.md파일을 시스템 프롬프트에 로드하지 않으려면 **skip_context_files=True**을 설정하세요. - 에이전트가 영구 메모리를 읽거나 쓰지 못하도록 **
skip_memory=True**을 설정합니다. 상태 비저장 API 엔드포인트에 권장됩니다. platform매개변수(예:"discord","telegram")는 에이전트가 출력 스타일을 조정할 수 있도록 플랫폼별 형식 지정 힌트를 삽입합니다.
- 스레드 안전성: 스레드 또는 작업당 하나의
AIAgent을 만듭니다. 동시 호출 간에 인스턴스를 공유하지 마십시오. - 리소스 정리: 에이전트는 대화가 끝나면 자동으로 리소스(터미널 세션, 브라우저 인스턴스)를 정리합니다. 장기 프로세스에서 실행 중인 경우 각 대화가 정상적으로 완료되는지 확인하세요.
- 반복 제한: 기본값
max_iterations=90은 넉넉합니다. 간단한 Q&A 사용 사례의 경우 도구 호출 루프 폭주를 방지하고 비용을 제어하려면 이를 낮추는 것이 좋습니다(예:max_iterations=10).