当前位置: 首页 > news >正文

当AI遇上终端:Gemini CLI的技术魔法与架构奥秘

"代码不仅仅是指令的集合,更是思想的载体。当AI与终端相遇,会碰撞出怎样的火花?"

在这个AI技术日新月异的时代,Google推出的Gemini CLI无疑是一颗璀璨的明星。它不仅仅是一个命令行工具,更是一个将人工智能无缝融入开发者日常工作流的革命性产品。今天,让我们深入这个项目的源码,一探其技术架构的精妙之处。

🎯 项目概览:不只是CLI那么简单

核心定位与价值主张

Gemini CLI定位为"命令行AI工作流工具",但这个简单的描述远远不能概括它的强大。从源码分析来看,它实际上是一个:

  • 智能代码助手:能够理解和操作大型代码库(支持1M token上下文窗口)

  • 多模态应用生成器:可以从PDF或草图生成完整应用

  • 自动化运维工具:处理复杂的Git操作和系统任务

  • 可扩展工具平台:支持MCP服务器和自定义工具集成

技术栈一览

通过分析package.json和源码结构,我们可以看到Gemini CLI采用了现代化的技术栈:

{"name": "@google/gemini-cli","version": "0.1.5","type": "module","workspaces": ["packages/*"]
}
  • 前端框架:React + Ink(终端UI框架)

  • 后端语言:TypeScript + Node.js

  • 构建工具:esbuild(高性能打包)

  • 测试框架:Vitest(现代化测试工具)

  • 容器化:Docker/Podman沙箱支持

🏗️ 架构设计:模块化的艺术

双包架构:前后端分离的智慧

Gemini CLI采用了经典的前后端分离架构,通过workspace管理两个核心包:

packages/
├── cli/          # 用户界面层
└── core/         # 业务逻辑层

这种设计的精妙之处在于:

  1. 职责清晰:CLI包专注用户体验,Core包专注业务逻辑

  2. 可扩展性:未来可以轻松添加Web界面或其他前端

  3. 测试友好:业务逻辑与UI完全解耦,便于单元测试

CLI包:终端UI的React革命

让我们看看CLI包的核心入口gemini.tsx

export async function main() {const workspaceRoot = process.cwd();const settings = loadSettings(workspaceRoot);// 沙箱检查和内存配置if (!process.env.SANDBOX) {const sandboxConfig = config.getSandbox();if (sandboxConfig) {await start_sandbox(sandboxConfig, memoryArgs);process.exit(0);}}// 渲染React UIif (process.stdin.isTTY && input?.length === 0) {render(<React.StrictMode><AppWrapper config={config} settings={settings} /></React.StrictMode>,{ exitOnCtrlC: false });}
}

这里有几个值得注意的技术细节:

  1. 内存自适应:动态调整Node.js堆内存大小,充分利用系统资源

  2. 沙箱优先:安全第一,自动检测并启用沙箱环境

  3. React严格模式:确保组件的健壮性和未来兼容性

Core包:AI交互的引擎

Core包是整个系统的大脑,负责与Gemini API的交互。让我们看看GeminiChat类的核心实现:

export class GeminiChat {async sendMessageStream(params: SendMessageParameters): Promise<AsyncGenerator<GenerateContentResponse>> {const startTime = Date.now();try {const apiCall = () => this.contentGenerator.generateContentStream({model: this.config.getModel(),contents: requestContents,config: { ...this.generationConfig, ...params.config },});// 智能重试机制const streamResponse = await retryWithBackoff(apiCall, {shouldRetry: (error: Error) => {if (error?.message?.includes('429')) return true;if (error?.message?.match(/5\d{2}/)) return true;return false;},onPersistent429: async (authType?: string) => await this.handleFlashFallback(authType),});return this.processStreamResponse(streamResponse, userContent, startTime);} catch (error) {this._logApiError(Date.now() - startTime, error);throw error;}}
}

这段代码展现了几个高级特性:

  1. 流式响应:支持实时流式输出,提升用户体验

  2. 智能重试:针对429和5xx错误的自动重试机制

  3. 模型降级:当遇到持续429错误时,自动降级到Flash模型

  4. 完整遥测:详细的API调用日志和性能监控

🛠️ 工具系统:可扩展的能力引擎

工具架构设计

Gemini CLI的工具系统是其最核心的特性之一。通过分析tools.ts接口定义,我们可以看到其设计的精妙:

export interface Tool<TParams = unknown, TResult extends ToolResult = ToolResult> {name: string;                    // 工具标识displayName: string;             // 用户友好名称description: string;             // 功能描述schema: FunctionDeclaration;     // 参数模式isOutputMarkdown: boolean;       // 输出格式canUpdateOutput: boolean;        // 是否支持流式更新validateToolParams(params: TParams): string | null;shouldConfirmExecute(params: TParams, abortSignal: AbortSignal): Promise<ToolCallConfirmationDetails | false>;execute(params: TParams, signal: AbortSignal, updateOutput?: (output: string) => void): Promise<TResult>;
}

这个接口设计体现了几个重要原则:

  1. 类型安全:泛型参数确保参数和返回值的类型安全

  2. 用户确认:危险操作需要用户明确确认

  3. 可中断性:所有操作都支持AbortSignal中断

  4. 流式输出:支持实时更新输出内容

内置工具生态

通过源码分析,Gemini CLI内置了丰富的工具集:

文件系统工具
  • ReadFileTool:智能文件读取,支持大文件分块

  • WriteFileTool:安全文件写入,带冲突检测

  • EditTool:精确代码编辑,支持多种编辑模式

  • LSTool:目录列表,支持过滤和排序

  • GlobTool:模式匹配文件搜索

  • GrepTool:正则表达式文本搜索

执行工具
  • ShellTool:安全的Shell命令执行

让我们看看ShellTool的实现细节:

export class ShellTool extends BaseTool<ShellToolParams, ToolResult> {async shouldConfirmExecute(params: ShellToolParams): Promise<ToolCallConfirmationDetails | false> {const validationError = this.validateParams(params);if (validationError) return false;return {title: `Execute Shell Command`,message: `**Command:** \`${params.command}\`\n**Directory:** ${params.directory || '(project root)'}`,onConfirm: async () => {// 用户确认后的回调}};}async execute(params: ShellToolParams, signal: AbortSignal): Promise<ToolResult> {const { command, directory } = params;const workingDir = directory ? path.resolve(this.config.getProjectRoot(), directory) : this.config.getProjectRoot();// 安全执行Shell命令const result = await this.executeCommand(command, workingDir, signal);return {llmContent: this.formatResultForLLM(result),returnDisplay: this.formatResultForUser(result)};}
}
网络工具
  • WebFetchTool:HTTP请求工具,支持多种内容类型

  • WebSearchTool:集成Google搜索,支持实时信息获取

记忆工具
  • MemoryTool:持久化记忆系统,支持层次化上下文

工具调度系统

CoreToolScheduler是工具系统的调度核心,负责工具的验证、确认和执行:

export class CoreToolScheduler {async schedule(request: ToolCallRequestInfo | ToolCallRequestInfo[], signal: AbortSignal): Promise<void> {const newToolCalls = Array.isArray(request) ? request : [request];for (const toolCall of newToolCalls) {const { request: reqInfo, tool: toolInstance } = toolCall;try {if (this.approvalMode === ApprovalMode.YOLO) {// YOLO模式:直接执行this.setStatusInternal(reqInfo.callId, 'scheduled');} else {// 安全模式:需要用户确认const confirmationDetails = await toolInstance.shouldConfirmExecute(reqInfo.args, signal);if (confirmationDetails) {this.setStatusInternal(reqInfo.callId, 'awaiting_approval', confirmationDetails);} else {this.setStatusInternal(reqInfo.callId, 'scheduled');}}} catch (error) {this.setStatusInternal(reqInfo.callId, 'error', createErrorResponse(reqInfo, error));}}this.attemptExecutionOfScheduledCalls(signal);}
}

这个设计的亮点在于:

  1. 批量处理:支持同时调度多个工具调用

  2. 状态管理:完整的工具调用生命周期管理

  3. 错误处理:优雅的错误捕获和恢复机制

  4. 用户控制:灵活的确认机制,平衡安全性和效率

🎨 React终端UI:突破传统的界面革新

Ink框架的巧妙运用

Gemini CLI使用Ink框架在终端中渲染React组件,这是一个极具创新性的技术选择。让我们看看主应用组件的实现:

const App = ({ config, settings, startupWarnings = [] }: AppProps) => {const [history, addItem, clearItems, loadHistory] = useHistory();const { consoleMessages, handleNewMessage } = useConsoleMessages();const { stats: sessionStats } = useSessionStats();return (<StreamingContext.Provider value={streamingState}><Box flexDirection="column" marginBottom={1} width="90%"><Static key={staticKey} items={[<Box flexDirection="column" key="header"><Header terminalWidth={terminalWidth} /><Tips config={config} />{updateMessage && <UpdateNotification message={updateMessage} />}</Box>,...history.map((h) => (<HistoryItemDisplayterminalWidth={mainAreaWidth}availableTerminalHeight={staticAreaMaxItemHeight}key={h.id}item={h}config={config}/>)),]}>{(item) => item}</Static><OverflowProvider><Box ref={pendingHistoryItemRef}>{/* 动态内容区域 */}</Box></OverflowProvider></Box></StreamingContext.Provider>);
};

这里使用了Ink的Static组件来优化性能,这是一个非常聪明的设计:

  1. 静态内容优化:历史消息只渲染一次,避免重复绘制

  2. 动态内容分离:将变化的内容与静态内容分离

  3. 内存管理:通过key机制控制组件的重新创建

输入系统的精妙设计

InputPrompt组件展现了复杂的输入处理逻辑:

export const InputPrompt: React.FC<InputPromptProps> = ({buffer, onSubmit, config, slashCommands, shellModeActive
}) => {const completion = useCompletion(buffer.text,config.getTargetDir(),isAtCommand(buffer.text) || isSlashCommand(buffer.text),slashCommands,config,);const inputHistory = useInputHistory({userMessages,onSubmit: handleSubmitAndClear,isActive: !completion.showSuggestions && !shellModeActive,currentQuery: buffer.text,onChange: customSetTextAndResetCompletionSignal,});// 智能输入处理逻辑useInput((input, key) => {if (key.tab && completion.showSuggestions) {completion.acceptSuggestion();return;}if (key.upArrow || key.downArrow) {inputHistory.navigate(key.upArrow ? 'up' : 'down');return;}// 其他输入处理...});
};

这个设计包含了多个高级特性:

  1. 智能补全:基于文件路径和命令的自动补全

  2. 历史记录:支持上下箭头导航历史输入

  3. 模式切换:支持普通模式和Shell模式的无缝切换

  4. 实时反馈:输入过程中的实时提示和验证

流式输出的实现

useGeminiStream Hook是处理AI响应流的核心:

export const useGeminiStream = (geminiClient: GeminiClient, config: Config) => {const [streamingState, setStreamingState] = useState<StreamingState>('idle');const sendMessage = useCallback(async (query: PartListUnion, abortSignal: AbortSignal) => {setStreamingState('streaming');try {const streamResponse = await geminiClient.sendMessageStream({message: query,config: generationConfig,});for await (const chunk of streamResponse) {if (abortSignal.aborted) break;// 处理流式响应processStreamChunk(chunk);}setStreamingState('idle');} catch (error) {setStreamingState('error');handleError(error);}}, [geminiClient, config]);return { sendMessage, streamingState };
};

🔒 安全机制:沙箱技术的深度应用

多层次沙箱策略

Gemini CLI实现了多层次的安全防护机制:

1. macOS Seatbelt沙箱
// sandbox-macos-permissive-open.sb
(version 1)
(deny default)
(allow process-fork)
(allow process-exec)// 限制文件系统访问
(allow file-read* file-write*(subpath "/tmp")(subpath (param "PROJECT_ROOT")))// 限制网络访问
(allow network-outbound(remote tcp "*:80")(remote tcp "*:443"))
2. 容器化沙箱
export async function start_sandbox(config: SandboxConfig, nodeArgs: string[] = []) {const containerArgs = ['run', '--rm', '-it','--workdir', '/app','-v', `${config.projectRoot}:/app`,'-v', `${os.tmpdir()}:/tmp`,'--user', await getCurrentUser(),config.image,...entrypoint('/app'),...nodeArgs];const child = spawn(config.command, containerArgs, {stdio: 'inherit',env: { ...process.env, SANDBOX: config.command }});await new Promise((resolve) => child.on('close', resolve));
}

工具执行的安全控制

每个工具都实现了严格的安全检查:

async shouldConfirmExecute(params: ShellToolParams): Promise<ToolCallConfirmationDetails | false> {// 参数验证const validationError = this.validateParams(params);if (validationError) return false;// 危险命令检测if (this.isDangerousCommand(params.command)) {return {title: `⚠️ Potentially Dangerous Command`,message: `This command may modify system files or settings.\n**Command:** \`${params.command}\``,confirmText: 'Execute Anyway',cancelText: 'Cancel',onConfirm: async () => { /* 执行逻辑 */ }};}return {title: `Execute Shell Command`,message: `**Command:** \`${params.command}\``,onConfirm: async () => { /* 执行逻辑 */ }};
}

🔧 认证系统:多样化的身份验证

支持的认证方式

Gemini CLI支持多种认证方式,满足不同用户的需求:

export enum AuthType {LOGIN_WITH_GOOGLE_PERSONAL = 'LOGIN_WITH_GOOGLE_PERSONAL',USE_GEMINI = 'USE_GEMINI',USE_VERTEX_AI = 'USE_VERTEX_AI',
}export const validateAuthMethod = (authMethod: string): string | null => {if (authMethod === AuthType.LOGIN_WITH_GOOGLE_PERSONAL) {return null; // OAuth2流程,无需额外验证}if (authMethod === AuthType.USE_GEMINI) {if (!process.env.GEMINI_API_KEY) {return 'GEMINI_API_KEY environment variable not found.';}return null;}if (authMethod === AuthType.USE_VERTEX_AI) {const hasVertexConfig = !!process.env.GOOGLE_CLOUD_PROJECT && !!process.env.GOOGLE_CLOUD_LOCATION;const hasApiKey = !!process.env.GOOGLE_API_KEY;if (!hasVertexConfig && !hasApiKey) {return 'Must specify GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION or GOOGLE_API_KEY.';}return null;}return 'Invalid auth method selected.';
};

内容生成器的创建

export async function createContentGenerator(config: ContentGeneratorConfig): Promise<ContentGenerator> {const httpOptions = {headers: {'User-Agent': `GeminiCLI/${version} (${process.platform}; ${process.arch})`,},};if (config.authType === AuthType.LOGIN_WITH_GOOGLE_PERSONAL) {return createCodeAssistContentGenerator(httpOptions, config.authType);}if (config.authType === AuthType.USE_GEMINI || config.authType === AuthType.USE_VERTEX_AI) {const googleGenAI = new GoogleGenAI({apiKey: config.apiKey,vertexai: config.vertexai,httpOptions,});return googleGenAI.models;}throw new Error(`Unsupported authType: ${config.authType}`);
}

📊 性能优化:从细节到整体

内存管理策略

function getNodeMemoryArgs(config: Config): string[] {const totalMemoryMB = os.totalmem() / (1024 * 1024);const heapStats = v8.getHeapStatistics();const currentMaxOldSpaceSizeMb = Math.floor(heapStats.heap_size_limit / 1024 / 1024);// 设置目标为总内存的50%const targetMaxOldSpaceSizeInMB = Math.floor(totalMemoryMB * 0.5);if (targetMaxOldSpaceSizeInMB > currentMaxOldSpaceSizeMb) {return [`--max-old-space-size=${targetMaxOldSpaceSizeInMB}`];}return [];
}

这个函数展现了对Node.js内存管理的深度理解:

  1. 动态调整:根据系统总内存动态调整堆大小

  2. 性能优化:避免频繁的垃圾回收

  3. 资源利用:充分利用可用内存资源

构建优化

// esbuild.config.js
export default {entryPoints: ['packages/cli/index.ts'],bundle: true,platform: 'node',target: 'node18',format: 'esm',outfile: 'bundle/gemini.js',external: ['@google/genai'],minify: true,sourcemap: false,banner: {js: '#!/usr/bin/env node\n',},
};

使用esbuild进行构建优化:

  1. 快速构建:esbuild的极速构建能力

  2. 代码分割:合理的external配置

  3. 体积优化:启用minify减小包体积

🔮 扩展机制:MCP服务器集成

MCP(Model Context Protocol)支持

Gemini CLI支持MCP服务器,这是一个革命性的扩展机制:

interface McpServer {name: string;command: string;args?: string[];env?: Record<string, string>;
}// 配置示例
{"mcpServers": {"filesystem": {"command": "npx","args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/files"]},"github": {"command": "npx","args": ["-y", "@modelcontextprotocol/server-github"],"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"}}}
}

工具发现机制

// 自定义工具发现
{"toolDiscoveryCommand": "python discover_tools.py","toolCallCommand": "python execute_tool.py"
}

这种设计允许用户:

  1. 语言无关:使用任何语言编写工具

  2. 动态发现:运行时发现可用工具

  3. 灵活集成:与现有工具链无缝集成

🧠 记忆系统:层次化上下文管理

GEMINI.md文件系统

export async function loadHierarchicalGeminiMemory(currentWorkingDirectory: string,debugMode: boolean,fileService: FileDiscoveryService,extensionContextFilePaths: string[] = [],
): Promise<{ memoryContent: string; fileCount: number }> {const contextFiles: string[] = [];// 层次化搜索GEMINI.md文件let searchDir = currentWorkingDirectory;while (searchDir !== path.dirname(searchDir)) {const geminiFile = path.join(searchDir, 'GEMINI.md');if (await fileExists(geminiFile)) {contextFiles.push(geminiFile);}searchDir = path.dirname(searchDir);}// 合并所有上下文文件const memoryContent = await Promise.all(contextFiles.map(async (file) => {const content = await fs.readFile(file, 'utf-8');return `## Context from ${path.relative(currentWorkingDirectory, file)}\n\n${content}`;}));return {memoryContent: memoryContent.join('\n\n---\n\n'),fileCount: contextFiles.length};
}

这个系统实现了:

  1. 层次化继承:子目录继承父目录的上下文

  2. 智能合并:自动合并多个上下文文件

  3. 路径标识:清晰标识每个上下文的来源

🚦 错误处理:优雅的异常管理

全局异常处理

process.on('unhandledRejection', (reason, _promise) => {console.error('=========================================');console.error('CRITICAL: Unhandled Promise Rejection!');console.error('=========================================');console.error('Reason:', reason);console.error('Stack trace may follow:');if (!(reason instanceof Error)) {console.error(reason);}process.exit(1);
});

API调用重试机制

const result = await retryWithBackoff(apiCall, {shouldRetry: (error: Error) => {if (error?.message?.includes('429')) return true;if (error?.message?.match(/5\d{2}/)) return true;return false;},onPersistent429: async (authType?: string) => await this.handleFlashFallback(authType),authType: this.config.getContentGeneratorConfig()?.authType,
});

这种设计体现了:

  1. 智能重试:只对特定错误进行重试

  2. 降级策略:遇到持续问题时自动降级

  3. 用户友好:提供清晰的错误信息

🎭 主题系统:个性化的视觉体验

主题管理器

class ThemeManager {private themes: Map<string, Theme> = new Map();private activeTheme: Theme | null = null;setActiveTheme(themeName: string): boolean {const theme = this.themes.get(themeName);if (!theme) {return false;}this.activeTheme = theme;return true;}getActiveTheme(): Theme {return this.activeTheme || this.getDefaultTheme();}
}

支持的主题包括:

  • Default Light/Dark

  • GitHub Light/Dark

  • Dracula

  • Atom One

  • Ayu Light/Dark

  • Xcode Light

  • Google Light

📈 遥测系统:数据驱动的改进

遥测数据收集

export class ApiRequestEvent {constructor(public model: string,public requestText: string,public timestamp: string = new Date().toISOString()) {}
}export class ApiResponseEvent {constructor(public model: string,public durationMs: number,public usageMetadata?: GenerateContentResponseUsageMetadata,public responseText?: string,public timestamp: string = new Date().toISOString()) {}
}

收集的数据包括:

  • 工具调用统计

  • API响应时间

  • 错误率分析

  • 用户行为模式

🔄 持续集成:现代化的开发流程

预检查流程

{"scripts": {"preflight": "npm run clean && npm ci && npm run format && npm run lint:ci && npm run build && npm run typecheck && npm run test:ci"}
}

这个命令确保:

  1. 代码质量:格式化和Lint检查

  2. 类型安全:TypeScript类型检查

  3. 功能正确:完整的测试套件

  4. 构建成功:确保可以正常构建

测试策略

// 使用Vitest进行测试
describe('GeminiChat', () => {beforeEach(() => {vi.resetAllMocks();});afterEach(() => {vi.restoreAllMocks();});it('should handle streaming responses correctly', async () => {const mockResponse = createMockStreamResponse();const chat = new GeminiChat(mockConfig, mockGenerator);const result = await chat.sendMessageStream({ message: 'test' });expect(result).toBeDefined();});
});

🌟 技术亮点总结

通过深入分析Gemini CLI的源码,我们可以总结出以下技术亮点:

1. 架构设计的智慧

  • 模块化设计:清晰的职责分离

  • 可扩展性:支持多种扩展机制

  • 类型安全:全面的TypeScript支持

2. 用户体验的极致追求

  • React终端UI:突破性的界面技术

  • 流式响应:实时的交互体验

  • 智能补全:贴心的输入辅助

3. 安全机制的深度思考

  • 多层沙箱:全方位的安全防护

  • 用户确认:平衡安全与效率

  • 权限控制:精细的访问管理

4. 性能优化的细致入微

  • 内存管理:智能的资源调配

  • 构建优化:高效的打包策略

  • 缓存机制:合理的数据缓存

5. 扩展能力的无限可能

  • MCP协议:标准化的扩展接口

  • 工具发现:动态的能力扩展

  • 语言无关:开放的生态系统

🔮 未来展望:AI CLI的发展趋势

技术发展方向

  1. 多模态集成:更深度的图像、音频处理能力

  2. 边缘计算:本地模型的集成和优化

  3. 协作增强:团队协作功能的完善

  4. 智能化程度:更高级的自动化能力

生态系统建设

  1. 插件市场:丰富的第三方扩展

  2. 模板库:常用场景的快速启动

  3. 社区贡献:开放的贡献机制

  4. 企业集成:与企业工具链的深度整合

💡 对开发者的启示

架构设计启示

  1. 模块化思维:清晰的边界和职责分离

  2. 扩展性优先:为未来的变化做好准备

  3. 用户体验至上:技术服务于体验

  4. 安全意识:安全是设计的基础

技术选型启示

  1. 现代化工具链:拥抱新技术的力量

  2. 类型安全:TypeScript的价值体现

  3. 测试驱动:质量保证的重要性

  4. 性能意识:细节决定成败

开发流程启示

  1. 自动化优先:减少人工错误

  2. 持续集成:快速反馈和迭代

  3. 文档完善:知识的传承和分享

  4. 社区建设:开放协作的力量

🎯 结语:技术与艺术的完美融合

Gemini CLI不仅仅是一个技术产品,更是Google工程师们技术理念和设计哲学的完美体现。它展现了如何将复杂的AI能力包装成简洁易用的工具,如何在保证安全性的同时提供强大的功能,如何在追求性能的同时不忘用户体验。

这个项目给我们的启示是:优秀的软件不是功能的简单堆砌,而是在深度理解用户需求的基础上,运用合适的技术手段,创造出既强大又优雅的解决方案。

在AI技术日新月异的今天,Gemini CLI为我们展示了一个可能的未来:AI不再是高高在上的黑盒子,而是融入到我们日常工作流中的得力助手。它让我们看到,技术的最高境界不是炫技,而是让复杂的事情变得简单,让不可能的事情变得可能。

正如项目README中所说:"This repository contains the Gemini CLI, a command-line AI workflow tool that connects to your tools, understands your code and accelerates your workflows." 这不仅是对产品功能的描述,更是对未来AI工具发展方向的预言。

让我们期待更多这样的优秀项目,推动整个行业向前发展,让AI真正成为每个开发者手中的利器!


💬 互动时间

看完这篇深度解析,你是否对Gemini CLI有了全新的认识?你认为哪个技术特性最令人印象深刻?在你的项目中,是否也可以借鉴其中的一些设计理念?

欢迎在评论区分享你的想法和经验!如果你已经在使用Gemini CLI,也欢迎分享你的使用心得。让我们一起探讨AI工具的未来发展方向,共同推动技术的进步!

你可能感兴趣的话题:

  • 你最希望看到Gemini CLI增加哪些新功能?

  • 在你的开发工作中,哪些场景最需要AI助手?

  • 你认为React在终端UI中的应用前景如何?

  • 对于AI工具的安全性,你有什么看法和建议?

期待你的精彩留言!👇


本文基于Gemini CLI v0.1.5源码分析,如有更新请以官方最新版本为准。

更多AIGC文章

http://www.dtcms.com/a/348886.html

相关文章:

  • 在 vue3 和 vue2 中,computed 计算属性和 methods 方法区别是什么
  • 打响“A+H”双重上市突围战,云天励飞实力如何?
  • JUC并发编程07 - wait-ify/park-un/安全分析
  • 《CF1120D Power Tree》
  • Spirng Cloud Alibaba主流组件
  • 【ElasticSearch】springboot整合es案例
  • 企业出海第一步:国际化和本地化
  • springBoot如何加载类(以atomikos框架中的事务类为例)
  • JavaScript数据结构详解
  • Docker知识点
  • 【数据分享】中国地势三级阶梯矢量数据
  • 【无标题】对六边形拓扑结构中的顶点关系、着色约束及量子隧穿机制进行严谨论述。
  • 深度剖析Spring AI源码(七):化繁为简,Spring Boot自动配置的实现之秘
  • MySQL--基础知识
  • 基础篇(下):神经网络与反向传播(程序员视角)
  • 多机多卡微调流程
  • Node.js依赖管理与install及run命令详解
  • 【文献阅读】生态恢复项目对生态系统稳定性的影响
  • CI/CD持续集成及持续交付详解
  • Jwt令牌设置介绍
  • 关于熵减 - 电子圆柱
  • feat(compliance): 添加电子商务法技术解读
  • PCB电路设计学习4 PCB图布局 PCB图布线
  • Python - 100天从新手到大师:第十五天函数应用实战
  • HTTP 接口调用工具类(OkHttp 版)
  • 如何用单张gpu跑sglang的数据并行
  • Java全栈开发面试实战:从基础到高并发场景的深度解析
  • MATLAB 与 Python 数据交互:数据导入、导出及联合分析技巧
  • `free` 内存释放函数
  • 【蓝桥杯 2024 省 C】挖矿