805 Commits

Author SHA1 Message Date
coldxiangyu
97522bfa03 fix(feishu): isolate lark ws Client event loop from main asyncio loop
Commit 0209ad5 moved `import lark_oapi as lark` inside the start()
method (lazy import) to suppress DeprecationWarnings. This had an
unintended side effect: the import now happens after the main asyncio
loop is already running, so lark_oapi's module-level

    loop = asyncio.get_event_loop()

captures the running main loop. When the WebSocket thread then calls
loop.run_until_complete() inside Client.start(), Python raises:

    RuntimeError: This event loop is already running

and the _connect/_disconnect coroutines are never awaited.

Fix: in run_ws(), create a fresh event loop with asyncio.new_event_loop(),
set it as the thread's current loop, and patch lark_oapi.ws.client.loop
to point to this dedicated loop before calling Client.start(). The loop
is closed on thread exit.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-03-05 17:27:17 +08:00
suger-m
323e5f22cc refactor(channels): extract split_message utility to reduce code duplication
Extract the _split_message function from discord.py and telegram.py
into a shared utility function in utils/helpers.py.

Changes:
- Add split_message() to nanobot/utils/helpers.py with configurable max_len
- Update Discord channel to use shared utility (2000 char limit)
- Update Telegram channel to use shared utility (4000 char limit)
- Remove duplicate implementations from both channels

Benefits:
- Reduces code duplication
- Centralizes message splitting logic for easier maintenance
- Makes the function reusable for future channels

The function splits content into chunks within max_len, preferring
to break at newlines or spaces rather than mid-word.
2026-03-05 17:16:47 +08:00
Barry Wang
667613d594 fix edge case casting and more test cases 2026-03-05 16:57:39 +08:00
Barry Wang
9e42ccb51e feat: auto casting tool params to match schema type 2026-03-05 16:57:39 +08:00
ouyangwulin
cf3e7e3f38 feat: Add Alibaba Cloud Coding Plan API support
Add dashscope_coding_plan provider to registry with OpenAI-compatible
endpoint for BaiLian coding assistance.

- Supports API key detection by 'sk-sp-' prefix pattern
- Adds provider config schema entry for proper loading
- Updates documentation with configuration instructions
- Fixes duplicate MatrixConfig class issue in schema
- Follow existing nanobot provider patterns for consistency
2026-03-05 16:54:15 +08:00
Peixian Gong
5cc3c03245 fix: merge tool_calls from multiple choices in LiteLLM response
GitHub Copilot's API returns tool_calls split across multiple choices:
- choices[0]: content only (tool_calls=null)
- choices[1]: tool_calls only (content=null)

The existing _parse_response only inspected choices[0], so tool_calls
were silently lost, causing the agent to never execute tools when using
github_copilot/ models.

This fix scans all choices and merges tool_calls + content, so
providers that return multi-choice responses work correctly.
Single-choice providers (OpenAI, Anthropic, etc.) are unaffected since
the loop over one choice is equivalent to the original code.
2026-03-05 15:15:37 +08:00
gaoyiman
0d60acf2d5 fix(schema): rename volcengine_plan and byteplus_plan to *_coding_plan for consistency 2026-03-05 14:40:18 +08:00
gaoyiman
80bf5e55f1
Merge branch 'HKUDS:main' into feat-volcengine-tuning 2026-03-05 14:14:33 +08:00
hcanyz
a08aae93e6 fix: not imported when LiteLLMProvider is not used
LiteLLM:WARNING: get_model_cost_map.py:213 - LiteLLM: Failed to fetch remote model cost map from https://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.json: The read operation timed out. Falling back to local backup.
2026-03-05 11:33:24 +08:00
Xubin Ren
fb74281434
Merge PR #1499: fix(qq): add msg_seq to prevent message deduplication error
fix(qq): add msg_seq to prevent message deduplication error
2026-03-05 10:39:45 +08:00
Sergio Sánchez Vallés
33f59d8a37
fix(agent): separate reasoning and tool hints to respect channel config 2026-03-05 00:45:15 +01:00
Sergio Sánchez Vallés
c27d2b1522
fix(agent): prevent tool hints from overwriting reasoning in streaming drafts 2026-03-05 00:33:27 +01:00
姚远
f78d655aba Fix: Telegram channel crash when proxy is configured 2026-03-05 04:29:00 +08:00
Sergio Sánchez Vallés
e032faaeff
Merge branch 'main' of upstream/main into fix/test-failures 2026-03-04 20:04:00 +01:00
Sergio Sánchez Vallés
0209ad57d9
fix(tests): resolve RequestsDependencyWarning and lark-oapi asyncio/websockets DeprecationWarnings 2026-03-04 19:31:39 +01:00
Sergio Sánchez Vallés
ca1f41562c
Fix telegram stop typing if not final message 2026-03-04 13:19:35 +01:00
Sergio Sánchez Vallés
61f658e045
add reasoning content to on progress message 2026-03-04 12:11:18 +01:00
Kiplangatkorir
d0c6479186 feat: add LLM retry with exponential backoff for transient errors
provider.chat() had no retry logic — a transient 429 rate limit,
502 gateway error, or network timeout would permanently fail the
entire message. For a system running cron jobs and heartbeats 24/7,
even a brief provider blip causes lost tasks.

Adds _chat_with_retry() that:
- Retries up to 3 times with 1s/2s/4s exponential backoff
- Only retries transient errors (429, 5xx, timeout, connection)
- Returns immediately on permanent errors (400, 401, etc.)
- Falls through to the final attempt if all retries exhaust
2026-03-04 11:20:50 +03:00
Liwx
20bec3bc26
Update qq.py 2026-03-04 14:06:19 +08:00
Liwx
d0a48ed23c
Update qq.py 2026-03-04 14:00:40 +08:00
worenidewen
3e83425142 feat(mcp): add SSE transport support with auto-detection 2026-03-04 01:10:19 +08:00
Sergio Sánchez Vallés
102b9716ed
feat: Implement Telegram draft/progress messages (streaming) 2026-03-03 17:16:08 +01:00
WufeiHalf
0f1cc40b22 feat(telegram): add Telegram group topic support 2026-03-03 22:08:01 +08:00
Yan-ke Guo
a7be0b3c9e sync missing scripts from upstream openclaw repository 2026-03-03 18:14:26 +08:00
Re-bin
c05cb2ef64 refactor(cron): remove CLI cron commands and unify scheduling via cron tool 2026-03-03 05:51:24 +00:00
Re-bin
30803afec0 fix(cron): isolate cron-execution guard with contextvars 2026-03-03 05:36:48 +00:00
Re-bin
ec6430fa0c Merge branch 'main' into pr-1458 2026-03-03 05:18:28 +00:00
Re-bin
03b83fb79e fix(agent): skip empty multimodal user entries after runtime-context strip 2026-03-03 05:13:17 +00:00
Nikolas de Hor
da8a4fc68c fix: prevent cron job execution from scheduling new jobs
When a cron job fires, the agent processes the scheduled message and
has access to the cron tool. If the original message resembles a
scheduling instruction (e.g. "remind me in 10 seconds"), the agent
would call cron.add again, creating an infinite feedback loop.

Add a cron-context flag to CronTool that blocks add operations during
cron job execution. The flag is set before process_direct() and cleared
in a finally block to ensure cleanup even on errors.

Fixes #1441
2026-03-03 01:02:33 -03:00
Nikolas de Hor
ad99d5aaa0 fix: merge consecutive user messages into single message
Some LLM providers (Minimax, Dashscope) strictly reject consecutive
messages with the same role. build_messages() was emitting two separate
user messages back-to-back: the runtime context and the actual user
content.

Merge them into a single user message, handling both plain text and
multimodal (image) content. Update _save_turn() to strip the runtime
context prefix from the merged message when persisting to session
history.

Fixes #1414
Fixes #1344
2026-03-03 00:59:58 -03:00
chengyongru
8f4baaa5ce feat(gateway): support multiple instances with --workspace and --config options
- Add --workspace/-w flag to specify workspace directory
- Add --config/-c flag to specify config file path
- Move cron store to workspace directory for per-instance isolation
- Enable running multiple nanobot instances simultaneously
2026-03-02 23:18:54 +08:00
David Markey
ecdfaf0a5a feat(custom-provider): add x-session-affinity header for prompt caching 2026-03-02 11:03:12 +00:00
Re-bin
3c79404194 fix(providers): sanitize thinking_blocks by provider and harden content normalization 2026-03-02 06:58:10 +00:00
Re-bin
9877195de5 chore(cron): remove redundant timer comment 2026-03-02 06:37:57 +00:00
Re-bin
f3979c0ee6 Merge branch 'main' into pr-1399 2026-03-02 06:30:43 +00:00
Re-bin
be4f83a760 Merge branch 'main' into pr-1406 2026-03-02 06:24:53 +00:00
Re-bin
bbfc1b40c1 security: deny-by-default allowFrom with wildcard support and startup validation 2026-03-02 06:13:37 +00:00
Wenjie Lei
2c63946519 fix(matrix): normalize media metadata and keyword-call attachment upload 2026-03-01 21:56:08 -08:00
chengyongru
d447be5ca2 security: deny by default in is_allowed for all channels
When allow_from is not configured, block all access by default
instead of allowing everyone. This prevents unauthorized access
when channels are enabled without explicit allow lists.
2026-03-02 13:18:43 +08:00
Joel Chan
e9d023f52c feat(discord): add group policy to control group respond behaviour 2026-03-02 12:16:49 +08:00
yzchen
dba93ae83a cron: reload jobs store on each timer tick 2026-03-02 11:19:45 +08:00
chengyongru
aed1ef5529 fix: add SIGTERM, SIGHUP handling and ignore SIGPIPE
- Add handler for SIGTERM to prevent "Terminated" message on Linux
- Add handler for SIGHUP for terminal closure handling
- Ignore SIGPIPE to prevent silent process termination
- Change os._exit(0) to sys.exit(0) for proper cleanup

Fixes issue #1365

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 11:04:53 +08:00
Sense_wang
521217a7f5 fix(telegram): enforce group_policy in _on_message
When `group_policy` is set to "mention", skip messages in group chats
unless the bot is @mentioned or the message is a reply to the bot.

Fixes #1380
2026-03-01 16:50:36 +00:00
Sense_wang
43329018f7 fix(telegram): add group_policy config for Telegram groups
Add `group_policy` field to `TelegramConfig` with "open" (default) and
"mention" options, consistent with Slack and Matrix channel configs.
2026-03-01 16:50:02 +00:00
zerone0x
8571df2e63 fix(feishu): split card messages when content has multiple tables
Feishu rejects interactive cards that contain more than one table element
(API error 11310: card table number over limit).

Add FeishuChannel._split_elements_by_table_limit() which partitions the flat
card-elements list into groups of at most one table each.  The send() method
now iterates over these groups and sends each as its own card message, so all
tables are delivered to the user instead of the entire message being dropped.

Single-table and table-free messages are unaffected (one card, same as before).

Fixes #1382
2026-03-01 15:13:44 +01:00
Re-bin
15529c668e fix(web): sanitize proxy logs and polish search key hint 2026-03-01 12:53:18 +00:00
Re-bin
f5c0c75648 Merge branch 'main' into pr-1370 2026-03-01 12:48:01 +00:00
Re-bin
a7d24192d9 fix(cron): route scheduled jobs through process_direct with english reminder prefix 2026-03-01 12:45:53 +00:00
VITOHJL
468dfc406b feat(cron): improve cron job context handling
Improve cron job execution context to ensure proper message delivery and
session history recording.

Changes:
- Add [绯荤粺瀹氭椂浠诲姟] prefix to cron reminder messages to clearly mark
  them as system-driven, not user queries
- Use user role for cron reminder messages (required by some LLM APIs)
- Properly handle MessageTool to avoid duplicate message delivery
- Correctly save turn history with proper skip count
- Ensure Runtime Context is included in the message list

This ensures that:
1. Cron jobs execute with proper context
2. Messages are correctly delivered to users
3. Session history accurately records cron job interactions
4. The LLM understands these are system-driven reminders, not user queries
2026-03-01 17:05:04 +08:00
chengyongru
82be2ae1a5 feat(tool): add web search proxy 2026-03-01 16:51:54 +08:00