Files
openclaw/src/agents/ai-transport-runtime-host.ts
T
Peter Steinberger 7eed2c3f21 feat(google): add current-turn native video input (#122074)
* feat(agents): add current-turn Gemini video handoff

* test(google): add live native video regression

* build(ai): emit provider types entrypoint

* fix(google): preserve video shedding on retry
2026-08-11 12:58:32 -07:00

108 lines
4.0 KiB
TypeScript

import {
configureAiTransportHost,
getAiTransportHost,
type AiProviderRequestCapabilities,
} from "@openclaw/ai";
import type { OpenClawConfig } from "../config/types.openclaw.js";
import "../llm/ai-transport-host.js";
import { getModelProviderRuntimePluginHandle } from "../plugins/provider-hook-runtime.js";
import type { ProviderRuntimeModel } from "../plugins/provider-runtime-model.types.js";
import {
resolveProviderStreamFn,
resolveProviderTransportTurnStateWithPlugin,
wrapProviderSimpleCompletionStreamFn,
} from "../plugins/provider-runtime.js";
import { createAnthropicVertexStreamFnForModel } from "./anthropic-vertex-stream.js";
import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./copilot-dynamic-headers.js";
import { ensureCustomApiRegistered } from "./custom-api-registry.js";
import {
resolveProviderRequestCapabilities,
resolveProviderEndpoint,
} from "./provider-attribution.js";
import {
attachModelProviderLocalService,
getModelProviderLocalService,
} from "./provider-local-service.js";
import {
attachModelProviderRequestTransport,
getModelProviderRequestTransport,
inheritModelProviderMetadataOwners,
resolveProviderRequestPolicyConfig,
} from "./provider-request-config.js";
import { transformTransportMessages } from "./transport-message-transform.js";
let configured = false;
/** Installs the agent and plugin ports only on paths that execute provider runtime. */
export function configureAiTransportRuntimeHost(): void {
if (configured) {
return;
}
const host = getAiTransportHost();
configureAiTransportHost({
...host,
plugin: {
...host.plugin,
resolveProviderStream: (params) =>
resolveProviderStreamFn({
...params,
config: params.config as OpenClawConfig | undefined,
context: {
...params.context,
config: params.context.config as OpenClawConfig | undefined,
model: params.context.model as ProviderRuntimeModel,
},
}),
resolveTransportTurnState: (params) =>
resolveProviderTransportTurnStateWithPlugin({
...params,
config: params.config as OpenClawConfig | undefined,
runtimeHandle: getModelProviderRuntimePluginHandle(params.context.model),
context: {
...params.context,
model: params.context.model as ProviderRuntimeModel | undefined,
},
}),
wrapSimpleCompletionStream: (params) =>
wrapProviderSimpleCompletionStreamFn({
...params,
config: params.config as OpenClawConfig | undefined,
context: {
...params.context,
config: params.context.config as OpenClawConfig | undefined,
model: params.context.model as ProviderRuntimeModel,
},
}),
createAnthropicVertexStream: createAnthropicVertexStreamFnForModel,
},
buildCopilotDynamicHeaders: (messages) =>
buildCopilotDynamicHeaders({ messages, hasImages: hasCopilotVisionInput(messages) }),
resolveProviderEndpointClass: (baseUrl) => resolveProviderEndpoint(baseUrl).endpointClass,
resolveProviderRequestCapabilities: (input) =>
resolveProviderRequestCapabilities(input) as AiProviderRequestCapabilities,
resolveProviderRequestHeaders: (input) =>
resolveProviderRequestPolicyConfig({
...input,
capability: "llm",
transport: "stream",
}).headers,
requiresManagedTransport: (model) => {
const request = getModelProviderRequestTransport(model);
return Boolean(request?.proxy || request?.tls || getModelProviderLocalService(model));
},
inheritManagedTransport: (source, target) =>
inheritModelProviderMetadataOwners(
source,
attachModelProviderLocalService(
attachModelProviderRequestTransport(target, getModelProviderRequestTransport(source)),
getModelProviderLocalService(source),
),
),
transformTransportMessages,
registerCustomApi: ensureCustomApiRegistered,
});
configured = true;
}
configureAiTransportRuntimeHost();