1use utoipa::openapi::security::{ApiKey, ApiKeyValue, SecurityScheme};
10use utoipa::OpenApi;
11
12use crate::{
13 common::ApiError,
14 v1::{
15 BrainRegionDetail,
16 BrainRegionListResponse,
17 BrainRegionSummary,
19 BurstCountResponse,
20
21 ComponentReadiness,
22
23 ConnectivityStatsResponse,
24 ConnectomeAnalyticsResponse,
25 Coordinates3D,
26 CorticalAreaDetail,
27 CorticalAreaListResponse,
28 CorticalAreaStatsResponse,
29 CorticalAreaSummary,
31 CreateBrainRegionRequest,
32
33 CreateCorticalAreaRequest,
34 CreateNeuronRequest,
35 Dimensions3D,
36
37 GenomeInfoResponse,
39 HealthCheckResponseV1,
41 LoadGenomeRequest,
42 NeuronCountResponse,
43
44 NeuronDensityResponse,
45 NeuronInfoResponse,
47 NeuronListResponse,
48 PopulatedAreaInfo,
49 PopulatedAreasResponse,
50 ReadinessCheckResponseV1,
51 RuntimeStatusResponse,
53 SaveGenomeRequest,
54 SaveGenomeResponse,
55 SetFrequencyRequest,
56 SystemHealthResponse,
58 UpdateCorticalAreaRequest,
59 ValidateGenomeRequest,
60 ValidateGenomeResponse,
61 },
62};
63
64#[derive(OpenApi)]
66#[openapi(
67 info(
68 title = "FEAGI REST API",
69 version = "1.0.0",
70 description = "Comprehensive REST API for FEAGI (Foundational Engine for Artificial General Intelligence)",
71 license(
72 name = "Apache-2.0",
73 url = "https://www.apache.org/licenses/LICENSE-2.0"
74 ),
75 contact(
76 name = "FEAGI Team",
77 url = "https://feagi.org",
78 email = "contact@feagi.org"
79 )
80 ),
81 servers(
82 (url = "http://localhost:8000", description = "Default FEAGI server"),
83 (url = "http://localhost:8080", description = "Alternative port")
84 ),
85 paths(
86 crate::endpoints::agent::heartbeat,
88 crate::endpoints::agent::list_agents,
89 crate::endpoints::agent::get_agent_properties,
90 crate::endpoints::agent::get_agent_properties_path,
91 crate::endpoints::agent::get_shared_memory,
92 crate::endpoints::agent::deregister_agent,
93 crate::endpoints::agent::manual_stimulation,
94 crate::endpoints::agent::get_fq_sampler_status,
95 crate::endpoints::agent::get_capabilities,
96 crate::endpoints::agent::get_all_agent_capabilities,
97 crate::endpoints::agent::get_agent_info,
98 crate::endpoints::agent::post_configure,
99
100 crate::endpoints::system::get_health_check,
102 crate::endpoints::system::get_cortical_area_visualization_skip_rate,
103 crate::endpoints::system::set_cortical_area_visualization_skip_rate,
104 crate::endpoints::system::get_cortical_area_visualization_suppression_threshold,
105 crate::endpoints::system::set_cortical_area_visualization_suppression_threshold,
106 crate::endpoints::system::get_version,
107 crate::endpoints::system::get_versions,
108 crate::endpoints::system::get_configuration,
109 crate::endpoints::system::get_user_preferences,
110 crate::endpoints::system::put_user_preferences,
111 crate::endpoints::system::get_cortical_area_types_list,
112 crate::endpoints::system::post_enable_visualization_fq_sampler,
113 crate::endpoints::system::post_disable_visualization_fq_sampler,
114 crate::endpoints::system::get_fcl_status_system,
115 crate::endpoints::system::post_fcl_reset_system,
116 crate::endpoints::system::get_processes,
117 crate::endpoints::system::get_unique_logs,
118 crate::endpoints::system::post_logs,
119 crate::endpoints::system::get_beacon_subscribers,
120 crate::endpoints::system::post_beacon_subscribe,
121 crate::endpoints::system::delete_beacon_unsubscribe,
122 crate::endpoints::system::get_global_activity_visualization,
123 crate::endpoints::system::put_global_activity_visualization,
124 crate::endpoints::system::post_circuit_library_path,
125 crate::endpoints::system::get_influxdb_test,
126 crate::endpoints::system::post_register_system,
127
128 crate::endpoints::cortical_area::get_ipu,
130 crate::endpoints::cortical_area::get_ipu_types,
131 crate::endpoints::cortical_area::get_opu,
132 crate::endpoints::cortical_area::get_opu_types,
133 crate::endpoints::cortical_area::get_cortical_area_id_list,
134 crate::endpoints::cortical_area::get_cortical_area_name_list,
135 crate::endpoints::cortical_area::get_cortical_id_name_mapping,
136 crate::endpoints::cortical_area::get_cortical_types,
137 crate::endpoints::cortical_area::get_cortical_map_detailed,
138 crate::endpoints::cortical_area::get_cortical_locations_2d,
139 crate::endpoints::cortical_area::get_cortical_area_geometry,
140 crate::endpoints::cortical_area::get_cortical_visibility,
141 crate::endpoints::cortical_area::post_cortical_name_location,
142 crate::endpoints::cortical_area::post_cortical_area_properties,
143 crate::endpoints::cortical_area::post_multi_cortical_area_properties,
144 crate::endpoints::cortical_area::post_cortical_area,
145 crate::endpoints::cortical_area::put_cortical_area,
146 crate::endpoints::cortical_area::delete_cortical_area,
147 crate::endpoints::cortical_area::post_custom_cortical_area,
148 crate::endpoints::cortical_area::post_clone,
149 crate::endpoints::cortical_area::put_multi_cortical_area,
150 crate::endpoints::cortical_area::delete_multi_cortical_area,
151 crate::endpoints::cortical_area::put_coord_2d,
152 crate::endpoints::cortical_area::put_suppress_cortical_visibility,
153 crate::endpoints::cortical_area::put_reset,
154 crate::endpoints::cortical_area::get_visualization,
155 crate::endpoints::cortical_area::post_batch_operations,
156 crate::endpoints::cortical_area::get_ipu_list,
157 crate::endpoints::cortical_area::get_opu_list,
158 crate::endpoints::cortical_area::put_coordinates_3d,
159 crate::endpoints::cortical_area::delete_bulk,
160 crate::endpoints::cortical_area::post_clone,
161 crate::endpoints::cortical_area::post_resize,
162 crate::endpoints::cortical_area::post_reposition,
163 crate::endpoints::cortical_area::post_voxel_neurons,
164 crate::endpoints::cortical_area::get_cortical_area_index_list,
165 crate::endpoints::cortical_area::get_cortical_idx_mapping,
166 crate::endpoints::cortical_area::get_mapping_restrictions_query,
167 crate::endpoints::cortical_area::get_memory_usage,
168 crate::endpoints::cortical_area::get_area_neuron_count,
169 crate::endpoints::cortical_area::post_cortical_type_options,
170 crate::endpoints::cortical_area::post_mapping_restrictions,
171 crate::endpoints::cortical_area::post_mapping_restrictions_between_areas,
172 crate::endpoints::cortical_area::put_coord_3d,
173
174 crate::endpoints::morphology::get_morphology_list,
176 crate::endpoints::morphology::get_morphology_types,
177 crate::endpoints::morphology::get_list_types,
178 crate::endpoints::morphology::get_morphologies,
179 crate::endpoints::morphology::post_morphology,
180 crate::endpoints::morphology::put_morphology,
181 crate::endpoints::morphology::delete_morphology_by_name,
182 crate::endpoints::morphology::delete_morphology, crate::endpoints::morphology::post_morphology_properties,
184 crate::endpoints::morphology::post_morphology_usage,
185 crate::endpoints::morphology::get_list,
186 crate::endpoints::morphology::get_info,
187 crate::endpoints::morphology::post_create,
188 crate::endpoints::morphology::put_update,
189
190 crate::endpoints::genome::get_file_name,
192 crate::endpoints::genome::get_circuits,
193 crate::endpoints::genome::post_amalgamation_destination,
194 crate::endpoints::genome::delete_amalgamation_cancellation,
195 crate::endpoints::genome::post_genome_append,
196 crate::endpoints::genome::post_upload_barebones_genome,
197 crate::endpoints::genome::post_upload_essential_genome,
198 crate::endpoints::genome::get_name,
199 crate::endpoints::genome::get_timestamp,
200 crate::endpoints::genome::post_save,
201 crate::endpoints::genome::post_load,
202 crate::endpoints::genome::post_upload,
203 crate::endpoints::genome::get_download,
204 crate::endpoints::genome::get_properties,
205 crate::endpoints::genome::post_validate,
206 crate::endpoints::genome::post_transform,
207 crate::endpoints::genome::post_clone,
208 crate::endpoints::genome::post_reset,
209 crate::endpoints::genome::get_metadata,
210 crate::endpoints::genome::post_merge,
211 crate::endpoints::genome::get_diff,
212 crate::endpoints::genome::post_export_format,
213 crate::endpoints::genome::get_amalgamation,
214 crate::endpoints::genome::get_amalgamation_history_exact,
215 crate::endpoints::genome::get_cortical_template,
216 crate::endpoints::genome::get_defaults_files,
217 crate::endpoints::genome::get_download_region,
218 crate::endpoints::genome::get_genome_number,
219 crate::endpoints::genome::post_amalgamation_by_filename,
220 crate::endpoints::genome::post_amalgamation_by_payload,
221 crate::endpoints::genome::post_amalgamation_by_upload,
222 crate::endpoints::genome::post_append_file,
223 crate::endpoints::genome::post_upload_file,
224 crate::endpoints::genome::post_upload_file_edit,
225 crate::endpoints::genome::post_upload_string,
226
227 crate::endpoints::cortical_mapping::post_afferents,
229 crate::endpoints::cortical_mapping::post_efferents,
230 crate::endpoints::cortical_mapping::post_mapping_properties,
231 crate::endpoints::cortical_mapping::put_mapping_properties,
232 crate::endpoints::cortical_mapping::get_mapping,
233 crate::endpoints::cortical_mapping::get_mapping_list,
234 crate::endpoints::cortical_mapping::delete_mapping,
235 crate::endpoints::cortical_mapping::post_batch_update,
236 crate::endpoints::cortical_mapping::post_mapping,
237 crate::endpoints::cortical_mapping::put_mapping,
238
239 crate::endpoints::region::get_regions_members,
241 crate::endpoints::region::post_region,
242 crate::endpoints::region::put_region,
243 crate::endpoints::region::delete_region,
244 crate::endpoints::region::post_clone,
245 crate::endpoints::region::put_relocate_members,
246 crate::endpoints::region::delete_region_and_members,
247 crate::endpoints::region::get_regions,
248 crate::endpoints::region::get_region_titles,
249 crate::endpoints::region::get_region_detail,
250 crate::endpoints::region::put_change_region_parent,
251 crate::endpoints::region::put_change_cortical_area_region,
252
253 crate::endpoints::connectome::get_cortical_areas_list_detailed,
255 crate::endpoints::connectome::get_properties_dimensions,
256 crate::endpoints::connectome::get_properties_mappings,
257 crate::endpoints::connectome::get_snapshot,
258 crate::endpoints::connectome::get_stats,
259 crate::endpoints::connectome::post_batch_neuron_operations,
260 crate::endpoints::connectome::post_batch_synapse_operations,
261 crate::endpoints::connectome::get_neuron_count,
262 crate::endpoints::connectome::get_synapse_count,
263 crate::endpoints::connectome::get_paths,
264 crate::endpoints::connectome::get_cumulative_stats,
265 crate::endpoints::connectome::get_area_details,
266 crate::endpoints::connectome::post_rebuild,
267 crate::endpoints::connectome::get_structure,
268 crate::endpoints::connectome::post_clear,
269 crate::endpoints::connectome::get_validation,
270 crate::endpoints::connectome::get_topology,
271 crate::endpoints::connectome::post_optimize,
272 crate::endpoints::connectome::get_connectivity_matrix,
273 crate::endpoints::connectome::post_neurons_batch,
274 crate::endpoints::connectome::post_synapses_batch,
275 crate::endpoints::connectome::get_cortical_areas_list_summary,
276 crate::endpoints::connectome::get_cortical_areas_list_transforming,
277 crate::endpoints::connectome::get_cortical_area_list_types,
278 crate::endpoints::connectome::get_cortical_area_neurons,
279 crate::endpoints::connectome::get_area_synapses,
280 crate::endpoints::connectome::get_cortical_info,
281 crate::endpoints::connectome::get_stats_cortical_cumulative,
282 crate::endpoints::connectome::get_neuron_properties_by_id,
283 crate::endpoints::connectome::get_neuron_properties_query,
284 crate::endpoints::connectome::get_neuron_properties_at_query,
285 crate::endpoints::connectome::get_area_neurons_query,
286 crate::endpoints::connectome::get_fire_queue_area,
287 crate::endpoints::connectome::get_plasticity_info,
288 crate::endpoints::connectome::get_path_query,
289 crate::endpoints::connectome::get_download_connectome,
290 crate::endpoints::connectome::get_download_cortical_area,
291 crate::endpoints::connectome::post_upload_connectome,
292 crate::endpoints::connectome::post_upload_cortical_area,
293
294 crate::endpoints::burst_engine::get_simulation_timestep,
296 crate::endpoints::burst_engine::post_simulation_timestep,
297 crate::endpoints::burst_engine::get_fcl,
298 crate::endpoints::burst_engine::get_fcl_neuron,
299 crate::endpoints::burst_engine::get_fire_queue,
300 crate::endpoints::burst_engine::get_fire_queue_neuron,
301 crate::endpoints::burst_engine::post_fcl_reset,
302 crate::endpoints::burst_engine::get_fcl_status,
303 crate::endpoints::burst_engine::get_fcl_sampler_config,
304 crate::endpoints::burst_engine::post_fcl_sampler_config,
305 crate::endpoints::burst_engine::get_area_fcl_sample_rate,
306 crate::endpoints::burst_engine::post_area_fcl_sample_rate,
307 crate::endpoints::burst_engine::get_fire_ledger_default_window_size,
308 crate::endpoints::burst_engine::put_fire_ledger_default_window_size,
309 crate::endpoints::burst_engine::get_fire_ledger_areas_window_config,
310 crate::endpoints::burst_engine::get_stats,
311 crate::endpoints::burst_engine::get_status,
312 crate::endpoints::burst_engine::post_control,
313 crate::endpoints::burst_engine::get_burst_counter,
314 crate::endpoints::burst_engine::post_start,
315 crate::endpoints::burst_engine::post_stop,
316 crate::endpoints::burst_engine::post_hold,
317 crate::endpoints::burst_engine::post_resume,
318 crate::endpoints::burst_engine::get_config,
319 crate::endpoints::burst_engine::put_config,
320 crate::endpoints::burst_engine::get_fire_ledger_area_window_size,
321 crate::endpoints::burst_engine::put_fire_ledger_area_window_size,
322 crate::endpoints::burst_engine::get_fire_ledger_history,
323 crate::endpoints::burst_engine::get_membrane_potentials,
324 crate::endpoints::burst_engine::put_membrane_potentials,
325 crate::endpoints::burst_engine::get_frequency_status,
326 crate::endpoints::burst_engine::post_measure_frequency,
327 crate::endpoints::burst_engine::get_frequency_history,
328 crate::endpoints::burst_engine::post_force_connectome_integration,
329
330 crate::endpoints::insight::post_neurons_membrane_potential_status,
332 crate::endpoints::insight::post_neuron_synaptic_potential_status,
333 crate::endpoints::insight::post_neurons_membrane_potential_set,
334 crate::endpoints::insight::post_neuron_synaptic_potential_set,
335
336 crate::endpoints::neuroplasticity::get_plasticity_queue_depth,
338 crate::endpoints::neuroplasticity::put_plasticity_queue_depth,
339 crate::endpoints::neuroplasticity::get_status,
340 crate::endpoints::neuroplasticity::get_transforming,
341 crate::endpoints::neuroplasticity::post_configure,
342 crate::endpoints::neuroplasticity::post_enable_area,
343 crate::endpoints::neuroplasticity::post_disable_area,
344
345 crate::endpoints::input::get_vision,
347 crate::endpoints::input::post_vision,
348
349 crate::endpoints::outputs::get_targets,
351 crate::endpoints::outputs::post_configure,
352
353 crate::endpoints::physiology::get_physiology,
355 crate::endpoints::physiology::put_physiology,
356
357 crate::endpoints::simulation::post_stimulation_upload,
359 crate::endpoints::simulation::post_reset,
360 crate::endpoints::simulation::get_status,
361 crate::endpoints::simulation::get_stats,
362 crate::endpoints::simulation::post_config,
363
364 crate::endpoints::training::post_shock,
366 crate::endpoints::training::get_shock_options,
367 crate::endpoints::training::get_shock_status,
368 crate::endpoints::training::post_reward_intensity,
369 crate::endpoints::training::post_punishment_intensity,
370 crate::endpoints::training::post_gameover,
371 crate::endpoints::training::get_brain_fitness,
372 crate::endpoints::training::get_fitness_criteria,
373 crate::endpoints::training::put_fitness_criteria,
374 crate::endpoints::training::get_fitness_stats,
375 crate::endpoints::training::get_training_report,
376 crate::endpoints::training::get_status,
377 crate::endpoints::training::get_stats,
378 crate::endpoints::training::post_config,
379
380 crate::endpoints::visualization::post_register_client,
382 crate::endpoints::visualization::post_unregister_client,
383 crate::endpoints::visualization::post_heartbeat,
384 crate::endpoints::visualization::get_status,
385
386 crate::endpoints::monitoring::get_status,
388 crate::endpoints::monitoring::get_metrics,
389 crate::endpoints::monitoring::get_data,
390
391 crate::endpoints::evolution::get_status,
393 crate::endpoints::evolution::post_config,
394
395 crate::endpoints::network::get_status,
407 crate::endpoints::network::post_config,
408 crate::endpoints::network::get_connection_info,
409 ),
410 components(
411 schemas(
412 ApiError,
414
415 HealthCheckResponseV1,
417 ReadinessCheckResponseV1,
418 ComponentReadiness,
419
420 crate::v1::AgentRegistrationRequest,
422
423 crate::v1::OutputTargetsResponse,
425 crate::v1::OutputConfigRequest,
426 crate::v1::OutputConfigResponse,
427
428 crate::v1::PhysiologyResponse,
430 crate::v1::PhysiologyParameters,
431 crate::v1::PhysiologyUpdateRequest,
432 crate::v1::PhysiologyUpdateResponse,
433
434 crate::v1::FCLResponse,
436 crate::v1::FireQueueResponse,
437 crate::v1::FCLStatusResponse,
438 crate::v1::FireLedgerConfigResponse,
439 crate::v1::BurstEngineStats,
440 crate::v1::BurstEngineStatus,
441 crate::v1::BurstEngineControlRequest,
442
443 crate::v1::MonitoringStatusResponse,
445 crate::v1::SystemMetricsResponse,
446 crate::v1::MonitoringData,
447 crate::v1::MonitoringDataResponse,
448
449 crate::v1::StimulationUploadRequest,
451 crate::v1::SimulationControlRequest,
452 crate::v1::SimulationStatusResponse,
453 crate::v1::SimulationStatsResponse,
454 crate::v1::SimulationSuccessResponse,
455
456 crate::v1::ShockConfigRequest,
458 crate::v1::ShockOptionsResponse,
459 crate::v1::ShockStatusResponse,
460 crate::v1::IntensityRequest,
461 crate::v1::BrainFitnessResponse,
462 crate::v1::FitnessCriteriaResponse,
463 crate::v1::FitnessCriteriaUpdateRequest,
464 crate::v1::FitnessStatsResponse,
465 crate::v1::TrainingReportResponse,
466 crate::v1::TrainingStatusResponse,
467 crate::v1::TrainingStatsResponse,
468 crate::v1::TrainingConfigRequest,
469 crate::v1::TrainingSuccessResponse,
470
471 crate::v1::VisualizationClientRequest,
473 crate::v1::VisualizationClientResponse,
474 crate::v1::VisualizationHeartbeatRequest,
475 crate::v1::VisualizationStatusResponse,
476 crate::v1::VisualizationSuccessResponse,
477
478 crate::v1::EvolutionStatusResponse,
480 crate::v1::EvolutionConfigRequest,
481 crate::v1::EvolutionSuccessResponse,
482
483 crate::v1::SnapshotCreateRequest,
485 crate::v1::SnapshotCreateResponse,
486 crate::v1::SnapshotRestoreRequest,
487 crate::v1::SnapshotListResponse,
488 crate::v1::SnapshotInfo,
489 crate::v1::SnapshotArtifactResponse,
490 crate::v1::SnapshotCompareRequest,
491 crate::v1::SnapshotCompareResponse,
492 crate::v1::SnapshotUploadRequest,
493 crate::v1::SnapshotUploadResponse,
494 crate::v1::SnapshotSuccessResponse,
495
496 crate::v1::NetworkStatusResponse,
498 crate::v1::NetworkConnectionInfo,
499 crate::v1::ConnectionInfoApi,
500 crate::v1::ConnectionInfoZmq,
501 crate::v1::ConnectionInfoZmqPorts,
502 crate::v1::ConnectionInfoZmqEndpoints,
503 crate::v1::ConnectionInfoWebSocket,
504 crate::v1::ConnectionInfoWebSocketPorts,
505 crate::v1::ConnectionInfoWebSocketEndpoints,
506 crate::v1::ConnectionInfoShm,
507 crate::v1::ConnectionInfoUdp,
508 crate::v1::ConnectionInfoBluetooth,
509 crate::v1::ConnectionInfoStreamStatus,
510 crate::v1::NetworkConfigRequest,
511 crate::v1::NetworkSuccessResponse,
512 crate::v1::AgentRegistrationResponse,
513 crate::v1::HeartbeatRequest,
514 crate::v1::HeartbeatResponse,
515 crate::v1::AgentListResponse,
516 crate::v1::AgentPropertiesResponse,
517 crate::v1::AgentCapabilitiesSummary,
518 crate::v1::AgentDeregistrationRequest,
519 crate::v1::SuccessResponse,
520 crate::v1::ManualStimulationRequest,
521 crate::v1::ManualStimulationResponse,
522 crate::v1::DeviceRegistrationExportResponse,
523 crate::v1::DeviceRegistrationImportRequest,
524 crate::v1::DeviceRegistrationImportResponse,
525
526 crate::endpoints::system::HealthCheckResponse,
528
529 crate::endpoints::cortical_area::CorticalAreaIdListResponse,
531 crate::endpoints::cortical_area::CorticalAreaNameListResponse,
532 crate::endpoints::cortical_area::CorticalTypeMetadata,
533
534 crate::endpoints::morphology::MorphologyListResponse,
536
537 CorticalAreaSummary,
539 CorticalAreaDetail,
540 CorticalAreaListResponse,
541 CreateCorticalAreaRequest,
542 UpdateCorticalAreaRequest,
543 Coordinates3D,
544 Dimensions3D,
545
546 BrainRegionSummary,
548 BrainRegionDetail,
549 BrainRegionListResponse,
550 CreateBrainRegionRequest,
551
552 GenomeInfoResponse,
554 LoadGenomeRequest,
555 SaveGenomeRequest,
556 SaveGenomeResponse,
557 ValidateGenomeRequest,
558 ValidateGenomeResponse,
559 crate::endpoints::genome::GenomeFileUploadForm,
560
561 NeuronInfoResponse,
563 CreateNeuronRequest,
564 NeuronListResponse,
565 NeuronCountResponse,
566
567 RuntimeStatusResponse,
569 SetFrequencyRequest,
570 BurstCountResponse,
571
572 SystemHealthResponse,
574 CorticalAreaStatsResponse,
575 ConnectivityStatsResponse,
576 ConnectomeAnalyticsResponse,
577 PopulatedAreasResponse,
578 PopulatedAreaInfo,
579 NeuronDensityResponse,
580 )
581 ),
582 tags(
583 (name = "agent", description = "Agent registration and heartbeat"),
584 (name = "system", description = "System health and configuration"),
585 (name = "cortical_area", description = "Cortical area management"),
586 (name = "morphology", description = "Morphology management"),
587 (name = "genome", description = "Genome operations"),
588 (name = "cortical_mapping", description = "Cortical mapping operations"),
589 (name = "region", description = "Brain region management"),
590 (name = "connectome", description = "Connectome operations"),
591 (name = "burst_engine", description = "Burst engine configuration and FCL/Fire Queue"),
592 (name = "insight", description = "Neuron insight operations"),
593 (name = "neuroplasticity", description = "Neuroplasticity configuration"),
594 (name = "input", description = "Input operations"),
595 (name = "outputs", description = "Output/motor target management"),
596 (name = "physiology", description = "Physiology parameter configuration"),
597 (name = "simulation", description = "Simulation control and stimulation"),
598 (name = "training", description = "Reinforcement learning and training"),
599 (name = "visualization", description = "Visualization client management"),
600 (name = "monitoring", description = "System monitoring and metrics"),
601 (name = "evolution", description = "Evolutionary algorithms"),
602 (name = "snapshot", description = "Brain snapshot management"),
603 (name = "network", description = "Network configuration"),
604 ),
605 modifiers(&SecurityAddon)
606)]
607pub struct ApiDoc;
608
609struct SecurityAddon;
611
612impl utoipa::Modify for SecurityAddon {
613 fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
614 if let Some(components) = openapi.components.as_mut() {
615 components.add_security_scheme(
617 "api_key",
618 SecurityScheme::ApiKey(ApiKey::Header(ApiKeyValue::new("X-API-Key"))),
619 );
620
621 components.add_security_scheme(
623 "bearer_auth",
624 SecurityScheme::Http(
625 utoipa::openapi::security::HttpBuilder::new()
626 .scheme(utoipa::openapi::security::HttpAuthScheme::Bearer)
627 .bearer_format("JWT")
628 .build(),
629 ),
630 );
631 }
632 }
633}
634
635pub fn get_openapi_json() -> String {
637 ApiDoc::openapi()
638 .to_pretty_json()
639 .unwrap_or_else(|e| format!(r#"{{"error": "Failed to generate OpenAPI spec: {}"}}"#, e))
640}
641
642pub fn get_openapi_yaml() -> String {
644 "# OpenAPI YAML generation not yet implemented\n# Use /openapi.json instead".to_string()
647}
648
649#[cfg(test)]
650mod tests {
651 use super::*;
652
653 #[test]
654 fn test_openapi_generation() {
655 let json = get_openapi_json();
656 assert!(json.contains("FEAGI REST API"));
657 assert!(json.contains("health"));
658 assert!(json.contains("ready"));
659 }
660
661 #[test]
662 fn test_openapi_components() {
663 let openapi = ApiDoc::openapi();
664 assert!(openapi.components.is_some());
665
666 let components = openapi.components.unwrap();
667 assert!(components.schemas.contains_key("HealthCheckResponseV1"));
668 assert!(components.schemas.contains_key("ApiError"));
669 }
670
671 #[test]
672 fn test_openapi_amalgamation_by_upload_is_multipart_form() {
673 let openapi = ApiDoc::openapi();
674 let json = serde_json::to_value(&openapi).expect("serialize openapi");
675
676 let content =
677 &json["paths"]["/v1/genome/amalgamation_by_upload"]["post"]["requestBody"]["content"];
678
679 assert!(
680 content.get("multipart/form-data").is_some(),
681 "Expected multipart/form-data content for /v1/genome/amalgamation_by_upload requestBody. Got: {}",
682 content
683 );
684 }
685
686 #[test]
687 fn test_security_schemes() {
688 let openapi = ApiDoc::openapi();
689 let components = openapi.components.unwrap();
690
691 assert!(components.security_schemes.contains_key("api_key"));
692 assert!(components.security_schemes.contains_key("bearer_auth"));
693 }
694}