refactor(providers): improve readability of embedded.rs and gemini.rs

embedded.rs (937→789 lines, -16%):
- Extract duplicated inference setup into prepare_context() helper
- Extract stop sequence handling into find_stop_sequence() and truncate_at_stop_sequence()
- Add InferenceParams struct to consolidate request parameter extraction
- Add clear section markers for code organization
- Tests now use module-level format functions directly (no duplication)

gemini.rs:
- Extract common request building into build_request() method
- Reduces duplication between complete() and stream() methods

All 399 unit tests pass. Behavior unchanged.

Agent: carmack
This commit is contained in:
Dhanji R. Prasanna
2026-01-29 11:39:46 +11:00
parent bd4473b75f
commit d4941dc95a
2 changed files with 432 additions and 584 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -523,12 +523,11 @@ fn try_parse_json_from_buffer(buffer: &mut String) -> Option<String> {
// LLMProvider Implementation // LLMProvider Implementation
// ============================================================================ // ============================================================================
#[async_trait] impl GeminiProvider {
impl LLMProvider for GeminiProvider { /// Build a GeminiRequest from a CompletionRequest.
async fn complete(&self, request: CompletionRequest) -> Result<CompletionResponse> { fn build_request(&self, request: &CompletionRequest) -> GeminiRequest {
let (contents, system_instruction) = convert_messages(&request.messages); let (contents, system_instruction) = convert_messages(&request.messages);
GeminiRequest {
let gemini_request = GeminiRequest {
contents, contents,
system_instruction, system_instruction,
tools: request.tools.as_ref().map(|t| convert_tools(t)), tools: request.tools.as_ref().map(|t| convert_tools(t)),
@@ -536,7 +535,14 @@ impl LLMProvider for GeminiProvider {
max_output_tokens: request.max_tokens.or(Some(self.max_tokens)), max_output_tokens: request.max_tokens.or(Some(self.max_tokens)),
temperature: request.temperature.or(Some(self.temperature)), temperature: request.temperature.or(Some(self.temperature)),
}, },
}; }
}
}
#[async_trait]
impl LLMProvider for GeminiProvider {
async fn complete(&self, request: CompletionRequest) -> Result<CompletionResponse> {
let gemini_request = self.build_request(&request);
let url = self.get_api_url(false); let url = self.get_api_url(false);
debug!("Gemini request URL: {}", url); debug!("Gemini request URL: {}", url);
@@ -579,17 +585,7 @@ impl LLMProvider for GeminiProvider {
} }
async fn stream(&self, request: CompletionRequest) -> Result<CompletionStream> { async fn stream(&self, request: CompletionRequest) -> Result<CompletionStream> {
let (contents, system_instruction) = convert_messages(&request.messages); let gemini_request = self.build_request(&request);
let gemini_request = GeminiRequest {
contents,
system_instruction,
tools: request.tools.as_ref().map(|t| convert_tools(t)),
generation_config: GeminiGenerationConfig {
max_output_tokens: request.max_tokens.or(Some(self.max_tokens)),
temperature: request.temperature.or(Some(self.temperature)),
},
};
// For streaming, add alt=sse parameter // For streaming, add alt=sse parameter
let url = format!("{}&alt=sse", self.get_api_url(true)); let url = format!("{}&alt=sse", self.get_api_url(true));