luo 0.1.5 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|