





















@@ -21,6 +21,7 @@ const resolveAgentWorkspaceDirMock = vi.fn();
2121const listAgentEntriesMock = vi.fn();
2222const prepareProviderRuntimeAuthMock = vi.fn();
2323const registerProviderStreamForModelMock = vi.fn();
24+const resolveEmbeddedAgentStreamFnMock = vi.fn();
2425const diagDebugMock = vi.fn();
25262627vi.mock("@earendil-works/pi-ai", async () => {
@@ -85,6 +86,10 @@ vi.mock("./provider-stream.js", () => ({
8586registerProviderStreamForModelMock(...args),
8687}));
878889+vi.mock("./pi-embedded-runner/stream-resolution.js", () => ({
90+resolveEmbeddedAgentStreamFn: (...args: unknown[]) => resolveEmbeddedAgentStreamFnMock(...args),
91+}));
92+8893vi.mock("./auth-profiles/session-override.js", () => ({
8994resolveSessionAuthProfileOverride: (...args: unknown[]) =>
9095resolveSessionAuthProfileOverrideMock(...args),
@@ -372,6 +377,7 @@ describe("runBtwSideQuestion", () => {
372377listAgentEntriesMock.mockReset();
373378prepareProviderRuntimeAuthMock.mockReset();
374379registerProviderStreamForModelMock.mockReset();
380+resolveEmbeddedAgentStreamFnMock.mockReset();
375381diagDebugMock.mockReset();
376382clearAgentHarnesses();
377383@@ -409,6 +415,11 @@ describe("runBtwSideQuestion", () => {
409415listAgentEntriesMock.mockReturnValue([]);
410416prepareProviderRuntimeAuthMock.mockResolvedValue(undefined);
411417registerProviderStreamForModelMock.mockReturnValue(undefined);
418+resolveEmbeddedAgentStreamFnMock.mockImplementation(
419+(params: { currentStreamFn: unknown; providerStreamFn?: unknown }) => {
420+return params.providerStreamFn ?? params.currentStreamFn;
421+},
422+);
412423});
413424414425it("streams blocks without persisting BTW data to disk", async () => {
@@ -663,13 +674,58 @@ describe("runBtwSideQuestion", () => {
663674expect(streamSimpleMock).not.toHaveBeenCalled();
664675});
665676666-it("falls back to streamSimple when no provider stream fn is registered", async () => {
677+it("routes MiniMax Anthropic fallback streams through the embedded resolver", async () => {
678+resolveModelWithRegistryMock.mockReturnValue({
679+provider: "minimax-portal",
680+id: "MiniMax-M2.7",
681+api: "anthropic-messages",
682+baseUrl: "https://api.minimax.io/anthropic",
683+maxTokens: 196_608,
684+});
685+registerProviderStreamForModelMock.mockReturnValue(undefined);
686+const resolvedStreamFn = vi
687+.fn()
688+.mockReturnValue(makeAsyncEvents([createDoneEvent("MiniMax answer.")]));
689+resolveEmbeddedAgentStreamFnMock.mockReturnValueOnce(resolvedStreamFn);
690+691+const result = await runSideQuestion({
692+provider: "minimax-portal",
693+model: "MiniMax-M2.7",
694+});
695+696+expect(result).toEqual({ text: "MiniMax answer." });
697+const resolverParams = expectRecordFields(mockArg(resolveEmbeddedAgentStreamFnMock, 0, 0), {
698+sessionId: "session-1",
699+resolvedApiKey: "secret",
700+authProfileId: "profile-1",
701+});
702+expect(resolverParams.providerStreamFn).toBeUndefined();
703+expectRecordFields(resolverParams.model, {
704+provider: "minimax-portal",
705+id: "MiniMax-M2.7",
706+api: "anthropic-messages",
707+maxTokens: 196_608,
708+});
709+expect(resolvedStreamFn).toHaveBeenCalledTimes(1);
710+expect(streamSimpleMock).not.toHaveBeenCalled();
711+});
712+713+it("uses the embedded resolver fallback when no provider stream fn is registered", async () => {
667714registerProviderStreamForModelMock.mockReturnValue(undefined);
668715mockDoneAnswer("Fallback answer.");
669716670717const result = await runSideQuestion();
671718672719expect(result).toEqual({ text: "Fallback answer." });
720+expect(resolveEmbeddedAgentStreamFnMock).toHaveBeenCalledWith(
721+expect.objectContaining({
722+currentStreamFn: expect.any(Function),
723+providerStreamFn: undefined,
724+sessionId: "session-1",
725+resolvedApiKey: "secret",
726+authProfileId: "profile-1",
727+}),
728+);
673729expect(streamSimpleMock).toHaveBeenCalledTimes(1);
674730});
675731此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。