Skip to content

Commit 9890a51

Browse files
tighten lint config and remove dead planning paths
1 parent ee2096f commit 9890a51

7 files changed

Lines changed: 106 additions & 16 deletions

File tree

.golangci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ version: "2"
22
linters:
33
enable:
44
- dupl
5+
- errcheck
6+
- govet
7+
- ineffassign
8+
- staticcheck
9+
- unused
510
settings:
611
dupl:
712
threshold: 100

internal/auditlog/auditlog_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,44 @@ func TestMiddleware_PrefersExecutionPlanOverLegacyResolution(t *testing.T) {
460460
}
461461
}
462462

463+
func TestMiddleware_UsesExecutionPlanRequestID(t *testing.T) {
464+
e := echo.New()
465+
logger := &capturingLogger{
466+
cfg: Config{Enabled: true},
467+
}
468+
469+
req := httptest.NewRequest(http.MethodPost, "/v1/chat/completions", strings.NewReader(`{"model":"gpt-5-nano"}`))
470+
req.Header.Set("X-Request-ID", "header-req-id")
471+
req = req.WithContext(core.WithExecutionPlan(req.Context(), &core.ExecutionPlan{
472+
RequestID: "plan-req-id",
473+
ProviderType: "openai",
474+
Resolution: &core.RequestModelResolution{
475+
RequestedModel: "gpt-5-nano",
476+
ResolvedSelector: core.ModelSelector{Provider: "openai", Model: "gpt-5-nano"},
477+
ProviderType: "openai",
478+
},
479+
}))
480+
481+
rec := httptest.NewRecorder()
482+
c := e.NewContext(req, rec)
483+
484+
handler := Middleware(logger)(func(c *echo.Context) error {
485+
return c.NoContent(http.StatusNoContent)
486+
})
487+
488+
if err := handler(c); err != nil {
489+
t.Fatalf("handler returned error: %v", err)
490+
}
491+
if len(logger.entries) != 1 {
492+
t.Fatalf("len(entries) = %d, want 1", len(logger.entries))
493+
}
494+
495+
entry := logger.entries[0]
496+
if entry.RequestID != "plan-req-id" {
497+
t.Fatalf("RequestID = %q, want plan-req-id", entry.RequestID)
498+
}
499+
}
500+
463501
func TestMiddleware_DoesNotApplyModelMetadataWithoutExecutionPlan(t *testing.T) {
464502
e := echo.New()
465503
logger := &capturingLogger{

internal/auditlog/middleware.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,9 @@ func enrichEntryWithExecutionPlan(entry *LogEntry, plan *core.ExecutionPlan) {
171171
return
172172
}
173173

174+
if requestID := strings.TrimSpace(plan.RequestID); requestID != "" {
175+
entry.RequestID = requestID
176+
}
174177
if requestedModel := plan.RequestedQualifiedModel(); requestedModel != "" {
175178
entry.Model = requestedModel
176179
}

internal/server/handlers_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4401,6 +4401,60 @@ func TestCreateFile(t *testing.T) {
44014401
}
44024402
}
44034403

4404+
func TestCreateFileWithExplicitProviderDoesNotRequireProviderInventory(t *testing.T) {
4405+
base := &mockProvider{
4406+
fileCreateResponse: &core.FileObject{
4407+
ID: "file_ok_1",
4408+
Object: "file",
4409+
Bytes: 16,
4410+
CreatedAt: 1000,
4411+
Filename: "requests.jsonl",
4412+
Purpose: "batch",
4413+
Provider: "openai",
4414+
},
4415+
}
4416+
4417+
provider := &providerWithoutFileInventory{inner: base}
4418+
e := echo.New()
4419+
handler := NewHandler(provider, nil, nil, nil)
4420+
4421+
var body bytes.Buffer
4422+
writer := multipart.NewWriter(&body)
4423+
if err := writer.WriteField("purpose", "batch"); err != nil {
4424+
t.Fatalf("write purpose: %v", err)
4425+
}
4426+
if err := writer.WriteField("provider", "openai"); err != nil {
4427+
t.Fatalf("write provider: %v", err)
4428+
}
4429+
part, err := writer.CreateFormFile("file", "requests.jsonl")
4430+
if err != nil {
4431+
t.Fatalf("create form file: %v", err)
4432+
}
4433+
if _, err := part.Write([]byte("{\"custom_id\":\"1\"}\n")); err != nil {
4434+
t.Fatalf("write form file: %v", err)
4435+
}
4436+
if err := writer.Close(); err != nil {
4437+
t.Fatalf("close multipart writer: %v", err)
4438+
}
4439+
4440+
req := httptest.NewRequest(http.MethodPost, "/v1/files", &body)
4441+
req.Header.Set("Content-Type", writer.FormDataContentType())
4442+
frame := core.NewRequestSnapshot(http.MethodPost, "/v1/files", nil, nil, nil, writer.FormDataContentType(), nil, false, "", nil)
4443+
req = withRequestSnapshotAndPrompt(req, frame)
4444+
rec := httptest.NewRecorder()
4445+
c := e.NewContext(req, rec)
4446+
4447+
if err := handler.CreateFile(c); err != nil {
4448+
t.Fatalf("handler returned error: %v", err)
4449+
}
4450+
if rec.Code != http.StatusOK {
4451+
t.Fatalf("expected status 200, got %d", rec.Code)
4452+
}
4453+
if len(base.capturedFileCreateReqs) != 1 {
4454+
t.Fatalf("len(capturedFileCreateReqs) = %d, want 1", len(base.capturedFileCreateReqs))
4455+
}
4456+
}
4457+
44044458
func TestGetDeleteAndContentFile(t *testing.T) {
44054459
mock := &mockProvider{
44064460
supportedModels: []string{"gpt-4o-mini"},

internal/server/model_validation.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ func ExecutionPlanningWithResolver(provider core.RoutableProvider, resolver Requ
4545
}
4646
}
4747

48-
// ModelValidation is kept as a compatibility wrapper while the rest of the
49-
// server migrates to the explicit execution-plan terminology.
50-
func ModelValidation(provider core.RoutableProvider) echo.MiddlewareFunc {
51-
return ExecutionPlanning(provider)
52-
}
53-
5448
func deriveExecutionPlan(c *echo.Context, provider core.RoutableProvider, resolver RequestModelResolver) (*core.ExecutionPlan, error) {
5549
if c == nil {
5650
return nil, nil
@@ -106,9 +100,6 @@ func deriveExecutionPlan(c *echo.Context, provider core.RoutableProvider, resolv
106100
if !parsed || resolution == nil {
107101
return plan, nil
108102
}
109-
if counted, ok := provider.(modelCountProvider); ok && counted.ModelCount() == 0 {
110-
return nil, core.NewProviderError("", 0, "model registry not initialized", nil)
111-
}
112103
plan.ProviderType = resolution.ProviderType
113104
plan.Resolution = resolution
114105
auditlog.EnrichEntryWithExecutionPlan(c, plan)
@@ -242,7 +233,7 @@ func passthroughRouteInfo(c *echo.Context) *core.PassthroughRouteInfo {
242233
}
243234
}
244235

245-
// GetProviderType returns the provider type set by ModelValidation for this request.
236+
// GetProviderType returns the provider type captured in the execution plan for this request.
246237
func GetProviderType(c *echo.Context) string {
247238
if plan := core.GetExecutionPlan(c.Request().Context()); plan != nil {
248239
if providerType := strings.TrimSpace(plan.ProviderType); providerType != "" {

internal/server/native_file_service.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,12 @@ func (s *nativeFileService) CreateFile(c *echo.Context) error {
100100
return handleError(c, err)
101101
}
102102

103-
providers, err := s.providerTypes()
104-
if err != nil {
105-
return handleError(c, err)
106-
}
107-
108103
providerType := fileReq.Provider
109104
if providerType == "" {
105+
providers, err := s.providerTypes()
106+
if err != nil {
107+
return handleError(c, err)
108+
}
110109
if len(providers) == 1 {
111110
providerType = providers[0]
112111
} else if len(providers) == 0 {

internal/server/request_snapshot_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ func TestModelValidation_UsesSemanticEnvelopeWithoutReadingBody(t *testing.T) {
192192
rec := httptest.NewRecorder()
193193
c := e.NewContext(req, rec)
194194

195-
handler := ModelValidation(provider)(func(c *echo.Context) error {
195+
handler := ExecutionPlanning(provider)(func(c *echo.Context) error {
196196
return c.String(http.StatusOK, "ok")
197197
})
198198

0 commit comments

Comments
 (0)