pub mod default;
pub use default::DefaultNegotiator;
use crate::agent::AgentDefinition;
use crate::compat::{MaybeSend, MaybeSync};
use crate::errors::AgentResult;
use crate::macros::LLMOutput;
use crate::models::Content;
use crate::runtime::context::AuthContext;
use a2a_types::Message;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, LLMOutput, Serialize, JsonSchema)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum NegotiationDecision {
StartTask {
skill_id: String,
reasoning: String,
},
AskClarification {
message: String,
},
Reject {
reason: String,
},
}
#[cfg_attr(all(target_os = "wasi", target_env = "p1"), async_trait::async_trait(?Send))]
#[cfg_attr(
not(all(target_os = "wasi", target_env = "p1")),
async_trait::async_trait
)]
pub trait Negotiator: MaybeSend + MaybeSync {
async fn negotiate(
&self,
auth_ctx: &AuthContext,
agent_def: &AgentDefinition,
context_id: &str,
content: Content,
history: Vec<Message>,
) -> AgentResult<NegotiationDecision>;
}