Skip to content
Merged
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
3 changes: 3 additions & 0 deletions crates/goose-server/src/openapi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ impl<'__s> ToSchema<'__s> for AnnotatedSchema {
super::routes::recipe::scan_recipe,
super::routes::recipe::list_recipes,
super::routes::recipe::delete_recipe,
super::routes::setup::start_openrouter_setup,
super::routes::setup::start_tetrate_setup,
),
components(schemas(
super::routes::config_management::UpsertConfigQuery,
Expand Down Expand Up @@ -496,6 +498,7 @@ impl<'__s> ToSchema<'__s> for AnnotatedSchema {
super::routes::agent::ResumeAgentRequest,
super::routes::agent::StartAgentResponse,
super::routes::agent::ErrorResponse,
super::routes::setup::SetupResponse,
))
)]
pub struct ApiDoc;
Expand Down
27 changes: 19 additions & 8 deletions crates/goose-server/src/routes/setup.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
use crate::state::AppState;
use axum::{extract::State, http::StatusCode, routing::post, Json, Router};
use axum::{http::StatusCode, routing::post, Json, Router};
use goose::config::signup_openrouter::OpenRouterAuth;
use goose::config::signup_tetrate::{configure_tetrate, TetrateAuth};
use goose::config::{configure_openrouter, Config};
use serde::Serialize;
use std::sync::Arc;
use utoipa::ToSchema;

#[derive(Serialize)]
#[derive(Serialize, ToSchema)]
pub struct SetupResponse {
pub success: bool,
pub message: String,
Expand All @@ -19,9 +20,14 @@ pub fn routes(state: Arc<AppState>) -> Router {
.with_state(state)
}

async fn start_openrouter_setup(
State(_state): State<Arc<AppState>>,
) -> Result<Json<SetupResponse>, StatusCode> {
#[utoipa::path(
post,
path = "/handle_openrouter",
responses(
(status = 200, body=SetupResponse)
),
)]
async fn start_openrouter_setup() -> Result<Json<SetupResponse>, StatusCode> {
tracing::info!("Starting OpenRouter setup flow");

let mut auth_flow = OpenRouterAuth::new().map_err(|e| {
Expand Down Expand Up @@ -61,9 +67,14 @@ async fn start_openrouter_setup(
}
}

async fn start_tetrate_setup(
State(_state): State<Arc<AppState>>,
) -> Result<Json<SetupResponse>, StatusCode> {
#[utoipa::path(
post,
path = "/handle_tetrate",
responses(
(status = 200, body=SetupResponse)
),
)]
async fn start_tetrate_setup() -> Result<Json<SetupResponse>, StatusCode> {
tracing::info!("Starting Tetrate Agent Router Service setup flow");

let mut auth_flow = TetrateAuth::new().map_err(|e| {
Expand Down
55 changes: 55 additions & 0 deletions ui/desktop/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,46 @@
]
}
},
"/handle_openrouter": {
"post": {
"tags": [
"super::routes::setup"
],
"operationId": "start_openrouter_setup",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SetupResponse"
}
}
}
}
}
}
},
"/handle_tetrate": {
"post": {
"tags": [
"super::routes::setup"
],
"operationId": "start_tetrate_setup",
"responses": {
"200": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SetupResponse"
}
}
}
}
}
}
},
"/recipes/create": {
"post": {
"tags": [
Expand Down Expand Up @@ -3608,6 +3648,21 @@
}
}
},
"SetupResponse": {
"type": "object",
"required": [
"success",
"message"
],
"properties": {
"message": {
"type": "string"
},
"success": {
"type": "boolean"
}
}
},
"StartAgentRequest": {
"type": "object",
"required": [
Expand Down
16 changes: 15 additions & 1 deletion ui/desktop/src/api/sdk.gen.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// This file is auto-generated by @hey-api/openapi-ts

import type { Options as ClientOptions, TDataShape, Client } from './client';
import type { AddSubRecipesData, AddSubRecipesResponses, AddSubRecipesErrors, ExtendPromptData, ExtendPromptResponses, ExtendPromptErrors, ResumeAgentData, ResumeAgentResponses, ResumeAgentErrors, UpdateSessionConfigData, UpdateSessionConfigResponses, UpdateSessionConfigErrors, StartAgentData, StartAgentResponses, StartAgentErrors, GetToolsData, GetToolsResponses, GetToolsErrors, UpdateAgentProviderData, UpdateAgentProviderResponses, UpdateAgentProviderErrors, UpdateRouterToolSelectorData, UpdateRouterToolSelectorResponses, UpdateRouterToolSelectorErrors, ReadAllConfigData, ReadAllConfigResponses, BackupConfigData, BackupConfigResponses, BackupConfigErrors, CreateCustomProviderData, CreateCustomProviderResponses, CreateCustomProviderErrors, RemoveCustomProviderData, RemoveCustomProviderResponses, RemoveCustomProviderErrors, GetExtensionsData, GetExtensionsResponses, GetExtensionsErrors, AddExtensionData, AddExtensionResponses, AddExtensionErrors, RemoveExtensionData, RemoveExtensionResponses, RemoveExtensionErrors, InitConfigData, InitConfigResponses, InitConfigErrors, UpsertPermissionsData, UpsertPermissionsResponses, UpsertPermissionsErrors, ProvidersData, ProvidersResponses, GetProviderModelsData, GetProviderModelsResponses, GetProviderModelsErrors, ReadConfigData, ReadConfigResponses, ReadConfigErrors, RecoverConfigData, RecoverConfigResponses, RecoverConfigErrors, RemoveConfigData, RemoveConfigResponses, RemoveConfigErrors, UpsertConfigData, UpsertConfigResponses, UpsertConfigErrors, ValidateConfigData, ValidateConfigResponses, ValidateConfigErrors, ConfirmPermissionData, ConfirmPermissionResponses, ConfirmPermissionErrors, ManageContextData, ManageContextResponses, ManageContextErrors, CreateRecipeData, CreateRecipeResponses, CreateRecipeErrors, DecodeRecipeData, DecodeRecipeResponses, DecodeRecipeErrors, DeleteRecipeData, DeleteRecipeResponses, DeleteRecipeErrors, EncodeRecipeData, EncodeRecipeResponses, EncodeRecipeErrors, ListRecipesData, ListRecipesResponses, ListRecipesErrors, ScanRecipeData, ScanRecipeResponses, CreateScheduleData, CreateScheduleResponses, CreateScheduleErrors, DeleteScheduleData, DeleteScheduleResponses, DeleteScheduleErrors, ListSchedulesData, ListSchedulesResponses, ListSchedulesErrors, UpdateScheduleData, UpdateScheduleResponses, UpdateScheduleErrors, InspectRunningJobData, InspectRunningJobResponses, InspectRunningJobErrors, KillRunningJobData, KillRunningJobResponses, PauseScheduleData, PauseScheduleResponses, PauseScheduleErrors, RunNowHandlerData, RunNowHandlerResponses, RunNowHandlerErrors, SessionsHandlerData, SessionsHandlerResponses, SessionsHandlerErrors, UnpauseScheduleData, UnpauseScheduleResponses, UnpauseScheduleErrors, ListSessionsData, ListSessionsResponses, ListSessionsErrors, GetSessionHistoryData, GetSessionHistoryResponses, GetSessionHistoryErrors, StatusData, StatusResponses } from './types.gen';
import type { AddSubRecipesData, AddSubRecipesResponses, AddSubRecipesErrors, ExtendPromptData, ExtendPromptResponses, ExtendPromptErrors, ResumeAgentData, ResumeAgentResponses, ResumeAgentErrors, UpdateSessionConfigData, UpdateSessionConfigResponses, UpdateSessionConfigErrors, StartAgentData, StartAgentResponses, StartAgentErrors, GetToolsData, GetToolsResponses, GetToolsErrors, UpdateAgentProviderData, UpdateAgentProviderResponses, UpdateAgentProviderErrors, UpdateRouterToolSelectorData, UpdateRouterToolSelectorResponses, UpdateRouterToolSelectorErrors, ReadAllConfigData, ReadAllConfigResponses, BackupConfigData, BackupConfigResponses, BackupConfigErrors, CreateCustomProviderData, CreateCustomProviderResponses, CreateCustomProviderErrors, RemoveCustomProviderData, RemoveCustomProviderResponses, RemoveCustomProviderErrors, GetExtensionsData, GetExtensionsResponses, GetExtensionsErrors, AddExtensionData, AddExtensionResponses, AddExtensionErrors, RemoveExtensionData, RemoveExtensionResponses, RemoveExtensionErrors, InitConfigData, InitConfigResponses, InitConfigErrors, UpsertPermissionsData, UpsertPermissionsResponses, UpsertPermissionsErrors, ProvidersData, ProvidersResponses, GetProviderModelsData, GetProviderModelsResponses, GetProviderModelsErrors, ReadConfigData, ReadConfigResponses, ReadConfigErrors, RecoverConfigData, RecoverConfigResponses, RecoverConfigErrors, RemoveConfigData, RemoveConfigResponses, RemoveConfigErrors, UpsertConfigData, UpsertConfigResponses, UpsertConfigErrors, ValidateConfigData, ValidateConfigResponses, ValidateConfigErrors, ConfirmPermissionData, ConfirmPermissionResponses, ConfirmPermissionErrors, ManageContextData, ManageContextResponses, ManageContextErrors, StartOpenrouterSetupData, StartOpenrouterSetupResponses, StartTetrateSetupData, StartTetrateSetupResponses, CreateRecipeData, CreateRecipeResponses, CreateRecipeErrors, DecodeRecipeData, DecodeRecipeResponses, DecodeRecipeErrors, DeleteRecipeData, DeleteRecipeResponses, DeleteRecipeErrors, EncodeRecipeData, EncodeRecipeResponses, EncodeRecipeErrors, ListRecipesData, ListRecipesResponses, ListRecipesErrors, ScanRecipeData, ScanRecipeResponses, CreateScheduleData, CreateScheduleResponses, CreateScheduleErrors, DeleteScheduleData, DeleteScheduleResponses, DeleteScheduleErrors, ListSchedulesData, ListSchedulesResponses, ListSchedulesErrors, UpdateScheduleData, UpdateScheduleResponses, UpdateScheduleErrors, InspectRunningJobData, InspectRunningJobResponses, InspectRunningJobErrors, KillRunningJobData, KillRunningJobResponses, PauseScheduleData, PauseScheduleResponses, PauseScheduleErrors, RunNowHandlerData, RunNowHandlerResponses, RunNowHandlerErrors, SessionsHandlerData, SessionsHandlerResponses, SessionsHandlerErrors, UnpauseScheduleData, UnpauseScheduleResponses, UnpauseScheduleErrors, ListSessionsData, ListSessionsResponses, ListSessionsErrors, GetSessionHistoryData, GetSessionHistoryResponses, GetSessionHistoryErrors, StatusData, StatusResponses } from './types.gen';
import { client as _heyApiClient } from './client.gen';

export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean> = ClientOptions<TData, ThrowOnError> & {
Expand Down Expand Up @@ -260,6 +260,20 @@ export const manageContext = <ThrowOnError extends boolean = false>(options: Opt
});
};

export const startOpenrouterSetup = <ThrowOnError extends boolean = false>(options?: Options<StartOpenrouterSetupData, ThrowOnError>) => {
return (options?.client ?? _heyApiClient).post<StartOpenrouterSetupResponses, unknown, ThrowOnError>({
url: '/handle_openrouter',
...options
});
};

export const startTetrateSetup = <ThrowOnError extends boolean = false>(options?: Options<StartTetrateSetupData, ThrowOnError>) => {
return (options?.client ?? _heyApiClient).post<StartTetrateSetupResponses, unknown, ThrowOnError>({
url: '/handle_tetrate',
...options
});
};

/**
* Create a Recipe configuration from the current session
*/
Expand Down
31 changes: 31 additions & 0 deletions ui/desktop/src/api/types.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -782,6 +782,11 @@ export type Settings = {
temperature?: number | null;
};

export type SetupResponse = {
message: string;
success: boolean;
};

export type StartAgentRequest = {
recipe?: Recipe | null;
working_dir: string;
Expand Down Expand Up @@ -1615,6 +1620,32 @@ export type ManageContextResponses = {

export type ManageContextResponse = ManageContextResponses[keyof ManageContextResponses];

export type StartOpenrouterSetupData = {
body?: never;
path?: never;
query?: never;
url: '/handle_openrouter';
};

export type StartOpenrouterSetupResponses = {
200: SetupResponse;
};

export type StartOpenrouterSetupResponse = StartOpenrouterSetupResponses[keyof StartOpenrouterSetupResponses];

export type StartTetrateSetupData = {
body?: never;
path?: never;
query?: never;
url: '/handle_tetrate';
};

export type StartTetrateSetupResponses = {
200: SetupResponse;
};

export type StartTetrateSetupResponse = StartTetrateSetupResponses[keyof StartTetrateSetupResponses];

export type CreateRecipeData = {
body: CreateRecipeRequest;
path?: never;
Expand Down
19 changes: 6 additions & 13 deletions ui/desktop/src/utils/openRouterSetup.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
import { startOpenrouterSetup } from '../api';

export interface OpenRouterSetupStatus {
isRunning: boolean;
error: string | null;
}

export async function startOpenRouterSetup(): Promise<{ success: boolean; message: string }> {
const baseUrl = `${window.appConfig.get('GOOSE_API_HOST')}:${window.appConfig.get('GOOSE_PORT')}`;
const response = await fetch(`${baseUrl}/handle_openrouter`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});

if (!response.ok) {
console.error('Failed to start Openrouter setup:', response.statusText);
try {
return (await startOpenrouterSetup({ throwOnError: true })).data;
} catch (e) {
return {
success: false,
message: `Failed to start Openrouter setup ['${response.status}]`,
message: `Failed to start Openrouter setup ['${e}]`,
};
}

return await response.json();
}
20 changes: 6 additions & 14 deletions ui/desktop/src/utils/tetrateSetup.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
import { startTetrateSetup as startTetrateSetupApi } from '../api';

export interface TetrateSetupStatus {
isRunning: boolean;
error: string | null;
}

export async function startTetrateSetup(): Promise<{ success: boolean; message: string }> {
const baseUrl = `${window.appConfig.get('GOOSE_API_HOST')}:${window.appConfig.get('GOOSE_PORT')}`;
const response = await fetch(`${baseUrl}/handle_tetrate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
});

if (!response.ok) {
console.error('Failed to start Tetrate setup:', response.statusText);
try {
return (await startTetrateSetupApi({ throwOnError: true })).data;
} catch (e) {
return {
success: false,
message: `Failed to start Tetrate setup ['${response.status}]`,
message: `Failed to start Tetrate setup ['${e}]`,
};
}

const result = await response.json();
return result;
}
Loading