Files
Genarrative/server-rs/crates/shared-contracts/src/llm.rs
T
kdletters 6bf57c1e51
Project CI / AI game creator shell Rust lane 1/2 (push) Failing after 3m1s
Project CI / AI game creator shell Rust lane 2/2 (push) Failing after 1m37s
Project CI / AI game creator shell Rust crates (push) Successful in 1m25s
Project CI / AI game creator shell Rust smoke (push) Successful in 2m6s
Project CI / Frontend tests (push) Successful in 2m52s
Project CI / Backend tests (push) Failing after 4m14s
Project CI / Repository checks (push) Successful in 3m42s
Project CI / AI game creator shell web tests (push) Successful in 2m5s
Project CI / Native shell tests (push) Successful in 8m2s
AGC 把执行器与线协议拆成正交维度
AgcAgentMode 回退为仅 codex/cc,只表示执行器;新增 AgcModelProtocol 表示线协议
协议取值 openai_responses/openai_chat/anthropic,与执行器组合封闭并在校验时失败关闭
存量目录缺 protocol 时按执行器推导;历史误写的 agentMode=anthropic 读取时归一为 cc
后台 AGC 模型页拆成 Agent 模式与协议两列,新增协议下拉与对应测试
公开目录 /api/llm/models 与后台 DTO 同时下发解析后的 protocol
客户端持久化 selectedModelProtocol,选模型时按执行器推导兜底协议并校验组合
Codex wire_api 按协议在 responses/chat 间切换,不再硬编码 responses
同步 appSurface 与模型选择测试断言,补 protocol 字段
同步模型别名文档与后端架构文档的正交维度说明
2026-10-02 12:08:26 +08:00

82 lines
2.3 KiB
Rust

use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum LlmChatMessageRole {
System,
User,
Assistant,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct LlmChatMessagePayload {
pub role: LlmChatMessageRole,
pub content: String,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct LlmChatCompletionRequest {
#[serde(default)]
pub model: Option<String>,
#[serde(default)]
pub stream: bool,
pub messages: Vec<LlmChatMessagePayload>,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct LlmChatCompletionResponse {
pub id: Option<String>,
pub model: String,
pub content: String,
pub finish_reason: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn llm_chat_completion_request_keeps_openai_compatible_field_names() {
let payload = serde_json::to_value(LlmChatCompletionRequest {
model: Some("doubao-test".to_string()),
stream: false,
messages: vec![
LlmChatMessagePayload {
role: LlmChatMessageRole::System,
content: "系统".to_string(),
},
LlmChatMessagePayload {
role: LlmChatMessageRole::User,
content: "用户".to_string(),
},
],
})
.expect("payload should serialize");
assert_eq!(payload["model"], json!("doubao-test"));
assert_eq!(payload["stream"], json!(false));
assert_eq!(payload["messages"][0]["role"], json!("system"));
}
}
#[derive(Debug, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LlmModelSummary {
pub display_name: String,
pub id: String,
/// 执行器:`codex` 或 `cc`。
pub agent_mode: String,
/// 上游线协议,与执行器正交:`openai_responses` / `openai_chat` / `anthropic`。
pub protocol: String,
}
#[derive(Debug, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LlmModelsResponse {
pub default_model_id: String,
pub models: Vec<LlmModelSummary>,
/// 模型目录版本,客户端据此做条件刷新。
pub revision: u64,
}