Skip to content

Commit b5bdca4

Browse files
committed
Merge branch 'feature/tabby-strategy' into develop
2 parents 8baddf7 + af9419f commit b5bdca4

3 files changed

Lines changed: 73 additions & 4 deletions

File tree

Core/Sources/CodeCompletionService/TabbyService.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,19 @@ extension TabbyService: CodeCompletionServiceType {
3030
func getCompletion(_ request: PromptStrategy) async throws -> AsyncStream<String> {
3131
let prefix = request.prefix.joined()
3232
let suffix = request.suffix.joined()
33-
let clipboard = request.relevantCodeSnippets.map(\.content).joined(separator: "\n\n")
3433
let requestBody = RequestBody(
3534
language: request.language?.rawValue,
3635
segments: .init(
37-
prefix: clipboard + "\n\n" + prefix,
36+
prefix: prefix,
3837
suffix: suffix,
39-
clipboard: clipboard // it's seems to be ignored by Tabby
38+
clipboard: ""
4039
),
4140
temperature: temperature,
4241
seed: nil
4342
)
4443
CodeCompletionLogger.logger.logPrompt([
4544
(prefix, "prefix"),
4645
(suffix, "suffix"),
47-
(clipboard, "clipboard"),
4846
])
4947
return AsyncStream<String> { continuation in
5048
let task = Task {
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import CopilotForXcodeKit
2+
import Foundation
3+
import Fundamental
4+
5+
/// A special strategy for Tabby.
6+
struct TabbyRequestStrategy: RequestStrategy {
7+
var sourceRequest: SuggestionRequest
8+
var prefix: [String]
9+
var suffix: [String]
10+
11+
var shouldSkip: Bool {
12+
prefix.last?.trimmingCharacters(in: .whitespaces) == "}"
13+
}
14+
15+
func createPrompt() -> Prompt {
16+
Prompt(
17+
sourceRequest: sourceRequest,
18+
prefix: prefix,
19+
suffix: suffix
20+
)
21+
}
22+
23+
func createRawSuggestionPostProcessor() -> some RawSuggestionPostProcessingStrategy {
24+
NoOpRawSuggestionPostProcessingStrategy()
25+
}
26+
27+
struct Prompt: PromptStrategy {
28+
let systemPrompt: String = ""
29+
var sourceRequest: SuggestionRequest
30+
var prefix: [String]
31+
var suffix: [String]
32+
var filePath: String { sourceRequest.relativePath ?? sourceRequest.fileURL.path }
33+
var relevantCodeSnippets: [RelevantCodeSnippet] { sourceRequest.relevantCodeSnippets }
34+
var stopWords: [String] { [] }
35+
var language: CodeLanguage? { sourceRequest.language }
36+
37+
var suggestionPrefix: SuggestionPrefix {
38+
guard let prefix = prefix.last else { return .empty }
39+
return .unchanged(prefix)
40+
}
41+
42+
init(sourceRequest: SuggestionRequest, prefix: [String], suffix: [String]) {
43+
self.sourceRequest = sourceRequest
44+
45+
let prefix = sourceRequest.relevantCodeSnippets.map { $0.content + "\n\n" }
46+
+ prefix
47+
48+
self.prefix = prefix
49+
self.suffix = suffix
50+
}
51+
52+
/// Not used by ``TabbyService``.
53+
func createPrompt(
54+
truncatedPrefix: [String],
55+
truncatedSuffix: [String],
56+
includedSnippets: [RelevantCodeSnippet]
57+
) -> [PromptMessage] {
58+
[]
59+
}
60+
}
61+
}
62+

Core/Sources/SuggestionService/Service.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,15 @@ actor Service {
128128
suffix: [String]
129129
) -> any RequestStrategy {
130130
let id = UserDefaults.shared.value(for: \.requestStrategyId)
131+
if let type = CustomModelType(rawValue: UserDefaults.shared.value(for: \.chatModelId)),
132+
type == .tabby
133+
{
134+
return TabbyRequestStrategy(
135+
sourceRequest: sourceRequest,
136+
prefix: prefix,
137+
suffix: suffix
138+
)
139+
}
131140
let strategyOption = RequestStrategyOption(rawValue: id) ?? .default
132141
return strategyOption.strategy.init(
133142
sourceRequest: sourceRequest,

0 commit comments

Comments
 (0)