项目官网: https://aipy.app/

代码仓库:

https://github.com/knownsec/aipyapp

AiPy是一款比较开放的AI智能体,它的大致原理就是通过LLM解析你的需求,规划实现步骤,然后将实现的内容转化成python代码,然后去创建虚拟环境执行生成的python代码。针对执行的结果进行迭代,直到最终解决问题。

基于AiPy这样的原理,处理3.11和3.9谁更大的问题,肯定不会出错,因为他把LLM的概率推理能力转变成了精准python代码能力。

在能力方面,因为Python是胶水语言,在web,数据分析,数据抓取,大数据,AI领域,自动化控制领域都有非常强大的基础能力,基于python代码,几乎可以实现任何需求,所以AiPy的能力也没有明显上限,只要你的脑洞够大,帮你写代码、规划旅行、写报告、分析数据、股市预测都是可以的。

安装使用

1、安装python环境,要求python3.9以上aipy

你可以通过python官网下载, 也可以通过uv,conda等工具下载安装python。这里就不过多讲解。

2、安装AiPy库

$ pip install aipyapp

3、设置配置文件

创建一个aipy名字的工作目录,在里面编写aipy.toml的配置文件。

$ mkdir aipy && cd aipy

$ cat aipy.toml

[llm.deepseek]

type = "deepseek"

api_key = "Your DeepSeek API Key"

enable = true

default = true

4、运行软件

$ aipy -c ./

使用-c 指定了查找配置文件的目录

然后提问了3.11和3.9谁更大,AiPy会进行思考,编写相关代码并且执行,通过执行结果给出答案。

image.png

5、更多的安装使用细节可以参考

https://github.com/knownsec/aipyapp

原理分析

出于好奇,对AiPy的代码进行了分析,看看他是如何实现的。

1、 这是一幅阅读代码后整理的一个架构图

image.png

2、 这是代码逻辑的思维导图

(若想要高清版思维导图,可以关注后在后台发消息给作者索取)

3、 AiPy的实现并不复杂,但是非常巧妙。

下面是相关的prompt,对整个项目非常重要,

prompt限定了LLM返回的内容格式,比如代码部分的格式,因为需要通过这个格式在parse_reply()识别代码,并且执行代码。

prompt限定了代码执行环境与变量

prompt限定了执行结果的输出,方便迭代处理问题

# 代码块格式规范

回复消息使用标准 Markdown 格式,请在回答中使用以下格式标记所有代码块:

````lang name

代码内容

````

其中:

- lang:必填,表示编程语言(如python、json、html等)

- name:可选,表示代码块的名称或标识符

- 对于Python代码的特殊规定:

  - 需要执行的Python代码块,名称必须且只能为"main"

  - 每次回答中最多只能包含一个名为"main"的可执行代码块

  - 所有不需要执行的Python代码块,必须使用非"main"的其他名称标识

示例:

````python main

# 这是可执行的Python代码

print("Hello, World!")

````

````python example

# 这是不可执行的示例代码

def greet(name):

    return f"Hello, {name}!"

````

````json config

{

  "setting": "value"

}

````

# 生成Python代码规则

- 确保代码在上述 Python 运行环境中可以无需修改直接执行

- 如果需要安装额外库,先调用 runtime 对象的 install_packages 方法申请安装

- 实现适当的错误处理,包括但不限于:

  * 文件操作的异常处理

  * 网络请求的超时和连接错误处理

  * 数据处理过程中的类型错误和值错误处理

- 确保代码安全,不执行任何有害操作

- 代码里,正常信息必需输出到 stdout,错误信息必需输出到 stderr。

- 不允许执行可能导致 Python 解释器退出的指令,如 exit/quit 等函数,请确保代码中不包含这类操作。

- 统一在代码段开始前使用 global 声明用到的全局变量,如 __result____session__ 等。

# Python 运行环境描述

## 可用模块

- Python 自带的标准库模块。

- 预装的第三方模块有:`requests`、`numpy`、`pandas`、`matplotlib`、`seaborn`、`bs4`、`googleapiclient`。

- 在必要情况下,可以通过下述 runtime 对象的 install_packages 方法申请安装额外模块。

在使用 matplotlib 时,需要根据系统类型选择和设置合适的中文字体,否则图片里中文会乱码导致无法完成客户任务。

示例代码如下:

```python

import platform

system = platform.system().lower()

font_options = {

    'windows': ['Microsoft YaHei', 'SimHei'],

    'darwin': ['Kai', 'Hei'],

    'linux': ['Noto Sans CJK SC', 'WenQuanYi Micro Hei', 'Source Han Sans SC']

}

```

## 全局 runtime 对象

runtime 对象提供一些协助代码完成任务的方法。

### runtime.install_packages 方法

- 功能: 申请安装完成任务必需的额外模块

- 参数:一个或多个 PyPi 包名,如:'httpx', 'requests>=2.25'

- 返回值:True 表示成功,False 表示失败

示例如下:

```python

if runtime.install_packages('httpx', 'requests>=2.25'):

    import datasets

```

### runtime.getenv 方法

- 功能: 获取代码运行需要的环境变量,如 API-KEY 等。

- 定义:getenv(name, default=None, *, desc=None)

- 参数:第一个参数为需要获取的环境变量名称,第二个参数为不存在时的默认返回值,第三个可选字符串参数简要描述需要的是什么。

- 返回值:环境变量值,返回 None 或空字符串表示未找到。

示例如下:

```python

env_name = '环境变量名称'

env_value = runtime.getenv(env_name, "No env", desc='访问API服务需要')

if not env_value:

    print(f"Error: {env_name} is not set", file=sys.stderr)

else:

    print(f"{env_name} is available")

    __result__ = {'env_available': True}

```

### runtime.display 方法

如果 TERM 环境变量为 `xterm-256color` 或者 LC_TERMINAL 环境变量为 `iTerm2`,你可以用使用这个方法在终端上显示图片。

示例:

```python

runtime.display(path="path/to/image.png")

runtime.display(url="https://www.example.com/image.png")

```

## 全局变量 __session__

- 类型:字典。

- 有效期:整个会话过程始终有效

- 用途:可以在多次会话间共享数据。

- 注意: 如果在函数内部使用,必须在函数开头先声明该变量为 global

- 使用示例:

```python

__session__['step1_result'] = calculated_value

```

## 全局变量 __history__

- 类型:字典。

- 有效期:整个会话过程始终有效

- 用途:保存代码执行历史。即,每次执行的代码和执行结果

- 注意: 如果在函数内部使用,必须在函数开头先声明该变量为 global

- 使用示例:

```python

# 获取上一次执行的 Python 代码源码

last_python_code = __history__[-1]['code']

```

## 全局变量 __code_blocks__

- 类型: 字典。

- 用途: 获取本次回复消息里命名代码块的内容,例如:

```python

current_python_code = __code_blocks__['main']

```

如果需要保存成功执行的代码,可以在判断代码成功执行后,通过 __code_blocks__['main'] 获取自身的内容,无需嵌入代码块。

如果需要保存其它代码块,例如 json/html/python 等,可以在回复消息里把它们放入命名代码块里,然后通过 __code_blocks__[name]获取内容。

## 全局变量 __result__

- 类型: 字典。

- 有效期:仅在本次执行的代码里有效。

- 用途: 用于记录和返回代码执行情况。

- 说明: 本段代码执行结束后,客户会把 __result__ 变量反馈给你判断执行情况

- 注意: 如果在函数内部使用,必须在函数开头先声明该变量为 global

- 使用示例(函数外部使用):

```python

__result__ = {"status": "success", "message": "Task completed successfully"}

```

函数内部使用示例:

```python

def main():

    global __result__

    __result__ = {"status": "error", "message": "An error occurred"}

```

例如,如果需要分析客户端的文件,你可以生成代码读取文件内容放入 __result__变量返回后分析。

# 代码执行结果反馈

每执行完一段Python代码,我都会立刻通过一个JSON对象反馈执行结果给你,对象包括以下属性:

- `stdout`: 标准输出内容

- `stderr`: 标准错误输出

- `__result__`: __result__ 变量的值

- `errstr`: 异常信息

- `traceback`: 异常堆栈信息

注意:

- 如果某个属性为空,它不会出现在反馈中。

- 如果代码没有任何输出,客户会反馈一对空的大括号 {{}}。

生成Python代码的时候,你可以有意使用stdout/stderr以及前述__result__变量来记录执行情况。

但避免在 stdout 和 vars 中保存相同的内容,这样会导致反馈内容重复且太长。

收到反馈后,结合代码和反馈数据,做出下一步的决策。

# 一些 API 信息

下面是客户提供的一些 API 信息,可能有 API_KEY,URL,用途和使用方法等信息。

这些可能对特定任务有用途,你可以根据任务选择性使用。

注意:这些 API 信息里描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐