-
Notifications
You must be signed in to change notification settings - Fork 2
feat(gemini): Phase 1 -- basic chat (generateContent) #1593
Copy link
Copy link
Closed
Labels
enhancementNew feature or requestNew feature or request
Description
Part of #1592
Scope
Implement the basic non-streaming chat provider for Google Gemini using the generateContent endpoint.
Files to Create
crates/zeph-llm/src/gemini.rs-- GeminiProvider struct, request/response types, LlmProvider impl
Files to Modify
crates/zeph-llm/src/lib.rs-- addpub mod gemini;crates/zeph-llm/src/any.rs-- addGemini(GeminiProvider)variant, delegate_provider, list_models_remote, set_status_tx, with_generation_overridescrates/zeph-core/src/config/types.rs-- addGeminitoProviderKind,GeminiConfigstruct,gemini_api_keytoResolvedSecretscrates/zeph-core/src/bootstrap/provider.rs-- addProviderKind::Geminiarm increate_provider,"gemini"arm increate_named_providercrates/zeph-core/src/instructions.rs-- addProviderKind::Geminitodetection_pathsmatchsrc/init.rs-- add Gemini option to provider selection wizardsrc/acp.rs-- add Gemini arm to ACP model switching
Key Implementation Details
- API key via
?key=query param (NOT Authorization header) - System messages extracted into
systemInstructionfield (separate fromcontents) - Role mapping:
User->"user",Assistant->"model" - Model name in URL path:
/v1beta/models/{model}:generateContent - Parse
candidates[0].content.parts[0].textfrom response - Track
usageMetadataforlast_usage()(promptTokenCount, candidatesTokenCount) - Context window lookup by model name (1M for 2.5-pro/flash, 2.0-flash)
Request/Response Types
GeminiRequest { contents, system_instruction, generation_config }
GeminiContent { role, parts }
GeminiPart { text?, inline_data?, function_call?, function_response? }
GeminiGenerationConfig { temperature, top_p, top_k, max_output_tokens }
GeminiResponse { candidates, usage_metadata }
GeminiCandidate { content, finish_reason }
GeminiUsageMetadata { prompt_token_count, candidates_token_count, total_token_count }
Acceptance Criteria
-
provider = "gemini"in config.toml works end-to-end - Non-streaming chat produces correct responses
- API key resolved from vault (
ZEPH_GEMINI_API_KEY) - Error handling: rate limit, invalid key, model not found
-
context_window()returns correct value per model -
name()returns"gemini" -
supports_streaming()returnsfalse(Phase 2) -
supports_tool_use()returnsfalse(Phase 3) -
supports_embeddings()returnsfalse(Phase 5) -
supports_vision()returnstrue -
debug_request_json()mirrors actual API payload - Init wizard includes Gemini option
- Unit tests with wiremock for success/error paths
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request