monoloop_contracts/
dialect.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum DialectFamily {
8 OpenAiChatCompletions,
10 OpenAiResponses,
12 AnthropicMessages,
14 Acp,
16 CursorAcp,
18 AgyAcp,
20 CodexAcp,
22 ZaiCli,
24 ClaudeCode,
26 GrokBuild,
28 Test,
30 Other(String),
32}
33
34#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
36pub enum DialectNegotiation {
37 Fixed,
39 Negotiated,
41}
42
43#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
45pub struct DialectDescriptor {
46 pub family: DialectFamily,
48 pub version: String,
50 pub framing: String,
52 pub profile: Option<String>,
54}
55
56impl DialectDescriptor {
57 pub fn openai_chat_completions(version: impl Into<String>) -> Self {
59 Self {
60 family: DialectFamily::OpenAiChatCompletions,
61 version: version.into(),
62 framing: "sse".into(),
63 profile: Some("openai_chat_completions".into()),
64 }
65 }
66
67 pub fn acp_json_rpc(version: impl Into<String>) -> Self {
69 Self {
70 family: DialectFamily::Acp,
71 version: version.into(),
72 framing: "json_rpc".into(),
73 profile: Some("grok_build".into()),
74 }
75 }
76
77 pub fn cursor_acp(version: impl Into<String>) -> Self {
79 Self {
80 family: DialectFamily::CursorAcp,
81 version: version.into(),
82 framing: "ndjson".into(),
83 profile: Some("cursor".into()),
84 }
85 }
86
87 pub fn agy_acp(version: impl Into<String>) -> Self {
89 Self {
90 family: DialectFamily::AgyAcp,
91 version: version.into(),
92 framing: "ndjson".into(),
93 profile: Some("antigravity".into()),
94 }
95 }
96
97 pub fn codex_acp(version: impl Into<String>) -> Self {
99 Self {
100 family: DialectFamily::CodexAcp,
101 version: version.into(),
102 framing: "ndjson".into(),
103 profile: Some("codex".into()),
104 }
105 }
106
107 pub fn zai_cli(version: impl Into<String>) -> Self {
109 Self {
110 family: DialectFamily::ZaiCli,
111 version: version.into(),
112 framing: "ndjson".into(),
113 profile: Some("zai".into()),
114 }
115 }
116
117 pub fn claude_code(version: impl Into<String>) -> Self {
119 Self {
120 family: DialectFamily::ClaudeCode,
121 version: version.into(),
122 framing: "ndjson".into(),
123 profile: Some("claude_code".into()),
124 }
125 }
126
127 pub fn test_raw() -> Self {
129 Self {
130 family: DialectFamily::Test,
131 version: "v1".into(),
132 framing: "raw".into(),
133 profile: Some("fake".into()),
134 }
135 }
136}
137
138#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
140pub struct DialectBinding {
141 pub input: DialectDescriptor,
143 pub output: DialectDescriptor,
145 pub negotiation: DialectNegotiation,
147}
148
149impl DialectBinding {
150 pub fn fixed(dialect: DialectDescriptor) -> Self {
152 Self {
153 input: dialect.clone(),
154 output: dialect,
155 negotiation: DialectNegotiation::Fixed,
156 }
157 }
158
159 pub fn negotiated(dialect: DialectDescriptor) -> Self {
161 Self {
162 input: dialect.clone(),
163 output: dialect,
164 negotiation: DialectNegotiation::Negotiated,
165 }
166 }
167}