Skip to content

Commit e4559ad

Browse files
authored
Merge pull request #925 from crestalnetwork/hyacinthus
feat: add new models and frontend improvements
2 parents 5fe9896 + 967fa30 commit e4559ad

File tree

93 files changed

+7910
-433
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+7910
-433
lines changed

CHANGELOG.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,41 @@
1+
## v0.8.34 - 2025-11-28
2+
3+
### Features
4+
- Add LangGraph 2.0 checkpoints table migration
5+
- Add dev and prod docker image tags for releases
6+
- Keep short memory only 90 days
7+
- Add daily scheduled task to clean up old LangGraph checkpoints, writes, and blobs
8+
- Team model support
9+
- Add draft functionality and manager module
10+
- Third party S3 support
11+
- Autonomous use internal service to chat
12+
- Agent testing capabilities
13+
- Move checker to core
14+
15+
### Fixes
16+
- Reorder checkpoint migration steps to drop columns after pk update
17+
- Cache checkpointer
18+
- Improve checkpointer clean
19+
- Clean old generator model
20+
- Cache by agent deploy
21+
- Change node to middleware
22+
- Fix astream bug
23+
- Add basedpyright to llm.md
24+
25+
### Refactoring
26+
- Migrate checkpointer to shallow saver implementation
27+
- Migrate langchain agent middleware
28+
- Move s3 to clients
29+
30+
### Chores
31+
- Remove EKS deployment steps from CI workflow
32+
- Disable kubectl deployments in build workflow
33+
- Disable autonomous, telegram, and checker deployments in testnet-dev
34+
- Remove x402 server
35+
- Upgrade dependencies (uv sync --upgrade)
36+
37+
**Full Changelog**: https://github.com/crestalnetwork/intentkit/compare/v0.8.33...v0.8.34
38+
139
## v0.8.33 - 2025-11-14
240

341
### Bug Fixes

LLM.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ IntentKit is an autonomous agent framework that enables creation and management
3131
- API server testing in `tests/api/`
3232
- Skill integration testing in `tests/skills/`
3333

34+
5. **Frontend** (`frontend/`)
35+
- The frontend/ folder contains the Next.js application for managing agents.
36+
- See `intentkit/frontend/AGENTS.md` for detailed architecture and development guidelines.
37+
3438
## Technology Stack
3539
- Package manager: uv
3640
- Virtual environment: .venv, please use `source .venv/bin/activate` at least once to active virtual environment before running any command.
@@ -39,7 +43,7 @@ IntentKit is an autonomous agent framework that enables creation and management
3943
- API framework: fastapi, Doc in https://fastapi.tiangolo.com/
4044
- DB ORM: SQLAlchemy 2.0, please check the 2.0 api for use, do not use the legacy way. Doc in https://docs.sqlalchemy.org/en/20/
4145
- Model: Pydantic V2, Also be careful not to use the obsolete V1 interface. Doc in https://docs.pydantic.dev/latest/
42-
- Testing Framework: pytest
46+
- Testing Framework: pytest, run `pytest` after your final edit.
4347

4448
## Rules
4549

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ The project is divided into the core package and the application:
8888
- [checker.py](app/checker.py): Health and credit checking logic
8989
- [readonly.py](app/readonly.py): Readonly entrypoint
9090
- [scheduler.py](app/scheduler.py): Background task scheduler
91-
- [singleton.py](app/singleton.py): Singleton agent manager
9291
- [telegram.py](app/telegram.py): Telegram integration
9392
- [twitter.py](app/twitter.py): Twitter integration
9493

app/admin/__init__.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
1-
from app.admin.api import admin_router, admin_router_readonly
2-
from app.admin.credit import credit_router, credit_router_readonly
1+
from app.admin.api import admin_router
2+
from app.admin.credit import credit_router
33
from app.admin.health import health_router
4-
from app.admin.metadata import metadata_router_readonly
5-
from app.admin.schema import schema_router_readonly
6-
from app.admin.user import user_router, user_router_readonly
4+
from app.admin.metadata import metadata_router
5+
from app.admin.schema import schema_router
6+
from app.admin.user import user_router
77

88
__all__ = [
99
"admin_router",
10-
"admin_router_readonly",
1110
"health_router",
12-
"schema_router_readonly",
11+
"schema_router",
1312
"credit_router",
14-
"credit_router_readonly",
15-
"metadata_router_readonly",
13+
"metadata_router",
1614
"user_router",
17-
"user_router_readonly",
1815
"agent_generator_router",
1916
]

app/admin/api.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@
4343

4444
from app.auth import verify_admin_jwt
4545

46-
admin_router_readonly = APIRouter()
4746
admin_router = APIRouter()
4847

4948
logger = logging.getLogger(__name__)
5049

5150

52-
@admin_router_readonly.post(
51+
@admin_router.post(
5352
"/agent/validate",
5453
tags=["Agent"],
5554
status_code=204,
@@ -98,7 +97,7 @@ async def validate_agent_create(
9897
return Response(status_code=204)
9998

10099

101-
@admin_router_readonly.post(
100+
@admin_router.post(
102101
"/agents/{agent_id}/validate",
103102
tags=["Agent"],
104103
status_code=204,
@@ -331,7 +330,7 @@ async def override_agent_endpoint(
331330
)
332331

333332

334-
@admin_router_readonly.get(
333+
@admin_router.get(
335334
"/agents",
336335
tags=["Agent"],
337336
dependencies=[Depends(verify_admin_jwt)],
@@ -365,7 +364,7 @@ async def get_agents(db: AsyncSession = Depends(get_db)) -> list[AgentResponse]:
365364
]
366365

367366

368-
@admin_router_readonly.get(
367+
@admin_router.get(
369368
"/agents/{agent_id}",
370369
tags=["Agent"],
371370
dependencies=[Depends(verify_admin_jwt)],
@@ -498,7 +497,7 @@ async def clean_memory(
498497
)
499498

500499

501-
@admin_router_readonly.get(
500+
@admin_router.get(
502501
"/agents/{agent_id}/export",
503502
tags=["Agent"],
504503
operation_id="export_agent",

app/admin/credit.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
logger = logging.getLogger(__name__)
4444

4545
credit_router = APIRouter(prefix="/credit", tags=["Credit"])
46-
credit_router_readonly = APIRouter(prefix="/credit", tags=["Credit"])
4746

4847

4948
# ===== Models =====
@@ -362,7 +361,7 @@ async def get_agent_statistics(
362361
return await agent_statistics.get_agent_statistics(agent_id, session=db)
363362

364363

365-
@credit_router_readonly.get(
364+
@credit_router.get(
366365
"/users/{user_id}/events",
367366
response_model=CreditEventsResponse,
368367
operation_id="list_user_events",
@@ -437,7 +436,7 @@ async def update_event_note(
437436
)
438437

439438

440-
@credit_router_readonly.get(
439+
@credit_router.get(
441440
"/event/users/{user_id}/expense",
442441
response_model=CreditEventsResponse,
443442
operation_id="list_user_expense_events",
@@ -478,7 +477,7 @@ async def list_user_expense_events(
478477
)
479478

480479

481-
@credit_router_readonly.get(
480+
@credit_router.get(
482481
"/transactions",
483482
response_model=CreditTransactionsResponse,
484483
operation_id="list_transactions",
@@ -602,7 +601,7 @@ async def list_transactions(
602601
)
603602

604603

605-
@credit_router_readonly.get(
604+
@credit_router.get(
606605
"/event/users/{user_id}/income",
607606
response_model=CreditEventsResponse,
608607
operation_id="list_user_income_events",
@@ -646,7 +645,7 @@ async def list_user_income_events(
646645
)
647646

648647

649-
@credit_router_readonly.get(
648+
@credit_router.get(
650649
"/event/agents/{agent_id}/income",
651650
response_model=CreditEventsResponse,
652651
operation_id="list_agent_income_events",
@@ -686,7 +685,7 @@ async def list_agent_income_events(
686685
)
687686

688687

689-
@credit_router_readonly.get(
688+
@credit_router.get(
690689
"/event",
691690
response_model=CreditEvent,
692691
operation_id="fetch_credit_event_by_upstream_tx_id",
@@ -712,7 +711,7 @@ async def fetch_credit_event(
712711
return await fetch_credit_event_by_upstream_tx_id(db, upstream_tx_id)
713712

714713

715-
@credit_router_readonly.get(
714+
@credit_router.get(
716715
"/events/{event_id}",
717716
response_model=CreditEvent,
718717
operation_id="fetch_credit_event_by_id",
@@ -774,7 +773,7 @@ async def fetch_credit_event_by_id_endpoint(
774773
return event
775774

776775

777-
@credit_router_readonly.get(
776+
@credit_router.get(
778777
"/events",
779778
operation_id="list_credit_events",
780779
summary="List Credit Events",

app/admin/metadata.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from intentkit.models.skill import Skill
99

1010
# Create a readonly router for metadata endpoints
11-
metadata_router_readonly = APIRouter(tags=["Metadata"])
11+
metadata_router = APIRouter(tags=["Metadata"])
1212

1313

1414
class LLMModelInfoWithProviderName(LLMModelInfo):
@@ -17,7 +17,7 @@ class LLMModelInfoWithProviderName(LLMModelInfo):
1717
provider_name: str
1818

1919

20-
@metadata_router_readonly.get(
20+
@metadata_router.get(
2121
"/metadata/skills",
2222
response_model=list[Skill],
2323
summary="Get all skills",
@@ -37,7 +37,7 @@ async def get_skills(db: AsyncSession = Depends(get_db)):
3737
raise
3838

3939

40-
@metadata_router_readonly.get(
40+
@metadata_router.get(
4141
"/metadata/llms",
4242
response_model=list[LLMModelInfoWithProviderName],
4343
summary="Get all LLM models",

app/admin/schema.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@
1414
logger = logging.getLogger(__name__)
1515

1616
# Create readonly router
17-
schema_router_readonly = APIRouter()
17+
schema_router = APIRouter()
1818

1919
# Get the project root directory
2020
PROJECT_ROOT = Path(__file__).parent.parent.parent
2121

2222

23-
@schema_router_readonly.get(
24-
"/schema/agent", tags=["Schema"], operation_id="get_agent_schema"
25-
)
23+
@schema_router.get("/schema/agent", tags=["Schema"], operation_id="get_agent_schema")
2624
async def get_agent_schema(db: AsyncSession = Depends(get_db)) -> JSONResponse:
2725
"""Get the JSON schema for Agent model with all $ref references resolved.
2826
@@ -41,7 +39,7 @@ async def get_agent_schema(db: AsyncSession = Depends(get_db)) -> JSONResponse:
4139
)
4240

4341

44-
@schema_router_readonly.get(
42+
@schema_router.get(
4543
"/skills/{skill}/schema.json",
4644
tags=["Schema"],
4745
operation_id="get_skill_schema",
@@ -81,7 +79,7 @@ async def get_skill_schema(
8179
return JSONResponse(content=schema, media_type="application/json")
8280

8381

84-
@schema_router_readonly.get(
82+
@schema_router.get(
8583
"/skills/{skill}/{icon_name}.{ext}",
8684
tags=["Schema"],
8785
operation_id="get_skill_icon",

app/admin/user.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111
logger = logging.getLogger(__name__)
1212

1313
user_router = APIRouter(prefix="/users", tags=["User"])
14-
user_router_readonly = APIRouter(prefix="/users", tags=["User"])
1514

1615

17-
@user_router_readonly.get(
16+
@user_router.get(
1817
"/{user_id}",
1918
response_model=User,
2019
operation_id="get_user",

app/api.py

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,17 @@
3131

3232
from app.admin import (
3333
admin_router,
34-
admin_router_readonly,
3534
credit_router,
36-
credit_router_readonly,
3735
health_router,
38-
metadata_router_readonly,
39-
schema_router_readonly,
36+
metadata_router,
37+
schema_router,
4038
user_router,
41-
user_router_readonly,
4239
)
43-
from app.entrypoints.agent_api import router_ro as agent_api_ro
44-
from app.entrypoints.agent_api import router_rw as agent_api_rw
40+
from app.entrypoints.agent_api import agent_api_router
4541
from app.entrypoints.openai_compatible import openai_router
46-
from app.entrypoints.web import chat_router, chat_router_readonly
47-
from app.services.twitter.oauth2 import router as twitter_oauth2_router
48-
from app.services.twitter.oauth2_callback import router as twitter_callback_router
42+
from app.entrypoints.web import chat_router
43+
from app.services.twitter.oauth2 import twitter_oauth2_router
44+
from app.services.twitter.oauth2_callback import twitter_callback_router
4945

5046
logger = logging.getLogger(__name__)
5147

@@ -120,8 +116,7 @@ def _load_agent_api_docs() -> str:
120116
)
121117

122118
# Add routers to the Agent API sub-application
123-
agent_app.include_router(agent_api_rw)
124-
agent_app.include_router(agent_api_ro)
119+
agent_app.include_router(agent_api_router)
125120
agent_app.include_router(openai_router)
126121

127122

@@ -190,15 +185,11 @@ async def lifespan(app: FastAPI):
190185
app.mount("/v1", agent_app)
191186

192187
app.include_router(chat_router)
193-
app.include_router(chat_router_readonly)
194188
app.include_router(admin_router)
195-
app.include_router(admin_router_readonly)
196-
app.include_router(metadata_router_readonly)
189+
app.include_router(metadata_router)
197190
app.include_router(credit_router)
198-
app.include_router(credit_router_readonly)
199-
app.include_router(schema_router_readonly)
191+
app.include_router(schema_router)
200192
app.include_router(user_router)
201-
app.include_router(user_router_readonly)
202193
app.include_router(core_router)
203194
app.include_router(twitter_callback_router)
204195
app.include_router(twitter_oauth2_router)

0 commit comments

Comments
 (0)