ai_sdk_provider/language_model/
finish_reason.rs

1use serde::{Deserialize, Serialize};
2
3/// Reason why a language model finished generating a response.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "kebab-case")]
6pub enum FinishReason {
7    /// Model generated stop sequence
8    Stop,
9    /// Model generated maximum number of tokens
10    Length,
11    /// Content filter violation stopped the model
12    ContentFilter,
13    /// Model triggered tool calls
14    ToolCalls,
15    /// Model stopped because of an error
16    Error,
17    /// Model stopped for other reasons
18    Other,
19    /// The model has not transmitted a finish reason
20    Unknown,
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26
27    #[test]
28    fn test_finish_reason_serialization() {
29        assert_eq!(
30            serde_json::to_string(&FinishReason::ToolCalls).unwrap(),
31            r#""tool-calls""#
32        );
33        assert_eq!(
34            serde_json::to_string(&FinishReason::Stop).unwrap(),
35            r#""stop""#
36        );
37        assert_eq!(
38            serde_json::to_string(&FinishReason::ContentFilter).unwrap(),
39            r#""content-filter""#
40        );
41    }
42
43    #[test]
44    fn test_finish_reason_deserialization() {
45        let reason: FinishReason = serde_json::from_str(r#""tool-calls""#).unwrap();
46        assert_eq!(reason, FinishReason::ToolCalls);
47    }
48}