mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 19:28:28 +00:00
chore: migrate to oxlint and oxfmt
Co-authored-by: Christoph Nakazawa <christoph.pojer@gmail.com>
This commit is contained in:
@@ -8,19 +8,13 @@ import {
|
||||
complete,
|
||||
type Model,
|
||||
} from "@mariozechner/pi-ai";
|
||||
import {
|
||||
discoverAuthStorage,
|
||||
discoverModels,
|
||||
} from "@mariozechner/pi-coding-agent";
|
||||
import { discoverAuthStorage, discoverModels } from "@mariozechner/pi-coding-agent";
|
||||
import { Type } from "@sinclair/typebox";
|
||||
|
||||
import type { ClawdbotConfig } from "../../config/config.js";
|
||||
import { resolveUserPath } from "../../utils.js";
|
||||
import { loadWebMedia } from "../../web/media.js";
|
||||
import {
|
||||
ensureAuthProfileStore,
|
||||
listProfilesForProvider,
|
||||
} from "../auth-profiles.js";
|
||||
import { ensureAuthProfileStore, listProfilesForProvider } from "../auth-profiles.js";
|
||||
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from "../defaults.js";
|
||||
import { minimaxUnderstandImage } from "../minimax-vlm.js";
|
||||
import { getApiKeyForModel, resolveEnvApiKey } from "../model-auth.js";
|
||||
@@ -48,24 +42,15 @@ function resolveDefaultModelRef(cfg?: ClawdbotConfig): {
|
||||
provider: string;
|
||||
model: string;
|
||||
} {
|
||||
const modelConfig = cfg?.agents?.defaults?.model as
|
||||
| { primary?: string }
|
||||
| string
|
||||
| undefined;
|
||||
const raw =
|
||||
typeof modelConfig === "string"
|
||||
? modelConfig.trim()
|
||||
: modelConfig?.primary?.trim();
|
||||
const modelConfig = cfg?.agents?.defaults?.model as { primary?: string } | string | undefined;
|
||||
const raw = typeof modelConfig === "string" ? modelConfig.trim() : modelConfig?.primary?.trim();
|
||||
const parsed =
|
||||
parseModelRef(raw ?? "", DEFAULT_PROVIDER) ??
|
||||
({ provider: DEFAULT_PROVIDER, model: DEFAULT_MODEL } as const);
|
||||
return { provider: parsed.provider, model: parsed.model };
|
||||
}
|
||||
|
||||
function hasAuthForProvider(params: {
|
||||
provider: string;
|
||||
agentDir: string;
|
||||
}): boolean {
|
||||
function hasAuthForProvider(params: { provider: string; agentDir: string }): boolean {
|
||||
if (resolveEnvApiKey(params.provider)?.apiKey) return true;
|
||||
const store = ensureAuthProfileStore(params.agentDir, {
|
||||
allowKeychainPrompt: false,
|
||||
@@ -156,33 +141,18 @@ export function resolveImageModelConfigForTool(params: {
|
||||
return null;
|
||||
}
|
||||
|
||||
function pickMaxBytes(
|
||||
cfg?: ClawdbotConfig,
|
||||
maxBytesMb?: number,
|
||||
): number | undefined {
|
||||
if (
|
||||
typeof maxBytesMb === "number" &&
|
||||
Number.isFinite(maxBytesMb) &&
|
||||
maxBytesMb > 0
|
||||
) {
|
||||
function pickMaxBytes(cfg?: ClawdbotConfig, maxBytesMb?: number): number | undefined {
|
||||
if (typeof maxBytesMb === "number" && Number.isFinite(maxBytesMb) && maxBytesMb > 0) {
|
||||
return Math.floor(maxBytesMb * 1024 * 1024);
|
||||
}
|
||||
const configured = cfg?.agents?.defaults?.mediaMaxMb;
|
||||
if (
|
||||
typeof configured === "number" &&
|
||||
Number.isFinite(configured) &&
|
||||
configured > 0
|
||||
) {
|
||||
if (typeof configured === "number" && Number.isFinite(configured) && configured > 0) {
|
||||
return Math.floor(configured * 1024 * 1024);
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function buildImageContext(
|
||||
prompt: string,
|
||||
base64: string,
|
||||
mimeType: string,
|
||||
): Context {
|
||||
function buildImageContext(prompt: string, base64: string, mimeType: string): Context {
|
||||
return {
|
||||
messages: [
|
||||
{
|
||||
@@ -201,8 +171,7 @@ async function resolveSandboxedImagePath(params: {
|
||||
sandboxRoot: string;
|
||||
imagePath: string;
|
||||
}): Promise<{ resolved: string; rewrittenFrom?: string }> {
|
||||
const normalize = (p: string) =>
|
||||
p.startsWith("file://") ? p.slice("file://".length) : p;
|
||||
const normalize = (p: string) => (p.startsWith("file://") ? p.slice("file://".length) : p);
|
||||
const filePath = normalize(params.imagePath);
|
||||
try {
|
||||
const out = await assertSandboxPath({
|
||||
@@ -269,9 +238,7 @@ async function runImagePrompt(params: {
|
||||
throw new Error(`Unknown model: ${provider}/${modelId}`);
|
||||
}
|
||||
if (!model.input?.includes("image")) {
|
||||
throw new Error(
|
||||
`Model does not support images: ${provider}/${modelId}`,
|
||||
);
|
||||
throw new Error(`Model does not support images: ${provider}/${modelId}`);
|
||||
}
|
||||
const apiKeyInfo = await getApiKeyForModel({
|
||||
model,
|
||||
@@ -291,11 +258,7 @@ async function runImagePrompt(params: {
|
||||
return { text, provider: model.provider, model: model.id };
|
||||
}
|
||||
|
||||
const context = buildImageContext(
|
||||
params.prompt,
|
||||
params.base64,
|
||||
params.mimeType,
|
||||
);
|
||||
const context = buildImageContext(params.prompt, params.base64, params.mimeType);
|
||||
const message = (await complete(model, context, {
|
||||
apiKey: apiKeyInfo.apiKey,
|
||||
maxTokens: 512,
|
||||
@@ -351,12 +314,8 @@ export function createImageTool(options?: {
|
||||
maxBytesMb: Type.Optional(Type.Number()),
|
||||
}),
|
||||
execute: async (_toolCallId, args) => {
|
||||
const record =
|
||||
args && typeof args === "object"
|
||||
? (args as Record<string, unknown>)
|
||||
: {};
|
||||
const imageRawInput =
|
||||
typeof record.image === "string" ? record.image.trim() : "";
|
||||
const record = args && typeof args === "object" ? (args as Record<string, unknown>) : {};
|
||||
const imageRawInput = typeof record.image === "string" ? record.image.trim() : "";
|
||||
const imageRaw = imageRawInput.startsWith("@")
|
||||
? imageRawInput.slice(1).trim()
|
||||
: imageRawInput;
|
||||
@@ -372,13 +331,7 @@ export function createImageTool(options?: {
|
||||
const isFileUrl = /^file:/i.test(imageRaw);
|
||||
const isHttpUrl = /^https?:\/\//i.test(imageRaw);
|
||||
const isDataUrl = /^data:/i.test(imageRaw);
|
||||
if (
|
||||
hasScheme &&
|
||||
!looksLikeWindowsDrivePath &&
|
||||
!isFileUrl &&
|
||||
!isHttpUrl &&
|
||||
!isDataUrl
|
||||
) {
|
||||
if (hasScheme && !looksLikeWindowsDrivePath && !isFileUrl && !isHttpUrl && !isDataUrl) {
|
||||
return {
|
||||
content: [
|
||||
{
|
||||
@@ -397,11 +350,8 @@ export function createImageTool(options?: {
|
||||
? record.prompt.trim()
|
||||
: DEFAULT_PROMPT;
|
||||
const modelOverride =
|
||||
typeof record.model === "string" && record.model.trim()
|
||||
? record.model.trim()
|
||||
: undefined;
|
||||
const maxBytesMb =
|
||||
typeof record.maxBytesMb === "number" ? record.maxBytesMb : undefined;
|
||||
typeof record.model === "string" && record.model.trim() ? record.model.trim() : undefined;
|
||||
const maxBytesMb = typeof record.maxBytesMb === "number" ? record.maxBytesMb : undefined;
|
||||
const maxBytes = pickMaxBytes(options?.config, maxBytesMb);
|
||||
|
||||
const sandboxRoot = options?.sandboxRoot?.trim();
|
||||
@@ -415,19 +365,18 @@ export function createImageTool(options?: {
|
||||
if (imageRaw.startsWith("~")) return resolveUserPath(imageRaw);
|
||||
return imageRaw;
|
||||
})();
|
||||
const resolvedPathInfo: { resolved: string; rewrittenFrom?: string } =
|
||||
isDataUrl
|
||||
? { resolved: "" }
|
||||
: sandboxRoot
|
||||
? await resolveSandboxedImagePath({
|
||||
sandboxRoot,
|
||||
imagePath: resolvedImage,
|
||||
})
|
||||
: {
|
||||
resolved: resolvedImage.startsWith("file://")
|
||||
? resolvedImage.slice("file://".length)
|
||||
: resolvedImage,
|
||||
};
|
||||
const resolvedPathInfo: { resolved: string; rewrittenFrom?: string } = isDataUrl
|
||||
? { resolved: "" }
|
||||
: sandboxRoot
|
||||
? await resolveSandboxedImagePath({
|
||||
sandboxRoot,
|
||||
imagePath: resolvedImage,
|
||||
})
|
||||
: {
|
||||
resolved: resolvedImage.startsWith("file://")
|
||||
? resolvedImage.slice("file://".length)
|
||||
: resolvedImage,
|
||||
};
|
||||
const resolvedPath = isDataUrl ? null : resolvedPathInfo.resolved;
|
||||
|
||||
const media = isDataUrl
|
||||
|
||||
Reference in New Issue
Block a user