[目录]
1.环境准备
2.效果预览
3.总结
4.智能体完整输出
5.源码及教程
点我去AIGIS公众号查看本文
前言
5.1假期坚持研究智能体的玩法可以说非常敬业了。今天我们来小试一把目前GitHub
最火爆智能体框架MetaGPT
,让它给我们写一篇Git
教程,看看是不是像传说中的那么神奇。模型我们就用刚刚阿里开源的qwen1.5-110b
,据说已经超过了llama3 70b
,一举拿下开源大模型榜单第一名。
1 环境准备
1.模型:qwen1.5-110b-chat
2.智能体框架MetaGPT0.8.0
2 效果预览
可以看到创建出了.md
文件,妥妥的markdown
语法,我们把结果全部放上来看看效果,amazing!
3 总结
MetaGPT
确实是很强的框架,能够让大模型做一系列复杂的操作,而不是仅停留在和用户对话的层次上。就拿这教程来说,是不是以后会出现很多由大模型写出来的教程,完全是有可能的。也再次说明了智能体是大模型落地的最后一步,所以GISer
们还是要好好学习一下智能体,后面我们考虑出一系列从零开始搭建智能体的教程,来重构我们的地图功能,居安思危,才能长久。
4 智能体完整输出
#Git教程
基础概念
Git简介
Git 是一种分布式版本控制系统,由Linus Torvalds在2005年为Linux内核开发而创建。它允许开发团队追踪代码的每一次更改,支持非线性开发流程,提供了高效的数据完整性保证。Git不仅仅是一个保存文件变更历史的工具,它更是一个项目管理的强大助手,使得多人协作变得简单而高效。
版本控制系统原理
版本控制系统(Version Control System, VCS)是用来跟踪文件修改并管理不同版本的软件工具。在Git中,这一原理基于快照流模型。每当提交(commit)时,Git不是只记录文件的差异,而是对整个项目做一次快照并存储一个指向这次快照的指针。通过这种方式,Git能够高效地管理历史版本,并且由于存储的是差异较小的索引和实际数据的引用,占用的空间非常小。Git使用SHA-1哈希算法为每个快照生成一个唯一的ID,确保数据的完整性和一致性。
Git与其它VCS的区别
Git与其他版本控制系统(如SVN、CVS等)的主要区别在于其分布式特性。在传统的集中式VCS中,有一个中央服务器托管所有文件的历史版本,而每个开发者的工作站只拥有最新的版本和修改。相比之下,Git的每个工作副本都是一个完整的仓库,包含了项目的全部历史记录。这意味着:
- 离线工作:开发者可以在没有网络连接的情况下进行提交。
- 分支与合并:Git的分支操作极其轻量且快速,鼓励频繁分支,这对于并行开发非常友好。
- 数据完整性:Git使用SHA-1校验和确保每次提交的数据不被篡改。
- 分布式:每个开发者的电脑上都有完整的项目历史,减少了对中心服务器的依赖,提高了系统的可靠性。
示例:初始化Git仓库
# 在命令行中,进入项目目录
cd your_project_directory# 初始化Git仓库
git init# 查看当前状态
git status
这段简单的命令序列演示了如何在一个新的项目目录中初始化Git仓库,并检查初始状态。Git的这些基本操作构成了版本控制的基础。
Git教程:安装与配置
本教程将指导您完成Git的安装、环境配置以及SSH密钥的生成与配置,确保您可以顺利地开始使用Git进行版本控制。
Git安装步骤(Windows/Linux/Mac)
Windows
- 访问Git官方网站下载页面:https://git-scm.com/download/win。
- 运行下载的安装程序,按照向导步骤进行安装。推荐选择“Use Git from the Windows Command Prompt”以便在命令行中使用Git。
- 在高级配置中,可以根据需要选择UTF-8编码和是否将Git集成到文件资源管理器。
Linux
大多数Linux发行版通过包管理器可以轻松安装Git。
-
Ubuntu/Debian:
sudo apt-get update sudo apt-get install git
-
Fedora:
sudo dnf install git
-
Arch Linux:
sudo pacman -S git
Mac
- 可通过Homebrew安装Git(首先需要安装Homebrew):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install git
- 或者直接从Git官网下载Mac版安装程序安装。
Git配置环境变量
安装完成后,建议配置全局用户名和邮箱,这是Git用来标识提交者身份的方式。
git config --global user.name "您的名字"
git config --global user.email "您的邮箱@example.com"
SSH密钥生成与配置
SSH密钥允许您在不输入密码的情况下安全地与GitHub/GitLab等Git服务交互。
生成SSH密钥
-
打开终端或命令提示符。
-
生成SSH密钥(如果已有密钥,则跳过此步):
ssh-keygen -t rsa -b 4096 -C "您的邮箱@example.com"
按提示操作,可以选择密钥保存路径,默认情况下是
~/.ssh/id_rsa
。 -
查看生成的公钥:
cat ~/.ssh/id_rsa.pub
添加SSH密钥到Git服务
- 登录您的Git服务账户(如GitHub、GitLab)。
- 寻找“SSH keys”或“部署密钥”的设置部分。
- 粘贴您的公钥(从
ssh-rsa
开始到结束)到相应的输入框,然后保存。
至此,您已成功安装Git,配置了环境变量,并设置了SSH密钥,可以开始愉快地进行版本控制了。
Git教程 - 基本操作
Git是一个分布式版本控制系统,用于跟踪在软件开发过程中对文件的修改。下面我们将逐一介绍Git的基本操作,包括初始化仓库、添加文件到暂存区、提交更改、分支管理以及标签管理。
初始化仓库
初始化一个Git仓库是开始使用Git的第一步,这会在当前目录下创建一个.git
目录来存储所有的元数据。
# 初始化空的Git仓库
git init
添加文件到暂存区
在提交之前,你需要将文件添加到暂存区。这可以通过git add
命令完成。
# 添加指定文件到暂存区
git add <file># 或者添加所有已修改和新文件到暂存区
git add .
提交更改
提交暂存区的更改到仓库中,这一步会永久保存你的改动。
# 提交所有暂存区的更改,并添加提交信息
git commit -m "提交信息"# 提交单个文件或指定文件
git commit -m "提交信息" <file>
分支管理
创建分支
分支允许你在一个独立的线上开发新的功能,而不影响主分支。
# 创建并切换到新分支
git checkout -b 分支名
合并分支
当你完成分支上的工作后,可以将其合并回主分支。
# 切换回主分支
git checkout 主分支名# 合并分支
git merge 分支名
删除分支
合并后,如果分支不再需要,可以删除它。
# 删除本地分支
git branch -d 分支名# 强制删除未被合并的分支
git branch -D 分支名
标签管理
标签用于标记特定的提交,通常用于发布版本。
创建标签
# 创建轻量标签
git tag 标签名 提交哈希值# 或创建带有注释的标签
git tag -a 标签名 -m "标签描述" 提交哈希值
查看标签
# 列出所有标签
git tag
切换到标签
# 切换到某个标签对应的提交
git checkout 标签名
通过上述步骤,你可以有效地使用Git进行版本控制,从初始化仓库到日常的提交、分支管理和标签应用,Git为团队协作和代码版本管理提供了强大的支持。
远程仓库
连接远程仓库(GitHub/GitLab等)
在开始之前,确保你已经安装了Git。接下来,我们将学习如何将本地仓库与GitHub这样的远程仓库连接起来。
-
创建新的GitHub仓库:
- 登录到GitHub账号,点击“New repository”,填写仓库信息并创建。
-
在本地初始化仓库:
# 在你的项目目录下执行 git init
-
添加远程仓库链接:
- 获取你的GitHub仓库的URL,然后使用以下命令添加为远程仓库。
git remote add origin [仓库的HTTPS或SSH URL] # 例如 git remote add origin https://github.com/用户名/仓库名.git
推送与拉取远程分支
-
推送本地分支到远程仓库:
当你在本地创建了分支并完成了工作,可以将其推送到远程仓库。# 切换到要推送的分支 git checkout 分支名 # 将分支推送到远程仓库 git push -u origin 分支名
-
拉取远程分支到本地:
保持你的本地仓库与远程仓库同步。git fetch origin git merge origin/分支名
解决合并冲突
当两个人同时修改了同一个文件的相同部分,Git无法自动合并时,就会发生合并冲突。
-
尝试合并时遇到冲突:
Git会标记出冲突的文件。 -
手动解决冲突:
- 打开冲突文件,找到Git插入的标记(如
<<<<<<< HEAD
,=======
,>>>>>>> 远程分支名
)。 - 手动选择或合并你想要保留的代码段。
- 移除Git的标记行。
- 打开冲突文件,找到Git插入的标记(如
-
解决后提交:
git add 解决冲突的文件名 git commit -m "解决合并冲突" git push
通过以上步骤,你可以有效地管理远程仓库,与团队成员协同工作,并在遇到合并冲突时妥善处理。
Git教程 - 高级技巧
在深入Git的高级应用之前,理解其核心概念是基础。本部分将探讨Git的几个高级技巧,包括分支策略、.gitignore的使用、子模块管理以及如何进行重构与历史修改。
分支策略
Git的分支模型是其强大之处。一个高效的分支策略可以极大地促进团队协作。
动态分支工作流
- 主分支(master/main)保持生产代码。
- 开发分支(develop)用于日常开发,合并功能分支。
- 功能分支(feature/*)从开发分支创建,每个新功能一个分支。
合并回主分支前的流程:
# 创建功能分支
git checkout -b feature/my-feature develop# 开发完成后,合并回开发分支
git checkout develop
git merge --no-ff feature/my-feature# 测试无误后,合并到主分支
git checkout main
git merge --no-ff develop
Git忽略文件(.gitignore)
.gitignore
文件用于指定不应纳入版本控制的文件模式。
示例
创建或编辑.gitignore
文件,加入以下内容来忽略常见的IDE和编译产物:
# 忽略IDE配置
.idea/
.vscode/# 编译输出
build/
dist/# 本地环境配置
*.env# 其他忽略项
node_modules/
子模块管理
子模块允许你在Git仓库中嵌入另一个Git仓库,便于管理依赖的项目。
初始化子模块
- 添加子模块:
git submodule add https://github.com/user/repo.git path/to/submodule
- 更新子模块:
git submodule update --init --recursive
使用场景
当你需要在项目中包含一个库,但又希望独立维护这个库的版本时,子模块非常有用。
重构与历史修改
Git提供了强大的工具来安全地进行代码重构而不破坏历史记录。
重命名与移动跟踪
使用git mv
来重命名或移动文件,Git会自动跟踪这些变化。
git mv old-name new-name
git commit -m "Rename file"
使用git rebase
进行历史修正
在提交历史中修正错误或整合连续的提交为一个更清晰的提交历史。
# 开始交互式rebase
git rebase -i HEAD~3# 在编辑器中,根据指示选择操作,如'squash'或'fixup'合并提交,然后保存退出。
记住,高级技巧需要谨慎使用,尤其是在共享的项目中,以避免影响其他开发者的同步和工作流。熟练掌握这些技巧将极大提升你的Git使用效率和团队协作质量。
故障排除与日常问题
在Git的日常使用中,掌握故障排除和优化技巧是至关重要的。本部分将详细介绍如何处理常见错误、优化Git性能以及如何安全地回滚和恢复数据。
常见错误处理
Git操作过程中可能会遇到各种错误,如推送失败、分支合并冲突等。正确识别并解决这些问题对保持项目流畅至关重要。
-
推送失败:认证问题
当尝试推送更改时,如果遇到认证失败,通常需要检查或更新你的凭证。git config --global user.email "you@example.com" git config --global user.name "Your Name"
对于远程仓库认证,可能需要重新输入凭据或配置SSH密钥。
-
合并冲突
遇到合并冲突时,Git会标记出冲突文件。解决步骤通常包括:
- 手动编辑冲突文件,移除Git插入的特殊标记。
- 使用
git add <file>
标记已解决的冲突。 - 提交解决后的更改
git commit -m "解决合并冲突"
。
性能优化
-
大型文件管理
对于大型文件,可以使用Git LFS(Large File Storage)来优化存储和传输性能。安装Git LFS并初始化仓库:
git lfs install
然后,在
.gitattributes
文件中指定哪些文件类型应该由Git LFS管理。*.largefile filter=lfs diff=lfs merge=lfs -text
-
加快克隆速度
使用--depth
参数进行浅克隆,减少下载历史数据的量。git clone --depth=1 https://github.com/user/repo.git
回滚与恢复数据
-
回退到特定版本
使用git reset
命令可以回退到任意提交。回退到指定哈希值的提交:
git reset --hard <commit-hash>
注意:这将永久性改变本地历史,除非有备份,否则不建议用于共享分支。
-
恢复误删的文件
若不小心删除了文件,可以使用:git checkout HEAD -- <file-path>
这将从最近的提交中恢复文件。
-
撤销未推送的本地提交
若要撤销最近的一次提交但保留更改,可以使用:git reset --soft HEAD^
若要完全丢弃最近的提交及其更改:
git reset --hard HEAD^
通过以上指南,你将能够更有效地处理Git中的常见问题,优化工作流程,并在需要时安全地回滚变更。记得在进行任何重大操作前备份您的工作,以防不测。
Git工作流示例
在Git版本控制系统中,合理的工作流对于团队协作至关重要。以下是三种广泛采用的Git工作流模型,它们各自适应不同的项目需求和团队规模。
特性分支工作流
原理概述
特性分支工作流鼓励每个新功能或修复都在独立的分支上开发,完成后合并回主分支。这种方法便于并行开发,减少冲突,并能清晰跟踪每个功能的开发过程。
实践步骤
- 创建特性分支:
git checkout -b feature-branch-name master
- 开发与提交:
开发过程中多次提交,保持每次提交专注单一功能。 - 合并回主分支:
确保主分支是最新的,然后合并特性分支。git checkout master git merge --no-ff feature-branch-name git branch -d feature-branch-name # 删除已合并的特性分支
Gitflow工作流
原理概述
Gitflow工作流是在特性分支的基础上进一步细化,引入了develop
作为开发主干,master
用于发布稳定版本。还包括feature
、release
和hotfix
分支,以支持复杂项目管理。
关键分支操作
- 初始化Gitflow:
git flow init
- 创建特性分支:
git flow feature start feature-name
- 启动发布分支:
git flow release start release-1.0
- 处理热修复:
git flow hotfix start hotfix-1.0.1
- 合并与发布:
完成分支任务后,合并到develop
或直接到master
,并发布。
Forking工作流
原理概述
Forking工作流特别适用于开源项目,每个贡献者都有自己的仓库副本(fork),通过Pull Request的方式提出更改建议,由项目维护者审核合并。
操作流程
- Fork仓库:
在GitHub等平台上操作,为每个贡献者创建仓库副本。 - 克隆个人叉:
git clone https://github.com/yourusername/project.git
- 创建与推送分支:
开发新功能时创建分支并推送。git checkout -b my-feature git push origin my-feature
- 发起Pull Request:
在GitHub上选择你的分支,发起向原项目仓库的Pull Request。 - 项目维护者审查与合并:
维护者审查代码,确认后合并至主分支。
以上三种工作流各有侧重,选择适合项目特性和团队习惯的模型,可以极大地提高开发效率和代码质量。
进阶与扩展
Git钩子(pre-commit, post-commit等)
Git钩子是Git提供的脚本自动化工具,允许在特定的Git事件发生时执行自定义脚本。它们分为客户端钩子和服务器端钩子,这里主要介绍客户端钩子。
-
pre-commit: 在提交之前运行,可以用来检查即将提交的文件是否符合规范,比如代码格式检查。
示例:创建一个
pre-commit
脚本,用于检查Python代码的PEP8规范。# 在.git/hooks目录下创建pre-commit文件,并赋予执行权限 echo '#!/bin/bash' > .git/hooks/pre-commit echo 'python -m pycodestyle .' >> .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
-
post-commit: 提交完成后运行,适合记录日志或触发CI/CD流程。
示例:简单记录每次提交的SHA到一个日志文件中。
# 在.git/hooks下创建post-commit文件 echo '#!/bin/bash' > .git/hooks/post-commit echo 'echo "Commit: $(git log -n 1 --pretty=format:%H)" >> commit_log.txt' >> .git/hooks/post-commit chmod +x .git/hooks/post-commit
Git内部机制浅析
Git的核心机制围绕着对象数据库、索引(stage)以及工作目录。它通过SHA-1哈希值来唯一标识每一个数据对象(包括文件内容、提交信息等)。
- 对象数据库: 存储所有版本的数据,分为四种类型:blob(文件内容)、tree(目录结构)、commit(提交信息)和tag(标签)。
- 索引(Stage): 作为临时区域,存储即将被提交的文件变更。使用
git add
命令可以将修改添加到索引区。 - 工作目录: 用户实际操作的文件夹,与Git仓库交互的直接场所。
使用Git进行代码审查
Git与代码审查工具如GitHub Pull Requests、GitLab Merge Requests紧密集成,支持代码审查流程。
-
创建分支: 开发新功能或修复问题时,从主分支创建新分支进行开发。
git checkout -b feature-branch
-
提交更改: 完成工作后,提交更改。
git add . git commit -m "Add feature description"
-
发起Pull Request: 在GitHub或GitLab上,从你的分支发起一个Pull Request到目标分支(通常是master或main)。
-
代码审查: 团队成员可以在Pull Request页面查看更改,提出评论和建议。
-
合并更改: 经过审查和讨论后,合并分支并删除之。
git fetch upstream git merge upstream/master git push origin feature-branch --delete
通过这些步骤,Git不仅作为一个版本控制系统,还支持了高效的团队协作和代码质量保证过程。
Git教程 - 资源与工具推荐
本节将为您推荐一些Git学习和使用的优质资源,包括图形界面工具、在线学习平台以及书籍,旨在帮助您更高效地掌握Git版本控制系统。
Git图形界面工具推荐
1. GitHub Desktop
- 简介: GitHub官方推出的免费Git客户端,适用于Windows和macOS。它提供了直观的用户界面,适合Git初学者及习惯图形操作的用户。
- 特点:
- 简洁的界面设计,易于上手。
- 直观的分支管理,合并请求操作。
- 无缝集成GitHub仓库,便于快速推送和拉取。
2. SourceTree
- 简介: Atlassian开发的一款免费Git和Mercurial桌面客户端,支持Windows和macOS。提供了高级功能,如图形化的提交历史查看。
- 特点:
- 强大的可视化工具,便于理解分支结构。
- 支持多种版本控制系统。
- 高级操作如 cherry-pick 和 rebase 的图形化界面。
3. TortoiseGit
- 简介: 专为Windows环境设计的Git客户端,它集成在Windows资源管理器中。
- 特点:
- 右键菜单快速访问Git命令。
- 适合习惯于Windows操作系统的用户。
- 免费且开源。
在线学习资源
1. GitHub Learning Lab
- 简介: 由GitHub提供的免费在线学习平台,通过实际操作的课程帮助用户学习Git和GitHub。
- 特色:
- 实践性强,边学边做。
- 覆盖从基础到进阶的各种课程。
- 互动式学习体验,即时反馈。
2. Codecademy’s Learn Git
- 简介: Codecademy提供的Git课程,适合完全的初学者,通过互动式教学教授Git基础。
- 特色:
- 逐步指导,深入浅出。
- 实际编码练习。
- 结合理论与实践。
3. GitKraken Git GUI
- 学习中心: 提供了丰富的Git教程和指南,不仅限于其工具的使用,还包括Git的基本概念和进阶技巧。
- 特色:
- 内容全面,适合不同水平的学习者。
- 结合工具实践,加深理解。
Git书籍推荐
1. 《Pro Git》
- 作者: Scott Chacon and Ben Straub
- 简介: 这本书是Git领域的权威之作,不仅适合初学者,也适合想要深入学习Git高级特性的开发者。提供了详尽的Git指南,从基础到高级,还有Git内部工作机制的解释。
- 特色:
- 免费在线阅读版本可获取。
- 详细、全面,适合系统学习。
- 英文原版和中文翻译版均广泛可用。
2. 《Git实战》
- 作者: 杰瑞米·卡里伯特
- 简介: 通过实例讲解Git的使用方法,适合需要将Git应用到实际项目中的开发者。
- 特色:
- 实战导向,解决实际问题。
- 易于理解,适合项目管理场景。
以上推荐的工具、在线资源和书籍都是学习和掌握Git的强大助手。无论是初学者还是经验丰富的开发者,都能从中找到适合自己的学习路径。
5 源码及教程
本文代码参照MetaGPT
官方教程编写。官方教程地址为:https://deepwisdom.feishu.cn/wiki/MLILw0EdRiyiYRkJLgOcskyAnUh
官方教程使用的0.6.6的版本,我使用的是0.8.0的版本,代码稍有不同。所以我们直接上源码
import asyncio
from datetime import datetime
from typing import Dict
from metagpt.actions import Action
from metagpt.const import TUTORIAL_PATH
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.roles.role import RoleReactMode
from metagpt.schema import Message
from metagpt.utils.common import OutputParser
from metagpt.utils.file import Fileclass WriteDirectory(Action):name:str = "WorkDirectory"language:str = "chinese"async def run(self,topic:str, *args, **kwargs) -> Dict:COMMON_PROMPT = """You ara a seasoned technical professional in the filed of internet,we need you to write a technical tutorial with the topic "{topic}"你现在是互联网领域经验丰富的技术人员,我们需要你撰写一个关于"{topic}"的技术教程"""DIRECTORY_PROMPT = COMMON_PROMPT + """Please provide the specific table of contents for this tutorial,strictly following the requirements:1.The output must be strictly in the specified language,{language}.2.Answer strictly in the dictionary format like {{"title":"xxx","directory":[{{"dir1":["sub dir1","sub dir2"]}},{{"dir2":["sub dir3","sub dir4"]}}]}}3.The directory should be as spcific and sufficient as possible,with a primary and secondary directory.The secondary directory is in the arrya.4.Do not hava extra spaces or line breaks.5.Each directory title has practical significance.请按照以下要求提供本教程的具体目录:1.输出必须严格制定语言,{language}.2.回答必须严格按照字典格式,如{{"title":"xxx","directory":[{{"dir1":["sub dir1","sub dir2"]}},{{"dir2":["sub dir3","sub dir4"]}}]}}3.目录应尽可能具体和充分,包括一级和二级目录,二级目录在数组中。4.不要有多余的空格和换行。5.每个目录和标题都具有实际意义。"""prompt = DIRECTORY_PROMPT.format(topic=topic,language=self.language)resp = await self._aask(prompt=prompt)return OutputParser.extract_struct(resp,dict)class WriteContent(Action):name:str = "WriteContent"directory:dict = dict()language:str = "Chinese"async def run(self,topic:str, *args, **kwargs) -> str:COMMOM_PROMPT = """You ara a seasoned technical professional in the filed of internet,we need you to write a technical tutorial with the topic "{topic}""""CONTENT_PROMPT= COMMOM_PROMPT + """Now i will give you the module directory titles for the topic.Please output the detailed principle content of this title in detail.If there are code examples,please provide them according to standrad code specifications.Without a code example,it is not necessary.The module directory titles for the topic is as follows:{directory}Strictly limit output according to the following requirements:1.Follow the markdown sytax format for layout.2.If there are code examples,the must follow standard sytax specifications,have document annotations,and be displayed in code blocks.3.The output must be strictly in the specified language ,{language}.4.Do not have redudant output , including concluding remarks.5.Strict requirement not to output the topic "{topic}" 现在我将为您提供该主题的模块目录标题。请详细输出此标题的详细原理内容。如果有代码示例,请按照标准代码规范提供。没有代码示例则不需要提供。该主题的模块目录如下:{directory}严格按照以下限制输出:1.遵循markdown语法格式进行布局。2.如果有代码示例,必须遵循标准语法规范,具备文档注释,并以代码形式块展示。3.输出必须严格使用指定语言{language}4.严禁输出主题"{topic}""""prompt = CONTENT_PROMPT.format(topic=topic,language=self.language,directory=self.directory)return await self._aask(prompt=prompt)class TutorialAssistant(Role):name:str = "Stitch"profile:str = "TutorialAssistant"goal:str = "Generate tutorial documents"constraints:str = "Strictly follow Markdown's sytax,with neat and standardized layout"language:str = "Chinese"topic:str = ""main_title:str = ""total_content:str = ""def __init__(self,**kwargs):super().__init__(**kwargs)self.set_actions([WriteDirectory(language=self.language)])self._set_react_mode(react_mode=RoleReactMode.BY_ORDER.value)async def react(self) -> Message:msg = await super().react()root_path = TUTORIAL_PATH / datetime.now().strftime("%Y-%m-%d_%H-%M-%S")await File.write(root_path,f"{self.main_title}.md",self.total_content.encode('utf-8'))return msgasync def _think(self) -> None:if self.rc.todo is None:self._set_state(0)returnif self.rc.state + 1 < len(self.states):self._set_state(self.rc.state+1)else:self.rc.todo = Noneasync def _act(self) -> Message:todo = self.rc.todoif(type(todo) is WriteDirectory):msg = self.rc.memory.get(k=1)[0]self.topic = msg.contentresp = await todo.run(topic=self.topic)logger.info(resp)await self._handle_directory(resp)return await super().react()resp = await todo.run(topic=self.topic)logger.info(resp)if self.total_content != "":self.total_content += "\n\n\n"self.total_content += respreturn Message(content=resp,role=self.profile)async def _handle_directory(self,titles:Dict) -> Message:#记录目录标题,方便最后输出文档self.main_title = titles.get("title")directory = f"{self.main_title}\n"#记录要输出的所有内容self.total_content += f"#{self.main_title}"actions = list()for first_dir in titles.get("directory"):#根据目录结构来生成新的需要行动的action,目前只设计了两层目录actions.append(WriteContent(language=self.language,directory=first_dir))key = list(first_dir.keys())[0]for second_dir in first_dir[key]:directory += f" - {second_dir}\n"self.set_actions(actions)async def main():msg = "Git教程"role = TutorialAssistant()logger.info(msg)result = await role.run(msg)logger.info(result)asyncio.run(main())
更多精彩内容见公众号AIGIS