diff --git a/bruno/CodeSnippets/delete_snippet.bru b/bruno/CodeSnippets/delete_snippet.bru index b3eb046..9311985 100644 --- a/bruno/CodeSnippets/delete_snippet.bru +++ b/bruno/CodeSnippets/delete_snippet.bru @@ -1,7 +1,7 @@ meta { name: delete_snippet type: http - seq: 6 + seq: 5 } delete { diff --git a/bruno/CodeSnippets/get.bru b/bruno/CodeSnippets/get_snippet_by_slug.bru similarity index 87% rename from bruno/CodeSnippets/get.bru rename to bruno/CodeSnippets/get_snippet_by_slug.bru index fb9ed8b..3bea0bb 100644 --- a/bruno/CodeSnippets/get.bru +++ b/bruno/CodeSnippets/get_snippet_by_slug.bru @@ -1,7 +1,7 @@ meta { - name: get + name: get_snippet_by_slug type: http - seq: 5 + seq: 10 } get { diff --git a/bruno/CodeSnippets/list.bru b/bruno/CodeSnippets/get_snippets.bru similarity index 93% rename from bruno/CodeSnippets/list.bru rename to bruno/CodeSnippets/get_snippets.bru index 9728add..a04a48a 100644 --- a/bruno/CodeSnippets/list.bru +++ b/bruno/CodeSnippets/get_snippets.bru @@ -1,5 +1,5 @@ meta { - name: list + name: get_snippets type: http seq: 4 } diff --git a/bruno/CodeSnippets/ping.bru b/bruno/CodeSnippets/ping.bru index 2a90a2d..7bc3b14 100644 --- a/bruno/CodeSnippets/ping.bru +++ b/bruno/CodeSnippets/ping.bru @@ -1,7 +1,7 @@ meta { name: ping type: http - seq: 2 + seq: 1 } get { diff --git a/bruno/CodeSnippets/similar.bru b/bruno/CodeSnippets/similar.bru deleted file mode 100644 index 0e11126..0000000 --- a/bruno/CodeSnippets/similar.bru +++ /dev/null @@ -1,23 +0,0 @@ -meta { - name: similar - type: http - seq: 10 -} - -get { - url: {{host}}/api/similar?slug=rg-output - body: none - auth: none -} - -params:query { - slug: rg-output -} - -body:json { - { - "title": "Test Snippet", - "markdown": "## Cool Snippet\ndoes a cool thing", - "tags": ["git", "jj"] - } -} diff --git a/src/snippets/infra/api.clj b/src/snippets/infra/api.clj index 9da5f33..1e2622a 100644 --- a/src/snippets/infra/api.clj +++ b/src/snippets/infra/api.clj @@ -6,7 +6,6 @@ [snippets.use-cases.view] [snippets.use-cases.delete] [snippets.use-cases.create] - [snippets.use-cases.similar-search] [snippets.use-cases.edit] [snippets.infra.config :as config] [muuntaja.middleware :as mm] @@ -61,14 +60,6 @@ {:status 200 :body (snippets.use-cases.view/view-snippets-by-tag tag)})) -(defn handle-view-similar-snippets [{params :query-params}] - (let [slug (get params "slug")] - (cond - (nil? slug) {:status 400 - :body "Slug parameter is required"} - :else {:status 200 - :body (snippets.use-cases.similar-search/search-similar slug)}))) - (defn handle-view-snippet-by-slug [{params :query-params}] (let [slug (get params "slug") snippet (snippets.use-cases.view/view-snippet-by-slug slug)] @@ -92,7 +83,6 @@ ["/tags" {:get handle-view-tags}] ["/tag" {:get handle-view-snippets-by-tag}] ["/snippet-by-slug" {:get handle-view-snippet-by-slug}] - ["/similar" {:get handle-view-similar-snippets}] ["/snippets" {:get handle-view-snippets}] ["/snippet" {:post handle-create-snippet :patch handle-edit-snippet diff --git a/src/snippets/infra/db.clj b/src/snippets/infra/db.clj index 9d3b45d..260fbae 100644 --- a/src/snippets/infra/db.clj +++ b/src/snippets/infra/db.clj @@ -122,17 +122,6 @@ :where [?e :snippet/slug ?slug]]] (ffirst (d/q query db slug)))) -(defn- get-by-db-id-from-db - "Get a snippet by db id" - [id] - (let [conn (get-conn) - db (d/db conn) - entity (d/pull db '[* :snippet] id)] - (if (= (keys entity) [:db/id]) nil entity))) - -(def get-by-db-id - (wrap-snippet-return get-by-db-id-from-db)) - (defn- get-snippet-by-slug-from-db "Get a single snippet by its slug." [slug] @@ -174,9 +163,7 @@ new-tags (get raw-patch :tags '[]) existing-tags (get snippet :snippet/tags '[]) tags-to-remove (vec (set/difference (set existing-tags) (set new-tags))) - retracts (if (nil? (:tags raw-patch)) - nil - (map #(vector :db/retract eid :snippet/tags %) tags-to-remove)) + retracts (map #(vector :db/retract eid :snippet/tags %) tags-to-remove) patch (merge (to-update raw-patch) {:db/id eid})] (t/log! {:level :info, :data {:patch patch :retracts retracts :slug slug :eid eid}} "Patching snippet") (when (nil? eid) diff --git a/src/snippets/infra/text_embed.clj b/src/snippets/infra/text_embed.clj index 9024019..6be3143 100644 --- a/src/snippets/infra/text_embed.clj +++ b/src/snippets/infra/text_embed.clj @@ -54,36 +54,11 @@ "Save an embedding to Qdrant" [snippet embed] (let [api-key (:qdrant-api-key (config)) - id (db/slug-to-db-id (:slug snippet)) - host (str (:qdrant-host (config)) "/collections/snippets-dev/points")] - (t/log! {:level :info :data {:slug (:slug snippet) :id id :host host}} "Saving embedding for snippet") - (http/put host + id (db/slug-to-db-id (:slug snippet))] + (t/log! {:level :info :data {:slug (:slug snippet) :api-key api-key :id id}} "Saving embedding for snippet") + (http/put (str (:qdrant-host (config)) "/collections/snippets-dev/points") {:headers {"api-key" api-key} :content-type :json :form-params {:points [{:id id :vector embed :payload {:slug (:slug snippet)}}]} ;; :cookie-store false :as :json}))) - -(defn get-and-save-embed - "Get an embedding for a snippet and save it to Qdrant" - [snippet] - (let [embed (get-embed snippet)] - (save-embed snippet embed))) - -(defn search - "Search for similar snippet in Qdrant - returns example: [{:id 101155069755600, :version 204, :score 0.85372585}] or []" - [slug] - (let [db-id (db/slug-to-db-id slug) - api-key (:qdrant-api-key (config)) - host (str (:qdrant-host (config)) "/collections/snippets-dev/points/query")] - (t/log! {:level :info :data {:slug slug :db-id db-id}} "Searching Qdrant for similar snippets") - (when (nil? db-id) - (throw (ex-info "Invalid slug" {:slug slug}))) - (-> - (http/post host - {:headers {"api-key" api-key} - :content-type :json - :form-params {:query db-id :limit 3 :score_threshold 0.7} - :as :json}) - (get-in [:body :result :points] '[])))) diff --git a/src/snippets/use_cases/create.clj b/src/snippets/use_cases/create.clj index 35d5ca9..33a41ba 100644 --- a/src/snippets/use_cases/create.clj +++ b/src/snippets/use_cases/create.clj @@ -1,11 +1,11 @@ (ns snippets.use-cases.create (:require [taoensso.telemere :as t] - [snippets.infra.text-embed :as embed] [snippets.infra.db :as db])) (defn create-snippet [{:keys [title slug markdown tags]}] (let [pub-date (java.util.Date.)] (t/log! {:level :info, :data {:title title :slug slug}} "Creating snippet") (db/create-snippets [{:title title :slug slug :markdown markdown :tags tags :pub-date pub-date}]) - (embed/get-and-save-embed (db/get-snippet-by-slug slug)))) + ;; TODO: caculate text embed vector + )) diff --git a/src/snippets/use_cases/edit.clj b/src/snippets/use_cases/edit.clj index 838e026..508f88c 100644 --- a/src/snippets/use_cases/edit.clj +++ b/src/snippets/use_cases/edit.clj @@ -1,7 +1,6 @@ (ns snippets.use-cases.edit (:require [taoensso.telemere :as t] - [snippets.infra.text-embed :as embed] [malli.core :as m] [snippets.infra.db :as db])) @@ -19,6 +18,5 @@ (do (t/log! {:level :info, :data {:patch patch :slug slug}} "Valid changes editing snippet") (db/update-snippet slug patch) - (embed/get-and-save-embed (db/get-snippet-by-slug slug)) {:success true}) {:success false :reason :invalid-patch})) diff --git a/src/snippets/use_cases/similar_search.clj b/src/snippets/use_cases/similar_search.clj deleted file mode 100644 index 2fd4f6d..0000000 --- a/src/snippets/use_cases/similar_search.clj +++ /dev/null @@ -1,10 +0,0 @@ -(ns snippets.use-cases.similar-search - (:require [snippets.infra.text-embed :as embed] - [taoensso.telemere :as t] - [snippets.infra.db :as db])) - -(defn search-similar - [slug] - (t/log! {:level :info :data {:slug slug}} "Making a similar search by slug") - (->> (embed/search slug) - (map #(hash-map :snippet (db/get-by-db-id (:id %)), :score (:score %))))) diff --git a/src/snippets/use_cases/view.clj b/src/snippets/use_cases/view.clj index dc0774c..26f8d6c 100644 --- a/src/snippets/use_cases/view.clj +++ b/src/snippets/use_cases/view.clj @@ -7,9 +7,7 @@ "Converts snippet pub-date to ISO-8601 string for EDN serialization" [snippet] (when snippet - (-> snippet - (assoc :tags (if (nil? (:tags snippet)) '[] (:tags snippet))) - (assoc :pub-date (.toString (:pub-date snippet)))))) + (assoc snippet :pub-date (.toString (:pub-date snippet))))) (defn view-snippets [options] (let [limit (:limit options)