diff --git a/.gitignore b/.gitignore index bc50a14..63e8fcb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,7 @@ node_modules .yarn/ nostr/* dist +.clj-kondo/ +.lsp/ +config.edn +.cpcache diff --git a/build.clj b/build.clj new file mode 100644 index 0000000..e425d86 --- /dev/null +++ b/build.clj @@ -0,0 +1,25 @@ +(ns build + (:require [clojure.tools.build.api :as b])) + +(def lib 'snippets) + +(def class-dir "target/classes") +(def uber-file (format "target/%s-standalone.jar" (name lib))) + +;; delay to defer side effects (artifact downloads) +(def basis (delay (b/create-basis {:project "deps.edn"}))) + +(defn clean [_] + (b/delete {:path "target"})) + +(defn uber [_] + (clean nil) + (b/copy-dir {:src-dirs ["src" "resources"] + :target-dir class-dir}) + (b/compile-clj {:basis @basis + :ns-compile '[snippets.main] + :class-dir class-dir}) + (b/uber {:class-dir class-dir + :uber-file uber-file + :basis @basis + :main 'snippets.main})) diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..54acfac --- /dev/null +++ b/deps.edn @@ -0,0 +1,28 @@ +{:paths ["src"] + :deps {clj-http/clj-http {:mvn/version "3.13.1"} + ;; logging + com.taoensso/telemere {:mvn/version "1.0.0"} + ;; environment variables + environ/environ {:mvn/version "1.2.0"} + ;; schema validation + metosin/malli {:mvn/version "0.18.0"} + ;; json decoding + cheshire/cheshire {:mvn/version "6.0.0"} + ;; metosin/muuntaja {:mvn/version "0.6.11"} + org.clojure/clojure {:mvn/version "1.12.1"}} + :aliases + {;; Run with clj -T:build function-in-build + :build {:deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac"}} + :ns-default build}}} + +;; :aliases + ;; {:dev {:extra-deps {com.biffweb/tasks {:git/url "https://github.com/jacobobryant/biff", :git/sha "1570ccc", :git/tag "v1.8.29", :deps/root "libs/tasks"}} + ;; :extra-paths ["dev" "test"] + ;; :jvm-opts ["-XX:-OmitStackTraceInFastThrow" + ;; "-XX:+CrashOnOutOfMemoryError" + ;; "-Dbiff.env.BIFF_PROFILE=dev"] + ;; :main-opts ["-m" "com.biffweb.task-runner" "tasks/tasks"]} + ;; :prod {:jvm-opts ["-XX:-OmitStackTraceInFastThrow" + ;; "-XX:+CrashOnOutOfMemoryError" + ;; "-Dbiff.env.BIFF_PROFILE=prod"] + ;; :main-opts ["-m" "snippets"]}}} diff --git a/src/micro_blog/config.clj b/src/micro_blog/config.clj new file mode 100644 index 0000000..a30bf2c --- /dev/null +++ b/src/micro_blog/config.clj @@ -0,0 +1,26 @@ +(ns micro-blog.config + (:require [environ.core :refer [env]])) + +(def ^:private env-overrides + {:minstral-api-key "MISTRAL_API_KEY"}) + +(defn- load-config [] + (println "config is being loaded") + (merge (read-string (slurp "config.edn")) + (into {} (for [[k env-var] env-overrides + :let [env-val (env env-var)] + :when env-val] + [k env-val])))) + +(def config (atom (load-config))) + +(defn reload-config [] + (reset! config (load-config))) + +(comment + ;; Example usage: + ;; Access the config + @config + + ;; Reload the config at runtime + (reload-config)) diff --git a/src/micro_blog/is_tech.clj b/src/micro_blog/is_tech.clj new file mode 100644 index 0000000..6b4ee42 --- /dev/null +++ b/src/micro_blog/is_tech.clj @@ -0,0 +1,26 @@ +(ns micro-blog.is-tech + (:require + [micro-blog.config :refer [config]] + [clj-http.client :as client])) + +(defn call-mistral-api [post-text] + (let [url (str (:mistral-host @config) "/v1/conversations") + headers {"Content-Type" "application/json" + "Accept" "application/json" + "Authorization" (str "Bearer " (@config :mistral-api-key))} + body {:inputs post-text + :stream false + :agent_id (@config :mistral-agent-id)}] + (-> + (client/post url {:headers headers + :form-params body + :content-type :json + :as :json}) + :body + :outputs + first + :content + (#(if (= "1" %) true false))))) + +(defn is-tech? [post-text] + (call-mistral-api post-text))