Skip to content

Commit 7821552

Browse files
Assistants API support for Azure (#41)
* Azure assistants API * Threads * Runs * Run step * stream * Vector store * Changes on parameters * Vector store file
1 parent 352dc41 commit 7821552

10 files changed

+590
-79
lines changed

Sources/OpenAI/AIProxy/AIProxyService.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -653,10 +653,11 @@ struct AIProxyService: OpenAIService {
653653
}
654654

655655
func modifyVectorStore(
656+
parameters: VectorStoreParameter,
656657
id: String)
657658
async throws -> VectorStoreObject
658659
{
659-
let request = try await OpenAIAPI.vectorStore(.modify(vectorStoreID: id)).request(aiproxyPartialKey: partialKey, organizationID: organizationID, method: .post, betaHeaderField: Self.assistantsBetaV2, deviceCheckBypass: deviceCheckBypass)
660+
let request = try await OpenAIAPI.vectorStore(.modify(vectorStoreID: id)).request(aiproxyPartialKey: partialKey, organizationID: organizationID, method: .post, params: parameters, betaHeaderField: Self.assistantsBetaV2, deviceCheckBypass: deviceCheckBypass)
660661
return try await fetch(type: VectorStoreObject.self, with: request)
661662
}
662663

Sources/OpenAI/Azure/AzureOpenAIAPI.swift

+110-3
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,127 @@ enum AzureOpenAIAPI {
1313

1414
static var azureOpenAIResource: String = ""
1515

16-
case chat(deploymentID: String) // https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions
16+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference?tabs=python
17+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/assistant
18+
case assistant(AssistantCategory)
19+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#chat-completions
20+
case chat(deploymentID: String)
21+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference-messages?tabs=python
22+
case message(MessageCategory)
23+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference-runs?tabs=python
24+
case run(RunCategory)
25+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference-runs?tabs=python#list-run-steps
26+
case runStep(RunStepCategory)
27+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/assistants-reference-threads?tabs=python#create-a-thread
28+
case thread(ThreadCategory)
29+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/file-search?tabs=python#vector-stores
30+
case vectorStore(VectorStoreCategory)
31+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/file-search?tabs=python#vector-stores
32+
case vectorStoreFile(VectorStoreFileCategory)
33+
34+
enum AssistantCategory {
35+
case create
36+
case list
37+
case retrieve(assistantID: String)
38+
case modify(assistantID: String)
39+
case delete(assistantID: String)
40+
}
41+
42+
enum MessageCategory {
43+
case create(threadID: String)
44+
case retrieve(threadID: String, messageID: String)
45+
case modify(threadID: String, messageID: String)
46+
case list(threadID: String)
47+
}
48+
49+
enum RunCategory {
50+
case create(threadID: String)
51+
case retrieve(threadID: String, runID: String)
52+
case modify(threadID: String, runID: String)
53+
case list(threadID: String)
54+
case cancel(threadID: String, runID: String)
55+
case submitToolOutput(threadID: String, runID: String)
56+
case createThreadAndRun
57+
}
58+
59+
enum RunStepCategory {
60+
case retrieve(threadID: String, runID: String, stepID: String)
61+
case list(threadID: String, runID: String)
62+
}
63+
64+
enum ThreadCategory {
65+
case create
66+
case retrieve(threadID: String)
67+
case modify(threadID: String)
68+
case delete(threadID: String)
69+
}
70+
71+
enum VectorStoreCategory {
72+
case create
73+
case list
74+
case retrieve(vectorStoreID: String)
75+
case modify(vectorStoreID: String)
76+
case delete(vectorStoreID: String)
77+
}
78+
79+
/// https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/file-search?tabs=python#file-search-support
80+
enum VectorStoreFileCategory {
81+
case create(vectorStoreID: String)
82+
case list(vectorStoreID: String)
83+
case retrieve(vectorStoreID: String, fileID: String)
84+
case delete(vectorStoreID: String, fileID: String)
85+
}
1786
}
1887

1988
// MARK: Endpoint
2089

2190
extension AzureOpenAIAPI: Endpoint {
2291

2392
var base: String {
24-
"https://\(Self.azureOpenAIResource).openai.azure.com"
93+
"https://\(Self.azureOpenAIResource)/openai.azure.com"
2594
}
2695

2796
var path: String {
2897
switch self {
29-
case .chat(let deploymentID): "/openai/deployments/\(deploymentID)/chat/completions"
98+
case .chat(let deploymentID): return "/openai/deployments/\(deploymentID)/chat/completions"
99+
case .assistant(let category):
100+
switch category {
101+
case .create, .list: return "/openai/assistants"
102+
case .retrieve(let assistantID), .modify(let assistantID), .delete(let assistantID): return "/openai/assistants/\(assistantID)"
103+
}
104+
case .message(let category):
105+
switch category {
106+
case .create(let threadID), .list(let threadID): return "/openai/threads/\(threadID)/messages"
107+
case .retrieve(let threadID, let messageID), .modify(let threadID, let messageID): return "/openai/threads/\(threadID)/messages/\(messageID)"
108+
}
109+
case .run(let category):
110+
switch category {
111+
case .create(let threadID), .list(let threadID): return "/openai/threads/\(threadID)/runs"
112+
case .retrieve(let threadID, let runID), .modify(let threadID, let runID): return "/openai/threads/\(threadID)/runs/\(runID)"
113+
case .cancel(let threadID, let runID): return "/openai/threads/\(threadID)/runs/\(runID)/cancel"
114+
case .submitToolOutput(let threadID, let runID): return "/openai/threads/\(threadID)/runs/\(runID)//submit_tool_outputs"
115+
case .createThreadAndRun: return "/openai/threads/runs"
116+
}
117+
case .runStep(let category):
118+
switch category {
119+
case .retrieve(let threadID, let runID, let stepID): return "/openai/threads/\(threadID)/runs/\(runID)/steps/\(stepID)"
120+
case .list(let threadID, let runID): return "/openai/threads/\(threadID)/runs/\(runID)/steps"
121+
}
122+
case .thread(let category):
123+
switch category {
124+
case .create: return "/openai/threads"
125+
case .retrieve(let threadID), .modify(let threadID), .delete(let threadID): return "/openai/threads/\(threadID)"
126+
}
127+
case .vectorStore(let category):
128+
switch category {
129+
case .create, .list: return "/openai/vector_stores"
130+
case .retrieve(let vectorStoreID), .modify(let vectorStoreID), .delete(let vectorStoreID): return "/openai/vector_stores/\(vectorStoreID)"
131+
}
132+
case .vectorStoreFile(let category):
133+
switch category {
134+
case .create(let vectorStoreID), .list(let vectorStoreID): return "/openai/vector_stores/\(vectorStoreID)/files"
135+
case .retrieve(let vectorStoreID, let fileID), .delete(let vectorStoreID, let fileID): return "/openai/vector_stores/\(vectorStoreID)/files/\(fileID)"
136+
}
30137
}
31138
}
32139
}

Sources/OpenAI/Azure/AzureOpenAIConfiguration.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@ public struct AzureOpenAIConfiguration {
1919
/// The API version to use for this operation. This follows the YYYY-MM-DD format.
2020
let apiVersion: String
2121

22+
/// Azure configuration extra headers for a request.
23+
let extraHeaders: [String: String]?
24+
2225
public init(
2326
resourceName: String,
2427
openAIAPIKey: Authorization,
25-
apiVersion: String)
28+
apiVersion: String,
29+
extraHeaders: [String: String]? = nil)
2630
{
2731
self.resourceName = resourceName
2832
self.openAIAPIKey = openAIAPIKey
2933
self.apiVersion = apiVersion
34+
self.extraHeaders = extraHeaders
3035
}
3136
}

0 commit comments

Comments
 (0)