From e3b5b090fbcaffff3c4ceb4533645e4ebd6fbc47 Mon Sep 17 00:00:00 2001 From: Sam <106342593+leetcode-mafia@users.noreply.github.com> Date: Sun, 26 Mar 2023 17:31:42 -0400 Subject: [PATCH] initial commit --- .gitignore | 2 + .vscode/c_cpp_properties.json | 19 + Cheetah.xcodeproj/project.pbxproj | 1035 +++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Cheetah.xcscheme | 78 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 58 + Cheetah/Assets.xcassets/Contents.json | 6 + Cheetah/BrowserExtension.swift | 101 ++ Cheetah/Cheetah.entitlements | 5 + Cheetah/CheetahApp.swift | 139 +++ Cheetah/ConversationAnalyzer.swift | 162 +++ Cheetah/Info.plist | 5 + Cheetah/ModelDownloader.swift | 71 ++ Cheetah/OpenAIExecutor.swift | 158 +++ .../Preview Assets.xcassets/Contents.json | 6 + Cheetah/PromptGenerator.swift | 162 +++ Cheetah/Views/AuthTokenView.swift | 39 + Cheetah/Views/CoachView.swift | 86 ++ Cheetah/Views/ContentView.swift | 68 ++ Cheetah/Views/NSTextFieldWrapper.swift | 53 + .../Views/RSDimensionHuggingTextField.swift | 106 ++ CheetahIPC/CheetahIPC.h | 10 + CheetahIPC/Client.swift | 67 ++ CheetahIPC/Messages.swift | 17 + CheetahIPC/Server.swift | 95 ++ ExtensionHelper/ExtensionHelper.entitlements | 5 + ExtensionHelper/main.swift | 78 ++ LICENSE | 116 ++ LibWhisper/CaptureDevice.swift | 43 + LibWhisper/LibWhisper.h | 15 + LibWhisper/SDL.h | 233 ++++ LibWhisper/WhisperStream.swift | 98 ++ LibWhisper/stream.cpp | 240 ++++ LibWhisper/stream.h | 42 + OpenAISwift/LICENSE | 21 + OpenAISwift/Models/ChatMessage.swift | 85 ++ OpenAISwift/Models/Command.swift | 19 + OpenAISwift/Models/ImageGeneration.swift | 21 + OpenAISwift/Models/Instruction.swift | 11 + OpenAISwift/Models/OpenAI.swift | 39 + OpenAISwift/Models/OpenAIModelType.swift | 120 ++ OpenAISwift/OpenAIEndpoint.swift | 41 + OpenAISwift/OpenAISwift.swift | 298 +++++ README.md | 53 + cheetah.jpg | Bin 0 -> 297692 bytes extension/background.js | 12 + extension/cheetah.js | 23 + extension/icon.png | Bin 0 -> 225 bytes extension/manifest.json | 35 + 51 files changed, 4222 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/c_cpp_properties.json create mode 100644 Cheetah.xcodeproj/project.pbxproj create mode 100644 Cheetah.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Cheetah.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Cheetah.xcodeproj/xcshareddata/xcschemes/Cheetah.xcscheme create mode 100644 Cheetah/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Cheetah/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Cheetah/Assets.xcassets/Contents.json create mode 100644 Cheetah/BrowserExtension.swift create mode 100644 Cheetah/Cheetah.entitlements create mode 100644 Cheetah/CheetahApp.swift create mode 100644 Cheetah/ConversationAnalyzer.swift create mode 100644 Cheetah/Info.plist create mode 100644 Cheetah/ModelDownloader.swift create mode 100644 Cheetah/OpenAIExecutor.swift create mode 100644 Cheetah/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Cheetah/PromptGenerator.swift create mode 100644 Cheetah/Views/AuthTokenView.swift create mode 100644 Cheetah/Views/CoachView.swift create mode 100644 Cheetah/Views/ContentView.swift create mode 100644 Cheetah/Views/NSTextFieldWrapper.swift create mode 100644 Cheetah/Views/RSDimensionHuggingTextField.swift create mode 100644 CheetahIPC/CheetahIPC.h create mode 100644 CheetahIPC/Client.swift create mode 100644 CheetahIPC/Messages.swift create mode 100644 CheetahIPC/Server.swift create mode 100644 ExtensionHelper/ExtensionHelper.entitlements create mode 100644 ExtensionHelper/main.swift create mode 100644 LICENSE create mode 100644 LibWhisper/CaptureDevice.swift create mode 100644 LibWhisper/LibWhisper.h create mode 100644 LibWhisper/SDL.h create mode 100644 LibWhisper/WhisperStream.swift create mode 100644 LibWhisper/stream.cpp create mode 100644 LibWhisper/stream.h create mode 100644 OpenAISwift/LICENSE create mode 100644 OpenAISwift/Models/ChatMessage.swift create mode 100644 OpenAISwift/Models/Command.swift create mode 100644 OpenAISwift/Models/ImageGeneration.swift create mode 100644 OpenAISwift/Models/Instruction.swift create mode 100644 OpenAISwift/Models/OpenAI.swift create mode 100644 OpenAISwift/Models/OpenAIModelType.swift create mode 100644 OpenAISwift/OpenAIEndpoint.swift create mode 100644 OpenAISwift/OpenAISwift.swift create mode 100644 README.md create mode 100644 cheetah.jpg create mode 100644 extension/background.js create mode 100644 extension/cheetah.js create mode 100644 extension/icon.png create mode 100644 extension/manifest.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9f3e7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +xcuserdata/ diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..834113c --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,19 @@ +{ + "configurations": [ + { + "name": "Mac", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [], + "macFrameworkPath": [ + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" + ], + "compilerPath": "/usr/bin/clang", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "macos-clang-arm64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Cheetah.xcodeproj/project.pbxproj b/Cheetah.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cde5f1f --- /dev/null +++ b/Cheetah.xcodeproj/project.pbxproj @@ -0,0 +1,1035 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 376437AE29A75B2C00297AC6 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 376437AD29A75B2C00297AC6 /* Accelerate.framework */; }; + 376437B329A849B600297AC6 /* PromptGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376437B229A849B600297AC6 /* PromptGenerator.swift */; }; + 376437B529A84BEE00297AC6 /* OpenAIExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376437B429A84BEE00297AC6 /* OpenAIExecutor.swift */; }; + 376437BA29A854F500297AC6 /* ConversationAnalyzer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376437B929A854F500297AC6 /* ConversationAnalyzer.swift */; }; + 376437BC29A9256300297AC6 /* CaptureDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = 376437BB29A9256300297AC6 /* CaptureDevice.swift */; }; + 37951C0E29BCD71000C61AC5 /* ModelDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37951C0D29BCD71000C61AC5 /* ModelDownloader.swift */; }; + 37951C1029BCE23500C61AC5 /* CoachView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37951C0F29BCE23500C61AC5 /* CoachView.swift */; }; + 37951C7329BD7A7600C61AC5 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37951C7229BD7A7600C61AC5 /* main.swift */; }; + 379D7B0529C3B9E600B47942 /* RSDimensionHuggingTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379D7B0429C3B9E600B47942 /* RSDimensionHuggingTextField.swift */; }; + 37AE7A7329A5A8B300C45FF6 /* CheetahApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7A7229A5A8B300C45FF6 /* CheetahApp.swift */; }; + 37AE7A7529A5A8B300C45FF6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7A7429A5A8B300C45FF6 /* ContentView.swift */; }; + 37AE7A7729A5A8B400C45FF6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 37AE7A7629A5A8B400C45FF6 /* Assets.xcassets */; }; + 37AE7A7A29A5A8B400C45FF6 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 37AE7A7929A5A8B400C45FF6 /* Preview Assets.xcassets */; }; + 37AE7A9229A5A9C200C45FF6 /* LibWhisper.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7A9129A5A9C200C45FF6 /* LibWhisper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37AE7A9529A5A9C200C45FF6 /* LibWhisper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37AE7A8F29A5A9C200C45FF6 /* LibWhisper.framework */; }; + 37AE7A9629A5A9C200C45FF6 /* LibWhisper.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37AE7A8F29A5A9C200C45FF6 /* LibWhisper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 37AE7AB329A5AAD400C45FF6 /* whisper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7AAF29A5AAD400C45FF6 /* whisper.cpp */; }; + 37AE7AB429A5AAD400C45FF6 /* ggml.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7AB029A5AAD400C45FF6 /* ggml.h */; }; + 37AE7AB629A5AAD400C45FF6 /* ggml.c in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7AB229A5AAD400C45FF6 /* ggml.c */; }; + 37AE7AB829A5AD5300C45FF6 /* WhisperStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7AB729A5AD5300C45FF6 /* WhisperStream.swift */; }; + 37AE7AC029A6E96A00C45FF6 /* dr_wav.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7ABB29A6E96A00C45FF6 /* dr_wav.h */; }; + 37AE7AC129A6E96A00C45FF6 /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7ABC29A6E96A00C45FF6 /* common.h */; }; + 37AE7AC229A6E96A00C45FF6 /* common-sdl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7ABD29A6E96A00C45FF6 /* common-sdl.cpp */; }; + 37AE7AC329A6E96A00C45FF6 /* common-sdl.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7ABE29A6E96A00C45FF6 /* common-sdl.h */; }; + 37AE7AC429A6E96A00C45FF6 /* common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7ABF29A6E96A00C45FF6 /* common.cpp */; }; + 37AE7AC629A6E9C400C45FF6 /* stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37AE7AC529A6E9C400C45FF6 /* stream.cpp */; }; + 37AE7AC929A6F7F200C45FF6 /* stream.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7AC729A6EC2F00C45FF6 /* stream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37AE7ACA29A70CE900C45FF6 /* whisper.h in Headers */ = {isa = PBXBuildFile; fileRef = 37AE7AB129A5AAD400C45FF6 /* whisper.h */; }; + 37B3A50629CE15AC0029821F /* OpenAIEndpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A4FD29CE15AC0029821F /* OpenAIEndpoint.swift */; }; + 37B3A50729CE15AC0029821F /* OpenAISwift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A4FE29CE15AC0029821F /* OpenAISwift.swift */; }; + 37B3A51C29CE16330029821F /* ImageGeneration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51629CE16330029821F /* ImageGeneration.swift */; }; + 37B3A51D29CE16330029821F /* OpenAIModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51729CE16330029821F /* OpenAIModelType.swift */; }; + 37B3A51E29CE16330029821F /* Command.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51829CE16330029821F /* Command.swift */; }; + 37B3A51F29CE16330029821F /* Instruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51929CE16330029821F /* Instruction.swift */; }; + 37B3A52029CE16330029821F /* ChatMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51A29CE16330029821F /* ChatMessage.swift */; }; + 37B3A52129CE16330029821F /* OpenAI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A51B29CE16330029821F /* OpenAI.swift */; }; + 37B3A52329CE1BF40029821F /* AuthTokenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3A52229CE1BF40029821F /* AuthTokenView.swift */; }; + 37B4C26129BD7C1600E83465 /* CheetahIPC.h in Headers */ = {isa = PBXBuildFile; fileRef = 37B4C26029BD7C1600E83465 /* CheetahIPC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37B4C26C29BD7C2000E83465 /* Messages.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B4C26929BD7C2000E83465 /* Messages.swift */; }; + 37B4C26D29BD7C2000E83465 /* Client.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B4C26A29BD7C2000E83465 /* Client.swift */; }; + 37B4C26E29BD7C2000E83465 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B4C26B29BD7C2000E83465 /* Server.swift */; }; + 37B4C26F29BD7C2B00E83465 /* CheetahIPC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */; }; + 37B4C27029BD7C2B00E83465 /* CheetahIPC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 37B4C27629BD7D4000E83465 /* ExtensionHelper in Embed Executables */ = {isa = PBXBuildFile; fileRef = 37951C7029BD7A7500C61AC5 /* ExtensionHelper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 37B4C27729BD7D9F00E83465 /* CheetahIPC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */; }; + 37B4C27829BD7D9F00E83465 /* CheetahIPC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 37B4C27A29BD9F8700E83465 /* BrowserExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B4C27929BD9F8700E83465 /* BrowserExtension.swift */; }; + 37B4C27D29C1202C00E83465 /* NSTextFieldWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B4C27C29C1202C00E83465 /* NSTextFieldWrapper.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 37AE7A9329A5A9C200C45FF6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37AE7A6729A5A8B300C45FF6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 37AE7A8E29A5A9C200C45FF6; + remoteInfo = LibWhisper; + }; + 37B4C26229BD7C1600E83465 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37AE7A6729A5A8B300C45FF6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 37B4C25D29BD7C1600E83465; + remoteInfo = CheetahIPC; + }; + 37B4C27129BD7C2B00E83465 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37AE7A6729A5A8B300C45FF6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 37B4C25D29BD7C1600E83465; + remoteInfo = CheetahIPC; + }; + 37B4C27429BD7D3500E83465 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 37AE7A6729A5A8B300C45FF6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 37951C6F29BD7A7500C61AC5; + remoteInfo = ExtensionHelper; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 37951C6E29BD7A7500C61AC5 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 37951C7C29BD7B3400C61AC5 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 37B4C27029BD7C2B00E83465 /* CheetahIPC.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A9A29A5A9C200C45FF6 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 37B4C27829BD7D9F00E83465 /* CheetahIPC.framework in Embed Frameworks */, + 37AE7A9629A5A9C200C45FF6 /* LibWhisper.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 37B4C27329BD7C7500E83465 /* Embed Executables */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 6; + files = ( + 37B4C27629BD7D4000E83465 /* ExtensionHelper in Embed Executables */, + ); + name = "Embed Executables"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 376437AD29A75B2C00297AC6 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; + 376437B229A849B600297AC6 /* PromptGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromptGenerator.swift; sourceTree = ""; }; + 376437B429A84BEE00297AC6 /* OpenAIExecutor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenAIExecutor.swift; sourceTree = ""; }; + 376437B929A854F500297AC6 /* ConversationAnalyzer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationAnalyzer.swift; sourceTree = ""; }; + 376437BB29A9256300297AC6 /* CaptureDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureDevice.swift; sourceTree = ""; }; + 37951C0D29BCD71000C61AC5 /* ModelDownloader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelDownloader.swift; sourceTree = ""; }; + 37951C0F29BCE23500C61AC5 /* CoachView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoachView.swift; sourceTree = ""; }; + 37951C7029BD7A7500C61AC5 /* ExtensionHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ExtensionHelper; sourceTree = BUILT_PRODUCTS_DIR; }; + 37951C7229BD7A7600C61AC5 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 37951C7D29BD7B4C00C61AC5 /* ExtensionHelper.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ExtensionHelper.entitlements; sourceTree = ""; }; + 379D7B0429C3B9E600B47942 /* RSDimensionHuggingTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RSDimensionHuggingTextField.swift; sourceTree = ""; }; + 37AE7A6F29A5A8B300C45FF6 /* Cheetah.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cheetah.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 37AE7A7229A5A8B300C45FF6 /* CheetahApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheetahApp.swift; sourceTree = ""; }; + 37AE7A7429A5A8B300C45FF6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 37AE7A7629A5A8B400C45FF6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 37AE7A7929A5A8B400C45FF6 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 37AE7A7B29A5A8B400C45FF6 /* Cheetah.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Cheetah.entitlements; sourceTree = ""; }; + 37AE7A8F29A5A9C200C45FF6 /* LibWhisper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = LibWhisper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 37AE7A9129A5A9C200C45FF6 /* LibWhisper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LibWhisper.h; sourceTree = ""; }; + 37AE7AAF29A5AAD400C45FF6 /* whisper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = whisper.cpp; path = ../../whisper.cpp/whisper.cpp; sourceTree = ""; }; + 37AE7AB029A5AAD400C45FF6 /* ggml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ggml.h; path = ../../whisper.cpp/ggml.h; sourceTree = ""; }; + 37AE7AB129A5AAD400C45FF6 /* whisper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = whisper.h; path = ../../whisper.cpp/whisper.h; sourceTree = ""; }; + 37AE7AB229A5AAD400C45FF6 /* ggml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ggml.c; path = ../../whisper.cpp/ggml.c; sourceTree = ""; }; + 37AE7AB729A5AD5300C45FF6 /* WhisperStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhisperStream.swift; sourceTree = ""; }; + 37AE7ABB29A6E96A00C45FF6 /* dr_wav.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dr_wav.h; path = ../../whisper.cpp/examples/dr_wav.h; sourceTree = ""; }; + 37AE7ABC29A6E96A00C45FF6 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../../whisper.cpp/examples/common.h; sourceTree = ""; }; + 37AE7ABD29A6E96A00C45FF6 /* common-sdl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "common-sdl.cpp"; path = "../../whisper.cpp/examples/common-sdl.cpp"; sourceTree = ""; }; + 37AE7ABE29A6E96A00C45FF6 /* common-sdl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "common-sdl.h"; path = "../../whisper.cpp/examples/common-sdl.h"; sourceTree = ""; }; + 37AE7ABF29A6E96A00C45FF6 /* common.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = common.cpp; path = ../../whisper.cpp/examples/common.cpp; sourceTree = ""; }; + 37AE7AC529A6E9C400C45FF6 /* stream.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = stream.cpp; sourceTree = ""; }; + 37AE7AC729A6EC2F00C45FF6 /* stream.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = stream.h; sourceTree = ""; }; + 37B3A4FD29CE15AC0029821F /* OpenAIEndpoint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenAIEndpoint.swift; sourceTree = ""; }; + 37B3A4FE29CE15AC0029821F /* OpenAISwift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenAISwift.swift; sourceTree = ""; }; + 37B3A51629CE16330029821F /* ImageGeneration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageGeneration.swift; sourceTree = ""; }; + 37B3A51729CE16330029821F /* OpenAIModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenAIModelType.swift; sourceTree = ""; }; + 37B3A51829CE16330029821F /* Command.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Command.swift; sourceTree = ""; }; + 37B3A51929CE16330029821F /* Instruction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Instruction.swift; sourceTree = ""; }; + 37B3A51A29CE16330029821F /* ChatMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatMessage.swift; sourceTree = ""; }; + 37B3A51B29CE16330029821F /* OpenAI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenAI.swift; sourceTree = ""; }; + 37B3A52229CE1BF40029821F /* AuthTokenView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthTokenView.swift; sourceTree = ""; }; + 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CheetahIPC.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 37B4C26029BD7C1600E83465 /* CheetahIPC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CheetahIPC.h; sourceTree = ""; }; + 37B4C26929BD7C2000E83465 /* Messages.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Messages.swift; sourceTree = ""; }; + 37B4C26A29BD7C2000E83465 /* Client.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Client.swift; sourceTree = ""; }; + 37B4C26B29BD7C2000E83465 /* Server.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = ""; }; + 37B4C27929BD9F8700E83465 /* BrowserExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BrowserExtension.swift; sourceTree = ""; }; + 37B4C27B29BE85AA00E83465 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 37B4C27C29C1202C00E83465 /* NSTextFieldWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSTextFieldWrapper.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 37951C6D29BD7A7500C61AC5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 37B4C26F29BD7C2B00E83465 /* CheetahIPC.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A6C29A5A8B300C45FF6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 37B4C27729BD7D9F00E83465 /* CheetahIPC.framework in Frameworks */, + 37AE7A9529A5A9C200C45FF6 /* LibWhisper.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A8C29A5A9C200C45FF6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 376437AE29A75B2C00297AC6 /* Accelerate.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37B4C25B29BD7C1600E83465 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 376437AC29A75B2C00297AC6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 376437AD29A75B2C00297AC6 /* Accelerate.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 37951C7129BD7A7600C61AC5 /* ExtensionHelper */ = { + isa = PBXGroup; + children = ( + 37951C7D29BD7B4C00C61AC5 /* ExtensionHelper.entitlements */, + 37951C7229BD7A7600C61AC5 /* main.swift */, + ); + path = ExtensionHelper; + sourceTree = ""; + }; + 37AE7A6629A5A8B300C45FF6 = { + isa = PBXGroup; + children = ( + 37B3A4F529CE15A30029821F /* OpenAISwift */, + 37AE7A7129A5A8B300C45FF6 /* Cheetah */, + 37AE7A9029A5A9C200C45FF6 /* LibWhisper */, + 37951C7129BD7A7600C61AC5 /* ExtensionHelper */, + 37B4C25F29BD7C1600E83465 /* CheetahIPC */, + 37AE7A7029A5A8B300C45FF6 /* Products */, + 376437AC29A75B2C00297AC6 /* Frameworks */, + ); + sourceTree = ""; + }; + 37AE7A7029A5A8B300C45FF6 /* Products */ = { + isa = PBXGroup; + children = ( + 37AE7A6F29A5A8B300C45FF6 /* Cheetah.app */, + 37AE7A8F29A5A9C200C45FF6 /* LibWhisper.framework */, + 37951C7029BD7A7500C61AC5 /* ExtensionHelper */, + 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */, + ); + name = Products; + sourceTree = ""; + }; + 37AE7A7129A5A8B300C45FF6 /* Cheetah */ = { + isa = PBXGroup; + children = ( + 37B3A4F129CE12CE0029821F /* Views */, + 37B4C27B29BE85AA00E83465 /* Info.plist */, + 37AE7A7229A5A8B300C45FF6 /* CheetahApp.swift */, + 376437B229A849B600297AC6 /* PromptGenerator.swift */, + 376437B429A84BEE00297AC6 /* OpenAIExecutor.swift */, + 376437B929A854F500297AC6 /* ConversationAnalyzer.swift */, + 37951C0D29BCD71000C61AC5 /* ModelDownloader.swift */, + 37B4C27929BD9F8700E83465 /* BrowserExtension.swift */, + 37AE7A7629A5A8B400C45FF6 /* Assets.xcassets */, + 37AE7A7B29A5A8B400C45FF6 /* Cheetah.entitlements */, + 37AE7A7829A5A8B400C45FF6 /* Preview Content */, + ); + path = Cheetah; + sourceTree = ""; + }; + 37AE7A7829A5A8B400C45FF6 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 37AE7A7929A5A8B400C45FF6 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 37AE7A9029A5A9C200C45FF6 /* LibWhisper */ = { + isa = PBXGroup; + children = ( + 37AE7AA729A5AA2400C45FF6 /* whisper.cpp */, + 37AE7AC529A6E9C400C45FF6 /* stream.cpp */, + 37AE7AC729A6EC2F00C45FF6 /* stream.h */, + 37AE7A9129A5A9C200C45FF6 /* LibWhisper.h */, + 37AE7AB729A5AD5300C45FF6 /* WhisperStream.swift */, + 376437BB29A9256300297AC6 /* CaptureDevice.swift */, + ); + path = LibWhisper; + sourceTree = ""; + }; + 37AE7AA729A5AA2400C45FF6 /* whisper.cpp */ = { + isa = PBXGroup; + children = ( + 37AE7AB229A5AAD400C45FF6 /* ggml.c */, + 37AE7AB029A5AAD400C45FF6 /* ggml.h */, + 37AE7AAF29A5AAD400C45FF6 /* whisper.cpp */, + 37AE7AB129A5AAD400C45FF6 /* whisper.h */, + 37AE7ABD29A6E96A00C45FF6 /* common-sdl.cpp */, + 37AE7ABE29A6E96A00C45FF6 /* common-sdl.h */, + 37AE7ABF29A6E96A00C45FF6 /* common.cpp */, + 37AE7ABC29A6E96A00C45FF6 /* common.h */, + 37AE7ABB29A6E96A00C45FF6 /* dr_wav.h */, + ); + name = whisper.cpp; + sourceTree = ""; + }; + 37B3A4F129CE12CE0029821F /* Views */ = { + isa = PBXGroup; + children = ( + 37AE7A7429A5A8B300C45FF6 /* ContentView.swift */, + 37951C0F29BCE23500C61AC5 /* CoachView.swift */, + 37B4C27C29C1202C00E83465 /* NSTextFieldWrapper.swift */, + 379D7B0429C3B9E600B47942 /* RSDimensionHuggingTextField.swift */, + 37B3A52229CE1BF40029821F /* AuthTokenView.swift */, + ); + path = Views; + sourceTree = ""; + }; + 37B3A4F529CE15A30029821F /* OpenAISwift */ = { + isa = PBXGroup; + children = ( + 37B3A50929CE16010029821F /* Models */, + 37B3A4FD29CE15AC0029821F /* OpenAIEndpoint.swift */, + 37B3A4FE29CE15AC0029821F /* OpenAISwift.swift */, + ); + path = OpenAISwift; + sourceTree = ""; + }; + 37B3A50929CE16010029821F /* Models */ = { + isa = PBXGroup; + children = ( + 37B3A51A29CE16330029821F /* ChatMessage.swift */, + 37B3A51829CE16330029821F /* Command.swift */, + 37B3A51629CE16330029821F /* ImageGeneration.swift */, + 37B3A51929CE16330029821F /* Instruction.swift */, + 37B3A51B29CE16330029821F /* OpenAI.swift */, + 37B3A51729CE16330029821F /* OpenAIModelType.swift */, + ); + path = Models; + sourceTree = ""; + }; + 37B4C25F29BD7C1600E83465 /* CheetahIPC */ = { + isa = PBXGroup; + children = ( + 37B4C26029BD7C1600E83465 /* CheetahIPC.h */, + 37B4C26A29BD7C2000E83465 /* Client.swift */, + 37B4C26B29BD7C2000E83465 /* Server.swift */, + 37B4C26929BD7C2000E83465 /* Messages.swift */, + ); + path = CheetahIPC; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 37AE7A8A29A5A9C200C45FF6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 37AE7AB429A5AAD400C45FF6 /* ggml.h in Headers */, + 37AE7AC929A6F7F200C45FF6 /* stream.h in Headers */, + 37AE7ACA29A70CE900C45FF6 /* whisper.h in Headers */, + 37AE7AC129A6E96A00C45FF6 /* common.h in Headers */, + 37AE7A9229A5A9C200C45FF6 /* LibWhisper.h in Headers */, + 37AE7AC329A6E96A00C45FF6 /* common-sdl.h in Headers */, + 37AE7AC029A6E96A00C45FF6 /* dr_wav.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37B4C25929BD7C1600E83465 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 37B4C26129BD7C1600E83465 /* CheetahIPC.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 37951C6F29BD7A7500C61AC5 /* ExtensionHelper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 37951C7429BD7A7600C61AC5 /* Build configuration list for PBXNativeTarget "ExtensionHelper" */; + buildPhases = ( + 37951C6C29BD7A7500C61AC5 /* Sources */, + 37951C6D29BD7A7500C61AC5 /* Frameworks */, + 37951C6E29BD7A7500C61AC5 /* CopyFiles */, + 37951C7C29BD7B3400C61AC5 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 37B4C27229BD7C2B00E83465 /* PBXTargetDependency */, + ); + name = ExtensionHelper; + productName = ExtensionHelper; + productReference = 37951C7029BD7A7500C61AC5 /* ExtensionHelper */; + productType = "com.apple.product-type.tool"; + }; + 37AE7A6E29A5A8B300C45FF6 /* Cheetah */ = { + isa = PBXNativeTarget; + buildConfigurationList = 37AE7A7E29A5A8B400C45FF6 /* Build configuration list for PBXNativeTarget "Cheetah" */; + buildPhases = ( + 37AE7A6B29A5A8B300C45FF6 /* Sources */, + 37AE7A6C29A5A8B300C45FF6 /* Frameworks */, + 37AE7A6D29A5A8B300C45FF6 /* Resources */, + 37AE7A9A29A5A9C200C45FF6 /* Embed Frameworks */, + 37B4C27329BD7C7500E83465 /* Embed Executables */, + ); + buildRules = ( + ); + dependencies = ( + 37AE7A9429A5A9C200C45FF6 /* PBXTargetDependency */, + 37B4C26329BD7C1600E83465 /* PBXTargetDependency */, + 37B4C27529BD7D3500E83465 /* PBXTargetDependency */, + ); + name = Cheetah; + packageProductDependencies = ( + ); + productName = Cheetah; + productReference = 37AE7A6F29A5A8B300C45FF6 /* Cheetah.app */; + productType = "com.apple.product-type.application"; + }; + 37AE7A8E29A5A9C200C45FF6 /* LibWhisper */ = { + isa = PBXNativeTarget; + buildConfigurationList = 37AE7A9729A5A9C200C45FF6 /* Build configuration list for PBXNativeTarget "LibWhisper" */; + buildPhases = ( + 37AE7A8A29A5A9C200C45FF6 /* Headers */, + 37AE7A8B29A5A9C200C45FF6 /* Sources */, + 37AE7A8C29A5A9C200C45FF6 /* Frameworks */, + 37AE7A8D29A5A9C200C45FF6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LibWhisper; + productName = LibWhisper; + productReference = 37AE7A8F29A5A9C200C45FF6 /* LibWhisper.framework */; + productType = "com.apple.product-type.framework"; + }; + 37B4C25D29BD7C1600E83465 /* CheetahIPC */ = { + isa = PBXNativeTarget; + buildConfigurationList = 37B4C26829BD7C1600E83465 /* Build configuration list for PBXNativeTarget "CheetahIPC" */; + buildPhases = ( + 37B4C25929BD7C1600E83465 /* Headers */, + 37B4C25A29BD7C1600E83465 /* Sources */, + 37B4C25B29BD7C1600E83465 /* Frameworks */, + 37B4C25C29BD7C1600E83465 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CheetahIPC; + productName = CheetahIPC; + productReference = 37B4C25E29BD7C1600E83465 /* CheetahIPC.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 37AE7A6729A5A8B300C45FF6 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1420; + LastUpgradeCheck = 1420; + TargetAttributes = { + 37951C6F29BD7A7500C61AC5 = { + CreatedOnToolsVersion = 14.2; + }; + 37AE7A6E29A5A8B300C45FF6 = { + CreatedOnToolsVersion = 14.2; + }; + 37AE7A8E29A5A9C200C45FF6 = { + CreatedOnToolsVersion = 14.2; + LastSwiftMigration = 1420; + }; + 37B4C25D29BD7C1600E83465 = { + CreatedOnToolsVersion = 14.2; + LastSwiftMigration = 1420; + }; + }; + }; + buildConfigurationList = 37AE7A6A29A5A8B300C45FF6 /* Build configuration list for PBXProject "Cheetah" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 37AE7A6629A5A8B300C45FF6; + packageReferences = ( + ); + productRefGroup = 37AE7A7029A5A8B300C45FF6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 37AE7A6E29A5A8B300C45FF6 /* Cheetah */, + 37AE7A8E29A5A9C200C45FF6 /* LibWhisper */, + 37951C6F29BD7A7500C61AC5 /* ExtensionHelper */, + 37B4C25D29BD7C1600E83465 /* CheetahIPC */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 37AE7A6D29A5A8B300C45FF6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 37AE7A7A29A5A8B400C45FF6 /* Preview Assets.xcassets in Resources */, + 37AE7A7729A5A8B400C45FF6 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A8D29A5A9C200C45FF6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37B4C25C29BD7C1600E83465 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 37951C6C29BD7A7500C61AC5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 37951C7329BD7A7600C61AC5 /* main.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A6B29A5A8B300C45FF6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 37B3A52029CE16330029821F /* ChatMessage.swift in Sources */, + 376437B329A849B600297AC6 /* PromptGenerator.swift in Sources */, + 37B3A51D29CE16330029821F /* OpenAIModelType.swift in Sources */, + 37B3A52129CE16330029821F /* OpenAI.swift in Sources */, + 37B3A50729CE15AC0029821F /* OpenAISwift.swift in Sources */, + 376437B529A84BEE00297AC6 /* OpenAIExecutor.swift in Sources */, + 37B4C27A29BD9F8700E83465 /* BrowserExtension.swift in Sources */, + 37951C0E29BCD71000C61AC5 /* ModelDownloader.swift in Sources */, + 37AE7A7529A5A8B300C45FF6 /* ContentView.swift in Sources */, + 37B3A51C29CE16330029821F /* ImageGeneration.swift in Sources */, + 37B3A51E29CE16330029821F /* Command.swift in Sources */, + 376437BA29A854F500297AC6 /* ConversationAnalyzer.swift in Sources */, + 37B4C27D29C1202C00E83465 /* NSTextFieldWrapper.swift in Sources */, + 37B3A52329CE1BF40029821F /* AuthTokenView.swift in Sources */, + 37AE7A7329A5A8B300C45FF6 /* CheetahApp.swift in Sources */, + 37B3A50629CE15AC0029821F /* OpenAIEndpoint.swift in Sources */, + 37951C1029BCE23500C61AC5 /* CoachView.swift in Sources */, + 37B3A51F29CE16330029821F /* Instruction.swift in Sources */, + 379D7B0529C3B9E600B47942 /* RSDimensionHuggingTextField.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37AE7A8B29A5A9C200C45FF6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 37AE7AB629A5AAD400C45FF6 /* ggml.c in Sources */, + 376437BC29A9256300297AC6 /* CaptureDevice.swift in Sources */, + 37AE7AC429A6E96A00C45FF6 /* common.cpp in Sources */, + 37AE7AB329A5AAD400C45FF6 /* whisper.cpp in Sources */, + 37AE7AC229A6E96A00C45FF6 /* common-sdl.cpp in Sources */, + 37AE7AB829A5AD5300C45FF6 /* WhisperStream.swift in Sources */, + 37AE7AC629A6E9C400C45FF6 /* stream.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 37B4C25A29BD7C1600E83465 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 37B4C26D29BD7C2000E83465 /* Client.swift in Sources */, + 37B4C26E29BD7C2000E83465 /* Server.swift in Sources */, + 37B4C26C29BD7C2000E83465 /* Messages.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 37AE7A9429A5A9C200C45FF6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 37AE7A8E29A5A9C200C45FF6 /* LibWhisper */; + targetProxy = 37AE7A9329A5A9C200C45FF6 /* PBXContainerItemProxy */; + }; + 37B4C26329BD7C1600E83465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 37B4C25D29BD7C1600E83465 /* CheetahIPC */; + targetProxy = 37B4C26229BD7C1600E83465 /* PBXContainerItemProxy */; + }; + 37B4C27229BD7C2B00E83465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 37B4C25D29BD7C1600E83465 /* CheetahIPC */; + targetProxy = 37B4C27129BD7C2B00E83465 /* PBXContainerItemProxy */; + }; + 37B4C27529BD7D3500E83465 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 37951C6F29BD7A7500C61AC5 /* ExtensionHelper */; + targetProxy = 37B4C27429BD7D3500E83465 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 37951C7529BD7A7600C61AC5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = ExtensionHelper/ExtensionHelper.entitlements; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5JL49Y835V; + ENABLE_HARDENED_RUNTIME = NO; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 37951C7629BD7A7600C61AC5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = ExtensionHelper/ExtensionHelper.entitlements; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 5JL49Y835V; + ENABLE_HARDENED_RUNTIME = NO; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 37AE7A7C29A5A8B400C45FF6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 37AE7A7D29A5A8B400C45FF6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.1; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 37AE7A7F29A5A8B400C45FF6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Cheetah/Cheetah.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Cheetah/Preview Content\""; + DEVELOPMENT_TEAM = 5JL49Y835V; + ENABLE_HARDENED_RUNTIME = NO; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Cheetah/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "Needed to transcribe audio"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.Cheetah; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 37AE7A8029A5A8B400C45FF6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = Cheetah/Cheetah.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Cheetah/Preview Content\""; + DEVELOPMENT_TEAM = 5JL49Y835V; + ENABLE_HARDENED_RUNTIME = NO; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Cheetah/Info.plist; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMicrophoneUsageDescription = "Needed to transcribe audio"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.Cheetah; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 37AE7A9829A5A9C200C45FF6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 5JL49Y835V; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_CFLAGS = ( + "-I/opt/homebrew/include/SDL2", + "-D_THREAD_SAFE", + "-DGGML_USE_ACCELERATE", + ); + OTHER_LDFLAGS = ( + "-L/opt/homebrew/lib", + "-lSDL2", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.LibWhisper; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 37AE7A9929A5A9C200C45FF6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 5JL49Y835V; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_CFLAGS = ( + "-I/opt/homebrew/include/SDL2", + "-D_THREAD_SAFE", + "-DGGML_USE_ACCELERATE", + ); + OTHER_LDFLAGS = ( + "-L/opt/homebrew/lib", + "-lSDL2", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.LibWhisper; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 37B4C26629BD7C1600E83465 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 5JL49Y835V; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.CheetahIPC; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 37B4C26729BD7C1600E83465 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = 5JL49Y835V; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = org.phrack.CheetahIPC; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 37951C7429BD7A7600C61AC5 /* Build configuration list for PBXNativeTarget "ExtensionHelper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 37951C7529BD7A7600C61AC5 /* Debug */, + 37951C7629BD7A7600C61AC5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 37AE7A6A29A5A8B300C45FF6 /* Build configuration list for PBXProject "Cheetah" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 37AE7A7C29A5A8B400C45FF6 /* Debug */, + 37AE7A7D29A5A8B400C45FF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 37AE7A7E29A5A8B400C45FF6 /* Build configuration list for PBXNativeTarget "Cheetah" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 37AE7A7F29A5A8B400C45FF6 /* Debug */, + 37AE7A8029A5A8B400C45FF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 37AE7A9729A5A9C200C45FF6 /* Build configuration list for PBXNativeTarget "LibWhisper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 37AE7A9829A5A9C200C45FF6 /* Debug */, + 37AE7A9929A5A9C200C45FF6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 37B4C26829BD7C1600E83465 /* Build configuration list for PBXNativeTarget "CheetahIPC" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 37B4C26629BD7C1600E83465 /* Debug */, + 37B4C26729BD7C1600E83465 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 37AE7A6729A5A8B300C45FF6 /* Project object */; +} diff --git a/Cheetah.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Cheetah.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Cheetah.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Cheetah.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Cheetah.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Cheetah.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Cheetah.xcodeproj/xcshareddata/xcschemes/Cheetah.xcscheme b/Cheetah.xcodeproj/xcshareddata/xcschemes/Cheetah.xcscheme new file mode 100644 index 0000000..5713ce6 --- /dev/null +++ b/Cheetah.xcodeproj/xcshareddata/xcschemes/Cheetah.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cheetah/Assets.xcassets/AccentColor.colorset/Contents.json b/Cheetah/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Cheetah/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Cheetah/Assets.xcassets/AppIcon.appiconset/Contents.json b/Cheetah/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..3f00db4 --- /dev/null +++ b/Cheetah/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Cheetah/Assets.xcassets/Contents.json b/Cheetah/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Cheetah/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Cheetah/BrowserExtension.swift b/Cheetah/BrowserExtension.swift new file mode 100644 index 0000000..d5b5496 --- /dev/null +++ b/Cheetah/BrowserExtension.swift @@ -0,0 +1,101 @@ +import CheetahIPC + +class BrowserExtensionState: JSONHandler { + @Published var mode: String? + @Published var files = [String: String]() + @Published var logs = [String: String]() + + var navigationStart = 0 + var lastUpdate: Date? + + public init() { + super.init(respondsTo: IPCMessage.browserExtensionMessage) + + handler = { + guard let message = $0 else { + return nil + } + + if message.navigationStart > self.navigationStart { + self.navigationStart = message.navigationStart + self.files.removeAll() + self.logs.removeAll() + } + + let newMode = message.mode + if newMode != self.mode { + self.mode = newMode + self.files.removeAll() + self.logs.removeAll() + } + + for (name, content) in message.files { + self.files[name] = content + } + for (name, content) in message.logs { + self.logs[name] = content + } + + if self.lastUpdate == nil { + print("BrowserExtensionState: first message was received!") + } + + self.lastUpdate = Date.now + return nil + } + } + + var codeDescription: String { + if files.isEmpty { + return "N/A" + } else { + return files + .map { name, content in "[\(name)]\n\(content)" } + .joined(separator: "\n\n") + } + } + + var logsDescription: String { + if logs.isEmpty { + return "N/A" + } else { + return logs + .map { name, content in + let recentLines = content.split(separator: "\n").suffix(20).joined(separator: "\n") + return "[\(name)]\n\(recentLines)" + } + .joined(separator: "\n\n") + } + } +} + +struct NativeMessagingManifest: Codable { + enum `Type`: String, Codable { + case stdio + } + + let name: String + let description: String + let path: String + let type: `Type` + let allowedExtensions: [String] +} + +func installNativeMessagingManifest() throws -> Bool { + let manifest = NativeMessagingManifest( + name: "cheetah", + description: "Cheetah Extension", + path: Bundle.main.path(forAuxiliaryExecutable: "ExtensionHelper")!, + type: .stdio, + allowedExtensions: ["cheetah@phrack.org"]) + + let path = FileManager.default.homeDirectoryForCurrentUser.appending(path: "Library/Application Support/Mozilla/NativeMessagingHosts/cheetah.json").absoluteURL.path + + print("Installing native messaging manifest at \(path)") + + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + + let contents = try encoder.encode(manifest) + return FileManager.default.createFile(atPath: path, contents: contents) +} diff --git a/Cheetah/Cheetah.entitlements b/Cheetah/Cheetah.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Cheetah/Cheetah.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Cheetah/CheetahApp.swift b/Cheetah/CheetahApp.swift new file mode 100644 index 0000000..ad874c1 --- /dev/null +++ b/Cheetah/CheetahApp.swift @@ -0,0 +1,139 @@ +import SwiftUI +import Combine +import LibWhisper +import CheetahIPC + +enum AnswerRequest { + case none + case answerQuestion + case refineAnswer(selection: Range?) + case analyzeCode +} + +let defaultWhisperModel = "ggml-medium.en" + +class AppViewModel: ObservableObject { + @AppStorage("authToken") var authToken: String? + @AppStorage("useGPT4") var useGPT4: Bool? + + @Published var devices = [CaptureDevice]() + @Published var selectedDevice: CaptureDevice? + + @Published var whisperModel = defaultWhisperModel + @Published var downloadState = ModelDownloader.State.pending + + @Published var analyzer: ConversationAnalyzer? + @Published var answerRequest = AnswerRequest.none + + @Published var transcript: String? + @Published var answer: String? + @Published var codeAnswer: String? + + @Published var buttonsAlwaysEnabled = false +} + +@main +struct CheetahApp: App { + @AppStorage("whisperModel") var preferredWhisperModel: String? + + @ObservedObject var viewModel = AppViewModel() + + @State var download: ModelDownloader? + @State var stream: WhisperStream? + @State var ipcServer: IPCServer? + + var extensionState = BrowserExtensionState() + + func start() async { + viewModel.devices = try! CaptureDevice.devices + + let downloadConfig = URLSessionConfiguration.default + downloadConfig.allowsExpensiveNetworkAccess = false + downloadConfig.waitsForConnectivity = true + + viewModel.whisperModel = preferredWhisperModel ?? defaultWhisperModel + let download = ModelDownloader(modelName: viewModel.whisperModel, configuration: downloadConfig) + download.$state.assign(to: &viewModel.$downloadState) + download.resume() + self.download = download + + // Handle messages from ExtensionHelper + let server = IPCServer() + server.delegate = extensionState + server.addSourceForNewLocalMessagePort(name: MessagePortName.browserExtensionServer.rawValue, + toRunLoop: RunLoop.main.getCFRunLoop()) + self.ipcServer = server + + // Install manifest needed for the browser extension to talk to ExtensionHelper + _ = try? installNativeMessagingManifest() + + do { + for try await request in viewModel.$answerRequest.receive(on: RunLoop.main).values { + if let analyzer = viewModel.analyzer { + switch request { + case .answerQuestion: + try await analyzer.answer() + viewModel.answer = analyzer.context[.answer] + viewModel.codeAnswer = analyzer.context[.codeAnswer] + viewModel.answerRequest = .none + + case .refineAnswer(let selection): + try await analyzer.answer(refine: true, selection: selection) + viewModel.answer = analyzer.context[.answer] + viewModel.codeAnswer = analyzer.context[.codeAnswer] + viewModel.answerRequest = .none + + case .analyzeCode: + try await analyzer.analyzeCode(extensionState: extensionState) + viewModel.answer = analyzer.context[.answer] + viewModel.answerRequest = .none + + case .none: + break + } + } + } + } catch { + viewModel.answerRequest = .none + //TODO: handle error + } + } + + var body: some Scene { + WindowGroup { + ContentView(viewModel: viewModel) + .task { + await start() + } + .onChange(of: viewModel.selectedDevice) { + setCaptureDevice($0) + } + } + .windowResizability(.contentSize) + .windowStyle(.hiddenTitleBar) + } + + func setCaptureDevice(_ device: CaptureDevice?) { + stream?.cancel() + + guard let device = device, + let authToken = viewModel.authToken, + let modelURL = download?.modelURL else { + return + } + + let stream = WhisperStream(model: modelURL, device: device) + stream.start() + self.stream = stream + + stream.$segments + .receive(on: RunLoop.main) + .map { String($0.text) } + .assign(to: &viewModel.$transcript) + + viewModel.analyzer = ConversationAnalyzer( + stream: stream, + generator: PromptGenerator(), + executor: .init(authToken: authToken, useGPT4: viewModel.useGPT4 ?? false)) + } +} diff --git a/Cheetah/ConversationAnalyzer.swift b/Cheetah/ConversationAnalyzer.swift new file mode 100644 index 0000000..ee3745f --- /dev/null +++ b/Cheetah/ConversationAnalyzer.swift @@ -0,0 +1,162 @@ +import LibWhisper +import Combine + +enum ContextKey: String { + case transcript + case question + case answerInCode + case answer + case previousAnswer + case highlightedAnswer + case codeAnswer + case browserCode + case browserLogs +} + +typealias AnalysisContext = [ContextKey: String] + +extension AnalysisContext { + var answerInCode: Bool { + return self[.answerInCode]?.first?.lowercased() == "y" + } +} + +enum AnalysisError: Error { + case missingRequiredContextKey(ContextKey) +} + +extension PromptGenerator { + func extractQuestion(context: AnalysisContext) throws -> ModelInput? { + if let transcript = context[.transcript] { + return extractQuestion(transcript: transcript) + } else { + throw AnalysisError.missingRequiredContextKey(.transcript) + } + } + + func answerQuestion(context: AnalysisContext) throws -> ModelInput? { + guard let question = context[.question] else { + throw AnalysisError.missingRequiredContextKey(.question) + } + if context.answerInCode { + return nil + } else if let answer = context[.previousAnswer] { + return answerQuestion(question, previousAnswer: answer) + } else if let answer = context[.highlightedAnswer] { + return answerQuestion(question, highlightedAnswer: answer) + } else { + return answerQuestion(question) + } + } + + func writeCode(context: AnalysisContext) -> ModelInput? { + if context.answerInCode, let question = context[.question] { + return writeCode(task: question) + } else { + return nil + } + } + + func analyzeBrowserCode(context: AnalysisContext) -> ModelInput? { + if let code = context[.browserCode], let logs = context[.browserLogs] { + return analyzeBrowserCode(code, logs: logs, task: context[.question]) + } else { + return nil + } + } +} + +extension ContextKey { + var `set`: (String, inout AnalysisContext) -> () { + return { output, context in + context[self] = output + } + } + + func extract(using regexArray: Regex<(Substring, answer: Substring)>...) -> (String, inout AnalysisContext) -> () { + return { output, context in + for regex in regexArray { + if let match = output.firstMatch(of: regex) { + context[self] = String(match.answer) + } + } + } + } +} + +let extractQuestion: (String, inout AnalysisContext) -> () = { output, context in + let regex = /Extracted question: (?[^\n]+)(?:\nAnswer in code: (?Yes|No))?/.ignoresCase() + if let match = output.firstMatch(of: regex) { + context[.question] = String(match.question) + if let answerInCode = match.answerInCode { + context[.answerInCode] = String(answerInCode) + } + } +} + +let finalAnswerRegex = /Final answer:\n(?[-•].+$)/.dotMatchesNewlines() +let answerOnlyRegex = /(?[-•].+$)/.dotMatchesNewlines() + +class ConversationAnalyzer { + let stream: WhisperStream + let generator: PromptGenerator + let executor: OpenAIExecutor + + init(stream: WhisperStream, generator: PromptGenerator, executor: OpenAIExecutor) { + self.stream = stream + self.generator = generator + self.executor = executor + } + + var context = [ContextKey: String]() + + func answer(refine: Bool = false, selection: Range? = nil) async throws { + let chain = PromptChain( + generator: generator.extractQuestion, + updateContext: extractQuestion, + maxTokens: 250, + children: [ + Prompt(generator: generator.answerQuestion, + updateContext: ContextKey.answer.extract(using: finalAnswerRegex, answerOnlyRegex), + maxTokens: 500), + Prompt(generator: generator.writeCode, + updateContext: ContextKey.codeAnswer.set, + maxTokens: 1000), + ]) + + var newContext: AnalysisContext = [ + .transcript: String(stream.segments.text) + ] + + if refine, let previousAnswer = context[.answer] { + if let selection = selection { + let highlightedAnswer = previousAnswer[.. + + + + diff --git a/Cheetah/ModelDownloader.swift b/Cheetah/ModelDownloader.swift new file mode 100644 index 0000000..65a48a4 --- /dev/null +++ b/Cheetah/ModelDownloader.swift @@ -0,0 +1,71 @@ +import Foundation + +extension Bundle { + var displayName: String? { + return object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String + } +} + +var cacheDirectory: URL { + let parent = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0] + return parent.appending(path: Bundle.main.bundleIdentifier!) +} + +class ModelDownloader { + enum State { + case pending + case completed + case failed(Error?) + } + + @Published var state = State.pending + + let baseURL = URL(string: "https://huggingface.co/datasets/ggerganov/whisper.cpp/resolve/main")! + + let modelName: String + let session: URLSession + let filename: String + let modelURL: URL + + var task: URLSessionDownloadTask? + + init(modelName: String, configuration: URLSessionConfiguration = .default) { + self.modelName = modelName + session = URLSession(configuration: configuration) + filename = "\(modelName).bin" + modelURL = cacheDirectory.appending(path: filename) + } + + func resume() { + if !FileManager.default.fileExists(atPath: cacheDirectory.absoluteURL.path) { + try! FileManager.default.createDirectory(at: cacheDirectory, withIntermediateDirectories: false) + } + + let destination = modelURL.absoluteURL + if FileManager.default.fileExists(atPath: destination.path) { + state = .completed + return + } + + let request = URLRequest(url: baseURL.appending(path: filename)) + + let task = session.downloadTask(with: request) { [weak self] location, response, error in + if let error = error { + self?.state = .failed(error) + return + } + if let location = location { + do { + try FileManager.default.moveItem(at: location, to: destination) + self?.state = .completed + } catch { + self?.state = .failed(error) + } + } else { + self?.state = .failed(nil) + } + } + task.resume() + self.task = task + } +} diff --git a/Cheetah/OpenAIExecutor.swift b/Cheetah/OpenAIExecutor.swift new file mode 100644 index 0000000..81557b8 --- /dev/null +++ b/Cheetah/OpenAIExecutor.swift @@ -0,0 +1,158 @@ +import Foundation + +enum ModelInput { + case prompt(String, model: OpenAIModelType.GPT3 = .davinci) + case messages([ChatMessage], model: OpenAIModelType.Chat = .gpt4) + case chatPrompt(system: String, user: String, model: OpenAIModelType.Chat = .gpt4) +} + +class PromptChain { + let generator: (Context) throws -> ModelInput? + let updateContext: (String, inout Context) throws -> () + let maxTokens: Int + let children: [PromptChain]? + + init(generator: @escaping (Context) throws -> ModelInput?, + updateContext: @escaping (String, inout Context) throws -> (), + maxTokens: Int = 16, + children: [PromptChain]? = nil + ) { + self.generator = generator + self.updateContext = updateContext + self.maxTokens = maxTokens + self.children = children + } +} + +typealias Prompt = PromptChain + +extension UserDefaults { + @objc var logPrompts: Bool { + get { + bool(forKey: "logPrompts") + } + set { + set(newValue, forKey: "logPrompts") + } + } + + @objc var logCompletions: Bool { + get { + bool(forKey: "logCompletions") + } + set { + set(newValue, forKey: "logCompletions") + } + } +} + +class OpenAIExecutor { + let openAI: OpenAISwift + let useGPT4: Bool + + init(openAI: OpenAISwift, useGPT4: Bool) { + self.openAI = openAI + self.useGPT4 = useGPT4 + } + + convenience init(authToken: String, useGPT4: Bool) { + self.init(openAI: .init(authToken: authToken), useGPT4: useGPT4) + } + + func log(prompt: String) { + if UserDefaults.standard.logPrompts { + print("Prompt:\n", prompt) + } + } + + func log(completion: String) { + if UserDefaults.standard.logCompletions { + print("Completion:\n", completion) + } + } + + func execute(prompt: String, model: OpenAIModelType, maxTokens: Int = 100) async throws -> String? { + log(prompt: prompt) + let result = try await openAI.sendCompletion(with: prompt, model: model, maxTokens: maxTokens) + let text = result.choices?.first?.text + if let text = text { + log(completion: text) + } + return text + } + + func execute(messages: [ChatMessage], model: OpenAIModelType, maxTokens: Int = 100) async throws -> String? { + log(prompt: messages.debugDescription) + let result = try await openAI.sendChat(with: messages, model: model, maxTokens: maxTokens) + let content = result.choices?.first?.message.content + if let content = content { + log(completion: content) + } + return content + } + + func adjustModel(_ model: OpenAIModelType.Chat) -> OpenAIModelType.Chat { + if !useGPT4 && model == .gpt4 { + return .chatgpt + } else { + return model + } + } + + func execute(chain: PromptChain<[K: String]>, context initialContext: [K: String]) async throws -> [K: String] { + var context = initialContext + + guard let input = try chain.generator(context) else { + return context + } + + let output: String? + switch input { + case .prompt(let prompt, let model): + output = try await execute(prompt: prompt, model: .gpt3(model), maxTokens: chain.maxTokens) + + case .messages(let messages, let model): + output = try await execute(messages: messages, model: .chat(adjustModel(model)), maxTokens: chain.maxTokens) + + case .chatPrompt(system: let systemMessage, user: let userMessage, model: let model): + let messages = [ + ChatMessage(role: .system, content: systemMessage), + ChatMessage(role: .user, content: userMessage), + ] + output = try await execute(messages: messages, model: .chat(adjustModel(model)), maxTokens: chain.maxTokens) + } + + guard let output = output else { + return context + } + + try chain.updateContext(String(output.trimmingCharacters(in: .whitespacesAndNewlines)), &context) + + let childContext = context + + if let children = chain.children { + let childOutputs = try await withThrowingTaskGroup( + of: [K: String?].self, + returning: [K: String?].self + ) { group in + for child in children { + group.addTask { + return try await self.execute(chain: child, context: childContext) + } + } + + return try await group.reduce(into: [:]) { + for (key, output) in $1 { + $0[key] = output + } + } + } + + for (key, output) in childOutputs { + context[key] = output + } + } + + return context + } +} diff --git a/Cheetah/Preview Content/Preview Assets.xcassets/Contents.json b/Cheetah/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Cheetah/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Cheetah/PromptGenerator.swift b/Cheetah/PromptGenerator.swift new file mode 100644 index 0000000..f227cb8 --- /dev/null +++ b/Cheetah/PromptGenerator.swift @@ -0,0 +1,162 @@ +import Foundation + +let shorthandInstruction = """ +Use bullet points and write in shorthand. For example, "O(n log n) due to sorting" is preferred to "The time complexity of the implementation is O(n log n) due to the sorting." +""" + +class PromptGenerator { + var domain = "software engineering" + + var systemMessage: String { + return "You are a \(domain) expert." + } + + func extractQuestion(transcript: String) -> ModelInput { + let prompt = """ +Extract the last problem or question posed by the interviewer during a \(domain) interview. State it as an instruction. If the question is about something the candidate did, restate it in a general way. + +[transcript begins] +If you want to improve the query performance of multiple columns or a group of columns in a given table. Cool. And is it considered a cluster index or no cluster index? definitely be a non-clustered index. For sure. All right, great. So next question. What's the difference between "where" and "having"? Oh, that's an interesting one. +[transcript ends] +Is context needed here: Yes +Context: queries, databases, performance +Extracted question: Describe the difference between "where" and "having" clauses in SQL, focusing on performance. +Answer in code: No + +[transcript begins] +Are you familiar with the traceroute command? Yes I am. Okay, so how does that work behind the scenes? +[transcript ends] +Is context needed here: No +Extracted question: How does the traceroute command work? +Answer in code: No + +[transcript begins] +Write a function that takes 3 arguments. The first argument is a list of numbers that is guaranteed to be sorted. The remaining two arguments, a and b, are the coefficients of the function f(x) = a*x + b. Your function should compute f(x) for every number in the first argument, and return a list of those values, also sorted. +[transcript ends] +Is context needed here: Yes +Context: C++ +Extracted question: C++ function that takes a vector of sorted numbers; and coefficients (a, b) of the function f(x) = a*x + b. It should compute f(x) for each input number, and return a sorted vector. +Answer in code: Yes + +[transcript begins] +\(transcript) +[transcript ends] +Is context needed here: +""" + + return .chatPrompt(system: systemMessage, user: prompt, model: .chatgpt) + } + + func answerQuestion(_ question: String) -> ModelInput { + let prompt = """ +You are a \(domain) expert. \(shorthandInstruction) + +Example 1: +Question: Should I use "where" or "having" to find employee first names that appear more than 250 times? +Are follow up questions needed here: Yes +Follow up: Will this query use aggregation? +Intermediate answer: Yes, count(first_name) +Follow up: Does "where" or "having" filter rows after aggregation? +Intermediate answer: having +Final answer: +• Where: filters rows before aggregation +• Having: filters rows after aggregation +• Example SQL: having count(first_name) > 250 + +Example 2: +Question: How does the traceroute command work? +Are follow up questions needed here: No +Final answer: +• Traces the path an IP packet takes across networks +• Starting from 1, increments the TTL field in the IP header +• The returned ICMP Time Exceeded packets are used to build a list of routers + +Question: \(question) +""" + + return .chatPrompt(system: systemMessage, user: prompt) + } + + func answerQuestion(_ question: String, previousAnswer: String) -> ModelInput { + let prompt = """ +You are a \(domain) expert. Refine the partial answer. \(shorthandInstruction) + +Example 1: +Question: Should I use "where" or "having" to find employee first names that appear more than 250 times? +Partial answer: +• Having: filters rows after aggregation +Are follow up questions needed here: Yes +Follow up: Will this query use aggregation? +Intermediate answer: Yes, count(first_name) +Follow up: Does "where" or "having" filter rows after aggregation? +Intermediate answer: having +Final answer: +• Where: filters rows before aggregation +• Having: filters rows after aggregation +• Example SQL: having count(first_name) > 250 + +Example 2: +Question: How does the traceroute command work? +Partial answer: +• Traces the path an IP packet takes across networks +• Starting from 1, increments the TTL field in the IP header +Are follow up questions needed here: No +Final answer: +• Traces the path an IP packet takes across networks +• Starting from 1, increments the TTL field in the IP header +• The returned ICMP Time Exceeded packets are used to build a list of routers + +Question: \(question) +Partial answer: +\(previousAnswer) +""" + + return .chatPrompt(system: systemMessage, user: prompt) + } + + func answerQuestion(_ question: String, highlightedAnswer: String) -> ModelInput { + let prompt = """ +Question: \(question) + +You previously provided this answer, and I have highlighted part of it: +\(highlightedAnswer) + +Explain the highlighted part of your previous answer in much greater depth. \(shorthandInstruction) +""" + + return .chatPrompt(system: systemMessage, user: prompt) + } + + func writeCode(task: String) -> ModelInput { + let prompt = """ +Write pseudocode to accomplish this task: \(task) + +Start with a comment outlining opportunities for optimization and potential pitfalls. Assume only standard libraries are available, unless specified. Don't explain, just give me the code. +""" + + return .chatPrompt(system: systemMessage, user: prompt) + } + + func analyzeBrowserCode(_ code: String, logs: String, task: String? = nil) -> ModelInput { + let prefix: String + if let task = task { + prefix = "Prompt: \(task)" + } else { + prefix = "Briefly describe how an efficient solution can be achieved." + } + + let prompt = """ +\(prefix) + +Code: +\(code) + +Output: +\(logs) + +If the prompt is irrelevant, you may disregard it. You may suggest edits to the existing code. If appropriate, include a brief discussion of complexity. \(shorthandInstruction) +""" + + return .chatPrompt(system: systemMessage, user: prompt) + } +} diff --git a/Cheetah/Views/AuthTokenView.swift b/Cheetah/Views/AuthTokenView.swift new file mode 100644 index 0000000..3a9c595 --- /dev/null +++ b/Cheetah/Views/AuthTokenView.swift @@ -0,0 +1,39 @@ +import SwiftUI +import LibWhisper + +struct AuthTokenView: View { + @Binding var storedToken: String? + @Binding var useGPT4: Bool + + @State var tokenValue = "" + @State var toggleValue = true + + var body: some View { + VStack(spacing: 16) { + Link(destination: URL(string: "https://platform.openai.com/account/api-keys")!) { + Text("Click here to create an OpenAI API key") + } + TextField(text: $tokenValue) { + Text("Paste your API key here") + } + .privacySensitive() + .frame(width: 300) + Toggle("Use GPT-4 (access required)", isOn: $toggleValue) + Button("Save") { + storedToken = tokenValue + useGPT4 = toggleValue + } + .disabled(tokenValue.isEmpty) + } + .padding() + .fixedSize() + } +} + +struct APIKeyView_Previews: PreviewProvider { + static var previews: some View { + return AuthTokenView( + storedToken: Binding.constant(nil), + useGPT4: Binding.constant(false)) + } +} diff --git a/Cheetah/Views/CoachView.swift b/Cheetah/Views/CoachView.swift new file mode 100644 index 0000000..59751c1 --- /dev/null +++ b/Cheetah/Views/CoachView.swift @@ -0,0 +1,86 @@ +import SwiftUI +import LibWhisper + +struct CoachView: View { + @ObservedObject var viewModel: AppViewModel + + @State var answer: String + @State var answerSelection = NSRange() + + init(viewModel: AppViewModel) { + self.viewModel = viewModel + self.answer = viewModel.answer ?? "" + } + + var spinner: some View { + ProgressView().scaleEffect(0.5) + } + + @ViewBuilder + var body: some View { + Picker("Audio input device", selection: $viewModel.selectedDevice) { + Text("-").tag(nil as CaptureDevice?) + ForEach(viewModel.devices, id: \.self) { + Text($0.name).tag($0 as CaptureDevice?) + } + } + .labelsHidden() + .pickerStyle(.menu) + ZStack { + HStack(spacing: 10) { + Button(action: { + viewModel.answerRequest = .answerQuestion + }, label: { + Text("Answer") + }) + Button(action: { + viewModel.answerRequest = .refineAnswer(selection: Range(answerSelection, in: answer)) + }, label: { + Text("Refine") + }) + Button(action: { + viewModel.answerRequest = .analyzeCode + }, label: { + Text("Analyze") + }) + } + .disabled((viewModel.authToken == nil || viewModel.analyzer == nil) && !viewModel.buttonsAlwaysEnabled) + HStack { + Spacer() + switch viewModel.answerRequest { + case .none: + spinner.hidden() + default: + spinner + } + } + } + HStack { + VStack(alignment: .leading, spacing: 20) { + if let transcript = viewModel.transcript { + Text(transcript) + .lineLimit(1) + .truncationMode(.head) + .font(.footnote.italic()) + } + ScrollView { + NSTextFieldWrapper(text: $answer, selectedRange: $answerSelection) + .onChange(of: viewModel.answer) { + if let newAnswer = $0 { + self.answer = newAnswer + } + } + } + .frame(maxHeight: 600) + if let solution = viewModel.codeAnswer { + Text(solution) + .textSelection(.enabled) + .font(.footnote) + .monospaced() + } + Spacer() + } + Spacer() + } + } +} diff --git a/Cheetah/Views/ContentView.swift b/Cheetah/Views/ContentView.swift new file mode 100644 index 0000000..e44b12d --- /dev/null +++ b/Cheetah/Views/ContentView.swift @@ -0,0 +1,68 @@ +import SwiftUI +import LibWhisper + +struct ContentView: View { + @ObservedObject var viewModel: AppViewModel + + @ViewBuilder + var body: some View { + if viewModel.authToken != nil { + VStack(spacing: 16) { + switch viewModel.downloadState { + case .pending: + Text("Downloading \(viewModel.whisperModel)...") + + case .failed(let error): + if let error = error { + Text("Failed to download model. \(error.localizedDescription)") + } else { + Text("Failed to download model. An unknown error occurred.") + } + + case .completed: + CoachView(viewModel: viewModel) + } + } + .padding() + .frame(minWidth: 300, minHeight: 350) + } else { + AuthTokenView(storedToken: viewModel.$authToken, + useGPT4: viewModel.$useGPT4.nonEmpty) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + let viewModel = AppViewModel() + viewModel.devices = [CaptureDevice(id: 0, name: "Audio Loopback Device")] + viewModel.buttonsAlwaysEnabled = true + viewModel.authToken = "" + viewModel.downloadState = .completed + viewModel.transcript = "So how would we break this app down into components?" + viewModel.answer = """ +• Header Component: Contains two sub-components: Logo and Title. +Props: logoUrl, title + +• Content Component: Contains an image and a paragraph. +Props: imageUrl, message + +• Footer Component: Simple component that displays a message. +Props: message + +• App Component: Renders the Header, Content, and Footer components +""" + return ContentView(viewModel: viewModel) + .previewLayout(.fixed(width: 300, height: 500)) + .previewDisplayName("Cheetah") + } +} + +extension Binding where Value == Bool? { + var nonEmpty: Binding { + Binding( + get: { self.wrappedValue ?? false }, + set: { self.wrappedValue = $0 } + ) + } +} diff --git a/Cheetah/Views/NSTextFieldWrapper.swift b/Cheetah/Views/NSTextFieldWrapper.swift new file mode 100644 index 0000000..edcc710 --- /dev/null +++ b/Cheetah/Views/NSTextFieldWrapper.swift @@ -0,0 +1,53 @@ +import SwiftUI +import AppKit + +class CustomNSTextField: RSHeightHuggingTextField { + var onSelectedRangesChanged: ((NSRange?) -> Void)? + + @objc func textViewDidChangeSelection(_ notification: NSNotification) { + onSelectedRangesChanged?(currentEditor()?.selectedRange) + } +} + +struct NSTextFieldWrapper: NSViewRepresentable { + @Binding var text: String + @Binding var selectedRange: NSRange + + func makeCoordinator() -> Coordinator { + Coordinator(self) + } + + func makeNSView(context: Context) -> CustomNSTextField { + let textField = CustomNSTextField(frame: NSRect()) + textField.isBezeled = false + textField.isEditable = false + textField.isSelectable = true + textField.drawsBackground = false + textField.delegate = context.coordinator + textField.onSelectedRangesChanged = { range in + if let range = range { + DispatchQueue.main.async { + self.selectedRange = range + } + } + } + return textField + } + + func updateNSView(_ nsView: CustomNSTextField, context: Context) { + nsView.stringValue = text + } + + class Coordinator: NSObject, NSTextFieldDelegate { + var parent: NSTextFieldWrapper + + init(_ textField: NSTextFieldWrapper) { + self.parent = textField + } + + func controlTextDidChange(_ obj: Notification) { + guard let textField = obj.object as? NSTextField else { return } + self.parent.text = textField.stringValue + } + } +} diff --git a/Cheetah/Views/RSDimensionHuggingTextField.swift b/Cheetah/Views/RSDimensionHuggingTextField.swift new file mode 100644 index 0000000..26fe07e --- /dev/null +++ b/Cheetah/Views/RSDimensionHuggingTextField.swift @@ -0,0 +1,106 @@ +// +// RSDimensionHuggingTextField.swift +// RSUIKit +// +// Created by Daniel Jalkut on 6/13/18. +// Copyright © 2018 Red Sweater. All rights reserved. +// + +import Cocoa + +// You probably want to use one of RSHeightHuggingTextField or RSWidthHuggingTextField, below + +open class RSDimensionHuggingTextField: NSTextField { + + public enum Dimension { + case vertical + case horizontal + } + + var huggedDimension: Dimension + + init(frame frameRect: NSRect, huggedDimension: Dimension) { + self.huggedDimension = huggedDimension + super.init(frame: frameRect) + } + + // For subclasses to pass in the dimension setting + public init?(coder: NSCoder, huggedDimension: Dimension) { + self.huggedDimension = huggedDimension + super.init(coder: coder) + } + + public required init?(coder: NSCoder) { + // We don't yet support dimension being coded, just default to vertical + self.huggedDimension = .vertical + super.init(coder: coder) + } + + open override var intrinsicContentSize: NSSize { + get { + guard let textCell = self.cell else { + return super.intrinsicContentSize + } + + // Set up the bounds to induce unlimited sizing in the desired dimension + var cellSizeBounds = self.bounds + switch self.huggedDimension { + case .vertical: cellSizeBounds.size.height = CGFloat(Float.greatestFiniteMagnitude) + case .horizontal: cellSizeBounds.size.width = CGFloat(Float.greatestFiniteMagnitude) + } + + // Do the actual sizing + let nativeCellSize = textCell.cellSize(forBounds: cellSizeBounds) + + // Return an intrinsic size that imposes calculated (hugged) dimensional size + var intrinsicSize = NSSize(width: NSView.noIntrinsicMetric, height: NSView.noIntrinsicMetric) + switch self.huggedDimension { + case .vertical: + intrinsicSize.height = nativeCellSize.height + case .horizontal: + intrinsicSize.width = nativeCellSize.width + } + return intrinsicSize + } + } + + open override func textDidChange(_ notification: Notification) { + super.textDidChange(notification) + self.invalidateIntrinsicContentSize() + + // It seems important to set the string from the cell on ourself to + // get the change to be respected by the cell and to get the cellSize + // computation to update! + if let changedCell = self.cell { + self.stringValue = changedCell.stringValue + } + } +} + +open class RSHeightHuggingTextField: RSDimensionHuggingTextField { + @objc init(frame frameRect: NSRect) { + super.init(frame: frameRect, huggedDimension: .vertical) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder, huggedDimension: .vertical) + } + + public override init(frame frameRect: NSRect, huggedDimension: Dimension = .vertical) { + super.init(frame: frameRect, huggedDimension: huggedDimension) + } +} + +open class RSWidthHuggingTextField: RSDimensionHuggingTextField { + @objc init(frame frameRect: NSRect) { + super.init(frame: frameRect, huggedDimension: .horizontal) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder, huggedDimension: .horizontal) + } + + public override init(frame frameRect: NSRect, huggedDimension: Dimension = .horizontal) { + super.init(frame: frameRect, huggedDimension: huggedDimension) + } +} diff --git a/CheetahIPC/CheetahIPC.h b/CheetahIPC/CheetahIPC.h new file mode 100644 index 0000000..902a2e7 --- /dev/null +++ b/CheetahIPC/CheetahIPC.h @@ -0,0 +1,10 @@ +#import + +//! Project version number for CheetahIPC. +FOUNDATION_EXPORT double CheetahIPCVersionNumber; + +//! Project version string for CheetahIPC. +FOUNDATION_EXPORT const unsigned char CheetahIPCVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + diff --git a/CheetahIPC/Client.swift b/CheetahIPC/Client.swift new file mode 100644 index 0000000..61a60ed --- /dev/null +++ b/CheetahIPC/Client.swift @@ -0,0 +1,67 @@ +import CoreFoundation +import UserNotifications + +public enum IPCClientError: Error { + case createRemoteFailure + case sendRequestFailure(Int32) +} + +public class IPCClient { + let remote: CFMessagePort + + public init(messagePortName: String) throws { + if let remote = CFMessagePortCreateRemote(nil, messagePortName as CFString) { + self.remote = remote + } else { + throw IPCClientError.createRemoteFailure + } + } + + public func sendRequest(msgid: Int32, data: Data) throws -> Data? { + var responseData: Unmanaged? = nil + + let result = CFMessagePortSendRequest( + remote, + msgid, + data as CFData, + 1.0, // sendTimeout + 1.0, // rcvTimeout + CFRunLoopMode.defaultMode.rawValue, + &responseData) + + if result == kCFMessagePortSuccess { + return responseData?.takeRetainedValue() as Data? + } else { + throw IPCClientError.sendRequestFailure(result) + } + } +} + +public extension IPCClient { + func encode(_ object: Encodable) throws -> Data { + return try PropertyListEncoder().encode(object) + } + + func encode(_ object: NSCoding) throws -> Data { + return try NSKeyedArchiver.archivedData(withRootObject: object, requiringSecureCoding: true) + } + + func decode(_ data: Data) throws -> T { + return try PropertyListDecoder().decode(T.self, from: data) + } + + func decode(_ data: Data) throws -> T? where T: NSObject, T: NSCoding { + return try NSKeyedUnarchiver.unarchivedObject(ofClass: T.self, from: data) + } + + func sendMessage(id: any RawRepresentable, withObject object: NSCoding) throws { + _ = try sendRequest(msgid: id.rawValue, data: encode(object)) + } + + func sendMessage(id: any RawRepresentable, withObject object: NSCoding) throws -> T? { + guard let resultData = try sendRequest(msgid: id.rawValue, data: encode(object)) else { + return nil + } + return try decode(resultData) + } +} diff --git a/CheetahIPC/Messages.swift b/CheetahIPC/Messages.swift new file mode 100644 index 0000000..8c3203a --- /dev/null +++ b/CheetahIPC/Messages.swift @@ -0,0 +1,17 @@ +import Foundation +import SwiftUI + +public enum MessagePortName: String { + case browserExtensionServer = "org.phrack.Cheetah.BrowserExtensionServer" +} + +public enum IPCMessage: Int32 { + case browserExtensionMessage = 1 +} + +public struct BrowserExtensionMessage: Codable { + public var mode: String + public var files = [String: String]() + public var logs = [String: String]() + public var navigationStart: Int +} diff --git a/CheetahIPC/Server.swift b/CheetahIPC/Server.swift new file mode 100644 index 0000000..d0fd606 --- /dev/null +++ b/CheetahIPC/Server.swift @@ -0,0 +1,95 @@ +import CoreFoundation + +func serverCallback(local: CFMessagePort?, msgid: Int32, data: CFData?, info: UnsafeMutableRawPointer?) -> Unmanaged? { + let server = Unmanaged.fromOpaque(info!).takeUnretainedValue() + let responseData = server.delegate?.handleMessageWithID(msgid, data: data! as Data) + if let responseData = responseData as? NSData, + let cfdata = CFDataCreate(nil, responseData.bytes, responseData.length) { + return Unmanaged.passRetained(cfdata) + } else { + return nil + } +} + +public protocol IPCServerDelegate: AnyObject { + func handleMessageWithID(_ msgid: Int32, data: Data) -> Data? +} + +open class NSCodingHandler: NSObject, IPCServerDelegate { + public typealias Handler = (RequestObject?) -> Encodable? + + public let messageID: Int32 + public var handler: Handler? + + public init(respondsTo id: any RawRepresentable, _ handler: Handler? = nil) { + self.messageID = id.rawValue + self.handler = handler + } + + public func handleMessageWithID(_ msgid: Int32, data: Data) -> Data? { + let object = NSKeyedUnarchiver.unarchiveObject(with: data) as? RequestObject + if let handler = handler, let result = handler(object) { + return try? NSKeyedArchiver.archivedData(withRootObject: result, requiringSecureCoding: false) + } else { + return nil + } + } +} + +open class JSONHandler: IPCServerDelegate { + public typealias Handler = (RequestObject?) -> Encodable? + + public let messageID: Int32 + public var handler: Handler? + + public init(respondsTo id: any RawRepresentable, _ handler: Handler? = nil) { + self.messageID = id.rawValue + self.handler = handler + } + + public func handleMessageWithID(_ msgid: Int32, data: Data) -> Data? { + let object = try? JSONDecoder().decode(RequestObject.self, from: data) + if let object = object, let handler = handler, let result = handler(object) { + return try? NSKeyedArchiver.archivedData(withRootObject: result, requiringSecureCoding: false) + } else { + return nil + } + } +} + +public class IPCServer: NSObject { + public weak var delegate: IPCServerDelegate? + + /// Create the local message port then register an input source for it + public func addSourceForNewLocalMessagePort(name: String, toRunLoop runLoop: CFRunLoop!) { + if let messagePort = createMessagePort(name: name) { + addSource(messagePort: messagePort, toRunLoop: runLoop) + } + } + + /// Create a local message port with the specified name + /// + /// Incoming messages will be routed to this object's handleMessageWithID(,data:) method. + func createMessagePort(name: String) -> CFMessagePort? { + var context = CFMessagePortContext( + version: 0, + info: Unmanaged.passUnretained(self).toOpaque(), + retain: nil, + release: nil, + copyDescription: nil) + var shouldFreeInfo: DarwinBoolean = false + + return CFMessagePortCreateLocal( + nil, + name as CFString, + serverCallback, + &context, + &shouldFreeInfo) + } + + /// Create an input source for the specified message port and add it to the specified run loop + func addSource(messagePort: CFMessagePort, toRunLoop runLoop: CFRunLoop) { + let source = CFMessagePortCreateRunLoopSource(nil, messagePort, 0) + CFRunLoopAddSource(runLoop, source, CFRunLoopMode.commonModes) + } +} diff --git a/ExtensionHelper/ExtensionHelper.entitlements b/ExtensionHelper/ExtensionHelper.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/ExtensionHelper/ExtensionHelper.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/ExtensionHelper/main.swift b/ExtensionHelper/main.swift new file mode 100644 index 0000000..9db0fa5 --- /dev/null +++ b/ExtensionHelper/main.swift @@ -0,0 +1,78 @@ +// ExtensionHelper is invoked by the browser extension and killed automatically +// when all tabs using the extension are closed. It relays incoming messages to +// the IPCServer running in the main app. + +import Cocoa +import CheetahIPC + +let client = try? IPCClient(messagePortName: MessagePortName.browserExtensionServer.rawValue) +guard let client = client else { + exit(1) +} + +let decoder = JSONDecoder() +decoder.keyDecodingStrategy = .convertFromSnakeCase + +let stdin = FileHandle.standardInput +_ = enableRawMode(fileHandle: stdin) + +func handleMessage() throws { + // Read length + guard let size = stdin.readData(ofLength: 4).value(ofType: UInt32.self, at: 0, convertEndian: true) else { + return + } + + // Read message + let data = stdin.readData(ofLength: Int(size)) + _ = try client.sendRequest(msgid: IPCMessage.browserExtensionMessage.rawValue, data: data) + + //TODO: send response (UInt32 length followed by JSON message) +} + +while true { + do { + try handleMessage() + } catch { + exit(1) + } +} + +// https://forums.swift.org/t/how-to-read-uint32-from-a-data/59431/11 +extension Data { + subscript(at offset: Int, convertEndian convertEndian: Bool = false) -> T? { + value(ofType: T.self, at: offset, convertEndian: convertEndian) + } + + func value(ofType: T.Type, at offset: Int, convertEndian: Bool = false) -> T? { + let right = offset &+ MemoryLayout.size + guard offset >= 0 && right > offset && right <= count else { + return nil + } + let bytes = self[offset ..< right] + if convertEndian { + return bytes.reversed().reduce(0) { T($0) << 8 + T($1) } + } else { + return bytes.reduce(0) { T($0) << 8 + T($1) } + } + } +} + +// see https://stackoverflow.com/a/24335355/669586 +func initStruct() -> S { + let struct_pointer = UnsafeMutablePointer.allocate(capacity: 1) + let struct_memory = struct_pointer.pointee + struct_pointer.deallocate() + return struct_memory +} + +func enableRawMode(fileHandle: FileHandle) -> termios { + var raw: termios = initStruct() + tcgetattr(fileHandle.fileDescriptor, &raw) + + let original = raw + + raw.c_lflag &= ~(UInt(ECHO | ICANON)) + tcsetattr(fileHandle.fileDescriptor, TCSAFLUSH, &raw); + + return original +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..670154e --- /dev/null +++ b/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + diff --git a/LibWhisper/CaptureDevice.swift b/LibWhisper/CaptureDevice.swift new file mode 100644 index 0000000..be1aebf --- /dev/null +++ b/LibWhisper/CaptureDevice.swift @@ -0,0 +1,43 @@ +public enum CaptureDeviceError: Error { + case sdlErrorCode(Int32) +} + +public struct CaptureDevice { + public let id: Int32 + public let name: String + + public init(id: Int32, name: String) { + self.id = id + self.name = name + } + + public static var devices: [CaptureDevice] { + get throws { + var devices = [CaptureDevice]() + + let result = SDL_Init(SDL_INIT_AUDIO) + if result < 0 { + throw CaptureDeviceError.sdlErrorCode(result) + } + + for i in 0.. Bool { + return lhs.id == rhs.id + } +} + +extension CaptureDevice: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } +} diff --git a/LibWhisper/LibWhisper.h b/LibWhisper/LibWhisper.h new file mode 100644 index 0000000..aca5c2e --- /dev/null +++ b/LibWhisper/LibWhisper.h @@ -0,0 +1,15 @@ +#import + +//! Project version number for LibWhisper. +FOUNDATION_EXPORT double LibWhisperVersionNumber; + +//! Project version string for LibWhisper. +FOUNDATION_EXPORT const unsigned char LibWhisperVersionString[]; + +// SDL functions used in CaptureDevice +#define SDL_INIT_AUDIO 0x00000010u +extern int SDL_Init(uint32_t flags); +extern int SDL_GetNumAudioDevices(int iscapture); +extern const char * SDL_GetAudioDeviceName(int index, int iscapture); + +#import "stream.h" diff --git a/LibWhisper/SDL.h b/LibWhisper/SDL.h new file mode 100644 index 0000000..9ba8f68 --- /dev/null +++ b/LibWhisper/SDL.h @@ -0,0 +1,233 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +/** + * \file SDL.h + * + * Main include header for the SDL library + */ + + +#ifndef SDL_h_ +#define SDL_h_ + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_assert.h" +#include "SDL_atomic.h" +#include "SDL_audio.h" +#include "SDL_clipboard.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_filesystem.h" +#include "SDL_gamecontroller.h" +#include "SDL_guid.h" +#include "SDL_haptic.h" +#include "SDL_hidapi.h" +#include "SDL_hints.h" +#include "SDL_joystick.h" +#include "SDL_loadso.h" +#include "SDL_log.h" +#include "SDL_messagebox.h" +#include "SDL_metal.h" +#include "SDL_mutex.h" +#include "SDL_power.h" +#include "SDL_render.h" +#include "SDL_rwops.h" +#include "SDL_sensor.h" +#include "SDL_shape.h" +#include "SDL_system.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_version.h" +#include "SDL_video.h" +#include "SDL_locale.h" +#include "SDL_misc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* As of version 0.5, SDL is loaded dynamically into the application */ + +/** + * \name SDL_INIT_* + * + * These are the flags which may be passed to SDL_Init(). You should + * specify the subsystems which you will be using in your application. + */ +/* @{ */ +#define SDL_INIT_TIMER 0x00000001u +#define SDL_INIT_AUDIO 0x00000010u +#define SDL_INIT_VIDEO 0x00000020u /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ +#define SDL_INIT_JOYSTICK 0x00000200u /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ +#define SDL_INIT_HAPTIC 0x00001000u +#define SDL_INIT_GAMECONTROLLER 0x00002000u /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ +#define SDL_INIT_EVENTS 0x00004000u +#define SDL_INIT_SENSOR 0x00008000u +#define SDL_INIT_NOPARACHUTE 0x00100000u /**< compatibility; this flag is ignored. */ +#define SDL_INIT_EVERYTHING ( \ + SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ + SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR \ + ) +/* @} */ + +/** + * Initialize the SDL library. + * + * SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the + * two may be used interchangeably. Though for readability of your code + * SDL_InitSubSystem() might be preferred. + * + * The file I/O (for example: SDL_RWFromFile) and threading (SDL_CreateThread) + * subsystems are initialized by default. Message boxes + * (SDL_ShowSimpleMessageBox) also attempt to work without initializing the + * video subsystem, in hopes of being useful in showing an error dialog when + * SDL_Init fails. You must specifically initialize other subsystems if you + * use them in your application. + * + * Logging (such as SDL_Log) works without initialization, too. + * + * `flags` may be any of the following OR'd together: + * + * - `SDL_INIT_TIMER`: timer subsystem + * - `SDL_INIT_AUDIO`: audio subsystem + * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events + * subsystem + * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the + * events subsystem + * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem + * - `SDL_INIT_GAMECONTROLLER`: controller subsystem; automatically + * initializes the joystick subsystem + * - `SDL_INIT_EVENTS`: events subsystem + * - `SDL_INIT_EVERYTHING`: all of the above subsystems + * - `SDL_INIT_NOPARACHUTE`: compatibility; this flag is ignored + * + * Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem() + * for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or + * call SDL_Quit() to force shutdown). If a subsystem is already loaded then + * this call will increase the ref-count and return. + * + * \param flags subsystem initialization flags + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + * \sa SDL_SetMainReady + * \sa SDL_WasInit + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** + * Compatibility function to initialize the SDL library. + * + * In SDL2, this function and SDL_Init() are interchangeable. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_Quit + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** + * Shut down specific SDL subsystems. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * SDL_QuitSubSystem() and SDL_WasInit() will not work. You will need to use + * that subsystem's quit function (SDL_VideoQuit()) directly instead. But + * generally, you should not be using those functions directly anyhow; use + * SDL_Init() instead. + * + * You still need to call SDL_Quit() even if you close all open subsystems + * with SDL_QuitSubSystem(). + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** + * Get a mask of the specified subsystems which are currently initialized. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it + * returns the initialization status of the specified subsystems. + * + * The return value does not include SDL_INIT_NOPARACHUTE. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_InitSubSystem + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** + * Clean up all initialized subsystems. + * + * You should call this function even if you have already shutdown each + * initialized subsystem with SDL_QuitSubSystem(). It is safe to call this + * function even in the case of errors in initialization. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * then you must use that subsystem's quit function (SDL_VideoQuit()) to shut + * it down before calling SDL_Quit(). But generally, you should not be using + * those functions directly anyhow; use SDL_Init() instead. + * + * You can use this function with atexit() to ensure that it is run when your + * application is shutdown, but it is not wise to do this from a library or + * other dynamically loaded code. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/LibWhisper/WhisperStream.swift b/LibWhisper/WhisperStream.swift new file mode 100644 index 0000000..bd86a4b --- /dev/null +++ b/LibWhisper/WhisperStream.swift @@ -0,0 +1,98 @@ +import AVFoundation + +public struct Segment { + let text: String + let t0: Int64 + let t1: Int64 +} + +public typealias OrderedSegments = [Segment] + +public extension OrderedSegments { + var text: any StringProtocol { + map { $0.text }.joined() + } +} + +public class WhisperStream: Thread { + let waiter = DispatchGroup() + + @Published public private(set) var segments = OrderedSegments() + @Published public private(set) var alive = true + + let model: URL + let device: CaptureDevice? + let window: TimeInterval + + public init(model: URL, device: CaptureDevice? = nil, window: TimeInterval = 300) { + self.model = model + self.device = device + self.window = window + super.init() + } + + public override func start() { + waiter.enter() + super.start() + } + + public override func main() { + task() + waiter.leave() + } + + public func join() { + waiter.wait() + } + + func task() { + model.path.withCString { modelCStr in + var params = stream_default_params() + params.model = modelCStr + + if let device = device { + params.capture_id = device.id + } + + let ctx = stream_init(params) + if ctx == nil { + return + } + + while !self.isCancelled { + let errno = stream_run(ctx, Unmanaged.passUnretained(self).toOpaque()) { + return Unmanaged.fromOpaque($3!).takeUnretainedValue().callback( + text: $0 != nil ? String(cString: $0!) : nil, + t0: $1, + t1: $2 + ) + } + if errno != 0 { + break + } + } + + stream_free(ctx) + alive = false + } + } + + func callback(text: String?, t0: Int64, t1: Int64) -> Int32 { + if segments.isEmpty || text == nil { + segments.append(Segment(text: "", t0: -1, t1: -1)) + } + if let text = text { + segments[segments.count - 1] = Segment(text: text, t0: t0, t1: t1) + } + + var k = 0 + for segment in segments { + if let last = segments.last, last.t0 - segment.t0 > Int64(window * 1000) { + k += 1 + } + } + segments.removeFirst(k) + + return 0 + } +} diff --git a/LibWhisper/stream.cpp b/LibWhisper/stream.cpp new file mode 100644 index 0000000..823b39d --- /dev/null +++ b/LibWhisper/stream.cpp @@ -0,0 +1,240 @@ +// This code is based on the streaming example provided with whisper.cpp: +// https://github.com/ggerganov/whisper.cpp/blob/ca21f7ab16694384fb74b1ba4f68b39f16540d23/examples/stream/stream.cpp + +#include "common.h" +#include "common-sdl.h" +#include "whisper.h" +#include "stream.h" + +#include +#include +#include +#include +#include +#include + +using unique_whisper = std::unique_ptr>; + +struct stream_context { + stream_params params; + std::unique_ptr audio; + unique_whisper whisper; + std::vector pcmf32; + std::vector pcmf32_old; + std::vector pcmf32_new; + std::vector prompt_tokens; + std::chrono::time_point t_last; + std::chrono::time_point t_start; + int n_samples_step; + int n_samples_len; + int n_samples_keep; + bool use_vad; + int n_new_line; + int n_iter = 0; +}; + +struct stream_params stream_default_params() { + return stream_params { + /* .n_threads =*/ std::min(4, (int32_t) std::thread::hardware_concurrency()), + /* .step_ms =*/ 3000, + /* .length_ms =*/ 10000, + /* .keep_ms =*/ 200, + /* .capture_id =*/ -1, + /* .max_tokens =*/ 32, + /* .audio_ctx =*/ 0, + + /* .vad_thold =*/ 0.6f, + /* .freq_thold =*/ 100.0f, + + /* .speed_up =*/ false, + /* .translate =*/ false, + /* .print_special =*/ false, + /* .no_context =*/ true, + /* .no_timestamps =*/ false, + + /* .language =*/ "en", + /* .model =*/ "models/ggml-base.en.bin" + }; +} + +stream_context *stream_init(stream_params params) { + auto ctx = std::make_unique(); + + params.keep_ms = std::min(params.keep_ms, params.step_ms); + params.length_ms = std::max(params.length_ms, params.step_ms); + + ctx->n_samples_step = (1e-3 * params.step_ms) * WHISPER_SAMPLE_RATE; + ctx->n_samples_len = (1e-3 * params.length_ms) * WHISPER_SAMPLE_RATE; + ctx->n_samples_keep = (1e-3 * params.keep_ms) * WHISPER_SAMPLE_RATE; + const int n_samples_30s = (1e-3 * 30000.0) * WHISPER_SAMPLE_RATE; + + ctx->use_vad = ctx->n_samples_step <= 0; // sliding window mode uses VAD + + ctx->n_new_line = !ctx->use_vad ? std::max(1, params.length_ms / params.step_ms - 1) : 1; // number of steps to print new line + + params.no_timestamps = !ctx->use_vad; + params.no_context |= ctx->use_vad; + params.max_tokens = 0; + + // init audio + ctx->audio = std::make_unique(params.length_ms); + if (!ctx->audio->init(params.capture_id, WHISPER_SAMPLE_RATE)) { + fprintf(stderr, "%s: audio.init() failed!\n", __func__); + return NULL; + } + + ctx->audio->resume(); + + // whisper init + if (whisper_lang_id(params.language) == -1) { + fprintf(stderr, "%s: unknown language '%s'\n", __func__, params.language); + return NULL; + } + + if ((ctx->whisper = unique_whisper(whisper_init_from_file(params.model))) == NULL) { + return NULL; + } + + ctx->pcmf32 = std::vector(n_samples_30s, 0.0f); + ctx->pcmf32_new = std::vector(n_samples_30s, 0.0f); + + ctx->t_last = std::chrono::high_resolution_clock::now(); + ctx->t_start = ctx->t_last; + + ctx->params = params; + + return ctx.release(); +} + +void stream_free(stream_context *ctx) { + ctx->audio = NULL; + ctx->whisper = NULL; + ctx->pcmf32.clear(); + ctx->pcmf32_old.clear(); + ctx->pcmf32_new.clear(); + ctx->prompt_tokens.clear(); +} + +int stream_run(stream_context *ctx, void *callback_ctx, stream_callback_t callback) { + auto params = ctx->params; + auto whisper = ctx->whisper.get(); + + auto t_now = std::chrono::high_resolution_clock::now(); + + if (!ctx->use_vad) { + while (true) { + ctx->audio->get(params.step_ms, ctx->pcmf32_new); + + if ((int)ctx->pcmf32_new.size() > 2 * ctx->n_samples_step) { + fprintf(stderr, "\n\n%s: WARNING: cannot process audio fast enough, dropping audio ...\n\n", __func__); + ctx->audio->clear(); + continue; + } + + if ((int)ctx->pcmf32_new.size() >= ctx->n_samples_step) { + ctx->audio->clear(); + break; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + + const int n_samples_new = ctx->pcmf32_new.size(); + + // take up to params.length_ms audio from previous iteration + const int n_samples_take = std::min((int)ctx->pcmf32_old.size(), std::max(0, ctx->n_samples_keep + ctx->n_samples_len - n_samples_new)); + + ctx->pcmf32.resize(n_samples_new + n_samples_take); + + for (int i = 0; i < n_samples_take; i++) { + ctx->pcmf32[i] = ctx->pcmf32_old[ctx->pcmf32_old.size() - n_samples_take + i]; + } + + memcpy(ctx->pcmf32.data() + n_samples_take, ctx->pcmf32_new.data(), n_samples_new * sizeof(float)); + + ctx->pcmf32_old = ctx->pcmf32; + } else { + auto t_diff = std::chrono::duration_cast(t_now - ctx->t_last).count(); + if (t_diff < 2000) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + return 0; + } + + // process new audio + ctx->audio->get(2000, ctx->pcmf32_new); + + if (::vad_simple(ctx->pcmf32_new, WHISPER_SAMPLE_RATE, 1000, params.vad_thold, params.freq_thold, false)) { + ctx->audio->get(params.length_ms, ctx->pcmf32); + } else { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + return 0; + } + + ctx->t_last = t_now; + } + + // run the inference + whisper_full_params wparams = whisper_full_default_params(WHISPER_SAMPLING_GREEDY); + + wparams.print_progress = false; + wparams.print_special = params.print_special; + wparams.print_realtime = false; + wparams.print_timestamps = !params.no_timestamps; + wparams.translate = params.translate; + wparams.no_context = true; + wparams.single_segment = !ctx->use_vad; + wparams.max_tokens = params.max_tokens; + wparams.language = params.language; + wparams.n_threads = params.n_threads; + + wparams.audio_ctx = params.audio_ctx; + wparams.speed_up = params.speed_up; + + // disable temperature fallback + wparams.temperature_inc = -1.0f; + + wparams.prompt_tokens = params.no_context ? nullptr : ctx->prompt_tokens.data(); + wparams.prompt_n_tokens = params.no_context ? 0 : ctx->prompt_tokens.size(); + + const int64_t t1 = (t_now - ctx->t_start).count() / 1000000; + const int64_t t0 = std::max(0.0, t1 - ctx->pcmf32.size() * 1000.0 / WHISPER_SAMPLE_RATE); + + if (whisper_full(whisper, wparams, ctx->pcmf32.data(), ctx->pcmf32.size()) != 0) { + fprintf(stderr, "%s: failed to process audio\n", __func__); + return 6; + } + + const int n_segments = whisper_full_n_segments(whisper); + for (int i = 0; i < n_segments; ++i) { + const char *text = whisper_full_get_segment_text(whisper, i); + + const int64_t segment_t0 = whisper_full_get_segment_t0(whisper, i); + const int64_t segment_t1 = whisper_full_get_segment_t1(whisper, i); + + callback(text, ctx->use_vad ? segment_t0 : t0, ctx->use_vad ? segment_t1 : t1, callback_ctx); + } + + ++ctx->n_iter; + + if (!ctx->use_vad && (ctx->n_iter % ctx->n_new_line) == 0) { + callback(NULL, 0, 0, callback_ctx); + + // keep part of the audio for next iteration to try to mitigate word boundary issues + ctx->pcmf32_old = std::vector(ctx->pcmf32.end() - ctx->n_samples_keep, ctx->pcmf32.end()); + + // Add tokens of the last full length segment as the prompt + if (!params.no_context) { + ctx->prompt_tokens.clear(); + + const int n_segments = whisper_full_n_segments(whisper); + for (int i = 0; i < n_segments; ++i) { + const int token_count = whisper_full_n_tokens(whisper, i); + for (int j = 0; j < token_count; ++j) { + ctx->prompt_tokens.push_back(whisper_full_get_token_id(whisper, i, j)); + } + } + } + } + + return 0; +} diff --git a/LibWhisper/stream.h b/LibWhisper/stream.h new file mode 100644 index 0000000..35a2a48 --- /dev/null +++ b/LibWhisper/stream.h @@ -0,0 +1,42 @@ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stream_params { + int32_t n_threads; + int32_t step_ms; + int32_t length_ms; + int32_t keep_ms; + int32_t capture_id; + int32_t max_tokens; + int32_t audio_ctx; + + float vad_thold; + float freq_thold; + + bool speed_up; + bool translate; + bool print_special; + bool no_context; + bool no_timestamps; + + const char *language; + const char *model; +} stream_params_t; + +stream_params_t stream_default_params(); + +typedef struct stream_context *stream_context_t; + +stream_context_t stream_init(stream_params_t params); +void stream_free(stream_context_t ctx); + +typedef int (*stream_callback_t) (const char *text, int64_t t0, int64_t t1, void *ctx); +int stream_run(stream_context_t ctx, void *callback_ctx, stream_callback_t callback); + +#ifdef __cplusplus +} +#endif diff --git a/OpenAISwift/LICENSE b/OpenAISwift/LICENSE new file mode 100644 index 0000000..1a32ffb --- /dev/null +++ b/OpenAISwift/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Adam Rush + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/OpenAISwift/Models/ChatMessage.swift b/OpenAISwift/Models/ChatMessage.swift new file mode 100644 index 0000000..ceda78d --- /dev/null +++ b/OpenAISwift/Models/ChatMessage.swift @@ -0,0 +1,85 @@ +// +// File.swift +// +// +// Created by Bogdan Farca on 02.03.2023. +// + +import Foundation + +/// An enumeration of possible roles in a chat conversation. +public enum ChatRole: String, Codable { + /// The role for the system that manages the chat interface. + case system + /// The role for the human user who initiates the chat. + case user + /// The role for the artificial assistant who responds to the user. + case assistant +} + +/// A structure that represents a single message in a chat conversation. +public struct ChatMessage: Codable { + /// The role of the sender of the message. + public let role: ChatRole + /// The content of the message. + public let content: String + + /// Creates a new chat message with a given role and content. + /// - Parameters: + /// - role: The role of the sender of the message. + /// - content: The content of the message. + public init(role: ChatRole, content: String) { + self.role = role + self.content = content + } +} + +/// A structure that represents a chat conversation. +public struct ChatConversation: Encodable { + /// The name or identifier of the user who initiates the chat. Optional if not provided by the user interface. + let user: String? + + /// The messages to generate chat completions for. Ordered chronologically from oldest to newest. + let messages: [ChatMessage] + + /// The ID of the model used by the assistant to generate responses. See OpenAI documentation for details on which models work with the Chat API. + let model: String + + /// A parameter that controls how random or deterministic the responses are, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. Optional, defaults to 1. + let temperature: Double? + + /// A parameter that controls how diverse or narrow-minded the responses are, between 0 and 1. Higher values like 0.9 mean only the tokens comprising the top 90% probability mass are considered, while lower values like 0.1 mean only the top 10%. Optional, defaults to 1. + let topProbabilityMass: Double? + + /// How many chat completion choices to generate for each input message. Optional, defaults to 1. + let choices: Int? + + /// An array of up to 4 sequences where the API will stop generating further tokens. Optional. + let stop: [String]? + + /// The maximum number of tokens to generate in the chat completion. The total length of input tokens and generated tokens is limited by the model's context length. Optional. + let maxTokens: Int? + + /// A parameter that penalizes new tokens based on whether they appear in the text so far, between -2 and 2. Positive values increase the model's likelihood to talk about new topics. Optional if not specified by default or by user input. Optional, defaults to 0. + let presencePenalty: Double? + + /// A parameter that penalizes new tokens based on their existing frequency in the text so far, between -2 and 2. Positive values decrease the model's likelihood to repeat the same line verbatim. Optional if not specified by default or by user input. Optional, defaults to 0. + let frequencyPenalty: Double? + + /// Modify the likelihood of specified tokens appearing in the completion. Maps tokens (specified by their token ID in the OpenAI Tokenizer—not English words) to an associated bias value from -100 to 100. Values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. + let logitBias: [Int: Double]? + + enum CodingKeys: String, CodingKey { + case user + case messages + case model + case temperature + case topProbabilityMass = "top_p" + case choices = "n" + case stop + case maxTokens = "max_tokens" + case presencePenalty = "presence_penalty" + case frequencyPenalty = "frequency_penalty" + case logitBias = "logit_bias" + } +} diff --git a/OpenAISwift/Models/Command.swift b/OpenAISwift/Models/Command.swift new file mode 100644 index 0000000..a0b75ba --- /dev/null +++ b/OpenAISwift/Models/Command.swift @@ -0,0 +1,19 @@ +// +// Created by Adam Rush - OpenAISwift +// + +import Foundation + +struct Command: Encodable { + let prompt: String + let model: String + let maxTokens: Int + let temperature: Double + + enum CodingKeys: String, CodingKey { + case prompt + case model + case maxTokens = "max_tokens" + case temperature + } +} diff --git a/OpenAISwift/Models/ImageGeneration.swift b/OpenAISwift/Models/ImageGeneration.swift new file mode 100644 index 0000000..139c617 --- /dev/null +++ b/OpenAISwift/Models/ImageGeneration.swift @@ -0,0 +1,21 @@ +// +// ImageGeneration.swift +// +// +// Created by Arjun Dureja on 2023-03-11. +// + +import Foundation + +struct ImageGeneration: Encodable { + let prompt: String + let n: Int + let size: ImageSize + let user: String? +} + +public enum ImageSize: String, Codable { + case size1024 = "1024x1024" + case size512 = "512x512" + case size256 = "256x256" +} diff --git a/OpenAISwift/Models/Instruction.swift b/OpenAISwift/Models/Instruction.swift new file mode 100644 index 0000000..b86f2a3 --- /dev/null +++ b/OpenAISwift/Models/Instruction.swift @@ -0,0 +1,11 @@ +// +// Created by Adam Rush - OpenAISwift +// + +import Foundation + +struct Instruction: Encodable { + let instruction: String + let model: String + let input: String +} diff --git a/OpenAISwift/Models/OpenAI.swift b/OpenAISwift/Models/OpenAI.swift new file mode 100644 index 0000000..d6bf82b --- /dev/null +++ b/OpenAISwift/Models/OpenAI.swift @@ -0,0 +1,39 @@ +// +// Created by Adam Rush - OpenAISwift +// + +import Foundation + +public protocol Payload: Codable { } + +public struct OpenAI: Codable { + public let object: String? + public let model: String? + public let choices: [T]? + public let usage: UsageResult? + public let data: [T]? +} + +public struct TextResult: Payload { + public let text: String +} + +public struct MessageResult: Payload { + public let message: ChatMessage +} + +public struct UsageResult: Codable { + public let promptTokens: Int + public let completionTokens: Int + public let totalTokens: Int + + enum CodingKeys: String, CodingKey { + case promptTokens = "prompt_tokens" + case completionTokens = "completion_tokens" + case totalTokens = "total_tokens" + } +} + +public struct UrlResult: Payload { + public let url: String +} diff --git a/OpenAISwift/Models/OpenAIModelType.swift b/OpenAISwift/Models/OpenAIModelType.swift new file mode 100644 index 0000000..cca9d2b --- /dev/null +++ b/OpenAISwift/Models/OpenAIModelType.swift @@ -0,0 +1,120 @@ +// +// OpenAIModelType.swift +// +// +// Created by Yash Shah on 06/12/2022. +// + +import Foundation + +/// The type of model used to generate the output +public enum OpenAIModelType { + /// ``GPT3`` Family of Models + case gpt3(GPT3) + + /// ``Codex`` Family of Models + case codex(Codex) + + /// ``Feature`` Family of Models + case feature(Feature) + + /// ``Chat`` Family of Models + case chat(Chat) + + /// Other Custom Models + case other(String) + + public var modelName: String { + switch self { + case .gpt3(let model): return model.rawValue + case .codex(let model): return model.rawValue + case .feature(let model): return model.rawValue + case .chat(let model): return model.rawValue + case .other(let modelName): return modelName + } + } + + /// A set of models that can understand and generate natural language + /// + /// [GPT-3 Models OpenAI API Docs](https://beta.openai.com/docs/models/gpt-3) + public enum GPT3: String { + + /// Most capable GPT-3 model. Can do any task the other models can do, often with higher quality, longer output and better instruction-following. Also supports inserting completions within text. + /// + /// > Model Name: text-davinci-003 + case davinci = "text-davinci-003" + + /// Very capable, but faster and lower cost than GPT3 ``davinci``. + /// + /// > Model Name: text-curie-001 + case curie = "text-curie-001" + + /// Capable of straightforward tasks, very fast, and lower cost. + /// + /// > Model Name: text-babbage-001 + case babbage = "text-babbage-001" + + /// Capable of very simple tasks, usually the fastest model in the GPT-3 series, and lowest cost. + /// + /// > Model Name: text-ada-001 + case ada = "text-ada-001" + } + + /// A set of models that can understand and generate code, including translating natural language to code + /// + /// [Codex Models OpenAI API Docs](https://beta.openai.com/docs/models/codex) + /// + /// > Limited Beta + public enum Codex: String { + /// Most capable Codex model. Particularly good at translating natural language to code. In addition to completing code, also supports inserting completions within code. + /// + /// > Model Name: code-davinci-002 + case davinci = "code-davinci-002" + + /// Almost as capable as ``davinci`` Codex, but slightly faster. This speed advantage may make it preferable for real-time applications. + /// + /// > Model Name: code-cushman-001 + case cushman = "code-cushman-001" + } + + + /// A set of models that are feature specific. + /// + /// For example using the Edits endpoint requires a specific data model + /// + /// You can read the [API Docs](https://beta.openai.com/docs/guides/completion/editing-text) + public enum Feature: String { + + /// > Model Name: text-davinci-edit-001 + case davinci = "text-davinci-edit-001" + } + + /// A set of models for the new chat completions + /// You can read the [API Docs](https://platform.openai.com/docs/api-reference/chat/create) + public enum Chat: String { + + /// Most capable GPT-3.5 model and optimized for chat at 1/10th the cost of text-davinci-003. Will be updated with our latest model iteration. + /// > Model Name: gpt-3.5-turbo + case chatgpt = "gpt-3.5-turbo" + + /// Snapshot of gpt-3.5-turbo from March 1st 2023. Unlike gpt-3.5-turbo, this model will not receive updates, and will only be supported for a three month period ending on June 1st 2023. + /// > Model Name: gpt-3.5-turbo-0301 + case chatgpt0301 = "gpt-3.5-turbo-0301" + + /// More capable than any GPT-3.5 model, able to do more complex tasks, and optimized for chat. Will be updated with our latest model iteration. + /// > Model Name: gpt-4 + case gpt4 = "gpt-4" + + /// Snapshot of gpt-4 from March 14th 2023. Unlike gpt-4, this model will not receive updates, and will only be supported for a three month period ending on June 14th 2023. + /// > Model Name: gpt-4-0314 + case gpt4_0314 = "gpt-4-0314" + + /// Same capabilities as the base gpt-4 mode but with 4x the context length. Will be updated with our latest model iteration. + /// > Model Name: gpt-4-32k + case gpt4_32k = "gpt-4-32k" + + /// Snapshot of gpt-4-32 from March 14th 2023. Unlike gpt-4-32k, this model will not receive updates, and will only be supported for a three month period ending on June 14th 2023. + /// > Model Name: gpt-4-32k-0314 + case gpt4_32k_0314 = "gpt-4-32k-0314" + } +} diff --git a/OpenAISwift/OpenAIEndpoint.swift b/OpenAISwift/OpenAIEndpoint.swift new file mode 100644 index 0000000..de0e236 --- /dev/null +++ b/OpenAISwift/OpenAIEndpoint.swift @@ -0,0 +1,41 @@ +// +// Created by Adam Rush - OpenAISwift +// + +import Foundation + +enum Endpoint { + case completions + case edits + case chat + case images +} + +extension Endpoint { + var path: String { + switch self { + case .completions: + return "/v1/completions" + case .edits: + return "/v1/edits" + case .chat: + return "/v1/chat/completions" + case .images: + return "/v1/images/generations" + } + } + + var method: String { + switch self { + case .completions, .edits, .chat, .images: + return "POST" + } + } + + func baseURL() -> String { + switch self { + case .completions, .edits, .chat, .images: + return "https://api.openai.com" + } + } +} diff --git a/OpenAISwift/OpenAISwift.swift b/OpenAISwift/OpenAISwift.swift new file mode 100644 index 0000000..dd4e27c --- /dev/null +++ b/OpenAISwift/OpenAISwift.swift @@ -0,0 +1,298 @@ +import Foundation +#if canImport(FoundationNetworking) && canImport(FoundationXML) +import FoundationNetworking +import FoundationXML +#endif + +public enum OpenAIError: Error { + case genericError(error: Error) + case decodingError(error: Error) +} + +public class OpenAISwift { + fileprivate(set) var token: String? + fileprivate let config: Config + + /// Configuration object for the client + public struct Config { + + /// Initialiser + /// - Parameter session: the session to use for network requests. + public init(session: URLSession = URLSession.shared) { + self.session = session + } + + let session:URLSession + } + + public init(authToken: String, config: Config = Config()) { + self.token = authToken + self.config = Config() + } +} + +extension OpenAISwift { + /// Send a Completion to the OpenAI API + /// - Parameters: + /// - prompt: The Text Prompt + /// - model: The AI Model to Use. Set to `OpenAIModelType.gpt3(.davinci)` by default which is the most capable model + /// - maxTokens: The limit character for the returned response, defaults to 16 as per the API + /// - completionHandler: Returns an OpenAI Data Model + public func sendCompletion(with prompt: String, model: OpenAIModelType = .gpt3(.davinci), maxTokens: Int = 16, temperature: Double = 1, completionHandler: @escaping (Result, OpenAIError>) -> Void) { + let endpoint = Endpoint.completions + let body = Command(prompt: prompt, model: model.modelName, maxTokens: maxTokens, temperature: temperature) + let request = prepareRequest(endpoint, body: body) + + makeRequest(request: request) { result in + switch result { + case .success(let success): + do { + let res = try JSONDecoder().decode(OpenAI.self, from: success) + completionHandler(.success(res)) + } catch { + completionHandler(.failure(.decodingError(error: error))) + } + case .failure(let failure): + completionHandler(.failure(.genericError(error: failure))) + } + } + } + + /// Send a Edit request to the OpenAI API + /// - Parameters: + /// - instruction: The Instruction For Example: "Fix the spelling mistake" + /// - model: The Model to use, the only support model is `text-davinci-edit-001` + /// - input: The Input For Example "My nam is Adam" + /// - completionHandler: Returns an OpenAI Data Model + public func sendEdits(with instruction: String, model: OpenAIModelType = .feature(.davinci), input: String = "", completionHandler: @escaping (Result, OpenAIError>) -> Void) { + let endpoint = Endpoint.edits + let body = Instruction(instruction: instruction, model: model.modelName, input: input) + let request = prepareRequest(endpoint, body: body) + + makeRequest(request: request) { result in + switch result { + case .success(let success): + do { + let res = try JSONDecoder().decode(OpenAI.self, from: success) + completionHandler(.success(res)) + } catch { + completionHandler(.failure(.decodingError(error: error))) + } + case .failure(let failure): + completionHandler(.failure(.genericError(error: failure))) + } + } + } + + /// Send a Chat request to the OpenAI API + /// - Parameters: + /// - messages: Array of `ChatMessages` + /// - model: The Model to use, the only support model is `gpt-3.5-turbo` + /// - user: A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. + /// - temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or topProbabilityMass but not both. + /// - topProbabilityMass: The OpenAI api equivalent of the "top_p" parameter. An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + /// - choices: How many chat completion choices to generate for each input message. + /// - stop: Up to 4 sequences where the API will stop generating further tokens. + /// - maxTokens: The maximum number of tokens allowed for the generated answer. By default, the number of tokens the model can return will be (4096 - prompt tokens). + /// - presencePenalty: Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. + /// - frequencyPenalty: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + /// - logitBias: Modify the likelihood of specified tokens appearing in the completion. Maps tokens (specified by their token ID in the OpenAI Tokenizer—not English words) to an associated bias value from -100 to 100. Values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. + /// - completionHandler: Returns an OpenAI Data Model + public func sendChat(with messages: [ChatMessage], + model: OpenAIModelType = .chat(.chatgpt), + user: String? = nil, + temperature: Double? = 1, + topProbabilityMass: Double? = 0, + choices: Int? = 1, + stop: [String]? = nil, + maxTokens: Int? = nil, + presencePenalty: Double? = 0, + frequencyPenalty: Double? = 0, + logitBias: [Int: Double]? = nil, + completionHandler: @escaping (Result, OpenAIError>) -> Void) { + let endpoint = Endpoint.chat + let body = ChatConversation(user: user, + messages: messages, + model: model.modelName, + temperature: temperature, + topProbabilityMass: topProbabilityMass, + choices: choices, + stop: stop, + maxTokens: maxTokens, + presencePenalty: presencePenalty, + frequencyPenalty: frequencyPenalty, + logitBias: logitBias) + + let request = prepareRequest(endpoint, body: body) + + makeRequest(request: request) { result in + switch result { + case .success(let success): + do { + let res = try JSONDecoder().decode(OpenAI.self, from: success) + completionHandler(.success(res)) + } catch { + completionHandler(.failure(.decodingError(error: error))) + } + case .failure(let failure): + completionHandler(.failure(.genericError(error: failure))) + } + } + } + + /// Send a Image generation request to the OpenAI API + /// - Parameters: + /// - prompt: The Text Prompt + /// - numImages: The number of images to generate, defaults to 1 + /// - size: The size of the image, defaults to 1024x1024. There are two other options: 512x512 and 256x256 + /// - user: An optional unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. + /// - completionHandler: Returns an OpenAI Data Model + public func sendImages(with prompt: String, numImages: Int = 1, size: ImageSize = .size1024, user: String? = nil, completionHandler: @escaping (Result, OpenAIError>) -> Void) { + let endpoint = Endpoint.images + let body = ImageGeneration(prompt: prompt, n: numImages, size: size, user: user) + let request = prepareRequest(endpoint, body: body) + + makeRequest(request: request) { result in + switch result { + case .success(let success): + do { + let res = try JSONDecoder().decode(OpenAI.self, from: success) + completionHandler(.success(res)) + } catch { + completionHandler(.failure(.decodingError(error: error))) + } + case .failure(let failure): + completionHandler(.failure(.genericError(error: failure))) + } + } + } + + private func makeRequest(request: URLRequest, completionHandler: @escaping (Result) -> Void) { + let session = config.session + let task = session.dataTask(with: request) { (data, response, error) in + if let error = error { + completionHandler(.failure(error)) + } else if let data = data { + completionHandler(.success(data)) + } + } + + task.resume() + } + + private func prepareRequest(_ endpoint: Endpoint, body: BodyType) -> URLRequest { + var urlComponents = URLComponents(url: URL(string: endpoint.baseURL())!, resolvingAgainstBaseURL: true) + urlComponents?.path = endpoint.path + var request = URLRequest(url: urlComponents!.url!) + request.httpMethod = endpoint.method + + if let token = self.token { + request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") + } + + request.setValue("application/json", forHTTPHeaderField: "content-type") + + let encoder = JSONEncoder() + if let encoded = try? encoder.encode(body) { + request.httpBody = encoded + } + + return request + } +} + +extension OpenAISwift { + /// Send a Completion to the OpenAI API + /// - Parameters: + /// - prompt: The Text Prompt + /// - model: The AI Model to Use. Set to `OpenAIModelType.gpt3(.davinci)` by default which is the most capable model + /// - maxTokens: The limit character for the returned response, defaults to 16 as per the API + /// - temperature: Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. Defaults to 1 + /// - Returns: Returns an OpenAI Data Model + @available(swift 5.5) + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func sendCompletion(with prompt: String, model: OpenAIModelType = .gpt3(.davinci), maxTokens: Int = 16, temperature: Double = 1) async throws -> OpenAI { + return try await withCheckedThrowingContinuation { continuation in + sendCompletion(with: prompt, model: model, maxTokens: maxTokens, temperature: temperature) { result in + continuation.resume(with: result) + } + } + } + + /// Send a Edit request to the OpenAI API + /// - Parameters: + /// - instruction: The Instruction For Example: "Fix the spelling mistake" + /// - model: The Model to use, the only support model is `text-davinci-edit-001` + /// - input: The Input For Example "My nam is Adam" + /// - Returns: Returns an OpenAI Data Model + @available(swift 5.5) + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func sendEdits(with instruction: String, model: OpenAIModelType = .feature(.davinci), input: String = "") async throws -> OpenAI { + return try await withCheckedThrowingContinuation { continuation in + sendEdits(with: instruction, model: model, input: input) { result in + continuation.resume(with: result) + } + } + } + + /// Send a Chat request to the OpenAI API + /// - Parameters: + /// - messages: Array of `ChatMessages` + /// - model: The Model to use, the only support model is `gpt-3.5-turbo` + /// - user: A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. + /// - temperature: What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. We generally recommend altering this or topProbabilityMass but not both. + /// - topProbabilityMass: The OpenAI api equivalent of the "top_p" parameter. An alternative to sampling with temperature, called nucleus sampling, where the model considers the results of the tokens with top_p probability mass. So 0.1 means only the tokens comprising the top 10% probability mass are considered. We generally recommend altering this or temperature but not both. + /// - choices: How many chat completion choices to generate for each input message. + /// - stop: Up to 4 sequences where the API will stop generating further tokens. + /// - maxTokens: The maximum number of tokens allowed for the generated answer. By default, the number of tokens the model can return will be (4096 - prompt tokens). + /// - presencePenalty: Number between -2.0 and 2.0. Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. + /// - frequencyPenalty: Number between -2.0 and 2.0. Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. + /// - logitBias: Modify the likelihood of specified tokens appearing in the completion. Maps tokens (specified by their token ID in the OpenAI Tokenizer—not English words) to an associated bias value from -100 to 100. Values between -1 and 1 should decrease or increase likelihood of selection; values like -100 or 100 should result in a ban or exclusive selection of the relevant token. + /// - completionHandler: Returns an OpenAI Data Model + @available(swift 5.5) + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func sendChat(with messages: [ChatMessage], + model: OpenAIModelType = .chat(.chatgpt), + user: String? = nil, + temperature: Double? = 1, + topProbabilityMass: Double? = 0, + choices: Int? = 1, + stop: [String]? = nil, + maxTokens: Int? = nil, + presencePenalty: Double? = 0, + frequencyPenalty: Double? = 0, + logitBias: [Int: Double]? = nil) async throws -> OpenAI { + return try await withCheckedThrowingContinuation { continuation in + sendChat(with: messages, + model: model, + user: user, + temperature: temperature, + topProbabilityMass: topProbabilityMass, + choices: choices, + stop: stop, + maxTokens: maxTokens, + presencePenalty: presencePenalty, + frequencyPenalty: frequencyPenalty, + logitBias: logitBias) { result in + continuation.resume(with: result) + } + } + } + + /// Send a Image generation request to the OpenAI API + /// - Parameters: + /// - prompt: The Text Prompt + /// - numImages: The number of images to generate, defaults to 1 + /// - size: The size of the image, defaults to 1024x1024. There are two other options: 512x512 and 256x256 + /// - user: An optional unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. + /// - Returns: Returns an OpenAI Data Model + @available(swift 5.5) + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func sendImages(with prompt: String, numImages: Int = 1, size: ImageSize = .size1024, user: String? = nil) async throws -> OpenAI { + return try await withCheckedThrowingContinuation { continuation in + sendImages(with: prompt, numImages: numImages, size: size, user: user) { result in + continuation.resume(with: result) + } + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce9d07c --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# Cheetah + +Cheetah is an AI-powered macOS app designed to assist users during remote software engineering interviews by providing real-time, discreet coaching and live coding platform integration. + +![Screenshot](cheetah.jpg) + +With Cheetah, you can improve your interview performance and increase your chances of landing that $300k SWE job, without spending your weekends cramming leetcode challenges and memorizing algorithms you'll never use. + + +## How it works + +Cheetah leverages Whisper for real-time audio transcription and GPT-4 for generating hints and solutions. You need to have your own OpenAI API key to use the app. If you don't have access to GPT-4, gpt-3.5-turbo can be used as an alternative. + +Whisper runs locally on your system, utilizing Georgi Gerganov's [whisper.cpp](https://github.com/ggerganov/whisper.cpp). A recent M1 or M2 Mac is required for optimal performance. + + +## Getting started + +### Audio driver setup + +For the best results, ensure the audio input captures both sides of the conversation. + +When using a video chat app like Zoom or Google Meet, you can achieve this with [BlackHole](https://existential.audio/blackhole/), a free audio loopback driver. Follow the instructions for setting up a [Multi-Output Device](https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device), and remember not to use the loopback device as input for the video chat app. + +### App overview + +Open the app and select an audio input to start live transcription. A snippet of the transcription will be displayed under the audio input selector. + +*Note:* running the app in debug mode will result in very slow audio transcription performance. + +The UI features three buttons: + +**Answer:** Generates an answer for the interviewer's question. + +**Refine:** Updates the existing answer, useful for when the interviewer provides additional constraints or clarification. + +**Analyze:** Analyzes code and logs from the live coding environment in your web browser. Requires the browser extension. + +You can also select (highlight) a portion of a generated answer and click Refine to get more detail. + +### Installing the browser extension + +Currently, only Firefox is supported. Follow these steps to install the extension: + +1. Go to [about:debugging](https://firefox-source-docs.mozilla.org/devtools-user/about_colon_debugging/index.html) +2. Click "This Firefox" +3. Click "Load Temporary Add-on" +4. Select `./extension/manifest.json` + + +## Disclaimer + +Cheetah is a satirical art project and is not intended for use in real-world settings. It may generate incorrect or inappropriate solutions. Users should exercise caution and take responsibility for the information provided by the app. diff --git a/cheetah.jpg b/cheetah.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57bc7af39da49a8653c42d2721654aceba8f72b2 GIT binary patch literal 297692 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ƞxNEfpwQ;CN?2fZJeF3bsusZ@6T`QyI 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

w_XOd|UY_HjiJRM*^IhW!u9G9q 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 H|5^ACVfH0? literal 0 HcmV?d00001 diff --git a/extension/background.js b/extension/background.js new file mode 100644 index 0000000..c71b25b --- /dev/null +++ b/extension/background.js @@ -0,0 +1,12 @@ +let port = null; + +browser.runtime.onMessage.addListener(message => { + if (port == null || port.error) { + port = browser.runtime.connectNative('cheetah'); + } + try { + port.postMessage(message); + } catch (error) { + port = null; + } +}); diff --git a/extension/cheetah.js b/extension/cheetah.js new file mode 100644 index 0000000..5dd4105 --- /dev/null +++ b/extension/cheetah.js @@ -0,0 +1,23 @@ +let updateFrequency = 1000; + +function update() { + let editor = window.wrappedJSObject.editor; + if (!editor) { + return; + } + + let modeId = document.querySelector('.react-monaco-editor-react')?.dataset.modeId; + let fileUri = document.querySelector('.monaco-editor[role="code"]')?.dataset.uri; + let terminal = document.querySelector('.terminal .xterm-accessibility')?.innerText.trim(); + + let message = { + mode: modeId, + files: { [fileUri]: editor.getValue() }, + logs: { terminal } + }; + + message.navigationStart = performance.timing.navigationStart; + browser.runtime.sendMessage(message); +} + +setInterval(update, updateFrequency); diff --git a/extension/icon.png b/extension/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..90687de26d71e91b7c82565772a7df470ae277a6 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmSQK*5Dp-y;YjHK@;M7UB8wRq zxP?KOkzv*x37}xJr;B4qM&sM7j(iOY0?rpNR{Ym~eNUieh4I>d+mEvHuIy!K@bZ41 zJ}N$e^&*#q7kxbW`Aeg?)>n&l0$ z8xrIlb~3+dVExT-N;ZLA=LS%o!8+lf-GRA$F@Klex9jiV-^0Mj@Zdh*s&