Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions crates/config/src/provider_templates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
//! - first-class gateways users still treat as "paste a Base URL"
//! (OpenCode Zen / Go), and
//! - named OpenAI-compatible custom routes that are not `ProviderKind`
//! variants (SenseNova, Baseten, Groq, Cerebras, Command Code). Hosted
//! variants (SenseNova, Baseten, Groq, Cerebras, Command Code, AICraft). Hosted
//! Chat Completions backends are descriptor rows — not new enum variants
//! and not compiled model rosters. Live `GET /v1/models` and the
//! Codewhale catalog are the offering list. Distinct *wires*
Expand All @@ -31,6 +31,12 @@ pub const SENSENOVA_BASE_URL: &str = "https://token.sensenova.cn/v1";
pub const SENSENOVA_DEFAULT_MODEL: &str = "deepseek-v4-flash";
pub const SENSENOVA_API_KEY_ENV: &str = "SENSENOVA_API_KEY";

/// AICraft — OpenAI-compatible MaaS gateway (aicraftapi.com).
pub const AICRAFT_TEMPLATE_ID: &str = "aicraft";
pub const AICRAFT_BASE_URL: &str = "https://aicraftapi.com/v1";
pub const AICRAFT_DEFAULT_MODEL: &str = "claude-4.6-sonnet";
pub const AICRAFT_API_KEY_ENV: &str = "AICRAFT_API_KEY";

/// Agnes is requested by #5350 but has no published OpenAI-compatible
/// host in this repository.
pub const AGNES_TEMPLATE_ID: &str = "agnes";
Expand Down Expand Up @@ -282,6 +288,17 @@ const TEMPLATES: &[ProviderSetupTemplate] = &[
credential_url: Some("https://commandcode.ai/provider"),
guidance: "Published Provider API. Live GET /v1/models is the roster. Do not import the Command Code CLI login. Store COMMAND_CODE_API_KEY, not a raw key.",
},
ProviderSetupTemplate {
id: AICRAFT_TEMPLATE_ID,
display_name: "AICraft",
apply: ProviderSetupApply::Compatible,
base_url: Some(AICRAFT_BASE_URL),
default_model: Some(AICRAFT_DEFAULT_MODEL),
api_key_env: Some(AICRAFT_API_KEY_ENV),
docs_url: Some("https://aicraftapi.com"),
credential_url: Some("https://aicraftapi.com"),
guidance: "AICraft MaaS gateway. OpenAI Chat Completions at aicraftapi.com. Store AICRAFT_API_KEY, not a raw key.",
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
},
ProviderSetupTemplate {
id: AGNES_TEMPLATE_ID,
display_name: "Agnes",
Expand Down Expand Up @@ -484,7 +501,7 @@ mod tests {
fn settings_value_names_fillable_then_unpublished() {
assert_eq!(
ProviderSetupTemplate::settings_value(),
"opencode-zen, opencode-go, sensenova, baseten, groq, cerebras, command-code; agnes unpublished"
"opencode-zen, opencode-go, sensenova, baseten, groq, cerebras, command-code, aicraft; agnes unpublished"
);
}

Expand Down Expand Up @@ -528,6 +545,7 @@ mod tests {
"https://api.commandcode.ai/provider/v1",
"COMMAND_CODE_API_KEY",
),
("aicraft", AICRAFT_TEMPLATE_ID, AICRAFT_BASE_URL, AICRAFT_API_KEY_ENV),
] {
let template = provider_setup_template(alias).unwrap_or_else(|| panic!("{alias}"));
assert_eq!(template.id, id);
Expand Down
1 change: 1 addition & 0 deletions docs/PROVIDERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ where every Chat Completions host belongs.
| Groq | compatible | `https://api.groq.com/openai/v1` | `llama-3.3-70b-versatile` | `GROQ_API_KEY` |
| Cerebras | compatible | `https://api.cerebras.ai/v1` | `llama-3.3-70b` | `CEREBRAS_API_KEY` |
| Command Code | compatible | `https://api.commandcode.ai/provider/v1` | `deepseek/deepseek-v4-flash` | `COMMAND_CODE_API_KEY` |
| AICraft | compatible | `https://aicraftapi.com/v1` | `claude-4.6-sonnet` | `AICRAFT_API_KEY` |
| Agnes | unpublished | none in this repository | — | — |

Agnes has no published URL here, so it is catalogued as unpublished rather than
Expand Down
Loading