ollama-ruby 0.9.2 → 0.10.0
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/CHANGES.md +31 -1
- data/Rakefile +3 -2
- data/bin/ollama_chat +39 -32
- data/lib/ollama/documents/cache/common.rb +16 -1
- data/lib/ollama/documents.rb +7 -10
- data/lib/ollama/handlers/markdown.rb +2 -1
- data/lib/ollama/utils/colorize_texts.rb +4 -1
- data/lib/ollama/version.rb +1 -1
- data/lib/ollama.rb +0 -2
- data/ollama-ruby.gemspec +9 -8
- metadata +23 -11
- data/lib/ollama/utils/ansi_markdown.rb +0 -217
- data/lib/ollama/utils/width.rb +0 -39
- data/spec/ollama/utils/ansi_markdown_spec.rb +0 -15
- data/spec/ollama/utils/width_spec.rb +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17d71b1a18444b7e2d80e3e0da1e56c38140eaa47ac671aef4968f3cc2cb8c56
|
4
|
+
data.tar.gz: f395c4750e3a440739423906fb722ae2f7c1feedd31f417f4dc1e6677a5d86ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff1b123a36389fcc17dcaf45e8fc655fad7a8d143825621645606178346d09becba16ba5586031bf983d5c951cebbdb03a0720a41c2d3211fe47d4d9c8b244c2
|
7
|
+
data.tar.gz: 33700ca555ce9328d753544ba964a6482416bf62bac22fb358a2eb1cb214a7c85d6df9fa9b54b2e22cc673f45da8df03821f2c41b2d8361e4313626197c3fea5
|
data/CHANGES.md
CHANGED
@@ -1,8 +1,38 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 2024-10-31 v0.10.0
|
4
|
+
|
5
|
+
* Improved URL and tag parsing in `parse_content`:
|
6
|
+
+ Added support for `file://` protocol to content scans.
|
7
|
+
+ Updated regex pattern to match local files starting with `~`, `.`, or `/`.
|
8
|
+
+ Remove # anchors for file URLs (and files)
|
9
|
+
* Improved parsing of content in ollama_chat:
|
10
|
+
+ Use `content.scan(%r((https?://\S+)|(#\S+)|(\S+\/\S+)))` to match URLs, tags and files.
|
11
|
+
+ For foo/bar file pathes prepend `./`foo/bar, for foo you have to enter ./foo still.
|
12
|
+
+ Added a check for file existence before fetching its content
|
13
|
+
* Move vector methods into cache implementations:
|
14
|
+
+ Update `documents.rb` to use `@cache.norm` and `@cache.cosine_similarity`
|
15
|
+
+ Remove unused code in `documents.rb` (including `Ollama::Utils::Math`)
|
16
|
+
+ Add `include Ollama::Utils::Math` in `cache/common.rb`
|
17
|
+
* Document existing collections, pre, and unpre methods:
|
18
|
+
+ Update module Ollama::Documents::Cache::Common to include documentation for existing methods
|
19
|
+
* Use kramdown-ansi gem for Markdown output in terminal:
|
20
|
+
+ Update `kramdown-ansi` to **0.0** in Gemfile and Rakefile
|
21
|
+
+ Remove `ollama/utils/width.rb` as it's no longer needed
|
22
|
+
+ Remove `spec/ollama/utils/width_spec.rb` and `spec/ollama/utils/ansi_markdown_spec.rb` as they're not used anymore
|
23
|
+
+ Update `ollama-ruby.gemspec` to reflect the new dependencies and remove unused files
|
24
|
+
* Updated print messages to include `.to_s.inspect` for accurate inspection of
|
25
|
+
source content in `ollama_chat`.
|
26
|
+
|
27
|
+
## 2024-10-21 v0.9.3
|
28
|
+
|
29
|
+
* Update dependencies and date:
|
30
|
+
+ dependency `complex_config` updated to `~> 0.22` and `>= 0.22.2`
|
31
|
+
+ Date changed in ollama-ruby.gemspec from "2024-10-20" to "2024-10-21"
|
32
|
+
|
3
33
|
## 2024-10-20 v0.9.2
|
4
34
|
|
5
|
-
* Added SourceParsing module and update parse_source method to use it:
|
35
|
+
* Added SourceParsing module and update `parse_source` method to use it:
|
6
36
|
+ Added `SourceParsing` module with `parse_source` method that handles
|
7
37
|
different file types (e.g. HTML, XML, CSV, RSS)
|
8
38
|
+ Added `parse_csv` method to `SourceParsing` module
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ GemHadar do
|
|
14
14
|
test_dir 'spec'
|
15
15
|
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.AppleDouble', '.bundle',
|
16
16
|
'.yardoc', 'doc', 'tags', 'errors.lst', 'cscope.out', 'coverage', 'tmp',
|
17
|
-
'corpus'
|
17
|
+
'corpus', 'yard'
|
18
18
|
package_ignore '.all_images.yml', '.tool-versions', '.gitignore', 'VERSION',
|
19
19
|
'.rspec', *Dir.glob('.github/**/*', File::FNM_DOTMATCH)
|
20
20
|
readme 'README.md'
|
@@ -34,7 +34,7 @@ GemHadar do
|
|
34
34
|
dependency 'more_math', '~> 1.1'
|
35
35
|
dependency 'mime-types', '~> 3.0'
|
36
36
|
dependency 'reverse_markdown', '~> 2.0'
|
37
|
-
dependency 'complex_config', '~> 0.22'
|
37
|
+
dependency 'complex_config', '~> 0.22', '>= 0.22.2'
|
38
38
|
dependency 'search_ui', '~> 0.0'
|
39
39
|
dependency 'amatch', '~> 0.4.1'
|
40
40
|
dependency 'pdf-reader', '~> 2.0'
|
@@ -42,6 +42,7 @@ GemHadar do
|
|
42
42
|
dependency 'json', '~> 2.0'
|
43
43
|
dependency 'xdg', '~> 7.0'
|
44
44
|
dependency 'tins', '~> 1.34'
|
45
|
+
dependency 'kramdown-ansi', '~> 0.0'
|
45
46
|
development_dependency 'all_images', '~> 0.4'
|
46
47
|
development_dependency 'rspec', '~> 3.2'
|
47
48
|
development_dependency 'webmock'
|
data/bin/ollama_chat
CHANGED
@@ -132,7 +132,7 @@ class FollowChat
|
|
132
132
|
content = response.message&.content
|
133
133
|
@messages.last.content << content
|
134
134
|
if @markdown and content = @messages.last.content.full?
|
135
|
-
markdown_content =
|
135
|
+
markdown_content = Kramdown::ANSI.parse(content)
|
136
136
|
@output.print clear_screen, move_home, @user, ?\n, markdown_content
|
137
137
|
else
|
138
138
|
@output.print content
|
@@ -159,7 +159,7 @@ class FollowChat
|
|
159
159
|
load_duration: Tins::Duration.new(response.load_duration / 1e9),
|
160
160
|
}.map { _1 * '=' } * ' '
|
161
161
|
'📊 ' + color(111) {
|
162
|
-
|
162
|
+
Kramdown::ANSI::Width.wrap(stats_text, percentage: 90).gsub(/(?<!\A)^/, ' ')
|
163
163
|
}
|
164
164
|
end
|
165
165
|
end
|
@@ -364,7 +364,7 @@ def list_conversation(messages, last = nil)
|
|
364
364
|
when 'system' then 213
|
365
365
|
else 210
|
366
366
|
end
|
367
|
-
content = m.content.full? { $markdown.on? ?
|
367
|
+
content = m.content.full? { $markdown.on? ? Kramdown::ANSI.parse(_1) : _1 }
|
368
368
|
message_text = message_type(m.images) + " "
|
369
369
|
message_text += bold { color(role_color) { m.role } }
|
370
370
|
message_text += ":\n#{content}"
|
@@ -539,7 +539,7 @@ end
|
|
539
539
|
|
540
540
|
def import_source(source_io, source)
|
541
541
|
source = source.to_s
|
542
|
-
puts "Importing #{italic { source_io&.content_type }} document #{source.inspect} now."
|
542
|
+
puts "Importing #{italic { source_io&.content_type }} document #{source.to_s.inspect} now."
|
543
543
|
source_content = parse_source(source_io)
|
544
544
|
"Imported #{source.inspect}:\n#{source_content}\n\n"
|
545
545
|
end
|
@@ -553,7 +553,7 @@ def import(source)
|
|
553
553
|
end
|
554
554
|
|
555
555
|
def summarize_source(source_io, source, words: nil)
|
556
|
-
puts "Summarizing #{italic { source_io&.content_type }} document #{source.inspect} now."
|
556
|
+
puts "Summarizing #{italic { source_io&.content_type }} document #{source.to_s.inspect} now."
|
557
557
|
words = words.to_i
|
558
558
|
words < 1 and words = 100
|
559
559
|
source_content = parse_source(source_io)
|
@@ -608,7 +608,7 @@ def embed_source(source_io, source, count: nil)
|
|
608
608
|
inputs or return
|
609
609
|
source = source.to_s
|
610
610
|
if source.start_with?(?!)
|
611
|
-
source =
|
611
|
+
source = Kramdown::ANSI::Width.truncate(
|
612
612
|
source[1..-1].gsub(/\W+/, ?_),
|
613
613
|
length: 10
|
614
614
|
)
|
@@ -638,31 +638,37 @@ def parse_content(content, images)
|
|
638
638
|
tags = Utils::Tags.new
|
639
639
|
|
640
640
|
contents = [ content ]
|
641
|
-
content.scan(%r((
|
642
|
-
case
|
643
|
-
when
|
644
|
-
tags.add(
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
641
|
+
content.scan(%r((https?://\S+)|(#\S+)|(?:file://)?(\S*\/\S+))).each do |url, tag, file|
|
642
|
+
case
|
643
|
+
when tag
|
644
|
+
tags.add(tag)
|
645
|
+
next
|
646
|
+
when file
|
647
|
+
file = file.sub(/#.*/, '')
|
648
|
+
file =~ %r(\A[~./]) or file.prepend('./')
|
649
|
+
File.exist?(file) or next
|
650
|
+
source = file
|
651
|
+
when url
|
652
|
+
source = url
|
653
|
+
end
|
654
|
+
fetch_source(source) do |source_io|
|
655
|
+
case source_io&.content_type&.media_type
|
656
|
+
when 'image'
|
657
|
+
add_image(images, source_io, source)
|
658
|
+
when 'text', 'application', nil
|
659
|
+
case $document_policy
|
660
|
+
when 'importing'
|
661
|
+
contents << import_source(source_io, source)
|
662
|
+
when 'embedding'
|
663
|
+
embed_source(source_io, source)
|
664
|
+
when 'summarizing'
|
665
|
+
contents << summarize_source(source_io, source)
|
665
666
|
end
|
667
|
+
else
|
668
|
+
STDERR.puts(
|
669
|
+
"Cannot fetch #{source.to_s.inspect} with content type "\
|
670
|
+
"#{source_io&.content_type.inspect}"
|
671
|
+
)
|
666
672
|
end
|
667
673
|
end
|
668
674
|
end
|
@@ -755,7 +761,7 @@ end
|
|
755
761
|
def show_system_prompt
|
756
762
|
puts <<~EOT
|
757
763
|
Configured system prompt is:
|
758
|
-
#{
|
764
|
+
#{Kramdown::ANSI.parse($system.to_s).gsub(/\n+\z/, '').full? || 'n/a'}
|
759
765
|
EOT
|
760
766
|
end
|
761
767
|
|
@@ -1165,7 +1171,8 @@ loop do
|
|
1165
1171
|
end
|
1166
1172
|
|
1167
1173
|
if location = at_location.full?
|
1168
|
-
content += " [#{location} – do not comment on this
|
1174
|
+
content += " [#{location} – do not comment on this the time and location, "\
|
1175
|
+
"just consider it for eventual queries]"
|
1169
1176
|
end
|
1170
1177
|
|
1171
1178
|
messages << Message.new(role: 'user', content:, images: images.dup)
|
@@ -1,16 +1,31 @@
|
|
1
1
|
module Ollama::Documents::Cache::Common
|
2
|
-
|
2
|
+
include Ollama::Utils::Math
|
3
3
|
|
4
|
+
attr_writer :prefix # current prefix defined for the cache
|
5
|
+
|
6
|
+
# Returns an array of collection names that match the given prefix.
|
7
|
+
#
|
8
|
+
# @param prefix [String] a string to search for in collection names
|
9
|
+
# @return [Array<Symbol>] an array of matching collection names
|
4
10
|
def collections(prefix)
|
5
11
|
unique = Set.new
|
6
12
|
full_each { |key, _| unique << key[/\A#{prefix}(.*)-/, 1] }
|
7
13
|
unique.map(&:to_sym)
|
8
14
|
end
|
9
15
|
|
16
|
+
# Returns a string representing the given `key` prefixed with the defined
|
17
|
+
# prefix.
|
18
|
+
#
|
19
|
+
# @param key [String] the key to join with the prefix
|
20
|
+
# @return [String] the joined string of prefix and key
|
10
21
|
def pre(key)
|
11
22
|
[ @prefix, key ].join
|
12
23
|
end
|
13
24
|
|
25
|
+
# Returns a string with the prefix removed from the given `key`.
|
26
|
+
#
|
27
|
+
# @param key [String] the input string containing the prefix.
|
28
|
+
# @return [String] the input string without the prefix.
|
14
29
|
def unpre(key)
|
15
30
|
key.sub(/\A#@prefix/, '')
|
16
31
|
end
|
data/lib/ollama/documents.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'numo/narray'
|
2
2
|
require 'digest'
|
3
|
+
require 'kramdown/ansi'
|
3
4
|
|
4
5
|
class Ollama::Documents
|
5
6
|
end
|
@@ -14,8 +15,7 @@ require 'ollama/documents/splitters/character'
|
|
14
15
|
require 'ollama/documents/splitters/semantic'
|
15
16
|
|
16
17
|
class Ollama::Documents
|
17
|
-
include
|
18
|
-
include Ollama::Utils::Width
|
18
|
+
include Kramdown::ANSI::Width
|
19
19
|
|
20
20
|
class Record < JSON::GenericObject
|
21
21
|
def to_s
|
@@ -79,7 +79,7 @@ class Ollama::Documents
|
|
79
79
|
batches.each do |batch|
|
80
80
|
embeddings = fetch_embeddings(model:, options: @model_options, input: batch)
|
81
81
|
batch.zip(embeddings) do |text, embedding|
|
82
|
-
norm = norm(embedding)
|
82
|
+
norm = @cache.norm(embedding)
|
83
83
|
self[text] = Record[text:, embedding:, norm:, source:, tags: tags.to_a]
|
84
84
|
end
|
85
85
|
infobar.progress by: batch.size
|
@@ -125,7 +125,7 @@ class Ollama::Documents
|
|
125
125
|
|
126
126
|
def find(string, tags: nil, prompt: nil)
|
127
127
|
needle = convert_to_vector(string, prompt:)
|
128
|
-
needle_norm = norm(needle)
|
128
|
+
needle_norm = @cache.norm(needle)
|
129
129
|
records = @cache
|
130
130
|
if tags
|
131
131
|
tags = Ollama::Utils::Tags.new(tags).to_a
|
@@ -133,7 +133,7 @@ class Ollama::Documents
|
|
133
133
|
end
|
134
134
|
records = records.sort_by { |key, record|
|
135
135
|
record.key = key
|
136
|
-
record.similarity = cosine_similarity(
|
136
|
+
record.similarity = @cache.cosine_similarity(
|
137
137
|
a: needle,
|
138
138
|
b: record.embedding,
|
139
139
|
a_norm: needle_norm,
|
@@ -193,11 +193,8 @@ class Ollama::Documents
|
|
193
193
|
if prompt
|
194
194
|
input = prompt % input
|
195
195
|
end
|
196
|
-
|
197
|
-
|
198
|
-
else
|
199
|
-
super(input)
|
200
|
-
end
|
196
|
+
input.is_a?(String) and input = fetch_embeddings(model:, input:).first
|
197
|
+
@cache.convert_to_vector(input)
|
201
198
|
end
|
202
199
|
|
203
200
|
def fetch_embeddings(model:, input:, options: nil)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'term/ansicolor'
|
2
|
+
require 'kramdown/ansi'
|
2
3
|
|
3
4
|
class Ollama::Handlers::Markdown
|
4
5
|
include Ollama::Handlers::Concern
|
@@ -13,7 +14,7 @@ class Ollama::Handlers::Markdown
|
|
13
14
|
def call(response)
|
14
15
|
if content = response.response || response.message&.content
|
15
16
|
@content << content
|
16
|
-
markdown_content =
|
17
|
+
markdown_content = Kramdown::ANSI.parse(@content)
|
17
18
|
@output.print clear_screen, move_home, markdown_content
|
18
19
|
end
|
19
20
|
self
|
@@ -1,7 +1,10 @@
|
|
1
|
+
require 'term/ansicolor'
|
2
|
+
require 'kramdown/ansi'
|
3
|
+
|
1
4
|
class Ollama::Utils::ColorizeTexts
|
2
5
|
include Math
|
3
6
|
include Term::ANSIColor
|
4
|
-
include
|
7
|
+
include Kramdown::ANSI::Width
|
5
8
|
|
6
9
|
# Initializes a new instance of Ollama::Utils::ColorizeTexts
|
7
10
|
#
|
data/lib/ollama/version.rb
CHANGED
data/lib/ollama.rb
CHANGED
data/ollama-ruby.gemspec
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: ollama-ruby 0.
|
2
|
+
# stub: ollama-ruby 0.10.0 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "ollama-ruby".freeze
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.10.0".freeze
|
7
7
|
|
8
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
9
9
|
s.require_paths = ["lib".freeze]
|
10
10
|
s.authors = ["Florian Frank".freeze]
|
11
|
-
s.date = "2024-10-
|
11
|
+
s.date = "2024-10-31"
|
12
12
|
s.description = "Library that allows interacting with the Ollama API".freeze
|
13
13
|
s.email = "flori@ping.de".freeze
|
14
14
|
s.executables = ["ollama_console".freeze, "ollama_chat".freeze, "ollama_update".freeze, "ollama_cli".freeze]
|
15
|
-
s.extra_rdoc_files = ["README.md".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/
|
16
|
-
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ollama_chat".freeze, "bin/ollama_cli".freeze, "bin/ollama_console".freeze, "bin/ollama_update".freeze, "config/redis.conf".freeze, "docker-compose.yml".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/
|
15
|
+
s.extra_rdoc_files = ["README.md".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/cache_fetcher.rb".freeze, "lib/ollama/utils/chooser.rb".freeze, "lib/ollama/utils/colorize_texts.rb".freeze, "lib/ollama/utils/fetcher.rb".freeze, "lib/ollama/utils/file_argument.rb".freeze, "lib/ollama/utils/math.rb".freeze, "lib/ollama/utils/tags.rb".freeze, "lib/ollama/version.rb".freeze]
|
16
|
+
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "bin/ollama_chat".freeze, "bin/ollama_cli".freeze, "bin/ollama_console".freeze, "bin/ollama_update".freeze, "config/redis.conf".freeze, "docker-compose.yml".freeze, "lib/ollama.rb".freeze, "lib/ollama/client.rb".freeze, "lib/ollama/client/command.rb".freeze, "lib/ollama/client/doc.rb".freeze, "lib/ollama/commands/chat.rb".freeze, "lib/ollama/commands/copy.rb".freeze, "lib/ollama/commands/create.rb".freeze, "lib/ollama/commands/delete.rb".freeze, "lib/ollama/commands/embed.rb".freeze, "lib/ollama/commands/embeddings.rb".freeze, "lib/ollama/commands/generate.rb".freeze, "lib/ollama/commands/ps.rb".freeze, "lib/ollama/commands/pull.rb".freeze, "lib/ollama/commands/push.rb".freeze, "lib/ollama/commands/show.rb".freeze, "lib/ollama/commands/tags.rb".freeze, "lib/ollama/documents.rb".freeze, "lib/ollama/documents/cache/common.rb".freeze, "lib/ollama/documents/cache/memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_backed_memory_cache.rb".freeze, "lib/ollama/documents/cache/redis_cache.rb".freeze, "lib/ollama/documents/splitters/character.rb".freeze, "lib/ollama/documents/splitters/semantic.rb".freeze, "lib/ollama/dto.rb".freeze, "lib/ollama/errors.rb".freeze, "lib/ollama/handlers.rb".freeze, "lib/ollama/handlers/collector.rb".freeze, "lib/ollama/handlers/concern.rb".freeze, "lib/ollama/handlers/dump_json.rb".freeze, "lib/ollama/handlers/dump_yaml.rb".freeze, "lib/ollama/handlers/markdown.rb".freeze, "lib/ollama/handlers/nop.rb".freeze, "lib/ollama/handlers/print.rb".freeze, "lib/ollama/handlers/progress.rb".freeze, "lib/ollama/handlers/say.rb".freeze, "lib/ollama/handlers/single.rb".freeze, "lib/ollama/image.rb".freeze, "lib/ollama/message.rb".freeze, "lib/ollama/options.rb".freeze, "lib/ollama/response.rb".freeze, "lib/ollama/tool.rb".freeze, "lib/ollama/tool/function.rb".freeze, "lib/ollama/tool/function/parameters.rb".freeze, "lib/ollama/tool/function/parameters/property.rb".freeze, "lib/ollama/utils/cache_fetcher.rb".freeze, "lib/ollama/utils/chooser.rb".freeze, "lib/ollama/utils/colorize_texts.rb".freeze, "lib/ollama/utils/fetcher.rb".freeze, "lib/ollama/utils/file_argument.rb".freeze, "lib/ollama/utils/math.rb".freeze, "lib/ollama/utils/tags.rb".freeze, "lib/ollama/version.rb".freeze, "ollama-ruby.gemspec".freeze, "spec/assets/embeddings.json".freeze, "spec/assets/kitten.jpg".freeze, "spec/assets/prompt.txt".freeze, "spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/colorize_texts_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/spec_helper.rb".freeze, "tmp/.keep".freeze]
|
17
17
|
s.homepage = "https://github.com/flori/ollama-ruby".freeze
|
18
18
|
s.licenses = ["MIT".freeze]
|
19
19
|
s.rdoc_options = ["--title".freeze, "Ollama-ruby - Interacting with the Ollama API".freeze, "--main".freeze, "README.md".freeze]
|
20
20
|
s.required_ruby_version = Gem::Requirement.new("~> 3.1".freeze)
|
21
|
-
s.rubygems_version = "3.5.
|
21
|
+
s.rubygems_version = "3.5.22".freeze
|
22
22
|
s.summary = "Interacting with the Ollama API".freeze
|
23
|
-
s.test_files = ["spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/
|
23
|
+
s.test_files = ["spec/ollama/client/doc_spec.rb".freeze, "spec/ollama/client_spec.rb".freeze, "spec/ollama/commands/chat_spec.rb".freeze, "spec/ollama/commands/copy_spec.rb".freeze, "spec/ollama/commands/create_spec.rb".freeze, "spec/ollama/commands/delete_spec.rb".freeze, "spec/ollama/commands/embed_spec.rb".freeze, "spec/ollama/commands/embeddings_spec.rb".freeze, "spec/ollama/commands/generate_spec.rb".freeze, "spec/ollama/commands/ps_spec.rb".freeze, "spec/ollama/commands/pull_spec.rb".freeze, "spec/ollama/commands/push_spec.rb".freeze, "spec/ollama/commands/show_spec.rb".freeze, "spec/ollama/commands/tags_spec.rb".freeze, "spec/ollama/documents/memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_backed_memory_cache_spec.rb".freeze, "spec/ollama/documents/redis_cache_spec.rb".freeze, "spec/ollama/documents/splitters/character_spec.rb".freeze, "spec/ollama/documents/splitters/semantic_spec.rb".freeze, "spec/ollama/documents_spec.rb".freeze, "spec/ollama/handlers/collector_spec.rb".freeze, "spec/ollama/handlers/dump_json_spec.rb".freeze, "spec/ollama/handlers/dump_yaml_spec.rb".freeze, "spec/ollama/handlers/markdown_spec.rb".freeze, "spec/ollama/handlers/nop_spec.rb".freeze, "spec/ollama/handlers/print_spec.rb".freeze, "spec/ollama/handlers/progress_spec.rb".freeze, "spec/ollama/handlers/say_spec.rb".freeze, "spec/ollama/handlers/single_spec.rb".freeze, "spec/ollama/image_spec.rb".freeze, "spec/ollama/message_spec.rb".freeze, "spec/ollama/options_spec.rb".freeze, "spec/ollama/tool_spec.rb".freeze, "spec/ollama/utils/cache_fetcher_spec.rb".freeze, "spec/ollama/utils/colorize_texts_spec.rb".freeze, "spec/ollama/utils/fetcher_spec.rb".freeze, "spec/ollama/utils/file_argument_spec.rb".freeze, "spec/ollama/utils/tags_spec.rb".freeze, "spec/spec_helper.rb".freeze]
|
24
24
|
|
25
25
|
s.specification_version = 4
|
26
26
|
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.add_runtime_dependency(%q<more_math>.freeze, ["~> 1.1".freeze])
|
41
41
|
s.add_runtime_dependency(%q<mime-types>.freeze, ["~> 3.0".freeze])
|
42
42
|
s.add_runtime_dependency(%q<reverse_markdown>.freeze, ["~> 2.0".freeze])
|
43
|
-
s.add_runtime_dependency(%q<complex_config>.freeze, ["~> 0.22".freeze])
|
43
|
+
s.add_runtime_dependency(%q<complex_config>.freeze, ["~> 0.22".freeze, ">= 0.22.2".freeze])
|
44
44
|
s.add_runtime_dependency(%q<search_ui>.freeze, ["~> 0.0".freeze])
|
45
45
|
s.add_runtime_dependency(%q<amatch>.freeze, ["~> 0.4.1".freeze])
|
46
46
|
s.add_runtime_dependency(%q<pdf-reader>.freeze, ["~> 2.0".freeze])
|
@@ -48,4 +48,5 @@ Gem::Specification.new do |s|
|
|
48
48
|
s.add_runtime_dependency(%q<json>.freeze, ["~> 2.0".freeze])
|
49
49
|
s.add_runtime_dependency(%q<xdg>.freeze, ["~> 7.0".freeze])
|
50
50
|
s.add_runtime_dependency(%q<tins>.freeze, ["~> 1.34".freeze])
|
51
|
+
s.add_runtime_dependency(%q<kramdown-ansi>.freeze, ["~> 0.0".freeze])
|
51
52
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ollama-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Frank
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gem_hadar
|
@@ -241,6 +241,9 @@ dependencies:
|
|
241
241
|
- - "~>"
|
242
242
|
- !ruby/object:Gem::Version
|
243
243
|
version: '0.22'
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
version: 0.22.2
|
244
247
|
type: :runtime
|
245
248
|
prerelease: false
|
246
249
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -248,6 +251,9 @@ dependencies:
|
|
248
251
|
- - "~>"
|
249
252
|
- !ruby/object:Gem::Version
|
250
253
|
version: '0.22'
|
254
|
+
- - ">="
|
255
|
+
- !ruby/object:Gem::Version
|
256
|
+
version: 0.22.2
|
251
257
|
- !ruby/object:Gem::Dependency
|
252
258
|
name: search_ui
|
253
259
|
requirement: !ruby/object:Gem::Requirement
|
@@ -346,6 +352,20 @@ dependencies:
|
|
346
352
|
- - "~>"
|
347
353
|
- !ruby/object:Gem::Version
|
348
354
|
version: '1.34'
|
355
|
+
- !ruby/object:Gem::Dependency
|
356
|
+
name: kramdown-ansi
|
357
|
+
requirement: !ruby/object:Gem::Requirement
|
358
|
+
requirements:
|
359
|
+
- - "~>"
|
360
|
+
- !ruby/object:Gem::Version
|
361
|
+
version: '0.0'
|
362
|
+
type: :runtime
|
363
|
+
prerelease: false
|
364
|
+
version_requirements: !ruby/object:Gem::Requirement
|
365
|
+
requirements:
|
366
|
+
- - "~>"
|
367
|
+
- !ruby/object:Gem::Version
|
368
|
+
version: '0.0'
|
349
369
|
description: Library that allows interacting with the Ollama API
|
350
370
|
email: flori@ping.de
|
351
371
|
executables:
|
@@ -400,7 +420,6 @@ extra_rdoc_files:
|
|
400
420
|
- lib/ollama/tool/function.rb
|
401
421
|
- lib/ollama/tool/function/parameters.rb
|
402
422
|
- lib/ollama/tool/function/parameters/property.rb
|
403
|
-
- lib/ollama/utils/ansi_markdown.rb
|
404
423
|
- lib/ollama/utils/cache_fetcher.rb
|
405
424
|
- lib/ollama/utils/chooser.rb
|
406
425
|
- lib/ollama/utils/colorize_texts.rb
|
@@ -408,7 +427,6 @@ extra_rdoc_files:
|
|
408
427
|
- lib/ollama/utils/file_argument.rb
|
409
428
|
- lib/ollama/utils/math.rb
|
410
429
|
- lib/ollama/utils/tags.rb
|
411
|
-
- lib/ollama/utils/width.rb
|
412
430
|
- lib/ollama/version.rb
|
413
431
|
files:
|
414
432
|
- ".envrc"
|
@@ -467,7 +485,6 @@ files:
|
|
467
485
|
- lib/ollama/tool/function.rb
|
468
486
|
- lib/ollama/tool/function/parameters.rb
|
469
487
|
- lib/ollama/tool/function/parameters/property.rb
|
470
|
-
- lib/ollama/utils/ansi_markdown.rb
|
471
488
|
- lib/ollama/utils/cache_fetcher.rb
|
472
489
|
- lib/ollama/utils/chooser.rb
|
473
490
|
- lib/ollama/utils/colorize_texts.rb
|
@@ -475,7 +492,6 @@ files:
|
|
475
492
|
- lib/ollama/utils/file_argument.rb
|
476
493
|
- lib/ollama/utils/math.rb
|
477
494
|
- lib/ollama/utils/tags.rb
|
478
|
-
- lib/ollama/utils/width.rb
|
479
495
|
- lib/ollama/version.rb
|
480
496
|
- ollama-ruby.gemspec
|
481
497
|
- spec/assets/embeddings.json
|
@@ -514,13 +530,11 @@ files:
|
|
514
530
|
- spec/ollama/message_spec.rb
|
515
531
|
- spec/ollama/options_spec.rb
|
516
532
|
- spec/ollama/tool_spec.rb
|
517
|
-
- spec/ollama/utils/ansi_markdown_spec.rb
|
518
533
|
- spec/ollama/utils/cache_fetcher_spec.rb
|
519
534
|
- spec/ollama/utils/colorize_texts_spec.rb
|
520
535
|
- spec/ollama/utils/fetcher_spec.rb
|
521
536
|
- spec/ollama/utils/file_argument_spec.rb
|
522
537
|
- spec/ollama/utils/tags_spec.rb
|
523
|
-
- spec/ollama/utils/width_spec.rb
|
524
538
|
- spec/spec_helper.rb
|
525
539
|
- tmp/.keep
|
526
540
|
homepage: https://github.com/flori/ollama-ruby
|
@@ -546,7 +560,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
546
560
|
- !ruby/object:Gem::Version
|
547
561
|
version: '0'
|
548
562
|
requirements: []
|
549
|
-
rubygems_version: 3.5.
|
563
|
+
rubygems_version: 3.5.22
|
550
564
|
signing_key:
|
551
565
|
specification_version: 4
|
552
566
|
summary: Interacting with the Ollama API
|
@@ -584,11 +598,9 @@ test_files:
|
|
584
598
|
- spec/ollama/message_spec.rb
|
585
599
|
- spec/ollama/options_spec.rb
|
586
600
|
- spec/ollama/tool_spec.rb
|
587
|
-
- spec/ollama/utils/ansi_markdown_spec.rb
|
588
601
|
- spec/ollama/utils/cache_fetcher_spec.rb
|
589
602
|
- spec/ollama/utils/colorize_texts_spec.rb
|
590
603
|
- spec/ollama/utils/fetcher_spec.rb
|
591
604
|
- spec/ollama/utils/file_argument_spec.rb
|
592
605
|
- spec/ollama/utils/tags_spec.rb
|
593
|
-
- spec/ollama/utils/width_spec.rb
|
594
606
|
- spec/spec_helper.rb
|
@@ -1,217 +0,0 @@
|
|
1
|
-
require 'kramdown'
|
2
|
-
require 'kramdown-parser-gfm'
|
3
|
-
require 'terminal-table'
|
4
|
-
|
5
|
-
class Ollama::Utils::ANSIMarkdown < Kramdown::Converter::Base
|
6
|
-
include Term::ANSIColor
|
7
|
-
include Ollama::Utils::Width
|
8
|
-
|
9
|
-
class ::Kramdown::Parser::Mygfm < ::Kramdown::Parser::GFM
|
10
|
-
def initialize(source, options)
|
11
|
-
options[:gfm_quirks] << :no_auto_typographic
|
12
|
-
super
|
13
|
-
@block_parsers -= %i[
|
14
|
-
definition_list block_html block_math
|
15
|
-
footnote_definition abbrev_definition
|
16
|
-
]
|
17
|
-
@span_parsers -= %i[ footnote_marker inline_math ]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.parse(source)
|
22
|
-
@doc = Kramdown::Document.new(
|
23
|
-
source, input: :mygfm, auto_ids: false, entity_output: :as_char
|
24
|
-
).to_ansi
|
25
|
-
end
|
26
|
-
|
27
|
-
def initialize(root, options)
|
28
|
-
super
|
29
|
-
end
|
30
|
-
|
31
|
-
def convert(el, opts = {})
|
32
|
-
send("convert_#{el.type}", el, opts)
|
33
|
-
end
|
34
|
-
|
35
|
-
def inner(el, opts, &block)
|
36
|
-
result = +''
|
37
|
-
options = opts.dup.merge(parent: el)
|
38
|
-
el.children.each_with_index do |inner_el, index|
|
39
|
-
options[:index] = index
|
40
|
-
options[:result] = result
|
41
|
-
begin
|
42
|
-
content = send("convert_#{inner_el.type}", inner_el, options)
|
43
|
-
result << (block&.(inner_el, index, content) || content)
|
44
|
-
rescue NameError => e
|
45
|
-
warning "Caught #{e.class} for #{inner_el.type}"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
result
|
49
|
-
end
|
50
|
-
|
51
|
-
def convert_root(el, opts)
|
52
|
-
inner(el, opts)
|
53
|
-
end
|
54
|
-
|
55
|
-
def convert_blank(_el, opts)
|
56
|
-
opts[:result] =~ /\n\n\Z|\A\Z/ ? "" : "\n"
|
57
|
-
end
|
58
|
-
|
59
|
-
def convert_text(el, _opts)
|
60
|
-
el.value
|
61
|
-
end
|
62
|
-
|
63
|
-
def convert_header(el, opts)
|
64
|
-
newline bold { underline { inner(el, opts) } }
|
65
|
-
end
|
66
|
-
|
67
|
-
def convert_p(el, opts)
|
68
|
-
length = width(percentage: 90) - opts[:list_indent].to_i
|
69
|
-
length < 0 and return ''
|
70
|
-
newline wrap(inner(el, opts), length:)
|
71
|
-
end
|
72
|
-
|
73
|
-
def convert_strong(el, opts)
|
74
|
-
bold { inner(el, opts) }
|
75
|
-
end
|
76
|
-
|
77
|
-
def convert_em(el, opts)
|
78
|
-
italic { inner(el, opts) }
|
79
|
-
end
|
80
|
-
|
81
|
-
def convert_a(el, opts)
|
82
|
-
url = el.attr['href']
|
83
|
-
hyperlink(url) { inner(el, opts) }
|
84
|
-
end
|
85
|
-
|
86
|
-
def convert_codespan(el, _opts)
|
87
|
-
blue { el.value }
|
88
|
-
end
|
89
|
-
|
90
|
-
def convert_codeblock(el, _opts)
|
91
|
-
blue { el.value }
|
92
|
-
end
|
93
|
-
|
94
|
-
def convert_blockquote(el, opts)
|
95
|
-
newline ?“ + inner(el, opts).sub(/\n+\z/, '') + ?”
|
96
|
-
end
|
97
|
-
|
98
|
-
def convert_hr(_el, _opts)
|
99
|
-
newline ?─ * width(percentage: 100)
|
100
|
-
end
|
101
|
-
|
102
|
-
def convert_img(el, _opts)
|
103
|
-
url = el.attr['src']
|
104
|
-
alt = el.attr['alt']
|
105
|
-
alt.strip.size == 0 and alt = url
|
106
|
-
alt = '🖼 ' + alt
|
107
|
-
hyperlink(url) { alt }
|
108
|
-
end
|
109
|
-
|
110
|
-
def convert_ul(el, opts)
|
111
|
-
list_indent = opts[:list_indent].to_i
|
112
|
-
inner(el, opts) { |_inner_el, index, content|
|
113
|
-
result = '· %s' % content
|
114
|
-
result = newline(result, count: index <= el.children.size - 1 ? 1 : 2)
|
115
|
-
result.gsub(/^/, ' ' * list_indent)
|
116
|
-
}
|
117
|
-
end
|
118
|
-
|
119
|
-
def convert_ol(el, opts)
|
120
|
-
list_indent = opts[:list_indent].to_i
|
121
|
-
inner(el, opts) { |_inner_el, index, content|
|
122
|
-
result = '%u. %s' % [ index + 1, content ]
|
123
|
-
result = newline(result, count: index <= el.children.size - 1 ? 1 : 2)
|
124
|
-
result.gsub(/^/, ' ' * list_indent)
|
125
|
-
}
|
126
|
-
end
|
127
|
-
|
128
|
-
def convert_li(el, opts)
|
129
|
-
opts = opts.dup
|
130
|
-
opts[:list_indent] = 2 + opts[:list_indent].to_i
|
131
|
-
newline inner(el, opts).sub(/\n+\Z/, '')
|
132
|
-
end
|
133
|
-
|
134
|
-
def convert_html_element(el, opts)
|
135
|
-
if el.value == 'i' || el.value == 'em'
|
136
|
-
italic { inner(el, opts) }
|
137
|
-
elsif el.value == 'b' || el.value == 'strong'
|
138
|
-
bold { inner(el, opts) }
|
139
|
-
else
|
140
|
-
''
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def convert_table(el, opts)
|
145
|
-
table = Terminal::Table.new
|
146
|
-
table.style = {
|
147
|
-
all_separators: true,
|
148
|
-
border: :unicode_round,
|
149
|
-
}
|
150
|
-
opts[:table] = table
|
151
|
-
inner(el, opts)
|
152
|
-
el.options[:alignment].each_with_index do |a, i|
|
153
|
-
a == :default and next
|
154
|
-
opts[:table].align_column(i, a)
|
155
|
-
end
|
156
|
-
newline table.to_s
|
157
|
-
end
|
158
|
-
|
159
|
-
def convert_thead(el, opts)
|
160
|
-
rows = inner(el, opts)
|
161
|
-
rows = rows.split(/\s*\|\s*/)[1..].map(&:strip)
|
162
|
-
opts[:table].headings = rows
|
163
|
-
''
|
164
|
-
end
|
165
|
-
|
166
|
-
def convert_tbody(el, opts)
|
167
|
-
res = +''
|
168
|
-
res << inner(el, opts)
|
169
|
-
end
|
170
|
-
|
171
|
-
def convert_tfoot(el, opts)
|
172
|
-
''
|
173
|
-
end
|
174
|
-
|
175
|
-
def convert_tr(el, opts)
|
176
|
-
return '' if el.children.empty?
|
177
|
-
full_width = width(percentage: 90)
|
178
|
-
cols = el.children.map { |c| convert(c, opts).strip }
|
179
|
-
row_size = cols.sum(&:size)
|
180
|
-
return '' if row_size.zero?
|
181
|
-
opts[:table] << cols.map { |c|
|
182
|
-
length = (full_width * (c.size / row_size.to_f)).floor
|
183
|
-
wrap(c, length:)
|
184
|
-
}
|
185
|
-
''
|
186
|
-
end
|
187
|
-
|
188
|
-
def convert_td(el, opts)
|
189
|
-
inner(el, opts)
|
190
|
-
end
|
191
|
-
|
192
|
-
def convert_entity(el, _opts)
|
193
|
-
el.value.char
|
194
|
-
end
|
195
|
-
|
196
|
-
def convert_xml_comment(*)
|
197
|
-
''
|
198
|
-
end
|
199
|
-
|
200
|
-
def convert_xml_pi(*)
|
201
|
-
''
|
202
|
-
end
|
203
|
-
|
204
|
-
def convert_br(_el, opts)
|
205
|
-
''
|
206
|
-
end
|
207
|
-
|
208
|
-
def convert_smart_quote(el, _opts)
|
209
|
-
el.value.to_s =~ /[rl]dquo/ ? "\"" : "'"
|
210
|
-
end
|
211
|
-
|
212
|
-
def newline(text, count: 1)
|
213
|
-
text.gsub(/\n*\z/, ?\n * count)
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
Kramdown::Converter.const_set(:Ansi, Ollama::Utils::ANSIMarkdown)
|
data/lib/ollama/utils/width.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
require 'tins/terminal'
|
2
|
-
|
3
|
-
module Ollama::Utils::Width
|
4
|
-
include Term::ANSIColor
|
5
|
-
extend Term::ANSIColor
|
6
|
-
|
7
|
-
module_function
|
8
|
-
|
9
|
-
def width(percentage: 100.0)
|
10
|
-
((Float(percentage) * Tins::Terminal.columns) / 100).floor
|
11
|
-
end
|
12
|
-
|
13
|
-
def wrap(text, percentage: nil, length: nil)
|
14
|
-
percentage.nil? ^ length.nil? or
|
15
|
-
raise ArgumentError, "either pass percentage or length argument"
|
16
|
-
percentage and length ||= width(percentage:)
|
17
|
-
text.gsub(/(?<!\n)\n(?!\n)/, ' ').lines.map do |line|
|
18
|
-
if length >= 1 && uncolor { line }.length > length
|
19
|
-
line.gsub(/(.{1,#{length}})(\s+|$)/, "\\1\n").strip
|
20
|
-
else
|
21
|
-
line.strip
|
22
|
-
end
|
23
|
-
end * ?\n
|
24
|
-
end
|
25
|
-
|
26
|
-
def truncate(text, percentage: nil, length: nil, ellipsis: ?…)
|
27
|
-
percentage.nil? ^ length.nil? or
|
28
|
-
raise ArgumentError, "either pass percentage or length argument"
|
29
|
-
percentage and length ||= width(percentage:)
|
30
|
-
ellipsis_length = ellipsis.size
|
31
|
-
if length < ellipsis_length
|
32
|
-
+''
|
33
|
-
elsif text.size >= length + ellipsis_length
|
34
|
-
text[0, length - ellipsis_length] + ellipsis
|
35
|
-
else
|
36
|
-
text
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Ollama::Utils::ANSIMarkdown do
|
4
|
-
let :source do
|
5
|
-
File.read(Pathname.new(__dir__) + '..' + '..' + '..' + 'README.md')
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'can parse' do
|
9
|
-
File.open('tmp/README.ansi', ?w) do |output|
|
10
|
-
ansi = described_class.parse(source)
|
11
|
-
expect(ansi).to match("This is the end.")
|
12
|
-
output.puts ansi
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe Ollama::Utils::Width do
|
4
|
-
before do
|
5
|
-
allow(Tins::Terminal).to receive(:columns).and_return 80
|
6
|
-
end
|
7
|
-
|
8
|
-
describe '.width' do
|
9
|
-
it 'defaults to 100%' do
|
10
|
-
expect(described_class.width).to eq 80
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'can be to 80%' do
|
14
|
-
expect(described_class.width(percentage: 80)).to eq 64
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '.wrap' do
|
19
|
-
it 'can wrap with percentage' do
|
20
|
-
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', percentage: 80)
|
21
|
-
expect(wrapped).to eq(
|
22
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA\n"\
|
23
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
24
|
-
)
|
25
|
-
expect(wrapped.size).to eq 109
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'can wrap with length' do
|
29
|
-
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', length: 64)
|
30
|
-
expect(wrapped).to eq(
|
31
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA\n"\
|
32
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
33
|
-
)
|
34
|
-
expect(wrapped.size).to eq 109
|
35
|
-
end
|
36
|
-
|
37
|
-
it "doesn't wrap with length 0" do
|
38
|
-
wrapped = described_class.wrap([ ?A * 10 ] * 10 * ' ', length: 0)
|
39
|
-
expect(wrapped).to eq(
|
40
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA "\
|
41
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA"
|
42
|
-
)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe '.truncate' do
|
47
|
-
it 'can truncate with percentage' do
|
48
|
-
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', percentage: 80)
|
49
|
-
expect(truncated).to eq(
|
50
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAA…"
|
51
|
-
)
|
52
|
-
expect(truncated.size).to eq 64
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'can truncate with length' do
|
56
|
-
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 64)
|
57
|
-
expect(truncated).to eq(
|
58
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAA…"
|
59
|
-
)
|
60
|
-
expect(truncated.size).to eq 64
|
61
|
-
end
|
62
|
-
|
63
|
-
it 'cannot truncate if not necessary' do
|
64
|
-
text = [ ?A * 10 ] * 5 * ' '
|
65
|
-
truncated = described_class.truncate(text, length: 54)
|
66
|
-
expect(truncated).to eq text
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'can truncate with length 0' do
|
70
|
-
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 0)
|
71
|
-
expect(truncated).to be_empty
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'can truncate with ...' do
|
75
|
-
truncated = described_class.truncate([ ?A * 10 ] * 10 * ' ', length: 64, ellipsis: '...')
|
76
|
-
expect(truncated).to eq(
|
77
|
-
"AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAAAAAA AAAAAA..."
|
78
|
-
)
|
79
|
-
expect(truncated.size).to eq 64
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|