diff --git a/src/app/editor/editor_manager.cc b/src/app/editor/editor_manager.cc index d668ab9a..52267cfc 100644 --- a/src/app/editor/editor_manager.cc +++ b/src/app/editor/editor_manager.cc @@ -383,6 +383,7 @@ void EditorManager::Initialize(gfx::IRenderer* renderer, *output_path = result->file_path; return absl::OkStatus(); }; +#ifdef YAZE_AI_RUNTIME_AVAILABLE multimodal_callbacks.send_to_gemini = [this](const std::filesystem::path& image_path, const std::string& prompt) -> absl::Status { @@ -417,6 +418,14 @@ void EditorManager::Initialize(gfx::IRenderer* renderer, return absl::OkStatus(); }; +#else + multimodal_callbacks.send_to_gemini = + [](const std::filesystem::path&, const std::string&) -> absl::Status { + return absl::FailedPreconditionError( + "Gemini AI runtime is disabled in this build"); + }; +#endif + agent_editor_.GetChatWidget()->SetMultimodalCallbacks(multimodal_callbacks); // Set up Z3ED command callbacks for proposal management diff --git a/src/cli/service/agent/proposal_executor.cc b/src/cli/service/agent/proposal_executor.cc index 55b4c7c0..05c919a4 100644 --- a/src/cli/service/agent/proposal_executor.cc +++ b/src/cli/service/agent/proposal_executor.cc @@ -1,5 +1,21 @@ #include "cli/service/agent/proposal_executor.h" +#ifndef YAZE_AI_RUNTIME_AVAILABLE + +#include "absl/status/status.h" + +namespace yaze::cli::agent { + +absl::StatusOr CreateProposalFromAgentResponse( + const ProposalCreationRequest&) { + return absl::FailedPreconditionError( + "AI runtime features are disabled in this build"); +} + +} // namespace yaze::cli::agent + +#else // YAZE_AI_RUNTIME_AVAILABLE + #include #include #include @@ -180,3 +196,5 @@ absl::StatusOr CreateProposalFromAgentResponse( } // namespace agent } // namespace cli } // namespace yaze + +#endif // YAZE_AI_RUNTIME_AVAILABLE diff --git a/src/cli/service/ai/gemini_ai_service.h b/src/cli/service/ai/gemini_ai_service.h index 37483c76..19ad4b80 100644 --- a/src/cli/service/ai/gemini_ai_service.h +++ b/src/cli/service/ai/gemini_ai_service.h @@ -7,7 +7,10 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" #include "cli/service/ai/ai_service.h" + +#ifdef YAZE_AI_RUNTIME_AVAILABLE #include "cli/service/ai/prompt_builder.h" +#endif namespace yaze { namespace cli { @@ -27,6 +30,8 @@ struct GeminiConfig { explicit GeminiConfig(const std::string& key) : api_key(key) {} }; +#ifdef YAZE_AI_RUNTIME_AVAILABLE + class GeminiAIService : public AIService { public: explicit GeminiAIService(const GeminiConfig& config); @@ -65,6 +70,37 @@ class GeminiAIService : public AIService { PromptBuilder prompt_builder_; }; +#else // !YAZE_AI_RUNTIME_AVAILABLE + +class GeminiAIService : public AIService { + public: + explicit GeminiAIService(const GeminiConfig&) {} + void SetRomContext(Rom*) override {} + absl::StatusOr GenerateResponse( + const std::string& prompt) override { + return absl::FailedPreconditionError( + "Gemini AI runtime is disabled (prompt: " + prompt + ")"); + } + absl::StatusOr GenerateResponse( + const std::vector&) override { + return absl::FailedPreconditionError( + "Gemini AI runtime is disabled"); + } + absl::Status CheckAvailability() { + return absl::FailedPreconditionError( + "Gemini AI runtime is disabled"); + } + void EnableFunctionCalling(bool) {} + std::vector GetAvailableTools() const { return {}; } + absl::StatusOr GenerateMultimodalResponse( + const std::string&, const std::string&) { + return absl::FailedPreconditionError( + "Gemini AI runtime is disabled"); + } +}; + +#endif // YAZE_AI_RUNTIME_AVAILABLE + } // namespace cli } // namespace yaze diff --git a/src/cli/service/ai/ollama_ai_service.h b/src/cli/service/ai/ollama_ai_service.h index 4c3828f7..9d7bbe81 100644 --- a/src/cli/service/ai/ollama_ai_service.h +++ b/src/cli/service/ai/ollama_ai_service.h @@ -9,7 +9,10 @@ #include "absl/status/statusor.h" #include "absl/time/time.h" #include "cli/service/ai/ai_service.h" + +#ifdef YAZE_AI_RUNTIME_AVAILABLE #include "cli/service/ai/prompt_builder.h" +#endif namespace yaze { namespace cli { @@ -17,7 +20,7 @@ namespace cli { // Ollama configuration for local LLM inference struct OllamaConfig { std::string base_url = "http://localhost:11434"; // Default Ollama endpoint - std::string model = "qwen2.5-coder:7b"; // Recommended for code generation + std::string model = "qwen2.5-coder:0.5b"; // Lightweight default with tool-calling float temperature = 0.1; // Low temp for deterministic commands int max_tokens = 2048; // Sufficient for command lists std::string system_prompt; // Injected from resource catalogue @@ -30,6 +33,8 @@ struct OllamaConfig { std::vector favorite_models; }; +#ifdef YAZE_AI_RUNTIME_AVAILABLE + class OllamaAIService : public AIService { public: explicit OllamaAIService(const OllamaConfig& config); @@ -69,6 +74,44 @@ class OllamaAIService : public AIService { absl::StatusOr ParseOllamaResponse(const std::string& json_response); }; +#else // !YAZE_AI_RUNTIME_AVAILABLE + +class OllamaAIService : public AIService { + public: + struct ModelInfo { + std::string name; + std::string digest; + std::string family; + std::string parameter_size; + std::string quantization_level; + uint64_t size_bytes = 0; + absl::Time modified_at = absl::InfinitePast(); + }; + + explicit OllamaAIService(const OllamaConfig&) {} + void SetRomContext(Rom*) override {} + absl::StatusOr GenerateResponse( + const std::string&) override { + return absl::FailedPreconditionError( + "Ollama AI runtime is disabled"); + } + absl::StatusOr GenerateResponse( + const std::vector&) override { + return absl::FailedPreconditionError( + "Ollama AI runtime is disabled"); + } + absl::Status CheckAvailability() { + return absl::FailedPreconditionError( + "Ollama AI runtime is disabled"); + } + absl::StatusOr> ListAvailableModels() { + return absl::FailedPreconditionError( + "Ollama AI runtime is disabled"); + } +}; + +#endif // YAZE_AI_RUNTIME_AVAILABLE + } // namespace cli } // namespace yaze diff --git a/src/cli/service/ai/service_factory.cc b/src/cli/service/ai/service_factory.cc index 4d944396..b22b0a32 100644 --- a/src/cli/service/ai/service_factory.cc +++ b/src/cli/service/ai/service_factory.cc @@ -1,5 +1,6 @@ #include "cli/service/ai/service_factory.h" +#include #include #include @@ -112,6 +113,8 @@ absl::StatusOr> CreateAIServiceStrict( ollama_config.base_url = config.ollama_host; if (!config.model.empty()) { ollama_config.model = config.model; + } else if (const char* env_model = std::getenv("OLLAMA_MODEL")) { + ollama_config.model = env_model; } auto service = std::make_unique(ollama_config); diff --git a/src/cli/service/ai/service_factory_stub.cc b/src/cli/service/ai/service_factory_stub.cc new file mode 100644 index 00000000..c1915ea9 --- /dev/null +++ b/src/cli/service/ai/service_factory_stub.cc @@ -0,0 +1,27 @@ +#ifndef YAZE_AI_RUNTIME_AVAILABLE + +#include "cli/service/ai/service_factory.h" + +#include "absl/status/status.h" +#include "absl/status/statusor.h" + +namespace yaze::cli { + +std::unique_ptr CreateAIService() { + return std::make_unique(); +} + +std::unique_ptr CreateAIService(const AIServiceConfig&) { + return std::make_unique(); +} + +absl::StatusOr> CreateAIServiceStrict( + const AIServiceConfig&) { + return absl::FailedPreconditionError( + "AI runtime features are disabled in this build"); +} + +} // namespace yaze::cli + +#endif // !YAZE_AI_RUNTIME_AVAILABLE +