Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Export from a data file window to every bundled format, for all, filtered or selected rows.
- **Import into Table** from a data file window, into an open connection's import sheet.
- **Text Encoding** in a data file's Save As panel.
- Requesty as an AI provider, an OpenAI-compatible router.

### Changed

Expand Down
2 changes: 1 addition & 1 deletion TablePro/Core/AI/Registry/AIProviderRegistration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ enum AIProviderRegistration {
}
))

for type in [AIProviderType.openRouter, .openCode, .ollama, .llamaCpp, .mlx, .custom] {
for type in [AIProviderType.openRouter, .requesty, .openCode, .ollama, .llamaCpp, .mlx, .custom] {
var capabilities: AIProviderCapabilities = [
.chat, .models, .reasoning, .images,
.endpointConfigurable, .maxOutputTokens, .modelListFetchable
Expand Down
4 changes: 4 additions & 0 deletions TablePro/Models/AI/AIModels.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ enum AIProviderType: String, Codable, CaseIterable, Identifiable, Sendable {
case claudeAgent
case openAI
case openRouter
case requesty
case gemini
case xai
case ollama
Expand All @@ -34,6 +35,7 @@ enum AIProviderType: String, Codable, CaseIterable, Identifiable, Sendable {
case .claudeAgent: return "Claude Agent"
case .openAI: return "OpenAI"
case .openRouter: return "OpenRouter"
case .requesty: return "Requesty"
case .gemini: return "Gemini"
case .xai: return "xAI"
case .ollama: return "Ollama"
Expand All @@ -53,6 +55,7 @@ enum AIProviderType: String, Codable, CaseIterable, Identifiable, Sendable {
case .claudeAgent: return ""
case .openAI: return "https://api.openai.com"
case .openRouter: return "https://openrouter.ai/api"
case .requesty: return "https://router.requesty.ai"
case .gemini: return "https://generativelanguage.googleapis.com"
case .xai: return "https://api.x.ai"
case .ollama: return "http://localhost:11434"
Expand Down Expand Up @@ -106,6 +109,7 @@ enum AIProviderType: String, Codable, CaseIterable, Identifiable, Sendable {
case .claudeAgent: return "terminal"
case .openAI: return "cpu"
case .openRouter: return "globe"
case .requesty: return "arrow.triangle.branch"
case .gemini: return "wand.and.stars"
case .xai: return "x.circle"
case .ollama: return "desktopcomputer"
Expand Down
1 change: 1 addition & 0 deletions TableProTests/Core/AI/AIEndpointTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ struct AIEndpointTests {
#expect(chatURL("https://api.openai.com", .chatCompletions) == "https://api.openai.com/v1/chat/completions")
#expect(modelsURL("https://api.openai.com", .chatCompletions) == "https://api.openai.com/v1/models")
#expect(chatURL("https://openrouter.ai/api", .chatCompletions) == "https://openrouter.ai/api/v1/chat/completions")
#expect(chatURL("https://router.requesty.ai", .chatCompletions) == "https://router.requesty.ai/v1/chat/completions")
#expect(chatURL("https://opencode.ai/zen", .chatCompletions) == "https://opencode.ai/zen/v1/chat/completions")
#expect(chatURL("http://localhost:8080", .chatCompletions) == "http://localhost:8080/v1/chat/completions")
}
Expand Down
2 changes: 1 addition & 1 deletion TableProTests/Core/AI/AIProviderCapabilitiesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ struct AIProviderCapabilitiesTests {

@Test("HTTP API-key providers accept max output tokens, a configurable endpoint, and model fetch")
func standardHTTPProviders() {
for type in [AIProviderType.openAI, .claude, .gemini, .xai, .openRouter, .ollama] {
for type in [AIProviderType.openAI, .claude, .gemini, .xai, .openRouter, .requesty, .ollama] {
let provider = descriptor(type)
#expect(provider?.allowsMaxOutputTokens == true, "\(type.rawValue) should accept max output tokens")
#expect(provider?.allowsEndpointConfiguration == true, "\(type.rawValue) should allow endpoint config")
Expand Down
2 changes: 1 addition & 1 deletion docs/security/privacy.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ On iPhone and iPad the heartbeat is off until you choose **Share Usage Data**, a

Nothing reaches a model until you add a provider, and a fresh install has none: with none configured, every AI path returns before it builds a request. **Enable AI Features** in **Settings > AI** is on out of the box, but it gates an empty tab.

One provider is marked active and answers inline suggestions and the editor actions; the chat panel's own model picker can send a turn to any other provider you configured. Requests go to that provider's endpoint. The presets are `api.anthropic.com`, `api.openai.com`, `generativelanguage.googleapis.com`, `api.x.ai`, `openrouter.ai`, `api.cursor.com` and `opencode.ai`, plus `http://localhost:11434` for Ollama and `http://localhost:8080` for llama.cpp and MLX, which keeps their traffic on the machine. Every endpoint field is editable, and a custom provider goes wherever you point it.
One provider is marked active and answers inline suggestions and the editor actions; the chat panel's own model picker can send a turn to any other provider you configured. Requests go to that provider's endpoint. The presets are `api.anthropic.com`, `api.openai.com`, `generativelanguage.googleapis.com`, `api.x.ai`, `openrouter.ai`, `router.requesty.ai`, `api.cursor.com` and `opencode.ai`, plus `http://localhost:11434` for Ollama and `http://localhost:8080` for llama.cpp and MLX, which keeps their traffic on the machine. Every endpoint field is editable, and a custom provider goes wherever you point it.

A chat turn carries:

Expand Down