summarizer = KagiSummarizerService.new
- # Determine what content to summarize based on post type
content_to_summarize = if @post.bookmark? && @post.url.present?
Rails.logger.debug "Using URL for summarization: #{@post.url}"
@post.url
elsif @post.content.present?
Rails.logger.debug "Using content for summarization (first 100 chars): #{@post.content.truncate(100)}"
@post.content
- else
- Rails.logger.warn "No content available for summarization"
- nil
end
if content_to_summarize.nil?
type = @post.bookmark? && @post.url.present? ? :url : :text
result = summarizer.summarize(content_to_summarize, type)
- Rails.logger.debug "Summarization result: #{result.inspect}"
-
- if result && result['output'].present?
- success = @post.update(summary: result['output'])
- Rails.logger.debug "Update post with summary: #{success ? 'successful' : 'failed'}"
- if success
+ Rails.logger.debug "Full API result: #{result.inspect}"
+
+ # Always store the API response and timestamp
+ @post.update(
+ summarizer_api_response: {
+ response_body: result[:raw_response],
+ status_code: result[:status_code],
+ timestamp: Time.current
+ },
+ last_summarized_at: Time.current
+ )
+
+ if result[:success] && result[:parsed_response]
+ summary_text = result[:parsed_response]['output'] ||
+ result[:parsed_response].dig('data', 'output') ||
+ result[:parsed_response]['summary'] ||
+ result[:parsed_response].dig('data', 'summary')
+
+ if summary_text.present?
+ @post.update(summary: summary_text)
redirect_to @post, notice: 'Summary generated successfully.'
else
- Rails.logger.error "Failed to save summary: #{@post.errors.full_messages}"
- redirect_to @post, alert: "Failed to save summary: #{@post.errors.full_messages.join(', ')}"
+ redirect_to @post, alert: 'API response did not contain expected summary content.'
end
else
- error_message = if result
- "API returned success but no summary output was present"
- else
- "Failed to generate summary from API"
- end
- Rails.logger.error error_message
- redirect_to @post, alert: error_message
+ redirect_to @post, alert: "API request failed with status #{result[:status_code]}"
end
end
+
private
# Use callbacks to share common setup or constraints between actions.
def set_post
response = self.class.post('/summarize', @options.merge(body: body.to_json))
Rails.logger.debug "Received response from Kagi API: Status #{response.code}, Body: #{response.body}"
- if response.success?
- parsed_response = JSON.parse(response.body)
- Rails.logger.debug "Parsed response: #{parsed_response.inspect}"
- parsed_response
- else
- Rails.logger.error "Kagi API error: #{response.code} - #{response.body}"
- Rails.logger.error "Full response object: #{response.inspect}"
- nil
- end
+ # Return both the parsed response and the raw response
+ {
+ success: response.success?,
+ status_code: response.code,
+ raw_response: response.body,
+ parsed_response: response.success? ? JSON.parse(response.body) : nil
+ }
end
end
<%= link_to "View", post, class: "button small" %>
<%= link_to "Edit", edit_post_path(post), class: "button small" %>
<%= link_to "Delete", post, method: :delete, data: { confirm: "Are you sure you want to delete this post?" }, class: "button small danger" %>
- <%= button_to "Generate Summary", summarize_post_path(post), class: "button small summary", data: { confirm: 'This will call the Kagi API. Continue?' } %>
+ <%= if post.summary.blank? then button_to "Generate Summary", summarize_post_path(post), class: "button small summary", data: { confirm: 'This will call the Kagi API. Continue?' } end %>
</td>
</tr>
<% end %>
<div>
<%= link_to "Edit this post", edit_post_path(@post), class: "button" %>
- <%= button_to "Summarise this post", summarize_post_path(@post), class: "button" %>
+ <%= if @post.summary.blank? then button_to "Summarise this post", summarize_post_path(@post), class: "button" end %>
<%= button_to "Destroy this post", @post, method: :delete %>
</div>
</div>
--- /dev/null
+class AddApiResponseToPosts < ActiveRecord::Migration[7.2]
+ def change
+ add_column :posts, :summarizer_api_response, :json
+ add_column :posts, :last_summarized_at, :datetime
+ end
+end
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.2].define(version: 2024_12_08_061729) do
+ActiveRecord::Schema[7.2].define(version: 2024_12_08_065057) do
create_table "api_keys", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t|
t.string "key"
t.datetime "created_at", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.text "summary"
+ t.json "summarizer_api_response"
+ t.datetime "last_summarized_at"
t.index ["post_type"], name: "index_posts_on_post_type"
t.index ["published_at"], name: "index_posts_on_published_at"
t.index ["slug"], name: "index_posts_on_slug", unique: true