1. AI大模型介绍
1.1 岗位
- 大模型工程化工程师
- 大模型应用开发工程师
- 大模型基座开发工程师
- 数据开发工程师
- 大模型运维、Infra工程师
1.2 Python大模型框架
- LangChain
- 最早最成熟,适合复杂任务分解和单智能体应用
- LlamaIndex
- 专注于高效的索引和检索,适合RAG场景(不是Meta开发的)
- Autogen0.4 --- 可兼容以下LLM
- Crewai
- Pydanticai
- LLmaindex
- Langchain
- Langgraph
- 能力可以解决以下问题
- 如何稳定输出
- 无法连接互联网
- 数据过时
- 没法查询数据库
- 不能调用第三方API
- 无法使用外部工具
- 如何接入私有数据
1.3 Autogen 0.5.7
- Studio -- 图形化界面的低代码平台 -- 原型
- pip install -U autogenstudio
- autogenstudio ui --port 8080 --appdir ./myapp
- AgentChat -- 智能体组件:开发重心
- Core -- 底层核心组件 -- 多智能体/分布式智能体
- Extensions -- 扩展应用
1.3.1 安装
python
1. pip install -U "autogen-agentchat"
2. pip install "autogen-ext[openai]"
1.3.2 使用第三方大模型
- 需要申请官方API key ---- 这里我用的LLM是Kimi (Kimi-k2.6)
- 判断是否与OpenAI API兼容:几乎所有大模型访问的底层组件
- 使用OpenAI底层组件调用Kimi方法
python
from openai import OpenAI
KIMI_API_KEY = '自己去买kimi2.6 api-key'
client = OpenAI(api_key=KIMI_API_KEY, base_url='https://api.moonshot.cn/v1')
completion = client.chat.completions.create(
model='kimi-k2.6',
messages = [
{"role": "system", "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。"},
{"role": "user", "content": "你好,我叫李雷,1+1等于多少?"}
],
stream = False
)
print(completion.choices[0].message.content)
大模型回复结果
你好,李雷!很高兴认识你。
在常规算术里,1+1 等于 2。
如果你是在其他语境下(比如二进制、编程或者玩笑梗)问这个问题,答案可能会不一样。需要我展开讲讲吗?
- 提示词
- 系统:系统角色类prompt,给LLM很多背景信息(比如:你擅长写python')
- 用户:用户发送的指令。(例如:帮我写一个自动化测试代码)
- 使用Autogen_model调用Kimi(使用AI给的详细解释)
python
# 导入 asyncio 库,用于编写异步程序
# asyncio 是 Python 标准库,支持协程、事件循环等异步编程特性
import asyncio
# 从 autogen_ext 的 openai 模块导入 OpenAIChatCompletionClient 类
# 这是 AutoGen 框架中用于调用 OpenAI 兼容 API 的客户端类
# Kimi 的 API 是 OpenAI 兼容的,所以可以用这个类
from autogen_ext.models.openai import OpenAIChatCompletionClient
# 从 autogen_core 的 models 模块导入 UserMessage 和 SystemMessage
# UserMessage: 用户发送的消息
# SystemMessage: 系统提示消息,用于设定 AI 的角色和行为
from autogen_core.models import UserMessage, SystemMessage
# ============================================
# 创建 OpenAI 兼容的模型客户端实例
# ============================================
openai_model_client = OpenAIChatCompletionClient(
# model: 指定使用的模型名称
# 'kimi-k2.6' 是 Kimi 最新的大模型版本
model='kimi-k2.6',
# base_url: API 的基础地址
# 默认是 OpenAI 的 https://api.openai.com/v1
# 这里改为 Kimi 的 API 地址,实现兼容调用
base_url='https://api.moonshot.cn/v1',
# api_key: 你的 Kimi API 密钥
# 需要从 https://platform.moonshot.cn/ 申请
# 注意:实际使用时替换为真实密钥,不要硬编码
api_key='sk-自己去买kimi2.6 api-key',
# model_info: 声明模型的能力信息
# 因为 AutoGen 不认识 'kimi-k2.6',必须手动声明模型特性
model_info={
# vision: 是否支持视觉/图片输入
# False 表示纯文本模型,True 表示支持图片
"vision": False,
# function_calling: 是否支持函数调用/工具调用
# True 表示模型可以调用外部函数/工具
"function_calling": True,
# json_output: 是否支持 JSON 格式输出
# True 表示可以让模型输出结构化 JSON 数据
"json_output": True,
# family: 模型家族分类
# "unknown" 表示未知/其他模型家族
# 可选值: gpt-4, gpt-35, llama, unknown 等
"family": "unknown",
# structured_output: 是否支持结构化输出
# True 表示支持复杂的结构化数据输出
"structured_output": True,
# multiple_system_messages: 是否支持多条系统消息
# True 表示可以在对话中包含多条 SystemMessage
"multiple_system_messages": True,
}
)
# ============================================
# 定义异步主函数
# ============================================
# async def: 定义异步函数,内部可以使用 await 关键字
async def main():
# await: 等待异步操作完成,不会阻塞事件循环
# openai_model_client.create(): 发送消息给模型并获取回复
result = await openai_model_client.create(
# 传入消息列表,列表中的消息按顺序组成对话上下文
[
# UserMessage: 用户消息
# content: 消息内容,用户的具体请求
# source: 消息来源标识,通常为 "user"
UserMessage(
content="编写一个自动化脚本", # 用户请求内容
source="user" # 标识这是用户发送的消息
),
# SystemMessage: 系统提示消息
# 用于设定 AI 的角色、行为规则、输出格式等
# 通常放在对话开头,但 AutoGen 支持多系统消息
SystemMessage(
content='你是pythhon编程高手' # 设定 AI 角色为 Python 专家
# 注意:这里 "pythhon" 拼写有误,应为 "python"
)
]
)
# print(): 打印模型的返回结果
# result 是模型的响应对象,包含 content, usage, finish_reason 等属性
print(result)
# await: 异步关闭客户端连接
# close(): 释放资源,关闭 HTTP 连接池
# 必须显式调用,否则程序不会结束
await openai_model_client.close()
# ============================================
# 程序入口
# ============================================
# asyncio.run(): 运行异步主函数
# 1. 创建新的事件循环
# 2. 运行 main() 协程直到完成
# 3. 关闭事件循环
# 这是运行异步程序的标准方式
asyncio.run(main())
大模型回复结果
finish_reason='stop' content='我来为你编写一个专业级的文件自动整理脚本 。这个脚本可以按文件类型自动分类整理杂乱的文件夹,包含完整的日志记录、错误处理和统计功能。\n\n
python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n"""\n智能文件整理器 - Auto File Organizer\n功能:自动按文件类型分类整理文件夹内容\n特点:支持试运行、日志记录、冲突处理、自定义分类规则\n"""\n\nimport os\nimport sys\nimport shutil\nimport logging\nimport argparse\nfrom pathlib import Path\nfrom datetime import datetime\nfrom collections import defaultdict\nfrom typing import Dict, List, Optional, Tuple\nfrom dataclasses import dataclass\n\n# ==================== 配置区域 ====================\nFILE_CATEGORIES: Dict[str, List[str]] = {\n \'图片\': [\'.jpg\', \'.jpeg\', \'.png\', \'.gif\', \'.bmp\', \'.svg\', \'.webp\', \'.ico\', \'.raw\'],\n \'文档\': [\'.pdf\', \'.doc\', \'.docx\', \'.txt\', \'.md\', \'.xls\', \'.xlsx\', \'.ppt\', \'.pptx\', \'.csv\'],\n \'视频\': [\'.mp4\', \'.avi\', \'.mkv\', \'.mov\', \'.wmv\', \'.flv\', \'.m4v\', \'.mpg\', \'.mpeg\'],\n \'音频\': [\'.mp3\', \'.wav\', \'.flac\', \'.aac\', \'.ogg\', \'.m4a\', \'.wma\'],\n \'压缩包\': [\'.zip\', \'.rar\', \'.7z\', \'.tar\', \'.gz\', \'.bz2\', \'.xz\'],\n \'程序\': [\'.exe\', \'.msi\', \'.dmg\', \'.pkg\', \'.deb\', \'.rpm\', \'.appimage\'],\n \'代码\': [\'.py\', \'.js\', \'.ts\', \'.html\', \'.css\', \'.java\', \'.cpp\', \'.c\', \'.go\', \'.rs\', \'.php\', \'.json\', \'.xml\'],\n \'数据库\': [\'.sql\', \'.db\', \'.sqlite\', \'.sqlite3\'],\n \'电子书\': [\'.epub\', \'.mobi\', \'.azw3\', \'.fb2\'],\n}\n\n# 需要跳过的系统文件/目录\nSKIP_PATTERNS = {\'.DS_Store\', \'Thumbs.db\', \'desktop.ini\', \'.git\', \'.svn\', \'node_modules\', \'__pycache__\', \'.idea\', \'.vscode\'}\n\n\n@dataclass\nclass OperationResult:\n """操作结果数据类"""\n success: bool\n source: Path\n destination: Optional[Path] = None\n error: Optional[str] = None\n category: Optional[str] = None\n\n\nclass FileOrganizer:\n """文件整理器主类"""\n \n def __init__(self, source_dir: Path, dest_dir: Optional[Path] = None, \n move_mode: bool = True, conflict_mode: str = \'rename\'):\n """\n 初始化整理器\n \n Args:\n source_dir: 源目录\n dest_dir: 目标目录(默认在源目录内创建"已整理_时间戳")\n move_mode: True=移动文件, False=复制文件\n conflict_mode: 冲突处理方式: \'rename\'(重命名), \'skip\'(跳过), \'overwrite\'(覆盖)\n """\n self.source_dir = Path(source_dir).expanduser().resolve()\n if not self.source_dir.exists():\n raise FileNotFoundError(f"源目录不存在: {self.source_dir}")\n \n if dest_dir:\n self.dest_dir = Path(dest_dir).expanduser().resolve()\n else:\n timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")\n self.dest_dir = self.source_dir / f"已整理_{timestamp}"\n \n self.move_mode = move_mode\n self.conflict_mode = conflict_mode\n self.stats = defaultdict(int)\n self.errors: List[str] = []\n \n # 创建日志\n self.logger = self._setup_logger()\n \n def _setup_logger(self) -> logging.Logger:\n """配置日志记录"""\n logger = logging.getLogger("FileOrganizer")\n logger.setLevel(logging.DEBUG)\n \n # 控制台处理器\n console_handler = logging.StreamHandler()\n console_handler.setLevel(logging.INFO)\n console_format = logging.Formatter(\'%(levelname)s: %(message)s\')\n console_handler.setFormatter(console_format)\n \n # 文件处理器\n log_file = self.dest_dir / "organize.log"\n log_file.parent.mkdir(parents=True, exist_ok=True)\n file_handler = logging.FileHandler(log_file, encoding=\'utf-8\')\n file_handler.setLevel(logging.DEBUG)\n file_format = logging.Formatter(\'%(asctime)s - %(name)s - %(levelname)s - %(message)s\')\n file_handler.setFormatter(file_format)\n \n logger.addHandler(console_handler)\n logger.addHandler(file_handler)\n return logger\n \n def _get_category(self, file_path: Path) -> str:\n """根据后缀名判断文件分类"""\n suffix = file_path.suffix.lower()\n for category, extensions in FILE_CATEGORIES.items():\n if suffix in extensions:\n return category\n return \'其他\'\n \n def _resolve_conflict(self, dest_path: Path) -> Path:\n """处理文件名冲突"""\n if not dest_path.exists():\n return dest_path\n \n if self.conflict_mode == \'overwrite\':\n return dest_path\n elif self.conflict_mode == \'skip\':\n return Path() # 返回空路径表示跳过\n else: # rename\n stem = dest_path.stem\n suffix = dest_path.suffix\n parent = dest_path.parent\n counter = 1\n \n while True:\n new_name = f"{stem}_{counter:03d}{suffix}"\n new_path = parent / new_name\n if not new_path.exists():\n return new_path\n counter += 1\n \n def _should_skip(self, path: Path) -> bool:\n """判断是否应该跳过此文件/目录"""\n if path.name.startswith(\'.\') and path.name != \'.\': # 隐藏文件\n return True\n if path.name in SKIP_PATTERNS:\n return True\n return False\n \n def organize(self, dry_run: bool = False) -> Dict[str, any]:\n """\n 执行整理操作\n \n Args:\n dry_run: 如果为True,只模拟运行不实际操作\n \n Returns:\n 统计信息字典\n """\n mode_str = "【试运行】" if dry_run else ""\n action_str = "移动" if self.move_mode else "复制"\n \n self.logger.info(f"{mode_str} 开始整理文件...")\n self.logger.info(f"源目录: {self.source_dir}")\n self.logger.info(f"目标目录: {self.dest_dir}")\n self.logger.info(f"操作模式: {action_str} | 冲突处理: {self.conflict_mode}")\n \n if not dry_run:\n self.dest_dir.mkdir(parents=True, exist_ok=True)\n \n results: List[OperationResult] = []\n files_processed = 0\n \n # 遍历源目录\n for item in self.source_dir.rglob(\'*\'):\n # 跳过目录自身、目标目录、以及需要跳过的文件\n if item == self.source_dir:\n continue\n if self.dest_dir in item.parents or item == self.dest_dir:\n continue\n if self._should_skip(item):\n continue\n if item.is_dir():\n continue # 不处理子目录结构,只处理文件\n \n # 确定分类\n category = self._get_category(item)\n category_dir = self.dest_dir / category\n \n # 构建目标路径\n dest_path = category_dir / item.name\n \n # 处理冲突\n if not dry_run:\n dest_path = self._resolve_conflict(dest_path)\n if not dest_path.name: # 跳过模式\n self.logger.info(f"跳过已存在: {item.name}")\n continue\n \n # 创建分类目录\n category_dir.mkdir(parents=True, exist_ok=True)\n \n # 执行操作\n try:\n if not dry_run:\n if self.move_mode:\n shutil.move(str(item), str(dest_path))\n else:\n shutil.copy2(str(item), str(dest_path))\n \n result = OperationResult(\n success=True,\n source=item,\n destination=dest_path if not dry_run else None,\n category=category\n )\n self.stats[category] += 1\n files_processed += 1\n \n self.logger.debug(f"{action_str}: {item.name} -> {category}/")\n \n except Exception as e:\n error_msg = str(e)\n self.errors.append(f"{item.name}: {error_msg}")\n result = OperationResult(\n success=False,\n source=item,\n error=error_msg,\n category=category\n )\n self.logger.error(f"失败: {item.name} - {error_msg}")\n \n results.append(result)\n \n # 输出统计\n self.logger.info(f"\\n{\'=\'*50}")\n self.logger.info(f"整理完成! 共处理 {files_processed} 个文件")\n self.logger.info(f"{\'=\'*50}")\n \n for cat, count in sorted(self.stats.items(), key=lambda x: x[1], reverse=True):\n self.logger.info(f" {cat:8s}: {count:3d} 个文件")\n \n if self.errors:\n self.logger.warning(f"\\n警告: {len(self.errors)} 个操作失败")\n \n return {\n \'total\': files_processed,\n \'categories\': dict(self.stats),\n \'errors\': self.errors,\n \'destination\': self.dest_dir,\n \'results\': results\n }\n\n\ndef create_argument_parser() -> argparse.ArgumentParser:\n """创建命令行参数解析器"""\n parser = argparse.ArgumentParser(\n description=\'智能文件整理工具 - 自动按类型分类文件\',\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog="""\n示例:\n # 基本使用(整理当前目录)\n python organizer.py .\n \n # 指定输出目录,复制模式(保留原文件)\n python organizer.py ~/Downloads -o ~/Desktop/整理完成 --copy\n \n # 试运行(查看会做什么,不实际操作)\n python organizer.py ~/Desktop --dry-run\n \n # 覆盖已存在文件\n python organizer.py ~/Downloads --conflict overwrite\n """\n )\n \n parser.add_argument(\'source\', help=\'要整理的源目录路径\')\n parser.add_argument(\'-o\', \'--output\', help=\'输出目录路径(默认:自动创建时间戳目录)\')\n parser.add_argument(\'-c\', \'--copy\', action=\'store_true\', help=\'复制模式(默认是移动)\')\n parser.add_argument(\'--conflict\', choices=[\'rename\', \'skip\', \'overwrite\'], \n default=\'rename\', help=\'文件冲突处理方式(默认:rename)\')\n parser.add_argument(\'-d\', \'--dry-run\', action=\'store_true\', \n help=\'试运行模式,不实际移动/复制文件\')\n parser.add_argument(\'--version\', action=\'version\', version=\'%(prog)s 2.0\')\n \n return parser\n\n\ndef main():\n """主入口"""\n parser = create_argument_parser()\n args = parser.parse_args()\n \n source = Path(args.source)\n \n # 检查源目录\n if not source.exists():\n print(f"错误: 源目录不存在 - {source}")\n sys.exit(1)\n if not source.is_dir():\n print(f"错误: 源路径不是目录 - {source}")\n sys.exit(1)\n \n try:\n organizer = FileOrganizer(\n source_dir=source,\n dest_dir=Path(args.output) if args.output else None,\n move_mode=not args.copy,\n conflict_mode=args.conflict\n )\n \n result = organizer.organize(dry_run=args.dry_run)\n \n # 最终用户友好的输出\n print(f"\\n✅ 任务完成!")\n if not args.dry_run:\n print(f"📁 文件位置: {result[\'destination\']}")\n print(f"📊 共处理: {result[\'total\']} 个文件")\n \n if result[\'errors\']:\n print(f"⚠️ 失败: {len(result[\'errors\'])} 个")\n \n except KeyboardInterrupt:\n print("\\n\\n用户中断操作")\n sys.exit(0)\n except Exception as e:\n print(f"\\n❌ 发生错误: {e}")\n sys.exit(1)\n\n\nif __name__ == \'__main__\':\n main()\n\n\n## 功能特性\n\n| 特性 | 说明 |\n|------|------|\n| 智能分类 | 内置10种常见文件类型分类规则 |\n| 冲突处理 | 支持重命名/跳过/覆盖三种模式 |\n| 安全机制 | 试运行模式(--dry-run),操作前可预览 |\n| 完整日志 | 同时输出到控制台和organize.log文件 |\n| 路径处理 | 自动处理中文、空格、特殊字符文件名 |\n| 错误恢复 | 单文件失败不影响整体任务 |\n\n## 使用方法\n\nbash\n# 1. 基础用法:整理 Downloads 文件夹\npython organizer.py ~/Downloads\n\n# 2. 试运行(先看效果,不真动)\npython organizer.py ~/Desktop --dry-run\n\n# 3. 复制到指定位置(保留原文件)\npython organizer.py ~/Downloads -o ~/backup --copy\n\n# 4. 处理冲突时覆盖旧文件\npython organizer.py ~/Downloads --conflict overwrite\n\n\n---\n\n如果你需要其他类型的自动化脚本 ,告诉我具体场景,我可以为你定制:\n\n- 🌐 网络自动化 (爬虫、API监控、自动下载)\n- 📧 办公自动化 (Excel/Word批量处理、邮件自动发送)\n- 🖥️ 系统运维 (日志清理、备份同步、服务监控)\n- 🤖 DevOps (CI/CD流水线、Docker部署、测试自动化)\n- 📱 Web/UI自动化 (Selenium/Playwright自动化操作)\n\n需要哪种?或者需要我修改这个文件整理器的某个功能?' usage=RequestUsage(prompt_tokens=21, completion_tokens=3928) cached=False logprobs=None thought='用户要求编写一个自动化脚本,并且系统提示我是Python编程高手。用户没有具体说明需要什么类型的自动化脚本,所以我应该:\n \n 1. 询问具体需求(但用户可能期待直接给出示例)\n 2. 提供一个通用且实用的自动化脚本示例\n 3. 展示多种常见的自动化场景\n \n 考虑到用户可能想要立即可用的代码,我应该提供一个综合性示例,同时说明可以根据需求定制。最实用的自动化脚本通常涉及:\n - 文件整理(按类型分类文件)\n - 批量重命名\n - 定时任务\n - 数据备份\n - 或者办公自动化(Excel/Word处理)\n \n 我决定提供一个文件自动整理脚本 作为示例,因为它:\n - 实用性强,几乎每个人都需要\n - 涵盖Python核心概念(os, shutil, pathlib等)\n - 容易理解和扩展\n - 包含错误处理和日志记录,体现"高手"水平\n \n 脚本应该包含:\n - 清晰的注释\n - 类型提示(体现专业性)\n - 错误处理\n - 日志记录\n - 命令行参数支持(argparse)\n - 配置文件支持(可选)\n \n 让我写一个高质量的文件整理脚本:\n \npython\n import os\n import shutil\n import logging\n from pathlib import Path\n from datetime import datetime\n from collections import defaultdict\n import argparse\n from typing import Dict, List, Optional\n \n # 配置日志\n def setup_logging(log_dir: Path) -> logging.Logger:\n ...\n \n # 文件分类规则\n FILE_CATEGORIES = {\n \'图片\': [\'.jpg\', \'.jpeg\', \'.png\', \'.gif\', \'.bmp\', \'.svg\', \'.webp\'],\n \'文档\': [\'.pdf\', \'.doc\', \'.docx\', \'.txt\', \'.md\', \'.xls\', \'.xlsx\', \'.ppt\', \'.pptx\'],\n \'视频\': [\'.mp4\', \'.avi\', \'.mkv\', \'.mov\', \'.wmv\', \'.flv\'],\n \'音频\': [\'.mp3\', \'.wav\', \'.flac\', \'.aac\', \'.ogg\'],\n \'压缩包\': [\'.zip\', \'.rar\', \'.7z\', \'.tar\', \'.gz\'],\n \'程序\': [\'.exe\', \'.msi\', \'.dmg\', \'.pkg\', \'.deb\', \'.rpm\'],\n \'代码\': [\'.py\', \'.js\', \'.html\', \'.css\', \'.java\', \'.cpp\', \'.c\', \'.go\', \'.rs\'],\n }\n \n class FileOrganizer:\n def __init__(self, source_dir: Path, dest_dir: Optional[Path] = None):\n self.source_dir = Path(source_dir).expanduser().resolve()\n self.dest_dir = Path(dest_dir).expanduser().resolve() if dest_dir else self.source_dir / "已整理"\n self.logger = self._setup_logger()\n self.stats = defaultdict(int)\n \n def _setup_logger(self) -> logging.Logger:\n ...\n \n def _get_category(self, file_path: Path) -> str:\n suffix = file_path.suffix.lower()\n for category, extensions in FILE_CATEGORIES.items():\n if suffix in extensions:\n return category\n return \'其他\'\n \n def organize(self, dry_run: bool = False) -> Dict[str, int]:\n ...\n \n def main():\n parser = argparse.ArgumentParser(description=\'智能文件整理工具\')\n parser.add_argument(\'source\', help=\'源目录路径\')\n parser.add_argument(\'-o\', \'--output\', help=\'输出目录路径(默认:源目录/已整理)\')\n parser.add_argument(\'-d\', \'--dry-run\', action=\'store_true\', help=\'试运行模式,不实际移动文件\')\n args = parser.parse_args()\n \n organizer = FileOrganizer(Path(args.source), Path(args.output) if args.output else None)\n stats = organizer.organize(dry_run=args.dry_run)\n \n print("\\n整理完成!统计信息:")\n for category, count in sorted(stats.items()):\n print(f" {category}: {count} 个文件")\n \n if __name__ == \'__main__\':\n main()\n\n \n 这个脚本展示了专业级的Python代码结构。我还应该提供其他场景的简要示例,让用户有更多选择。\n \n 最后,我需要提醒用户:\n 1. 运行前备份重要数据\n 2. 可以先使用--dry-run测试\n 3. 如何根据需求修改分类规则\n \n 让我确保代码完整、正确且高质量。'进程已结束,退出代码为 0
- Agent智能体助手类使用
- 首先封装一下LLM调用类,包名称命名为llms
python
import os
from autogen_ext.models.openai import OpenAIChatCompletionClient
from dotenv import load_dotenv
class LLMGet:
"""llm大模型调用类"""
def __init__(self):
load_dotenv()
self.model = os.getenv("MODEL")
self.base_url = os.getenv("BASE_URL")
self.api_key = os.getenv("API_KEY")
self.model_info = {
"vision": False,
"function_calling": True,
"json_output": True,
"family": "unknown",
"structured_output": True,
"multiple_system_messages": True,
}
def get_model(self):
"""获取模型方法"""
openai_model_client = OpenAIChatCompletionClient(
model=self.model,
base_url=self.base_url,
api_key=self.api_key,
model_info= self.model_info
)
return openai_model_client
get_llm = LLMGet()
- 调用autogen_chat智能体助手
python
import asyncio
from examples.llms import get_llm
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.ui import Console
agent = AssistantAgent(
name="reporter_agent",
model_client=get_llm.get_model(),
system_message='你擅长编写古诗',
model_client_stream=True, # 支持流式输出
)
# 调用正常的输出
async def main():
result = await agent.run(task="编写一首七言四句古诗,描写年轻女生,并且要带有赞美之意")
print(result)
# 使用流式输出
async def main_stream():
result = agent.run_stream(task="编写一首七言四句古诗,描写年轻女生,并且要带有赞美之意")
async for item in result:
print(item)
# 调用流式输出面板,只展示关键信息
async def main_console():
result = await Console(agent.run_stream(task="编写一首七言四句古诗,描写年轻女生,并且要带有赞美之意"))
print(result)
asyncio.run(main_console())
1.4 浏览器核心插件
- 沉浸式翻译
- Kimi插件:https://kimi.moonshot.cn/extension