Skip to content
Open
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
4 changes: 1 addition & 3 deletions .github/workflows/cloud-staging-build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,6 @@ jobs:
- name: Setup extension
run: |
cd tmp_extension
npm install
npm run compile:ts
npm install -g @vscode/vsce@3.3.2
npm run build
vsce package
Expand Down Expand Up @@ -182,4 +180,4 @@ jobs:
git commit -m "version $VERSION"
git push origin staging
fi
cd ..
cd ..
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
# (2025-08-18)
# (2025-08-25)


### Reverts

* Revert "Implemented weekend discount" ([734e0c7](https://github.com/Pythagora-io/pythagora-v1/commit/734e0c726b179a45f235a0fd230a6310c77ae740))



22 changes: 15 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

<div align="center">

[![Discord Follow](https://dcbadge.vercel.app/api/server/HaqXugmxr9?style=flat)](https://discord.gg/HaqXugmxr9)
[![Discord](https://img.shields.io/badge/Discord-Join%20Us-5865F2?style=social&logo=discord)](https://discord.gg/HaqXugmxr9)
[![GitHub Repo stars](https://img.shields.io/github/stars/Pythagora-io/gpt-pilot?style=social)](https://github.com/Pythagora-io/gpt-pilot)
[![Twitter Follow](https://img.shields.io/twitter/follow/HiPythagora?style=social)](https://twitter.com/HiPythagora)
[![Twitter Follow](https://img.shields.io/twitter/follow/PythagoraAI?style=social)](https://x.com/PythagoraAI)

</div>

Expand All @@ -28,29 +28,37 @@
<br>

<div align="center">

### GPT Pilot doesn't just generate code, it builds apps!

</div>

<div align="center">

This repo is not being maintained anymore.

# Visit [Pythagora.ai](https://www.pythagora.ai/) for more info

</div>

---
<div align="center">

[![See it in action](https://i3.ytimg.com/vi/4g-1cPGK0GA/maxresdefault.jpg)](https://youtu.be/4g-1cPGK0GA)
[![See it in action](https://img.youtube.com/vi/o1nEvwjKziw/0.jpg)]([https://youtu.be/4g-1cPGK0GA](https://www.youtube.com/watch?v=o1nEvwjKziw))

(click to open the video in YouTube) (1:40min)
(click to open the video in YouTube) (1:04min)

</div>

---

<div align="center">

<a href="vscode:extension/PythagoraTechnologies.gpt-pilot-vs-code" target="_blank"><img src="https://github.com/Pythagora-io/gpt-pilot/assets/10895136/5792143e-77c7-47dd-ad96-6902be1501cd" alt="Pythagora-io%2Fgpt-pilot | Trendshift" style="width: 185px; height: 55px;" width="185" height="55"/></a>
<a href="https://marketplace.visualstudio.com/items?itemName=PythagoraTechnologies.pythagora-vs-code" target="_blank"><img src="https://github.com/Pythagora-io/gpt-pilot/assets/10895136/5792143e-77c7-47dd-ad96-6902be1501cd" alt="Pythagora-io%2Fgpt-pilot | Trendshift" style="width: 185px; height: 55px;" width="185" height="55"/></a>

</div>

GPT Pilot is the core technology for the [Pythagora VS Code extension](https://bit.ly/3IeZxp6) that aims to provide **the first real AI developer companion**. Not just an autocomplete or a helper for PR messages but rather a real AI developer that can write full features, debug them, talk to you about issues, ask for review, etc.
GPT Pilot is the core technology for the [Pythagora VS Code extension](https://marketplace.visualstudio.com/items?itemName=PythagoraTechnologies.pythagora-vs-code) that aims to provide **the first real AI developer companion**. Not just an autocomplete or a helper for PR messages but rather a real AI developer that can write full features, debug them, talk to you about issues, ask for review, etc.

---

Expand Down
6 changes: 1 addition & 5 deletions core/agents/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from core.llm.parser import DescriptiveCodeBlockParser, OptionalCodeBlockParser
from core.log import get_logger
from core.telemetry import telemetry
from core.ui.base import ProjectStage, UISource
from core.ui.base import ProjectStage

log = get_logger(__name__)

Expand Down Expand Up @@ -168,10 +168,6 @@ async def iterate_frontend(self):
if user_input:
await self.send_message("Errors detected, fixing...")
else:
await self.ui.send_message(
"Use code CODE20 and subscribe https://pythagora.ai/pricing",
source=UISource("Congratulations", "success"),
)
answer = await self.ask_question(
"Do you want to change anything or report a bug?" if frontend_only else FE_CHANGE_REQ,
buttons={"yes": "I'm done building the UI"} if not frontend_only else None,
Expand Down
5 changes: 1 addition & 4 deletions core/agents/spec_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from core.log import get_logger
from core.telemetry import telemetry
from core.templates.registry import PROJECT_TEMPLATES
from core.ui.base import ProjectStage, UISource
from core.ui.base import ProjectStage

log = get_logger(__name__)

Expand Down Expand Up @@ -122,9 +122,6 @@ async def initialize_spec_and_project(self) -> AgentResponse:

await self.ui.send_front_logs_headers("specs_0", ["E1 / T1", "Writing Specification", "working"], "")

await self.ui.send_message(
"Use code CODE20 and subscribe https://pythagora.ai/pricing", source=UISource("Congratulations", "success")
)
await self.send_message(
"## Write specification\n\nPythagora is generating a detailed specification for app based on your input.",
# project_state_id="setup",
Expand Down
11 changes: 9 additions & 2 deletions core/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,10 +425,17 @@ def llm_for_agent(self, agent_name: str = "default") -> LLMConfig:
Fetch an LLM configuration for a given agent.

If the agent specific configuration doesn't exist, returns the configuration
for the 'default' agent.
for the 'default' agent. Agent name matching is case-insensitive to allow
config keys like 'codemonkey' or 'importer' to match 'CodeMonkey' or 'Importer'.
"""

agent_name = agent_name if agent_name in self.agent else "default"
if agent_name not in self.agent:
# Try case-insensitive match to be forgiving of different naming conventions
agent_name_lower = agent_name.lower()
agent_name = next(
(key for key in self.agent if key.lower() == agent_name_lower),
"default",
)
agent_config = self.agent[agent_name]
provider_config = self.llm[agent_config.provider]
return LLMConfig.from_provider_and_agent_configs(provider_config, agent_config)
Expand Down
20 changes: 17 additions & 3 deletions example-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,29 @@
}
}
},
// Each agent can use a different model or configuration. The default, as before, is GPT4 Turbo
// for most tasks and GPT3.5 Turbo to generate file descriptions. The agent name here should match
// the Python class name.
// Each agent can use a different model or configuration. The default is used for all agents
// unless overridden. The agent name should match the Python class name (case-insensitive).
// Valid agent names: "default", "CodeMonkey", "Importer", "SpecWriter", "Frontend",
// "BugHunter", "Developer", "TechLead", "Troubleshooter", "get_relevant_files"
// Sub-agent routes can also be overridden, e.g. "CodeMonkey.code_review".
"agent": {
"default": {
"provider": "openai",
"model": "gpt-4o-2024-05-13",
"temperature": 0.5
}
// Example: use a different model for code generation tasks
// "CodeMonkey": {
// "provider": "openai",
// "model": "gpt-4o-2024-05-13",
// "temperature": 0.0
// },
// Example: use Anthropic for the Importer agent
// "Importer": {
// "provider": "anthropic",
// "model": "claude-3-5-sonnet-20241022",
// "temperature": 0.5
// }
},
// Logging configuration outputs debug log to "pythagora.log" by default. If you set this to null,
// the log will be sent to stdout.
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "pythagora-core"
version = "2.0.9"
version = "2.0.10"
description = "Build complete apps using AI agents"
authors = ["Leon Ostrez <leon@pythagora.ai>"]
license = "FSL-1.1-MIT"
Expand Down
10 changes: 10 additions & 0 deletions tests/config/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ def test_parse_config():
assert config.llm_for_agent("CodeMonkey").api_key == "sk-anthropic"


def test_case_insensitive_agent_lookup():
config = ConfigLoader.from_json(json.dumps(test_config_data))

# Case-insensitive match: "codemonkey" should resolve to "CodeMonkey"
assert config.llm_for_agent("codemonkey").provider == LLMProvider.ANTHROPIC
assert config.llm_for_agent("codemonkey").model == "claude-3-opus"
# Unknown agent name falls back to "default"
assert config.llm_for_agent("NonExistentAgent").provider == LLMProvider.OPENAI


def test_default_agent_llm_config():
data = {
"llm": {"openai": test_config_data["llm"]["openai"]},
Expand Down