use super::super::super::{
GenerationResources, GenerationStateAccess,
chat_claude::{ChatViaClaude, ClaudeViaChat},
};
use super::super::{StreamInvocation, StreamSettings, StreamTarget};
use super::RequestMode;
use crate::{
capability::{ResourceAccess, StateStore},
transform::{TransformError, generate::claude_chat::stream as p},
wire::{DeclaredFields, claude::generate_content as c, openai::chat as h},
};
impl ChatViaClaude {
pub async fn prepare_stream<S: StateStore>(
input: h::GenerateContentRequestBody,
mut target: StreamTarget,
context: p::ClaudeToChatContext,
settings: StreamSettings,
state: &GenerationStateAccess<'_, S>,
) -> Result<StreamInvocation<p::ClaudeToChatStream>, TransformError> {
let original = input.into_declared();
let prepared = Self::prepare_with_state(
original.clone().buffered(),
target.endpoint.clone(),
target.identities.clone(),
state,
)
.await?;
target.identities = prepared.identities().clone();
let bridge = p::ClaudeToChatStream::new_with_policy(
context,
target.identities.response.clone(),
settings.events.into(),
target.identities.response_policy.clone(),
)?;
let emit_usage = original.emit_usage();
let mut invocation = StreamInvocation::new(
original,
prepared.target_request().clone().streaming(),
target,
settings,
bridge,
prepared.report().clone(),
state,
)
.await?;
invocation.emit_usage = emit_usage;
Ok(invocation)
}
pub async fn prepare_stream_with_capabilities<S: StateStore, R: ResourceAccess>(
input: h::GenerateContentRequestBody,
mut target: StreamTarget,
context: p::ClaudeToChatContext,
settings: StreamSettings,
state: &GenerationStateAccess<'_, S>,
resources: &GenerationResources<'_, R>,
) -> Result<StreamInvocation<p::ClaudeToChatStream>, TransformError> {
let original = input.into_declared();
let prepared = Self::prepare_with_capabilities(
original.clone().buffered(),
target.endpoint.clone(),
target.identities.clone(),
state,
resources,
)
.await?;
target.identities = prepared.identities().clone();
let bridge = p::ClaudeToChatStream::new_with_policy(
context,
target.identities.response.clone(),
settings.events.into(),
target.identities.response_policy.clone(),
)?;
let emit_usage = original.emit_usage();
let mut invocation = StreamInvocation::new(
original,
prepared.target_request().clone().streaming(),
target,
settings,
bridge,
prepared.report().clone(),
state,
)
.await?;
invocation.emit_usage = emit_usage;
Ok(invocation)
}
}
impl ClaudeViaChat {
pub async fn prepare_stream<S: StateStore>(
input: c::GenerateContentRequestBody,
mut target: StreamTarget,
context: p::ChatToClaudeContext,
settings: StreamSettings,
state: &GenerationStateAccess<'_, S>,
) -> Result<StreamInvocation<p::ChatToClaudeStream>, TransformError> {
let original = input.into_declared();
let prepared = Self::prepare_with_state(
original.clone().buffered(),
target.endpoint.clone(),
target.identities.clone(),
state,
)
.await?;
target.identities = prepared.identities().clone();
let bridge = p::ChatToClaudeStream::new_with_policy(
context,
target.identities.response.clone(),
settings.events.into(),
target.identities.response_policy.clone(),
)?;
StreamInvocation::new(
original,
prepared.target_request().clone().streaming(),
target,
settings,
bridge,
prepared.report().clone(),
state,
)
.await
}
pub async fn prepare_stream_with_capabilities<S: StateStore, R: ResourceAccess>(
input: c::GenerateContentRequestBody,
mut target: StreamTarget,
context: p::ChatToClaudeContext,
settings: StreamSettings,
state: &GenerationStateAccess<'_, S>,
resources: &GenerationResources<'_, R>,
) -> Result<StreamInvocation<p::ChatToClaudeStream>, TransformError> {
let original = input.into_declared();
let prepared = Self::prepare_with_capabilities(
original.clone().buffered(),
target.endpoint.clone(),
target.identities.clone(),
state,
resources,
)
.await?;
target.identities = prepared.identities().clone();
let bridge = p::ChatToClaudeStream::new_with_policy(
context,
target.identities.response.clone(),
settings.events.into(),
target.identities.response_policy.clone(),
)?;
StreamInvocation::new(
original,
prepared.target_request().clone().streaming(),
target,
settings,
bridge,
prepared.report().clone(),
state,
)
.await
}
}