klue-langcraft 0.0.7 → 0.1.0
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 +7 -0
- data/docs/dsl-examples.md +105 -0
- data/docs/dsl-rules.md +0 -107
- data/docs/dsl-samples/index.md +4 -0
- data/docs/dsl-samples/youtube-launch-optimizer-old.klue +300 -0
- data/docs/dsl-samples/youtube-launch-optimizer-strawberry.json +132 -0
- data/docs/dsl-samples/youtube-launch-optimizer-strawberry.klue +47 -0
- data/docs/dsl-samples/youtube-launch-optimizer.defn.klue +1 -8
- data/docs/dsl-samples/youtube-launch-optimizer.json +337 -0
- data/lib/klue/langcraft/-brief.md +357 -0
- data/lib/klue/langcraft/parser.rb +78 -0
- data/lib/klue/langcraft/sample_usage.rb +15 -0
- data/lib/klue/langcraft/tokenizer.rb +20 -0
- data/lib/klue/langcraft/version.rb +1 -1
- data/package-lock.json +2 -2
- data/package.json +1 -1
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f512e176bfdc09449895ba8775adc469ef781527160585aa61a0c14b4436041
|
4
|
+
data.tar.gz: 1a36e20159e2d80413bd440abd42f70f5e033ac08ed14ad018b567b3c76e6ad0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1f4d04d74426eae5675a1d45df6a6de92a23e913c1ab75fedc8762e763f4b31435d3f7f30e36c9ef0511015b201f90fe1c5b2735a94f305cdcd80f5abbe8922
|
7
|
+
data.tar.gz: 2f102d4c6f195477cd524c9cf919637d8cbdaa5e7ac0cbfad7ed4b7cbf5d24e65793d36838e4414e5bded37278f03c9b56f7d3096fd3db6d9a6950802ae107dc
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## [0.0.7](https://github.com/appydave/klue-langcraft/compare/v0.0.6...v0.0.7) (2024-09-21)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* update documentation for usecases ([077689e](https://github.com/appydave/klue-langcraft/commit/077689e085b667b3ac29dd2798b6b38e39a28923))
|
7
|
+
|
1
8
|
## [0.0.6](https://github.com/appydave/klue-langcraft/compare/v0.0.5...v0.0.6) (2024-09-20)
|
2
9
|
|
3
10
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# DSL Examples
|
2
|
+
|
3
|
+
The following examples will build on top of one another to create an Agent as Code DSL designed for Agent Workflows.
|
4
|
+
|
5
|
+
The example workflow will ben implementation of the agent as code for YouTube Launch Optimization.
|
6
|
+
|
7
|
+
### Root Node (#1).
|
8
|
+
|
9
|
+
The root node for a DSL is named `definition`, it behaves like any other `node` accept that you provide the DSL name.
|
10
|
+
|
11
|
+
An agentic workflow might take a name and optional description.
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
# Sample DSL
|
15
|
+
workflow :youtube_launch_optimizer, 'Optimize the video publishing for YouTube Titles, Descriptions, Thumbnails and social content' do
|
16
|
+
end
|
17
|
+
```
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
# DSL Definition
|
21
|
+
definition :workflow do
|
22
|
+
param :name, type: :positional
|
23
|
+
param :description, type: :positional, default: nil
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
### Root Node (#2).
|
28
|
+
|
29
|
+
An agentic workflow might take a name only and use a child node for description using a self closing syntax.
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
# Sample DSL
|
33
|
+
workflow :youtube_launch_optimizer do
|
34
|
+
description 'Optimize the video publishing for YouTube Titles, Descriptions, Thumbnails and social content'
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
```ruby
|
39
|
+
# DSL Definition
|
40
|
+
definition :workflow do
|
41
|
+
param :name, type: :positional
|
42
|
+
node :description do
|
43
|
+
param :description, type: :positional
|
44
|
+
end
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
### Single Node with List (#3)
|
49
|
+
|
50
|
+
Here we have a single node called settings with a list of setting that contains a key and a value.
|
51
|
+
Notice `repeat: true` is used to indicate that the setting is a repeatable element.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
# Sample DSL
|
55
|
+
|
56
|
+
workflow :youtube_launch_optimizer do
|
57
|
+
settings do
|
58
|
+
setting :prompt_path, 'prompts/youtube/launch_optimizer'
|
59
|
+
setting :default_llm, :gpt4o
|
60
|
+
end
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
```ruby
|
65
|
+
# DSL Definition
|
66
|
+
definition :workflow do
|
67
|
+
param :name, type: :positional
|
68
|
+
node :settings do
|
69
|
+
node :setting, repeat: true do
|
70
|
+
param :key, type: :positional
|
71
|
+
param :value, type: :positional
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
```
|
76
|
+
|
77
|
+
### Single Node with list - declaritve syntax (#4)
|
78
|
+
|
79
|
+
Like before, we have a single node called settings with a list of setting that contains a key and a value.
|
80
|
+
This time the you can use the method name as the first paramater value because it is of type declarative.
|
81
|
+
This can make some DSL usage a little easier to understand
|
82
|
+
|
83
|
+
```ruby
|
84
|
+
# Sample DSL
|
85
|
+
|
86
|
+
workflow :youtube_launch_optimizer do
|
87
|
+
settings do
|
88
|
+
prompt_path 'prompts/youtube/launch_optimizer'
|
89
|
+
default_llm :gpt4o
|
90
|
+
end
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
94
|
+
```ruby
|
95
|
+
# DSL Definition
|
96
|
+
definition :workflow do
|
97
|
+
param :name, type: :positional
|
98
|
+
node :settings do
|
99
|
+
node :setting, repeat: true do
|
100
|
+
param :key, type: :declaritive # the method name typed in will be come the value for the key paramater
|
101
|
+
param :value, type: :positional
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
data/docs/dsl-rules.md
CHANGED
@@ -39,7 +39,6 @@ param :a, type: :positional # required: true
|
|
39
39
|
param :b, type: :positional # required: true
|
40
40
|
```
|
41
41
|
|
42
|
-
|
43
42
|
#### 2. Optional Parameters
|
44
43
|
- **Description**: These are positional parameters with default values, making them optional.
|
45
44
|
- **Ruby Example**: `def method(a = 1)`
|
@@ -154,109 +153,3 @@ A container can take parameters based on the defined styles, but they must follo
|
|
154
153
|
5. The double splat parameter, if present, must be the last parameter.
|
155
154
|
6. You can't have more than one splat or double splat parameter in a container.
|
156
155
|
7. Once you start using keyword parameters, you can't use positional parameters anymore in that container.
|
157
|
-
|
158
|
-
## Examples
|
159
|
-
|
160
|
-
The following examples will build on top of one another to create an Agent as Code DSL designed for Agent Workflows.
|
161
|
-
|
162
|
-
The example workflow will ben implementation of the agent as code for YouTube Launch Optimization.
|
163
|
-
|
164
|
-
### Root Node (#1).
|
165
|
-
|
166
|
-
The root node for a DSL is named `definition`, it behaves like any other `node` accept that you provide the DSL name.
|
167
|
-
|
168
|
-
An agentic workflow might take a name and optional description.
|
169
|
-
|
170
|
-
```ruby
|
171
|
-
# Sample DSL
|
172
|
-
workflow :youtube_launch_optimizer, 'Optimize the video publishing for YouTube Titles, Descriptions, Thumbnails and social content' do
|
173
|
-
end
|
174
|
-
```
|
175
|
-
|
176
|
-
```ruby
|
177
|
-
# DSL Definition
|
178
|
-
definition :workflow do
|
179
|
-
param :name, type: :positional
|
180
|
-
param :description, type: :positional, default: nil
|
181
|
-
end
|
182
|
-
```
|
183
|
-
|
184
|
-
### Root Node (#2).
|
185
|
-
|
186
|
-
An agentic workflow might take a name only and use a child node for description using a self closing syntax.
|
187
|
-
|
188
|
-
```ruby
|
189
|
-
# Sample DSL
|
190
|
-
workflow :youtube_launch_optimizer do
|
191
|
-
description 'Optimize the video publishing for YouTube Titles, Descriptions, Thumbnails and social content'
|
192
|
-
end
|
193
|
-
```
|
194
|
-
|
195
|
-
```ruby
|
196
|
-
# DSL Definition
|
197
|
-
definition :workflow do
|
198
|
-
param :name, type: :positional
|
199
|
-
node :description do
|
200
|
-
param :description, type: :positional
|
201
|
-
end
|
202
|
-
end
|
203
|
-
```
|
204
|
-
|
205
|
-
### Single Node with List (#3)
|
206
|
-
|
207
|
-
Here we have a single node called settings with a list of setting that contains a key and a value.
|
208
|
-
Notice `repeat: true` is used to indicate that the setting is a repeatable element.
|
209
|
-
|
210
|
-
```ruby
|
211
|
-
# Sample DSL
|
212
|
-
|
213
|
-
workflow :youtube_launch_optimizer do
|
214
|
-
settings do
|
215
|
-
setting :prompt_path, 'prompts/youtube/launch_optimizer'
|
216
|
-
setting :default_llm, :gpt4o
|
217
|
-
end
|
218
|
-
end
|
219
|
-
```
|
220
|
-
|
221
|
-
```ruby
|
222
|
-
# DSL Definition
|
223
|
-
definition :workflow do
|
224
|
-
param :name, type: :positional
|
225
|
-
node :settings do
|
226
|
-
node :setting, repeat: true do
|
227
|
-
param :key, type: :positional
|
228
|
-
param :value, type: :positional
|
229
|
-
end
|
230
|
-
end
|
231
|
-
end
|
232
|
-
```
|
233
|
-
|
234
|
-
### Single Node with list - declaritve syntax (#4)
|
235
|
-
|
236
|
-
Like before, we have a single node called settings with a list of setting that contains a key and a value.
|
237
|
-
This time the you can use the method name as the first paramater value because it is of type declarative.
|
238
|
-
This can make some DSL usage a little easier to understand
|
239
|
-
|
240
|
-
```ruby
|
241
|
-
# Sample DSL
|
242
|
-
|
243
|
-
workflow :youtube_launch_optimizer do
|
244
|
-
settings do
|
245
|
-
prompt_path 'prompts/youtube/launch_optimizer'
|
246
|
-
default_llm :gpt4o
|
247
|
-
end
|
248
|
-
end
|
249
|
-
```
|
250
|
-
|
251
|
-
```ruby
|
252
|
-
# DSL Definition
|
253
|
-
definition :workflow do
|
254
|
-
param :name, type: :positional
|
255
|
-
node :settings do
|
256
|
-
node :setting, repeat: true do
|
257
|
-
param :key, type: :declaritive # the method name typed in will be come the value for the key paramater
|
258
|
-
param :value, type: :positional
|
259
|
-
end
|
260
|
-
end
|
261
|
-
end
|
262
|
-
```
|
@@ -0,0 +1,300 @@
|
|
1
|
+
dsl = Agent.create(:youtube_launch_optimizer) do
|
2
|
+
description 'This workflow optimizes video launch by analyzing, preparing, and generating content for various platforms.'
|
3
|
+
settings do
|
4
|
+
prompt_path Ad::AgentArchitecture.gem_relative_file('prompts/youtube/launch_optimizer')
|
5
|
+
default_llm :gpt4o
|
6
|
+
end
|
7
|
+
|
8
|
+
prompts do
|
9
|
+
prompt :video_summary_prompt , content: load_file('1-1-summarize-video.txt')
|
10
|
+
prompt :video_abridgement_prompt , content: load_file('1-2-1-abridge-video.txt')
|
11
|
+
prompt :abridgement_descrepencies_prompt , content: load_file('1-2-2-abridge-video-descrepencies.txt')
|
12
|
+
prompt :identify_chapters_prompt , content: load_file('2-1-identify-chapters.txt')
|
13
|
+
prompt :refine_chapters_prompt , content: load_file('2-2-refine-chapters.txt')
|
14
|
+
prompt :create_chapters_prompt , content: load_file('2-3-create-chapters.txt')
|
15
|
+
prompt :analyze_content_essence_prompt , content: load_file('3-1-analyze-content-essence.txt')
|
16
|
+
prompt :analyze_audience_engagement_prompt, content: load_file('3-2-analyze-audience-engagement.txt')
|
17
|
+
prompt :analyze_cta_competitors_prompt , content: load_file('3-3-analyze-cta-competitors.txt')
|
18
|
+
prompt :title_generation_prompt , content: load_file('4-1-generate-title.txt')
|
19
|
+
prompt :thumbnail_text_prompt , content: load_file('4-2-generate-thumbnail-text.txt')
|
20
|
+
prompt :thumbnail_visual_elements_prompt , content: load_file('4-3-thumbnail-visual-elements.txt')
|
21
|
+
prompt :yt_simple_description_prompt , content: load_file('5-1-yt-simple-description.txt')
|
22
|
+
prompt :yt_description_prompt , content: load_file('5-2-yt-write-description.txt')
|
23
|
+
prompt :yt_format_description_prompt , content: load_file('5-3-yt-format-description.txt')
|
24
|
+
prompt :yt_description_custom_gpt_prompt , content: load_file('5-4-yt-description-custom-gpt.txt')
|
25
|
+
prompt :yt_pinned_comment_prompt , content: load_file('5-5-yt-pinned-comment.txt')
|
26
|
+
prompt :yt_metadata_prompt , content: load_file('5-6-yt-meta-data.txt')
|
27
|
+
prompt :tweet_prompt , content: load_file('6-1-create-tweet.txt')
|
28
|
+
prompt :facebook_post_prompt , content: load_file('6-2-create-fb-post.txt')
|
29
|
+
prompt :linkedin_post_prompt , content: load_file('6-3-create-linkedin-post.txt')
|
30
|
+
end
|
31
|
+
|
32
|
+
attributes do
|
33
|
+
attribute :short_title, type: :string
|
34
|
+
attribute :transcript, type: :string
|
35
|
+
attribute :srt, type: :string
|
36
|
+
attribute :summary, type: :string
|
37
|
+
attribute :abridgement, type: :string
|
38
|
+
attribute :abridgement_descrepencies, type: :string
|
39
|
+
attribute :analyze_content_essence, type: :string
|
40
|
+
attribute :analyze_audience_engagement, type: :string
|
41
|
+
attribute :analyze_cta_competitors, type: :string
|
42
|
+
attribute :video_title, type: :string
|
43
|
+
attribute :video_url, type: :string
|
44
|
+
attribute :video_topic_theme, type: :string
|
45
|
+
attribute :video_related_links, type: :array
|
46
|
+
attribute :video_keywords, type: :array
|
47
|
+
attribute :video_description, type: :string
|
48
|
+
attribute :video_description_custom_gpt, type: :string
|
49
|
+
attribute :video_pinned_comment, type: :string
|
50
|
+
attribute :video_metadata, type: :string
|
51
|
+
attribute :content_highlights
|
52
|
+
attribute :identify_chapters, type: :string
|
53
|
+
attribute :refine_chapters, type: :string
|
54
|
+
attribute :chapters, type: :string
|
55
|
+
attribute :fold_cta, type: :string
|
56
|
+
attribute :primary_cta, type: :string
|
57
|
+
attribute :affiliate_cta, type: :array
|
58
|
+
attribute :brand_info, type: :string
|
59
|
+
attribute :title_ideas, type: :array
|
60
|
+
attribute :thumbnail_text, type: :string
|
61
|
+
attribute :thumbnail_visual_elements, type: :string
|
62
|
+
attribute :tweet_content, type: :string
|
63
|
+
attribute :facebook_post, type: :string
|
64
|
+
attribute :linkedin_post, type: :string
|
65
|
+
end
|
66
|
+
|
67
|
+
# Clean SRT
|
68
|
+
# Intro/Outro/Content Seperation
|
69
|
+
# Chapter Name Suggeestions
|
70
|
+
# B-Roll Suggestions
|
71
|
+
# section('Transcript Analysis') do
|
72
|
+
# step('')
|
73
|
+
# end
|
74
|
+
|
75
|
+
section('Video Preparation') do
|
76
|
+
step('Configure') do
|
77
|
+
input :brand_info
|
78
|
+
input :short_title
|
79
|
+
input :video_title
|
80
|
+
input :video_url
|
81
|
+
input :video_related_links
|
82
|
+
input :video_keywords
|
83
|
+
input :fold_cta
|
84
|
+
input :primary_cta
|
85
|
+
input :affiliate_cta
|
86
|
+
input :chapters
|
87
|
+
input :transcript
|
88
|
+
input :abridgement
|
89
|
+
input :summary
|
90
|
+
end
|
91
|
+
|
92
|
+
step('Script Summary') do
|
93
|
+
input :transcript
|
94
|
+
prompt :video_summary_prompt
|
95
|
+
output :summary
|
96
|
+
end
|
97
|
+
|
98
|
+
step('Script Abridgement') do
|
99
|
+
input :transcript
|
100
|
+
prompt :video_abridgement_prompt
|
101
|
+
output :abridgement
|
102
|
+
end
|
103
|
+
|
104
|
+
step('Abridge QA') do
|
105
|
+
input :transcript
|
106
|
+
input :abridgement
|
107
|
+
prompt :abridgement_descrepencies_prompt
|
108
|
+
output :abridgement_descrepencies
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
section('Build Chapters') do
|
113
|
+
step('Find Chapters') do
|
114
|
+
input :transcript
|
115
|
+
input :abridgement
|
116
|
+
prompt :identify_chapters_prompt
|
117
|
+
output :identify_chapters
|
118
|
+
end
|
119
|
+
|
120
|
+
step('Refine Chapters') do
|
121
|
+
input :identify_chapters
|
122
|
+
input :refine_chapters
|
123
|
+
prompt :refine_chapters_prompt
|
124
|
+
output :chapters
|
125
|
+
end
|
126
|
+
|
127
|
+
step('Create Chapters') do
|
128
|
+
input :chapters
|
129
|
+
input :srt
|
130
|
+
prompt :create_chapters_prompt
|
131
|
+
output :chapters
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
section('Content Analysis') do
|
136
|
+
step('Content Essence') do
|
137
|
+
input :abridgement
|
138
|
+
prompt :analyze_content_essence_prompt
|
139
|
+
output :analyze_content_essence
|
140
|
+
end
|
141
|
+
|
142
|
+
step('Audience Engagement') do
|
143
|
+
input :abridgement
|
144
|
+
prompt :analyze_audience_engagement_prompt
|
145
|
+
output :analyze_audience_engagement
|
146
|
+
end
|
147
|
+
|
148
|
+
step('CTA/Competitors') do
|
149
|
+
input :abridgement
|
150
|
+
prompt :analyze_cta_competitors_prompt
|
151
|
+
output :analyze_cta_competitors
|
152
|
+
end
|
153
|
+
|
154
|
+
# step('Analyze Video') do
|
155
|
+
# input :transcript
|
156
|
+
# prompt :analyze_content_essence_prompt
|
157
|
+
# output :video_topic
|
158
|
+
# output :video_keywords
|
159
|
+
# end
|
160
|
+
end
|
161
|
+
|
162
|
+
section('Title & Thumbnail') do
|
163
|
+
step('Title Ideas') do
|
164
|
+
input :short_title #
|
165
|
+
input :video_topic_theme # (Main Topic or Theme)
|
166
|
+
input :content_highlights # (Keywords/Insites/Takeaways/Audience-Related Insights)
|
167
|
+
prompt :title_generation_prompt
|
168
|
+
output :title_ideas
|
169
|
+
end
|
170
|
+
|
171
|
+
# Analyze Title Short List
|
172
|
+
# Here are the types of prompts or questions you've been writing:
|
173
|
+
|
174
|
+
# Title Analysis: Requesting evaluations of YouTube titles.
|
175
|
+
# Title Suggestions: Asking for new or varied title options.
|
176
|
+
# Title Optimization: Seeking ways to improve existing titles.
|
177
|
+
# Comparative Analysis: Comparing and analyzing different title versions.
|
178
|
+
# Content Strategy: Discussing factors influencing YouTube CTR.
|
179
|
+
# Instructional Requests: Asking for concise, actionable recommendations.
|
180
|
+
# These types cover the main focus areas of your queries related to optimizing and refining YouTube content titles.
|
181
|
+
|
182
|
+
step('Thumb Text Ideas') do
|
183
|
+
input :video_title
|
184
|
+
input :video_topic_theme
|
185
|
+
input :content_highlights
|
186
|
+
input :title_ideas
|
187
|
+
prompt :thumbnail_text_prompt
|
188
|
+
output :thumbnail_text
|
189
|
+
end
|
190
|
+
|
191
|
+
step('Visual Element Ideas') do
|
192
|
+
input :video_title
|
193
|
+
input :content_highlights
|
194
|
+
input :title_ideas
|
195
|
+
prompt :thumbnail_visual_elements_prompt
|
196
|
+
output :thumbnail_visual_elements
|
197
|
+
end
|
198
|
+
|
199
|
+
# Does the Title, Thumbnail Text and Visual Elements align with the content or is it misleading?
|
200
|
+
end
|
201
|
+
|
202
|
+
section('YouTube Meta Data') do
|
203
|
+
step('Simple Description') do
|
204
|
+
input :video_title
|
205
|
+
input :video_keywords
|
206
|
+
input :abridgement
|
207
|
+
prompt :yt_simple_description_prompt
|
208
|
+
output :video_simple_description
|
209
|
+
end
|
210
|
+
|
211
|
+
step('Write Description') do
|
212
|
+
input :video_title
|
213
|
+
input :chapters
|
214
|
+
input :video_simple_description
|
215
|
+
input :brand_info
|
216
|
+
input :fold_cta
|
217
|
+
input :primary_cta
|
218
|
+
input :affiliate_cta
|
219
|
+
input :video_related_links
|
220
|
+
input :video_keywords
|
221
|
+
prompt :yt_description_prompt
|
222
|
+
output :video_description
|
223
|
+
end
|
224
|
+
|
225
|
+
step('Format Description') do
|
226
|
+
input :video_description
|
227
|
+
prompt :yt_format_description_prompt
|
228
|
+
output :video_description
|
229
|
+
end
|
230
|
+
|
231
|
+
step('Custom GPT Description') do
|
232
|
+
input :video_title
|
233
|
+
input :chapters
|
234
|
+
input :abridgement
|
235
|
+
input :brand_info
|
236
|
+
input :fold_cta
|
237
|
+
input :primary_cta
|
238
|
+
input :affiliate_cta
|
239
|
+
input :video_related_links
|
240
|
+
input :video_keywords
|
241
|
+
prompt :yt_description_custom_gpt_prompt
|
242
|
+
output :video_description_custom_gpt
|
243
|
+
end
|
244
|
+
|
245
|
+
step('Pinned Comment') do
|
246
|
+
# I don't need all these, but not sure which ones I do need yet
|
247
|
+
input :video_title
|
248
|
+
input :abridgement
|
249
|
+
input :chapters
|
250
|
+
input :brand_info
|
251
|
+
input :fold_cta
|
252
|
+
input :primary_cta
|
253
|
+
input :affiliate_cta
|
254
|
+
input :video_related_links
|
255
|
+
input :video_keywords
|
256
|
+
input :video_description
|
257
|
+
prompt :yt_pinned_comment_prompt
|
258
|
+
output :video_pinned_comment
|
259
|
+
end
|
260
|
+
|
261
|
+
step('Extra Metadata') do
|
262
|
+
input :video_title
|
263
|
+
input :abridgement
|
264
|
+
prompt :yt_metadata_prompt
|
265
|
+
output :video_metadata
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
section('Social Media Posts') do
|
270
|
+
step('Create Tweet') do
|
271
|
+
input :video_title
|
272
|
+
input :video_link
|
273
|
+
input :video_keywords
|
274
|
+
input :summary
|
275
|
+
prompt :tweet_prompt
|
276
|
+
output :tweet_content
|
277
|
+
end
|
278
|
+
|
279
|
+
step('Create FB Post') do
|
280
|
+
input :summary
|
281
|
+
input :video_keywords
|
282
|
+
prompt :facebook_post_prompt
|
283
|
+
output :facebook_post
|
284
|
+
end
|
285
|
+
|
286
|
+
step('Create LinkedIn Post') do
|
287
|
+
input :video_title
|
288
|
+
input :video_link
|
289
|
+
input :video_keywords
|
290
|
+
input :abridgement
|
291
|
+
prompt :linkedin_post_prompt
|
292
|
+
output :linkedin_post
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
file = '/Users/davidcruwys/dev/sites/working-with-sean/gpt-agents/src/content/gpt-workflows/youtube-launch-optimizer.json'
|
298
|
+
dsl
|
299
|
+
.save
|
300
|
+
.save_json(file)
|
@@ -0,0 +1,132 @@
|
|
1
|
+
{
|
2
|
+
"definition": {
|
3
|
+
"name": "workflow",
|
4
|
+
"params": [
|
5
|
+
{
|
6
|
+
"name": "name",
|
7
|
+
"type": "positional"
|
8
|
+
}
|
9
|
+
],
|
10
|
+
"nodes": [
|
11
|
+
{
|
12
|
+
"name": "description",
|
13
|
+
"params": [
|
14
|
+
{
|
15
|
+
"name": "description",
|
16
|
+
"type": "positional"
|
17
|
+
}
|
18
|
+
]
|
19
|
+
},
|
20
|
+
{
|
21
|
+
"name": "settings",
|
22
|
+
"nodes": [
|
23
|
+
{
|
24
|
+
"name": "setting",
|
25
|
+
"repeat": true,
|
26
|
+
"params": [
|
27
|
+
{
|
28
|
+
"name": "key",
|
29
|
+
"type": "declarative"
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"name": "value",
|
33
|
+
"type": "positional"
|
34
|
+
}
|
35
|
+
]
|
36
|
+
}
|
37
|
+
]
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"name": "prompts",
|
41
|
+
"nodes": [
|
42
|
+
{
|
43
|
+
"name": "prompt",
|
44
|
+
"repeat": true,
|
45
|
+
"params": [
|
46
|
+
{
|
47
|
+
"name": "key",
|
48
|
+
"type": "positional"
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"name": "content",
|
52
|
+
"type": "named",
|
53
|
+
"default": ""
|
54
|
+
}
|
55
|
+
]
|
56
|
+
}
|
57
|
+
]
|
58
|
+
},
|
59
|
+
{
|
60
|
+
"name": "section",
|
61
|
+
"repeat": true,
|
62
|
+
"params": [
|
63
|
+
{
|
64
|
+
"name": "name",
|
65
|
+
"type": "positional"
|
66
|
+
}
|
67
|
+
],
|
68
|
+
"nodes": [
|
69
|
+
{
|
70
|
+
"name": "step",
|
71
|
+
"repeat": true,
|
72
|
+
"params": [
|
73
|
+
{
|
74
|
+
"name": "key",
|
75
|
+
"type": "positional"
|
76
|
+
}
|
77
|
+
],
|
78
|
+
"nodes": [
|
79
|
+
{
|
80
|
+
"name": "input",
|
81
|
+
"repeat": true,
|
82
|
+
"params": [
|
83
|
+
{
|
84
|
+
"name": "key",
|
85
|
+
"type": "positional"
|
86
|
+
}
|
87
|
+
]
|
88
|
+
},
|
89
|
+
{
|
90
|
+
"name": "prompt",
|
91
|
+
"params": [
|
92
|
+
{
|
93
|
+
"name": "key",
|
94
|
+
"type": "positional"
|
95
|
+
}
|
96
|
+
]
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"name": "output",
|
100
|
+
"repeat": true,
|
101
|
+
"params": [
|
102
|
+
{
|
103
|
+
"name": "key",
|
104
|
+
"type": "positional"
|
105
|
+
}
|
106
|
+
]
|
107
|
+
}
|
108
|
+
]
|
109
|
+
}
|
110
|
+
]
|
111
|
+
},
|
112
|
+
{
|
113
|
+
"name": "actions",
|
114
|
+
"nodes": [
|
115
|
+
{
|
116
|
+
"name": "save",
|
117
|
+
"params": []
|
118
|
+
},
|
119
|
+
{
|
120
|
+
"name": "save_json",
|
121
|
+
"params": [
|
122
|
+
{
|
123
|
+
"name": "path",
|
124
|
+
"type": "positional"
|
125
|
+
}
|
126
|
+
]
|
127
|
+
}
|
128
|
+
]
|
129
|
+
}
|
130
|
+
]
|
131
|
+
}
|
132
|
+
}
|