mirror of
https://github.com/lukaszraczylo/traefik-llmgateway.git
synced 2026-10-20 05:56:56 +00:00
fix(integration): green gate with tracked streaming skip, gemini coverage, robust probe
Addresses coordinator review of the Task 15 integration suite: 1 critical ruling, 5 important, 3 folded. make integration now exits 0. - integration_test.go: TestStreamingIncrementalityProbe restructured — content assertion (5 deltas + [DONE], in order) always runs; the raw-TCP timing assertion (unchanged, >=3 gaps >=100ms) is gated behind INTEGRATION_STREAMING=1 with t.Skipf naming traefik/traefik#10269, verified to still genuinely fail when re-armed (not silently disabled). - Makefile: integration-up/integration-wait moved from prerequisites into the integration recipe body as go test ./... -count=1 ok github.com/lukaszraczylo/traefik-llmgateway 6.065s sub-invocations with per-stage status capture, so integration-down always runs even when bring-up or the health wait fails; verified with a synthetic failure. Added .NOTPARALLEL (the integration targets are stateful). - translate_gemini.go: fixed the same yaegi multi-value-assignment panic shape as the prior sse.go fix, on the live max_tokens path. Added a gemini chat completion assertion to integration_test.go (renamed TestUnifiedChatAllProviders) so this path now runs under real Yaegi. - providers.go, translate_anthropic.go: documented the never-wrap contract on providerHTTPError/translateError (routes_unified.go asserts their concrete type directly; errors.As panics under yaegi on these). - integration_test.go: TestCrossReplicaLimits now FLUSHALLs Redis first, for idempotence under integration-keep. - mock/main.go: probe's header-terminator search now accumulates a rolling buffer across reads instead of only checking the latest one. - Folded: hot-reload deadline 10s -> 20s; dynamic.yml's real-upstream baseUrl is now a template (dynamic.yml.tmpl) rendered via INTEGRATION_REAL_BASEURL (default https://llmgw.example.com), not a hardcoded-only hostname. See task-15-report.md's addendum for full verification detail.
This commit is contained in:
+12
-2
@@ -363,13 +363,23 @@ func geminiRequestFromOpenAI(req map[string]any) (map[string]any, error) {
|
||||
genConfig := map[string]any{}
|
||||
var maxTokens int64
|
||||
var hasMaxTokens bool
|
||||
// maxTokens and hasMaxTokens are set as two separate statements, not one
|
||||
// "maxTokens, hasMaxTokens = n, true" multi-value assignment: yaegi
|
||||
// v0.16.1 panics interpreting a multi-value assignment mixing a
|
||||
// variable and a literal in one statement on this exact live path (the
|
||||
// same class of bug as sse.go's readSSE dispatch and registry.go's
|
||||
// resolveAgainst — see those files' comments). Verified empirically
|
||||
// under real Traefik (Task 15's integration suite, the gemini chat
|
||||
// completion path).
|
||||
if v, ok := req["max_completion_tokens"]; ok {
|
||||
if n, ok2 := toInt64(v); ok2 {
|
||||
maxTokens, hasMaxTokens = n, true
|
||||
maxTokens = n
|
||||
hasMaxTokens = true
|
||||
}
|
||||
} else if v, ok := req["max_tokens"]; ok {
|
||||
if n, ok2 := toInt64(v); ok2 {
|
||||
maxTokens, hasMaxTokens = n, true
|
||||
maxTokens = n
|
||||
hasMaxTokens = true
|
||||
}
|
||||
}
|
||||
if hasMaxTokens {
|
||||
|
||||
Reference in New Issue
Block a user