luo 0.1.5 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +100 -33
- data/README.zh.md +70 -0
- data/lib/luo/agent.rb +2 -0
- data/lib/luo/helpers.rb +7 -3
- data/lib/luo/init_project.rb +6 -2
- data/lib/luo/projects/time_agent.rb +1 -1
- data/lib/luo/projects/weather_agent.rb +1 -1
- data/lib/luo/version.rb +1 -1
- data/sig/luo/agent_runner_context.rbs +2 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a84123002f270556f69e6ac923c13a2d6d06c409307cdb9faa890b6fbde6d216
|
4
|
+
data.tar.gz: 5246496de3ac4dbe7eb367af5b5b749c2bc59a15b2d9a24303a25f99b3643ef2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84f8055ebd6583b4acdb48bf571eace3ba750d5d937e334e003fb03318defe768b80c5fb708c07fe21127b6beada99ad924b3e7ad71c8d495a3044a8af5ea95e
|
7
|
+
data.tar.gz: 7fa29b2e5473866e5822c7d5fbff1a3520eb2a456ed109aca2b6ff459bf88097c9399f4a06bef671a28decb7982c10ebe8ab1e392cf8e4e5027b0ab085c21d5e
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,34 +1,101 @@
|
|
1
1
|
# Luo
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
2
|
+
是一款基于大模型的开发框架(面向产品经理),当前支持大模型提供商有: OpenAI、星火大模型。通过DSL能够快速创作并且测试大模型的效果。
|
3
|
+
|
4
|
+
## 安装
|
5
|
+
```
|
6
|
+
gem install luo
|
7
|
+
```
|
8
|
+
|
9
|
+
## 环境变量说明
|
10
|
+
```Bash
|
11
|
+
OPENAI_ACCESS_TOKEN= # OpenAI的访问令牌
|
12
|
+
OPENAI_TEMPERATURE= # OpenAI的温度
|
13
|
+
OPENAI_LIMIT_HISTORY= # OpenAI的历史限制
|
14
|
+
AIUI_APP_KEY= # AIUI的AppKey
|
15
|
+
AIUI_APP_ID= # AIUI的AppId
|
16
|
+
XINGHUO_ACCESS_TOKEN= # 星火大模型的访问令牌
|
17
|
+
```
|
18
|
+
可以写在项目中的.env也可以放到系统环境变量中。
|
19
|
+
|
20
|
+
## 使用
|
21
|
+
|
22
|
+
### Hello World
|
23
|
+
1. mkdir demo
|
24
|
+
2. cd demo
|
25
|
+
3. luo init
|
26
|
+
4. 修改 .env 的环境变量
|
27
|
+
5. ruby application.rb
|
28
|
+
|
29
|
+
### Messages 说明
|
30
|
+
```ruby
|
31
|
+
# 创建一个 Messages 实例
|
32
|
+
messages = Luo::Messages.create
|
33
|
+
|
34
|
+
# 添加用户消息,包含文本内容和提示信息
|
35
|
+
messages.user(text: "Hello, world!", prompt: TTY::Prompt.new.ask("What's your name?"))
|
36
|
+
|
37
|
+
# 添加助手消息,来自文件
|
38
|
+
messages.assistant(file: 'welcome.md')
|
39
|
+
|
40
|
+
# 添加系统消息,包含文本内容和上下文信息
|
41
|
+
messages.system(text: "User logged in", context: { user_id: 123 })
|
42
|
+
|
43
|
+
# 将消息转换为数组并打印出来
|
44
|
+
puts messages.to_a.inspect
|
45
|
+
|
46
|
+
# 输出
|
47
|
+
[
|
48
|
+
{:role=>"system", :content=>"User logged in"},
|
49
|
+
{:role=>"user", :content=>"Hello, world!"},
|
50
|
+
{:role=>"assistant", :content=>"Welcome to our app!\n"}
|
51
|
+
]
|
52
|
+
```
|
53
|
+
注意:星火大模型的消息类型只支持:user、assistant
|
54
|
+
|
55
|
+
## History
|
56
|
+
Luo 内置了 MemoryHistory 用于处理用户历史对话记录
|
57
|
+
```ruby
|
58
|
+
history = Luo::MemoryHistory.new
|
59
|
+
history.user("Hello, world!")
|
60
|
+
history.assistant("Welcome to our app!")
|
61
|
+
puts history.to_a.inspect
|
62
|
+
|
63
|
+
# 输出
|
64
|
+
[
|
65
|
+
{:role=>"user", :content=>"Hello, world!"},
|
66
|
+
{:role=>"assistant", :content=>"Welcome to our app!"}
|
67
|
+
]
|
68
|
+
|
69
|
+
# 可以在 Messages 使用
|
70
|
+
messages = Luo::Messages.create(history: history)
|
71
|
+
```
|
72
|
+
|
73
|
+
## Helpers
|
74
|
+
`Luo::Helpers` 模块是一个包含了一些辅助方法的模块,可以在不同的上下文中重用这些方法。其中,包括了 `print_md` 和 `load_test` 两个方法。
|
75
|
+
|
76
|
+
`print_md` 方法用于将 Markdown 格式的文本转换为终端友好的格式,并打印出来。这个方法接受一个参数 `text`,表示需要转换和打印的 Markdown 格式的文本。使用 `print_md` 方法的示例代码如下:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
text = "# Hello, world!\n\nThis is a **Markdown** text."
|
80
|
+
Luo::Helpers.print_md(text)
|
81
|
+
```
|
82
|
+
|
83
|
+
在上面的示例中,首先定义了一个 Markdown 格式的文本 `text`,然后使用 `print_md` 方法将其转换为终端友好的格式,并打印出来。
|
84
|
+
|
85
|
+
`load_test` 方法用于从 YAML 格式的文件中加载测试数据,并对每个测试数据执行指定的块。这个方法接受两个参数:`path` 和块 `block`。其中 `path` 表示 YAML 文件的路径,块 `block` 表示对每个测试数据要执行的操作。使用 `load_test` 方法的示例代码如下:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
Luo::Helpers.load_test('tests.yml') do |test_data|
|
89
|
+
# 对每个测试数据执行的操作
|
90
|
+
puts test_data.inspect
|
91
|
+
end
|
92
|
+
```
|
93
|
+
在上面的示例中,我们使用 `load_test` 方法从 `tests.yml` 文件中加载测试数据,并使用块对每个测试数据进行操作。在这个示例中,我们只是简单地使用 `puts` 方法打印出每个测试数据的内容。实际使用中,块 `block` 可以根据需要执行更复杂的操作,例如执行测试用例、生成报告等。
|
94
|
+
|
95
|
+
## 补充资源
|
96
|
+
1. 基于embedding的知识库对话机器人:https://github.com/ankane/neighbor#openai-embeddings
|
97
|
+
```ruby
|
98
|
+
def fetch_embeddings(input)
|
99
|
+
Luo::OpenAI.new.create_embeddings(input)
|
100
|
+
end
|
101
|
+
```
|
data/README.zh.md
CHANGED
@@ -20,7 +20,77 @@ XINGHUO_ACCESS_TOKEN= # 星火大模型的访问令牌
|
|
20
20
|
## 使用
|
21
21
|
|
22
22
|
### Hello World
|
23
|
+
1. mkdir demo
|
24
|
+
2. cd demo
|
25
|
+
3. luo init
|
26
|
+
4. 修改 .env 的环境变量
|
27
|
+
5. ruby application.rb
|
23
28
|
|
29
|
+
### Messages 说明
|
30
|
+
```ruby
|
31
|
+
# 创建一个 Messages 实例
|
32
|
+
messages = Luo::Messages.create
|
33
|
+
|
34
|
+
# 添加用户消息,包含文本内容和提示信息
|
35
|
+
messages.user(text: "Hello, world!", prompt: TTY::Prompt.new.ask("What's your name?"))
|
36
|
+
|
37
|
+
# 添加助手消息,来自文件
|
38
|
+
messages.assistant(file: 'welcome.md')
|
39
|
+
|
40
|
+
# 添加系统消息,包含文本内容和上下文信息
|
41
|
+
messages.system(text: "User logged in", context: { user_id: 123 })
|
42
|
+
|
43
|
+
# 将消息转换为数组并打印出来
|
44
|
+
puts messages.to_a.inspect
|
45
|
+
|
46
|
+
# 输出
|
47
|
+
[
|
48
|
+
{:role=>"system", :content=>"User logged in"},
|
49
|
+
{:role=>"user", :content=>"Hello, world!"},
|
50
|
+
{:role=>"assistant", :content=>"Welcome to our app!\n"}
|
51
|
+
]
|
52
|
+
```
|
53
|
+
注意:星火大模型的消息类型只支持:user、assistant
|
54
|
+
|
55
|
+
## History
|
56
|
+
Luo 内置了 MemoryHistory 用于处理用户历史对话记录
|
57
|
+
```ruby
|
58
|
+
history = Luo::MemoryHistory.new
|
59
|
+
history.user("Hello, world!")
|
60
|
+
history.assistant("Welcome to our app!")
|
61
|
+
puts history.to_a.inspect
|
62
|
+
|
63
|
+
# 输出
|
64
|
+
[
|
65
|
+
{:role=>"user", :content=>"Hello, world!"},
|
66
|
+
{:role=>"assistant", :content=>"Welcome to our app!"}
|
67
|
+
]
|
68
|
+
|
69
|
+
# 可以在 Messages 使用
|
70
|
+
messages = Luo::Messages.create(history: history)
|
71
|
+
```
|
72
|
+
|
73
|
+
## Helpers
|
74
|
+
`Luo::Helpers` 模块是一个包含了一些辅助方法的模块,可以在不同的上下文中重用这些方法。其中,包括了 `print_md` 和 `load_test` 两个方法。
|
75
|
+
|
76
|
+
`print_md` 方法用于将 Markdown 格式的文本转换为终端友好的格式,并打印出来。这个方法接受一个参数 `text`,表示需要转换和打印的 Markdown 格式的文本。使用 `print_md` 方法的示例代码如下:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
text = "# Hello, world!\n\nThis is a **Markdown** text."
|
80
|
+
Luo::Helpers.print_md(text)
|
81
|
+
```
|
82
|
+
|
83
|
+
在上面的示例中,首先定义了一个 Markdown 格式的文本 `text`,然后使用 `print_md` 方法将其转换为终端友好的格式,并打印出来。
|
84
|
+
|
85
|
+
`load_test` 方法用于从 YAML 格式的文件中加载测试数据,并对每个测试数据执行指定的块。这个方法接受两个参数:`path` 和块 `block`。其中 `path` 表示 YAML 文件的路径,块 `block` 表示对每个测试数据要执行的操作。使用 `load_test` 方法的示例代码如下:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
Luo::Helpers.load_test('tests.yml') do |test_data|
|
89
|
+
# 对每个测试数据执行的操作
|
90
|
+
puts test_data.inspect
|
91
|
+
end
|
92
|
+
```
|
93
|
+
在上面的示例中,我们使用 `load_test` 方法从 `tests.yml` 文件中加载测试数据,并使用块对每个测试数据进行操作。在这个示例中,我们只是简单地使用 `puts` 方法打印出每个测试数据的内容。实际使用中,块 `block` 可以根据需要执行更复杂的操作,例如执行测试用例、生成报告等。
|
24
94
|
|
25
95
|
## 补充资源
|
26
96
|
1. 基于embedding的知识库对话机器人:https://github.com/ankane/neighbor#openai-embeddings
|
data/lib/luo/agent.rb
CHANGED
@@ -34,6 +34,8 @@ module Luo
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
alias_method :on_call_with_fallback, :on_call_with_final_result
|
38
|
+
|
37
39
|
def self.create_parameter_method(method_name, not_provided = Object.new, &block)
|
38
40
|
define_method(method_name.to_sym) do |content = not_provided|
|
39
41
|
if content === not_provided
|
data/lib/luo/helpers.rb
CHANGED
@@ -9,10 +9,14 @@ module Luo
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def load_test(path, &block)
|
12
|
-
YAML.load_file(path)
|
13
|
-
|
12
|
+
data = YAML.load_file(path)
|
13
|
+
if data.is_a?(Array)
|
14
|
+
data.each do |value|
|
15
|
+
yield(value)
|
16
|
+
end
|
17
|
+
else
|
18
|
+
yield(data)
|
14
19
|
end
|
15
20
|
end
|
16
|
-
|
17
21
|
end
|
18
22
|
end
|
data/lib/luo/init_project.rb
CHANGED
@@ -9,10 +9,14 @@ module Luo
|
|
9
9
|
end
|
10
10
|
def create_bundle_file()
|
11
11
|
puts "create Gemfile"
|
12
|
+
version = Luo::VERSION
|
12
13
|
unless File.exist?('Gemfile')
|
14
|
+
gemfile = <<-GEMFILE
|
15
|
+
source 'https://rubygems.org'
|
16
|
+
gem 'luo', '~> #{version}'
|
17
|
+
GEMFILE
|
13
18
|
File.open('Gemfile', 'w') do |file|
|
14
|
-
file.
|
15
|
-
file.puts("gem 'luo', '~> 0.1.5'")
|
19
|
+
file.write(gemfile)
|
16
20
|
end
|
17
21
|
end
|
18
22
|
end
|
@@ -2,7 +2,7 @@ class TimeAgent < Agent
|
|
2
2
|
agent_name '时间查询'
|
3
3
|
agent_desc '查询当前时间'
|
4
4
|
|
5
|
-
|
5
|
+
on_call_with_fallback do
|
6
6
|
Helpers.print_md "** call aiui time **"
|
7
7
|
messages = Luo::Messages.create.user(text: context.user_input)
|
8
8
|
response = Luo::AIUI.new.chat(messages)
|
@@ -4,7 +4,7 @@ class WeatherAgent < Agent
|
|
4
4
|
agent_name '天气查询'
|
5
5
|
agent_desc '查询城市的天气情况,穿衣指数,空气质量等'
|
6
6
|
|
7
|
-
|
7
|
+
on_call_with_fallback do
|
8
8
|
Helpers.print_md "** call aiui weather **"
|
9
9
|
messages = Luo::Messages.create.user(text: context.user_input)
|
10
10
|
response = Luo::AIUI.new.chat(messages)
|
data/lib/luo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: luo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- MJ
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|