Skip to content

Commit af66d90

Browse files
authored
Merge pull request #444 from phantom5099/main
pref:清洗phantom5099以及xgo的问题代码
2 parents 6e4ecc1 + 98ab3b8 commit af66d90

20 files changed

Lines changed: 83 additions & 196 deletions

internal/config/atomic_write.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package config
22

33
import (
4-
"bytes"
54
"errors"
65
"fmt"
76
"os"
@@ -12,12 +11,11 @@ import (
1211

1312
var (
1413
atomicCreateTemp = os.CreateTemp
15-
atomicReadFile = os.ReadFile
1614
atomicRename = os.Rename
1715
atomicGOOS = runtime.GOOS
1816
)
1917

20-
// writeFileAtomically 通过同目录临时文件与原子替换写入目标文件,并在写后做回读校验
18+
// writeFileAtomically 通过同目录临时文件与原子替换写入目标文件。
2119
func writeFileAtomically(path string, data []byte, perm os.FileMode) error {
2220
dir := filepath.Dir(path)
2321
pattern := "." + filepath.Base(path) + ".tmp-*"
@@ -53,13 +51,6 @@ func writeFileAtomically(path string, data []byte, perm os.FileMode) error {
5351
}
5452
cleanupTemp = false
5553

56-
written, err := atomicReadFile(path)
57-
if err != nil {
58-
return fmt.Errorf("read back written file: %w", err)
59-
}
60-
if !bytes.Equal(written, data) {
61-
return errors.New("read back mismatch")
62-
}
6354
if err := fsyncDirectory(dir); err != nil {
6455
return fmt.Errorf("sync target directory: %w", err)
6556
}

internal/config/context_budget_migration_test.go

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -260,50 +260,12 @@ context:
260260
}
261261
}
262262

263-
func TestMigrateContextBudgetConfigFileKeepsOriginalWhenBackupVerificationFails(t *testing.T) {
264-
dir := t.TempDir()
265-
target := filepath.Join(dir, configName)
266-
original := strings.TrimSpace(`
267-
context:
268-
auto_compact:
269-
input_token_threshold: 120000
270-
`) + "\n"
271-
if err := os.WriteFile(target, []byte(original), 0o644); err != nil {
272-
t.Fatalf("write target: %v", err)
273-
}
274-
275-
restore := stubAtomicWriteOps(t)
276-
defer restore()
277-
readCount := 0
278-
atomicReadFile = func(path string) ([]byte, error) {
279-
readCount++
280-
if readCount == 1 {
281-
return []byte("corrupted"), nil
282-
}
283-
return os.ReadFile(path)
284-
}
285-
286-
_, err := MigrateContextBudgetConfigFile(target, false)
287-
if err == nil || !strings.Contains(err.Error(), "read back mismatch") {
288-
t.Fatalf("expected read back mismatch error, got %v", err)
289-
}
290-
raw, readErr := os.ReadFile(target)
291-
if readErr != nil {
292-
t.Fatalf("read target: %v", readErr)
293-
}
294-
if string(raw) != original {
295-
t.Fatalf("expected original config to stay unchanged, got:\n%s", raw)
296-
}
297-
}
298-
299263
func stubAtomicWriteOps(t *testing.T) func() {
300264
t.Helper()
301265
prevCreateTemp := atomicCreateTemp
302-
prevReadFile := atomicReadFile
303266
prevRename := atomicRename
304267
return func() {
305268
atomicCreateTemp = prevCreateTemp
306-
atomicReadFile = prevReadFile
307269
atomicRename = prevRename
308270
}
309271
}

internal/config/manager.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,8 @@ func (m *Manager) ConfigPath() string {
9292
return m.loader.ConfigPath()
9393
}
9494

95-
// LockProviderCreate 锁定自定义 Provider 创建事务,确保同一 Manager 维度串行执行
96-
func (m *Manager) LockProviderCreate() {
95+
// AcquireProviderCreateLock 锁定自定义 Provider 创建事务,返回释放函数
96+
func (m *Manager) AcquireProviderCreateLock() func() {
9797
m.providerCreateMu.Lock()
98-
}
99-
100-
// UnlockProviderCreate 释放自定义 Provider 创建事务锁。
101-
func (m *Manager) UnlockProviderCreate() {
102-
m.providerCreateMu.Unlock()
98+
return m.providerCreateMu.Unlock
10399
}

internal/config/provider.go

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ func resolveRuntimeAPIKey(envName string) (string, error) {
261261
if exists {
262262
trimmedUserValue := strings.TrimSpace(userValue)
263263
if trimmedUserValue != "" {
264-
_ = os.Setenv(envName, trimmedUserValue)
265264
return trimmedUserValue, nil
266265
}
267266
}
@@ -369,14 +368,13 @@ const (
369368
ModelScopeDefaultAPIKeyEnv = "MODELSCOPE_API_KEY"
370369
)
371370

372-
// OpenAIProvider returns the builtin OpenAI provider definition.
373-
func OpenAIProvider() ProviderConfig {
371+
func newBuiltinOpenAICompatProvider(name, baseURL, model, apiKeyEnv string) ProviderConfig {
374372
return ProviderConfig{
375-
Name: OpenAIName,
373+
Name: name,
376374
Driver: provider.DriverOpenAICompat,
377-
BaseURL: OpenAIDefaultBaseURL,
378-
Model: OpenAIDefaultModel,
379-
APIKeyEnv: OpenAIDefaultAPIKeyEnv,
375+
BaseURL: baseURL,
376+
Model: model,
377+
APIKeyEnv: apiKeyEnv,
380378
ModelSource: ModelSourceDiscover,
381379
ChatAPIMode: provider.ChatAPIModeChatCompletions,
382380
ChatEndpointPath: "/chat/completions",
@@ -385,6 +383,11 @@ func OpenAIProvider() ProviderConfig {
385383
}
386384
}
387385

386+
// OpenAIProvider returns the builtin OpenAI provider definition.
387+
func OpenAIProvider() ProviderConfig {
388+
return newBuiltinOpenAICompatProvider(OpenAIName, OpenAIDefaultBaseURL, OpenAIDefaultModel, OpenAIDefaultAPIKeyEnv)
389+
}
390+
388391
// GeminiProvider returns the builtin Gemini provider definition.
389392
func GeminiProvider() ProviderConfig {
390393
return ProviderConfig{
@@ -402,50 +405,17 @@ func GeminiProvider() ProviderConfig {
402405

403406
// OpenLLProvider returns the builtin OpenLL provider definition.
404407
func OpenLLProvider() ProviderConfig {
405-
return ProviderConfig{
406-
Name: OpenLLName,
407-
Driver: provider.DriverOpenAICompat,
408-
BaseURL: OpenLLDefaultBaseURL,
409-
Model: OpenLLDefaultModel,
410-
APIKeyEnv: OpenLLDefaultAPIKeyEnv,
411-
ModelSource: ModelSourceDiscover,
412-
ChatAPIMode: provider.ChatAPIModeChatCompletions,
413-
ChatEndpointPath: "/chat/completions",
414-
DiscoveryEndpointPath: provider.DiscoveryEndpointPathModels,
415-
Source: ProviderSourceBuiltin,
416-
}
408+
return newBuiltinOpenAICompatProvider(OpenLLName, OpenLLDefaultBaseURL, OpenLLDefaultModel, OpenLLDefaultAPIKeyEnv)
417409
}
418410

419411
// QiniuProvider returns the builtin Qiniu provider definition.
420412
func QiniuProvider() ProviderConfig {
421-
return ProviderConfig{
422-
Name: QiniuName,
423-
Driver: provider.DriverOpenAICompat,
424-
BaseURL: QiniuDefaultBaseURL,
425-
Model: QiniuDefaultModel,
426-
APIKeyEnv: QiniuDefaultAPIKeyEnv,
427-
ModelSource: ModelSourceDiscover,
428-
ChatAPIMode: provider.ChatAPIModeChatCompletions,
429-
ChatEndpointPath: "/chat/completions",
430-
DiscoveryEndpointPath: provider.DiscoveryEndpointPathModels,
431-
Source: ProviderSourceBuiltin,
432-
}
413+
return newBuiltinOpenAICompatProvider(QiniuName, QiniuDefaultBaseURL, QiniuDefaultModel, QiniuDefaultAPIKeyEnv)
433414
}
434415

435416
// ModelScopeProvider 返回内置的 ModelScope provider 配置。
436417
func ModelScopeProvider() ProviderConfig {
437-
return ProviderConfig{
438-
Name: ModelScopeName,
439-
Driver: provider.DriverOpenAICompat,
440-
BaseURL: ModelScopeDefaultBaseURL,
441-
Model: ModelScopeDefaultModel,
442-
APIKeyEnv: ModelScopeDefaultAPIKeyEnv,
443-
ModelSource: ModelSourceDiscover,
444-
ChatAPIMode: provider.ChatAPIModeChatCompletions,
445-
ChatEndpointPath: "/chat/completions",
446-
DiscoveryEndpointPath: provider.DiscoveryEndpointPathModels,
447-
Source: ProviderSourceBuiltin,
448-
}
418+
return newBuiltinOpenAICompatProvider(ModelScopeName, ModelScopeDefaultBaseURL, ModelScopeDefaultModel, ModelScopeDefaultAPIKeyEnv)
449419
}
450420

451421
// DefaultProviders returns all builtin provider definitions.

internal/config/provider_custom_normalize.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,6 @@ func NormalizeCustomProviderInput(input SaveCustomProviderInput) (SaveCustomProv
9999
return normalized, nil
100100
}
101101

102-
if requiresDiscoveryEndpointPath(normalized.Driver) && strings.TrimSpace(discoveryEndpointPath) == "" {
103-
return SaveCustomProviderInput{}, fmt.Errorf(
104-
"config: provider %q model_source discover requires discovery_endpoint_path; "+
105-
"if provider does not expose discover endpoint, set model_source to manual",
106-
normalized.Name,
107-
)
108-
}
109102
normalized.DiscoveryEndpointPath = discoveryEndpointPath
110103
return normalized, nil
111104
}

internal/config/provider_windows_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ func TestProviderConfigResolveAPIKeyFallsBackToUserEnv(t *testing.T) {
5353
if got != envValue {
5454
t.Fatalf("ResolveAPIKey() = %q, want %q", got, envValue)
5555
}
56-
if processGot := os.Getenv(envName); processGot != envValue {
57-
t.Fatalf("expected process env synchronized to %q, got %q", envValue, processGot)
58-
}
5956
}
6057

6158
func containsPermissionDenied(err error) bool {

internal/config/state/service_provider_create.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ func (s *Service) CreateCustomProvider(ctx context.Context, input CreateCustomPr
7575
return Selection{}, err
7676
}
7777

78-
s.manager.LockProviderCreate()
79-
defer s.manager.UnlockProviderCreate()
78+
releaseProviderLock := s.manager.AcquireProviderCreateLock()
79+
defer releaseProviderLock()
8080

8181
releaseCrossProcessLock, err := lockProviderCreateCrossProcess(ctx, s.manager.BaseDir())
8282
if err != nil {

internal/runtime/errors_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package runtime
22

33
import (
44
"bytes"
5-
"context"
65
"errors"
76
"log"
87
"testing"
@@ -32,7 +31,7 @@ func TestHandleRunErrorProviderErrorDoesNotWriteStdLog(t *testing.T) {
3231
log.SetPrefix(oldPrefix)
3332
})
3433

35-
err := service.handleRunError(context.Background(), "run-1", "session-1", providerErr)
34+
err := service.handleRunError(providerErr)
3635
if !errors.Is(err, providerErr) {
3736
t.Fatalf("expected provider error passthrough, got %v", err)
3837
}

internal/runtime/event_emitter.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@ func (s *Service) emit(ctx context.Context, kind EventType, runID string, sessio
2222
})
2323
}
2424

25-
// emitRunScoped 携带当前 run 的 turn/phase 元数据发出事件。
26-
func (s *Service) emitRunScoped(ctx context.Context, kind EventType, state *runState, payload any) error {
25+
// emitRunScoped 携带当前 run 的 turn/phase 元数据发出事件。事件投递为 best-effort,不返回错误。
26+
func (s *Service) emitRunScoped(ctx context.Context, kind EventType, state *runState, payload any) {
2727
if state == nil {
28-
return s.emit(ctx, kind, "", "", payload)
28+
_ = s.emit(ctx, kind, "", "", payload)
29+
return
2930
}
3031
phase := ""
3132
if state.lifecycle != "" {
3233
phase = string(state.lifecycle)
3334
}
34-
return s.emitWithEnvelope(ctx, RuntimeEvent{
35+
_ = s.emitWithEnvelope(ctx, RuntimeEvent{
3536
Type: kind,
3637
RunID: state.runID,
3738
SessionID: state.session.ID,

internal/runtime/repository_context.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func (s *Service) emitRepositoryContextUnavailable(
163163
if s == nil || s.events == nil || err == nil {
164164
return
165165
}
166-
_ = s.emitRunScoped(ctx, EventRepositoryContextUnavailable, state, RepositoryContextUnavailablePayload{
166+
s.emitRunScoped(ctx, EventRepositoryContextUnavailable, state, RepositoryContextUnavailablePayload{
167167
Stage: strings.TrimSpace(stage),
168168
Mode: strings.TrimSpace(mode),
169169
Reason: strings.TrimSpace(err.Error()),

0 commit comments

Comments
 (0)