mirror of
https://github.com/deepseek-ai/deepseek-recipe.git
synced 2026-10-28 17:17:08 +08:00
Merge e8f21d251e9145ce5213dccdd8d0b5cb8d2dbda9 into 935817c66f5d6e64838f419692545f06787e485f
This commit is contained in:
commit
5838bc2446
@ -189,7 +189,8 @@ impl ConversationRequest {
|
|||||||
/// [`DEFAULT_MAX_EFFORT_MAX_TOKENS`] in thinking mode with
|
/// [`DEFAULT_MAX_EFFORT_MAX_TOKENS`] in thinking mode with
|
||||||
/// [`ReasoningEffort::Max`], and [`DEFAULT_THINKING_MAX_TOKENS`] in thinking
|
/// [`ReasoningEffort::Max`], and [`DEFAULT_THINKING_MAX_TOKENS`] in thinking
|
||||||
/// mode otherwise. The result is lowered to the context left after the
|
/// mode otherwise. The result is lowered to the context left after the
|
||||||
/// prompt and raised to at least 1.
|
/// prompt and raised to at least 1; when no context remains at all, the
|
||||||
|
/// request is rejected instead.
|
||||||
///
|
///
|
||||||
/// Call it after encoding the prompt; conversion cannot count prompt
|
/// Call it after encoding the prompt; conversion cannot count prompt
|
||||||
/// tokens.
|
/// tokens.
|
||||||
@ -226,6 +227,17 @@ impl ConversationRequest {
|
|||||||
DEFAULT_THINKING_MAX_TOKENS
|
DEFAULT_THINKING_MAX_TOKENS
|
||||||
};
|
};
|
||||||
let remaining = context_limit - prompt_tokens;
|
let remaining = context_limit - prompt_tokens;
|
||||||
|
// A prompt that fills the context leaves no room for output. Raise the same
|
||||||
|
// BadRequest an explicit over-limit request gets instead of flooring the
|
||||||
|
// implicit budget to a phantom token: the backend would reject that request
|
||||||
|
// anyway, and with a less precise error.
|
||||||
|
if remaining == 0 {
|
||||||
|
return Err(ConversionError::bad_request(format!(
|
||||||
|
"This model's maximum context length is {context_limit} tokens. However, you \
|
||||||
|
requested {prompt_tokens} tokens ({prompt_tokens} in the messages, 0 in the \
|
||||||
|
completion). Please reduce the length of the messages or completion."
|
||||||
|
)));
|
||||||
|
}
|
||||||
Ok(self
|
Ok(self
|
||||||
.inference_options
|
.inference_options
|
||||||
.max_tokens
|
.max_tokens
|
||||||
@ -289,3 +301,35 @@ impl std::fmt::Display for ConversionError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl std::error::Error for ConversionError {}
|
impl std::error::Error for ConversionError {}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn request(max_tokens: Option<u32>) -> ConversationRequest {
|
||||||
|
let mut request =
|
||||||
|
ConversationRequest::new(Conversation::default(), ModelVersion::DeepseekV41Flash);
|
||||||
|
request.inference_options.max_tokens = max_tokens;
|
||||||
|
request
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn resolve_max_tokens_raises_bad_request_when_prompt_fills_context() {
|
||||||
|
// Prompt fills the context and the request sets no limit: the default used
|
||||||
|
// to be floored to one output token, which the backend rejects anyway.
|
||||||
|
let err = request(None).resolve_max_tokens(100, 100).unwrap_err();
|
||||||
|
assert!(
|
||||||
|
err.to_string()
|
||||||
|
.contains("maximum context length is 100 tokens"),
|
||||||
|
"unexpected detail: {err}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn resolve_max_tokens_keeps_explicit_and_implicit_budgets_below_the_limit() {
|
||||||
|
assert_eq!(request(None).resolve_max_tokens(99, 100).unwrap(), 1);
|
||||||
|
assert_eq!(request(Some(1)).resolve_max_tokens(99, 100).unwrap(), 1);
|
||||||
|
assert_eq!(request(None).resolve_max_tokens(10, 100).unwrap(), 90);
|
||||||
|
assert_eq!(request(Some(50)).resolve_max_tokens(10, 100).unwrap(), 50);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user