使用AGNO构建一个简单的翻译命令行工具
最近在探索如何使用AI构建实用的命令行工具,我决定尝试构建一个简单的中英文翻译工具。嗯然后逛了几遍网站,选择了AGNO - 它提供了简洁的API来创建AI代理,并且支持流式输出。嗯主要还是有直接的工具使用哈哈哈,在这篇文章中,我将分享我的开发经验和关键代码片段。
项目概述
我的目标很简单:创建一个命令行工具,可以自动检测用户输入的是中文还是英文,然后翻译成另一种语言。我给这个工具起名为"Y-Translator CLI",它有以下特点:
- 中英文双向翻译
- 命令行交互界面
- 支持流式输出(即一边生成一边显示)
- 可配置的AI模型和API参数
使用AGNO框架
AGNO是一个轻量级框架,用于构建基于大语言模型的AI代理。它的核心理念是简化与LLM的交互,让开发者专注于业务逻辑而不是处理API细节。
首先,我们需要安装AGNO:
pip install agno
核心代码实现
代理类
首先,我创建了一个TranslatorAgent类来封装翻译功能:
from agno.agent import Agent
from agno.models.openai.like import OpenAILike
from .config import Config
class TranslatorAgent:
"""Translator AI Agent wrapper"""
def __init__(self, config: Config):
"""Initialize the agent with configuration"""
self.config = config
self.model = OpenAILike(
id=config.model,
base_url=config.api_base,
api_key=config.api_key,
)
self.agent = Agent(
instructions=[
"You are only a translator",
"You only translate user input to English, when user input is Chinese",
"You only translate user input to Chinese, when user input is English",
"You don't answer any questions",
"Please translate following user input"
],
model=self.model,
stream=True,
debug_mode=config.debug,
)
def process_query(self, query: str, stream: bool = True) -> None:
"""Process a single query and print the response"""
if not query.strip():
return
self.agent.print_response(query, stream=stream)
这段代码中有几个值得注意的点:
- 使用
OpenAILike类可以兼容OpenAI API和类似接口的其他模型提供商 - 通过简单的指令列表定义了代理的行为 - 这是AGNO最强大的特性之一
- 开启了流式输出,让用户体验更加流畅
print_response方法简化了交互过程,AGNO自动处理了请求和响应的细节
配置管理
为了方便用户配置,我创建了一个Config类:
import os
from dataclasses import dataclass
@dataclass
class Config:
"""Configuration settings for Y-Translator CLI"""
api_key: str = os.getenv("AI_API_KEY", "")
model: str = os.getenv("AI_MODEL", "gpt-4")
api_base: str = os.getenv("AI_API_BASE", "https://api.openai.com/v1")
debug: bool = False
@classmethod
def from_args(cls, args) -> 'Config':
"""Create config from command line arguments"""
return cls(
api_key=args.api_key or os.getenv("AI_API_KEY", ""),
model=args.model or os.getenv("AI_MODEL", "gpt-4"),
api_base=args.api_base or os.getenv("AI_API_BASE", "https://api.openai.com/v1"),
debug=args.verbose,
)
这个类允许配置从环境变量或命令行参数加载,提供了灵活的配置方式。
命令行界面
接下来,我实现了命令行界面:
import argparse
import sys
from prompt_toolkit import PromptSession
from prompt_toolkit.history import InMemoryHistory
from . import __version__
from .config import Config
from .agent import TranslatorAgent
def create_parser() -> argparse.ArgumentParser:
"""Create command line argument parser"""
parser = argparse.ArgumentParser(
description="Y-Translator CLI - AI-powered English-Chinese translator"
)
parser.add_argument(
"-v", "--version",
action="version",
version=f"Y-Translator CLI version {__version__}"
)
parser.add_argument(
"--verbose",
action="store_true",
help="Enable debug mode"
)
parser.add_argument(
"--model",
help="AI model to use (default: gpt-4)",
default=None
)
parser.add_argument(
"--api-key",
help="OpenAI API key",
default=None
)
parser.add_argument(
"--api-base",
help="Custom API base URL",
default=None
)
parser.add_argument(
"-n", "--no-stream",
action="store_true",
help="Disable streaming mode"
)
return parser
def run_interactive_session(agent: TranslatorAgent, stream: bool = True):
"""Run an interactive session with the agent"""
history = InMemoryHistory()
session = PromptSession(history=history)
print("\n" + "="*60)
print(f"🚀 \033[1;36mY-Translator CLI v{__version__}\033[0m - \033[1mAI-powered Translator\033[0m")
print("="*60)
print("\033[1;32m✓\033[0m English to Chinese translation")
print("\033[1;32m✓\033[0m Chinese to English translation")
print("\033[1;32m✓\033[0m Type 'exit' or press Ctrl+C to quit")
print("")
print("\033[1;33mType your text to translate and press Enter:\033[0m")
while True:
try:
query = session.prompt('>>> ')
if query.lower() in ("exit", "quit", "退出"):
print("\n\033[1;32mGoodbye! Have a great day!\033[0m")
break
agent.process_query(query, stream=stream)
except KeyboardInterrupt:
print("\n\033[1;32mExiting...\033[0m")
break
except Exception as e:
print(f"\033[1;31mError: {e}\033[0m")
我使用了prompt_toolkit库来增强用户体验,它提供了命令历史记录和更友好的输入界面。交互循环非常简单:获取用户输入,处理特殊命令(如退出),然后将查询传递给翻译代理。
入口函数
最后,我们需要一个主函数来启动应用:
def main():
"""Main entry point for Y-Translator CLI"""
parser = create_parser()
args = parser.parse_args()
try:
config = Config.from_args(args)
agent = TranslatorAgent(config)
run_interactive_session(agent, stream=not args.no_stream)
except KeyboardInterrupt:
print("\n\033[1;32mExiting...\033[0m")
sys.exit(0)
except Exception as e:
print(f"\033[1;31mError: {e}\033[0m", file=sys.stderr)
if args.verbose:
raise
sys.exit(1)
if __name__ == "__main__":
main()
打包与分发
为了方便安装和使用,我将工具打包为Python包:
from setuptools import setup, find_packages
from translator import __version__
setup(
name="y-translator-cli",
version=__version__,
author="Yang",
description="An AI-powered English-Chinese translator for the command line",
packages=find_packages(),
python_requires=">=3.8",
install_requires=[
"prompt_toolkit>=3.0.0",
"agno>=0.1.0",
"python-dotenv>=0.19.0",
],
entry_points={
"console_scripts": [
"trans=translator.cli:main",
],
},
)
关键点是entry_points配置,它创建了一个名为trans的命令行工具,指向我们的main函数。
使用体验
安装后,用户可以直接在命令行中使用这个工具:
# 启动翻译器
trans
# 使用特定模型
trans --model gpt-3.5-turbo
# 启用调试模式
trans --verbose
交互界面非常简洁,用户只需输入要翻译的文本,按Enter键即可。程序会自动检测语言并翻译。
AGNO的优势
通过这个项目,我体会到AGNO的几个显著优势:
- 简洁的API:只需几行代码就能创建一个AI代理
- 强大的指令系统:通过简单的指令列表定义代理行为
- 内置流式输出:提供更好的用户体验
- 模型兼容性:支持各种OpenAI兼容的API
结论
AGNO让构建AI驱动的命令行工具变得异常简单。在这个项目中,我们只用了不到100行代码就创建了一个功能完整的翻译工具。对于初学者来说,这是一个很好的入门项目,可以快速感受AI应用开发的乐趣。
如果你想尝试使用这个工具,可以通过pip安装:
pip install y-translator-cli
或者查看源代码获取更多信息。希望这篇文章对你有所帮助! github.com/Yangeyu/tra…
你有什么想法或问题吗?欢迎在评论区分享,或者提出功能建议。我正在考虑增加对更多语言的支持,以及改进翻译质量的方法。