| 188 | } |
| 189 | |
| 190 | runtime::TaskResult AceStepSession::run(const runtime::TaskRequest &request) { |
| 191 | require_prepared("ACE-Step run()"); |
| 192 | const auto total_start = Clock::now(); |
| 193 | |
| 194 | const auto parse_start = Clock::now(); |
| 195 | const AceStepRequest ace_request = ace_step_parse_request(request); |
| 196 | const AceStepTaskRoute &route = ace_step_task_route(ace_request); |
| 197 | validate_task_route_request(ace_request, route); |
| 198 | engine::debug::timing_log_scalar("ace_step.session.parse_request_ms", engine::debug::elapsed_ms(parse_start, Clock::now())); |
| 199 | |
| 200 | AceStepPlan plan; |
| 201 | const bool flow_edit_morph = ace_step_request_uses_flow_edit_morph(ace_request); |
| 202 | const bool has_request_audio_codes = !flow_edit_morph && !ace_request.audio_code_ids.empty(); |
| 203 | const bool use_planner = |
| 204 | !flow_edit_morph && |
| 205 | route.uses_planner && |
| 206 | (ace_request.generation.thinking || ace_step_request_needs_lm_for_cot(ace_request)); |
| 207 | const bool generate_planner_audio_codes = ace_request.generation.thinking && !has_request_audio_codes; |
| 208 | if (use_planner) { |
| 209 | const auto planner_ensure_start = Clock::now(); |
| 210 | ensure_planner(); |
| 211 | engine::debug::timing_log_scalar("ace_step.session.ensure_planner_ms", |
| 212 | engine::debug::elapsed_ms(planner_ensure_start, Clock::now())); |
| 213 | const auto planner_start = Clock::now(); |
| 214 | plan = planner_->generate(ace_request, generate_planner_audio_codes); |
| 215 | engine::debug::timing_log_scalar("ace_step.session.planner_generate_ms", |
| 216 | engine::debug::elapsed_ms(planner_start, Clock::now())); |
| 217 | |
| 218 | const auto planner_release_start = Clock::now(); |
| 219 | planner_->release_graph_workspace(); |
| 220 | if (execution_context().backend_type() == core::BackendType::Metal) { |
| 221 | planner_.reset(); |
| 222 | } |
| 223 | engine::debug::timing_log_scalar("ace_step.session.planner_release.graph.workspace_ms", |
| 224 | engine::debug::elapsed_ms(planner_release_start, Clock::now())); |
| 225 | } else { |
| 226 | engine::debug::timing_log_scalar("ace_step.session.ensure_planner_ms", 0.0); |
| 227 | engine::debug::timing_log_scalar("ace_step.session.planner_generate_ms", 0.0); |
| 228 | engine::debug::timing_log_scalar("ace_step.session.planner_release.graph.workspace_ms", 0.0); |
| 229 | plan = make_direct_dit_plan(ace_request, route); |
| 230 | if (execution_context().backend_type() == core::BackendType::Metal) { |
| 231 | planner_.reset(); |
| 232 | } |
| 233 | } |
| 234 | apply_request_audio_codes(plan, ace_request); |
| 235 | validate_task_route_source_input(ace_request, route, plan); |
| 236 | |
| 237 | const auto pre_dit_ensure_start = Clock::now(); |
| 238 | ensure_pre_dit(); |
| 239 | engine::debug::timing_log_scalar("ace_step.session.ensure_pre_dit_ms", |
| 240 | engine::debug::elapsed_ms(pre_dit_ensure_start, Clock::now())); |
| 241 | const auto pre_dit_start = Clock::now(); |
| 242 | AceStepPreDitInputs pre_dit = pre_dit_->prepare(ace_request, route, plan); |
| 243 | engine::debug::timing_log_scalar("ace_step.session.pre_dit_prepare_ms", engine::debug::elapsed_ms(pre_dit_start, Clock::now())); |
| 244 | |
| 245 | const auto diffusion_ensure_start = Clock::now(); |
| 246 | ensure_diffusion(); |
| 247 | engine::debug::timing_log_scalar("ace_step.session.ensure_diffusion_ms", |
nothing calls this directly
no test coverage detected