exa-ai 0.1.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +562 -0
  4. data/exe/exa-ai +95 -0
  5. data/exe/exa-ai-answer +131 -0
  6. data/exe/exa-ai-context +104 -0
  7. data/exe/exa-ai-get-contents +114 -0
  8. data/exe/exa-ai-research-get +110 -0
  9. data/exe/exa-ai-research-list +95 -0
  10. data/exe/exa-ai-research-start +175 -0
  11. data/exe/exa-ai-search +134 -0
  12. data/lib/exa/cli/base.rb +51 -0
  13. data/lib/exa/cli/error_handler.rb +98 -0
  14. data/lib/exa/cli/formatters/answer_formatter.rb +63 -0
  15. data/lib/exa/cli/formatters/contents_formatter.rb +50 -0
  16. data/lib/exa/cli/formatters/context_formatter.rb +58 -0
  17. data/lib/exa/cli/formatters/research_formatter.rb +120 -0
  18. data/lib/exa/cli/formatters/search_formatter.rb +44 -0
  19. data/lib/exa/cli/polling.rb +46 -0
  20. data/lib/exa/client.rb +132 -0
  21. data/lib/exa/connection.rb +32 -0
  22. data/lib/exa/error.rb +31 -0
  23. data/lib/exa/middleware/raise_error.rb +55 -0
  24. data/lib/exa/resources/answer.rb +20 -0
  25. data/lib/exa/resources/contents_result.rb +29 -0
  26. data/lib/exa/resources/context_result.rb +37 -0
  27. data/lib/exa/resources/find_similar_result.rb +28 -0
  28. data/lib/exa/resources/research_list.rb +18 -0
  29. data/lib/exa/resources/research_task.rb +39 -0
  30. data/lib/exa/resources/search_result.rb +30 -0
  31. data/lib/exa/services/answer.rb +23 -0
  32. data/lib/exa/services/context.rb +27 -0
  33. data/lib/exa/services/find_similar.rb +26 -0
  34. data/lib/exa/services/get_contents.rb +25 -0
  35. data/lib/exa/services/research_get.rb +30 -0
  36. data/lib/exa/services/research_list.rb +37 -0
  37. data/lib/exa/services/research_start.rb +26 -0
  38. data/lib/exa/services/search.rb +26 -0
  39. data/lib/exa/version.rb +5 -0
  40. data/lib/exa.rb +54 -0
  41. metadata +174 -0
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Exa
4
+ module Services
5
+ class Context
6
+ def initialize(connection, **params)
7
+ @connection = connection
8
+ @params = params
9
+ end
10
+
11
+ def call
12
+ response = @connection.post("/context", @params)
13
+ body = response.body
14
+
15
+ Resources::ContextResult.new(
16
+ request_id: body["requestId"],
17
+ query: body["query"],
18
+ response: body["response"],
19
+ results_count: body["resultsCount"],
20
+ cost_dollars: body["costDollars"],
21
+ search_time: body["searchTime"],
22
+ output_tokens: body["outputTokens"]
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../resources/find_similar_result"
4
+
5
+ module Exa
6
+ module Services
7
+ class FindSimilar
8
+ def initialize(connection, **params)
9
+ @connection = connection
10
+ @params = params
11
+ end
12
+
13
+ def call
14
+ response = @connection.post("/findSimilar", @params)
15
+ body = response.body
16
+
17
+ Resources::FindSimilarResult.new(
18
+ results: body["results"],
19
+ request_id: body["requestId"],
20
+ context: body["context"],
21
+ cost_dollars: body["costDollars"]
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Exa
4
+ module Services
5
+ class GetContents
6
+ def initialize(connection, **params)
7
+ @connection = connection
8
+ @params = params
9
+ end
10
+
11
+ def call
12
+ response = @connection.post("/contents", @params)
13
+ body = response.body
14
+
15
+ Resources::ContentsResult.new(
16
+ results: body["results"],
17
+ request_id: body["requestId"],
18
+ context: body["context"],
19
+ statuses: body["statuses"],
20
+ cost_dollars: body["costDollars"]
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module Exa
2
+ module Services
3
+ class ResearchGet
4
+ def initialize(connection, research_id:, **params)
5
+ @connection = connection
6
+ @research_id = research_id
7
+ @params = params
8
+ end
9
+
10
+ def call
11
+ response = @connection.get("/research/v1/#{@research_id}", @params)
12
+ body = response.body
13
+
14
+ Resources::ResearchTask.new(
15
+ research_id: body["researchId"],
16
+ created_at: body["createdAt"],
17
+ status: body["status"],
18
+ instructions: body["instructions"],
19
+ model: body["model"],
20
+ output_schema: body["outputSchema"],
21
+ events: body["events"],
22
+ output: body["output"],
23
+ cost_dollars: body["costDollars"],
24
+ finished_at: body["finishedAt"],
25
+ error: body["error"]
26
+ )
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module Exa
2
+ module Services
3
+ class ResearchList
4
+ def initialize(connection, **params)
5
+ @connection = connection
6
+ @params = params
7
+ end
8
+
9
+ def call
10
+ response = @connection.get("/research/v1", @params)
11
+ body = response.body
12
+
13
+ data = body["data"].map do |task_data|
14
+ Resources::ResearchTask.new(
15
+ research_id: task_data["researchId"],
16
+ created_at: task_data["createdAt"],
17
+ status: task_data["status"],
18
+ instructions: task_data["instructions"],
19
+ model: task_data["model"],
20
+ output_schema: task_data["outputSchema"],
21
+ events: task_data["events"],
22
+ output: task_data["output"],
23
+ cost_dollars: task_data["costDollars"],
24
+ finished_at: task_data["finishedAt"],
25
+ error: task_data["error"]
26
+ )
27
+ end
28
+
29
+ Resources::ResearchList.new(
30
+ data: data,
31
+ has_more: body["hasMore"],
32
+ next_cursor: body["nextCursor"]
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Exa
4
+ module Services
5
+ class ResearchStart
6
+ def initialize(connection, **params)
7
+ @connection = connection
8
+ @params = params
9
+ end
10
+
11
+ def call
12
+ response = @connection.post("/research/v1", @params)
13
+ body = response.body
14
+
15
+ Resources::ResearchTask.new(
16
+ research_id: body["researchId"],
17
+ created_at: body["createdAt"],
18
+ status: body["status"],
19
+ instructions: body["instructions"],
20
+ model: body["model"],
21
+ output_schema: body["outputSchema"]
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Exa
4
+ module Services
5
+ class Search
6
+ def initialize(connection, **params)
7
+ @connection = connection
8
+ @params = params
9
+ end
10
+
11
+ def call
12
+ response = @connection.post("/search", @params)
13
+ body = response.body
14
+
15
+ Resources::SearchResult.new(
16
+ results: body["results"],
17
+ request_id: body["requestId"],
18
+ resolved_search_type: body["resolvedSearchType"],
19
+ search_type: body["searchType"],
20
+ context: body["context"],
21
+ cost_dollars: body["costDollars"]
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Exa
4
+ VERSION = "0.1.0"
5
+ end
data/lib/exa.rb ADDED
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "exa/version"
4
+ require_relative "exa/error"
5
+ require_relative "exa/middleware/raise_error"
6
+ require_relative "exa/connection"
7
+ require_relative "exa/resources/search_result"
8
+ require_relative "exa/resources/find_similar_result"
9
+ require_relative "exa/resources/contents_result"
10
+ require_relative "exa/resources/research_task"
11
+ require_relative "exa/resources/research_list"
12
+ require_relative "exa/resources/answer"
13
+ require_relative "exa/resources/context_result"
14
+ require_relative "exa/services/search"
15
+ require_relative "exa/services/find_similar"
16
+ require_relative "exa/services/get_contents"
17
+ require_relative "exa/services/research_get"
18
+ require_relative "exa/services/research_start"
19
+ require_relative "exa/services/research_list"
20
+ require_relative "exa/services/answer"
21
+ require_relative "exa/services/context"
22
+ require_relative "exa/client"
23
+ require_relative "exa/cli/base"
24
+ require_relative "exa/cli/polling"
25
+ require_relative "exa/cli/error_handler"
26
+ require_relative "exa/cli/formatters/search_formatter"
27
+ require_relative "exa/cli/formatters/context_formatter"
28
+ require_relative "exa/cli/formatters/contents_formatter"
29
+ require_relative "exa/cli/formatters/research_formatter"
30
+
31
+ module Exa
32
+ # Module-level configuration
33
+ class << self
34
+ attr_accessor :api_key, :base_url, :timeout
35
+
36
+ def configure
37
+ yield self
38
+ end
39
+
40
+ def reset
41
+ self.api_key = nil
42
+ self.base_url = DEFAULT_BASE_URL
43
+ self.timeout = DEFAULT_TIMEOUT
44
+ end
45
+ end
46
+
47
+ # Constants for default values
48
+ DEFAULT_BASE_URL = "https://api.exa.ai"
49
+ DEFAULT_TIMEOUT = 30
50
+
51
+ # Set defaults
52
+ self.base_url = DEFAULT_BASE_URL
53
+ self.timeout = DEFAULT_TIMEOUT
54
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: exa-ai
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Benjamin Jackson
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rake
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '13.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '13.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: webmock
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: vcr
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '6.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '6.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: bundler-audit
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0.9'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.9'
96
+ description: A Ruby gem for interacting with the Exa.ai search and discovery API
97
+ email:
98
+ - ben@exa.ai
99
+ executables:
100
+ - exa-ai
101
+ - exa-ai-answer
102
+ - exa-ai-context
103
+ - exa-ai-get-contents
104
+ - exa-ai-research-get
105
+ - exa-ai-research-list
106
+ - exa-ai-research-start
107
+ - exa-ai-search
108
+ extensions: []
109
+ extra_rdoc_files: []
110
+ files:
111
+ - LICENSE
112
+ - README.md
113
+ - exe/exa-ai
114
+ - exe/exa-ai-answer
115
+ - exe/exa-ai-context
116
+ - exe/exa-ai-get-contents
117
+ - exe/exa-ai-research-get
118
+ - exe/exa-ai-research-list
119
+ - exe/exa-ai-research-start
120
+ - exe/exa-ai-search
121
+ - lib/exa.rb
122
+ - lib/exa/cli/base.rb
123
+ - lib/exa/cli/error_handler.rb
124
+ - lib/exa/cli/formatters/answer_formatter.rb
125
+ - lib/exa/cli/formatters/contents_formatter.rb
126
+ - lib/exa/cli/formatters/context_formatter.rb
127
+ - lib/exa/cli/formatters/research_formatter.rb
128
+ - lib/exa/cli/formatters/search_formatter.rb
129
+ - lib/exa/cli/polling.rb
130
+ - lib/exa/client.rb
131
+ - lib/exa/connection.rb
132
+ - lib/exa/error.rb
133
+ - lib/exa/middleware/raise_error.rb
134
+ - lib/exa/resources/answer.rb
135
+ - lib/exa/resources/contents_result.rb
136
+ - lib/exa/resources/context_result.rb
137
+ - lib/exa/resources/find_similar_result.rb
138
+ - lib/exa/resources/research_list.rb
139
+ - lib/exa/resources/research_task.rb
140
+ - lib/exa/resources/search_result.rb
141
+ - lib/exa/services/answer.rb
142
+ - lib/exa/services/context.rb
143
+ - lib/exa/services/find_similar.rb
144
+ - lib/exa/services/get_contents.rb
145
+ - lib/exa/services/research_get.rb
146
+ - lib/exa/services/research_list.rb
147
+ - lib/exa/services/research_start.rb
148
+ - lib/exa/services/search.rb
149
+ - lib/exa/version.rb
150
+ homepage: https://github.com/benjaminjackson/exa-ruby
151
+ licenses:
152
+ - MIT
153
+ metadata:
154
+ homepage_uri: https://github.com/benjaminjackson/exa-ruby
155
+ source_code_uri: https://github.com/benjaminjackson/exa-ruby
156
+ changelog_uri: https://github.com/benjaminjackson/exa-ruby/blob/main/CHANGELOG.md
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 3.0.0
165
+ required_rubygems_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ requirements: []
171
+ rubygems_version: 3.7.1
172
+ specification_version: 4
173
+ summary: Ruby client for the Exa.ai API
174
+ test_files: []