Class: Raif::Task

Direct Known Subclasses

Evals::LlmJudge

Constant Summary

Constants included from Concerns::LlmResponseParsing

Concerns::LlmResponseParsing::ASCII_CONTROL_CHARS

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Concerns::LlmResponseParsing

#parse_html_response, #parse_json_response, #parsed_response

Methods included from Concerns::HasAvailableModelTools

#available_model_tools_map

Methods included from Concerns::HasRequestedLanguage

#requested_language_name, #system_prompt_language_preference

Methods included from Concerns::HasLlm

#default_llm_model_key, #llm

Methods inherited from ApplicationRecord

table_name_prefix

Instance Attribute Details

#filesObject

Returns the value of attribute files.



69
70
71
# File 'app/models/raif/task.rb', line 69

def files
  @files
end

#imagesObject

Returns the value of attribute images.



69
70
71
# File 'app/models/raif/task.rb', line 69

def images
  @images
end

Class Method Details

.json_response_schema(&block) ⇒ Object



175
176
177
178
179
180
181
# File 'app/models/raif/task.rb', line 175

def self.json_response_schema(&block)
  if block_given?
    json_schema_definition(:json_response, &block)
  elsif schema_defined?(:json_response)
    schema_for(:json_response)
  end
end

.prompt(creator: nil, **args) ⇒ String

Returns the LLM prompt for the task.

Parameters:

  • creator (Object, nil) (defaults to: nil)

    The creator of the task (polymorphic association), optional

  • args (Hash)

    Additional arguments to pass to the instance of the task that is created.

Returns:

  • (String)

    The LLM prompt for the task.



162
163
164
# File 'app/models/raif/task.rb', line 162

def self.prompt(creator: nil, **args)
  new(creator:, **args).build_prompt
end

.run(creator: nil, available_model_tools: [], llm_model_key: nil, images: [], files: [], **args) ⇒ Raif::Task?

The primary interface for running a task. It will hit the LLM with the task’s prompt and system prompt and return a Raif::Task object. It will also create a new Raif::ModelCompletion record.

Parameters:

  • creator (Object, nil) (defaults to: nil)

    The creator of the task (polymorphic association), optional

  • available_model_tools (Array<Class>) (defaults to: [])

    Optional array of model tool classes that will be provided to the LLM for it to invoke.

  • llm_model_key (Symbol, String) (defaults to: nil)

    Optional key for the LLM model to use. If blank, Raif.config.default_llm_model_key will be used.

  • images (Array) (defaults to: [])

    Optional array of Raif::ModelImageInput objects to include with the prompt.

  • files (Array) (defaults to: [])

    Optional array of Raif::ModelFileInput objects to include with the prompt.

  • args (Hash)

    Additional arguments to pass to the instance of the task that is created.

Returns:

  • (Raif::Task, nil)

    The task instance that was created and run.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'app/models/raif/task.rb', line 96

def self.run(creator: nil, available_model_tools: [], llm_model_key: nil, images: [], files: [], **args)
  task = new(
    creator: creator,
    llm_model_key: llm_model_key,
    available_model_tools: available_model_tools,
    started_at: Time.current,
    images: images,
    files: files,
    task_run_args: serialize_task_run_args(args),
    **args
  )

  task.save!
  task.run
  task
rescue StandardError => e
  task&.failed!

  logger.error e.message
  logger.error e.backtrace.join("\n")

  if defined?(Airbrake)
    notice = Airbrake.build_notice(e)
    notice[:context][:component] = "raif_task"
    notice[:context][:action] = name

    Airbrake.notify(notice)
  end

  task
end

.system_prompt(creator: nil, **args) ⇒ String

Returns the LLM system prompt for the task.

Parameters:

  • creator (Object, nil) (defaults to: nil)

    The creator of the task (polymorphic association), optional

  • args (Hash)

    Additional arguments to pass to the instance of the task that is created.

Returns:

  • (String)

    The LLM system prompt for the task.



171
172
173
# File 'app/models/raif/task.rb', line 171

def self.system_prompt(creator: nil, **args)
  new(creator:, **args).build_system_prompt
end

Instance Method Details

#build_promptObject

Raises:

  • (NotImplementedError)


183
184
185
# File 'app/models/raif/task.rb', line 183

def build_prompt
  raise NotImplementedError, "Raif::Task subclasses must implement #build_prompt"
end

#build_system_promptObject



187
188
189
190
191
192
# File 'app/models/raif/task.rb', line 187

def build_system_prompt
  sp = Raif.config.task_system_prompt_intro
  sp = sp.call(self) if sp.respond_to?(:call)
  sp += system_prompt_language_preference if requested_language_key.present?
  sp
end

#re_runObject



152
153
154
155
# File 'app/models/raif/task.rb', line 152

def re_run
  update_columns(started_at: Time.current)
  run(skip_prompt_population: true)
end

#run(skip_prompt_population: false) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'app/models/raif/task.rb', line 128

def run(skip_prompt_population: false)
  update_columns(started_at: Time.current) if started_at.nil?

  populate_prompts unless skip_prompt_population
  messages = [{ "role" => "user", "content" => message_content }]

  mc = llm.chat(
    messages: messages,
    source: self,
    system_prompt: system_prompt,
    response_format: response_format.to_sym,
    available_model_tools: available_model_tools,
    temperature: self.class.temperature
  )

  self.raif_model_completion = mc.becomes(Raif::ModelCompletion)

  update(raw_response: raif_model_completion.raw_response)

  process_model_tool_invocations
  completed!
  self
end

#statusObject



74
75
76
77
78
79
80
81
82
83
84
# File 'app/models/raif/task.rb', line 74

def status
  if completed_at?
    :completed
  elsif failed_at?
    :failed
  elsif started_at?
    :in_progress
  else
    :pending
  end
end