Class: GithubDailyDigest::GeminiService
- Inherits:
-
Object
- Object
- GithubDailyDigest::GeminiService
- Defined in:
- lib/gemini_service.rb
Constant Summary collapse
- DEFAULT_MODEL =
Default model - will be overridden by configuration
'gemini-2.5-flash-preview-04-17'- EXPECTED_KEYS =
Keys expected in the Gemini JSON response
%w[projects changes contribution_weights pr_count summary lines_changed].freeze
Instance Attribute Summary collapse
-
#client ⇒ Object
readonly
Returns the value of attribute client.
Instance Method Summary collapse
- #analyze_activity(username:, commits_with_code:, review_count:, time_window_days:) ⇒ Object
-
#initialize(api_key:, logger:, config:, github_graphql_service:) ⇒ GeminiService
constructor
A new instance of GeminiService.
- #initialize_client(api_key, model) ⇒ Object
Constructor Details
#initialize(api_key:, logger:, config:, github_graphql_service:) ⇒ GeminiService
Returns a new instance of GeminiService.
15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/gemini_service.rb', line 15 def initialize(api_key:, logger:, config:, github_graphql_service:) @logger = logger @config = config @github_graphql_service = github_graphql_service @model = config.gemini_model || DEFAULT_MODEL initialize_client(api_key, @model) rescue => e @logger.fatal("Failed to initialize Gemini client: #{e.}") raise end |
Instance Attribute Details
#client ⇒ Object (readonly)
Returns the value of attribute client.
13 14 15 |
# File 'lib/gemini_service.rb', line 13 def client @client end |
Instance Method Details
#analyze_activity(username:, commits_with_code:, review_count:, time_window_days:) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/gemini_service.rb', line 41 def analyze_activity(username:, commits_with_code:, review_count:, time_window_days:) # If there are no commits and no reviews, return empty data if commits_with_code.empty? && review_count == 0 @logger.info("No activity found for #{username} to analyze.") return default_no_activity_report else @logger.debug("Found activity for #{username}: #{commits_with_code.size} commits in repositories: #{commits_with_code.map { |c| c[:repo] }.uniq.join(', ')}") end # Make multiple attempts to analyze with Gemini, handle errors gracefully begin prompt = build_prompt(username, commits_with_code, review_count, time_window_days) # @logger.debug("Gemini Prompt for #{username}:\n#{prompt}") # Uncomment for debugging prompts response_text = execute_gemini_request(prompt, username) @logger.debug("Gemini response for #{username}: #{response_text}") if response_text return parse_and_validate_response(response_text, username) else # Failure occurred within execute_gemini_request (already logged) @logger.warn("Gemini analysis failed for #{username}, using fallback analysis.") return create_fallback_analysis(username, commits_with_code, review_count) end rescue => e @logger.error("Unexpected error analyzing #{username}'s activity: #{e.}") @logger.warn("Using fallback analysis due to error.") return create_fallback_analysis(username, commits_with_code, review_count) end end |
#initialize_client(api_key, model) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/gemini_service.rb', line 27 def initialize_client(api_key, model) @logger.info("Initializing Gemini client with model: #{model}") @client = Gemini.new( credentials: { service: 'generative-language-api', api_key: api_key }, options: { model: model } ) end |