smart_prompt 0.4.4 → 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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/README.cn.md +305 -11
  4. data/README.md +309 -11
  5. data/Rakefile +10 -1
  6. data/config/anthropic_config.yml +151 -0
  7. data/config/image_generation_config.yml +22 -0
  8. data/config/multimodal_config.yml +85 -0
  9. data/config/sensenova_config.yml +63 -0
  10. data/config/zhipu_config.yml +73 -0
  11. data/docs/ANTHROPIC_EXAMPLES.md +559 -0
  12. data/docs/CONVERSATION_INTEGRATION_SUMMARY.md +155 -0
  13. data/docs/HISTORY_EXAMPLES_README.md +533 -0
  14. data/docs/HISTORY_MANAGEMENT_GUIDE.md +797 -0
  15. data/docs/MONITORING_GUIDE.md +278 -0
  16. data/docs/MULTIMODAL_README.md +265 -0
  17. data/docs/RELEVANCE_BASED_STRATEGY_IMPLEMENTATION.md +124 -0
  18. data/docs/STT_README.md +302 -0
  19. data/docs/TTS_README.md +303 -0
  20. data/docs/VIDEO_GENERATION_README.md +246 -0
  21. data/docs/delete_files_list.md +124 -0
  22. data/examples/anthropic_basic_chat.rb +143 -0
  23. data/examples/anthropic_example.rb +232 -0
  24. data/examples/anthropic_multimodal.rb +212 -0
  25. data/examples/anthropic_streaming.rb +312 -0
  26. data/examples/anthropic_tool_calling.rb +393 -0
  27. data/examples/automatic_cleanup_example.rb +109 -0
  28. data/examples/history_management_examples.rb +522 -0
  29. data/examples/image_generation_example.rb +130 -0
  30. data/examples/monitoring_example.rb +121 -0
  31. data/examples/multimodal_example.rb +63 -0
  32. data/examples/relevance_based_strategy_example.rb +87 -0
  33. data/examples/sensenova_example.rb +129 -0
  34. data/examples/stt_example.rb +287 -0
  35. data/examples/tts_example.rb +244 -0
  36. data/examples/video_generation_example.rb +189 -0
  37. data/examples/zhipu_example.rb +151 -0
  38. data/lib/smart_prompt/anthropic_adapter.rb +407 -298
  39. data/lib/smart_prompt/compression_engine.rb +201 -0
  40. data/lib/smart_prompt/context_strategy.rb +22 -0
  41. data/lib/smart_prompt/conversation.rb +47 -4
  42. data/lib/smart_prompt/engine.rb +29 -2
  43. data/lib/smart_prompt/history_manager.rb +596 -0
  44. data/lib/smart_prompt/hybrid_strategy.rb +222 -0
  45. data/lib/smart_prompt/image_generation_adapter.rb +297 -0
  46. data/lib/smart_prompt/lru_cache.rb +133 -0
  47. data/lib/smart_prompt/message.rb +57 -0
  48. data/lib/smart_prompt/multimodal_adapter.rb +277 -0
  49. data/lib/smart_prompt/persistence_layer.rb +197 -0
  50. data/lib/smart_prompt/relevance_based_strategy.rb +221 -0
  51. data/lib/smart_prompt/sensenova_adapter.rb +410 -0
  52. data/lib/smart_prompt/session.rb +140 -0
  53. data/lib/smart_prompt/sliding_window_strategy.rb +100 -0
  54. data/lib/smart_prompt/stt_adapter.rb +381 -0
  55. data/lib/smart_prompt/summary_based_strategy.rb +152 -0
  56. data/lib/smart_prompt/token_counter.rb +74 -0
  57. data/lib/smart_prompt/tts_adapter.rb +403 -0
  58. data/lib/smart_prompt/version.rb +1 -1
  59. data/lib/smart_prompt/video_generation_adapter.rb +330 -0
  60. data/lib/smart_prompt/worker.rb +28 -3
  61. data/lib/smart_prompt/zhipu_adapter.rb +616 -0
  62. data/lib/smart_prompt.rb +21 -0
  63. data/workers/history_management_examples.rb +407 -0
  64. data/workers/image_generation_workers.rb +119 -0
  65. data/workers/multimodal_workers.rb +110 -0
  66. data/workers/sensenova_workers.rb +62 -0
  67. data/workers/stt_workers.rb +195 -0
  68. data/workers/tts_workers.rb +388 -0
  69. data/workers/video_generation_workers.rb +264 -0
  70. data/workers/zhipu_workers.rb +113 -0
  71. metadata +88 -1
@@ -0,0 +1,264 @@
1
+ # Video Generation Workers for SmartPrompt
2
+ # These workers demonstrate the new video generation capabilities
3
+
4
+ # Text-to-video generation worker
5
+ SmartPrompt.define_worker :video_generator do
6
+ use "video_gen"
7
+ model "Wan-AI/Wan2.2-T2V-A14B"
8
+
9
+ # Prepare parameters for video generation
10
+ generation_params = {
11
+ prompt: params[:prompt],
12
+ duration: params[:duration] || 4,
13
+ resolution: params[:resolution] || "720p",
14
+ fps: params[:fps] || 24,
15
+ seed: params[:seed]
16
+ }
17
+
18
+ # Call the video generation adapter directly
19
+ adapter = engine.llms["video_gen"]
20
+ video_data = adapter.generate_video(
21
+ generation_params[:prompt],
22
+ model: params[:model],
23
+ duration: generation_params[:duration],
24
+ resolution: generation_params[:resolution],
25
+ fps: generation_params[:fps],
26
+ seed: generation_params[:seed]
27
+ )
28
+
29
+ # Wait for completion and download if requested
30
+ if params[:wait_for_completion]
31
+ completed_video = adapter.wait_for_video_completion(
32
+ video_data[:job_id],
33
+ check_interval: params[:check_interval] || 10,
34
+ timeout: params[:timeout] || 600
35
+ )
36
+
37
+ # Download video if URL is available
38
+ if completed_video[:video_url] && params[:download_to_file]
39
+ output_dir = params[:output_dir] || "./generated_videos"
40
+ filename_prefix = params[:filename_prefix] || "generated_video"
41
+ output_path = File.join(output_dir, "#{filename_prefix}_#{video_data[:job_id]}.mp4")
42
+
43
+ downloaded_file = adapter.download_video(completed_video[:video_url], output_path)
44
+ { video_data: completed_video, downloaded_file: downloaded_file }
45
+ else
46
+ { video_data: completed_video }
47
+ end
48
+ else
49
+ { video_data: video_data }
50
+ end
51
+ end
52
+
53
+ # Image-to-video generation worker
54
+ SmartPrompt.define_worker :image_to_video_generator do
55
+ use "video_gen"
56
+ model "Wan-AI/Wan2.2-I2V-A14B"
57
+
58
+ # Prepare parameters for image-to-video generation
59
+ generation_params = {
60
+ image_file: params[:image_file],
61
+ prompt: params[:prompt],
62
+ duration: params[:duration] || 4,
63
+ resolution: params[:resolution] || "720p",
64
+ fps: params[:fps] || 24,
65
+ seed: params[:seed]
66
+ }
67
+
68
+ # Call the image-to-video adapter directly
69
+ adapter = engine.llms["video_gen"]
70
+ video_data = adapter.create_video_from_image(
71
+ generation_params[:image_file],
72
+ generation_params[:prompt],
73
+ model: params[:model],
74
+ duration: generation_params[:duration],
75
+ resolution: generation_params[:resolution],
76
+ fps: generation_params[:fps],
77
+ seed: generation_params[:seed]
78
+ )
79
+
80
+ # Wait for completion and download if requested
81
+ if params[:wait_for_completion]
82
+ completed_video = adapter.wait_for_video_completion(
83
+ video_data[:job_id],
84
+ check_interval: params[:check_interval] || 10,
85
+ timeout: params[:timeout] || 600
86
+ )
87
+
88
+ # Download video if URL is available
89
+ if completed_video[:video_url] && params[:download_to_file]
90
+ output_dir = params[:output_dir] || "./generated_videos"
91
+ filename_prefix = params[:filename_prefix] || "image_to_video"
92
+ output_path = File.join(output_dir, "#{filename_prefix}_#{video_data[:job_id]}.mp4")
93
+
94
+ downloaded_file = adapter.download_video(completed_video[:video_url], output_path)
95
+ { video_data: completed_video, downloaded_file: downloaded_file }
96
+ else
97
+ { video_data: completed_video }
98
+ end
99
+ else
100
+ { video_data: video_data }
101
+ end
102
+ end
103
+
104
+ # Video status checker worker
105
+ SmartPrompt.define_worker :video_status_checker do
106
+ use "video_gen"
107
+
108
+ # Check video generation status
109
+ adapter = engine.llms["video_gen"]
110
+ status_data = adapter.check_video_status(params[:job_id])
111
+
112
+ # Download video if completed and requested
113
+ if status_data[:status] == "completed" && status_data[:video_url] && params[:download_to_file]
114
+ output_dir = params[:output_dir] || "./generated_videos"
115
+ filename_prefix = params[:filename_prefix] || "video"
116
+ output_path = File.join(output_dir, "#{filename_prefix}_#{params[:job_id]}.mp4")
117
+
118
+ downloaded_file = adapter.download_video(status_data[:video_url], output_path)
119
+ { status_data: status_data, downloaded_file: downloaded_file }
120
+ else
121
+ { status_data: status_data }
122
+ end
123
+ end
124
+
125
+ # Creative video generation worker
126
+ SmartPrompt.define_worker :creative_video_generator do
127
+ use "video_gen"
128
+ model "Wan-AI/Wan2.2-T2V-A14B"
129
+
130
+ # Prepare creative parameters
131
+ creative_params = {
132
+ prompt: params[:prompt] || "A beautiful animated scene",
133
+ duration: params[:duration] || 4,
134
+ resolution: params[:resolution] || "720p",
135
+ fps: params[:fps] || 24,
136
+ seed: params[:seed]
137
+ }
138
+
139
+ # Add creative style to prompt if specified
140
+ style_prompt = creative_params[:prompt]
141
+ if params[:video_style]
142
+ style_prompt = "#{style_prompt}, in the style of #{params[:video_style]}"
143
+ end
144
+
145
+ adapter = engine.llms["video_gen"]
146
+ video_data = adapter.generate_video(
147
+ style_prompt,
148
+ model: params[:model],
149
+ duration: creative_params[:duration],
150
+ resolution: creative_params[:resolution],
151
+ fps: creative_params[:fps],
152
+ seed: creative_params[:seed]
153
+ )
154
+
155
+ # Wait for completion and download if requested
156
+ if params[:wait_for_completion]
157
+ completed_video = adapter.wait_for_video_completion(
158
+ video_data[:job_id],
159
+ check_interval: params[:check_interval] || 10,
160
+ timeout: params[:timeout] || 600
161
+ )
162
+
163
+ if completed_video[:video_url] && params[:download_to_file]
164
+ output_dir = params[:output_dir] || "./creative_videos"
165
+ filename_prefix = params[:filename_prefix] || "creative_video"
166
+ output_path = File.join(output_dir, "#{filename_prefix}_#{video_data[:job_id]}.mp4")
167
+
168
+ downloaded_file = adapter.download_video(completed_video[:video_url], output_path)
169
+ { video_data: completed_video, downloaded_file: downloaded_file }
170
+ else
171
+ { video_data: completed_video }
172
+ end
173
+ else
174
+ { video_data: video_data }
175
+ end
176
+ end
177
+
178
+ # Product video generation worker
179
+ SmartPrompt.define_worker :product_video_generator do
180
+ use "video_gen"
181
+ model "Wan-AI/Wan2.2-T2V-A14B"
182
+
183
+ # Prepare product-specific parameters
184
+ product_params = {
185
+ prompt: params[:prompt] || "Professional product showcase",
186
+ duration: params[:duration] || 4,
187
+ resolution: params[:resolution] || "720p",
188
+ fps: params[:fps] || 24,
189
+ seed: params[:seed]
190
+ }
191
+
192
+ # Enhance prompt for product video
193
+ enhanced_prompt = "Professional product video, smooth animation, cinematic quality, #{product_params[:prompt]}"
194
+
195
+ adapter = engine.llms["video_gen"]
196
+ video_data = adapter.generate_video(
197
+ enhanced_prompt,
198
+ model: params[:model],
199
+ duration: product_params[:duration],
200
+ resolution: product_params[:resolution],
201
+ fps: product_params[:fps],
202
+ seed: product_params[:seed]
203
+ )
204
+
205
+ # Wait for completion and download if requested
206
+ if params[:wait_for_completion]
207
+ completed_video = adapter.wait_for_video_completion(
208
+ video_data[:job_id],
209
+ check_interval: params[:check_interval] || 10,
210
+ timeout: params[:timeout] || 600
211
+ )
212
+
213
+ if completed_video[:video_url] && params[:download_to_file]
214
+ output_dir = params[:output_dir] || "./product_videos"
215
+ filename_prefix = params[:filename_prefix] || "product_video"
216
+ output_path = File.join(output_dir, "#{filename_prefix}_#{video_data[:job_id]}.mp4")
217
+
218
+ downloaded_file = adapter.download_video(completed_video[:video_url], output_path)
219
+ { video_data: completed_video, downloaded_file: downloaded_file }
220
+ else
221
+ { video_data: completed_video }
222
+ end
223
+ else
224
+ { video_data: video_data }
225
+ end
226
+ end
227
+
228
+ # Batch video generation worker
229
+ SmartPrompt.define_worker :batch_video_generator do
230
+ use "video_gen"
231
+ model "Wan-AI/Wan2.2-T2V-A14B"
232
+
233
+ results = []
234
+
235
+ # Process multiple prompts
236
+ prompts = params[:prompts] || [params[:prompt]]
237
+ prompts.each_with_index do |prompt, index|
238
+ generation_params = {
239
+ prompt: prompt,
240
+ duration: params[:duration] || 4,
241
+ resolution: params[:resolution] || "720p",
242
+ fps: params[:fps] || 24,
243
+ seed: params[:seed] ? params[:seed] + index : nil
244
+ }
245
+
246
+ adapter = engine.llms["video_gen"]
247
+ video_data = adapter.generate_video(
248
+ generation_params[:prompt],
249
+ model: params[:model],
250
+ duration: generation_params[:duration],
251
+ resolution: generation_params[:resolution],
252
+ fps: generation_params[:fps],
253
+ seed: generation_params[:seed]
254
+ )
255
+
256
+ results << {
257
+ prompt: prompt,
258
+ video_data: video_data,
259
+ index: index
260
+ }
261
+ end
262
+
263
+ { batch_results: results }
264
+ end
@@ -0,0 +1,113 @@
1
+ # 智谱 AI (Zhipu BigModel) workers for SmartPrompt
2
+ #
3
+ # One worker per model category, reusing the standard DSL (`use`, `model`, `sys_msg`,
4
+ # `prompt`, `send_msg`) and the media helpers. Chat/vision/embed/image go through
5
+ # Conversation-delegated methods; video/tts/asr reach the adapter directly via
6
+ # engine.llms[...] (same pattern as workers/video_generation_workers.rb).
7
+ #
8
+ # `send_msg` transparently becomes streaming when the engine invokes the worker via
9
+ # call_worker_by_stream — so :glm_chat serves both sync and stream callers.
10
+
11
+ # 1. 文本对话 (sync + stream)
12
+ SmartPrompt.define_worker :glm_chat do
13
+ use "glm"
14
+ model params[:model] if params[:model]
15
+ sys_msg(params[:system] || "你是一个有帮助的中文助手,回答简洁准确。", params)
16
+ prompt(params[:prompt] || "你好,请介绍一下智谱GLM。")
17
+ send_msg
18
+ end
19
+
20
+ # 2. 图文多模态 (single image_url or image_urls array)
21
+ SmartPrompt.define_worker :glm_vision do
22
+ use "glm_vision"
23
+ model params[:model] if params[:model]
24
+ sys_msg("你是一个专业的多模态图像分析助手。", params)
25
+
26
+ content = [{ type: "text", text: params[:question] || "请描述这张图片中的内容。" }]
27
+ images = params[:image_urls] || [params[:image_url]]
28
+ images.each do |url|
29
+ content << { type: "image_url", image_url: { url: url } }
30
+ end
31
+ add_message({ role: "user", content: content })
32
+
33
+ send_msg
34
+ end
35
+
36
+ # 3. 向量模型
37
+ SmartPrompt.define_worker :glm_embed do
38
+ use "embedding"
39
+ model params[:model] if params[:model]
40
+ prompt(params[:text] || "智谱GLM大模型")
41
+ embeddings(params[:length] || 1024)
42
+ end
43
+
44
+ # 4. 文生图 (CogView / GLM-Image)
45
+ SmartPrompt.define_worker :cogview_image do
46
+ use "cogview"
47
+ model params[:model] if params[:model]
48
+ images = generate_image(params[:prompt], params)
49
+ if params[:save_to_file]
50
+ saved = save_image(images, params[:output_dir] || "./generated_images", params[:filename_prefix] || "zhipu")
51
+ { images: images, saved_files: saved }
52
+ else
53
+ images
54
+ end
55
+ end
56
+
57
+ # 5. 文生视频 (async: submit -> wait -> download)
58
+ SmartPrompt.define_worker :cogvideo_video do
59
+ use "cogvideo"
60
+ model params[:model] if params[:model]
61
+ adapter = engine.llms["cogvideo"]
62
+
63
+ submitted = adapter.generate_video(params[:prompt], params)
64
+ result = { submitted: submitted }
65
+
66
+ if params[:wait_for_completion]
67
+ completed = adapter.wait_for_video_completion(
68
+ submitted[:task_id],
69
+ check_interval: params[:check_interval] || 10,
70
+ timeout: params[:timeout] || 600
71
+ )
72
+ if completed[:video_url] && params[:download_to_file]
73
+ output_dir = params[:output_dir] || "./generated_videos"
74
+ prefix = params[:filename_prefix] || "zhipu_video"
75
+ output_path = File.join(output_dir, "#{prefix}_#{submitted[:task_id]}.mp4")
76
+ downloaded = adapter.download_video(completed[:video_url], output_path)
77
+ result = { submitted: submitted, video: completed, downloaded_file: downloaded }
78
+ else
79
+ result = { submitted: submitted, video: completed }
80
+ end
81
+ end
82
+ result
83
+ end
84
+
85
+ # 6. 语音合成 (GLM-TTS)
86
+ SmartPrompt.define_worker :glm_tts do
87
+ use "glm_tts"
88
+ model params[:model] if params[:model]
89
+ adapter = engine.llms["glm_tts"]
90
+
91
+ output_path = params[:output_path] || "./generated_audio/zhipu_tts.wav"
92
+ info = adapter.synthesize_to_file(
93
+ params[:text],
94
+ output_path,
95
+ voice: params[:voice],
96
+ model: params[:model],
97
+ response_format: params[:response_format] || "wav"
98
+ )
99
+ info
100
+ end
101
+
102
+ # 7. 语音识别 (GLM-ASR-2512)
103
+ SmartPrompt.define_worker :glm_asr do
104
+ use "glm_asr"
105
+ model params[:model] if params[:model]
106
+ adapter = engine.llms["glm_asr"]
107
+
108
+ adapter.transcribe_audio(
109
+ params[:audio_file],
110
+ model: params[:model],
111
+ language: params[:language]
112
+ )
113
+ 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.4.4
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - zhuang biaowei
@@ -107,6 +107,34 @@ dependencies:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
109
  version: 0.3.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: tiktoken_ruby
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: 0.0.6
117
+ type: :runtime
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
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'
110
138
  description: SmartPrompt provides a flexible DSL for managing prompts, interacting
111
139
  with multiple LLMs, and creating composable task workers.
112
140
  email:
@@ -120,19 +148,78 @@ files:
120
148
  - README.cn.md
121
149
  - README.md
122
150
  - Rakefile
151
+ - config/anthropic_config.yml
152
+ - config/image_generation_config.yml
153
+ - config/multimodal_config.yml
154
+ - config/sensenova_config.yml
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
167
+ - examples/anthropic_basic_chat.rb
168
+ - examples/anthropic_example.rb
169
+ - examples/anthropic_multimodal.rb
170
+ - examples/anthropic_streaming.rb
171
+ - examples/anthropic_tool_calling.rb
172
+ - examples/automatic_cleanup_example.rb
173
+ - examples/history_management_examples.rb
174
+ - examples/image_generation_example.rb
175
+ - examples/monitoring_example.rb
176
+ - examples/multimodal_example.rb
177
+ - examples/relevance_based_strategy_example.rb
178
+ - examples/sensenova_example.rb
179
+ - examples/stt_example.rb
180
+ - examples/tts_example.rb
181
+ - examples/video_generation_example.rb
182
+ - examples/zhipu_example.rb
123
183
  - lib/smart_prompt.rb
124
184
  - lib/smart_prompt/anthropic_adapter.rb
125
185
  - lib/smart_prompt/api_handler.rb
186
+ - lib/smart_prompt/compression_engine.rb
187
+ - lib/smart_prompt/context_strategy.rb
126
188
  - lib/smart_prompt/conversation.rb
127
189
  - lib/smart_prompt/db_adapter.rb
128
190
  - lib/smart_prompt/engine.rb
191
+ - lib/smart_prompt/history_manager.rb
192
+ - lib/smart_prompt/hybrid_strategy.rb
193
+ - lib/smart_prompt/image_generation_adapter.rb
129
194
  - lib/smart_prompt/llamacpp_adapter.rb
130
195
  - lib/smart_prompt/llm_adapter.rb
196
+ - lib/smart_prompt/lru_cache.rb
197
+ - lib/smart_prompt/message.rb
198
+ - lib/smart_prompt/multimodal_adapter.rb
131
199
  - lib/smart_prompt/openai_adapter.rb
200
+ - lib/smart_prompt/persistence_layer.rb
132
201
  - lib/smart_prompt/prompt_template.rb
202
+ - lib/smart_prompt/relevance_based_strategy.rb
203
+ - lib/smart_prompt/sensenova_adapter.rb
204
+ - lib/smart_prompt/session.rb
205
+ - lib/smart_prompt/sliding_window_strategy.rb
206
+ - lib/smart_prompt/stt_adapter.rb
207
+ - lib/smart_prompt/summary_based_strategy.rb
208
+ - lib/smart_prompt/token_counter.rb
209
+ - lib/smart_prompt/tts_adapter.rb
133
210
  - lib/smart_prompt/version.rb
211
+ - lib/smart_prompt/video_generation_adapter.rb
134
212
  - lib/smart_prompt/worker.rb
213
+ - lib/smart_prompt/zhipu_adapter.rb
135
214
  - sig/smart_prompt.rbs
215
+ - workers/history_management_examples.rb
216
+ - workers/image_generation_workers.rb
217
+ - workers/multimodal_workers.rb
218
+ - workers/sensenova_workers.rb
219
+ - workers/stt_workers.rb
220
+ - workers/tts_workers.rb
221
+ - workers/video_generation_workers.rb
222
+ - workers/zhipu_workers.rb
136
223
  homepage: https://github.com/zhuangbiaowei/smart_prompt
137
224
  licenses:
138
225
  - MIT