feat(aircoding): AirCoding V2 baseline — deterministic multi-agent architecture
Forked from OpenCode v1.17.4 with multi-agent system: - 5 agents: aircoding, scheduler, worker, architect, reviewer - Deterministic DAG scheduling engine (coordinator_tick) - Tool whitelists as hard enforcement - AirCoding validation plugin - V1 requirements: C4 docs, ADR, AGENTS.md, debug-log.md - Design documents in docs/
This commit is contained in:
104
packages/llm/test/continuation-scenarios.ts
Normal file
104
packages/llm/test/continuation-scenarios.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
import { LLM, Message, ToolCallPart, ToolDefinition, ToolResultPart, type ContentPart, type Model } from "../src"
|
||||
|
||||
export const basicContinuation = ["system", "user-text", "assistant-text", "user-follow-up"] as const
|
||||
export const toolContinuation = ["tool-call", "tool-result"] as const
|
||||
export const reasoningContinuation = ["assistant-reasoning", "encrypted-reasoning"] as const
|
||||
export const mediaContinuation = ["user-image"] as const
|
||||
export const maximalContinuation = [
|
||||
...basicContinuation,
|
||||
...toolContinuation,
|
||||
...reasoningContinuation,
|
||||
...mediaContinuation,
|
||||
] as const
|
||||
|
||||
export type ContinuationFeature = (typeof maximalContinuation)[number]
|
||||
|
||||
export const nativeOpenAIResponsesContinuation = [
|
||||
...basicContinuation,
|
||||
...toolContinuation,
|
||||
"encrypted-reasoning",
|
||||
...mediaContinuation,
|
||||
] as const satisfies ReadonlyArray<ContinuationFeature>
|
||||
|
||||
export const nativeAnthropicMessagesContinuation = [
|
||||
...basicContinuation,
|
||||
...toolContinuation,
|
||||
"assistant-reasoning",
|
||||
...mediaContinuation,
|
||||
] as const satisfies ReadonlyArray<ContinuationFeature>
|
||||
|
||||
export const continuationTool = ToolDefinition.make({
|
||||
name: "get_weather",
|
||||
description: "Get current weather for a city.",
|
||||
inputSchema: {
|
||||
type: "object",
|
||||
properties: { city: { type: "string" } },
|
||||
required: ["city"],
|
||||
additionalProperties: false,
|
||||
},
|
||||
})
|
||||
|
||||
export function continuationRequest(input: {
|
||||
readonly id: string
|
||||
readonly model: Model
|
||||
readonly features: ReadonlyArray<ContinuationFeature>
|
||||
readonly image?: string
|
||||
}) {
|
||||
const features = new Set(input.features)
|
||||
const messages = []
|
||||
const firstUser: ContentPart[] = []
|
||||
const firstAssistant: ContentPart[] = []
|
||||
|
||||
if (features.has("user-text")) firstUser.push({ type: "text", text: "What is shown here?" })
|
||||
if (features.has("user-image"))
|
||||
firstUser.push({ type: "media", mediaType: "image/png", data: input.image ?? "AAECAw==" })
|
||||
if (firstUser.length > 0) messages.push(Message.user(firstUser))
|
||||
|
||||
if (features.has("assistant-reasoning"))
|
||||
firstAssistant.push({
|
||||
type: "reasoning",
|
||||
text: "I inspected the previous turn.",
|
||||
providerMetadata: { anthropic: { signature: "sig_continuation_1" } },
|
||||
})
|
||||
if (features.has("encrypted-reasoning"))
|
||||
firstAssistant.push({
|
||||
type: "reasoning",
|
||||
text: "I inspected the previous turn.",
|
||||
providerMetadata: {
|
||||
openai: {
|
||||
itemId: "rs_continuation_1",
|
||||
reasoningEncryptedContent: "encrypted-continuation-state",
|
||||
},
|
||||
},
|
||||
})
|
||||
if (features.has("assistant-text")) firstAssistant.push({ type: "text", text: "It shows a small test image." })
|
||||
if (firstAssistant.length > 0) messages.push(Message.assistant(firstAssistant))
|
||||
|
||||
if (features.has("tool-call")) {
|
||||
messages.push(Message.user("Check the weather in Paris before continuing."))
|
||||
messages.push(
|
||||
Message.assistant([ToolCallPart.make({ id: "call_weather_1", name: "get_weather", input: { city: "Paris" } })]),
|
||||
)
|
||||
}
|
||||
if (features.has("tool-result")) {
|
||||
messages.push(
|
||||
Message.tool(ToolResultPart.make({ id: "call_weather_1", name: "get_weather", result: { temperature: 22 } })),
|
||||
)
|
||||
if (features.has("assistant-text")) messages.push(Message.assistant("Paris is 22 degrees."))
|
||||
}
|
||||
if (features.has("user-follow-up"))
|
||||
messages.push(Message.user("Continue from this conversation in one short sentence."))
|
||||
|
||||
return LLM.request({
|
||||
id: input.id,
|
||||
model: input.model,
|
||||
system: features.has("system") ? "You are concise. Continue from the provided history." : undefined,
|
||||
messages,
|
||||
tools: features.has("tool-call") ? [continuationTool] : [],
|
||||
cache: "none",
|
||||
providerOptions: features.has("encrypted-reasoning")
|
||||
? { openai: { store: false, include: ["reasoning.encrypted_content"], reasoningSummary: "auto" } }
|
||||
: undefined,
|
||||
generation: { maxTokens: 80, temperature: 0 },
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user