Initial commit
This commit is contained in:
240
oAI/Models/MockData.swift
Normal file
240
oAI/Models/MockData.swift
Normal file
@@ -0,0 +1,240 @@
|
||||
//
|
||||
// MockData.swift
|
||||
// oAI
|
||||
//
|
||||
// Mock data for Phase 1 testing
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
extension Message {
|
||||
static let mockUser1 = Message(
|
||||
role: .user,
|
||||
content: "What is SwiftUI and how does it compare to UIKit?",
|
||||
tokens: 12,
|
||||
cost: 0.00002
|
||||
)
|
||||
|
||||
static let mockAssistant1 = Message(
|
||||
role: .assistant,
|
||||
content: """
|
||||
SwiftUI is Apple's modern declarative framework for building user interfaces across all Apple platforms. Here's how it compares to UIKit:
|
||||
|
||||
## Key Differences
|
||||
|
||||
**SwiftUI (Declarative)**
|
||||
- Describe WHAT the UI should look like
|
||||
- State-driven updates
|
||||
- Less boilerplate code
|
||||
- Cross-platform by default
|
||||
|
||||
**UIKit (Imperative)**
|
||||
- Describe HOW to build the UI step-by-step
|
||||
- Manual state management
|
||||
- More verbose
|
||||
- iOS/tvOS focused
|
||||
|
||||
## Example
|
||||
|
||||
```swift
|
||||
// SwiftUI
|
||||
struct ContentView: View {
|
||||
@State private var count = 0
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
Text("Count: \\(count)")
|
||||
Button("Increment") {
|
||||
count += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```swift
|
||||
// UIKit equivalent
|
||||
class ViewController: UIViewController {
|
||||
var count = 0
|
||||
let label = UILabel()
|
||||
let button = UIButton()
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
setupUI()
|
||||
}
|
||||
|
||||
@objc func incrementTapped() {
|
||||
count += 1
|
||||
label.text = "Count: \\(count)"
|
||||
}
|
||||
|
||||
func setupUI() {
|
||||
// ... lots more setup code
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
SwiftUI is recommended for new projects, especially if targeting iOS 14+ and multiple platforms.
|
||||
""",
|
||||
tokens: 245,
|
||||
cost: 0.00049
|
||||
)
|
||||
|
||||
static let mockUser2 = Message(
|
||||
role: .user,
|
||||
content: "Can you explain async/await in Swift?",
|
||||
tokens: 8,
|
||||
cost: 0.00001
|
||||
)
|
||||
|
||||
static let mockAssistant2 = Message(
|
||||
role: .assistant,
|
||||
content: """
|
||||
Async/await is Swift's modern concurrency model introduced in Swift 5.5. It makes asynchronous code look and behave like synchronous code.
|
||||
|
||||
## Basic Example
|
||||
|
||||
```swift
|
||||
// Old way with completion handlers
|
||||
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
|
||||
URLSession.shared.dataTask(with: url) { data, response, error in
|
||||
if let error = error {
|
||||
completion(.failure(error))
|
||||
} else if let data = data {
|
||||
completion(.success(data))
|
||||
}
|
||||
}.resume()
|
||||
}
|
||||
|
||||
// New way with async/await
|
||||
func fetchData() async throws -> Data {
|
||||
let (data, _) = try await URLSession.shared.data(from: url)
|
||||
return data
|
||||
}
|
||||
```
|
||||
|
||||
## Key Benefits
|
||||
|
||||
1. **Readability**: No callback pyramids
|
||||
2. **Error handling**: Standard try/catch
|
||||
3. **Sequential logic**: Reads top-to-bottom
|
||||
4. **Cancellation**: Built-in with Task
|
||||
|
||||
## Usage
|
||||
|
||||
```swift
|
||||
Task {
|
||||
do {
|
||||
let data = try await fetchData()
|
||||
await MainActor.run {
|
||||
// Update UI
|
||||
}
|
||||
} catch {
|
||||
print("Error: \\(error)")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Much cleaner than completion handlers!
|
||||
""",
|
||||
tokens: 189,
|
||||
cost: 0.00038
|
||||
)
|
||||
|
||||
static let mockSystem = Message(
|
||||
role: .system,
|
||||
content: "Conversation cleared. Starting fresh.",
|
||||
tokens: nil,
|
||||
cost: nil
|
||||
)
|
||||
|
||||
static let mockMessages = [mockUser1, mockAssistant1, mockUser2, mockAssistant2]
|
||||
}
|
||||
|
||||
extension ModelInfo {
|
||||
static let mockModels = [
|
||||
ModelInfo(
|
||||
id: "anthropic/claude-sonnet-4",
|
||||
name: "Claude Sonnet 4",
|
||||
description: "Balanced intelligence and speed for most tasks",
|
||||
contextLength: 200_000,
|
||||
pricing: Pricing(prompt: 3.0, completion: 15.0),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: true)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "anthropic/claude-opus-4",
|
||||
name: "Claude Opus 4",
|
||||
description: "Most capable model for complex tasks",
|
||||
contextLength: 200_000,
|
||||
pricing: Pricing(prompt: 15.0, completion: 75.0),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: true)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "anthropic/claude-haiku-4",
|
||||
name: "Claude Haiku 4",
|
||||
description: "Fast and efficient for simple tasks",
|
||||
contextLength: 200_000,
|
||||
pricing: Pricing(prompt: 0.8, completion: 4.0),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: true)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "openai/gpt-4o",
|
||||
name: "GPT-4o",
|
||||
description: "OpenAI's flagship multimodal model",
|
||||
contextLength: 128_000,
|
||||
pricing: Pricing(prompt: 2.5, completion: 10.0),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: false)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "openai/gpt-4o-mini",
|
||||
name: "GPT-4o Mini",
|
||||
description: "Faster and cheaper GPT-4o variant",
|
||||
contextLength: 128_000,
|
||||
pricing: Pricing(prompt: 0.15, completion: 0.6),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: false)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "openai/o1",
|
||||
name: "o1",
|
||||
description: "Advanced reasoning model for complex problems",
|
||||
contextLength: 200_000,
|
||||
pricing: Pricing(prompt: 15.0, completion: 60.0),
|
||||
capabilities: ModelCapabilities(vision: false, tools: false, online: false)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "google/gemini-pro-1.5",
|
||||
name: "Gemini Pro 1.5",
|
||||
description: "Google's advanced multimodal model",
|
||||
contextLength: 2_000_000,
|
||||
pricing: Pricing(prompt: 1.25, completion: 5.0),
|
||||
capabilities: ModelCapabilities(vision: true, tools: true, online: false)
|
||||
),
|
||||
ModelInfo(
|
||||
id: "meta-llama/llama-3.1-405b",
|
||||
name: "Llama 3.1 405B",
|
||||
description: "Meta's largest open source model",
|
||||
contextLength: 128_000,
|
||||
pricing: Pricing(prompt: 2.7, completion: 2.7),
|
||||
capabilities: ModelCapabilities(vision: false, tools: true, online: false)
|
||||
)
|
||||
]
|
||||
}
|
||||
|
||||
extension Conversation {
|
||||
static let mockConversation1 = Conversation(
|
||||
name: "SwiftUI Discussion",
|
||||
messages: [Message.mockUser1, Message.mockAssistant1],
|
||||
createdAt: Date().addingTimeInterval(-86400), // 1 day ago
|
||||
updatedAt: Date().addingTimeInterval(-3600) // 1 hour ago
|
||||
)
|
||||
|
||||
static let mockConversation2 = Conversation(
|
||||
name: "Async/Await Tutorial",
|
||||
messages: [Message.mockUser2, Message.mockAssistant2],
|
||||
createdAt: Date().addingTimeInterval(-172800), // 2 days ago
|
||||
updatedAt: Date().addingTimeInterval(-7200) // 2 hours ago
|
||||
)
|
||||
|
||||
static let mockConversations = [mockConversation1, mockConversation2]
|
||||
}
|
||||
Reference in New Issue
Block a user