FIX: Load categories from search response (#612)
When lazy load categories is enabled, the list of categories does not have to fetched from the "site.json" endpoint because it is already returned by "search.json". This commit reverts commits5056502and3e54697because iterating over all pages of categories is not really necessary.
This commit is contained in:
@@ -110,7 +110,13 @@ module DiscourseAi
|
||||
if posts.blank?
|
||||
{ args: parameters, rows: [], instruction: "nothing was found, expand your search" }
|
||||
else
|
||||
categories = self.class.categories
|
||||
categories =
|
||||
if categories_json = json.dig("grouped_search_result", "extra", "categories")
|
||||
categories_json.map { |c| [c["id"], c] }.to_h
|
||||
else
|
||||
self.class.categories
|
||||
end
|
||||
|
||||
topics = (json["topics"]).map { |t| [t["id"], t] }.to_h
|
||||
|
||||
format_results(posts, args: parameters) do |post|
|
||||
@@ -148,25 +154,14 @@ module DiscourseAi
|
||||
def self.categories
|
||||
return @categories if defined?(@categories)
|
||||
|
||||
@categories = {}
|
||||
|
||||
page = 0
|
||||
loop do
|
||||
page += 1
|
||||
url = "https://meta.discourse.org/categories.json?page=#{page}"
|
||||
|
||||
json = JSON.parse(Net::HTTP.get(URI(url)))
|
||||
break if json["category_list"]["categories"].blank?
|
||||
|
||||
json["category_list"]["categories"].each do |c|
|
||||
@categories[c["id"]] = {
|
||||
"name" => c["name"],
|
||||
"parent_category_id" => c["parent_category_id"],
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@categories
|
||||
url = "https://meta.discourse.org/site.json"
|
||||
json = JSON.parse(Net::HTTP.get(URI(url)))
|
||||
@categories =
|
||||
json["categories"]
|
||||
.map do |c|
|
||||
[c["id"], { "name" => c["name"], "parent_category_id" => c["parent_category_id"] }]
|
||||
end
|
||||
.to_h
|
||||
end
|
||||
|
||||
def description_args
|
||||
|
||||
-1997
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"category_list": {
|
||||
"can_create_category": false,
|
||||
"can_create_topic": false,
|
||||
"categories": []
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
Vendored
+1
File diff suppressed because one or more lines are too long
@@ -11,27 +11,16 @@ RSpec.describe DiscourseAi::AiBot::Tools::DiscourseMetaSearch do
|
||||
|
||||
let(:mock_search_json) { plugin_file_from_fixtures("search.json", "search_meta").read }
|
||||
|
||||
let(:mock_categories_page_1) do
|
||||
plugin_file_from_fixtures("categories_page_1.json", "search_meta").read
|
||||
let(:mock_search_with_categories_json) do
|
||||
plugin_file_from_fixtures("search_with_categories.json", "search_meta").read
|
||||
end
|
||||
|
||||
let(:mock_categories_page_2) do
|
||||
plugin_file_from_fixtures("categories_page_2.json", "search_meta").read
|
||||
end
|
||||
let(:mock_site_json) { plugin_file_from_fixtures("site.json", "search_meta").read }
|
||||
|
||||
before do
|
||||
stub_request(:get, "https://meta.discourse.org/categories.json?page=1").to_return(
|
||||
stub_request(:get, "https://meta.discourse.org/site.json").to_return(
|
||||
status: 200,
|
||||
body: mock_categories_page_1,
|
||||
headers: {
|
||||
},
|
||||
)
|
||||
end
|
||||
|
||||
before do
|
||||
stub_request(:get, "https://meta.discourse.org/categories.json?page=2").to_return(
|
||||
status: 200,
|
||||
body: mock_categories_page_2,
|
||||
body: mock_site_json,
|
||||
headers: {
|
||||
},
|
||||
)
|
||||
@@ -54,6 +43,23 @@ RSpec.describe DiscourseAi::AiBot::Tools::DiscourseMetaSearch do
|
||||
)
|
||||
end
|
||||
|
||||
it "searches meta.discourse.org with lazy_load_categories enabled" do
|
||||
stub_request(:get, "https://meta.discourse.org/search.json?q=test").to_return(
|
||||
status: 200,
|
||||
body: mock_search_with_categories_json,
|
||||
headers: {
|
||||
},
|
||||
)
|
||||
|
||||
search = described_class.new({ search_query: "test" }, bot_user: bot_user, llm: llm)
|
||||
results = search.invoke(&progress_blk)
|
||||
expect(results[:rows].length).to eq(20)
|
||||
|
||||
expect(results[:rows].first[results[:column_names].index("category")]).to eq(
|
||||
"documentation > developers",
|
||||
)
|
||||
end
|
||||
|
||||
it "passes on all search parameters" do
|
||||
url =
|
||||
"https://meta.discourse.org/search.json?q=test%20category:test%20user:test%20order:test%20max_posts:1%20tags:test%20before:test%20after:test%20status:test"
|
||||
|
||||
Reference in New Issue
Block a user