jekyll_ai_related_posts 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/README.md +53 -5
- data/gemfiles/current.gemfile +15 -0
- data/gemfiles/jekyll3.gemfile +18 -0
- data/lib/jekyll_ai_related_posts/generator.rb +6 -6
- data/lib/jekyll_ai_related_posts/version.rb +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dde47b3847f5f2578a80f8f208049f912d409e7812a2927dda4ea333b0b8cd82
|
4
|
+
data.tar.gz: 9d94d4dd9695b96467349818d20f961ac9a55f9bd5c4968c3703636854d71edb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 857d8f3e381b1f4f3d52c411cc5ab630f4539ab735df57b33276f5b9df0647bebe44319b3a8a2a647f75cc3910409863aeae56d412dd48827fa5116870ea7975
|
7
|
+
data.tar.gz: eab136bfd7e226dcc0dfd71c14a0a9924b5e3aa59f8c376200129b3237e39f7e47ce540d55d03a080d834ebe56306b5827de44d8e55b9f04e71aedfbc3c9b60a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
|
3
|
+
- [Bugfix] Include up to 10 related posts (like native Jekyll does) instead of just 3.
|
4
|
+
|
5
|
+
## [0.1.1] - 2024-04-23
|
6
|
+
|
7
|
+
- [Bugfix] Exception when running in cache-only mode.
|
8
|
+
|
9
|
+
## [0.1.0] - 2024-04-23
|
4
10
|
|
5
11
|
- Initial release
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Jekyll AI Related Posts 🪄
|
2
2
|
|
3
|
+
Rubygems: [jekyll_ai_related_posts](https://rubygems.org/gems/jekyll_ai_related_posts)
|
4
|
+
|
3
5
|
Jekyll ships with functionality that populates
|
4
6
|
[related_posts](https://jekyllrb.com/docs/variables/) with the ten most recent
|
5
7
|
posts. If you install
|
@@ -18,7 +20,22 @@ posts with the accuracy of OpenAI's models (or any other LLM, for that matter).
|
|
18
20
|
|
19
21
|
Jekyll AI Related Posts is a [Jekyll
|
20
22
|
plugin](https://jekyllrb.com/docs/plugins/installation/). It can be installed
|
21
|
-
using any Jekyll plugin installation method.
|
23
|
+
using any Jekyll plugin installation method. For example, in your `_config.yml`:
|
24
|
+
|
25
|
+
```yaml
|
26
|
+
plugins:
|
27
|
+
- jekyll_ai_related_posts
|
28
|
+
```
|
29
|
+
|
30
|
+
You should also ignore the cache files that this plugin generates. (This will
|
31
|
+
help avoid a regeneration loop when using `jekyll serve`.)
|
32
|
+
|
33
|
+
```yaml
|
34
|
+
exclude:
|
35
|
+
- .ai_related_posts_cache.sqlite3
|
36
|
+
- .ai_related_posts_cache.sqlite3-journal
|
37
|
+
```
|
38
|
+
|
22
39
|
|
23
40
|
## Configuration
|
24
41
|
|
@@ -57,6 +74,27 @@ to use it:
|
|
57
74
|
</ul>
|
58
75
|
```
|
59
76
|
|
77
|
+
### First Run
|
78
|
+
|
79
|
+
The first time the plugin runs, it will fetch embeddings for all your posts.
|
80
|
+
Based on some light testing, this took me 0.5 sec per post, or about 50 sec for
|
81
|
+
a blog with 100 posts. All subsequent runs will be faster since embeddings will
|
82
|
+
be cached.
|
83
|
+
|
84
|
+
### Performance
|
85
|
+
|
86
|
+
On an example blog with ~100 posts, this plugin produces more accurate results
|
87
|
+
than classifier-reborn (LSI) in about the same amount of time. See [this blog
|
88
|
+
post](https://www.mikekasberg.com/blog/2024/04/23/better-related-posts-in-jekyll-using-ai.html)
|
89
|
+
for details.
|
90
|
+
|
91
|
+
### Cost
|
92
|
+
|
93
|
+
The API costs to use this plugin with OpenAI's API are minimal. I ran this
|
94
|
+
plugin for all 84 posts on [mikekasberg.com](https://www.mikekasberg.com) for
|
95
|
+
$0.00 in API fees (1,277 tokens on the text-embedding-3-small model). (Your
|
96
|
+
results may vary, but should remain inexpensive.)
|
97
|
+
|
60
98
|
### Upgrading from Built-In Related Posts
|
61
99
|
|
62
100
|
If you're already using Jekyll's built-in `site.related_posts` and you want to
|
@@ -68,6 +106,17 @@ upgrade to AI related posts:
|
|
68
106
|
option to the `jekyll` command. You can remove the `classifier-reborn` gem and
|
69
107
|
its dependencies (Numo).
|
70
108
|
|
109
|
+
### Cache File (.ai_related_posts_cache.sqlite3)
|
110
|
+
|
111
|
+
This plugin will cache embeddings in `.ai_related_posts_cache.sqlite3` in your
|
112
|
+
Jekyll source root (typically the root of your project directory). The file
|
113
|
+
itself is a SQLite database file. For most cases, I'd recommend adding this file
|
114
|
+
to your `.gitignore` since it's a binary cache file. However, you _may_ choose
|
115
|
+
to check it in to git if, for example, you want to share cached embeddings
|
116
|
+
across many machines (and are willing to check in a binary file on the order of
|
117
|
+
1-10Mb to do so). If the file is not present, it will be re-created and
|
118
|
+
embeddings will be fetched from the API (which may result in higher API usage
|
119
|
+
fees if done frequently).
|
71
120
|
|
72
121
|
## How It Works
|
73
122
|
|
@@ -88,10 +137,9 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
88
137
|
`rake spec` to run the tests. You can also run `bin/console` for an interactive
|
89
138
|
prompt that will allow you to experiment.
|
90
139
|
|
91
|
-
To
|
92
|
-
|
93
|
-
|
94
|
-
git commits and the created tag, and push the `.gem` file to
|
140
|
+
To release a new version, update the version number in `version.rb`, and then
|
141
|
+
run `bundle exec rake release`, which will create a git tag for the version,
|
142
|
+
push git commits and the created tag, and push the `.gem` file to
|
95
143
|
[rubygems.org](https://rubygems.org).
|
96
144
|
|
97
145
|
## Contributing
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
# Specify your gem's dependencies in jekyll_ai_related_posts.gemspec
|
6
|
+
gemspec path: '../'
|
7
|
+
|
8
|
+
gem "rake", "~> 13.0"
|
9
|
+
|
10
|
+
gem "rspec", "~> 3.0"
|
11
|
+
|
12
|
+
gem "rubocop", "~> 1.21"
|
13
|
+
gem "rubocop-rails-omakase", require: false
|
14
|
+
|
15
|
+
gem "debug"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gem "jekyll", "~> 3.9"
|
6
|
+
gem "kramdown-parser-gfm"
|
7
|
+
|
8
|
+
# Specify your gem's dependencies in jekyll_ai_related_posts.gemspec
|
9
|
+
gemspec path: '../'
|
10
|
+
|
11
|
+
gem "rake", "~> 13.0"
|
12
|
+
|
13
|
+
gem "rspec", "~> 3.0"
|
14
|
+
|
15
|
+
gem "rubocop", "~> 1.21"
|
16
|
+
gem "rubocop-rails-omakase", require: false
|
17
|
+
|
18
|
+
gem "debug"
|
@@ -12,6 +12,11 @@ module JekyllAiRelatedPosts
|
|
12
12
|
@site = site
|
13
13
|
setup_database
|
14
14
|
|
15
|
+
@indexed_posts = {}
|
16
|
+
site.posts.docs.each do |p|
|
17
|
+
@indexed_posts[p.relative_path] = p
|
18
|
+
end
|
19
|
+
|
15
20
|
if fetch_enabled?
|
16
21
|
Jekyll.logger.info "[ai_related_posts] Generating related posts..."
|
17
22
|
@embeddings_fetcher = new_fetcher
|
@@ -20,11 +25,6 @@ module JekyllAiRelatedPosts
|
|
20
25
|
ensure_embedding_cached(p)
|
21
26
|
end
|
22
27
|
|
23
|
-
@indexed_posts = {}
|
24
|
-
site.posts.docs.each do |p|
|
25
|
-
@indexed_posts[p.relative_path] = p
|
26
|
-
end
|
27
|
-
|
28
28
|
@site.posts.docs.each do |p|
|
29
29
|
find_related(p)
|
30
30
|
end
|
@@ -111,7 +111,7 @@ module JekyllAiRelatedPosts
|
|
111
111
|
relative_path: post.relative_path
|
112
112
|
} ]))
|
113
113
|
# The first result is the post itself, with a distance of 0.
|
114
|
-
rowids = results.sort_by { |r| r["distance"] }.drop(1).first(
|
114
|
+
rowids = results.sort_by { |r| r["distance"] }.drop(1).first(10).map { |r| r["rowid"] }
|
115
115
|
|
116
116
|
posts_by_rowid = {}
|
117
117
|
rowids.each do |rowid|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll_ai_related_posts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Kasberg
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '7.
|
19
|
+
version: '7.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '7.
|
26
|
+
version: '7.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: faraday
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,6 +107,8 @@ files:
|
|
107
107
|
- LICENSE.txt
|
108
108
|
- README.md
|
109
109
|
- Rakefile
|
110
|
+
- gemfiles/current.gemfile
|
111
|
+
- gemfiles/jekyll3.gemfile
|
110
112
|
- lib/jekyll_ai_related_posts.rb
|
111
113
|
- lib/jekyll_ai_related_posts/generator.rb
|
112
114
|
- lib/jekyll_ai_related_posts/models/post.rb
|
@@ -119,7 +121,7 @@ metadata:
|
|
119
121
|
allowed_push_host: https://rubygems.org
|
120
122
|
homepage_uri: https://github.com/mkasberg/jekyll_ai_related_posts
|
121
123
|
source_code_uri: https://github.com/mkasberg/jekyll_ai_related_posts
|
122
|
-
changelog_uri: https://github.com/mkasberg/jekyll_ai_related_posts
|
124
|
+
changelog_uri: https://github.com/mkasberg/jekyll_ai_related_posts/blob/main/CHANGELOG.md
|
123
125
|
post_install_message:
|
124
126
|
rdoc_options: []
|
125
127
|
require_paths:
|