smart_prompt 0.5.0 → 0.5.1
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/CHANGELOG.md +18 -2
- data/README.cn.md +55 -4
- data/README.md +55 -4
- data/docs/ANTHROPIC_EXAMPLES.md +559 -0
- data/docs/CONVERSATION_INTEGRATION_SUMMARY.md +155 -0
- data/docs/HISTORY_EXAMPLES_README.md +533 -0
- data/docs/HISTORY_MANAGEMENT_GUIDE.md +797 -0
- data/docs/MONITORING_GUIDE.md +278 -0
- data/docs/MULTIMODAL_README.md +265 -0
- data/docs/RELEVANCE_BASED_STRATEGY_IMPLEMENTATION.md +124 -0
- data/docs/STT_README.md +302 -0
- data/docs/TTS_README.md +303 -0
- data/docs/VIDEO_GENERATION_README.md +246 -0
- data/docs/delete_files_list.md +124 -0
- data/lib/smart_prompt/anthropic_adapter.rb +167 -140
- data/lib/smart_prompt/conversation.rb +195 -42
- data/lib/smart_prompt/engine.rb +20 -10
- data/lib/smart_prompt/openai_adapter.rb +25 -1
- data/lib/smart_prompt/version.rb +1 -1
- data/lib/smart_prompt/worker.rb +5 -2
- data/lib/smart_prompt.rb +2 -1
- metadata +33 -22
data/lib/smart_prompt/engine.rb
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
module SmartPrompt
|
|
2
2
|
class Engine
|
|
3
|
-
attr_reader :config_file, :config, :adapters, :current_adapter, :llms, :templates
|
|
3
|
+
attr_reader :config_file, :config, :adapters, :current_adapter, :llms, :models, :templates
|
|
4
4
|
attr_reader :stream_response, :history_manager
|
|
5
5
|
|
|
6
6
|
def initialize(config_file)
|
|
7
7
|
@config_file = config_file
|
|
8
8
|
@adapters = {}
|
|
9
9
|
@llms = {}
|
|
10
|
+
@models = {}
|
|
10
11
|
@templates = {}
|
|
11
12
|
@current_workers = {}
|
|
12
13
|
@history_messages = []
|
|
@@ -65,10 +66,7 @@ module SmartPrompt
|
|
|
65
66
|
SmartPrompt.logger = Logger.new(@config["logger_file"])
|
|
66
67
|
end
|
|
67
68
|
SmartPrompt.logger.info "Loading configuration from file: #{config_file}"
|
|
68
|
-
|
|
69
|
-
require "better_prompt"
|
|
70
|
-
BetterPrompt.setup(db_path: @config["better_prompt_db"])
|
|
71
|
-
end
|
|
69
|
+
@models = @config["models"] || {}
|
|
72
70
|
@config["adapters"].each do |adapter_name, adapter_class|
|
|
73
71
|
adapter_class = SmartPrompt.const_get(adapter_class)
|
|
74
72
|
@adapters[adapter_name] = adapter_class
|
|
@@ -134,15 +132,12 @@ module SmartPrompt
|
|
|
134
132
|
if result.class == String
|
|
135
133
|
recive_message = {
|
|
136
134
|
"role": "assistant",
|
|
137
|
-
"content": result,
|
|
135
|
+
"content": sanitize_history_content(result),
|
|
138
136
|
}
|
|
139
137
|
elsif result.class == Array
|
|
140
138
|
recive_message = nil
|
|
141
139
|
else
|
|
142
|
-
recive_message =
|
|
143
|
-
"role": result.dig("choices", 0, "message", "role"),
|
|
144
|
-
"content": result.dig("choices", 0, "message", "content").to_s + result.dig("choices", 0, "message", "tool_calls").to_s,
|
|
145
|
-
}
|
|
140
|
+
recive_message = assistant_history_message(result)
|
|
146
141
|
end
|
|
147
142
|
worker.conversation.add_message(recive_message) if recive_message
|
|
148
143
|
SmartPrompt.logger.info "Worker result is: #{result}"
|
|
@@ -196,6 +191,21 @@ module SmartPrompt
|
|
|
196
191
|
|
|
197
192
|
private
|
|
198
193
|
|
|
194
|
+
def assistant_history_message(result)
|
|
195
|
+
message = result.dig("choices", 0, "message") || {}
|
|
196
|
+
history_message = {
|
|
197
|
+
"role": message["role"] || "assistant",
|
|
198
|
+
"content": sanitize_history_content(message["content"].to_s),
|
|
199
|
+
}
|
|
200
|
+
tool_calls = message["tool_calls"]
|
|
201
|
+
history_message["tool_calls"] = tool_calls if tool_calls && !tool_calls.empty?
|
|
202
|
+
history_message
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def sanitize_history_content(content)
|
|
206
|
+
content.to_s.gsub(/<\|channel\>thought\n.*?<channel\|>/m, "")
|
|
207
|
+
end
|
|
208
|
+
|
|
199
209
|
# Recursively convert hash keys from strings to symbols
|
|
200
210
|
def symbolize_keys(hash)
|
|
201
211
|
return hash unless hash.is_a?(Hash)
|
|
@@ -31,7 +31,19 @@ module SmartPrompt
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
REQUEST_PARAMETER_KEYS = %w[
|
|
35
|
+
max_tokens
|
|
36
|
+
max_completion_tokens
|
|
37
|
+
top_p
|
|
38
|
+
top_k
|
|
39
|
+
response_format
|
|
40
|
+
tool_choice
|
|
41
|
+
parallel_tool_calls
|
|
42
|
+
seed
|
|
43
|
+
stop
|
|
44
|
+
].freeze
|
|
45
|
+
|
|
46
|
+
def send_request(messages, model = nil, temperature = 0.7, tools = nil, proc = nil, request_options = {})
|
|
35
47
|
SmartPrompt.logger.info "OpenAIAdapter: Sending request to OpenAI"
|
|
36
48
|
temperature = 0.7 if temperature == nil
|
|
37
49
|
if model
|
|
@@ -46,6 +58,8 @@ module SmartPrompt
|
|
|
46
58
|
messages: messages,
|
|
47
59
|
temperature: @config["temperature"] || temperature,
|
|
48
60
|
}
|
|
61
|
+
parameters.merge!(configured_request_parameters)
|
|
62
|
+
parameters.merge!(request_options || {})
|
|
49
63
|
if proc
|
|
50
64
|
parameters[:stream] = proc
|
|
51
65
|
end
|
|
@@ -99,5 +113,15 @@ module SmartPrompt
|
|
|
99
113
|
end
|
|
100
114
|
return response.dig("data", 0, "embedding")
|
|
101
115
|
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
def configured_request_parameters
|
|
120
|
+
REQUEST_PARAMETER_KEYS.each_with_object({}) do |key, parameters|
|
|
121
|
+
next unless @config.key?(key)
|
|
122
|
+
|
|
123
|
+
parameters[key.to_sym] = @config[key]
|
|
124
|
+
end
|
|
125
|
+
end
|
|
102
126
|
end
|
|
103
127
|
end
|
data/lib/smart_prompt/version.rb
CHANGED
data/lib/smart_prompt/worker.rb
CHANGED
|
@@ -11,8 +11,11 @@ module SmartPrompt
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def execute(params = {})
|
|
14
|
-
# Generate default session ID if using history and no session_id provided
|
|
15
|
-
|
|
14
|
+
# Generate default session ID if using history and no session_id provided.
|
|
15
|
+
# (Do NOT default to a literal "default" here — that would make every
|
|
16
|
+
# history-using worker share one session and leave the worker-name branch
|
|
17
|
+
# below as dead code, breaking per-worker session isolation.)
|
|
18
|
+
session_id = params[:session_id]
|
|
16
19
|
if params[:with_history] && !session_id && @engine.history_manager
|
|
17
20
|
session_id = "worker_#{@name}_#{Time.now.to_i}"
|
|
18
21
|
SmartPrompt.logger.info "Generated default session ID: #{session_id}"
|
data/lib/smart_prompt.rb
CHANGED
|
@@ -16,6 +16,7 @@ require File.expand_path('../smart_prompt/api_handler', __FILE__)
|
|
|
16
16
|
require File.expand_path('../smart_prompt/conversation', __FILE__)
|
|
17
17
|
require File.expand_path('../smart_prompt/llm_adapter', __FILE__)
|
|
18
18
|
require File.expand_path('../smart_prompt/openai_adapter', __FILE__)
|
|
19
|
+
require File.expand_path('../smart_prompt/anthropic_adapter', __FILE__)
|
|
19
20
|
require File.expand_path('../smart_prompt/llamacpp_adapter', __FILE__)
|
|
20
21
|
require File.expand_path('../smart_prompt/anthropic_adapter', __FILE__)
|
|
21
22
|
require File.expand_path('../smart_prompt/sensenova_adapter', __FILE__)
|
|
@@ -55,4 +56,4 @@ module SmartPrompt
|
|
|
55
56
|
log.progname = self.name
|
|
56
57
|
end
|
|
57
58
|
end
|
|
58
|
-
end
|
|
59
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: smart_prompt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.5.
|
|
4
|
+
version: 0.5.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- zhuang biaowei
|
|
@@ -29,42 +29,28 @@ dependencies:
|
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 8.
|
|
32
|
+
version: 8.3.0
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 8.
|
|
39
|
+
version: 8.3.0
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: json
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - "~>"
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: 2.
|
|
46
|
+
version: 2.19.4
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: 2.
|
|
54
|
-
- !ruby/object:Gem::Dependency
|
|
55
|
-
name: base64
|
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
|
57
|
-
requirements:
|
|
58
|
-
- - "~>"
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: 0.2.0
|
|
61
|
-
type: :runtime
|
|
62
|
-
prerelease: false
|
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
-
requirements:
|
|
65
|
-
- - "~>"
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: 0.2.0
|
|
53
|
+
version: 2.19.4
|
|
68
54
|
- !ruby/object:Gem::Dependency
|
|
69
55
|
name: safe_ruby
|
|
70
56
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -108,19 +94,19 @@ dependencies:
|
|
|
108
94
|
- !ruby/object:Gem::Version
|
|
109
95
|
version: 0.9.2.1
|
|
110
96
|
- !ruby/object:Gem::Dependency
|
|
111
|
-
name:
|
|
97
|
+
name: base64
|
|
112
98
|
requirement: !ruby/object:Gem::Requirement
|
|
113
99
|
requirements:
|
|
114
100
|
- - "~>"
|
|
115
101
|
- !ruby/object:Gem::Version
|
|
116
|
-
version: 0.
|
|
102
|
+
version: 0.3.0
|
|
117
103
|
type: :runtime
|
|
118
104
|
prerelease: false
|
|
119
105
|
version_requirements: !ruby/object:Gem::Requirement
|
|
120
106
|
requirements:
|
|
121
107
|
- - "~>"
|
|
122
108
|
- !ruby/object:Gem::Version
|
|
123
|
-
version: 0.
|
|
109
|
+
version: 0.3.0
|
|
124
110
|
- !ruby/object:Gem::Dependency
|
|
125
111
|
name: tiktoken_ruby
|
|
126
112
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -135,6 +121,20 @@ dependencies:
|
|
|
135
121
|
- - "~>"
|
|
136
122
|
- !ruby/object:Gem::Version
|
|
137
123
|
version: 0.0.6
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: anthropic
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '1.14'
|
|
131
|
+
type: :runtime
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - "~>"
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '1.14'
|
|
138
138
|
description: SmartPrompt provides a flexible DSL for managing prompts, interacting
|
|
139
139
|
with multiple LLMs, and creating composable task workers.
|
|
140
140
|
email:
|
|
@@ -153,6 +153,17 @@ files:
|
|
|
153
153
|
- config/multimodal_config.yml
|
|
154
154
|
- config/sensenova_config.yml
|
|
155
155
|
- config/zhipu_config.yml
|
|
156
|
+
- docs/ANTHROPIC_EXAMPLES.md
|
|
157
|
+
- docs/CONVERSATION_INTEGRATION_SUMMARY.md
|
|
158
|
+
- docs/HISTORY_EXAMPLES_README.md
|
|
159
|
+
- docs/HISTORY_MANAGEMENT_GUIDE.md
|
|
160
|
+
- docs/MONITORING_GUIDE.md
|
|
161
|
+
- docs/MULTIMODAL_README.md
|
|
162
|
+
- docs/RELEVANCE_BASED_STRATEGY_IMPLEMENTATION.md
|
|
163
|
+
- docs/STT_README.md
|
|
164
|
+
- docs/TTS_README.md
|
|
165
|
+
- docs/VIDEO_GENERATION_README.md
|
|
166
|
+
- docs/delete_files_list.md
|
|
156
167
|
- examples/anthropic_basic_chat.rb
|
|
157
168
|
- examples/anthropic_example.rb
|
|
158
169
|
- examples/anthropic_multimodal.rb
|