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.
@@ -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
- if @config["better_prompt_db"]
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
- def send_request(messages, model = nil, temperature = 0.7, tools = nil, proc = nil)
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
@@ -1,3 +1,3 @@
1
1
  module SmartPrompt
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.1"
3
3
  end
@@ -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
- session_id = params[:session_id] || "default"
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.0
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.1.0
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.1.0
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.12.0
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.12.0
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: better_prompt
97
+ name: base64
112
98
  requirement: !ruby/object:Gem::Requirement
113
99
  requirements:
114
100
  - - "~>"
115
101
  - !ruby/object:Gem::Version
116
- version: 0.2.1
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.2.1
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