feather-ai 0.2.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 +7 -0
- data/.idea/.gitignore +10 -0
- data/.idea/Feather.iml +78 -0
- data/.idea/copilot.data.migration.ask2agent.xml +6 -0
- data/.idea/modules.xml +8 -0
- data/.idea/vcs.xml +6 -0
- data/.rspec +3 -0
- data/.rubocop.yml +12 -0
- data/.ruby-version +1 -0
- data/CLAUDE.md +87 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +205 -0
- data/Rakefile +12 -0
- data/lib/feather_ai/configuration.rb +21 -0
- data/lib/feather_ai/consensus.rb +115 -0
- data/lib/feather_ai/identifier.rb +160 -0
- data/lib/feather_ai/instrumentation.rb +14 -0
- data/lib/feather_ai/photography_tips.rb +52 -0
- data/lib/feather_ai/rails/acts_as_sighting.rb +87 -0
- data/lib/feather_ai/rails/railtie.rb +14 -0
- data/lib/feather_ai/rails.rb +4 -0
- data/lib/feather_ai/result.rb +92 -0
- data/lib/feather_ai/version.rb +5 -0
- data/lib/feather_ai.rb +41 -0
- data/lib/generators/feather_ai/add_corrections_generator.rb +32 -0
- data/lib/generators/feather_ai/install_generator.rb +32 -0
- data/lib/generators/feather_ai/templates/correction_migration.rb.tt +10 -0
- data/lib/generators/feather_ai/templates/migration.rb.tt +9 -0
- data/sig/Feather.rbs +91 -0
- metadata +89 -0
data/sig/Feather.rbs
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module Feather
|
|
2
|
+
VERSION: String
|
|
3
|
+
|
|
4
|
+
class Error < StandardError
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
class ConfigurationError < Error
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class IdentificationError < Error
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.configuration: () -> Configuration
|
|
14
|
+
def self.configure: () { (Configuration) -> void } -> void
|
|
15
|
+
def self.reset!: () -> nil
|
|
16
|
+
def self.identify: (?String? image, ?String? audio, ?location: String?, ?consensus: bool) -> Result
|
|
17
|
+
|
|
18
|
+
class Configuration
|
|
19
|
+
attr_accessor provider: Symbol
|
|
20
|
+
attr_accessor model: String
|
|
21
|
+
attr_accessor location: String?
|
|
22
|
+
attr_accessor consensus_models: Array[String]
|
|
23
|
+
attr_accessor tips_model: String
|
|
24
|
+
|
|
25
|
+
def initialize: () -> void
|
|
26
|
+
def initialize_copy: (Configuration source) -> void
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
class Result
|
|
30
|
+
attr_reader common_name: String?
|
|
31
|
+
attr_reader species: String?
|
|
32
|
+
attr_reader family: String?
|
|
33
|
+
attr_reader confidence: Symbol?
|
|
34
|
+
attr_reader region_native: bool?
|
|
35
|
+
attr_reader candidates: Array[Result]
|
|
36
|
+
attr_reader input_tokens: Integer?
|
|
37
|
+
attr_reader output_tokens: Integer?
|
|
38
|
+
attr_reader cost: Float?
|
|
39
|
+
attr_reader model_id: String?
|
|
40
|
+
attr_reader duration_ms: Integer?
|
|
41
|
+
attr_reader source: Symbol?
|
|
42
|
+
attr_reader consensus_models: Array[String]?
|
|
43
|
+
|
|
44
|
+
def initialize: (Hash[Symbol, untyped] attrs) -> void
|
|
45
|
+
def confident?: () -> bool
|
|
46
|
+
def region_native?: () -> bool
|
|
47
|
+
def photography_tips: () -> Hash[Symbol, String]?
|
|
48
|
+
def to_h: () -> Hash[Symbol, untyped]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
class Identifier
|
|
52
|
+
SCHEMA: untyped
|
|
53
|
+
PROVIDER_RATES: Hash[Symbol, Hash[Symbol, Float]]
|
|
54
|
+
|
|
55
|
+
def initialize: (?config: Configuration) -> void
|
|
56
|
+
def identify: (?String? image, ?String? audio, ?location: String?) -> Result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
class Consensus
|
|
60
|
+
def initialize: (?config: Configuration) -> void
|
|
61
|
+
def identify: (?String? image, ?String? audio, ?location: String?) -> Result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
class PhotographyTips
|
|
65
|
+
SCHEMA: untyped
|
|
66
|
+
|
|
67
|
+
def initialize: (species: String, common_name: String, ?config: Configuration) -> void
|
|
68
|
+
def fetch: () -> Hash[Symbol, String]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
module Instrumentation
|
|
72
|
+
def self.instrument: (String event_name, ?Hash[Symbol, untyped] payload) { () -> untyped } -> untyped
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
module Rails
|
|
76
|
+
module ActsAsSighting
|
|
77
|
+
CORRECTABLE_FIELDS: Array[Symbol]
|
|
78
|
+
|
|
79
|
+
module ClassMethods
|
|
80
|
+
def acts_as_sighting: () -> void
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
module InstanceMethods
|
|
84
|
+
def identify!: () -> Result
|
|
85
|
+
def correct!: (Hash[Symbol | String, untyped] attrs) -> void
|
|
86
|
+
def corrected?: () -> bool
|
|
87
|
+
def correction_delta: () -> Hash[Symbol, Hash[Symbol, untyped]]
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: feather-ai
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Brandyn Britton
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 2026-03-18 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: ruby_llm
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '1.0'
|
|
26
|
+
description: A Ruby gem for identifying birds from photos and audio using RubyLLM.
|
|
27
|
+
Adds multi-modal identification, location-aware results, multi-model consensus,
|
|
28
|
+
and a Rails integration.
|
|
29
|
+
email:
|
|
30
|
+
- brandynbb96@gmail.com
|
|
31
|
+
executables: []
|
|
32
|
+
extensions: []
|
|
33
|
+
extra_rdoc_files: []
|
|
34
|
+
files:
|
|
35
|
+
- ".idea/.gitignore"
|
|
36
|
+
- ".idea/Feather.iml"
|
|
37
|
+
- ".idea/copilot.data.migration.ask2agent.xml"
|
|
38
|
+
- ".idea/modules.xml"
|
|
39
|
+
- ".idea/vcs.xml"
|
|
40
|
+
- ".rspec"
|
|
41
|
+
- ".rubocop.yml"
|
|
42
|
+
- ".ruby-version"
|
|
43
|
+
- CLAUDE.md
|
|
44
|
+
- CODE_OF_CONDUCT.md
|
|
45
|
+
- LICENSE.txt
|
|
46
|
+
- README.md
|
|
47
|
+
- Rakefile
|
|
48
|
+
- lib/feather_ai.rb
|
|
49
|
+
- lib/feather_ai/configuration.rb
|
|
50
|
+
- lib/feather_ai/consensus.rb
|
|
51
|
+
- lib/feather_ai/identifier.rb
|
|
52
|
+
- lib/feather_ai/instrumentation.rb
|
|
53
|
+
- lib/feather_ai/photography_tips.rb
|
|
54
|
+
- lib/feather_ai/rails.rb
|
|
55
|
+
- lib/feather_ai/rails/acts_as_sighting.rb
|
|
56
|
+
- lib/feather_ai/rails/railtie.rb
|
|
57
|
+
- lib/feather_ai/result.rb
|
|
58
|
+
- lib/feather_ai/version.rb
|
|
59
|
+
- lib/generators/feather_ai/add_corrections_generator.rb
|
|
60
|
+
- lib/generators/feather_ai/install_generator.rb
|
|
61
|
+
- lib/generators/feather_ai/templates/correction_migration.rb.tt
|
|
62
|
+
- lib/generators/feather_ai/templates/migration.rb.tt
|
|
63
|
+
- sig/Feather.rbs
|
|
64
|
+
homepage: https://github.com/Birdup-Australia/Feather
|
|
65
|
+
licenses:
|
|
66
|
+
- MIT
|
|
67
|
+
metadata:
|
|
68
|
+
homepage_uri: https://github.com/Birdup-Australia/Feather
|
|
69
|
+
source_code_uri: https://github.com/Birdup-Australia/Feather
|
|
70
|
+
changelog_uri: https://github.com/Birdup-Australia/Feather/blob/main/CHANGELOG.md
|
|
71
|
+
rubygems_mfa_required: 'true'
|
|
72
|
+
rdoc_options: []
|
|
73
|
+
require_paths:
|
|
74
|
+
- lib
|
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
|
+
requirements:
|
|
77
|
+
- - ">="
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
version: 3.2.0
|
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
|
+
requirements:
|
|
82
|
+
- - ">="
|
|
83
|
+
- !ruby/object:Gem::Version
|
|
84
|
+
version: '0'
|
|
85
|
+
requirements: []
|
|
86
|
+
rubygems_version: 3.6.2
|
|
87
|
+
specification_version: 4
|
|
88
|
+
summary: Identify birds from photos and audio using LLMs
|
|
89
|
+
test_files: []
|