-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbyok_provider.clj
More file actions
90 lines (79 loc) · 3.24 KB
/
byok_provider.clj
File metadata and controls
90 lines (79 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
(ns byok-provider
(:require [github.copilot-sdk :as copilot]
[github.copilot-sdk.helpers :as h]))
;; See examples/README.md for usage
;; See doc/auth/byok.md for full BYOK documentation
;; This example demonstrates using the Copilot SDK with your own API key
;; (BYOK = Bring Your Own Key) to connect to OpenAI, Azure, Anthropic,
;; or any OpenAI-compatible endpoint.
;; NOTE: This example requires an API key. Set one of:
;; OPENAI_API_KEY - for OpenAI
;; AZURE_OPENAI_KEY - for Azure OpenAI
;; ANTHROPIC_API_KEY - for Anthropic
;; (no key needed) - for Ollama (local)
(def defaults
{:provider-name "openai"})
(defn- openai-config
"Configuration for OpenAI direct."
[]
(let [api-key (System/getenv "OPENAI_API_KEY")]
(when-not api-key
(throw (ex-info "Set OPENAI_API_KEY environment variable" {})))
{:model "gpt-5.4"
:provider {:provider-type :openai
:base-url "https://api.openai.com/v1"
:api-key api-key}}))
(defn- azure-config
"Configuration for Azure OpenAI."
[]
(let [api-key (System/getenv "AZURE_OPENAI_KEY")
base-url (or (System/getenv "AZURE_OPENAI_ENDPOINT")
"https://your-resource.openai.azure.com")]
(when-not api-key
(throw (ex-info "Set AZURE_OPENAI_KEY environment variable" {})))
{:model "gpt-5.4"
:provider {:provider-type :azure
:base-url base-url
:api-key api-key
:azure-options {:azure-api-version "2024-10-21"}}}))
(defn- anthropic-config
"Configuration for Anthropic."
[]
(let [api-key (System/getenv "ANTHROPIC_API_KEY")]
(when-not api-key
(throw (ex-info "Set ANTHROPIC_API_KEY environment variable" {})))
{:model "claude-sonnet-4"
:provider {:provider-type :anthropic
:base-url "https://api.anthropic.com"
:api-key api-key}}))
(defn- ollama-config
"Configuration for Ollama (local, no API key needed)."
[]
{:model "llama3"
:provider {:provider-type :openai
:base-url "http://localhost:11434/v1"}})
(defn- get-provider-config [provider-name]
(case provider-name
"openai" (openai-config)
"azure" (azure-config)
"anthropic" (anthropic-config)
"ollama" (ollama-config)
(throw (ex-info (str "Unknown provider: " provider-name
". Use: openai, azure, anthropic, or ollama")
{:provider provider-name}))))
(defn run
"Run a BYOK query with a specified provider.
Usage:
clojure -A:examples -X byok-provider/run
clojure -A:examples -X byok-provider/run :provider-name '\"anthropic\"'
clojure -A:examples -X byok-provider/run :provider-name '\"ollama\"'"
[{:keys [provider-name] :or {provider-name (:provider-name defaults)}}]
(let [config (get-provider-config provider-name)]
(println (str "Using BYOK provider: " provider-name))
(println (str " Model: " (:model config)))
(println (str " Base URL: " (get-in config [:provider :base-url])))
(println)
(copilot/with-client [client {}]
(copilot/with-session [session client (assoc config :on-permission-request copilot/approve-all)]
(println "Q: What is 2+2?")
(println "🤖:" (h/query "What is 2+2? Answer in one sentence." :session session))))))