Skip to main content

Mistral AI

Mistral AI 是一个基于云的平台,为 Mistral 自己的 LLMs 提供服务。您可以直接使用 Mistral AI 的 API 来使用 AutoGen。

首先,您需要安装 pyautogen 包来使用 AutoGen。

! pip install pyautogen

现在,您可以设置您想要使用的 Mistral 模型。请参阅这里的模型列表

import os

config_list = [
{
# 选择您的模型名称。
"model": "mistral-large-latest",
"base_url": "https://api.mistral.ai/v1",
# 您需要在这里提供您的 API 密钥。
"api_key": os.environ.get("MISTRAL_API_KEY"),
}
]

两个代理的编码示例

在这个示例中,我们使用编码运行一个两个代理的聊天,以计算 1 到 10,000 之间的素数数量。

from pathlib import Path

from autogen import AssistantAgent, UserProxyAgent
from autogen.coding import LocalCommandLineCodeExecutor

# 设置代码执行器。
workdir = Path("coding")
workdir.mkdir(exist_ok=True)
code_executor = LocalCommandLineCodeExecutor(work_dir=workdir)

# 设置代理。
user_proxy_agent = UserProxyAgent(
name="User",
code_execution_config={"executor": code_executor},
is_termination_msg=lambda msg: "TERMINATE" in msg.get("content"),
)

assistant_agent = AssistantAgent(
name="Mistral Assistant",
llm_config={"config_list": config_list},
)
chat_result = user_proxy_agent.initiate_chat(
assistant_agent,
message="Count how many prime numbers from 1 to 10000.",
)
User (to Mistral Assistant):

Count how many prime numbers from 1 to 10000.

--------------------------------------------------------------------------------
Mistral Assistant (to User):

Sure, I can help with that. Here's a Python code snippet that counts the number of prime numbers from 1 to 10000.

```python
# filename: prime_counter.py

def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True

count = 0
for num in range(1, 10001):
if is_prime(num):
count += 1

print(count)
请将这段代码保存在名为 `prime_counter.py` 的文件中并运行。输出结果将是从1到10000之间的质数的数量。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。

>>>>>>>> 使用自动回复...

>>>>>>>> 执行代码块(推测语言为Python)...
用户(对Mistral助手):

退出码:0(执行成功)
代码输出:1229


--------------------------------------------------------------------------------
Mistral助手(对用户):

根据输出结果,我之前提供的代码已成功执行,并发现在1到10000之间有1229个质数。以下是我逐步完成此任务的步骤:

1. 我编写了一个名为 `is_prime(n)` 的Python函数,用于检查给定的数字 `n` 是否为质数。该函数如果 `n` 是质数则返回 `True`,否则返回 `False`。

2. 我使用一个for循环遍历从1到10000的数字,然后调用 `is_prime` 函数来判断当前数字是否为质数。如果是质数,我将计数器变量 `count` 增加1。

3. 循环结束后,我打印出计数器变量 `count` 的值,以显示给定范围内的质数总数。

输出结果 `1229` 证实了在1到10000之间确实有1229个质数。

终止

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
## 工具调用示例

在这个示例中,我们将使用工具调用来让两个代理人之间进行国际象棋对弈,而不是编写代码。

首先运行以下命令安装 `chess` 包:

```python
! pip install chess
```

编写下棋的函数。

```python
import random

import chess
import chess.svg
from IPython.display import display
from typing_extensions import Annotated

board = chess.Board()


def make_move() -> Annotated[str, "UCI 格式的下棋步骤"]:
moves = list(board.legal_moves)
move = random.choice(moves)
board.push(move)
# 显示棋盘。
display(chess.svg.board(board, size=400))
return str(move)
```

让我们创建代理人。我们有三个不同的代理人:
- `player_white` 是执白棋的代理人。
- `player_black` 是执黑棋的代理人。
- `board_proxy` 是移动棋子的代理人。

```python
from autogen import ConversableAgent, register_function

player_white = ConversableAgent(
name="Player White",
system_message="你是一名国际象棋选手,执白棋。" "请始终调用 make_move() 来下棋",
llm_config={"config_list": config_list, "cache_seed": None},
)

player_black = ConversableAgent(
name="Player Black",
system_message="你是一名国际象棋选手,执黑棋。" "请始终调用 make_move() 来下棋",
llm_config={"config_list": config_list, "cache_seed": None},
)

board_proxy = ConversableAgent(
name="Board Proxy",
llm_config=False,
# 只有 make_move 函数会得到响应。
is_termination_msg=lambda msg: "tool_calls" not in msg,
)
```

为代理人注册工具。有关更多信息,请参见[工具使用教程](../../../docs/tutorial/tool-use)。

```python
register_function(
make_move,
caller=player_white,
executor=board_proxy,
name="make_move",
description="下棋。",
)

register_function(
make_move,
caller=player_black,
executor=board_proxy,
name="make_move",
description="下棋。",
)
```

为玩家代理人注册嵌套对话。嵌套对话允许每个玩家代理人与棋盘代理人进行对话以进行下棋,然后再与另一个玩家代理人进行通信。有关更多信息,请参见[嵌套对话教程章节](../../../docs/tutorial/conversation-patterns#nested-chats)。

```python
player_white.register_nested_chats(
trigger=player_black,
chat_queue=[
{
"sender": board_proxy,
"recipient": player_white,
}
],
)

player_black.register_nested_chats(
trigger=player_white,
chat_queue=[
{
"sender": board_proxy,
"recipient": player_black,
}
],
)
```

开始国际象棋游戏。

```python
# 清空棋盘。
board = chess.Board()

chat_result = player_white.initiate_chat(
player_black,
message="让我们下国际象棋!轮到你了。",
max_turns=4,
)
```

``` text
白方选手(对黑方选手):

让我们下棋吧!轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始新的对话....

消息:
让我们下棋吧!轮到你了。

传递信息:


********************************************************************************
棋盘代理(对黑方选手):

让我们下棋吧!轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方选手(对棋盘代理):


***** 建议的工具调用(未找到工具调用 ID):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-2.svg)

``` text
棋盘代理(对黑方玩家):

棋盘代理(对黑方玩家):

***** 调用工具的响应(未找到id) *****
a2a3
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方玩家(对棋盘代理):

你下了一步棋:a2a3。现在轮到我了。

e2e4

轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
黑方玩家(对白方玩家):

你下了一步棋:a2a3。现在轮到我了。

e2e4

轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始新的聊天....

消息:
你下了一步棋:a2a3。现在轮到我了。

e2e4

轮到你了。

Carryover:


********************************************************************************
棋盘代理(对白方玩家):

你下了一步棋:a2a3。现在轮到我了。

e2e4

轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
白方玩家(对棋盘代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
```

![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-4.svg)
棋盘代理(给白方):

棋盘代理(给白方):

***** 调用工具的回应(未找到id) *****
e7e5
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
白方选手(给棋盘代理):

我下了一步棋:e7e5。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
白方选手(给黑方选手):

我下了一步棋:e7e5。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始新的对话....

消息:
我下了一步棋:e7e5。现在轮到你了。

请你走棋。

传递信息:


********************************************************************************
棋盘代理(给黑方选手):

我下了一步棋:e7e5。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方选手(给棋盘代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-6.svg)

``` text
黑方代理(给黑方玩家):

黑方代理(给黑方玩家):

***** 调用工具的回应(未找到id) *****
h2h4
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方玩家(给黑方代理):

我下了一步棋:h2h4。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 没有接收到人类输入。
黑方玩家(给白方玩家):

我下了一步棋:h2h4。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始新的对话....

消息:
我下了一步棋:h2h4。现在轮到你了。

请你走棋。

传递信息:


********************************************************************************
白方代理(给白方玩家):

我下了一步棋:h2h4。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
白方玩家(给白方代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
```

![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-8.svg)
``` text
玩家白色的棋盘代理:

玩家白色的棋盘代理:

***** 调用工具的响应(未找到id) *****
g8h6
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
玩家白色(给棋盘代理):

你移动了 g8h6。我移动了 g1g3。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
玩家白色(给玩家黑色):

你移动了 g8h6。我移动了 g1g3。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始新的对话....

消息:
你移动了 g8h6。我移动了 g1g3。现在轮到你了。

请你走棋。

Carryover:


********************************************************************************
棋盘代理(给玩家黑色):

你移动了 g8h6。我移动了 g1g3。现在轮到你了。

请你走棋。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
玩家黑色(给棋盘代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-10.svg)

``` text
黑方代理(对黑方玩家):

黑方代理(对黑方玩家):

***** 调用工具的响应(未找到id) *****
g1h3
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方玩家(对黑方代理):

你移动了 g8h6。我做出了一步移动:g1h3。你移动了 g1h3。现在轮到我了。

我做出了一步移动:d2d4。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
黑方玩家(对白方玩家):

你移动了 g8h6。我做出了一步移动:g1h3。你移动了 g1h3。现在轮到我了。

我做出了一步移动:d2d4。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始一次新的对话....

消息:
你移动了 g8h6。我做出了一步移动:g1h3。你移动了 g1h3。现在轮到我了。

我做出了一步移动:d2d4。轮到你了。

传递:


********************************************************************************
白方代理(对白方玩家):

你移动了 g8h6。我做出了一步移动:g1h3。你移动了 g1h3。现在轮到我了。

我做出了一步移动:d2d4。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
白方玩家(对白方代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
```

![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-12.svg)
``` text
玩家白方代理(给玩家白方):

玩家白方代理(给玩家白方):

***** 调用工具的响应(未找到id) *****
d8h4
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
玩家白方(给玩家白方代理):

你移动了 d8h4。我下了一步:d4d5。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
玩家白方(给玩家黑方):

你移动了 d8h4。我下了一步:d4d5。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

********************************************************************************
开始一个新的对话....

消息:
你移动了 d8h4。我下了一步:d4d5。轮到你了。

Carryover:


********************************************************************************
玩家黑方代理(给玩家黑方):

你移动了 d8h4。我下了一步:d4d5。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
玩家黑方(给玩家黑方代理):


***** 建议的工具调用(未找到工具调用id):make_move *****
参数:
{}
******************************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...

>>>>>>>> 执行函数 make_move...
![](cloud-mistralai_files/figure-markdown_strict/cell-11-output-14.svg)

``` text
棋盘代理(对黑方玩家):

棋盘代理(对黑方玩家):

***** 调用工具的响应(未找到id) *****
e2e4
****************************************************

--------------------------------------------------------------------------------

>>>>>>>> 使用自动回复...
黑方玩家(对棋盘代理):

你下了一步棋:e2e4。我下了一步棋:d5e4。轮到你了。

--------------------------------------------------------------------------------

>>>>>>>> 未收到人类输入。
黑方玩家(对白方玩家):

你下了一步棋:e2e4。我下了一步棋:d5e4。轮到你了。

--------------------------------------------------------------------------------
```