다양한 LLM을 활용한 도구 호출 에이전트

OpenAI 외 다양한 LLM으로 에이전트 구현

Anthropic, Google Gemini, Together.ai, Ollama, Mistral 등 다양한 LLM을 활용한 에이전트 구현을 다룬다.

AI
RAG
LangChain
저자

Kwangmin Kim

공개

2025년 07월 18일

1 다양한 LLM을 활용한 도구 호출 에이전트

  • OpenAI 외에도 Anthropic, Google Gemini, Together.ai, Ollama, Mistral과 같은 더 광범위한 공급자 구현을 지원한다.
  • 다양한 LLM 을 사용하여 도구 호출 에이전트를 생성하고 실행하는 방법을 살펴본다.

참고 링크

# API 키를 환경변수로 관리하기 위한 설정 파일
from dotenv import load_dotenv

# API 키 정보 로드
load_dotenv()
True
# LangSmith 추적을 설정한다. https://smith.langchain.com
# !pip install -qU langchain-teddynote
from langchain_teddynote import logging

# 프로젝트 이름을 입력한다.
logging.langsmith("CH15-Agents")
LangSmith 추적을 시작합니다.
[프로젝트명]
CH15-Agents
from langchain.tools import tool
from typing import List, Dict
from langchain_teddynote.tools import GoogleNews


# 도구 정의
@tool
def search_news(query: str) -> List[Dict[str, str]]:
    """Search Google News by input keyword"""
    news_tool = GoogleNews()
    return news_tool.search_by_keyword(query, k=5)


print(f"도구 이름: {search_news.name}")
print(f"도구 설명: {search_news.description}")
도구 이름: search_news
도구 설명: Search Google News by input keyword
# tools 정의
tools = [search_news]

2 Agent 용 프롬프트 생성

  • chat_history : 이전 대화 내용을 저장하는 변수 (멀티턴을 지원하지 않는다면, 생략 가능하다.)
  • agent_scratchpad : 에이전트가 임시로 저장하는 변수
  • input : 사용자의 입력
from langchain_core.prompts import ChatPromptTemplate
from langchain.agents import create_tool_calling_agent

# 프롬프트 생성
# 프롬프트는 에이전트에게 모델이 수행할 작업을 설명하는 텍스트를 제공한다. (도구의 이름과 역할을 입력)
prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. "
            "Make sure to use the `search_news` tool for searching keyword related news.",
        ),
        ("placeholder", "{chat_history}"),
        ("human", "{input}"),
        ("placeholder", "{agent_scratchpad}"),
    ]
)

3 Tool Calling 을 지원하는 다양한 LLM 목록

실습 진행을 위해서는 아래 내용을 설정해야 한다.

Anthropic

Gemini

Together AI

Ollama

langchain-ollama 설치를 한 뒤 진행한다.

# !pip install -qU langchain-ollama==0.1.3
from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
import os

# GPT-4o-mini
gpt = ChatOpenAI(model="gpt-4o-mini")

# Claude-3-5-sonnet
claude = ChatAnthropic(model="claude-3-5-sonnet-20240620", temperature=0)

# Gemini-1.5-pro-latest
gemini = ChatGoogleGenerativeAI(model="gemini-1.5-pro", temperature=0)

# Llama-3.1-70B-Instruct-Turbo
llama = ChatOpenAI(
    base_url="https://api.together.xyz/v1",
    api_key=os.environ["TOGETHER_API_KEY"],
    model="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
)

# Llama-3.1
ollama = ChatOllama(model="llama3.1", temperature=0)

# Qwen2.5 7B (한글 성능 괜찮은 편)
qwen = ChatOllama(
    model="qwen2.5:latest",
)

LLM 기반으로 Agent 를 생성한다.

from langchain.agents import create_tool_calling_agent

# Agent 생성
gpt_agent = create_tool_calling_agent(gpt, tools, prompt)
claude_agent = create_tool_calling_agent(claude, tools, prompt)
gemini_agent = create_tool_calling_agent(gemini, tools, prompt)
llama_agent = create_tool_calling_agent(llama, tools, prompt)
ollama_agent = create_tool_calling_agent(ollama, tools, prompt)
qwen_agent = create_tool_calling_agent(qwen, tools, prompt)

4 AgentExecutor 생성 후 실행 및 결과 확인

from langchain.agents import AgentExecutor

# gpt_agent 실행
agent_executor = AgentExecutor(
    agent=gpt_agent,
    tools=tools,
    verbose=True,
    handle_parsing_errors=True,
)

result = agent_executor.invoke({"input": "AI 투자와 관련된 뉴스를 검색해 주세요."})

print("Agent 실행 결과:")
print(result["output"])
Invoking: `search_news` with `{'query': 'AI 투자'}`

[{'url': 'https://news.google.com/rss/articles/CBMiTkFVX3lxTE5xUEdrNHZZclQ4RUNmNGpqZG1COUNfckVOZ2hqQTJ4NGkwa0NRU0Q1azRQNzMwTTBJVDloQmNKamRZc3dic0plQWtEUTNXUQ?oc=5', 'content': 'AI 투자 늘리는 통신사, 주파수 재할당 대가 마련 부담 - 전자신문'}, {'url': 'https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz?oc=5', 'content': '글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것" - 네이트 뉴스'}, {'url': 'https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c?oc=5', 'content': 'MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것" - AI타임스'}, {'url': 'https://news.google.com/rss/articles/CBMiWkFVX3lxTE5XeGtRRjRyeUFZZng4U2JWMmhZdFczSmR5d0YwbmF3cHpJVjRka2x4ZmRoVjdnaWdLOUdVSjNtN1FqeTBpTmRaUk9IZFFVamhGREZzQloxVmZ3UdIBVEFVX3lxTE9NVllVWHNUTTl1NWFXbHJPRHBEOVRiUTlCUmZtRHVZbXlMSl9MaFFsZUd0Yll0dUJNQk5UWjhfalNVV20tSjl3V01wcWtGSWl1Wk5KSg?oc=5', 'content': '아마존·MS가 수조원 투자…의료AI 메카 된 시애틀 - 한국경제'}, {'url': 'https://news.google.com/rss/articles/CBMiSEFVX3lxTE9DQnVxNFNuYnBzdDFObDRpM292VHlpcTZNZUtEOUJNVE5KWTROR210NEtfZUszUnp6eWJELUg3SkdQeE80TnhsNA?oc=5', 'content': '인공지능 기업 ‘마크비전’, 220억원 규모 시리즈A+ 투자 유치 - 플래텀'}]다음은 AI 투자와 관련된 최근 뉴스입니다:

1. [AI 투자 늘리는 통신사, 주파수 재할당 대가 마련 부담 - 전자신문](https://news.google.com/rss/articles/CBMiTkFVX3lxTE5xUEdrNHZZclQ4RUNmNGpqZG1COUNfckVOZ2hqQTJ4NGkwa0NRU0Q1azRQNzMwTTBJVDloQmNKamRZc3dic0plQWtEUTNXUQ?oc=5)

2. [글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것" - 네이트 뉴스](https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz?oc=5)

3. [MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것" - AI타임스](https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c?oc=5)

4. [아마존·MS가 수조원 투자…의료AI 메카 된 시애틀 - 한국경제](https://news.google.com/rss/articles/CBMiWkFVX3lxTE5XeGtRRjRyeUFZZng4U2JWMmhZdFczSmR5d0YwbmF3cHpJVjRka2x4ZmRoVjdnaWdLOUdVSjNtN1FqeTBpTmRaUk9IZFFVamhGREZzQloxVmZ3UdIBVEFVX3lxTE9NVllVWHNUTTl1NWFXbHJPRHBEOVRiUTlCUmZtRHVZbXlMSl9MaFFsZUd0Yll0dUJNQk5UWjhfalNVV20tSjl3V01wcWtGSWl1Wk5KSg?oc=5)

5. [인공지능 기업 ‘마크비전’, 220억원 규모 시리즈A+ 투자 유치 - 플래텀](https://news.google.com/rss/articles/CBMiSEFVX3lxTE9DQnVxNFNuYnBzdDFObDRpM292VHlpcTZNZUtEOUJNVE5KWTROR210NEtfZUszUnp6eWJELUg3SkdQeE80TnhsNA?oc=5)

각 링크를 클릭하시면 해당 뉴스 기사를 자세히 읽으실 수 있습니다.

Finished chain.
Agent 실행 결과:
다음은 AI 투자와 관련된 최근 뉴스입니다:

1. [AI 투자 늘리는 통신사, 주파수 재할당 대가 마련 부담 - 전자신문](https://news.google.com/rss/articles/CBMiTkFVX3lxTE5xUEdrNHZZclQ4RUNmNGpqZG1COUNfckVOZ2hqQTJ4NGkwa0NRU0Q1azRQNzMwTTBJVDloQmNKamRZc3dic0plQWtEUTNXUQ?oc=5)

2. [글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것" - 네이트 뉴스](https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz?oc=5)

3. [MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것" - AI타임스](https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c?oc=5)

4. [아마존·MS가 수조원 투자…의료AI 메카 된 시애틀 - 한국경제](https://news.google.com/rss/articles/CBMiWkFVX3lxTE5XeGtRRjRyeUFZZng4U2JWMmhZdFczSmR5d0YwbmF3cHpJVjRka2x4ZmRoVjdnaWdLOUdVSjNtN1FqeTBpTmRaUk9IZFFVamhGREZzQloxVmZ3UdIBVEFVX3lxTE9NVllVWHNUTTl1NWFXbHJPRHBEOVRiUTlCUmZtRHVZbXlMSl9MaFFsZUd0Yll0dUJNQk5UWjhfalNVV20tSjl3V01wcWtGSWl1Wk5KSg?oc=5)

5. [인공지능 기업 ‘마크비전’, 220억원 규모 시리즈A+ 투자 유치 - 플래텀](https://news.google.com/rss/articles/CBMiSEFVX3lxTE9DQnVxNFNuYnBzdDFObDRpM292VHlpcTZNZUtEOUJNVE5KWTROR210NEtfZUszUnp6eWJELUg3SkdQeE80TnhsNA?oc=5)

각 링크를 클릭하시면 해당 뉴스 기사를 자세히 읽으실 수 있습니다.

다양한 llm을 사용하여 에이전트를 실행한다.

다음은 입력받은 llm을 사용하여 Agent 를 생성하고 실행하여 결과를 출력하는 함수다.

def execute_agent(llm, tools, input_text, label):
    agent = create_tool_calling_agent(llm, tools, prompt)
    executor = AgentExecutor(agent=agent, tools=tools, verbose=False)
    result = executor.invoke({"input": input_text})
    print(f"[{label}] 결과입니다.")
    if isinstance(result["output"], list) and len(result["output"]) > 0:
        for item in result["output"]:
            if "text" in item:
                print(item["text"])
    elif isinstance(result["output"], str):
        print(result["output"])
    else:
        print(result["output"])

각 llm 별로 에이전트를 생성하고 실행하여 결과를 출력한다.

query = (
    "AI 투자와 관련된 뉴스를 검색하고, 결과를 Instagram 게시글 형식으로 작성한다."
)
# gpt
execute_agent(gpt, tools, query, "gpt")
[gpt] 결과입니다.
🌟 **AI 투자 소식!** 🌟

1️⃣ **통신사들의 AI 투자** 📡  
통신사들이 AI 투자를 늘리고 있습니다. 하지만 주파수 재할당에 따른 부담이 크다고 하는데요. 더 자세한 내용은 [여기에서 확인하세요](https://news.google.com/rss/articles/CBMiTkFVX3lxTE5xUEdrNHZZclQ4RUNmNGpqZG1COUNfckVOZ2hqQTJ4NGkwa0NRU0Q1azRQNzMwTTBJVDloQmNKamRZc3dic0plQWtEUTNXUQ)! 

2️⃣ **CEO들의 의견** 👔  
글로벌 CEO들이 "향후 3년간 무조건 AI에 투자할 것"이라고 발표했습니다. 직원도 더 뽑을 예정이라고 하네요! 자세한 내용은 [여기에서 확인하세요](https://news.google.com/rss/articles/CBMiU0FVX3lxTFB1VDRjTlIxeHRjV3NKaERHMFJLOFNpUlNUVnZzQ0JvOUpISVE2cW9rbTZPVU9lQXZuUURJNHF0aDZyaDdQM0F5NFhsc0NrN1dHNEZz)! 

3️⃣ **MIT 경제학자의 경고** ⚠️  
MIT의 경제학자가 "앞으로 10년간 AI에 영향을 받을 직업은 5% 불과하다"며 기업들이 투자비를 날릴 가능성이 있다고 경고했습니다. 더 알아보려면 [여기에서 확인하세요](https://news.google.com/rss/articles/CBMiakFVX3lxTE9BQUtjd3pDS1dXRkZQTlo4Y2w2d2laZFFQRXdsbGlCMFRTcWJYLTNLaksxbFlnYzk3clVnYlFxZF93U2xubXY1VVhBTDQ2SDhLbm9hcDdXQ3prTlJtV0VCYTFINmNRbjR5N3c)! 

4️⃣ **시애틀의 의료 AI 투자** 🏥  
아마존과 MS가 수조 원을 투자해 시애틀이 의료 AI의 메카로 떠오르고 있습니다. 자세한 내용은 [여기에서 확인하세요](https://news.google.com/rss/articles/CBMiWkFVX3lxTE5XeGtRRjRyeUFZZng4U2JWMmhZdFczSmR5d0YwbmF3cHpJVjRka2x4ZmRoVjdnaWdLOUdVSjNtN1FqeTBpTmRaUk9IZFFVamhGREZzQloxVmZ3UdIBVEFVX3lxTE9NVllVWHNUTTl1NWFXbHJPRHBEOVRiUTlCUmZtRHVZbXlMSl9MaFFsZUd0Yll0dUJNQk5UWjhfalNVV20tSjl3V01wcWtGSWl1Wk5KSg)! 

5️⃣ **AI 스타트업 투자 유치** 🚀  
인공지능 기업 ‘마크비전’이 220억원 규모의 시리즈 A+ 투자를 유치했습니다. 더 자세한 내용은 [여기에서 확인하세요](https://news.google.com/rss/articles/CBMiSEFVX3lxTE9DQnVxNFNuYnBzdDFObDRpM292VHlpcTZNZUtEOUJNVE5KWTROR210NEtfZUszUnp6eWJELUg3SkdQeE80TnhsNA)! 

👉 여러분의 생각은 어떤가요? AI 투자가 앞으로 어떻게 변화할지 기대되네요! 💡✨ #AI #투자 #뉴스 #기술 #미래
# claude
execute_agent(claude, tools, query, "claude")
[claude] 결과입니다.
[claude] 결과입니다.

검색 결과를 바탕으로 Instagram 게시글 형식으로 작성해 드리겠습니다.
---
📱 #AI투자 #테크트렌드 #미래기술

🔍 AI 투자 동향: 글로벌 기업들의 움직임

1. 통신사들의 AI 투자 확대 🚀
   - 주파수 재할당 대가 마련에 대한 부담 증가
   - 미래 경쟁력 확보를 위한 전략적 움직임

2. 중동 오일머니, 빅테크 연료로 변신 💰
   - AI 기업 투자 및 반도체 공장 건설에 집중
   - 글로벌 기술 산업 판도 변화 예고

3. 2023년 생성 AI 투자 붐 지속 📈
   - 6700억 원 이상 대규모 투자 라운드 8회 진행
   - AI 기술 발전과 시장 확대 기대

4. 의료 AI의 새로운 중심지, 시애틀 🏥
   - 아마존, 마이크로소프트 등 대기업의 수조 원 투자
   - 헬스케어와 AI의 융합, 미래 의료 혁신 주목

5. 글로벌 CEO들의 AI 투자 의지 💼
   - 64%의 CEO가 AI를 최우선 투자 분야로 선정
   - 기업 경쟁력 강화와 혁신을 위한 핵심 전략

💡 AI 기술은 이제 선택이 아닌 필수! 당신의 비즈니스는 AI 시대에 어떻게 대비하고 있나요? 댓글로 여러분의 생각을 공유해주세요! 👇

#AI혁명 #기술투자 #디지털전환 #4차산업혁명
---
이렇게 Instagram 게시글 형식으로 AI 투자 관련 뉴스를 정리해 보았습니다. 해시태그, 이모지, 그리고 간결하면서도 흥미로운 내용 구성으로 Instagram 사용자들의 관심을 끌 수 있도록 작성했습니다. 필요하시다면 내용을 수정하거나 추가 정보를 원하시는 부분이 있다면 말씀해 주세요.
# gemini
execute_agent(gemini, tools, query, "gemini")
[gemini] 결과입니다.
## 🔥 핫한 AI 투자 소식! 놓치지 마세요! 🔥

🤖 요즘 AI 투자가 뜨겁다는데, 무슨 일이 벌어지고 있는지 궁금하시죠? 🤔 

📰 주요 뉴스 헤드라인만 후다닥 살펴보세요!

* **AI 투자 늘리는 통신사, 주파수 재할당 대가 마련 부담** - 전자신문
* **글로벌 CEO들 "향후 3년 무조건 AI 투자···직원도 더 뽑을 것"** - 네이트 뉴스
* **MIT 경제학자 "10년간 AI에 영향받을 직업은 5% 불과...기업은 투자비만 날리게 될 것"** - AI타임스
* **아마존·MS가 수조원 투자…의료AI 메카 된 시애틀** - 한국경제
* **인공지능 기업 ‘마크비전’, 220억원 규모 시리즈A+ 투자 유치** - 플래텀

#AI #투자 #인공지능 #뉴스 #놓치지마세요 
# llama3.1 70B (Together.ai)
execute_agent(
    llama,
    tools,
    "Search AI related news and write it in Instagram post format",
    "llama3.1 70B",
)
[llama3.1 70B] 결과입니다.
Here's an Instagram post format for AI related news:

"Stay up-to-date with the latest AI news!

Meta's new AI-powered video generation tool, "MovieGen", has been released! 

The SK AI Summit is happening in Seoul, where experts and entrepreneurs will gather to discuss the future of AI and how to coexist with AGI.

A recent hurricane damage photo that went viral was actually created by AI!

Meta's AR technology is giving Apple a run for its money!

AI talent tech company, Glorand, has launched its AI diagnosis SaaS 'PSYT' in Japan.

Stay informed and join the conversation! #AI #ArtificialIntelligence #TechNews"

Sources:
- https://news.google.com/rss/articles/CBMiakFVX3lxTFB2MmRiRVZWWHlGNnhfTDFfRldrYllYSVBlNi1NRTBiN2xYMGc2NHhHY3JsUkF5dDR1aXdwRDBmZXI4QzUwNGQ0aU5NOG1ZUVQ1Y2MwQy1vS3dXTVQxbV9FanRqS1FDLW5RaGc?oc=5
- https://news.google.com/rss/articles/CBMiSEFVX3lxTE16M19mWXBHTnRPSlhCNkZzVmlSV0N1QjZKbXNlcHN5QWxVYVRUd3RaeTFSZkpleG40ZWRubWNTSzFaS0o1eGM4cQ?oc=5
- https://news.google.com/rss/articles/CBMiUkFVX3lxTE0yVFltQlZvRmVWajdYMnEzZ1RiSURGZVRXcGhXcEQxX2ZlZU1xRjFmUVR1b2wwN21jSEgwbTJKLWVaV05OeUlnMkNjZUF6N0oxTWc?oc=5
- https://news.google.com/rss/articles/CBMicEFVX3lxTFAxcFZmNkxjaXpqMy1fSjBlYUVSdTdmZGxWemdzVENuVEdBRGJOYWRtQmM5cUV4bUx4SWw3OF9OdUZYLW1Yb0hyQ3E2c05MVjRzaVpsQmRxVVFmTlJnZ2tjR00wOWVSNUVmcVFTUVlOVzU?oc=5
- https://news.google.com/rss/articles/CBMidkFVX3lxTE1qcVZOdzdEYkgxbUxzbWZlUUxRMjhTZFNJdUxab3VRWXdXQXZ5bUd1OG43WGE1QnRUbHJqNkxFSmtTRVpTamdYRDlNR3J4WjROcU1nRTdTTFFYX1FQOGFWMHAwUURxbHljYVZmTGFkVmRSNTFTc0HSAWZBVV95cUxPUFAxeHZabF9hWDlLZE9tS1V6SWFNSkJzYnl4SWJsa0h4d2NzMEdkUm1ROHNxU2xaa2h0VTZodHppU240R3V0MEtjaGJzRllTNF82bnJEQ1hCdHJUa25naEZUMEhzWHc?oc=5
# llama3.1 8B (ollama)
execute_agent(ollama, tools, query, "llama3.1(Ollama)")
[llama3.1(Ollama)] 결과입니다.
**AI 투자 뉴스**

* Bridgewise가 개발한 BRIDGET는 세계 최초의 대화형 AI 투자 도구로, 규제 준수한 투자 추천을 제공합니다.
* 미디훼일은 시리즈 B2 펀딩 15.8억 원을 확보하여 총 투자금액 30.5억 원을 넘어섰습니다.
* GAIIP는 대규모 AI 인프라 투자를 위한 글로벌 프로젝트를 시작했습니다.
* 플레이태그는 AI 행동 분석 산업에 도전장을 내걸었습니다.

**Instagram 게시글**

"AI 투자 뉴스!

Bridgewise의 BRIDGET, 세계 최초의 대화형 AI 투자 도구!
미디훼일, 시리즈 B2 펀딩 15.8억 원 확보!
GAIIP, 대규모 AI 인프라 투자 프로젝트 시작!
플레이태그, AI 행동 분석 산업에 도전장 내걸기!

#AInvestment #Bridgewise #BRIDGET #Mediwhale #GAIIP #Playtag"
# qwen2.5 7B (ollama)
query = "AI 투자와 관련된 뉴스를 검색하고, 결과를 Instagram 게시글 형식으로 작성한다. 한글로 답변한다!"

execute_agent(qwen, tools, query, "qwen2.5(Ollama)")

Subscribe

Enjoy this blog? Get notified of new posts by email: