Class: LLMed::Application
- Inherits:
-
Object
- Object
- LLMed::Application
show all
- Defined in:
- lib/llmed/application.rb
Defined Under Namespace
Classes: CodeComment, Snapshot
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#context(name, **opts, &block) ⇒ Object
Example: application { context “demo” { “content” } }.
-
#evaluate ⇒ Object
-
#initialize(name:, language:, output_file:, block:, logger:, release:, release_dir:, output_dir:) ⇒ Application
constructor
A new instance of Application.
-
#notify(message) ⇒ Object
-
#output_file(output_dir, mode = 'w', &block) ⇒ Object
-
#patch_or_create(output) ⇒ Object
-
#prepare_release ⇒ Object
-
#prepare_snapshot ⇒ Object
-
#rebuild? ⇒ Boolean
-
#source_code ⇒ Object
-
#system_prompt(configuration) ⇒ Object
-
#write_statistics(response) ⇒ Object
Constructor Details
#initialize(name:, language:, output_file:, block:, logger:, release:, release_dir:, output_dir:) ⇒ Application
Returns a new instance of Application.
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
# File 'lib/llmed/application.rb', line 33
def initialize(name:, language:, output_file:, block:, logger:, release:, release_dir:, output_dir:)
snapshot_file = Pathname.new(release_dir) + "#{output_file}.snapshot"
@name = name
@output_file = output_file
@language = language.to_sym
= .new(language)
@block = block
@contexts = []
@logger = logger
@release = release
@release_dir = release_dir
@output_dir = output_dir
@snapshot = Snapshot.new(snapshot_file)
end
|
Instance Attribute Details
#contexts ⇒ Object
Returns the value of attribute contexts.
8
9
10
|
# File 'lib/llmed/application.rb', line 8
def contexts
@contexts
end
|
#language ⇒ Object
Returns the value of attribute language.
8
9
10
|
# File 'lib/llmed/application.rb', line 8
def language
@language
end
|
#name ⇒ Object
Returns the value of attribute name.
8
9
10
|
# File 'lib/llmed/application.rb', line 8
def name
@name
end
|
Instance Method Details
#context(name, **opts, &block) ⇒ Object
Example: application { context “demo” { “content” } }
51
52
53
54
55
56
57
58
|
# File 'lib/llmed/application.rb', line 51
def context(name, **opts, &block)
opts[:release_dir] = @release_dir
ctx = Context.new(name: name, options: opts)
output = ctx.instance_eval(&block)
ctx.llm(output) unless ctx.message?
@contexts << ctx
end
|
#evaluate ⇒ Object
60
61
62
|
# File 'lib/llmed/application.rb', line 60
def evaluate
instance_eval(&@block)
end
|
#notify(message) ⇒ Object
296
297
298
|
# File 'lib/llmed/application.rb', line 296
def notify(message)
Notify.notify("APPLICATION #{@name}", message)
end
|
#output_file(output_dir, mode = 'w', &block) ⇒ Object
194
195
196
197
198
199
200
201
202
203
204
205
|
# File 'lib/llmed/application.rb', line 194
def output_file(output_dir, mode = 'w', &block)
if @output_file.respond_to? :write
yield @output_file
else
path = Pathname.new(output_dir) + @output_file
FileUtils.mkdir_p(File.dirname(path))
@logger.info("APPLICATION #{@name} OUTPUT FILE #{path}")
File.open(path, mode, &block)
end
end
|
#patch_or_create(output) ⇒ Object
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
|
# File 'lib/llmed/application.rb', line 207
def patch_or_create(output)
output_content = output
if @release && File.exist?(release_source_code) && !release_contexts.empty?
output_release = Release.load(File.read(release_source_code), )
input_release = Release.load(output, )
output_content = output_release.merge!(input_release, user_contexts).content
output_release.changes.each do |change|
action, ctx = change
case action
when :added
@logger.info("APPLICATION #{@name} PATCH ADDING NEW CONTEXT #{ctx.name}")
when :updated
@logger.info("APPLICATION #{@name} PATCH UPDATING CONTEXT #{ctx.name} TO DIGEST #{ctx.digest}")
end
end
end
output_file(@output_dir) do |file|
file.write(output_content)
end
if !File.exist?(release_source_code)
@snapshot.refresh(@contexts)
@logger.info("APPLICATION #{@name} SNAPSHOT REFRESHED")
end
output_file = Pathname.new(@output_dir) + @output_file
FileUtils.cp(output_file, release_source_code)
FileUtils.cp(output_file, release_main_source_code)
@logger.info("APPLICATION #{@name} RELEASE FILE #{release_source_code}")
end
|
#prepare_release ⇒ Object
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
# File 'lib/llmed/application.rb', line 170
def prepare_release
@logger.info("APPLICATION #{@name} COMPILING FOR #{@language} RELEASE #{@release}")
return unless @output_file.is_a?(String)
return unless @release
output_file = Pathname.new(@output_dir) + @output_file
if @release && File.exist?(output_file) && !File.exist?(release_source_code)
elsif @release && !File.exist?(output_file) && File.exist?(release_main_source_code)
FileUtils.mkdir_p(File.dirname(output_file))
FileUtils.cp(release_main_source_code, output_file)
return
end
@logger.info("APPLICATION #{@name} INPUT RELEASE FILE #{release_main_source_code}")
end
|
#prepare_snapshot ⇒ Object
162
163
164
165
166
167
168
|
# File 'lib/llmed/application.rb', line 162
def prepare_snapshot
raise "snapshot preparation require contexts" if @contexts.empty?
@logger.info("APPLICATION #{@name} PREPARING SNAPSHOT #{@snapshot.snapshot_file}")
@snapshot.sync(@contexts)
end
|
#rebuild? ⇒ Boolean
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
|
# File 'lib/llmed/application.rb', line 260
def rebuild?
return true unless @release
return true if release_contexts.empty?
!digests_of_context_to_update.tap do |digests|
digests.each do |digest|
context_by_digest = release_contexts.invert
if context_by_digest[digest].nil?
@logger.info("APPLICATION #{@name} ADDING CONTEXT #{user_contexts.by_digest(digest).name}")
else
@logger.info("APPLICATION #{@name} REBUILDING CONTEXT #{context_by_digest[digest]}")
end
end
end.empty?
end
|
#source_code ⇒ Object
188
189
190
191
192
|
# File 'lib/llmed/application.rb', line 188
def source_code
return unless File.exist?(release_source_code)
File.read(release_source_code)
end
|
#system_prompt(configuration) ⇒ Object
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
|
# File 'lib/llmed/application.rb', line 242
def system_prompt(configuration)
contexts_diffs = @snapshot.diff(contexts)
changes_of_contexts = ''
if contexts_diffs.any?
contexts_diffs.each do |context_name, diffs|
changes_of_contexts += "# Context: #{context_name}\n"
changes_of_contexts += diffs.map { |op, line| "#{op} #{line}" }.join("\n")
end
end
configuration.prompt(language: language,
source_code: source_code,
code_comment_begin: .begin,
code_comment_end: .end,
update_context_digests: digests_of_context_to_update,
changes_of_contexts: changes_of_contexts)
end
|
#write_statistics(response) ⇒ Object
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
# File 'lib/llmed/application.rb', line 276
def write_statistics(response)
return unless @output_file.is_a?(String)
statistics_file = Pathname.new(@release_dir) + "#{@output_file}.statistics"
File.open(statistics_file, 'a') do |file|
stat = {
inserted_at: Time.now.to_i,
name: @name,
provider: response.provider,
model: response.model,
release: @release,
total_tokens: response.total_tokens,
duration_seconds: response.duration_seconds
}
file.puts stat.to_json
end
@logger.info("APPLICATION #{@name} WROTE STATISTICS FILE #{statistics_file}")
end
|