kolega-code 0.6.0__tar.gz → 0.7.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kolega_code-0.6.0 → kolega_code-0.7.1}/.env.example +3 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/PKG-INFO +21 -3
- {kolega_code-0.6.0 → kolega_code-0.7.1}/README.md +15 -2
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/astro.config.mjs +4 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/concepts/tools.md +8 -2
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/configuration/environment-variables.md +15 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/configuration/providers-and-models.mdx +1 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/configuration/settings-and-api-keys.mdx +15 -3
- kolega_code-0.7.1/docs/src/content/docs/configuration/sign-in-with-chatgpt.mdx +93 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/index.mdx +3 -2
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/tui/slash-commands.md +6 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/__init__.py +1 -1
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/__init__.py +1 -1
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/baseagent.py +1 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/context.py +2 -0
- kolega_code-0.7.1/kolega_code/agent/tests/llm/test_chatgpt_live.py +101 -0
- kolega_code-0.7.1/kolega_code/agent/tests/llm/test_chatgpt_oauth_provider.py +365 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_live_providers.py +5 -1
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_agent_tools_inventory.py +1 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_think_hard_streaming.py +1 -0
- kolega_code-0.7.1/kolega_code/agent/tests/tool_backend/test_web_search_tool.py +366 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/__init__.py +83 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/base.py +58 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/duckduckgo.py +56 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/errors.py +23 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/firecrawl.py +126 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/models.py +28 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/searxng.py +62 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/search_backends/tavily.py +70 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/terminal_tool.py +1 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/think_hard_tool.py +2 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/web_fetch_tool.py +1 -0
- kolega_code-0.7.1/kolega_code/agent/tool_backend/web_search_tool.py +114 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tools.py +29 -0
- kolega_code-0.7.1/kolega_code/auth/__init__.py +17 -0
- kolega_code-0.7.1/kolega_code/auth/_jwt.py +53 -0
- kolega_code-0.7.1/kolega_code/auth/chatgpt_oauth.py +222 -0
- kolega_code-0.7.1/kolega_code/auth/constants.py +67 -0
- kolega_code-0.7.1/kolega_code/auth/tests/test_chatgpt_oauth.py +172 -0
- kolega_code-0.7.1/kolega_code/auth/tests/test_tokens.py +134 -0
- kolega_code-0.7.1/kolega_code/auth/tokens.py +170 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/app.py +204 -3
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/config.py +124 -8
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/messages.py +13 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/provider_registry.py +12 -2
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/settings.py +54 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/slash_commands.py +2 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_app.py +84 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_cli_config.py +92 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_settings.py +105 -1
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/config.py +57 -4
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/client.py +19 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/instrumented_client.py +2 -1
- kolega_code-0.7.1/kolega_code/llm/providers/chatgpt_oauth.py +501 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/specs.py +66 -0
- kolega_code-0.7.1/kolega_code/tools/tests/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/pyproject.toml +6 -1
- {kolega_code-0.6.0 → kolega_code-0.7.1}/uv.lock +829 -2
- {kolega_code-0.6.0 → kolega_code-0.7.1}/.github/workflows/ci.yml +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/.github/workflows/docs.yml +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/.github/workflows/release.yml +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/.gitignore +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/CONTRIBUTING.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/LICENSE +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/RELEASING.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/SECURITY.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/conftest.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/.gitignore +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/README.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/package-lock.json +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/package.json +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/public/favicon.svg +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/assets/demo.gif +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/assets/kolega-dark.svg +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/assets/kolega-light.svg +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/cli/ask.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/cli/doctor.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/cli/overview.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/cli/sessions.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/concepts/agents.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/concepts/how-it-works.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/getting-started/installation.mdx +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/getting-started/quick-start.mdx +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/gigacode.mdx +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/hooks.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/skills.mdx +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/tui/composer.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/tui/interface.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/tui/modes.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/tui/sessions-and-resume.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content.config.ts +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/styles/brand.css +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/docs/tsconfig.json +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/browseragent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/coder.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/common.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/compression.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/conversation.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/generalagent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/investigationagent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/budget.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/errors.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/executor.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/guide.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/journal.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/runtime.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/tests/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/tests/test_orchestration.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/orchestration/types.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/planningagent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_provider.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.system.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/auxiliary/compression/summary.user.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/output_summary.system.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/auxiliary/terminal/safety.system.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/auxiliary/tools/think_hard.system.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/extensions/cli/planning_questions.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/extensions/cli/shared_task_list.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/extensions/skills/catalog.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/agents/browser.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/agents/coder_cli.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/agents/general.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/agents/investigation.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/agents/planning.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/agents_md_instructions.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/environment_variables/workspace_env_vars.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/frontend_guidance.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/expo.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/html_website.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/mern_stack.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/system/includes/starter_templates/react_vite_shadcdn.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/user_tasks/cli/implement_plan.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompt_templates/user_tasks/cli/init_agents.md.j2 +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/prompts.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_anthropic_token_counting.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_billing_openai_cache.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_client.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_dashscope_mapping.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_error_boundary.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_exceptions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_google_thought_signature.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_google_tool_signature_live.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_instrumented_client.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_instrumented_client_integration.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_langfuse_normalization.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_model_specs.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_openai_cached_tokens.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_openai_cached_tokens_stream.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_openai_message_conversion.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_openai_token_counting.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_thinking_effort.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/llm/test_tool_execution_ids.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_browser.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_browser_parity.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_file_system.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_sandbox_terminal_input.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_terminal.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_terminal_buffer.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/services/test_terminal_state_serializer.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_base_agent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_coder_attachments.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_coder_prompt_extensions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_commands.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_duplicate_tool_results.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_empty_message_handling.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_event_emitter.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_general_agent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_gigacode_gating.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_hooks_integration.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_html.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_parallel_tool_calls.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_permissions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_planning_agent.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_prompt_provider.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_prompts.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_tool_registry.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/test_tools.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_agent_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_base_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_browser_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_build_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_create_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_edit_preview.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_glob_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_glob_tool_sandbox_parity.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_list_directory_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_read_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_replace_entire_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_replace_lines_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_search_and_replace_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_search_codebase_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_terminal_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_think_hard_integration.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_web_fetch_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tests/tool_backend/test_workflow_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/agent_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/base_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/browser_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/build_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/create_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/edit_preview.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/glob_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/list_directory_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/memory_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/read_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/replace_entire_file_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/replace_lines_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/search_and_replace_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/search_codebase_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/streaming_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/tool_backend/workflow_tool.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/agent/utils/commands.py +0 -0
- {kolega_code-0.6.0/kolega_code/hooks → kolega_code-0.7.1/kolega_code/auth}/tests/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/connection.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/file_index.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/main.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/mentions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/session_store.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/skills.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_connection.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_file_index.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_main.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_mentions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_session_store.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_skills.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_slash_commands.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_themes.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/tests/test_updater.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/theme.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/cli/updater.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/events.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/backends.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/config.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/dispatcher.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/events.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/matcher.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/outcome.py +0 -0
- {kolega_code-0.6.0/kolega_code/llm/providers → kolega_code-0.7.1/kolega_code/hooks/tests}/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/hooks/tests/test_hooks.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/exceptions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/models.py +0 -0
- {kolega_code-0.6.0/kolega_code/tools/tests → kolega_code-0.7.1/kolega_code/llm/providers}/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/providers/anthropic.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/providers/base.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/providers/google.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/providers/models.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/providers/openai.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/ratelimit.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/llm/tool_execution_ids.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/models/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/models/sandbox_terminal_state.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/permissions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/runtime.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/README.md +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/async_filesystem.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/base.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/browser.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/event_loop.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/filesystem.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/local.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/serializer.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/terminal.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/sandbox/utils.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/base.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/browser.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/file_system.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/html.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/terminal.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/services/terminal_buffer.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/tools/__init__.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/tools/core.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/tools/definitions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/tools/registry.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/kolega_code/tools/tests/test_definitions.py +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/run_tests.sh +0 -0
- {kolega_code-0.6.0 → kolega_code-0.7.1}/scripts/install-kolega-code.sh +0 -0
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
ANTHROPIC_API_KEY=
|
|
5
5
|
OPENAI_API_KEY=
|
|
6
|
+
# Prefer a ChatGPT subscription over an OpenAI API key? Run `/login` in the TUI
|
|
7
|
+
# (no key needed). Optional override of the OAuth client id, for testing only:
|
|
8
|
+
# KOLEGA_CODE_CHATGPT_CLIENT_ID=
|
|
6
9
|
GOOGLE_API_KEY=
|
|
7
10
|
MOONSHOT_API_KEY=
|
|
8
11
|
DEEPSEEK_API_KEY=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kolega-code
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.1
|
|
4
4
|
Summary: Local-first AI coding agent for the terminal
|
|
5
5
|
Project-URL: Homepage, https://kolega-ai.github.io/kolega-code/
|
|
6
6
|
Project-URL: Documentation, https://kolega-ai.github.io/kolega-code/
|
|
@@ -43,9 +43,13 @@ Classifier: Topic :: Utilities
|
|
|
43
43
|
Requires-Python: >=3.11
|
|
44
44
|
Requires-Dist: anthropic==0.101.0
|
|
45
45
|
Requires-Dist: beautifulsoup4==4.14.3
|
|
46
|
+
Requires-Dist: ddgs==9.14.4
|
|
47
|
+
Requires-Dist: firecrawl-py==4.28.2
|
|
46
48
|
Requires-Dist: google-genai==2.0.1
|
|
49
|
+
Requires-Dist: httpx==0.28.1
|
|
47
50
|
Requires-Dist: jinja2==3.1.6
|
|
48
51
|
Requires-Dist: langfuse==3.14.5
|
|
52
|
+
Requires-Dist: lxml-html-clean==0.4.4
|
|
49
53
|
Requires-Dist: nest-asyncio==1.6.0
|
|
50
54
|
Requires-Dist: openai==1.109.1
|
|
51
55
|
Requires-Dist: packaging==25.0
|
|
@@ -55,6 +59,7 @@ Requires-Dist: psutil==7.2.2
|
|
|
55
59
|
Requires-Dist: pydantic==2.13.4
|
|
56
60
|
Requires-Dist: python-dotenv==1.2.2
|
|
57
61
|
Requires-Dist: pyyaml==6.0.3
|
|
62
|
+
Requires-Dist: tavily-python==0.7.26
|
|
58
63
|
Requires-Dist: tenacity==9.1.4
|
|
59
64
|
Requires-Dist: textual==8.2.5
|
|
60
65
|
Requires-Dist: tiktoken==0.12.0
|
|
@@ -103,8 +108,9 @@ sessions, settings, and API keys stay on your own machine.
|
|
|
103
108
|
and applies precise edits.
|
|
104
109
|
- **Runs commands.** Executes shell commands and watches their output in a dedicated terminal view.
|
|
105
110
|
- **Plans before it builds.** Plan mode investigates and proposes; Build mode executes.
|
|
106
|
-
- **
|
|
107
|
-
|
|
111
|
+
- **Searches and browses the web.** The agent can search for relevant pages, fetch URLs
|
|
112
|
+
directly, or use the built-in browser agent (powered by Playwright) when a task needs
|
|
113
|
+
site interaction.
|
|
108
114
|
- **Dispatches sub-agents.** Hands work off to specialized agents and tracks their activity live.
|
|
109
115
|
- **Orchestrates workflows.** With [gigacode](https://kolega-ai.github.io/kolega-code/gigacode/),
|
|
110
116
|
it fans out many sub-agents in parallel.
|
|
@@ -170,6 +176,14 @@ and DeepSeek — and lets you assign **different models to different roles**: a
|
|
|
170
176
|
long-context model for coding, a fast cheap model for small utility calls, and one for extended
|
|
171
177
|
"thinking". See [Providers & Models](https://kolega-ai.github.io/kolega-code/configuration/providers-and-models/).
|
|
172
178
|
|
|
179
|
+
## Sign in with ChatGPT
|
|
180
|
+
|
|
181
|
+
If you have a paid **ChatGPT** plan (Plus, Pro, or Business), you can use it to run OpenAI models
|
|
182
|
+
instead of a separate API key. Run `/login chatgpt` in the TUI, complete the browser sign-in, and
|
|
183
|
+
Kolega Code switches to the **OpenAI (ChatGPT subscription)** provider (default `gpt-5.5`). Tokens are
|
|
184
|
+
stored locally (chmod `600`) and refreshed automatically; `/logout chatgpt` removes them. See
|
|
185
|
+
[Sign in with ChatGPT](https://kolega-ai.github.io/kolega-code/configuration/sign-in-with-chatgpt/).
|
|
186
|
+
|
|
173
187
|
## Configuration
|
|
174
188
|
|
|
175
189
|
Set your provider, model, and API keys from the **Settings** tab in the UI, or via environment
|
|
@@ -187,6 +201,10 @@ Settings. Local session state lives under your platform's state directory unless
|
|
|
187
201
|
[Configuration docs](https://kolega-ai.github.io/kolega-code/configuration/settings-and-api-keys/)
|
|
188
202
|
for the full story.
|
|
189
203
|
|
|
204
|
+
The `web_search` tool uses DuckDuckGo by default without a key. To choose another backend,
|
|
205
|
+
set it in **Settings** or export `KOLEGA_CODE_WEB_SEARCH_BACKEND` as `firecrawl`, `tavily`,
|
|
206
|
+
or `searxng`; use `FIRECRAWL_API_KEY`, `TAVILY_API_KEY`, or `SEARXNG_BASE_URL` as needed.
|
|
207
|
+
|
|
190
208
|
## Requirements
|
|
191
209
|
|
|
192
210
|
- **Python 3.11+**
|
|
@@ -35,8 +35,9 @@ sessions, settings, and API keys stay on your own machine.
|
|
|
35
35
|
and applies precise edits.
|
|
36
36
|
- **Runs commands.** Executes shell commands and watches their output in a dedicated terminal view.
|
|
37
37
|
- **Plans before it builds.** Plan mode investigates and proposes; Build mode executes.
|
|
38
|
-
- **
|
|
39
|
-
|
|
38
|
+
- **Searches and browses the web.** The agent can search for relevant pages, fetch URLs
|
|
39
|
+
directly, or use the built-in browser agent (powered by Playwright) when a task needs
|
|
40
|
+
site interaction.
|
|
40
41
|
- **Dispatches sub-agents.** Hands work off to specialized agents and tracks their activity live.
|
|
41
42
|
- **Orchestrates workflows.** With [gigacode](https://kolega-ai.github.io/kolega-code/gigacode/),
|
|
42
43
|
it fans out many sub-agents in parallel.
|
|
@@ -102,6 +103,14 @@ and DeepSeek — and lets you assign **different models to different roles**: a
|
|
|
102
103
|
long-context model for coding, a fast cheap model for small utility calls, and one for extended
|
|
103
104
|
"thinking". See [Providers & Models](https://kolega-ai.github.io/kolega-code/configuration/providers-and-models/).
|
|
104
105
|
|
|
106
|
+
## Sign in with ChatGPT
|
|
107
|
+
|
|
108
|
+
If you have a paid **ChatGPT** plan (Plus, Pro, or Business), you can use it to run OpenAI models
|
|
109
|
+
instead of a separate API key. Run `/login chatgpt` in the TUI, complete the browser sign-in, and
|
|
110
|
+
Kolega Code switches to the **OpenAI (ChatGPT subscription)** provider (default `gpt-5.5`). Tokens are
|
|
111
|
+
stored locally (chmod `600`) and refreshed automatically; `/logout chatgpt` removes them. See
|
|
112
|
+
[Sign in with ChatGPT](https://kolega-ai.github.io/kolega-code/configuration/sign-in-with-chatgpt/).
|
|
113
|
+
|
|
105
114
|
## Configuration
|
|
106
115
|
|
|
107
116
|
Set your provider, model, and API keys from the **Settings** tab in the UI, or via environment
|
|
@@ -119,6 +128,10 @@ Settings. Local session state lives under your platform's state directory unless
|
|
|
119
128
|
[Configuration docs](https://kolega-ai.github.io/kolega-code/configuration/settings-and-api-keys/)
|
|
120
129
|
for the full story.
|
|
121
130
|
|
|
131
|
+
The `web_search` tool uses DuckDuckGo by default without a key. To choose another backend,
|
|
132
|
+
set it in **Settings** or export `KOLEGA_CODE_WEB_SEARCH_BACKEND` as `firecrawl`, `tavily`,
|
|
133
|
+
or `searxng`; use `FIRECRAWL_API_KEY`, `TAVILY_API_KEY`, or `SEARXNG_BASE_URL` as needed.
|
|
134
|
+
|
|
122
135
|
## Requirements
|
|
123
136
|
|
|
124
137
|
- **Python 3.11+**
|
|
@@ -56,6 +56,10 @@ export default defineConfig({
|
|
|
56
56
|
label: "Providers & Models",
|
|
57
57
|
slug: "configuration/providers-and-models",
|
|
58
58
|
},
|
|
59
|
+
{
|
|
60
|
+
label: "Sign in with ChatGPT",
|
|
61
|
+
slug: "configuration/sign-in-with-chatgpt",
|
|
62
|
+
},
|
|
59
63
|
{
|
|
60
64
|
label: "Settings & API Keys",
|
|
61
65
|
slug: "configuration/settings-and-api-keys",
|
|
@@ -38,8 +38,14 @@ the [TUI](../../cli/overview/) or [`ask`](../../cli/ask/).
|
|
|
38
38
|
|
|
39
39
|
### Web
|
|
40
40
|
|
|
41
|
+
- `web_search` — search the web for relevant pages and return ranked results.
|
|
41
42
|
- `web_fetch` — fetch and parse a web page without a full browser.
|
|
42
43
|
|
|
44
|
+
Use `web_search` when you do not already know the right URL, then follow up with
|
|
45
|
+
`web_fetch` to read a result in depth. The default backend is keyless DuckDuckGo;
|
|
46
|
+
Firecrawl, Tavily, and self-hosted SearXNG can be selected in Settings or with
|
|
47
|
+
environment variables.
|
|
48
|
+
|
|
43
49
|
### Reasoning & memory
|
|
44
50
|
|
|
45
51
|
- `think_hard` — an extended-reasoning step that uses the
|
|
@@ -57,8 +63,8 @@ and `dispatch_general_agent`.
|
|
|
57
63
|
Tools are gated by mode. In a read-only context — like [Plan mode](../../tui/modes/)
|
|
58
64
|
or an investigation sub-agent — only non-mutating tools are available
|
|
59
65
|
(`list_directory`, `read_entire_file`, `read_file_section`, `search_codebase`,
|
|
60
|
-
`find_files_by_pattern`, `web_fetch`, `think_hard`, and reading
|
|
61
|
-
files and running commands require Build mode's full toolset.
|
|
66
|
+
`find_files_by_pattern`, `web_search`, `web_fetch`, `think_hard`, and reading
|
|
67
|
+
memory). Editing files and running commands require Build mode's full toolset.
|
|
62
68
|
|
|
63
69
|
This separation is what makes Plan mode safe to run against any codebase: the
|
|
64
70
|
planning agent can look but not touch.
|
{kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/configuration/environment-variables.md
RENAMED
|
@@ -87,6 +87,18 @@ section.
|
|
|
87
87
|
| `KOLEGA_CODE_STATE_DIR` | Override where settings and sessions are stored |
|
|
88
88
|
| `KOLEGA_CODE_ENVIRONMENT` | Environment label attached to tracing/metadata (default `development`) |
|
|
89
89
|
|
|
90
|
+
## Web search
|
|
91
|
+
|
|
92
|
+
The `web_search` tool defaults to the keyless DuckDuckGo backend. Set a backend
|
|
93
|
+
explicitly when you want a cloud provider or a self-hosted SearXNG instance.
|
|
94
|
+
|
|
95
|
+
| Variable | Purpose |
|
|
96
|
+
| --- | --- |
|
|
97
|
+
| `KOLEGA_CODE_WEB_SEARCH_BACKEND` | Backend for `web_search`: `duckduckgo`, `firecrawl`, `tavily`, or `searxng` |
|
|
98
|
+
| `FIRECRAWL_API_KEY` | Optional Firecrawl key for higher rate limits |
|
|
99
|
+
| `TAVILY_API_KEY` | Tavily API key |
|
|
100
|
+
| `SEARXNG_BASE_URL` | Base URL for a self-hosted SearXNG instance |
|
|
101
|
+
|
|
90
102
|
## Telemetry (Langfuse)
|
|
91
103
|
|
|
92
104
|
Optional [Langfuse](https://langfuse.com/) tracing of LLM usage.
|
|
@@ -113,6 +125,9 @@ KOLEGA_CODE_PROVIDER=moonshot
|
|
|
113
125
|
KOLEGA_CODE_MODEL=kimi-k2.7-code
|
|
114
126
|
KOLEGA_CODE_THINKING_EFFORT=auto
|
|
115
127
|
|
|
128
|
+
# Optional: web search
|
|
129
|
+
KOLEGA_CODE_WEB_SEARCH_BACKEND=duckduckgo
|
|
130
|
+
|
|
116
131
|
# Optional: Langfuse tracing
|
|
117
132
|
LANGFUSE_HOST=https://us.cloud.langfuse.com
|
|
118
133
|
LANGFUSE_PUBLIC_KEY=
|
{kolega_code-0.6.0 → kolega_code-0.7.1}/docs/src/content/docs/configuration/providers-and-models.mdx
RENAMED
|
@@ -16,6 +16,7 @@ The agent runtime recognizes these providers:
|
|
|
16
16
|
| --- | --- | --- |
|
|
17
17
|
| Anthropic | `anthropic` | `ANTHROPIC_API_KEY` |
|
|
18
18
|
| OpenAI | `openai` | `OPENAI_API_KEY` |
|
|
19
|
+
| OpenAI (ChatGPT subscription) | `openai_chatgpt` | _none — [sign in with ChatGPT](../sign-in-with-chatgpt/)_ |
|
|
19
20
|
| Google | `google` | `GOOGLE_API_KEY` |
|
|
20
21
|
| Groq | `groq` | `GROQ_API_KEY` |
|
|
21
22
|
| Together.ai | `together` | `TOGETHER_API_KEY` |
|
|
@@ -32,6 +32,13 @@ agents (planning, building, investigation, general, browser) their own provider,
|
|
|
32
32
|
model, and effort. Leave a role on **Default** to inherit the active model. See
|
|
33
33
|
[Per-agent models](../providers-and-models/#per-agent-models).
|
|
34
34
|
|
|
35
|
+
The **Web Search** section configures the `web_search` tool. DuckDuckGo is the
|
|
36
|
+
default and needs no key. Firecrawl can also run without a key, with an optional
|
|
37
|
+
key for higher rate limits. Tavily requires a key, and SearXNG requires the base
|
|
38
|
+
URL of your self-hosted instance. The same settings can be supplied with
|
|
39
|
+
[`KOLEGA_CODE_WEB_SEARCH_BACKEND`, `FIRECRAWL_API_KEY`, `TAVILY_API_KEY`, and
|
|
40
|
+
`SEARXNG_BASE_URL`](../environment-variables/#web-search).
|
|
41
|
+
|
|
35
42
|
## Where settings live
|
|
36
43
|
|
|
37
44
|
Settings are stored as JSON in your platform's state directory, in a file named
|
|
@@ -56,7 +63,8 @@ The file looks like this:
|
|
|
56
63
|
"active_thinking_effort": "auto",
|
|
57
64
|
"api_keys": {
|
|
58
65
|
"moonshot": "sk-...",
|
|
59
|
-
"deepseek": "sk-..."
|
|
66
|
+
"deepseek": "sk-...",
|
|
67
|
+
"tavily": "tvly-..."
|
|
60
68
|
},
|
|
61
69
|
"agent_models": {
|
|
62
70
|
"investigation": {
|
|
@@ -64,13 +72,17 @@ The file looks like this:
|
|
|
64
72
|
"model": "deepseek-v4-flash",
|
|
65
73
|
"thinking_effort": "high"
|
|
66
74
|
}
|
|
67
|
-
}
|
|
75
|
+
},
|
|
76
|
+
"web_search_backend": "tavily",
|
|
77
|
+
"web_search_base_url": null
|
|
68
78
|
}
|
|
69
79
|
```
|
|
70
80
|
|
|
71
81
|
`agent_models` holds per-agent overrides keyed by role (`planning`, `building`,
|
|
72
82
|
`investigation`, `general`, `browser`); a role that is absent inherits the active
|
|
73
83
|
model. The field is optional and older `schema_version` files load unchanged.
|
|
84
|
+
Cloud web-search keys are stored in `api_keys` under their backend names
|
|
85
|
+
(`firecrawl` or `tavily`); `web_search_base_url` is used by SearXNG.
|
|
74
86
|
|
|
75
87
|
<Aside type="caution" title="Keys are stored in plaintext">
|
|
76
88
|
API keys are written to `settings.json` in plaintext, but the file is created with
|
|
@@ -83,7 +95,7 @@ store keys on disk at all, supply them via
|
|
|
83
95
|
|
|
84
96
|
<FileTree>
|
|
85
97
|
- kolega-code/
|
|
86
|
-
- settings.json Provider, model, thinking effort, and API keys (0600)
|
|
98
|
+
- settings.json Provider, model, web search, thinking effort, and API keys (0600)
|
|
87
99
|
- sessions/
|
|
88
100
|
- <session-id>.json One file per saved session
|
|
89
101
|
</FileTree>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Sign in with ChatGPT
|
|
3
|
+
description: Use your ChatGPT subscription to run OpenAI models in Kolega Code, without an API key.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
import { Aside, Steps } from '@astrojs/starlight/components';
|
|
7
|
+
|
|
8
|
+
If you have a paid **ChatGPT** plan, you can use it to run OpenAI models in Kolega
|
|
9
|
+
Code — no separate `OPENAI_API_KEY` required. Sign in once with `/login chatgpt`
|
|
10
|
+
and Kolega Code uses your subscription for the **OpenAI (ChatGPT subscription)**
|
|
11
|
+
provider.
|
|
12
|
+
|
|
13
|
+
## Eligibility
|
|
14
|
+
|
|
15
|
+
| Plan | Runs models |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| Plus | Yes |
|
|
18
|
+
| Pro | Yes |
|
|
19
|
+
| Business | Yes |
|
|
20
|
+
| Free | No |
|
|
21
|
+
|
|
22
|
+
A Free plan can sign in, but can't run models this way — use an
|
|
23
|
+
[`OPENAI_API_KEY`](../providers-and-models/) instead.
|
|
24
|
+
|
|
25
|
+
## Signing in
|
|
26
|
+
|
|
27
|
+
<Steps>
|
|
28
|
+
|
|
29
|
+
1. In the TUI composer, run:
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
/login chatgpt
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
2. Your browser opens to the ChatGPT sign-in page. Complete the sign-in there.
|
|
36
|
+
(If the browser doesn't open, the composer prints a URL you can paste in
|
|
37
|
+
yourself.)
|
|
38
|
+
|
|
39
|
+
3. When sign-in finishes, the browser shows a confirmation page and Kolega Code
|
|
40
|
+
switches to the **OpenAI (ChatGPT subscription)** provider, ready to use.
|
|
41
|
+
|
|
42
|
+
</Steps>
|
|
43
|
+
|
|
44
|
+
## Models
|
|
45
|
+
|
|
46
|
+
The ChatGPT-subscription provider (identifier `openai_chatgpt`) exposes the Codex
|
|
47
|
+
model line-up:
|
|
48
|
+
|
|
49
|
+
| Model | Label |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| `gpt-5.5` | GPT-5.5 — default, frontier coding and reasoning |
|
|
52
|
+
| `gpt-5.4` | GPT-5.4 — strong everyday coding |
|
|
53
|
+
| `gpt-5.4-mini` | GPT-5.4 Mini — fast and economical |
|
|
54
|
+
| `gpt-5.3-codex-spark` | GPT-5.3 Codex Spark — ultra-fast |
|
|
55
|
+
|
|
56
|
+
Switch between them with [`/model`](../../tui/slash-commands/) or from the
|
|
57
|
+
**Settings** tab. Each model supports a reasoning **thinking effort** you can set
|
|
58
|
+
with [`/effort`](../../tui/slash-commands/).
|
|
59
|
+
|
|
60
|
+
## Where credentials live
|
|
61
|
+
|
|
62
|
+
Sign-in tokens are stored in your `settings.json` under `oauth_tokens`, in the
|
|
63
|
+
same [state directory](../settings-and-api-keys/#where-settings-live) as the rest
|
|
64
|
+
of your settings, with `0600` permissions (readable and writable only by your
|
|
65
|
+
user). They refresh automatically in the background, so a single sign-in keeps
|
|
66
|
+
working across sessions.
|
|
67
|
+
|
|
68
|
+
## Checking status
|
|
69
|
+
|
|
70
|
+
`doctor` reports whether you're signed in, without exposing any token:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
kolega-code doctor --project .
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
For the ChatGPT-subscription provider it shows `signed in as <email> (<plan>)` or
|
|
77
|
+
`not signed in`. See [`doctor`](../../cli/doctor/).
|
|
78
|
+
|
|
79
|
+
## Signing out
|
|
80
|
+
|
|
81
|
+
To remove your stored ChatGPT credentials:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
/logout chatgpt
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After signing out, switch to another provider — or sign in again with
|
|
88
|
+
`/login chatgpt` — to keep working.
|
|
89
|
+
|
|
90
|
+
<Aside type="tip">
|
|
91
|
+
`/login` and `/logout` take a provider name so more sign-in options can be added
|
|
92
|
+
over time. Today, `chatgpt` is the available target.
|
|
93
|
+
</Aside>
|
|
@@ -19,8 +19,9 @@ and your sessions, settings, and API keys are stored on your own machine.
|
|
|
19
19
|
dedicated terminal view in the UI.
|
|
20
20
|
- **Plans before it builds.** A read-only **Plan mode** produces a reviewable plan
|
|
21
21
|
and a shared task list; **Build mode** implements it.
|
|
22
|
-
- **
|
|
23
|
-
|
|
22
|
+
- **Searches and browses the web.** The agent can search for relevant pages,
|
|
23
|
+
fetch URLs directly, or use the built-in browser agent (powered by Playwright)
|
|
24
|
+
when a task needs site interaction.
|
|
24
25
|
- **Dispatches sub-agents.** For larger tasks, the main agent can hand off to
|
|
25
26
|
specialized agents (investigation, browser, coding, general) and track their
|
|
26
27
|
activity live.
|
|
@@ -40,6 +40,8 @@ These control the app and your session.
|
|
|
40
40
|
| `/permissions` | Show or switch the shell/edit permission mode |
|
|
41
41
|
| `/model` | Choose the active model |
|
|
42
42
|
| `/effort` | Choose the active model's thinking effort |
|
|
43
|
+
| `/login` | Sign in to a provider, e.g. `/login chatgpt` |
|
|
44
|
+
| `/logout` | Sign out of a provider, e.g. `/logout chatgpt` |
|
|
43
45
|
| `/gigacode` | Toggle [gigacode](../../gigacode/) workflow orchestration on or off |
|
|
44
46
|
| `/copy` | Copy the last response to the clipboard |
|
|
45
47
|
| `/version` | Show the Kolega Code version |
|
|
@@ -53,6 +55,10 @@ provider. You can also switch directly with `/model <name>`.
|
|
|
53
55
|
Run `/effort` to open a selectable list of supported effort values for the
|
|
54
56
|
active model. You can also switch directly with `/effort <level>`.
|
|
55
57
|
|
|
58
|
+
Run `/login chatgpt` to sign in with a ChatGPT subscription and use OpenAI models
|
|
59
|
+
without an API key; `/logout chatgpt` removes the stored credentials. See
|
|
60
|
+
[Sign in with ChatGPT](../../configuration/sign-in-with-chatgpt/).
|
|
61
|
+
|
|
56
62
|
Run `/init` to have the agent inspect the repository and create or update a
|
|
57
63
|
concise root `AGENTS.md`. Extra text after the command is passed as focus or
|
|
58
64
|
constraints:
|
|
@@ -936,6 +936,7 @@ class BaseAgent(LogMixin):
|
|
|
936
936
|
max_retries=model_config.rate_limits.max_retries,
|
|
937
937
|
requests_per_minute=model_config.rate_limits.requests_per_minute,
|
|
938
938
|
tokens_per_minute=model_config.rate_limits.tokens_per_minute,
|
|
939
|
+
token_manager=self.config.get_chatgpt_token_manager(),
|
|
939
940
|
)
|
|
940
941
|
response = await client.generate(
|
|
941
942
|
model=model_config.model,
|
|
@@ -113,6 +113,7 @@ class AgentContext:
|
|
|
113
113
|
user_id=self.telemetry.user_id,
|
|
114
114
|
user_email=self.telemetry.user_email,
|
|
115
115
|
usage_recorder=self.telemetry.usage_recorder,
|
|
116
|
+
token_manager=self.config.get_chatgpt_token_manager(),
|
|
116
117
|
)
|
|
117
118
|
|
|
118
119
|
return LLMClient(
|
|
@@ -121,4 +122,5 @@ class AgentContext:
|
|
|
121
122
|
max_retries=model_config.rate_limits.max_retries,
|
|
122
123
|
requests_per_minute=model_config.rate_limits.requests_per_minute,
|
|
123
124
|
tokens_per_minute=model_config.rate_limits.tokens_per_minute,
|
|
125
|
+
token_manager=self.config.get_chatgpt_token_manager(),
|
|
124
126
|
)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Live test for the ChatGPT-subscription (OAuth) provider.
|
|
2
|
+
|
|
3
|
+
Unlike the key-based providers, this one needs OAuth tokens from an interactive
|
|
4
|
+
``/login``. It is skipped unless real tokens are available, so it never runs in
|
|
5
|
+
CI. To run it locally after signing in via the TUI::
|
|
6
|
+
|
|
7
|
+
pytest -m integration kolega_code/agent/tests/llm/test_chatgpt_live.py -v
|
|
8
|
+
|
|
9
|
+
Token source (first match wins):
|
|
10
|
+
- KOLEGA_CODE_CHATGPT_TOKENS env var holding the JSON of an OAuthTokens dump, or
|
|
11
|
+
- the stored token in the local settings file (the one /login writes).
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import os
|
|
16
|
+
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from kolega_code.auth.tokens import ChatGPTTokenManager, OAuthTokens
|
|
20
|
+
from kolega_code.auth import constants as chatgpt_constants
|
|
21
|
+
from kolega_code.cli.settings import SettingsStore
|
|
22
|
+
from kolega_code.llm.client import LLMClient
|
|
23
|
+
from kolega_code.llm.models import Message, MessageHistory, TextBlock
|
|
24
|
+
|
|
25
|
+
pytestmark = pytest.mark.integration
|
|
26
|
+
|
|
27
|
+
SKIP_IN_CI = bool(os.getenv("CI")) or bool(os.getenv("GITLAB_CI"))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _load_tokens() -> OAuthTokens | None:
|
|
31
|
+
raw = os.getenv("KOLEGA_CODE_CHATGPT_TOKENS")
|
|
32
|
+
if raw:
|
|
33
|
+
try:
|
|
34
|
+
return OAuthTokens.model_validate(json.loads(raw))
|
|
35
|
+
except (ValueError, TypeError):
|
|
36
|
+
return None
|
|
37
|
+
stored = SettingsStore().load().get_oauth_token(chatgpt_constants.PROVIDER_KEY)
|
|
38
|
+
if stored:
|
|
39
|
+
try:
|
|
40
|
+
return OAuthTokens.model_validate(stored)
|
|
41
|
+
except (ValueError, TypeError):
|
|
42
|
+
return None
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _require_tokens() -> OAuthTokens:
|
|
47
|
+
if SKIP_IN_CI:
|
|
48
|
+
pytest.skip("Skipping live ChatGPT call in CI")
|
|
49
|
+
tokens = _load_tokens()
|
|
50
|
+
if tokens is None:
|
|
51
|
+
pytest.skip("No ChatGPT tokens available; sign in with /login or set KOLEGA_CODE_CHATGPT_TOKENS")
|
|
52
|
+
return tokens
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@pytest.mark.asyncio
|
|
56
|
+
async def test_live_chatgpt_generate() -> None:
|
|
57
|
+
tokens = _require_tokens()
|
|
58
|
+
client = LLMClient(
|
|
59
|
+
provider=chatgpt_constants.PROVIDER_KEY,
|
|
60
|
+
api_key="unused",
|
|
61
|
+
token_manager=ChatGPTTokenManager(tokens),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
response = await client.generate(
|
|
65
|
+
messages=MessageHistory(
|
|
66
|
+
[Message(role="user", content=[TextBlock(text="What is 2 + 2? Reply with just the number.")])]
|
|
67
|
+
),
|
|
68
|
+
system=Message(role="system", content=[TextBlock(text="You are concise.")]),
|
|
69
|
+
model=chatgpt_constants.DEFAULT_MODEL,
|
|
70
|
+
max_completion_tokens=4096,
|
|
71
|
+
thinking="low",
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
assert response.role == "assistant"
|
|
75
|
+
assert response.get_text_content(), "empty response from ChatGPT backend"
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@pytest.mark.asyncio
|
|
79
|
+
async def test_live_chatgpt_stream() -> None:
|
|
80
|
+
tokens = _require_tokens()
|
|
81
|
+
client = LLMClient(
|
|
82
|
+
provider=chatgpt_constants.PROVIDER_KEY,
|
|
83
|
+
api_key="unused",
|
|
84
|
+
token_manager=ChatGPTTokenManager(tokens),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
text = ""
|
|
88
|
+
async with await client.stream(
|
|
89
|
+
messages=MessageHistory(
|
|
90
|
+
[Message(role="user", content=[TextBlock(text="Say the word 'ready' and nothing else.")])]
|
|
91
|
+
),
|
|
92
|
+
model=chatgpt_constants.DEFAULT_MODEL,
|
|
93
|
+
max_completion_tokens=4096,
|
|
94
|
+
thinking="low",
|
|
95
|
+
) as stream:
|
|
96
|
+
async for chunk in stream:
|
|
97
|
+
if chunk.type == "text" and chunk.text:
|
|
98
|
+
text += chunk.text
|
|
99
|
+
message = await stream.get_final_message()
|
|
100
|
+
|
|
101
|
+
assert text or message.get_text_content(), "empty stream from ChatGPT backend"
|