test(opencode): stabilize prompt concurrency tests (#33522)
This commit is contained in:
@@ -994,9 +994,7 @@ it.instance(
|
|||||||
|
|
||||||
// Cancel semantics
|
// Cancel semantics
|
||||||
|
|
||||||
it.instance(
|
it.instance("cancel interrupts loop and resolves with an assistant message", () =>
|
||||||
"cancel interrupts loop and resolves with an assistant message",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -1010,19 +1008,16 @@ it.instance(
|
|||||||
|
|
||||||
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(chat.id)
|
||||||
yield* prompt.cancel(chat.id)
|
yield* prompt.cancel(chat.id)
|
||||||
const exit = yield* Fiber.await(fiber)
|
const exit = yield* Fiber.await(fiber)
|
||||||
expect(Exit.isSuccess(exit)).toBe(true)
|
expect(Exit.isSuccess(exit)).toBe(true)
|
||||||
if (Exit.isSuccess(exit)) {
|
if (Exit.isSuccess(exit)) {
|
||||||
expect(exit.value.info.role).toBe("assistant")
|
expect(exit.value.info.role).toBe("assistant")
|
||||||
}
|
}
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
it.instance(
|
it.instance("cancel records MessageAbortedError on interrupted process", () =>
|
||||||
"cancel records MessageAbortedError on interrupted process",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -1033,6 +1028,7 @@ it.instance(
|
|||||||
|
|
||||||
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(chat.id)
|
||||||
yield* prompt.cancel(chat.id)
|
yield* prompt.cancel(chat.id)
|
||||||
const exit = yield* Fiber.await(fiber)
|
const exit = yield* Fiber.await(fiber)
|
||||||
expect(Exit.isSuccess(exit)).toBe(true)
|
expect(Exit.isSuccess(exit)).toBe(true)
|
||||||
@@ -1042,9 +1038,7 @@ it.instance(
|
|||||||
expect(info.error?.name).toBe("MessageAbortedError")
|
expect(info.error?.name).toBe("MessageAbortedError")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
raceNoLLMServer.instance(
|
raceNoLLMServer.instance(
|
||||||
"finalizes assistant when cancelled before processor creation completes",
|
"finalizes assistant when cancelled before processor creation completes",
|
||||||
@@ -1262,9 +1256,7 @@ noLLMServer.instance("concurrent loop callers get same result", () =>
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
it.instance(
|
it.instance("concurrent loop callers all receive same error result", () =>
|
||||||
"concurrent loop callers all receive same error result",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -1279,13 +1271,9 @@ it.instance(
|
|||||||
})
|
})
|
||||||
expect(a.info.id).toBe(b.info.id)
|
expect(a.info.id).toBe(b.info.id)
|
||||||
expect(a.info.role).toBe("assistant")
|
expect(a.info.role).toBe("assistant")
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
it.instance(
|
it.instance("prompt submitted during an active run is included in the next LLM input", () =>
|
||||||
"prompt submitted during an active run is included in the next LLM input",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const gate = yield* Deferred.make<void>()
|
const gate = yield* Deferred.make<void>()
|
||||||
@@ -1306,6 +1294,7 @@ it.instance(
|
|||||||
.pipe(Effect.forkChild)
|
.pipe(Effect.forkChild)
|
||||||
|
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(chat.id)
|
||||||
|
|
||||||
const id = MessageID.ascending()
|
const id = MessageID.ascending()
|
||||||
const b = yield* prompt
|
const b = yield* prompt
|
||||||
@@ -1349,13 +1338,9 @@ it.instance(
|
|||||||
const messages = inputs.at(-1)?.messages
|
const messages = inputs.at(-1)?.messages
|
||||||
if (!Array.isArray(messages)) throw new Error("expected LLM messages")
|
if (!Array.isArray(messages)) throw new Error("expected LLM messages")
|
||||||
expect(messages.at(-1)).toEqual({ role: "user", content: "second" })
|
expect(messages.at(-1)).toEqual({ role: "user", content: "second" })
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
it.instance(
|
it.instance("assertNotBusy fails with BusyError when loop running", () =>
|
||||||
"assertNotBusy fails with BusyError when loop running",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -1368,6 +1353,7 @@ it.instance(
|
|||||||
|
|
||||||
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(chat.id)
|
||||||
|
|
||||||
const exit = yield* run.assertNotBusy(chat.id).pipe(Effect.exit)
|
const exit = yield* run.assertNotBusy(chat.id).pipe(Effect.exit)
|
||||||
expect(Exit.isFailure(exit)).toBe(true)
|
expect(Exit.isFailure(exit)).toBe(true)
|
||||||
@@ -1378,9 +1364,7 @@ it.instance(
|
|||||||
|
|
||||||
yield* prompt.cancel(chat.id)
|
yield* prompt.cancel(chat.id)
|
||||||
yield* Fiber.await(fiber)
|
yield* Fiber.await(fiber)
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
noLLMServer.instance("assertNotBusy succeeds when idle", () =>
|
noLLMServer.instance("assertNotBusy succeeds when idle", () =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
@@ -1395,9 +1379,7 @@ noLLMServer.instance("assertNotBusy succeeds when idle", () =>
|
|||||||
|
|
||||||
// Shell semantics
|
// Shell semantics
|
||||||
|
|
||||||
it.instance(
|
it.instance("shell rejects with BusyError when loop running", () =>
|
||||||
"shell rejects with BusyError when loop running",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -1408,6 +1390,7 @@ it.instance(
|
|||||||
|
|
||||||
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
const fiber = yield* prompt.loop({ sessionID: chat.id }).pipe(Effect.forkChild)
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(chat.id)
|
||||||
|
|
||||||
const exit = yield* prompt.shell({ sessionID: chat.id, agent: "build", command: "echo hi" }).pipe(Effect.exit)
|
const exit = yield* prompt.shell({ sessionID: chat.id, agent: "build", command: "echo hi" }).pipe(Effect.exit)
|
||||||
expect(Exit.isFailure(exit)).toBe(true)
|
expect(Exit.isFailure(exit)).toBe(true)
|
||||||
@@ -1418,9 +1401,7 @@ it.instance(
|
|||||||
|
|
||||||
yield* prompt.cancel(chat.id)
|
yield* prompt.cancel(chat.id)
|
||||||
yield* Fiber.await(fiber)
|
yield* Fiber.await(fiber)
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
unixNoLLMServer(
|
unixNoLLMServer(
|
||||||
"shell captures stdout and stderr in completed tool output",
|
"shell captures stdout and stderr in completed tool output",
|
||||||
@@ -2132,9 +2113,7 @@ it.instance("does not loop empty assistant turns for a simple reply", () =>
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
it.instance(
|
it.instance("records aborted errors when prompt is cancelled mid-stream", () =>
|
||||||
"records aborted errors when prompt is cancelled mid-stream",
|
|
||||||
() =>
|
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const { llm } = yield* useServerConfig(providerCfg)
|
const { llm } = yield* useServerConfig(providerCfg)
|
||||||
const prompt = yield* SessionPrompt.Service
|
const prompt = yield* SessionPrompt.Service
|
||||||
@@ -2152,6 +2131,7 @@ it.instance(
|
|||||||
.pipe(Effect.forkChild)
|
.pipe(Effect.forkChild)
|
||||||
|
|
||||||
yield* llm.wait(1)
|
yield* llm.wait(1)
|
||||||
|
yield* waitForBusy(session.id)
|
||||||
yield* prompt.cancel(session.id)
|
yield* prompt.cancel(session.id)
|
||||||
|
|
||||||
const exit = yield* Fiber.await(fiber)
|
const exit = yield* Fiber.await(fiber)
|
||||||
@@ -2169,9 +2149,7 @@ it.instance(
|
|||||||
if (last?.info.role === "assistant") {
|
if (last?.info.role === "assistant") {
|
||||||
expect(last.info.error?.name).toBe("MessageAbortedError")
|
expect(last.info.error?.name).toBe("MessageAbortedError")
|
||||||
}
|
}
|
||||||
}),
|
}))
|
||||||
3_000,
|
|
||||||
)
|
|
||||||
|
|
||||||
// Agent variant
|
// Agent variant
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user