@opencode-ai/ai 0.0.0-dev-18235 → 0.0.0-dev-18239
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cache-policy.js
CHANGED
|
@@ -34,7 +34,7 @@ const resolve = (policy) => {
|
|
|
34
34
|
// Protocols whose wire format ignores inline cache markers (OpenAI's implicit
|
|
35
35
|
// prefix caching, Gemini's implicit + out-of-band CachedContent). Skip the
|
|
36
36
|
// whole policy pass for these — emitting hints would be harmless but pointless.
|
|
37
|
-
const RESPECTS_INLINE_HINTS = new Set(["anthropic-messages", "bedrock-converse", "openrouter"]);
|
|
37
|
+
const RESPECTS_INLINE_HINTS = new Set(["anthropic-messages", "google-vertex-messages", "bedrock-converse", "openrouter"]);
|
|
38
38
|
const makeHint = (ttlSeconds) => ttlSeconds !== undefined ? new CacheHint({ type: "ephemeral", ttlSeconds }) : new CacheHint({ type: "ephemeral" });
|
|
39
39
|
const markLastTool = (tools, hint, budget) => {
|
|
40
40
|
if (tools.length === 0)
|
|
@@ -612,9 +612,13 @@ const endsInServerToolUse = (message) => {
|
|
|
612
612
|
const last = message.content.at(-1);
|
|
613
613
|
return message.role === "assistant" && last?.type === "tool-call" && last.providerExecuted === true;
|
|
614
614
|
};
|
|
615
|
-
const canUseNativeSystemUpdate = (
|
|
616
|
-
const previous = messages[index - 1];
|
|
617
|
-
const next = messages[index + 1];
|
|
615
|
+
const canUseNativeSystemUpdate = (request, index) => {
|
|
616
|
+
const previous = request.messages[index - 1];
|
|
617
|
+
const next = request.messages[index + 1];
|
|
618
|
+
// Vertex currently rejects/404s for a system message after local tool results,
|
|
619
|
+
// so fold it into the user tool-result turn across continuations and history.
|
|
620
|
+
if (request.model.route.id === "google-vertex-messages" && previous?.role === "tool")
|
|
621
|
+
return false;
|
|
618
622
|
return (previous !== undefined &&
|
|
619
623
|
previous.role !== "system" &&
|
|
620
624
|
(previous.role === "user" || previous.role === "tool" || endsInServerToolUse(previous)) &&
|
|
@@ -650,7 +654,7 @@ const lowerMessages = Effect.fn("AnthropicMessages.lowerMessages")(function* (re
|
|
|
650
654
|
if (message.role === "system") {
|
|
651
655
|
if (splitsLocalToolResults(request.messages, index))
|
|
652
656
|
return yield* invalid("Anthropic Messages system updates cannot split a local tool call from its tool result");
|
|
653
|
-
if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request
|
|
657
|
+
if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request, index)) {
|
|
654
658
|
messages.push(yield* lowerNativeSystemUpdate(message, breakpoints));
|
|
655
659
|
continue;
|
|
656
660
|
}
|
|
@@ -374,8 +374,7 @@ const lowerToolResultOutput = Effect.fnUntraced(function* (part, request, extens
|
|
|
374
374
|
return yield* Effect.forEach(content, (item) => lowerToolResultContentItem(item, request, extension));
|
|
375
375
|
});
|
|
376
376
|
const lowerMessages = Effect.fn("OpenResponses.lowerMessages")(function* (request, extension) {
|
|
377
|
-
const
|
|
378
|
-
const input = [...system];
|
|
377
|
+
const input = [];
|
|
379
378
|
const providerMetadataKey = request.model.route.providerMetadataKey ?? "openresponses";
|
|
380
379
|
for (const message of request.messages) {
|
|
381
380
|
if (message.role === "system") {
|
|
@@ -496,10 +495,11 @@ const lowerMessages = Effect.fn("OpenResponses.lowerMessages")(function* (reques
|
|
|
496
495
|
});
|
|
497
496
|
const lowerOptions = (request) => {
|
|
498
497
|
const options = OpenResponsesOptions.resolve(request);
|
|
498
|
+
const instructions = ProviderShared.joinText(request.system);
|
|
499
499
|
const cacheKey = ProviderShared.promptCacheKey(request);
|
|
500
500
|
const parallelToolCalls = resolveParallelToolCalls(request);
|
|
501
501
|
return {
|
|
502
|
-
...(
|
|
502
|
+
...(instructions ? { instructions } : {}),
|
|
503
503
|
...(options.store !== undefined ? { store: options.store } : {}),
|
|
504
504
|
...(options.metadata ? { metadata: options.metadata } : {}),
|
|
505
505
|
...(options.safetyIdentifier ? { safety_identifier: options.safetyIdentifier } : {}),
|
|
@@ -703,26 +703,24 @@ const onOutputItemAdded = (state, event) => {
|
|
|
703
703
|
events,
|
|
704
704
|
];
|
|
705
705
|
}
|
|
706
|
-
if (item?.type !== "function_call" || !item.
|
|
706
|
+
if (item?.type !== "function_call" || !item.call_id)
|
|
707
707
|
return [state, NO_EVENTS];
|
|
708
|
-
const
|
|
708
|
+
const id = item.id ?? item.call_id;
|
|
709
|
+
const metadata = item.id ? providerMetadata(state, { itemId: item.id }) : undefined;
|
|
709
710
|
const events = [];
|
|
710
711
|
const lifecycle = Lifecycle.stepStart(state.lifecycle, events);
|
|
711
712
|
return [
|
|
712
713
|
{
|
|
713
714
|
...state,
|
|
714
715
|
lifecycle,
|
|
715
|
-
tools: ToolStream.start(state.tools,
|
|
716
|
-
id: item.call_id
|
|
716
|
+
tools: ToolStream.start(state.tools, id, {
|
|
717
|
+
id: item.call_id,
|
|
717
718
|
name: item.name ?? "",
|
|
718
719
|
input: item.arguments ?? "",
|
|
719
720
|
providerMetadata: metadata,
|
|
720
721
|
}),
|
|
721
722
|
},
|
|
722
|
-
[
|
|
723
|
-
...events,
|
|
724
|
-
LLMEvent.toolInputStart({ id: item.call_id ?? item.id, name: item.name ?? "", providerMetadata: metadata }),
|
|
725
|
-
],
|
|
723
|
+
[...events, LLMEvent.toolInputStart({ id: item.call_id, name: item.name ?? "", providerMetadata: metadata })],
|
|
726
724
|
];
|
|
727
725
|
};
|
|
728
726
|
const onReasoningSummaryPartAdded = (state, event) => {
|
|
@@ -825,18 +823,19 @@ const onOutputItemDone = Effect.fn("OpenResponses.onOutputItemDone")(function* (
|
|
|
825
823
|
];
|
|
826
824
|
}
|
|
827
825
|
if (item.type === "function_call") {
|
|
828
|
-
if (!item.
|
|
826
|
+
if (!item.call_id || !item.name)
|
|
829
827
|
return [state, NO_EVENTS];
|
|
830
|
-
const
|
|
828
|
+
const id = item.id ?? item.call_id;
|
|
829
|
+
const tools = state.tools[id]
|
|
831
830
|
? state.tools
|
|
832
|
-
: ToolStream.start(state.tools,
|
|
831
|
+
: ToolStream.start(state.tools, id, {
|
|
833
832
|
id: item.call_id,
|
|
834
833
|
name: item.name,
|
|
835
|
-
providerMetadata: providerMetadata(state, { itemId: item.id }),
|
|
834
|
+
providerMetadata: item.id ? providerMetadata(state, { itemId: item.id }) : undefined,
|
|
836
835
|
});
|
|
837
836
|
const result = item.arguments === undefined
|
|
838
|
-
? yield* ToolStream.finish(state.id, tools,
|
|
839
|
-
: yield* ToolStream.finishWithInput(state.id, tools,
|
|
837
|
+
? yield* ToolStream.finish(state.id, tools, id)
|
|
838
|
+
: yield* ToolStream.finishWithInput(state.id, tools, id, item.arguments);
|
|
840
839
|
const events = [];
|
|
841
840
|
const resultEvents = result.events ?? [];
|
|
842
841
|
const lifecycle = resultEvents.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle;
|
|
@@ -879,9 +878,10 @@ const onOutputItemDone = Effect.fn("OpenResponses.onOutputItemDone")(function* (
|
|
|
879
878
|
const onResponseFinish = Effect.fn("OpenResponses.onResponseFinish")(function* (state, event) {
|
|
880
879
|
const reconciled = event.type === "response.completed"
|
|
881
880
|
? yield* Effect.reduce(event.response?.output ?? [], () => [state, NO_EVENTS], ([current, events], item) => {
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
881
|
+
const id = item.id ?? (item.type === "function_call" ? item.call_id : undefined);
|
|
882
|
+
if (!id ||
|
|
883
|
+
((item.type !== "function_call" || !current.tools[id]) &&
|
|
884
|
+
(item.type !== "reasoning" || !current.reasoningItems[id])))
|
|
885
885
|
return Effect.succeed([current, events]);
|
|
886
886
|
return onOutputItemDone(current, { type: "response.output_item.done", item }).pipe(Effect.map(([next, emitted]) => [next, [...events, ...emitted]]));
|
|
887
887
|
})
|
|
@@ -991,8 +991,9 @@ export const step = (state, input) => {
|
|
|
991
991
|
if (event.type === "response.output_item.added") {
|
|
992
992
|
if (event.item?.type === "message" && !event.item.id)
|
|
993
993
|
return ProviderShared.eventError(state.id, `${event.type} message is missing id`);
|
|
994
|
-
|
|
995
|
-
|
|
994
|
+
const id = event.item?.id ?? (event.item?.type === "function_call" ? event.item.call_id : undefined);
|
|
995
|
+
return Effect.succeed(onOutputItemAdded(event.output_index !== undefined && id
|
|
996
|
+
? { ...state, outputItems: { ...state.outputItems, [event.output_index]: id } }
|
|
996
997
|
: state, event));
|
|
997
998
|
}
|
|
998
999
|
if (event.type === "response.function_call_arguments.delta" || event.type === "response.function_call_arguments.done")
|
|
@@ -26,7 +26,6 @@ export declare const StreamOptions: Schema.Struct<{
|
|
|
26
26
|
readonly includeObfuscation: Schema.optional<Schema.Boolean>;
|
|
27
27
|
}>;
|
|
28
28
|
export declare const Options: Schema.Struct<{
|
|
29
|
-
readonly instructions: Schema.optional<Schema.String>;
|
|
30
29
|
readonly store: Schema.optional<Schema.Boolean>;
|
|
31
30
|
readonly metadata: Schema.optional<Schema.$Record<Schema.String, Schema.String>>;
|
|
32
31
|
readonly safetyIdentifier: Schema.optional<Schema.String>;
|
|
@@ -28,7 +28,6 @@ export const StreamOptions = Schema.Struct({
|
|
|
28
28
|
includeObfuscation: Schema.optional(Schema.Boolean),
|
|
29
29
|
});
|
|
30
30
|
export const Options = Schema.Struct({
|
|
31
|
-
instructions: Schema.optional(Schema.String),
|
|
32
31
|
store: Schema.optional(Schema.Boolean),
|
|
33
32
|
metadata: Schema.optional(Schema.Record(Schema.String, Schema.String)),
|
|
34
33
|
safetyIdentifier: Schema.optional(Schema.String),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-18239",
|
|
4
4
|
"name": "@opencode-ai/ai",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@clack/prompts": "1.0.0-alpha.1",
|
|
32
32
|
"@effect/platform-node": "4.0.0-rc.111",
|
|
33
|
-
"@opencode-ai/http-recorder": "0.0.0-dev-
|
|
33
|
+
"@opencode-ai/http-recorder": "0.0.0-dev-18239",
|
|
34
34
|
"@tsconfig/bun": "1.0.9",
|
|
35
35
|
"@types/bun": "1.3.13",
|
|
36
36
|
"@typescript/native-preview": "7.0.0-dev.20251207.1",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@smithy/eventstream-codec": "4.2.14",
|
|
41
41
|
"@smithy/util-utf8": "4.2.2",
|
|
42
|
-
"@opencode-ai/schema": "0.0.0-dev-
|
|
42
|
+
"@opencode-ai/schema": "0.0.0-dev-18239",
|
|
43
43
|
"aws4fetch": "1.0.20",
|
|
44
44
|
"effect": "4.0.0-rc.111",
|
|
45
45
|
"google-auth-library": "10.5.0"
|