diff --git a/README.ja.md b/README.ja.md index 3191c26..2684f45 100644 --- a/README.ja.md +++ b/README.ja.md @@ -843,6 +843,29 @@ OpenCode が Debian / ArchLinux だとしたら、Oh My OpenCode は Ubuntu / [O *素晴らしいヒーロー画像を作成してくれた [@junhoyeo](https://github.com/junhoyeo) に感謝します* +## ユーザーレビュー + +> "人間が3ヶ月かかる仕事をClaude Codeが7日でやるなら、Sisyphusは1時間でやります" +> -- B, Quant Researcher + +> "Oh My Opencodeを使って、たった1日で8000個のeslint警告を解消しました" +> -- Jacob Ferrari, from [X](https://x.com/jacobferrari_/status/2003258761952289061) + +> "@yeon_gyu_kimを説得できるなら雇うべきです。彼はopencodeに革命を起こしました" +> -- [Sam Altmanの投稿へ](https://x.com/mysticaltech/status/2001858758608376079) + +> "これをコアに取り入れて彼を採用すべきです。マジで。本当に、本当に、本当に良いです" +> -- Henning Kilset, from X + +> "やばい、これマジで本物だ @androolloyd oh my opencode 最高すぎる" +> -- z80.eth, from [X](https://x.com/0xz80/status/2001815226505924791) + +> "oh-my-opencodeを使ってください、もう戻れませんよ" +> -- [d0t3ch](https://x.com/d0t3ch/status/2001685618200580503) + +> "Oh My Opencodeは頂点に立っています、敵はいません" +> -- [RyanOnThePath](https://x.com/RyanOnThePath/status/2001438321252118548) + ## こちらの企業の専門家にご愛用いただいています - [Indent](https://indentcorp.com) diff --git a/README.ko.md b/README.ko.md index ae20ed8..7b63efd 100644 --- a/README.ko.md +++ b/README.ko.md @@ -837,6 +837,29 @@ OpenCode 를 사용하여 이 프로젝트의 99% 를 작성했습니다. 기능 *멋진 히어로 이미지를 만들어주신 히어로 [@junhoyeo](https://github.com/junhoyeo) 께 감사드립니다* +## 사용자 후기 + +> "인간이 3달 동안 할 일을 claude code 가 7일만에 해준다면, 시지푸스는 1시간만에 해준다" +> -- B, Quant Researcher + +> "Oh My Opencode를 사용해서, 단 하루만에 8000개의 eslint 경고를 해결했습니다" +> -- Jacob Ferrari, from [X](https://x.com/jacobferrari_/status/2003258761952289061) + +> "@yeon_gyu_kim 을 설득할 수 있다면 고용하세요, 이 사람은 opencode를 혁신했습니다." +> -- [to Sam Altman's post](https://x.com/mysticaltech/status/2001858758608376079) + +> "이걸 코어에 넣고 그를 채용해야 합니다. 진심으로요. 이건 정말, 정말, 정말 좋습니다." +> -- Henning Kilset, from X + +> "와 미쳤다 @androolloyd 이건 진짜다 oh my opencode 개쩐다" +> -- z80.eth, from [X](https://x.com/0xz80/status/2001815226505924791) + +> "oh-my-opencode를 쓰세요, 절대 돌아갈 수 없을 겁니다" +> -- [d0t3ch](https://x.com/d0t3ch/status/2001685618200580503) + +> "Oh My Opencode는 독보적입니다, 경쟁자가 없습니다" +> -- [RyanOnThePath](https://x.com/RyanOnThePath/status/2001438321252118548) + ## 다음 기업의 능력있는 개인들이 사용하고 있습니다 - [Indent](https://indentcorp.com) diff --git a/README.md b/README.md index 36f1fcf..aef6803 100644 --- a/README.md +++ b/README.md @@ -438,8 +438,8 @@ To remove oh-my-opencode: - **oracle** (`openai/gpt-5.2`): Architecture, code review, strategy. Uses GPT-5.2 for its stellar logical reasoning and deep analysis. Inspired by AmpCode. - **librarian** (`anthropic/claude-sonnet-4-5`): Multi-repo analysis, doc lookup, implementation examples. Uses Claude Sonnet 4.5 for deep codebase understanding and GitHub research with evidence-based answers. Inspired by AmpCode. - **explore** (`opencode/grok-code`): Fast codebase exploration and pattern matching. Claude Code uses Haiku; we use Grok—it's free, blazing fast, and plenty smart for file traversal. Inspired by Claude Code. -- **frontend-ui-ux-engineer** (`google/gemini-3-pro-preview`): A designer turned developer. Builds gorgeous UIs. Gemini excels at creative, beautiful UI code. -- **document-writer** (`google/gemini-3-pro-preview`): Technical writing expert. Gemini is a wordsmith—writes prose that flows. +- **frontend-ui-ux-engineer** (`google/gemini-3-pro-high`): A designer turned developer. Builds gorgeous UIs. Gemini excels at creative, beautiful UI code. +- **document-writer** (`google/gemini-3-flash`): Technical writing expert. Gemini is a wordsmith—writes prose that flows. - **multimodal-looker** (`google/gemini-3-flash`): Visual content specialist. Analyzes PDFs, images, diagrams to extract information. The main agent invokes these automatically, but you can call them explicitly: @@ -909,6 +909,29 @@ I have no affiliation with any project or model mentioned here. This is purely p *Special thanks to [@junhoyeo](https://github.com/junhoyeo) for this amazing hero image.* +## Reviews + +> "If Claude Code does in 7 days what human does in 3 months, Sisyphus does in 1 hour" +> -- B, Quant Researcher + +> "Knocked out 8000 eslint warnings with Oh My Opencode, just in a day" +> -- Jacob Ferrari, from [X](https://x.com/jacobferrari_/status/2003258761952289061) + +> "Hire @yeon_gyu_kim if you can convince him, this dude has revolutionized opencode." +> -- [to Sam Altman's post](https://x.com/mysticaltech/status/2001858758608376079) + +> "You guys should pull this into core and recruit him. Seriously. It's really, really, really good." +> -- Henning Kilset, from X + +> "ok yeah holy shit @androolloyd this thing is legit oh my opencode is sick" +> -- z80.eth, from [X](https://x.com/0xz80/status/2001815226505924791) + +> "use oh-my-opencode, you will never go back" +> -- [d0t3ch](https://x.com/d0t3ch/status/2001685618200580503) + +> "Oh My Opencode is king of the hill and has no contenders" +> -- [RyanOnThePath](https://x.com/RyanOnThePath/status/2001438321252118548) + ## Loved by professionals at - [Indent](https://indentcorp.com) diff --git a/README.zh-cn.md b/README.zh-cn.md index be954fb..35775ac 100644 --- a/README.zh-cn.md +++ b/README.zh-cn.md @@ -797,7 +797,6 @@ Oh My OpenCode 送你重构工具(重命名、代码操作)。 **警告**:这些功能是实验性的,可能会导致意外行为。只有在理解其影响的情况下才启用。 - ## 作者的话 装个 Oh My OpenCode 试试。 @@ -843,6 +842,29 @@ Oh My OpenCode 送你重构工具(重命名、代码操作)。 *感谢 [@junhoyeo](https://github.com/junhoyeo) 制作了这张超帅的 hero 图。* +## 用户评价 + +> "如果 Claude Code 能在 7 天内完成人类 3 个月的工作,那么 Sisyphus 只需要 1 小时" +> -- B, Quant Researcher + +> "只用了一天,就用 Oh My Opencode 干掉了 8000 个 eslint 警告" +> -- Jacob Ferrari, from [X](https://x.com/jacobferrari_/status/2003258761952289061) + +> "如果你能说服 @yeon_gyu_kim,就雇佣他吧,这家伙彻底彻底改变了 opencode" +> -- [回复 Sam Altman 的帖子](https://x.com/mysticaltech/status/2001858758608376079) + +> "你们应该把它合并到核心代码里并聘用他。认真的。这真的、真的、真的很好" +> -- Henning Kilset, from X + +> "哇靠 @androolloyd 这玩意儿是真的,oh my opencode 太强了" +> -- z80.eth, from [X](https://x.com/0xz80/status/2001815226505924791) + +> "用了 oh-my-opencode,你就回不去了" +> -- [d0t3ch](https://x.com/d0t3ch/status/2001685618200580503) + +> "Oh My Opencode 独孤求败,没有对手" +> -- [RyanOnThePath](https://x.com/RyanOnThePath/status/2001438321252118548) + ## 以下企业的专业人士都在用 - [Indent](https://indentcorp.com) diff --git a/src/auth/antigravity/request.ts b/src/auth/antigravity/request.ts index d35eb04..c8a07c0 100644 --- a/src/auth/antigravity/request.ts +++ b/src/auth/antigravity/request.ts @@ -5,10 +5,10 @@ */ import { - ANTIGRAVITY_HEADERS, - ANTIGRAVITY_ENDPOINT_FALLBACKS, - ANTIGRAVITY_API_VERSION, - SKIP_THOUGHT_SIGNATURE_VALIDATOR, + ANTIGRAVITY_API_VERSION, + ANTIGRAVITY_ENDPOINT_FALLBACKS, + ANTIGRAVITY_HEADERS, + SKIP_THOUGHT_SIGNATURE_VALIDATOR, } from "./constants" import type { AntigravityRequestBody } from "./types" @@ -262,7 +262,7 @@ export function transformRequest(options: TransformRequestOptions): TransformedR } = options const effectiveModel = - modelName || extractModelFromBody(body) || extractModelFromUrl(url) || "gemini-3-pro-preview" + modelName || extractModelFromBody(body) || extractModelFromUrl(url) || "gemini-3-pro-high" const streaming = isStreamingRequest(url, body) const action = streaming ? "streamGenerateContent" : "generateContent" diff --git a/src/cli/config-manager.test.ts b/src/cli/config-manager.test.ts new file mode 100644 index 0000000..82c81cf --- /dev/null +++ b/src/cli/config-manager.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from "bun:test" + +import { ANTIGRAVITY_PROVIDER_CONFIG } from "./config-manager" + +describe("config-manager ANTIGRAVITY_PROVIDER_CONFIG", () => { + test("Gemini models include full spec (limit + modalities)", () => { + const google = (ANTIGRAVITY_PROVIDER_CONFIG as any).google + expect(google).toBeTruthy() + + const models = google.models as Record + expect(models).toBeTruthy() + + const required = [ + "gemini-3-pro-high", + "gemini-3-pro-medium", + "gemini-3-pro-low", + "gemini-3-flash", + "gemini-3-flash-lite", + ] + + for (const key of required) { + const model = models[key] + expect(model).toBeTruthy() + expect(typeof model.name).toBe("string") + expect(model.name.includes("(Antigravity)")).toBe(true) + + expect(model.limit).toBeTruthy() + expect(typeof model.limit.context).toBe("number") + expect(typeof model.limit.output).toBe("number") + + expect(model.modalities).toBeTruthy() + expect(Array.isArray(model.modalities.input)).toBe(true) + expect(Array.isArray(model.modalities.output)).toBe(true) + } + }) +}) diff --git a/src/cli/config-manager.ts b/src/cli/config-manager.ts index 8bc5cdb..04a288d 100644 --- a/src/cli/config-manager.ts +++ b/src/cli/config-manager.ts @@ -1,7 +1,7 @@ -import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs" -import { join } from "node:path" +import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs" import { homedir } from "node:os" -import type { ConfigMergeResult, InstallConfig, DetectedConfig } from "./types" +import { join } from "node:path" +import type { ConfigMergeResult, DetectedConfig, InstallConfig } from "./types" const OPENCODE_CONFIG_DIR = join(homedir(), ".config", "opencode") const OPENCODE_JSON = join(OPENCODE_CONFIG_DIR, "opencode.json") @@ -359,16 +359,46 @@ export async function runBunInstall(): Promise { } } -const ANTIGRAVITY_PROVIDER_CONFIG = { +export const ANTIGRAVITY_PROVIDER_CONFIG = { google: { name: "Google", api: "antigravity", + // NOTE: opencode-antigravity-auth expects full model specs (name/limit/modalities). + // If these are incomplete, models may appear but fail at runtime (e.g. 404). models: { - "gemini-3-pro-high": { name: "Gemini 3 Pro (High)", thinking: true, attachment: true }, - "gemini-3-pro-medium": { name: "Gemini 3 Pro (Medium)", thinking: true, attachment: true }, - "gemini-3-pro-low": { name: "Gemini 3 Pro (Low)", thinking: true, attachment: true }, - "gemini-3-flash": { name: "Gemini 3 Flash", attachment: true }, - "gemini-3-flash-lite": { name: "Gemini 3 Flash Lite", attachment: true }, + "gemini-3-pro-high": { + name: "Gemini 3 Pro High (Antigravity)", + thinking: true, + attachment: true, + limit: { context: 1048576, output: 65535 }, + modalities: { input: ["text", "image", "pdf"], output: ["text"] }, + }, + "gemini-3-pro-medium": { + name: "Gemini 3 Pro Medium (Antigravity)", + thinking: true, + attachment: true, + limit: { context: 1048576, output: 65535 }, + modalities: { input: ["text", "image", "pdf"], output: ["text"] }, + }, + "gemini-3-pro-low": { + name: "Gemini 3 Pro Low (Antigravity)", + thinking: true, + attachment: true, + limit: { context: 1048576, output: 65535 }, + modalities: { input: ["text", "image", "pdf"], output: ["text"] }, + }, + "gemini-3-flash": { + name: "Gemini 3 Flash (Antigravity)", + attachment: true, + limit: { context: 1048576, output: 65536 }, + modalities: { input: ["text", "image", "pdf"], output: ["text"] }, + }, + "gemini-3-flash-lite": { + name: "Gemini 3 Flash Lite (Antigravity)", + attachment: true, + limit: { context: 1048576, output: 65536 }, + modalities: { input: ["text", "image", "pdf"], output: ["text"] }, + }, }, }, }