Skip to main content

thndrs_lib/core/providers/
opencode.rs

1//! OpenCode provider implementations.
2
3pub mod go;
4pub mod zen;
5
6pub use go::OpenCodeGoClient;
7
8use crate::providers::KnownModel;
9
10/// OpenAI-compatible model list response shared by OpenCode providers.
11#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
12pub struct ModelsResponse {
13    pub object: String,
14    #[serde(default)]
15    pub data: Vec<ModelInfo>,
16}
17
18/// OpenAI-compatible model metadata shared by OpenCode providers.
19#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
20pub struct ModelInfo {
21    pub id: String,
22    pub object: String,
23    pub created: u64,
24    pub owned_by: String,
25}
26
27/// Whether `model` is an OpenCode Go model id.
28pub fn is_go_model_id(model: &str) -> bool {
29    go::is_model_id(model)
30}
31
32/// Whether `model` is an OpenCode Zen model id.
33pub fn is_zen_model_id(model: &str) -> bool {
34    zen::is_model_id(model)
35}
36
37/// Whether `model` is any OpenCode-backed model id.
38pub fn is_model_id(model: &str) -> bool {
39    is_go_model_id(model) || is_zen_model_id(model)
40}
41
42/// Offline model picker entries for all OpenCode-backed providers.
43pub fn known_models() -> Vec<KnownModel> {
44    let mut models = zen::known_models();
45    models.extend(go::known_models());
46    models
47}
48
49/// Validate an OpenCode Go API key.
50pub fn validate_go_api_key(api_key: &str) -> std::result::Result<(), String> {
51    go::validate_api_key(api_key)
52}
53
54/// Validate an OpenCode Zen API key.
55pub fn validate_zen_api_key(api_key: &str) -> std::result::Result<(), String> {
56    zen::validate_api_key(api_key)
57}
58
59pub fn probe_go_api_key(api_key: &str) -> crate::providers::Result<()> {
60    go::probe_api_key(api_key)
61}
62
63pub fn probe_zen_api_key(api_key: &str) -> crate::providers::Result<()> {
64    zen::probe_api_key(api_key)
65}